--- /dev/null
+#include <QDebug>
+#include <QVariant>
+#include <dbus/dbus.h>
+#include <dbusconnectioneventloop.h>
+#include "MafwStubHelper.h"
+
+char obj_path[] = "/org/pulseaudio/stream_restore1/entry7";
+
+MafwStubHelper* m_stubHelper = 0;
+void* m_user_data;
+DBusHandleMessageFunction m_signalCb;
+DBusPendingCallNotifyFunction m_restoreObjectCb = 0;
+DBusPendingCallNotifyFunction m_volumeCb = 0;
+DBusMessage* m_getVolumeMethodCall = 0;
+DBusMessage* m_setVolumeMethod = 0;
+
+QMap<uint, uint> m_volumes;
+
+void setStubHelper(MafwStubHelper* stubHlp)
+{
+ m_stubHelper = stubHlp;
+}
+
+dbus_bool_t dbus_error_is_set(const DBusError* error)
+{
+ Q_UNUSED(error);
+ return m_stubHelper->getReturn("dbus_error_is_set").toBool();
+}
+
+struct DBusConnection
+{
+ int aField;
+};
+
+DBusConnection* dbus_connection_open(const char *address, DBusError *error)
+{
+ DBusConnection* conn = 0;
+
+ if (m_stubHelper->getReturn("dbus_connection_open").toBool())
+ {
+ conn = static_cast<DBusConnection*>( malloc(sizeof(DBusConnection)) );
+ }
+ Q_UNUSED(address);
+ Q_UNUSED(error);
+ return conn;
+}
+
+void dbus_connection_unref(DBusConnection* conn)
+{
+ if (conn)
+ {
+ free(conn);
+ }
+}
+
+bool DBUSConnectionEventLoop::addConnection(DBusConnection* conn)
+{
+ Q_UNUSED(conn);
+
+ return m_stubHelper->getReturn("addConnection").toBool();
+}
+
+void DBUSConnectionEventLoop::removeConnection(DBusConnection* conn)
+{
+ Q_UNUSED(conn);
+
+ m_stubHelper->getReturn("removeConnection");
+}
+
+dbus_bool_t dbus_connection_add_filter(DBusConnection* connection,
+ DBusHandleMessageFunction function,
+ void* user_data,
+ DBusFreeFunction free_data_function)
+{
+ Q_UNUSED(connection);
+ Q_UNUSED(free_data_function);
+ m_signalCb = function;
+ m_user_data = user_data;
+ return true;
+}
+
+void dbus_pending_call_cancel(DBusPendingCall* pending)
+{
+ Q_UNUSED(pending);
+}
+
+dbus_bool_t dbus_set_error_from_message(DBusError* error, DBusMessage* message)
+{
+ Q_UNUSED(error);
+ Q_UNUSED(message);
+ return m_stubHelper->getReturn("dbus_set_error_from_message").toBool();
+}
+
+void signalVolumeUpdated(uint channel, uint value)
+{
+ DBusMessage* message = dbus_message_new_signal(obj_path, "org.PulseAudio.Ext.StreamRestore1.RestoreEntry", "VolumeUpdated");
+
+ DBusMessageIter argument_iterator, variant_iterator, struct_iterator;
+ dbus_message_iter_init_append (message, &argument_iterator);
+ dbus_message_iter_open_container (&argument_iterator,
+ DBUS_TYPE_VARIANT,
+ "(uu)",
+ &variant_iterator);
+ dbus_message_iter_open_container (&variant_iterator,
+ DBUS_TYPE_STRUCT,
+ NULL,
+ &struct_iterator);
+
+ dbus_message_iter_append_basic (&struct_iterator, DBUS_TYPE_UINT32, &channel);
+ dbus_message_iter_append_basic (&struct_iterator, DBUS_TYPE_UINT32, &value);
+
+ dbus_message_iter_close_container (&variant_iterator, &struct_iterator);
+ dbus_message_iter_close_container (&argument_iterator, &variant_iterator);
+
+ DBusConnection* conn = 0;
+ (*m_signalCb)(conn, message, m_user_data);
+ dbus_message_unref(message);
+}
+
+struct DBusPendingCall
+{
+ uint a;
+};
+
+dbus_bool_t dbus_connection_send_with_reply(DBusConnection* connection,
+ DBusMessage* message,
+ DBusPendingCall ** pending_return,
+ int timeout_milliseconds)
+{
+ DBusPendingCall pending;
+ *pending_return = &pending;
+ Q_UNUSED(connection);
+ m_getVolumeMethodCall = message;
+ Q_UNUSED(pending_return);
+ Q_UNUSED(timeout_milliseconds);
+ return true;
+}
+
+// Saves callback function pointer. Assumes that first call gives callback for
+// GetEntryByName and the second one gives callback for Get Volume
+dbus_bool_t dbus_pending_call_set_notify( DBusPendingCall* pending,
+ DBusPendingCallNotifyFunction function,
+ void* user_data,
+ DBusFreeFunction free_user_data)
+{
+ if (!m_restoreObjectCb)
+ {
+ m_restoreObjectCb = function;
+ }
+ else
+ {
+ m_volumeCb = function;
+ }
+
+ Q_UNUSED(pending);
+ Q_UNUSED(user_data);
+ Q_UNUSED(free_user_data);
+ return true;
+}
+
+void giveRestoreEntryReply()
+{
+ DBusPendingCall pending;
+ (*m_restoreObjectCb) (&pending, m_user_data);
+}
+
+void giveVolumeReply(QMap<uint, uint> volumes)
+{
+ DBusPendingCall pending;
+ m_volumes = volumes;
+ (*m_volumeCb) (&pending, m_user_data);
+}
+
+DBusMessage* dbus_pending_call_steal_reply(DBusPendingCall* pending)
+{
+ Q_UNUSED(pending);
+ bool replyForGetVolume = dbus_message_has_member (m_getVolumeMethodCall, "Get");
+ DBusMessage* message = dbus_message_new_method_return(m_getVolumeMethodCall);
+
+ qDebug() << "replyForGetVolume= " << replyForGetVolume;
+ qDebug() << "m_volumes.count()= " << m_volumes.count();
+ if (replyForGetVolume)
+ {
+ qDebug() << "Jee";
+ DBusMessageIter argument_iterator, variant_iterator, array_iterator;
+ dbus_message_iter_init_append (message, &argument_iterator);
+ dbus_message_iter_open_container (&argument_iterator,
+ DBUS_TYPE_VARIANT,
+ "a(uu)",
+ &variant_iterator);
+ dbus_message_iter_open_container (&variant_iterator,
+ DBUS_TYPE_ARRAY,
+ "(uu)",
+ &array_iterator);
+ if (m_volumes.isEmpty())
+ {
+ qDebug() << "Stub is giving an invalid reply";
+ }
+ else
+ {
+ QMapIterator<uint, uint> i(m_volumes);
+ i.toBack();
+ while (i.hasPrevious())
+ {
+ DBusMessageIter iterator;
+ dbus_message_iter_open_container (&array_iterator,
+ DBUS_TYPE_STRUCT,
+ NULL,
+ &iterator);
+ i.previous();
+ dbus_message_iter_append_basic (&iterator, DBUS_TYPE_UINT32, &i.key());
+ dbus_message_iter_append_basic (&iterator, DBUS_TYPE_UINT32, &i.value());
+ dbus_message_iter_close_container (&array_iterator, &iterator);
+ }
+ }
+ dbus_message_iter_close_container (&variant_iterator, &array_iterator);
+ dbus_message_iter_close_container (&argument_iterator, &variant_iterator);
+ }
+ return message;
+}
+
+dbus_uint32_t dbus_message_get_serial(DBusMessage* message)
+{
+ Q_UNUSED(message);
+ return 1;
+}
+
+dbus_bool_t dbus_message_get_args (DBusMessage* message,
+ DBusError* error,
+ int first_arg_type,
+ ...)
+{
+ qDebug() << "dbus_message_get_args";
+ va_list var_args;
+ va_start (var_args, first_arg_type);
+
+ while (first_arg_type != DBUS_TYPE_INVALID)
+ {
+ if (first_arg_type == DBUS_TYPE_OBJECT_PATH)
+ {
+ char** str_p;
+ str_p = va_arg (var_args, char**);
+ *str_p = obj_path;
+ }
+ first_arg_type = va_arg(var_args, int);
+ }
+ va_end(var_args);
+ Q_UNUSED(error);
+ Q_UNUSED(message);
+ return true;
+}
+
+dbus_bool_t dbus_connection_send( DBusConnection* connection,
+ DBusMessage* message,
+ dbus_uint32_t* serial)
+{
+ Q_UNUSED(connection);
+ Q_UNUSED(serial);
+
+ if (dbus_message_has_member (m_getVolumeMethodCall, "Set"))
+ {
+ m_setVolumeMethod = message;
+ }
+
+ return true;
+}
+
+void dbus_connection_flush( DBusConnection* connection)
+{
+ Q_UNUSED(connection);
+}