]> git.ipfire.org Git - thirdparty/snapper.git/commitdiff
- fixed client connect/disconnect handling
authorArvin Schnell <aschnell@suse.de>
Thu, 4 Oct 2012 15:31:27 +0000 (17:31 +0200)
committerArvin Schnell <aschnell@suse.de>
Thu, 4 Oct 2012 15:31:27 +0000 (17:31 +0200)
dbus/DBusConnection.cc
dbus/DBusConnection.h
dbus/DBusMainLoop.cc
dbus/DBusMainLoop.h
server/snapperd.cc

index c7fd2f46188f843891976e20e22a164408187723..77f2fb7cabd7d39ed119296da823456a8cbed034 100644 (file)
@@ -117,7 +117,23 @@ namespace DBus
        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);
index 47672dbe1c9d4608d1c71275d9966b51a9190382..420fe344f37593a94475f2976a38319745ecfc35 100644 (file)
@@ -49,6 +49,10 @@ namespace DBus
        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);
 
index c46fb80e2f94735d0411bca5a3e38b53076a160b..f7e45611b734011466435259f30e0dc7475ad1b6 100644 (file)
@@ -45,11 +45,6 @@ namespace DBus
            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'");
     }
 
 
@@ -278,6 +273,28 @@ namespace DBus
     }
 
 
+    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)
     {
@@ -301,9 +318,6 @@ namespace DBus
                    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);
                }
index 5492c23b1e18d53b43c17e03ee0fb1e7e623c41a..ecf7717f6cd4df841eabc864db0da12b86d3076b 100644 (file)
@@ -44,9 +44,11 @@ namespace DBus
        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;
index a71c4543f97d4637bfc9cb03f6f1c0a670972cdd..c48e91881cfa9768ad36c2c834fd9d141f7da118 100644 (file)
@@ -53,7 +53,6 @@ public:
 
     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();
@@ -75,9 +74,8 @@ MyMainLoop::~MyMainLoop()
 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();
 
@@ -93,6 +91,7 @@ MyMainLoop::method_call(DBus::Message& msg)
        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);
        }
@@ -105,23 +104,8 @@ MyMainLoop::method_call(DBus::Message& msg)
 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() << "'");
 }
 
 
@@ -130,6 +114,8 @@ MyMainLoop::client_disconnected(const string& name)
 {
     y2deb("client disconnected '" << name << "'");
 
+    remove_client_match(name);
+
     boost::unique_lock<boost::shared_mutex> lock(big_mutex);
 
     Clients::iterator client = clients.find(name);