6 DBUSMessageHandler::DBUSMessageHandler(DBusObjectPathVTable* vtable, DBusConnection* conn, void* reference)
12 dbus_error_init(&m_err);
14 string nodeString =std::string(DBUS_SERVICE_ROOT)+"/"+std::string(MY_NODE);
15 dbus_bool_t b=dbus_connection_register_object_path(m_pConnection, nodeString.c_str(), vtable, reference);
17 DLT_LOG(DLT_CONTEXT, DLT_LOG_INFO, DLT_STRING("Registering of node"), DLT_STRING(MY_NODE),DLT_STRING("failed"));
21 DBUSMessageHandler::~DBUSMessageHandler()
24 dbus_error_init(&err);
25 bool errorset = dbus_error_is_set(&err);
28 DLT_LOG(DLT_CONTEXT,DLT_LOG_ERROR, DLT_STRING("there was an dbus error"));
30 dbus_bus_name_has_owner(m_pConnection, DBUS_SERVICE_SERVICE, &err);
31 errorset = dbus_error_is_set(&err);
34 DLT_LOG(DLT_CONTEXT,DLT_LOG_ERROR, DLT_STRING("there was an dbus error"));
36 dbus_error_init(&err);
37 dbus_bus_release_name(m_pConnection, DBUS_SERVICE_SERVICE, &err);
40 void DBUSMessageHandler::initReceive(DBusMessage* msg)
42 if (!dbus_message_iter_init(msg, &m_MessageIter))
44 DLT_LOG(DLT_CONTEXT,DLT_LOG_ERROR, DLT_STRING("DBUS Message has no arguments!"));
48 void DBUSMessageHandler::initReply(DBusMessage* msg)
50 // create a reply from the message
51 m_pReply = dbus_message_new_method_return(msg);
52 dbus_message_iter_init_append(m_pReply, &m_MessageIter);
55 void DBUSMessageHandler::closeReply()
57 // send the reply && flush the connection
58 if (!dbus_connection_send(m_pConnection, m_pReply, &m_serial))
60 DLT_LOG(DLT_CONTEXT,DLT_LOG_ERROR, DLT_STRING("DBUS handler Out Of Memory!"));
63 DLT_LOG(DLT_CONTEXT,DLT_LOG_ERROR, DLT_STRING("DBUS handler sending reply!"));
64 dbus_connection_flush(m_pConnection);
67 dbus_message_unref(m_pReply);
71 void DBUSMessageHandler::ReplyError(DBusMessage* msg, const char* errorname, const char* errorMsg)
73 m_pReply = dbus_message_new_error(msg, errorname, errorMsg);
74 // send the reply && flush the connection
75 if (!dbus_connection_send(m_pConnection, m_pReply, &m_serial))
77 DLT_LOG(DLT_CONTEXT,DLT_LOG_ERROR, DLT_STRING("DBUS handler Out Of Memory!"));
80 DLT_LOG(DLT_CONTEXT,DLT_LOG_ERROR, DLT_STRING("DBUS handler sending reply with error!"));
81 dbus_connection_flush(m_pConnection);
84 dbus_message_unref(m_pReply);
87 char* DBUSMessageHandler::getString()
91 if (DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&m_MessageIter))
93 DLT_LOG(DLT_CONTEXT,DLT_LOG_ERROR, DLT_STRING("DBUS handler argument is no string!"));
97 dbus_message_iter_get_basic(&m_MessageIter, ¶m);
98 dbus_message_iter_next(&m_MessageIter);
103 dbus_bool_t DBUSMessageHandler::getBool()
105 dbus_bool_t boolparam;
107 if (DBUS_TYPE_BOOLEAN != dbus_message_iter_get_arg_type(&m_MessageIter))
109 DLT_LOG(DLT_CONTEXT,DLT_LOG_ERROR, DLT_STRING("DBUS handler argument is no bool!"));
113 dbus_message_iter_get_basic(&m_MessageIter, &boolparam);
114 dbus_message_iter_next(&m_MessageIter);
119 char DBUSMessageHandler::getByte()
123 if (DBUS_TYPE_BYTE != dbus_message_iter_get_arg_type(&m_MessageIter))
125 DLT_LOG(DLT_CONTEXT,DLT_LOG_ERROR, DLT_STRING("DBUS handler argument is no byte!"));
129 dbus_message_iter_get_basic(&m_MessageIter, ¶m);
130 dbus_message_iter_next(&m_MessageIter);
135 dbus_uint32_t DBUSMessageHandler::getUInt()
139 if (DBUS_TYPE_UINT32 != dbus_message_iter_get_arg_type(&m_MessageIter))
141 DLT_LOG(DLT_CONTEXT,DLT_LOG_ERROR, DLT_STRING("DBUS handler argument is no uint32_t!"));
145 dbus_message_iter_get_basic(&m_MessageIter, ¶m);
146 dbus_message_iter_next(&m_MessageIter);
151 double DBUSMessageHandler::getDouble()
155 if (DBUS_TYPE_DOUBLE != dbus_message_iter_get_arg_type(&m_MessageIter))
157 DLT_LOG(DLT_CONTEXT,DLT_LOG_ERROR, DLT_STRING("DBUS handler argument is no double!"));
161 dbus_message_iter_get_basic(&m_MessageIter, ¶m);
162 dbus_message_iter_next(&m_MessageIter);
167 void DBUSMessageHandler::getArrayOfUInt(int* pLength, unsigned int** ppArray)
169 if (DBUS_TYPE_ARRAY != dbus_message_iter_get_arg_type(&m_MessageIter))
171 DLT_LOG(DLT_CONTEXT,DLT_LOG_ERROR, DLT_STRING("DBUS handler argument is no array!"));
175 DBusMessageIter arrayIter;
176 dbus_message_iter_recurse(&m_MessageIter, &arrayIter);
179 dbus_message_iter_get_fixed_array(&arrayIter, &localArray, pLength);
181 *ppArray = new uint[*pLength];
182 for (int i = 0; i < *pLength; i++)
184 (*ppArray)[i] = localArray[i];
188 void DBUSMessageHandler::getArrayOfString(std::vector<std::string>* stringVector)
190 if (DBUS_TYPE_ARRAY != dbus_message_iter_get_arg_type(&m_MessageIter))
192 DLT_LOG(DLT_CONTEXT,DLT_LOG_ERROR, DLT_STRING("DBUS handler argument is no array!"));
196 DBusMessageIter arrayIter;
197 dbus_message_iter_recurse(&m_MessageIter, &arrayIter);
201 if (DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&arrayIter))
203 DLT_LOG(DLT_CONTEXT,DLT_LOG_ERROR, DLT_STRING("DBUS handler argument is no string!"));
206 dbus_message_iter_get_basic(&arrayIter, ¶m);
208 stringVector->push_back(std::string(param));
210 if (dbus_message_iter_has_next(&arrayIter))
212 dbus_message_iter_next(&arrayIter);
221 void DBUSMessageHandler::append(bool toAppend)
223 dbus_bool_t mybool=toAppend;
224 if (!dbus_message_iter_append_basic(&m_MessageIter, DBUS_TYPE_BOOLEAN, &mybool))
226 DLT_LOG(DLT_CONTEXT,DLT_LOG_ERROR, DLT_STRING("DBUS handler Out Of Memory!"));
231 void DBUSMessageHandler::append(dbus_uint32_t toAppend)
233 if (!dbus_message_iter_append_basic(&m_MessageIter, DBUS_TYPE_UINT32, &toAppend))
235 DLT_LOG(DLT_CONTEXT,DLT_LOG_ERROR, DLT_STRING("DBUS handler Out Of Memory!"));
240 void DBUSMessageHandler::append(double toAppend)
242 if (!dbus_message_iter_append_basic(&m_MessageIter, DBUS_TYPE_DOUBLE, &toAppend))
244 DLT_LOG(DLT_CONTEXT,DLT_LOG_ERROR, DLT_STRING("DBUS handler Out Of Memory!"));
249 void DBUSMessageHandler::append(char toAppend)
251 if (!dbus_message_iter_append_basic(&m_MessageIter, DBUS_TYPE_BYTE, &toAppend))
253 DLT_LOG(DLT_CONTEXT,DLT_LOG_ERROR, DLT_STRING("DBUS handler Out Of Memory!"));
258 void DBUSMessageHandler::append(unsigned int length, unsigned int *IDs)
260 DBusMessageIter arrayIter;
261 dbus_message_iter_open_container(&m_MessageIter, DBUS_TYPE_ARRAY, "u", &arrayIter);
262 for(unsigned int i = 0; i < length; i++)
264 dbus_message_iter_append_basic(&arrayIter, DBUS_TYPE_UINT32, &IDs[i]);
266 dbus_message_iter_close_container(&m_MessageIter, &arrayIter);
269 void DBUSMessageHandler::sendSignal(const char* signalname) {
270 dbus_uint32_t serial = 0;
273 string nodeString =std::string(DBUS_SERVICE_ROOT)+"/"+std::string(MY_NODE);
274 msg =dbus_message_new_signal(nodeString.c_str(),DBUS_SERVICE_SERVICE,signalname);
278 DLT_LOG(DLT_CONTEXT,DLT_LOG_ERROR, DLT_STRING("Message null!"));
279 this->~DBUSMessageHandler();
282 if (!dbus_connection_send(m_pConnection, msg, &serial)) {
283 DLT_LOG(DLT_CONTEXT,DLT_LOG_ERROR, DLT_STRING("DBUS handler Out Of Memory!"));
284 this->~DBUSMessageHandler();
287 dbus_connection_flush(m_pConnection);
290 dbus_message_unref(msg);
293 void DBUSMessageHandler::append(std::list<ConnectionType> list){
294 DBusMessageIter arrayIter;
295 dbus_message_iter_open_container(&m_MessageIter, DBUS_TYPE_ARRAY, "uu", &arrayIter);
297 std::list<ConnectionType>::iterator Ilist;
298 std::list<ConnectionType>::iterator Ibegin=list.begin();
299 std::list<ConnectionType>::iterator Iend=list.end();
300 for(Ilist=Ibegin;Ilist!=Iend; Ilist++)
302 dbus_message_iter_append_basic(&arrayIter, DBUS_TYPE_UINT32, &Ilist->Sink_ID);
303 dbus_message_iter_append_basic(&arrayIter, DBUS_TYPE_UINT32, &Ilist->Source_ID);
305 dbus_message_iter_close_container(&m_MessageIter, &arrayIter);
308 void DBUSMessageHandler::append(std::list<SinkType> list){
309 DBusMessageIter arrayIter;
310 dbus_message_iter_open_container(&m_MessageIter, DBUS_TYPE_ARRAY, "su", &arrayIter);
312 std::list<SinkType>::iterator Ilist;
313 std::list<SinkType>::iterator Ibegin=list.begin();
314 std::list<SinkType>::iterator Iend=list.end();
315 for(Ilist=Ibegin;Ilist!=Iend; Ilist++)
317 dbus_message_iter_append_basic(&arrayIter, DBUS_TYPE_STRING, &Ilist->name);
318 dbus_message_iter_append_basic(&arrayIter, DBUS_TYPE_UINT32, &Ilist->ID);
320 dbus_message_iter_close_container(&m_MessageIter, &arrayIter);
324 void DBUSMessageHandler::append(std::list<SourceType> list){
325 DBusMessageIter arrayIter;
326 dbus_message_iter_open_container(&m_MessageIter, DBUS_TYPE_ARRAY, "su", &arrayIter);
328 std::list<SourceType>::iterator Ilist;
329 std::list<SourceType>::iterator Ibegin=list.begin();
330 std::list<SourceType>::iterator Iend=list.end();
331 for(Ilist=Ibegin;Ilist!=Iend; Ilist++)
333 dbus_message_iter_append_basic(&arrayIter, DBUS_TYPE_STRING, &Ilist->name);
334 dbus_message_iter_append_basic(&arrayIter, DBUS_TYPE_UINT32, &Ilist->ID);
336 dbus_message_iter_close_container(&m_MessageIter, &arrayIter);
341 DBUSIntrospection::DBUSIntrospection(MethodTable* methodTable, SignalTable* signalTable,std::string nodename)
342 : m_methodTable(methodTable), m_signalTable(signalTable), m_nodename(nodename)
347 void DBUSIntrospection::generateString()
349 DLT_LOG(DLT_CONTEXT,DLT_LOG_ERROR, DLT_STRING("Generating instrospection data!"));
352 openNode(m_nodename);
353 openInterface("org.freedesktop.DBus.Introspectable");
354 openMethod("Introspect");
355 addArgument("data", "out", "s");
358 openInterface(DBUS_SERVICE_SERVICE);
362 while (strcmp(m_methodTable[index].name, "") != 0)
364 MethodTable entry = m_methodTable[index];
371 while (strcmp(m_signalTable[index].name, "") != 0)
373 SignalTable entry = m_signalTable[index];
383 void DBUSIntrospection::addHeader(void)
385 m_introspectionString << "<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS"
386 << "Object Introspection 1.0//EN\"\n \"http://www.freedesktop.org/standards/"
387 << "dbus/1.0/introspect.dtd\"> \n";
390 void DBUSIntrospection::openNode(string nodename)
392 m_introspectionString << "<node name=\"" << nodename << "\"> \n";
395 void DBUSIntrospection::openInterface(string interfacename)
397 m_introspectionString << "<interface name=\"" << interfacename << "\"> \n";
400 void DBUSIntrospection::openMethod(string methodname)
402 m_introspectionString << "<method name=\"" << methodname << "\"> \n";
405 void DBUSIntrospection::openSignal(string signalname) {
406 m_introspectionString<<"<signal name=\"" << signalname << "\"> \n";
409 void DBUSIntrospection::addArgument(string argname, string direction, string type)
411 m_introspectionString << "<arg name=\"" << argname << "\" direction=\""
412 << direction << "\" type=\"" << type << "\"/> \n";
416 void DBUSIntrospection::addSignalArgument(string argname, string type){
417 m_introspectionString << "<arg name=\"" << argname << "\" type=\"" << type << "\"/> \n";
420 void DBUSIntrospection::closeMethod(void)
422 m_introspectionString << "</method> \n";
425 void DBUSIntrospection::closeInterface(void)
427 m_introspectionString << "</interface> \n";
430 void DBUSIntrospection::closeNode(void)
432 m_introspectionString << "</node> \n";
435 void DBUSIntrospection::closeSignal(void){
436 m_introspectionString<<"</signal> \n";
439 void DBUSIntrospection::addEntry(MethodTable entry)
441 string methodName = entry.name;
442 string parameterArray = entry.signature;
443 string returnValueArray = string(entry.reply);
445 openMethod(methodName);
447 for(uint parameterIndex = 0; parameterIndex < parameterArray.length(); ++parameterIndex)
449 switch (parameterArray.at(parameterIndex))
452 if (parameterArray.at(parameterIndex+1)=='(') {
453 int size=parameterArray.find((')'),parameterIndex);
454 addArgument("","in",parameterArray.substr(parameterIndex,size+1));
455 parameterIndex+=size;
457 addArgument("","in", parameterArray.substr(parameterIndex,2));
462 addArgument("","in", parameterArray.substr(parameterIndex,1));
468 for(uint returnValueIndex = 0; returnValueIndex < returnValueArray.length(); ++returnValueIndex)
470 switch (returnValueArray.at(returnValueIndex))
473 if (returnValueArray.at(returnValueIndex+1)=='(') {
474 int size=returnValueArray.find((')'),returnValueIndex);
475 addArgument("","out",returnValueArray.substr(returnValueIndex,size+1));
476 returnValueIndex+=size;
478 addArgument("","out", returnValueArray.substr(returnValueIndex,2));
483 addArgument("","out", returnValueArray.substr(returnValueIndex,1));
491 void DBUSIntrospection::addEntry(SignalTable entry)
493 string methodName = entry.name;
494 string parameterArray = entry.signature;
496 openSignal(methodName);
498 for(uint parameterIndex = 0; parameterIndex < parameterArray.length(); ++parameterIndex)
500 switch (parameterArray.at(parameterIndex))
503 if (parameterArray.at(parameterIndex+1)=='{') {
504 int size=parameterArray.find(('}'),parameterIndex);
505 addSignalArgument("",parameterArray.substr(parameterIndex,size+1));
506 parameterIndex+=size;
509 addSignalArgument("", "a" + parameterArray.at(parameterIndex));
513 addSignalArgument("", parameterArray.substr(parameterIndex,1));
521 void DBUSIntrospection::process(DBusConnection* conn, DBusMessage* msg)
524 DBusMessageIter args;
525 dbus_uint32_t serial = 0;
527 // create a reply from the message
528 reply = dbus_message_new_method_return(msg);
530 string introspect = m_introspectionString.str();
531 const char* string = introspect.c_str();
533 // add the arguments to the reply
534 dbus_message_iter_init_append(reply, &args);
535 if (!dbus_message_iter_append_basic(&args, DBUS_TYPE_STRING, &string))
537 DLT_LOG(DLT_CONTEXT,DLT_LOG_ERROR, DLT_STRING("DBUS handler Out Of Memory!"));
540 // send the reply && flush the connection
541 if (!dbus_connection_send(conn, reply, &serial))
543 DLT_LOG(DLT_CONTEXT,DLT_LOG_ERROR, DLT_STRING("DBUS handler Out Of Memory!"));
545 dbus_connection_flush(conn);
548 dbus_message_unref(reply);