dbus_error_init(&err);
dbus_bus_add_match(conn, rule, &err);
+ if (dbus_error_is_set(&err))
+ {
+ dbus_error_free(&err);
+ throw FatalException();
+ }
+ }
+
+
+ void
+ Connection::remove_match(const char* rule)
+ {
+ boost::lock_guard<boost::mutex> lock(mutex);
+
+ DBusError err;
+ dbus_error_init(&err);
+ dbus_bus_remove_match(conn, rule, &err);
if (dbus_error_is_set(&err))
{
dbus_error_free(&err);
Message send_with_reply_and_block(Message& m);
void add_match(const char* rule);
+ void remove_match(const char* rule);
+
+ void add_match(const string& rule) { add_match(rule.c_str()); }
+ void remove_match(const string& rule) { remove_match(rule.c_str()); }
unsigned long get_unix_userid(const Message& m);
throw FatalException();
dbus_connection_set_wakeup_main_function(conn, wakeup_main, this, NULL);
-
- // Filtering for the sender doesn't work for me. So also check the
- // sender later when handling the signal.
- add_match("type='signal', sender='" DBUS_SERVICE_DBUS "', path='" DBUS_PATH_DBUS "', "
- "interface='" DBUS_INTERFACE_DBUS "', member='NameOwnerChanged'");
}
}
+ void
+ DBus::MainLoop::add_client_match(const string& name)
+ {
+ // Filtering for the sender doesn't work for me. So also check the
+ // sender later when handling the signal.
+ add_match("type='signal', sender='" DBUS_SERVICE_DBUS "', path='" DBUS_PATH_DBUS "', "
+ "interface='" DBUS_INTERFACE_DBUS "', member='NameOwnerChanged', "
+ "arg0='" + name + "'");
+ }
+
+
+ void
+ DBus::MainLoop::remove_client_match(const string& name)
+ {
+ // Filtering for the sender doesn't work for me. So also check the
+ // sender later when handling the signal.
+ remove_match("type='signal', sender='" DBUS_SERVICE_DBUS "', path='" DBUS_PATH_DBUS "', "
+ "interface='" DBUS_INTERFACE_DBUS "', member='NameOwnerChanged', "
+ "arg0='" + name + "'");
+ }
+
+
void
DBus::MainLoop::dispatch_incoming(Message& msg)
{
DBus::Hihi hihi(msg);
hihi >> name >> old_owner >> new_owner;
- if (name == new_owner && old_owner.empty())
- client_connected(name);
-
if (name == old_owner && new_owner.empty())
client_disconnected(name);
}
void set_idle_timeout(int s);
void reset_idle_count();
+ void add_client_match(const string& name);
+ void remove_client_match(const string& name);
+
virtual void method_call(Message& message) = 0;
virtual void signal(Message& message) = 0;
- virtual void client_connected(const string& name) = 0;
virtual void client_disconnected(const string& name) = 0;
virtual int periodic_timeout() = 0;
virtual void periodic() = 0;
void method_call(DBus::Message& message);
void signal(DBus::Message& message);
- void client_connected(const string& name);
void client_disconnected(const string& name);
void periodic();
int periodic_timeout();
void
MyMainLoop::method_call(DBus::Message& msg)
{
- y2deb("method call sender:'" << msg.get_sender() << "' path:'" <<
- msg.get_path() << "' interface:'" << msg.get_interface() <<
- "' member:'" << msg.get_member() << "'");
+ y2deb("method call sender:'" << msg.get_sender() << "' path:'" << msg.get_path() <<
+ "' interface:'" << msg.get_interface() << "' member:'" << msg.get_member() << "'");
reset_idle_count();
if (client == clients.end())
{
y2deb("client connected invisible '" << msg.get_sender() << "'");
+ add_client_match(msg.get_sender());
client = clients.add(msg.get_sender());
set_idle_timeout(-1);
}
void
MyMainLoop::signal(DBus::Message& msg)
{
- y2deb("signal sender:'" << msg.get_sender() << "' path:'" <<
- msg.get_path() << "' interface:'" << msg.get_interface() <<
- "' member:'" << msg.get_member() << "'");
-}
-
-
-void
-MyMainLoop::client_connected(const string& name)
-{
- y2deb("client connected '" << name << "'");
-
- boost::unique_lock<boost::shared_mutex> lock(big_mutex);
-
- clients.add(name);
-
- reset_idle_count();
- set_idle_timeout(-1);
+ y2deb("signal sender:'" << msg.get_sender() << "' path:'" << msg.get_path() <<
+ "' interface:'" << msg.get_interface() << "' member:'" << msg.get_member() << "'");
}
{
y2deb("client disconnected '" << name << "'");
+ remove_client_match(name);
+
boost::unique_lock<boost::shared_mutex> lock(big_mutex);
Clients::iterator client = clients.find(name);