2 #include "DBUSMessageHandler.h"
3 #include "DBUSConfiguration.h"
8 DBUSMessageHandler::DBUSMessageHandler()
14 dbus_error_init(&m_err);
16 // connect to the bus and check for errors
17 char* useSessionBus = getenv("LM_USE_SESSION_BUS");
18 if ( NULL != useSessionBus && strcmp(useSessionBus,"enable") == 0 )
20 LOG_INFO("DBUSMessageHandler", "Using Session Bus");
21 m_pConnection = dbus_bus_get(DBUS_BUS_SESSION, &m_err);
25 LOG_INFO("DBUSMessageHandler", "Using System Bus");
26 m_pConnection = dbus_bus_get(DBUS_BUS_SYSTEM, &m_err);
29 if (dbus_error_is_set(&m_err))
31 LOG_ERROR("DBUSMessageHandler","Connection error");
32 dbus_error_free(&m_err);
35 if (NULL == m_pConnection)
37 LOG_ERROR("DBUSMessageHandler","Connection is null");
41 int ret = dbus_bus_request_name(m_pConnection, DBUS_SERVICE_PREFIX, DBUS_NAME_FLAG_REPLACE_EXISTING, &m_err);
43 if (dbus_error_is_set(&m_err))
45 LOG_ERROR("DBUSMessageHandler", "Name Error "<< m_err.message);
46 dbus_error_free(&m_err);
49 if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret)
51 LOG_ERROR("DBUSMessageHandler", "Not Primary Owner "<< ret);
56 DBUSMessageHandler::~DBUSMessageHandler()
59 dbus_error_init(&err);
60 bool errorset = dbus_error_is_set(&err);
63 LOG_ERROR("DBUSMessageHandler","there was an dbus error");
65 dbus_connection_unregister_object_path(m_pConnection,DBUS_SERVICE_OBJECT_PATH);
67 LOG_INFO("DBUSMessageHandler","Ask about owner name");
68 dbus_bus_name_has_owner(m_pConnection, DBUS_SERVICE_PREFIX, &err);
69 errorset = dbus_error_is_set(&err);
72 LOG_ERROR("DBUSMessageHandler","there was an dbus error");
74 dbus_error_init(&err);
75 dbus_bus_release_name(m_pConnection, DBUS_SERVICE_PREFIX, &err);
78 bool DBUSMessageHandler::registerMessageFilter( DBusHandleMessageFunction fMessageFunc,
82 if ( !dbus_connection_add_filter ( m_pConnection , fMessageFunc, comInstance, NULL) )
89 void DBUSMessageHandler::unregisterMessageFilter( DBusHandleMessageFunction fMessageFunc,
92 dbus_connection_remove_filter ( m_pConnection , fMessageFunc, comInstance);
95 bool DBUSMessageHandler::registerPathFunction( DBusObjectPathMessageFunction fMessageFunc,
96 DBusObjectPathUnregisterFunction fUnregisterFunc,
100 m_objectPathVTable.unregister_function = fUnregisterFunc;
101 m_objectPathVTable.message_function = fMessageFunc;
103 if (!dbus_connection_register_object_path(m_pConnection,DBUS_SERVICE_OBJECT_PATH,&m_objectPathVTable, comInstance) )
110 void DBUSMessageHandler::initReceive(DBusMessage* msg)
112 LOG_DEBUG("DBUSMessageHandler","Message " << dbus_message_get_member(msg) << " was sent by " << dbus_message_get_sender(msg) );
113 if (!dbus_message_iter_init(msg, &m_MessageIter))
115 LOG_ERROR("DBUSMessageHandler", "Message has no arguments!");
119 void DBUSMessageHandler::initReply(DBusMessage* msg)
121 // create a reply from the message
122 m_pReply = dbus_message_new_method_return(msg);
123 dbus_message_iter_init_append(m_pReply, &m_MessageIter);
126 void DBUSMessageHandler::closeReply()
128 // send the reply && flush the connection
129 if (!dbus_connection_send(m_pConnection, m_pReply, &m_serial))
131 LOG_ERROR("DBUSMessageHandler", "Out Of Memory!");
134 LOG_DEBUG("DBUSMessageHandler", "sending reply");
135 dbus_connection_flush(m_pConnection);
138 dbus_message_unref(m_pReply);
142 void DBUSMessageHandler::ReplyError(DBusMessage* msg, const char* errorname, const char* errorMsg)
144 m_pReply = dbus_message_new_error(msg, errorname, errorMsg);
145 // send the reply && flush the connection
146 if (!dbus_connection_send(m_pConnection, m_pReply, &m_serial))
148 LOG_ERROR("DBUSMessageHandler", "Out Of Memory!");
151 LOG_INFO("DBUSMessageHandler", "sending reply with error");
152 dbus_connection_flush(m_pConnection);
155 dbus_message_unref(m_pReply);
159 char* DBUSMessageHandler::getString()
163 if (DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&m_MessageIter))
165 LOG_ERROR("DBUSMessageHandler", "Argument is not string!");
169 dbus_message_iter_get_basic(&m_MessageIter, ¶m);
170 dbus_message_iter_next(&m_MessageIter);
175 dbus_bool_t DBUSMessageHandler::getBool()
177 dbus_bool_t boolparam;
179 if (DBUS_TYPE_BOOLEAN != dbus_message_iter_get_arg_type(&m_MessageIter))
181 LOG_ERROR("DBUSMessageHandler", "Argument is not bool!");
185 dbus_message_iter_get_basic(&m_MessageIter, &boolparam);
186 dbus_message_iter_next(&m_MessageIter);
191 char DBUSMessageHandler::getByte()
195 if (DBUS_TYPE_BYTE != dbus_message_iter_get_arg_type(&m_MessageIter))
197 LOG_ERROR("DBUSMessageHandler", "Argument is not byte!");
201 dbus_message_iter_get_basic(&m_MessageIter, ¶m);
202 dbus_message_iter_next(&m_MessageIter);
207 dbus_uint32_t DBUSMessageHandler::getUInt()
211 if (DBUS_TYPE_UINT32 != dbus_message_iter_get_arg_type(&m_MessageIter))
213 LOG_ERROR("DBUSMessageHandler", "Argument is not uint32!");
217 dbus_message_iter_get_basic(&m_MessageIter, ¶m);
218 dbus_message_iter_next(&m_MessageIter);
223 double DBUSMessageHandler::getDouble()
227 if (DBUS_TYPE_DOUBLE != dbus_message_iter_get_arg_type(&m_MessageIter))
229 LOG_ERROR("DBUSMessageHandler","Argument is not double!");
233 dbus_message_iter_get_basic(&m_MessageIter, ¶m);
234 dbus_message_iter_next(&m_MessageIter);
239 void DBUSMessageHandler::getArrayOfUInt(int* pLength, unsigned int** ppArray)
241 if (DBUS_TYPE_ARRAY != dbus_message_iter_get_arg_type(&m_MessageIter))
243 LOG_ERROR("DBUSMessageHandler","Argument is not an array!");
247 DBusMessageIter arrayIter;
248 dbus_message_iter_recurse(&m_MessageIter, &arrayIter);
251 dbus_message_iter_get_fixed_array(&arrayIter, &localArray, pLength);
253 *ppArray = new uint[*pLength];
254 for (int i = 0; i < *pLength; i++)
256 (*ppArray)[i] = localArray[i];
260 void DBUSMessageHandler::getArrayOfString(std::vector<std::string>* stringVector)
262 if (DBUS_TYPE_ARRAY != dbus_message_iter_get_arg_type(&m_MessageIter))
264 LOG_ERROR("DBUSMessageHandler", "Argument is not an array!");
268 DBusMessageIter arrayIter;
269 dbus_message_iter_recurse(&m_MessageIter, &arrayIter);
273 if (DBUS_TYPE_STRING != dbus_message_iter_get_arg_type(&arrayIter))
275 LOG_ERROR("DBUSMessageHandler", "Argument is not an string!");
278 dbus_message_iter_get_basic(&arrayIter, ¶m);
280 stringVector->push_back(std::string(param));
282 if (dbus_message_iter_has_next(&arrayIter))
284 dbus_message_iter_next(&arrayIter);
293 void DBUSMessageHandler::appendBool(dbus_bool_t toAppend)
295 if (!dbus_message_iter_append_basic(&m_MessageIter, DBUS_TYPE_BOOLEAN, &toAppend))
297 LOG_ERROR("DBUSMessageHandler", "Out Of Memory!");
302 void DBUSMessageHandler::appendUInt(dbus_uint32_t toAppend)
304 if (!dbus_message_iter_append_basic(&m_MessageIter, DBUS_TYPE_UINT32, &toAppend))
306 LOG_ERROR("DBUSMessageHandler", "Out Of Memory!");
311 void DBUSMessageHandler::appendDouble(double toAppend)
313 if (!dbus_message_iter_append_basic(&m_MessageIter, DBUS_TYPE_DOUBLE, &toAppend))
315 LOG_ERROR("DBUSMessageHandler", "Out Of Memory!");
320 void DBUSMessageHandler::appendByte(char toAppend)
322 if (!dbus_message_iter_append_basic(&m_MessageIter, DBUS_TYPE_BYTE, &toAppend))
324 LOG_ERROR("DBUSMessageHandler", "Out Of Memory!");
329 void DBUSMessageHandler::appendArrayOfUInt(unsigned int length, unsigned int *IDs)
331 DBusMessageIter arrayIter;
332 dbus_message_iter_open_container(&m_MessageIter, DBUS_TYPE_ARRAY, "u", &arrayIter);
333 for(unsigned int i = 0; i < length; i++)
335 dbus_message_iter_append_basic(&arrayIter, DBUS_TYPE_UINT32, &IDs[i]);
337 dbus_message_iter_close_container(&m_MessageIter, &arrayIter);