4 #include <dbusconnectioneventloop.h>
5 #include "MafwStubHelper.h"
7 char obj_path[] = "/org/pulseaudio/stream_restore1/entry7";
9 MafwStubHelper* m_stubHelper = 0;
11 DBusHandleMessageFunction m_signalCb;
12 DBusPendingCallNotifyFunction m_restoreObjectCb = 0;
13 DBusPendingCallNotifyFunction m_volumeCb = 0;
14 DBusMessage* m_getVolumeMethodCall = 0;
15 DBusMessage* m_setVolumeMethod = 0;
17 QMap<uint, uint> m_volumes;
19 void setStubHelper(MafwStubHelper* stubHlp)
21 m_stubHelper = stubHlp;
24 dbus_bool_t dbus_error_is_set(const DBusError* error)
27 return m_stubHelper->getReturn("dbus_error_is_set").toBool();
35 DBusConnection* dbus_connection_open(const char *address, DBusError *error)
37 DBusConnection* conn = 0;
39 if (m_stubHelper->getReturn("dbus_connection_open").toBool())
41 conn = static_cast<DBusConnection*>( malloc(sizeof(DBusConnection)) );
48 void dbus_connection_unref(DBusConnection* conn)
56 bool DBUSConnectionEventLoop::addConnection(DBusConnection* conn)
60 return m_stubHelper->getReturn("addConnection").toBool();
63 void DBUSConnectionEventLoop::removeConnection(DBusConnection* conn)
67 m_stubHelper->getReturn("removeConnection");
70 dbus_bool_t dbus_connection_add_filter(DBusConnection* connection,
71 DBusHandleMessageFunction function,
73 DBusFreeFunction free_data_function)
76 Q_UNUSED(free_data_function);
77 m_signalCb = function;
78 m_user_data = user_data;
82 void dbus_pending_call_cancel(DBusPendingCall* pending)
87 dbus_bool_t dbus_set_error_from_message(DBusError* error, DBusMessage* message)
91 return m_stubHelper->getReturn("dbus_set_error_from_message").toBool();
94 void signalVolumeUpdated(uint channel, uint value)
96 DBusMessage* message = dbus_message_new_signal(obj_path, "org.PulseAudio.Ext.StreamRestore1.RestoreEntry", "VolumeUpdated");
98 DBusMessageIter argument_iterator, variant_iterator, struct_iterator;
99 dbus_message_iter_init_append (message, &argument_iterator);
100 dbus_message_iter_open_container (&argument_iterator,
104 dbus_message_iter_open_container (&variant_iterator,
109 dbus_message_iter_append_basic (&struct_iterator, DBUS_TYPE_UINT32, &channel);
110 dbus_message_iter_append_basic (&struct_iterator, DBUS_TYPE_UINT32, &value);
112 dbus_message_iter_close_container (&variant_iterator, &struct_iterator);
113 dbus_message_iter_close_container (&argument_iterator, &variant_iterator);
115 DBusConnection* conn = 0;
116 (*m_signalCb)(conn, message, m_user_data);
117 dbus_message_unref(message);
120 struct DBusPendingCall
125 dbus_bool_t dbus_connection_send_with_reply(DBusConnection* connection,
126 DBusMessage* message,
127 DBusPendingCall ** pending_return,
128 int timeout_milliseconds)
130 DBusPendingCall pending;
131 *pending_return = &pending;
132 Q_UNUSED(connection);
133 m_getVolumeMethodCall = message;
134 Q_UNUSED(pending_return);
135 Q_UNUSED(timeout_milliseconds);
139 // Saves callback function pointer. Assumes that first call gives callback for
140 // GetEntryByName and the second one gives callback for Get Volume
141 dbus_bool_t dbus_pending_call_set_notify( DBusPendingCall* pending,
142 DBusPendingCallNotifyFunction function,
144 DBusFreeFunction free_user_data)
146 if (!m_restoreObjectCb)
148 m_restoreObjectCb = function;
152 m_volumeCb = function;
157 Q_UNUSED(free_user_data);
161 void giveRestoreEntryReply()
163 DBusPendingCall pending;
164 (*m_restoreObjectCb) (&pending, m_user_data);
167 void giveVolumeReply(QMap<uint, uint> volumes)
169 DBusPendingCall pending;
171 (*m_volumeCb) (&pending, m_user_data);
174 DBusMessage* dbus_pending_call_steal_reply(DBusPendingCall* pending)
177 bool replyForGetVolume = dbus_message_has_member (m_getVolumeMethodCall, "Get");
178 DBusMessage* message = dbus_message_new_method_return(m_getVolumeMethodCall);
180 qDebug() << "replyForGetVolume= " << replyForGetVolume;
181 qDebug() << "m_volumes.count()= " << m_volumes.count();
182 if (replyForGetVolume)
185 DBusMessageIter argument_iterator, variant_iterator, array_iterator;
186 dbus_message_iter_init_append (message, &argument_iterator);
187 dbus_message_iter_open_container (&argument_iterator,
191 dbus_message_iter_open_container (&variant_iterator,
195 if (m_volumes.isEmpty())
197 qDebug() << "Stub is giving an invalid reply";
201 QMapIterator<uint, uint> i(m_volumes);
203 while (i.hasPrevious())
205 DBusMessageIter iterator;
206 dbus_message_iter_open_container (&array_iterator,
211 dbus_message_iter_append_basic (&iterator, DBUS_TYPE_UINT32, &i.key());
212 dbus_message_iter_append_basic (&iterator, DBUS_TYPE_UINT32, &i.value());
213 dbus_message_iter_close_container (&array_iterator, &iterator);
216 dbus_message_iter_close_container (&variant_iterator, &array_iterator);
217 dbus_message_iter_close_container (&argument_iterator, &variant_iterator);
222 dbus_uint32_t dbus_message_get_serial(DBusMessage* message)
228 dbus_bool_t dbus_message_get_args (DBusMessage* message,
233 qDebug() << "dbus_message_get_args";
235 va_start (var_args, first_arg_type);
237 while (first_arg_type != DBUS_TYPE_INVALID)
239 if (first_arg_type == DBUS_TYPE_OBJECT_PATH)
242 str_p = va_arg (var_args, char**);
245 first_arg_type = va_arg(var_args, int);
253 dbus_bool_t dbus_connection_send( DBusConnection* connection,
254 DBusMessage* message,
255 dbus_uint32_t* serial)
257 Q_UNUSED(connection);
260 if (dbus_message_has_member (m_getVolumeMethodCall, "Set"))
262 m_setVolumeMethod = message;
268 void dbus_connection_flush( DBusConnection* connection)
270 Q_UNUSED(connection);