Function: dbus-managed-objects-handler

dbus-managed-objects-handler is a byte-compiled function defined in dbus.el.gz.

Signature

(dbus-managed-objects-handler)

Documentation

Default handler for the "org.freedesktop.DBus.ObjectManager" interface.

It will be registered for all objects created by dbus-register-service.

Source Code

;; Defined in /usr/src/emacs/lisp/net/dbus.el.gz
(defun dbus-managed-objects-handler ()
  "Default handler for the \"org.freedesktop.DBus.ObjectManager\" interface.
It will be registered for all objects created by `dbus-register-service'."
  (let* ((last-input-event last-input-event)
	 (bus (dbus-event-bus-name last-input-event))
	 (path (dbus-event-path-name last-input-event)))
    ;; "GetManagedObjects" returns "a{oa{sa{sv}}}".
    (let (interfaces result)

      ;; Check for object path wildcard interfaces.
      (maphash
       (lambda (key val)
	 (when (equal (butlast key 2) (list :property bus))
           (dolist (item val)
	     (unless (nth 2 item) ; Path.
	       (push (nth 2 key) interfaces)))))
       dbus-registered-objects-table)

      ;; Check all registered object paths.
      (maphash
       (lambda (key val)
	 (when (equal (butlast key 2) (list :property bus))
           (dolist (item val)
	     (let ((object (or (nth 2 item) ""))) ; Path.
	       (when (string-prefix-p path object)
                 (dolist (interface (cons (nth 2 key) (delete-dups interfaces)))
                   (unless (assoc object result)
		     (push (list object) result))
                   (unless (assoc interface (cdr (assoc object result)))
		     (setcdr
		      (assoc object result)
		      (append
		       (list (cons
                              interface
                              ;; We simulate
                              ;; "org.freedesktop.DBus.Properties.GetAll"
                              ;; by using an appropriate D-Bus event.
                              (let ((last-input-event
                                     (append
                                      (butlast last-input-event 4)
                                      (list object dbus-interface-properties
                                            "GetAll" #'dbus-property-handler))))
                                (dbus-property-handler interface))))
		       (cdr (assoc object result)))))))))))
       dbus-registered-objects-table)

      ;; Return the result, or an empty array.
      (list
       :array
       (or
	(mapcar
	 (lambda (x)
	   (list
	    :dict-entry :object-path (car x)
	    (cons :array (mapcar (lambda (y) (cons :dict-entry y)) (cdr x)))))
	 result)
	'(:signature "{oa{sa{sv}}}"))))))