* net/dbus.el (dbus-unregister-object): Remove match rule of signals.

Release services only if they are defined.  (Bug#9581)
This commit is contained in:
Michael Albinus 2011-09-24 13:45:13 +02:00
parent a3de0cbd6d
commit fac7ae53a7
2 changed files with 25 additions and 13 deletions

View 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,

View 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))