]> git.eshelyaron.com Git - emacs.git/commitdiff
* net/dbus.el (dbus-unregister-object): Remove match rule of signals.
authorMichael Albinus <michael.albinus@gmx.de>
Sat, 24 Sep 2011 11:45:13 +0000 (13:45 +0200)
committerMichael Albinus <michael.albinus@gmx.de>
Sat, 24 Sep 2011 11:45:13 +0000 (13:45 +0200)
Release services only if they are defined.  (Bug#9581)

lisp/ChangeLog
lisp/net/dbus.el

index a7e9afc96c6eee8f1a74edf2790a9181ba699bca..6f322d5f3bf35923ff9968b3d71b9dfe861ca78d 100644 (file)
@@ -1,3 +1,8 @@
+2011-09-24  Michael Albinus  <michael.albinus@gmx.de>
+
+       * net/dbus.el (dbus-unregister-object): Remove match rule of signals.
+       Release services only if they are defined.  (Bug#9581)
+
 2011-09-23  Richard Stallman  <rms@gnu.org>
 
        * textmodes/paragraphs.el (forward-sentence): For backwards case,
index 87af3d13591f54dfc646305cc5a69a3c88e6f0f5..cbf9fe6ed8616659f22a4cf1049f7b77a6337277 100644 (file)
@@ -143,7 +143,7 @@ association to the service from D-Bus."
         (value (cdr object))
         (entry (gethash key dbus-registered-objects-table))
         ret)
-    ;; entry has the structure ((UNAME SERVICE PATH MEMBER) ...).
+    ;; entry has the structure ((UNAME SERVICE PATH MEMBER [RULE]) ...).
     ;; value has the structure ((SERVICE PATH [HANDLER]) ...).
     ;; MEMBER is either a string (the handler), or a cons cell (a
     ;; property value).  UNAME and property values are not taken into
@@ -154,11 +154,17 @@ association to the service from D-Bus."
       (when (equal
             (car value)
             (butlast (cdr elt) (- (length (cdr elt)) (length (car value)))))
+       (setq ret t)
        ;; Compute new hash value.  If it is empty, remove it from the
        ;; hash table.
        (unless (puthash key (delete elt entry) dbus-registered-objects-table)
          (remhash key dbus-registered-objects-table))
-       (setq ret t)))
+       ;; Remove match rule of signals.
+       (let ((rule (nth 4 elt)))
+         (when (stringp rule)
+           (dbus-call-method
+            (car key) dbus-service-dbus dbus-path-dbus dbus-interface-dbus
+            "RemoveMatch" rule)))))
     ;; Check, whether there is still a registered function or property
     ;; for the given service.  If not, unregister the service from the
     ;; bus.
@@ -166,17 +172,18 @@ association to the service from D-Bus."
       (let ((service (cadr elt))
            (bus (car key))
            found)
-       (maphash
-        (lambda (k v)
-          (dolist (e v)
-            (ignore-errors
-              (when (and (equal bus (car k)) (string-equal service (cadr e)))
-                (setq found t)))))
-        dbus-registered-objects-table)
-       (unless found
-         (dbus-call-method
-          bus dbus-service-dbus dbus-path-dbus dbus-interface-dbus
-          "ReleaseName" service))))
+       (when service
+         (maphash
+          (lambda (k v)
+            (dolist (e v)
+              (ignore-errors
+                (when (and (equal bus (car k)) (string-equal service (cadr e)))
+                  (setq found t)))))
+          dbus-registered-objects-table)
+         (unless found
+           (dbus-call-method
+            bus dbus-service-dbus dbus-path-dbus dbus-interface-dbus
+            "ReleaseName" service)))))
     ;; Return.
     ret))