From 2feaef3bb5f91af43573155106c73143597bdf3e Mon Sep 17 00:00:00 2001 From: Christian Mueller Date: Fri, 22 Jul 2011 19:44:13 +0200 Subject: [PATCH] - daily commit - dbus working smooth now, implemented signal handling - changed worker thread for dbus to wait for dbus events not to wakeup every 50 ms --- AudioManagerDaemon/DataBaseHandler.cpp | 4 +- AudioManagerDaemon/Router.cpp | 14 +- .../AudiomanagerInterface.cpp | 168 ++++++++++++--------- PluginRoutingInterfaceDbus/AudiomanagerInterface.h | 6 +- PluginRoutingInterfaceDbus/DBUSIntrospection.cpp | 46 +++++- PluginRoutingInterfaceDbus/DBUSIntrospection.h | 6 +- PluginRoutingInterfaceDbus/DBUSMessageHandler.cpp | 2 +- PluginRoutingInterfaceDbus/DBUSTypes.h | 5 + PluginRoutingInterfaceDbus/DbusInterface.cpp | 2 +- 9 files changed, 162 insertions(+), 91 deletions(-) diff --git a/AudioManagerDaemon/DataBaseHandler.cpp b/AudioManagerDaemon/DataBaseHandler.cpp index c1b1a7a..9da96f2 100644 --- a/AudioManagerDaemon/DataBaseHandler.cpp +++ b/AudioManagerDaemon/DataBaseHandler.cpp @@ -132,7 +132,7 @@ domain_t DataBaseHandler::insert_into_Domains_table(std::string DomainName, std: std::string command = "SELECT BusName,ID FROM " + std::string(DOMAIN_TABLE) + " WHERE DomainName='" + DomainName + "'"; - if (sqlite3_exec(m_database,command.c_str(),NULL,&query,NULL)!= SQLITE_OK) { + if (SQexecute(command)) { if (sqlite3_step(query)==SQLITE_ROW) { std::string name((const char*) sqlite3_column_text(query,0)); if (!name.empty()) { @@ -141,7 +141,7 @@ domain_t DataBaseHandler::insert_into_Domains_table(std::string DomainName, std: command = "UPDATE " + std::string(DOMAIN_TABLE) + "SET Busname=" + BusName + " Nodename=" + NodeName + " EarlyMode=" + _EarlyMode + " WHERE DomainName=" + DomainName; } } else { - command = "INSERT INTO " + std::string(DOMAIN_TABLE) + " (DomainName, BusName, NodeName, EarlyMode) VALUES ('" + DomainName + "','" + BusName + "'','" + NodeName + "','" + _EarlyMode + "')"; + command = "INSERT INTO " + std::string(DOMAIN_TABLE) + " (DomainName, BusName, NodeName, EarlyMode) VALUES ('" + DomainName + "','" + BusName + "','" + NodeName + "','" + _EarlyMode + "')"; } } diff --git a/AudioManagerDaemon/Router.cpp b/AudioManagerDaemon/Router.cpp index 7f1c234..b71ccad 100644 --- a/AudioManagerDaemon/Router.cpp +++ b/AudioManagerDaemon/Router.cpp @@ -284,12 +284,14 @@ void Bushandler::load_Bus_plugins() { } void Bushandler::StartupInterfaces() { -// foreach (Bus bus, Busses) -// { -// bus.sendInterface->startup_interface(m_receiver); -// DLT_LOG(AudioManager,DLT_LOG_INFO, DLT_STRING("Bushandler:Started Interface"), DLT_STRING(bus.Name.toAscii())); -// } -// emit signal_system_ready(); + std::list::iterator busIter; + std::list::iterator busStart=Busses.begin(); + std::list::iterator busEnd=Busses.end(); + + for (busIter=busStart;busIter!=busEnd;busIter++) { + busIter->sendInterface->system_ready(); + DLT_LOG(AudioManager,DLT_LOG_INFO, DLT_STRING("Bushandler:Started Interface"), DLT_STRING(busIter->Name.c_str())); + } } void Bushandler::registerReceiver(RoutingReceiver * receiver) { 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 #include +#include +#include +#include +#include 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")); diff --git a/PluginRoutingInterfaceDbus/AudiomanagerInterface.h b/PluginRoutingInterfaceDbus/AudiomanagerInterface.h index 1e22c18..ffa0148 100644 --- a/PluginRoutingInterfaceDbus/AudiomanagerInterface.h +++ b/PluginRoutingInterfaceDbus/AudiomanagerInterface.h @@ -36,9 +36,9 @@ public: void stop(); void peekDomain(DBusConnection* conn, DBusMessage* msg); - void registerDomain(const char* &name, const char* &node, bool earlymode); - void registerGateway(const char* &name, const char* &sink, const char* &source, const char* &domainSource, const char* &domainSink, const char* &controlDomain); - void registerSink(const char* &name, const char* &sinkclass, const char* &domain); + void registerDomain(DBusConnection* conn, DBusMessage* msg); + void registerGateway(DBusConnection* conn, DBusMessage* msg); + void registerSink(DBusConnection* conn, DBusMessage* msg); void registerSource(DBusConnection* conn, DBusMessage* msg); void emit_systemReady(); diff --git a/PluginRoutingInterfaceDbus/DBUSIntrospection.cpp b/PluginRoutingInterfaceDbus/DBUSIntrospection.cpp index 313a71e..fabd2dd 100644 --- a/PluginRoutingInterfaceDbus/DBUSIntrospection.cpp +++ b/PluginRoutingInterfaceDbus/DBUSIntrospection.cpp @@ -22,10 +22,8 @@ using std::stringstream; - - -DBUSIntrospection::DBUSIntrospection(MethodTable* methodTable) -: m_methodTable(methodTable) +DBUSIntrospection::DBUSIntrospection(MethodTable* methodTable, SignalTable* signalTable) +: m_methodTable(methodTable), m_signalTable(signalTable) { generateString(); } @@ -35,7 +33,7 @@ void DBUSIntrospection::generateString() DLT_LOG(DBusPlugin,DLT_LOG_ERROR, DLT_STRING("Generating instrospection data!")); addHeader(); - openNode(DBUS_SERVICE_PREFIX); + openNode(""); openInterface("org.freedesktop.DBus.Introspectable"); openMethod("Introspect"); addArgument("data", "out", "s"); @@ -52,10 +50,18 @@ void DBUSIntrospection::generateString() ++index; } + index=0; + if (m_signalTable) { + while (strcmp(m_signalTable[index].name, "") != 0) + { + SignalTable entry = m_signalTable[index]; + addEntry(entry); + ++index; + } + } closeInterface(); - closeNode(); - //LOG_DEBUG("DBUSCommunicator", "generated introspection data"); + } void DBUSIntrospection::addHeader(void) @@ -80,6 +86,10 @@ void DBUSIntrospection::openMethod(string methodname) m_introspectionString << " \n"; } +void DBUSIntrospection::addSignal(string signalname) { + m_introspectionString<<" \n"; +} + void DBUSIntrospection::addArgument(string argname, string direction, string type) { m_introspectionString << "emit_systemReady(); } -- 2.7.4