summaryrefslogtreecommitdiff
path: root/PluginRoutingInterfaceDbus/AudiomanagerInterface.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'PluginRoutingInterfaceDbus/AudiomanagerInterface.cpp')
-rw-r--r--PluginRoutingInterfaceDbus/AudiomanagerInterface.cpp168
1 files changed, 98 insertions, 70 deletions
diff --git a/PluginRoutingInterfaceDbus/AudiomanagerInterface.cpp b/PluginRoutingInterfaceDbus/AudiomanagerInterface.cpp
index 29fe480..0cccdb7 100644
--- a/PluginRoutingInterfaceDbus/AudiomanagerInterface.cpp
+++ b/PluginRoutingInterfaceDbus/AudiomanagerInterface.cpp
@@ -25,20 +25,34 @@
#include "headers.h"
#include <iostream>
#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <errno.h>
class AudioManagerInterface;
+
AudioManagerInterface* AudioManagerInterface::m_reference = NULL;
static DBUSMessageHandler* g_pDbusMessage;
static MethodTable manager_methods[] =
{
- { "registerSource", "sss", "u", &AudioManagerInterface::registerSource },
- { "peekDomain", "s", "u", &AudioManagerInterface::peekDomain },
- { "", "", "", NULL }
+ { "peekDomain", "s", "u", &AudioManagerInterface::peekDomain },
+ { "registerSource", "sss", "u", &AudioManagerInterface::registerSource },
+ { "registerSink", "sss", "u", &AudioManagerInterface::registerSink },
+ { "registerDomain", "sssb", "u", &AudioManagerInterface::registerDomain },
+ { "registerGateway", "sssss", "u", &AudioManagerInterface::registerGateway },
+ { "", "", "", NULL }
+};
+
+static SignalTable manager_signals[] = {
+ { "signal_systemReady", ""},
+ { "", ""}
};
+
AudioManagerInterface::AudioManagerInterface(RoutingReceiveInterface* r_interface) : m_audioman(r_interface),m_running(false) {
}
@@ -47,7 +61,6 @@ bool AudioManagerInterface::startup_interface()
DLT_LOG(DBusPlugin, DLT_LOG_INFO, DLT_STRING("Starting up dbus connector"));
g_pDbusMessage = new DBUSMessageHandler();
-
DLT_LOG(DBusPlugin,DLT_LOG_INFO, DLT_STRING("create thread"));
this->m_running = true;
pthread_create(&m_currentThread, NULL, AudioManagerInterface::run, this);
@@ -56,6 +69,7 @@ bool AudioManagerInterface::startup_interface()
}
void AudioManagerInterface::stop()
+
{
DLT_LOG(DBusPlugin, DLT_LOG_INFO, DLT_STRING("Stopped dbus connector"));
this->m_running = false;
@@ -84,19 +98,56 @@ void AudioManagerInterface::registerSource(DBusConnection* conn, DBusMessage* ms
g_pDbusMessage->appendUInt(source);
g_pDbusMessage->closeReply();
}
-void AudioManagerInterface::registerSink(const char* &name, const char* &sinkclass, const char* &domain) {
- m_audioman->registerSink((char*)name, (char*)sinkclass, (char*)domain);
+void AudioManagerInterface::registerSink(DBusConnection* conn, DBusMessage* msg) {
+ (void)conn; // TODO: remove, only prevents warning
+ g_pDbusMessage->initReceive(msg);
+ char* name = g_pDbusMessage->getString();
+ char* audioclass = g_pDbusMessage->getString();
+ char* domain = g_pDbusMessage->getString();
+ sink_t sink=m_audioman->registerSink(name, audioclass, domain);
+ g_pDbusMessage->initReply(msg);
+ g_pDbusMessage->appendUInt(sink);
+ g_pDbusMessage->closeReply();
}
-void AudioManagerInterface::registerDomain(const char* &name, const char* &node, bool earlymode) {
+
+void AudioManagerInterface::registerDomain(DBusConnection* conn, DBusMessage* msg) {
char busname[40];
strcpy(busname, BUS_NAME);
- m_audioman->registerDomain((char*)name, busname, (char*)node, earlymode);
+ (void)conn; // TODO: remove, only prevents warning
+ g_pDbusMessage->initReceive(msg);
+ char* name = g_pDbusMessage->getString();
+ char* node = g_pDbusMessage->getString();
+ bool earlymode = g_pDbusMessage->getString();
+ domain_t domain=m_audioman->registerDomain(name, busname, node, earlymode);
+ g_pDbusMessage->initReply(msg);
+ g_pDbusMessage->appendUInt(domain);
+ g_pDbusMessage->closeReply();
+
}
-void AudioManagerInterface::registerGateway(const char* &name, const char* &sink, const char* &source, const char* &domainSource, const char* &domainSink, const char* &controlDomain) {
- m_audioman->registerGateway((char*)name, (char*)sink, (char*)source, (char*)domainSource, (char*)domainSink, (char*)controlDomain);
+void AudioManagerInterface::registerGateway(DBusConnection* conn, DBusMessage* msg) {
+ (void)conn; // TODO: remove, only prevents warning
+ g_pDbusMessage->initReceive(msg);
+ char* name = g_pDbusMessage->getString();
+ char* sink = g_pDbusMessage->getString();
+ char* source = g_pDbusMessage->getString();
+ char* domainSource = g_pDbusMessage->getString();
+ char* domainSink = g_pDbusMessage->getString();
+ char* controlDomain = g_pDbusMessage->getString();
+ domain_t domain=m_audioman->registerGateway(name, sink, source, domainSource, domainSink, controlDomain);
+ g_pDbusMessage->initReply(msg);
+ g_pDbusMessage->appendUInt(domain);
+ g_pDbusMessage->closeReply();
+ emit_systemReady();
}
void AudioManagerInterface::emit_systemReady() {
- m_reference->emit_systemReady();
+ DBusMessage* msg;
+ DBusConnection* conn = g_pDbusMessage->getConnection();
+ dbus_uint32_t serial = 0;
+ msg =dbus_message_new_signal("/org/genivi/audiomanager/RoutingInterface",DBUS_SERVICE_PREFIX,"signal_systemReady");
+ if (!dbus_connection_send(conn, msg, &serial)) {
+ DLT_LOG(DBusPlugin, DLT_LOG_INFO, DLT_STRING("error while sending signal system ready on dbus"));
+ }
+ dbus_connection_flush(conn);
}
void* AudioManagerInterface::run(void * arg)
@@ -105,66 +156,43 @@ void* AudioManagerInterface::run(void * arg)
// pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL);
// pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
m_reference = (AudioManagerInterface*) arg;
- while (m_reference->m_running)
+ DBusMessage* msg = 0;
+ DBusConnection* conn = g_pDbusMessage->getConnection();
+ while (m_reference->m_running && dbus_connection_read_write_dispatch(conn, -1))
{
- // pthread_testcancel();
- DBusMessage* msg = 0;
- DBusConnection* conn = g_pDbusMessage->getConnection();
- dbus_connection_read_write(conn, 50);
- msg = dbus_connection_pop_message(conn);
- if (msg)
- {
- DLT_LOG(DBusPlugin, DLT_LOG_INFO, DLT_STRING("message received"));
- const char *n = dbus_message_get_member(msg);
- bool found = false;
- int i = 0;
-
- while (!found && strcmp(manager_methods[i].name, "") != 0)
- {
- if (n && strcmp(manager_methods[i].name, n) == 0)
- {
- MethodTable entry = manager_methods[i];
- DLT_LOG(DBusPlugin, DLT_LOG_INFO, DLT_STRING("got call for method:"),DLT_STRING(entry.name));
- CallBackMethod m = entry.function;
- (m_reference->*m)(conn, msg);
- found = true;
- }
- i++;
- }
-
- if (dbus_message_is_method_call(msg, DBUS_INTERFACE_INTROSPECTABLE, "Introspect"))
- {
-
- DBUSIntrospection introspectionString(manager_methods);
- introspectionString.process(conn, msg);
- g_pDbusMessage->setConnection(conn);
- found = true; // TODO: always true
- }
-
- if (!found)
- {
- DBusMessage* reply = dbus_message_new_method_return(msg);
- uint serial = 0;
- // send the reply && flush the connection
- if (!dbus_connection_send(conn, reply, &serial))
- {
- DLT_LOG(DBusPlugin, DLT_LOG_INFO, DLT_STRING("Out of memory"));
- }
- dbus_connection_flush(conn);
- // free the reply
- dbus_message_unref(reply);
- reply = NULL;
- }
- if (msg)
- {
- dbus_connection_flush(conn);
- dbus_message_unref(msg);
- msg = NULL;
- }
- } else {
- /* put thread in sleep mode for 500 useconds due to safe cpu performance */
- //usleep(500);
- }
+ msg = dbus_connection_pop_message(conn);
+ DLT_LOG(DBusPlugin, DLT_LOG_INFO, DLT_STRING("message received"));
+
+ const char *member = dbus_message_get_member(msg);
+ const char *iface = dbus_message_get_interface(msg);
+ bool found=false;
+ int i = 0;
+
+ if (dbus_message_is_method_call(msg, DBUS_INTERFACE_INTROSPECTABLE, "Introspect")) {
+ DBUSIntrospection introspectionString(manager_methods,manager_signals);
+ introspectionString.process(conn, msg);
+ g_pDbusMessage->setConnection(conn);
+ } else if (strcmp(DBUS_SERVICE_PREFIX,iface)==0) {
+
+ while (!found && strcmp(manager_methods[i].name, "") != 0)
+ {
+ if (strcmp(manager_methods[i].name, member) == 0)
+ {
+ MethodTable entry = manager_methods[i];
+ DLT_LOG(DBusPlugin, DLT_LOG_INFO, DLT_STRING("got call for method:"),DLT_STRING(entry.name));
+ CallBackMethod m = entry.function;
+ (m_reference->*m)(conn, msg);
+ found = true;
+ }
+ i++;
+ }
+ } else if (dbus_message_is_signal(msg, DBUS_INTERFACE_DBUS, "NameAcquired")) {
+ DLT_LOG(DBusPlugin, DLT_LOG_INFO, DLT_STRING("Got Signal Name Aquired"));
+ }
+
+ dbus_connection_flush(conn);
+ dbus_message_unref(msg);
+ msg = NULL;
}
DLT_LOG(DBusPlugin, DLT_LOG_INFO, DLT_STRING("Stopping thread"));