*** /tmp/ediffWCMSQF 2020-09-03 13:49:33.193916784 +0200 --- /home/albinus/src/emacs-27/lisp/net/dbus.el 2020-09-03 13:36:44.960364842 +0200 *************** *** 1477,1482 **** --- 1477,1502 ---- (nreverse result)) (push (cons (car dict) (cl-caadr dict)) result))))) + (defun dbus-get-this-registered-property (bus _service path interface property) + "Return PROPERTY entry of `dbus-registered-objects-table'. + Filter out not matching PATH." + ;; Remove entries not belonging to this case. + (seq-remove + (lambda (item) + (not (string-equal path (nth 2 item)))) + (gethash (list :property bus interface property) + dbus-registered-objects-table))) + + (defun dbus-get-other-registered-property (bus _service path interface property) + "Return PROPERTY entry of `dbus-registered-objects-table'. + Filter out matching PATH." + ;; Remove matching entries. + (seq-remove + (lambda (item) + (string-equal path (nth 2 item))) + (gethash (list :property bus interface property) + dbus-registered-objects-table))) + (defun dbus-register-property (bus service path interface property access value &optional emits-signal dont-register-service) *************** *** 1543,1554 **** ;; because the property might be accessed from anybody. (let ((key (list :property bus interface property)) (val ! (list (list nil service path (cons (if emits-signal (list access :emits-signal) (list access)) ! value))))) (puthash key val dbus-registered-objects-table) ;; Return the object. --- 1563,1576 ---- ;; because the property might be accessed from anybody. (let ((key (list :property bus interface property)) (val ! (cons (list nil service path (cons (if emits-signal (list access :emits-signal) (list access)) ! value)) ! (dbus-get-other-registered-property ! bus service path interface property)))) (puthash key val dbus-registered-objects-table) ;; Return the object. *************** *** 1566,1581 **** (cond ;; "Get" returns a variant. ((string-equal method "Get") ! (let ((entry (gethash (list :property bus interface property) ! dbus-registered-objects-table))) (when (string-equal path (nth 2 (car entry))) `((:variant ,(cdar (last (car entry)))))))) ;; "Set" expects a variant. ((string-equal method "Set") (let* ((value (caar (cddr args))) ! (entry (gethash (list :property bus interface property) ! dbus-registered-objects-table)) ;; The value of the hash table is a list; in case of ;; properties it contains just one element (UNAME SERVICE ;; PATH OBJECT). OBJECT is a cons cell of a list, which --- 1588,1603 ---- (cond ;; "Get" returns a variant. ((string-equal method "Get") ! (let ((entry (dbus-get-this-registered-property ! bus service path interface property))) (when (string-equal path (nth 2 (car entry))) `((:variant ,(cdar (last (car entry)))))))) ;; "Set" expects a variant. ((string-equal method "Set") (let* ((value (caar (cddr args))) ! (entry (dbus-get-this-registered-property ! bus service path interface property)) ;; The value of the hash table is a list; in case of ;; properties it contains just one element (UNAME SERVICE ;; PATH OBJECT). OBJECT is a cons cell of a list, which *************** *** 1590,1597 **** (signal 'dbus-error (list "Property not writable at path" property path))) (puthash (list :property bus interface property) ! (list (append (butlast (car entry)) ! (list (cons (car object) value)))) dbus-registered-objects-table) ;; Send the "PropertiesChanged" signal. (when (member :emits-signal (car object)) --- 1612,1621 ---- (signal 'dbus-error (list "Property not writable at path" property path))) (puthash (list :property bus interface property) ! (cons (append (butlast (car entry)) ! (list (cons (car object) value))) ! (dbus-get-other-registered-property ! bus service path interface property)) dbus-registered-objects-table) ;; Send the "PropertiesChanged" signal. (when (member :emits-signal (car object)) *************** *** 1607,1620 **** (let (result) (maphash (lambda (key val) ! (when (and (equal (butlast key) (list :property bus interface)) ! (string-equal path (nth 2 (car val))) ! (not (functionp (car (last (car val)))))) ! (push ! (list :dict-entry ! (car (last key)) ! (list :variant (cdar (last (car val))))) ! result))) dbus-registered-objects-table) ;; Return the result, or an empty array. (list :array (or result '(:signature "{sv}")))))))) --- 1631,1645 ---- (let (result) (maphash (lambda (key val) ! (dolist (item val) ! (when (and (equal (butlast key) (list :property bus interface)) ! (string-equal path (nth 2 item)) ! (not (functionp (car (last item))))) ! (push ! (list :dict-entry ! (car (last key)) ! (list :variant (cdar (last item)))) ! result)))) dbus-registered-objects-table) ;; Return the result, or an empty array. (list :array (or result '(:signature "{sv}"))))))))