emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] emacs/lisp/net dbus.el


From: Michael Albinus
Subject: [Emacs-diffs] emacs/lisp/net dbus.el
Date: Mon, 09 Nov 2009 22:04:57 +0000

CVSROOT:        /sources/emacs
Module name:    emacs
Changes by:     Michael Albinus <albinus>       09/11/09 22:04:57

Modified files:
        lisp/net       : dbus.el 

Log message:
        * net/dbus.el (dbus-unregister-object): Release service, if no
        other method is registered for it.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/emacs/lisp/net/dbus.el?cvsroot=emacs&r1=1.35&r2=1.36

Patches:
Index: dbus.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/net/dbus.el,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -b -r1.35 -r1.36
--- dbus.el     25 Aug 2009 10:13:54 -0000      1.35
+++ dbus.el     9 Nov 2009 22:04:57 -0000       1.36
@@ -139,23 +139,42 @@
 
   ;; Find the corresponding entry in the hash table.
   (let* ((key (car object))
-        (value (gethash key dbus-registered-functions-table)))
+        (value (gethash key dbus-registered-functions-table))
+        (bus (car key))
+        ret)
     ;; Loop over the registered functions.
-    (while (consp value)
-      ;; (car value) has the structure (UNAME SERVICE PATH HANDLER).
+    (dolist (val value)
+      ;; val has the structure (UNAME SERVICE PATH HANDLER).
       ;; (cdr object) has the structure ((SERVICE PATH HANDLER) ...).
-      (if (not (equal (cdr (car value)) (car (cdr object))))
-         (setq value (cdr value))
+      (when (equal (cdr val) (car (cdr object)))
        ;; Compute new hash value.  If it is empty, remove it from
        ;; hash table.
        (unless
            (puthash
             key
-            (delete (car value) (gethash key dbus-registered-functions-table))
+            (delete val (gethash key dbus-registered-functions-table))
             dbus-registered-functions-table)
          (remhash key dbus-registered-functions-table))
-       (setq value t)))
-    value))
+       (setq ret t)))
+    ;; Check, whether there is still a registered function for the
+    ;; given service.  If not, unregister the service from the bus.
+    (dolist (val value)
+      (let ((service (cadr val))
+           found)
+       (maphash
+        (lambda (k v)
+          (dolist (val v)
+            (ignore-errors
+              (when (and (equal bus (car k))
+                         (string-equal service (cadr val))))
+              (setq found t))))
+        dbus-registered-functions-table)
+       (unless found
+         (dbus-call-method
+          bus dbus-service-dbus dbus-path-dbus dbus-interface-dbus
+          "ReleaseName" service))))
+    ;; Return.
+    ret))
 
 (defun dbus-call-method-non-blocking-handler (&rest args)
   "Handler for reply messages of asynchronous D-Bus message calls.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]