}
}
LOG_INFO("DBUSCommunicator", "Started dbus connector");
+ m_running = true;
return result;
}
void DBUSCommunicator::stop()
{
LOG_INFO("DBUSCommunicator","stopping");
-
- // deregister dbus messaging implicitly by deleting messageHandler
- delete g_pDbusMessage;
+ if (m_running)
+ {
+ g_pDbusMessage->unregisterMessageFilter(DBUSCommunicator::processMessageFunc,this);
+ // deregister dbus messaging implicitly by deleting messageHandler
+ }
+ if (g_pDbusMessage != NULL)
+ {
+ delete g_pDbusMessage;
+ }
}
void DBUSCommunicator::ServiceConnect(DBusConnection* conn, DBusMessage* msg)
g_pDbusMessage->initReceive(msg);
char* owner = strdup(dbus_message_get_sender(msg));
RemoveApplicationReference(owner);
+ RemoveClientWatch(conn,owner);
g_pDbusMessage->initReply(msg);
g_pDbusMessage->closeReply();
}
(void)conn; // TODO: remove, only prevents warning
uint id = GraphicalObject::INVALID_ID;
- // use resolution of default screen as default width and height of layers
+ // use resolution of default screen as default width and height of layers
uint* resolution = m_executor->getScreenResolution(DEFAULT_SCREEN);
bool status = m_executor->execute(new LayerCreateCommand(resolution[0], resolution[1], &id));
if (status)
uint id = GraphicalObject::INVALID_ID;
g_pDbusMessage->initReceive(msg);
id = g_pDbusMessage->getUInt();
- // use resolution of default screen as default width and height of layers
+ // use resolution of default screen as default width and height of layers
uint* resolution = m_executor->getScreenResolution(DEFAULT_SCREEN);
bool status = m_executor->execute(new LayerCreateCommand(resolution[0], resolution[1], &id));
if (status)
}
}
+void DBUSCommunicator::RemoveClientWatch(DBusConnection *conn, char* sender)
+{
+ DBusError err;
+ dbus_error_init(&err);
+ char rule[1024];
+ sprintf(rule,"type='signal',sender='%s',interface='%s',member='%s',arg0='%s'",DBUS_INTERFACE_DBUS,DBUS_INTERFACE_DBUS,"NameOwnerChanged",sender);
+
+ dbus_bus_remove_match(conn,rule,&err);
+ if (dbus_error_is_set(&err))
+ {
+ LOG_ERROR("DBUSCommunicator", "Could not remove client watch "<< err.message);
+ dbus_error_free(&err);
+ }
+}
+
DBusHandlerResult DBUSCommunicator::delegateMessage(DBusConnection* conn, DBusMessage* msg)
{
DBusHandlerResult result = DBUS_HANDLER_RESULT_HANDLED;
LOG_DEBUG("DBUSCommunicator","message received");
const char *n = dbus_message_get_member(msg);
+ char* owner = strdup(dbus_message_get_sender(msg));
bool found = false;
int i = 0;
} else if ( *newName == '\0' )
{
LOG_DEBUG("DBUSCommunicator","Client Disconnect detected " << name);
+ RemoveClientWatch(conn,owner);
RemoveApplicationReference(name);
}
}
LOG_ERROR("DBUSMessageHandler","there was an dbus error");
}
dbus_connection_unregister_object_path(m_pConnection,DBUS_SERVICE_OBJECT_PATH);
+
LOG_INFO("DBUSMessageHandler","Ask about owner name");
dbus_bus_name_has_owner(m_pConnection, DBUS_SERVICE_PREFIX, &err);
errorset = dbus_error_is_set(&err);
return result;
}
+void DBUSMessageHandler::unregisterMessageFilter( DBusHandleMessageFunction fMessageFunc,
+ void* comInstance )
+{
+ dbus_connection_remove_filter ( m_pConnection , fMessageFunc, comInstance);
+}
bool DBUSMessageHandler::registerPathFunction( DBusObjectPathMessageFunction fMessageFunc,
DBusObjectPathUnregisterFunction fUnregisterFunc,
TEST_F(DBUSCommunicatorTest, listAlllayerGroupIDS) {
std::list<int> defaultlist;
- // Sets the default return value for type Bar.
DefaultValue<Scene*>::Set((Scene*) &this->layerlist);
DefaultValue<std::list<int> >::Set(defaultlist);
EXPECT_CALL(this->layerlist, getLayerGroupIDs(NotNull(),NotNull()) ).Times(1);
TEST_F(DBUSCommunicatorTest, listAllSurfaceGroupIDS) {
std::list<int> defaultlist;
- // Sets the default return value for type Bar.
DefaultValue<Scene*>::Set((Scene*) &this->layerlist);
DefaultValue<std::list<int> >::Set(defaultlist);
EXPECT_CALL(this->layerlist, getSurfaceGroupIDs(NotNull(),NotNull() )).Times(1);
std::list<int> defaultlist;
DefaultValue<Scene*>::Set((Scene*) &this->layerlist);
- // Sets the default return value for type Bar.
DefaultValue<std::list<int> >::Set(defaultlist);
DefaultValue<SurfaceGroup*>::Set(new SurfaceGroup());
EXPECT_CALL(this->layerlist, getSurfaceGroup(Eq(84567u) )).Times(1);
TEST_F(DBUSCommunicatorTest, listlayersOflayergroup) {
std::list<int> defaultlist;
- // Sets the default return value for type Bar.
DefaultValue<Scene*>::Set((Scene*) &this->layerlist);
DefaultValue<std::list<int> >::Set(defaultlist);
DefaultValue<LayerGroup*>::Set(new LayerGroup());