diff options
Diffstat (limited to 'AudioManagerDaemon/dbusRoothandler.cpp')
-rw-r--r-- | AudioManagerDaemon/dbusRoothandler.cpp | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/AudioManagerDaemon/dbusRoothandler.cpp b/AudioManagerDaemon/dbusRoothandler.cpp new file mode 100644 index 0000000..ee55e6d --- /dev/null +++ b/AudioManagerDaemon/dbusRoothandler.cpp @@ -0,0 +1,124 @@ +/* + * dbusRoothandler.cpp + * + * Created on: Aug 1, 2011 + * Author: christian + */ + +#include "audioManagerIncludes.h" +#ifdef WITH_DBUS + +#include "dbusRoothandler.h" + +#define ROOT_INTROSPECT_XML \ +DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE \ +"<node>" \ +"<interface name='org.freedesktop.DBus.Introspectable'>" \ +"<method name='Introspect'>" \ +" <arg name='xml_data' type='s' direction='out'/>" \ +"</method>" \ +"</interface>" \ + + +dbusRoothandler* dbusRoothandler::m_reference = NULL; + +static DBusObjectPathVTable vtable = +{ + NULL,dbusRoothandler::cbRootIntrospection,NULL, NULL, NULL, NULL +}; + + +DBusHandlerResult dbusRoothandler::cbRootIntrospection(DBusConnection *conn, DBusMessage *msg, void *reference) { + m_reference=(dbusRoothandler*)reference; + std::list<std::string>nodesList=m_reference->m_nodesList; + DBusMessage * reply; + DBusMessageIter args; + dbus_uint32_t serial = 0; + DLT_LOG(AudioManager, DLT_LOG_INFO, DLT_STRING("Root Callback called")); + if (dbus_message_is_method_call(msg, DBUS_INTERFACE_INTROSPECTABLE, "Introspect")) { + std::list<std::string>::iterator nodeIter; + std::list<std::string>::iterator nodeIterStart=nodesList.begin(); + std::list<std::string>::iterator nodeIterEnd=nodesList.end(); + const char *xml=ROOT_INTROSPECT_XML; + std::stringstream introspect; + introspect << std::string(xml); + for(nodeIter=nodeIterStart;nodeIter!=nodeIterEnd;nodeIter++) { + introspect<<"<node name='"<<nodeIter->c_str()<<"'/>"; + } + introspect<<"</node>"; + + reply = dbus_message_new_method_return(msg); + std::string s = introspect.str(); + const char* string=s.c_str(); + + // add the arguments to the reply + dbus_message_iter_init_append(reply, &args); + if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &string)) + { + DLT_LOG(AudioManager,DLT_LOG_ERROR, DLT_STRING("DBUS Out Of Memory!")); + } + + // send the reply && flush the connection + if (!dbus_connection_send(conn, reply, &serial)) + { + DLT_LOG(AudioManager,DLT_LOG_ERROR, DLT_STRING("DBUS Out Of Memory!")); + } + dbus_connection_flush(conn); + // free the reply + dbus_message_unref(reply); + + return DBUS_HANDLER_RESULT_HANDLED; + } else { + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } +} + +dbusRoothandler::dbusRoothandler() : m_pConnection(0),m_err(),m_nodesList() { + dbus_error_init(&m_err); + + // connect to the bus and check for errors + m_pConnection = dbus_bus_get(DBUS_BUS_SESSION, &m_err); + if (dbus_error_is_set(&m_err)) + { + DLT_LOG(AudioManager,DLT_LOG_INFO, DLT_STRING("Error while getting the DBus")); + dbus_error_free(&m_err); + } + if (NULL == m_pConnection) + { + DLT_LOG(AudioManager,DLT_LOG_INFO, DLT_STRING("DBus Connection is null")); + } + + dbus_connection_register_object_path(m_pConnection, DBUS_SERVICE_ROOT, &vtable, this); + int ret = dbus_bus_request_name(m_pConnection,DBUS_SERVICE_SERVICE,DBUS_NAME_FLAG_DO_NOT_QUEUE, &m_err); + if (dbus_error_is_set(&m_err)) + { + DLT_LOG(AudioManager,DLT_LOG_INFO, DLT_STRING("DBUSCommunicator Name Error"),DLT_STRING(m_err.message)); + dbus_error_free(&m_err); + } + if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) + { + DLT_LOG(AudioManager,DLT_LOG_INFO, DLT_STRING("DBUSCommunicatorNot Primary Owner"), DLT_INT(ret)); + } + + // TODO Auto-generated constructor stub + +} + +dbusRoothandler::~dbusRoothandler() { + // TODO Auto-generated destructor stub +} + + +DBusConnection *dbusRoothandler::returnConnection(){ + return m_pConnection; +} + +void dbusRoothandler::registerNode(std::string node){ + m_nodesList.push_back(node); +} + +#endif + + + + |