1 \input texinfo @c -*-texinfo-*-
2 @setfilename ../../info/dbus
4 @settitle Using of D-Bus
5 @c @setchapternewpage odd
12 Copyright @copyright{} 2007-2012 Free Software Foundation, Inc.
15 Permission is granted to copy, distribute and/or modify this document
16 under the terms of the GNU Free Documentation License, Version 1.3 or
17 any later version published by the Free Software Foundation; with no
18 Invariant Sections, with the Front-Cover texts being ``A GNU Manual'',
19 and with the Back-Cover Texts as in (a) below. A copy of the license
20 is included in the section entitled ``GNU Free Documentation License''.
22 (a) The FSF's Back-Cover Text is: ``You have the freedom to copy and
23 modify this GNU manual. Buying copies from the FSF supports it in
24 developing GNU and promoting software freedom.''
28 @dircategory Emacs lisp libraries
30 * D-Bus: (dbus). Using D-Bus in Emacs.
36 @node Top, Overview, (dir), (dir)
37 @top D-Bus integration in Emacs
39 This manual documents an API for usage of D-Bus in Emacs. D-Bus is a
40 message bus system, a simple way for applications to talk to one
41 another. An overview of D-Bus can be found at
42 @uref{http://dbus.freedesktop.org/}.
49 * Overview:: An overview of D-Bus.
50 * Inspection:: Inspection of D-Bus services.
51 * Type Conversion:: Mapping Lisp types and D-Bus types.
52 * Synchronous Methods:: Calling methods in a blocking way.
53 * Asynchronous Methods:: Calling methods non-blocking.
54 * Receiving Method Calls:: Offering own methods.
55 * Signals:: Sending and receiving signals.
56 * Alternative Buses:: Alternative buses and environments.
57 * Errors and Events:: Errors and events.
58 * Index:: Index including concepts, functions, variables.
60 * GNU Free Documentation License:: The license for this documentation.
65 @chapter An overview of D-Bus
68 D-Bus is an inter-process communication mechanism for applications
69 residing on the same host. The communication is based on
70 @dfn{messages}. Data in the messages is carried in a structured way,
71 it is not just a byte stream.
73 The communication is connection oriented to two kinds of message
74 buses: a so called @dfn{system bus}, and a @dfn{session bus}. On a
75 given machine, there is always one single system bus for miscellaneous
76 system-wide communication, like changing of hardware configuration.
77 On the other hand, the session bus is always related to a single
80 Every client application, which is connected to a bus, registers under
81 a @dfn{unique name} at the bus. This name is used for identifying the
82 client application. Such a unique name starts always with a colon,
83 and looks like @samp{:1.42}.
85 Additionally, a client application can register itself to a so called
86 @dfn{known name}, which is a series of identifiers separated by dots,
87 as in @samp{org.gnu.Emacs}. If several applications register to the
88 same known name, these registrations are queued, and only the first
89 application which has registered for the known name is reachable via
90 this name. If this application disconnects from the bus, the next
91 queued unique name becomes the owner of this known name.
93 An application can install one or several objects under its name.
94 Such objects are identified by an @dfn{object path}, which looks
95 similar to paths in a filesystem. An example of such an object path
96 could be @samp{/org/gnu/Emacs/}.
98 Applications might send a request to an object, that means sending a
99 message with some data as input parameters, and receiving a message
100 from that object with the result of this message, the output
101 parameters. Such a request is called @dfn{method} in D-Bus.
103 The other form of communication are @dfn{signals}. The underlying
104 message is emitted from an object and will be received by all other
105 applications which have registered for such a signal.
107 All methods and signals an object supports are called @dfn{interface}
108 of the object. Interfaces are specified under a hierarchical name in
109 D-Bus; an object can support several interfaces. Such an interface
110 name could be @samp{org.gnu.Emacs.TextEditor} or
111 @samp{org.gnu.Emacs.FileManager}.
115 @chapter Inspection of D-Bus services.
119 * Version:: Determining the D-Bus version.
120 * Bus names:: Discovering D-Bus names.
121 * Introspection:: Knowing the details of D-Bus services.
122 * Nodes and Interfaces:: Detecting object paths and interfaces.
123 * Methods and Signal:: Applying the functionality.
124 * Properties and Annotations:: What else to know about interfaces.
125 * Arguments and Signatures:: The final details.
130 @section D-Bus version.
132 D-Bus has evolved over the years. New features have been added with
133 new D-Bus versions. There are two variables, which allow to determine
134 the used D-Bus version.
136 @defvar dbus-compiled-version
137 This variable, a string, determines the version of D-Bus Emacs is
138 compiled against. If it cannot be determined the value is @code{nil}.
141 @defvar dbus-runtime-version
142 The other D-Bus version to be checked is the version of D-Bus Emacs
143 runs with. This string can be different from @code{dbus-compiled-version}.
144 It is also @code{nil}, if it cannot be determined at runtime.
151 There are several basic functions which inspect the buses for
152 registered names. Internally they use the basic interface
153 @samp{org.freedesktop.DBus}, which is supported by all objects of a bus.
155 @defun dbus-list-activatable-names &optional bus
156 This function returns the D-Bus service names, which can be activated
157 for @var{bus}. It must be either the symbol @code{:system} (the
158 default) or the symbol @code{:session}. An activatable service is
159 described in a service registration file. Under GNU/Linux, such files
160 are located at @file{/usr/share/dbus-1/system-services/} (for the
161 @code{:system} bus) or @file{/usr/share/dbus-1/services/}. An
162 activatable service is not necessarily registered at @var{bus} at already.
164 The result is a list of strings, which is @code{nil} when there are no
165 activatable service names at all. Example:
168 ;; Check, whether the document viewer can be accessed via D-Bus.
169 (member "org.gnome.evince.Daemon"
170 (dbus-list-activatable-names :session))
174 @defun dbus-list-names bus
175 All service names, which are registered at D-Bus @var{bus}, are
176 returned. The result is a list of strings, which is @code{nil} when
177 there are no registered service names at all. Well known names are
178 strings like @samp{org.freedesktop.DBus}. Names starting with
179 @samp{:} are unique names for services.
181 @var{bus} must be either the symbol @code{:system} or the symbol
185 @defun dbus-list-known-names bus
186 Retrieves all registered services which correspond to a known name in @var{bus}.
187 A service has a known name if it doesn't start with @samp{:}. The
188 result is a list of strings, which is @code{nil} when there are no
191 @var{bus} must be either the symbol @code{:system} or the symbol
195 @defun dbus-list-queued-owners bus service
196 For a given service, registered at D-Bus @var{bus} under the name
197 @var{service}, all queued unique names are returned. The result is a
198 list of strings, or @code{nil} when there are no queued names for
199 @var{service} at all.
201 @var{bus} must be either the symbol @code{:system} or the symbol
202 @code{:session}. @var{service} must be a known service name as
206 @defun dbus-get-name-owner bus service
207 For a given service, registered at D-Bus @var{bus} under the name
208 @var{service}, the unique name of the name owner is returned. The
209 result is a string, or @code{nil} when there exist no name owner of
212 @var{bus} must be either the symbol @code{:system} or the symbol
213 @code{:session}. @var{service} must be a known service name as
217 @defun dbus-ping bus service &optional timeout
218 Check whether the service name @var{service} is registered at D-Bus
219 @var{bus}. @var{service} might not have been started yet, it is
220 autostarted if possible. The result is either @code{t} or @code{nil}.
222 @var{bus} must be either the symbol @code{:system} or the symbol
223 @code{:session}. @var{service} must be a string. @var{timeout}, a
224 nonnegative integer, specifies the maximum number of milliseconds
225 @code{dbus-ping} must return. The default value is 25,000. Example:
229 "%s screensaver on board."
231 ((dbus-ping :session "org.gnome.ScreenSaver" 100) "Gnome")
232 ((dbus-ping :session "org.freedesktop.ScreenSaver" 100) "KDE")
236 If it shall be checked whether @var{service} is already running
237 without autostarting it, one shall apply
240 (member service (dbus-list-known-names bus))
244 @defun dbus-get-unique-name bus
245 The unique name, under which Emacs is registered at D-Bus @var{bus},
246 is returned as string.
248 @var{bus} must be either the symbol @code{:system} or the symbol
254 @section Knowing the details of D-Bus services.
256 D-Bus services publish their interfaces. This can be retrieved and
257 analyzed during runtime, in order to understand the used
260 The resulting introspection data are in XML format. The root
261 introspection element is always a @code{node} element. It might have
262 a @code{name} attribute, which denotes the (absolute) object path an
263 interface is introspected.
265 The root @code{node} element may have @code{node} and @code{interface}
266 children. A child @code{node} element must have a @code{name}
267 attribute, this case it is the relative object path to the root
270 An @code{interface} element has just one attribute, @code{name}, which
271 is the full name of that interface. The default interface
272 @samp{org.freedesktop.DBus.Introspectable} is always present. Example:
275 <node name="/org/bluez">
276 <interface name="org.freedesktop.DBus.Introspectable">
279 <interface name="org.bluez.Manager">
282 <interface name="org.bluez.Database">
285 <interface name="org.bluez.Security">
288 <node name="service_audio"/>
289 <node name="service_input"/>
290 <node name="service_network"/>
291 <node name="service_serial"/>
295 Children of an @code{interface} element can be @code{method},
296 @code{signal} and @code{property} elements. A @code{method} element
297 stands for a D-Bus method of the surrounding interface. The element
298 itself has a @code{name} attribute, showing the method name. Children
299 elements @code{arg} stand for the arguments of a method. Example:
302 <method name="ResolveHostName">
303 <arg name="interface" type="i" direction="in"/>
304 <arg name="protocol" type="i" direction="in"/>
305 <arg name="name" type="s" direction="in"/>
306 <arg name="aprotocol" type="i" direction="in"/>
307 <arg name="flags" type="u" direction="in"/>
308 <arg name="interface" type="i" direction="out"/>
309 <arg name="protocol" type="i" direction="out"/>
310 <arg name="name" type="s" direction="out"/>
311 <arg name="aprotocol" type="i" direction="out"/>
312 <arg name="address" type="s" direction="out"/>
313 <arg name="flags" type="u" direction="out"/>
317 @code{arg} elements can have the attributes @code{name}, @code{type}
318 and @code{direction}. The @code{name} attribute is optional. The
319 @code{type} attribute stands for the @dfn{signature} of the argument
320 in D-Bus. For a discussion of D-Bus types and their Lisp
321 representation see @ref{Type Conversion}.@footnote{D-Bus signatures
322 are explained in the D-Bus specification
323 @uref{http://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-signatures}.}
324 The @code{direction} attribute of an @code{arg} element can be only
325 @samp{in} or @samp{out}; in case it is omitted, it defaults to
328 A @code{signal} element of an @code{interface} has a similar
329 structure. The @code{direction} attribute of an @code{arg} child
330 element can be only @samp{out} here; which is also the default value.
334 <signal name="StateChanged">
335 <arg name="state" type="i"/>
336 <arg name="error" type="s"/>
340 A @code{property} element has no @code{arg} child
341 element. It just has the attributes @code{name}, @code{type} and
342 @code{access}, which are all mandatory. The @code{access} attribute
343 allows the values @samp{readwrite}, @samp{read}, and @samp{write}.
347 <property name="Status" type="u" direction="read"/>
350 @code{annotation} elements can be children of @code{interface},
351 @code{method}, @code{signal}, and @code{property} elements. Unlike
352 properties, which can change their values during lifetime of a D-Bus
353 object, annotations are static. Often they are used for code
354 generators of D-Bus language bindings. Example:
357 <annotation name="de.berlios.Pinot.GetStatistics" value="pinotDBus"/>
360 Annotations have just @code{name} and @code{value} attributes, both
363 @defun dbus-introspect bus service path
364 This function returns all interfaces and sub-nodes of @var{service},
365 registered at object path @var{path} at bus @var{bus}.
367 @var{bus} must be either the symbol @code{:system} or the symbol
368 @code{:session}. @var{service} must be a known service name, and
369 @var{path} must be a valid object path. The last two parameters are
370 strings. The result, the introspection data, is a string in XML
375 :system "org.freedesktop.Hal"
376 "/org/freedesktop/Hal/devices/computer")
378 @result{} "<!DOCTYPE node PUBLIC
379 "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
380 "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
382 <interface name="org.freedesktop.Hal.Device">
383 <method name="GetAllProperties">
384 <arg name="properties" direction="out" type="a@{sv@}"/>
387 <signal name="PropertyModified">
388 <arg name="num_updates" type="i"/>
389 <arg name="updates" type="a(sbb)"/>
396 This example informs us, that the service @samp{org.freedesktop.Hal}
397 at object path @samp{/org/freedesktop/Hal/devices/computer} offers the
398 interface @samp{org.freedesktop.Hal.Device} (and 2 other interfaces
399 not documented here). This interface contains the method
400 @samp{GetAllProperties}, which needs no input parameters, but returns
401 as output parameter an array of dictionary entries (key-value pairs).
402 Every dictionary entry has a string as key, and a variant as value.
404 The interface offers also a signal, which returns 2 parameters: an
405 integer, and an array consisting of elements which are a struct of a
406 string and 2 boolean values.@footnote{ The interfaces of the service
407 @samp{org.freedesktop.Hal} are described at
408 @uref{http://people.freedesktop.org/~david/hal-spec/hal-spec.html#interfaces}.}
411 @defun dbus-introspect-xml bus service path
412 This function has the same intention as function
413 @code{dbus-introspect}. The returned value is a parsed XML tree,
414 which can be used for further analysis. Example:
418 :session "org.freedesktop.xesam.searcher"
419 "/org/freedesktop/xesam/searcher/main")
421 @result{} (node ((name . "/org/freedesktop/xesam/searcher/main"))
422 (interface ((name . "org.freedesktop.xesam.Search"))
423 (method ((name . "GetHitData"))
424 (arg ((name . "search") (type . "s") (direction . "in")))
425 (arg ((name . "hit_ids") (type . "au") (direction . "in")))
426 (arg ((name . "fields") (type . "as") (direction . "in")))
427 (arg ((name . "hit_data") (type . "aav") (direction . "out")))
430 (signal ((name . "HitsAdded"))
431 (arg ((name . "search") (type . "s")))
432 (arg ((name . "count") (type . "u")))
440 @defun dbus-introspect-get-attribute object attribute
441 It returns the @var{attribute} value of a D-Bus introspection
442 @var{object}. @var{object} can be every subtree of a parsed XML tree
443 as retrieved with @code{dbus-introspect-xml}. @var{attribute} must be
444 a string according to the attribute names in the D-Bus specification.
448 (dbus-introspect-get-attribute
449 (dbus-introspect-xml :system "org.freedesktop.SystemToolsBackends"
450 "/org/freedesktop/SystemToolsBackends/UsersConfig")
453 @result{} "/org/freedesktop/SystemToolsBackends/UsersConfig"
456 If @var{object} has no @var{attribute}, the function returns
461 @node Nodes and Interfaces
462 @section Detecting object paths and interfaces.
464 The first elements, to be introspected for a D-Bus object, are further
465 object paths and interfaces.
467 @defun dbus-introspect-get-node-names bus service path
468 All node names of @var{service} in D-Bus @var{bus} at object path
469 @var{path} are returned as list of strings. Example:
472 (dbus-introspect-get-node-names
473 :session "org.gnome.seahorse" "/org/gnome/seahorse")
475 @result{} ("crypto" "keys")
478 The node names stand for further object paths of the D-Bus
479 @var{service}, relative to @var{path}. In the example,
480 @samp{/org/gnome/seahorse/crypto} and @samp{/org/gnome/seahorse/keys}
481 are also object paths of the D-Bus service @samp{org.gnome.seahorse}.
484 @defun dbus-introspect-get-all-nodes bus service path
485 This function returns all node names of @var{service} in D-Bus
486 @var{bus} at object path @var{path}. It returns a list of strings
487 with all object paths of @var{service}, starting at @var{path}.
491 (dbus-introspect-get-all-nodes :session "org.gnome.seahorse" "/")
493 @result{} ("/" "/org" "/org/gnome" "/org/gnome/seahorse"
494 "/org/gnome/seahorse/crypto"
495 "/org/gnome/seahorse/keys"
496 "/org/gnome/seahorse/keys/openpgp"
497 "/org/gnome/seahorse/keys/openpgp/local"
498 "/org/gnome/seahorse/keys/openssh"
499 "/org/gnome/seahorse/keys/openssh/local")
503 @defun dbus-introspect-get-interface-names bus service path
504 There will be returned a list strings of all interface names of
505 @var{service} in D-Bus @var{bus} at object path @var{path}. This list
506 will contain the default interface @samp{org.freedesktop.DBus.Introspectable}.
508 Another default interface is @samp{org.freedesktop.DBus.Properties}.
509 If present, @code{interface} elements can also have @code{property}
513 (dbus-introspect-get-interface-names
514 :system "org.freedesktop.Hal"
515 "/org/freedesktop/Hal/devices/computer")
517 @result{} ("org.freedesktop.DBus.Introspectable"
518 "org.freedesktop.Hal.Device"
519 "org.freedesktop.Hal.Device.SystemPowerManagement"
520 "org.freedesktop.Hal.Device.CPUFreq")
524 @defun dbus-introspect-get-interface bus service path interface
525 Return @var{interface} of @var{service} in D-Bus @var{bus} at object
526 path @var{path}. The return value is an XML element. @var{interface}
527 must be a string, element of the list returned by
528 @code{dbus-introspect-get-interface-names}. Example:
531 (dbus-introspect-get-interface
532 :session "org.freedesktop.xesam.searcher"
533 "/org/freedesktop/xesam/searcher/main"
534 "org.freedesktop.xesam.Search")
536 @result{} (interface ((name . "org.freedesktop.xesam.Search"))
537 (method ((name . "GetHitData"))
538 (arg ((name . "search") (type . "s") (direction . "in")))
539 (arg ((name . "hit_ids") (type . "au") (direction . "in")))
540 (arg ((name . "fields") (type . "as") (direction . "in")))
541 (arg ((name . "hit_data") (type . "aav") (direction . "out")))
544 (signal ((name . "HitsAdded"))
545 (arg ((name . "search") (type . "s")))
546 (arg ((name . "count") (type . "u")))
553 With these functions, it is possible to retrieve all introspection
554 data from a running system:
557 (with-current-buffer (switch-to-buffer "*introspect*")
559 (dolist (service (dbus-list-known-names :session))
560 (dolist (path (dbus-introspect-get-all-nodes :session service "/"))
561 ;; We want to introspect only elements, which have more than
562 ;; the default interface "org.freedesktop.DBus.Introspectable".
564 "org.freedesktop.DBus.Introspectable"
565 (dbus-introspect-get-interface-names :session service path))
566 (insert (message "\nservice: \"%s\" path: \"%s\"\n" service path)
567 (dbus-introspect :session service path))
572 @node Methods and Signal
573 @section Applying the functionality.
575 Methods and signals are the communication means to D-Bus. The
576 following functions return their specifications.
578 @defun dbus-introspect-get-method-names bus service path interface
579 Return a list of strings of all method names of @var{interface} of
580 @var{service} in D-Bus @var{bus} at object path @var{path}. Example:
583 (dbus-introspect-get-method-names
584 :session "org.freedesktop.xesam.searcher"
585 "/org/freedesktop/xesam/searcher/main"
586 "org.freedesktop.xesam.Search")
588 @result{} ("GetState" "StartSearch" "GetHitCount" "GetHits" "NewSession"
589 "CloseSession" "GetHitData" "SetProperty" "NewSearch"
590 "GetProperty" "CloseSearch")
594 @defun dbus-introspect-get-method bus service path interface method
595 This function returns @var{method} of @var{interface} as XML element.
596 It must be located at @var{service} in D-Bus @var{bus} at object path
597 @var{path}. @var{method} must be a string, element of the list
598 returned by @code{dbus-introspect-get-method-names}. Example:
601 (dbus-introspect-get-method
602 :session "org.freedesktop.xesam.searcher"
603 "/org/freedesktop/xesam/searcher/main"
604 "org.freedesktop.xesam.Search" "GetHitData")
606 @result{} (method ((name . "GetHitData"))
607 (arg ((name . "search") (type . "s") (direction . "in")))
608 (arg ((name . "hit_ids") (type . "au") (direction . "in")))
609 (arg ((name . "fields") (type . "as") (direction . "in")))
610 (arg ((name . "hit_data") (type . "aav") (direction . "out")))
615 @defun dbus-introspect-get-signal-names bus service path interface
616 Return a list of strings of all signal names of @var{interface} of
617 @var{service} in D-Bus @var{bus} at object path @var{path}. Example:
620 (dbus-introspect-get-signal-names
621 :session "org.freedesktop.xesam.searcher"
622 "/org/freedesktop/xesam/searcher/main"
623 "org.freedesktop.xesam.Search")
625 @result{} ("StateChanged" "SearchDone" "HitsModified"
626 "HitsRemoved" "HitsAdded")
630 @defun dbus-introspect-get-signal bus service path interface signal
631 This function returns @var{signal} of @var{interface} as XML element.
632 It must be located at @var{service} in D-Bus @var{bus} at object path
633 @var{path}. @var{signal} must be a string, element of the list
634 returned by @code{dbus-introspect-get-signal-names}. Example:
637 (dbus-introspect-get-signal
638 :session "org.freedesktop.xesam.searcher"
639 "/org/freedesktop/xesam/searcher/main"
640 "org.freedesktop.xesam.Search" "HitsAdded")
642 @result{} (signal ((name . "HitsAdded"))
643 (arg ((name . "search") (type . "s")))
644 (arg ((name . "count") (type . "u")))
650 @node Properties and Annotations
651 @section What else to know about interfaces.
653 Interfaces can have properties. These can be exposed via the
654 @samp{org.freedesktop.DBus.Properties} interface@footnote{See
655 @uref{http://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces-properties}}.
656 That is, properties can be retrieved and changed during lifetime of an
659 A generalized interface is
660 @samp{org.freedesktop.DBus.Objectmanager}@footnote{See
661 @uref{http://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces-objectmanager}},
662 which returns objects, their interfaces and properties for a given
663 service in just one call.
665 Annotations, on the other hand, are static values for an element.
666 Often, they are used to instruct generators, how to generate code from
667 the interface for a given language binding.
669 @defun dbus-introspect-get-property-names bus service path interface
670 Return a list of strings with all property names of @var{interface} of
671 @var{service} in D-Bus @var{bus} at object path @var{path}. Example:
674 (dbus-introspect-get-property-names
675 :session "org.kde.kded" "/modules/networkstatus"
676 "org.kde.Solid.Networking.Client")
681 If an interface declares properties, the corresponding element supports
682 also the @samp{org.freedesktop.DBus.Properties} interface.
685 @defun dbus-introspect-get-property bus service path interface property
686 This function returns @var{property} of @var{interface} as XML element.
687 It must be located at @var{service} in D-Bus @var{bus} at object path
688 @var{path}. @var{property} must be a string, element of the list
689 returned by @code{dbus-introspect-get-property-names}.
691 A @var{property} value can be retrieved by the function
692 @code{dbus-introspect-get-attribute}. Example:
695 (dbus-introspect-get-property
696 :session "org.kde.kded" "/modules/networkstatus"
697 "org.kde.Solid.Networking.Client" "Status")
699 @result{} (property ((access . "read") (type . "u") (name . "Status")))
701 (dbus-introspect-get-attribute
702 (dbus-introspect-get-property
703 :session "org.kde.kded" "/modules/networkstatus"
704 "org.kde.Solid.Networking.Client" "Status")
711 @defun dbus-get-property bus service path interface property
712 This function returns the value of @var{property} of @var{interface}.
713 It will be checked at @var{bus}, @var{service}, @var{path}. The
714 result can be any valid D-Bus value, or @code{nil} if there is no
715 @var{property}. Example:
719 :session "org.kde.kded" "/modules/networkstatus"
720 "org.kde.Solid.Networking.Client" "Status")
726 @defun dbus-set-property bus service path interface property value
727 Set value of @var{property} of @var{interface} to @var{value}. It
728 will be checked at @var{bus}, @var{service}, @var{path}. When the
729 value has been set successful, the result is @var{value}. Otherwise,
730 @code{nil} is returned. Example:
734 :session "org.kde.kaccess" "/MainApplication"
735 "com.trolltech.Qt.QApplication" "doubleClickInterval" 500)
741 @defun dbus-get-all-properties bus service path interface
742 This function returns all properties of @var{interface}. It will be
743 checked at @var{bus}, @var{service}, @var{path}. The result is a list
744 of cons. Every cons contains the name of the property, and its value.
745 If there are no properties, @code{nil} is returned. Example:
748 (dbus-get-all-properties
749 :session "org.kde.kaccess" "/MainApplication"
750 "com.trolltech.Qt.QApplication")
752 @result{} (("cursorFlashTime" . 1000) ("doubleClickInterval" . 500)
753 ("keyboardInputInterval" . 400) ("wheelScrollLines" . 3)
754 ("globalStrut" 0 0) ("startDragTime" . 500)
755 ("startDragDistance" . 4) ("quitOnLastWindowClosed" . t)
760 @defun dbus-get-all-managed-objects bus service path
761 This functions returns all objects at @var{bus}, @var{service},
762 @var{path}, and the children of @var{path}. The result is a list of
763 objects. Every object is a cons of an existing path name, and the
764 list of available interface objects. An interface object is another
765 cons, which car is the interface name, and the cdr is the list of
766 properties as returned by @code{dbus-get-all-properties} for that path
767 and interface. Example:
770 (dbus-get-all-managed-objects
771 :session "org.gnome.SettingsDaemon" "/")
773 @result{} (("/org/gnome/SettingsDaemon/MediaKeys"
774 ("org.gnome.SettingsDaemon.MediaKeys")
775 ("org.freedesktop.DBus.Peer")
776 ("org.freedesktop.DBus.Introspectable")
777 ("org.freedesktop.DBus.Properties")
778 ("org.freedesktop.DBus.ObjectManager"))
779 ("/org/gnome/SettingsDaemon/Power"
780 ("org.gnome.SettingsDaemon.Power.Keyboard")
781 ("org.gnome.SettingsDaemon.Power.Screen")
782 ("org.gnome.SettingsDaemon.Power"
783 ("Icon" . ". GThemedIcon battery-full-charged-symbolic ")
784 ("Tooltip" . "Laptop battery is charged"))
785 ("org.freedesktop.DBus.Peer")
786 ("org.freedesktop.DBus.Introspectable")
787 ("org.freedesktop.DBus.Properties")
788 ("org.freedesktop.DBus.ObjectManager"))
792 If possible, @samp{org.freedesktop.DBus.ObjectManager.GetManagedObjects}
793 is used for retrieving the information. Otherwise, the information
794 is collected via @samp{org.freedesktop.DBus.Introspectable.Introspect}
795 and @samp{org.freedesktop.DBus.Properties.GetAll}, which is slow.
797 An overview of all existing object paths, their interfaces and
798 properties could be retrieved by the following code:
801 (with-current-buffer (switch-to-buffer "*objectmanager*")
804 (dolist (service (dbus-list-known-names :session) result)
805 (message "%s" service)
809 (dbus-get-all-managed-objects :session service "/"))))
810 (insert (message "%s" (pp result)))
815 @defun dbus-introspect-get-annotation-names bus service path interface &optional name
816 Return a list of all annotation names as list of strings. If
817 @var{name} is @code{nil}, the annotations are children of
818 @var{interface}, otherwise @var{name} must be a @code{method},
819 @code{signal}, or @code{property} XML element, where the annotations
823 (dbus-introspect-get-annotation-names
824 :session "de.berlios.Pinot" "/de/berlios/Pinot"
825 "de.berlios.Pinot" "GetStatistics")
827 @result{} ("de.berlios.Pinot.GetStatistics")
830 Default annotation names@footnote{See
831 @uref{http://dbus.freedesktop.org/doc/dbus-specification.html#introspection-format}}
835 @item org.freedesktop.DBus.Deprecated
836 Whether or not the entity is deprecated; defaults to @code{nil}
838 @item org.freedesktop.DBus.GLib.CSymbol
839 The C symbol; may be used for @code{methods} and @code{interfaces}
841 @item org.freedesktop.DBus.Method.NoReply
842 If set, don't expect a reply to the @code{method} call; defaults to @code{nil}
846 @defun dbus-introspect-get-annotation bus service path interface name annotation
847 Return annotation @var{ANNOTATION} as XML object. If @var{name} is
848 @code{nil}, @var{ANNOTATION} is a child of @var{interface}, otherwise
849 @var{name} must be the name of a @code{method}, @code{signal}, or
850 @code{property} XML element, where the @var{ANNOTATION} belongs to.
852 An attribute value can be retrieved by
853 @code{dbus-introspect-get-attribute}. Example:
856 (dbus-introspect-get-annotation
857 :session "de.berlios.Pinot" "/de/berlios/Pinot"
858 "de.berlios.Pinot" "GetStatistics"
859 "de.berlios.Pinot.GetStatistics")
861 @result{} (annotation ((name . "de.berlios.Pinot.GetStatistics")
862 (value . "pinotDBus")))
864 (dbus-introspect-get-attribute
865 (dbus-introspect-get-annotation
866 :session "de.berlios.Pinot" "/de/berlios/Pinot"
867 "de.berlios.Pinot" "GetStatistics"
868 "de.berlios.Pinot.GetStatistics")
871 @result{} "pinotDBus"
876 @node Arguments and Signatures
877 @section The final details.
879 Methods and signals have arguments. They are described in the
880 @code{arg} XML elements.
882 @defun dbus-introspect-get-argument-names bus service path interface name
883 Return a list of all argument names as list of strings. @var{name}
884 must be a @code{method} or @code{signal} XML element. Example:
887 (dbus-introspect-get-argument-names
888 :session "org.freedesktop.xesam.searcher"
889 "/org/freedesktop/xesam/searcher/main"
890 "org.freedesktop.xesam.Search" "GetHitData")
892 @result{} ("search" "hit_ids" "fields" "hit_data")
895 Argument names are optional; the function can return @code{nil}
896 therefore, even if the method or signal has arguments.
899 @defun dbus-introspect-get-argument bus service path interface name arg
900 Return argument @var{ARG} as XML object. @var{name}
901 must be a @code{method} or @code{signal} XML element. Example:
904 (dbus-introspect-get-argument
905 :session "org.freedesktop.xesam.searcher"
906 "/org/freedesktop/xesam/searcher/main"
907 "org.freedesktop.xesam.Search" "GetHitData" "search")
909 @result{} (arg ((name . "search") (type . "s") (direction . "in")))
913 @defun dbus-introspect-get-signature bus service path interface name &optional direction
914 Return signature of a @code{method} or @code{signal}, represented by
915 @var{name}, as string.
917 If @var{name} is a @code{method}, @var{direction} can be either
918 @samp{in} or @samp{out}. If @var{direction} is @code{nil}, @samp{in}
921 If @var{name} is a @code{signal}, and @var{direction} is
922 non-@code{nil}, @var{direction} must be @samp{out}. Example:
925 (dbus-introspect-get-signature
926 :session "org.freedesktop.xesam.searcher"
927 "/org/freedesktop/xesam/searcher/main"
928 "org.freedesktop.xesam.Search" "GetHitData" "in")
932 (dbus-introspect-get-signature
933 :session "org.freedesktop.xesam.searcher"
934 "/org/freedesktop/xesam/searcher/main"
935 "org.freedesktop.xesam.Search" "HitsAdded")
942 @node Type Conversion
943 @chapter Mapping Lisp types and D-Bus types.
944 @cindex type conversion
946 D-Bus method calls and signals accept usually several arguments as
947 parameters, either as input parameter, or as output parameter. Every
948 argument belongs to a D-Bus type.
950 Such arguments must be mapped between the value encoded as a D-Bus
951 type, and the corresponding type of Lisp objects. The mapping is
952 applied Lisp object @expansion{} D-Bus type for input parameters, and
953 D-Bus type @expansion{} Lisp object for output parameters.
956 @section Input parameters.
958 Input parameters for D-Bus methods and signals occur as arguments of a
959 Lisp function call. The following mapping to D-Bus types is
960 applied, when the corresponding D-Bus message is created:
963 @multitable {negative integer} {@expansion{}} {DBUS_TYPE_BOOLEAN}
964 @item Lisp type @tab @tab D-Bus type
966 @item @code{t} and @code{nil} @tab @expansion{} @tab DBUS_TYPE_BOOLEAN
967 @item natural number @tab @expansion{} @tab DBUS_TYPE_UINT32
968 @item negative integer @tab @expansion{} @tab DBUS_TYPE_INT32
969 @item float @tab @expansion{} @tab DBUS_TYPE_DOUBLE
970 @item string @tab @expansion{} @tab DBUS_TYPE_STRING
971 @item list @tab @expansion{} @tab DBUS_TYPE_ARRAY
975 Other Lisp objects, like symbols or hash tables, are not accepted as
978 If it is necessary to use another D-Bus type, a corresponding type
979 symbol can be prepended to the corresponding Lisp object. Basic D-Bus
980 types are represented by the type symbols @code{:byte},
981 @code{:boolean}, @code{:int16}, @code{:uint16}, @code{:int32},
982 @code{:uint32}, @code{:int64}, @code{:uint64}, @code{:double},
983 @code{:string}, @code{:object-path}, @code{:signature} and
990 (dbus-call-method @dots{} @var{NAT-NUMBER} @var{STRING})
996 (dbus-call-method @dots{} :uint32 @var{NAT-NUMBER} :string @var{STRING})
1002 (dbus-call-method @dots{} :int32 @var{NAT-NUMBER} :signature @var{STRING})
1005 The value for a byte D-Bus type can be any integer in the range 0
1006 through 255. If a character is used as argument, modifiers
1007 represented outside this range are stripped of. For example,
1008 @code{:byte ?x} is equal to @code{:byte ?\M-x}, but it is not equal to
1009 @code{:byte ?\C-x} or @code{:byte ?\M-\C-x}.
1011 Signed and unsigned integer D-Bus types expect a corresponding integer
1012 value. If the value does not fit Emacs's integer range, it is also
1013 possible to use an equivalent floating point number.
1015 A D-Bus compound type is always represented as a list. The @sc{car}
1016 of this list can be the type symbol @code{:array}, @code{:variant},
1017 @code{:struct} or @code{:dict-entry}, which would result in a
1018 corresponding D-Bus container. @code{:array} is optional, because
1019 this is the default compound D-Bus type for a list.
1021 The objects being elements of the list are checked according to the
1022 D-Bus compound type rules.
1025 @item An array must contain only elements of the same D-Bus type. It
1028 @item A variant must contain only one single element.
1030 @item A dictionary entry must be element of an array, and it must
1031 contain only a key-value pair of two elements, with a basic D-Bus type
1034 @item There is no restriction for structs.
1037 If an empty array needs an element D-Bus type other than string, it
1038 can contain exactly one element of D-Bus type @code{:signature}. The
1039 value of this element (a string) is used as the signature of the
1040 elements of this array. Example:
1044 :session "org.freedesktop.Notifications"
1045 "/org/freedesktop/Notifications"
1046 "org.freedesktop.Notifications" "Notify"
1047 "GNU Emacs" ;; Application name.
1048 0 ;; No replacement of other notifications.
1050 "Notification summary" ;; Summary.
1052 "This is a test notification, raised from %s" (emacs-version))
1053 '(:array) ;; No actions (empty array of strings).
1054 '(:array :signature "@{sv@}") ;; No hints
1055 ;; (empty array of dictionary entries).
1056 :int32 -1) ;; Default timeout.
1061 @defun dbus-string-to-byte-array string
1062 Sometimes, D-Bus methods require as input parameter an array of bytes,
1063 instead of a string. If it is guaranteed, that @var{string} is an
1064 UTF8 string, this function performs the conversion. Example:
1067 (dbus-string-to-byte-array "/etc/hosts")
1069 @result{} (:array :byte 47 :byte 101 :byte 116 :byte 99 :byte 47
1070 :byte 104 :byte 111 :byte 115 :byte 116 :byte 115)
1074 @defun dbus-escape-as-identifier string
1075 Escape an arbitrary @var{string} so it follows the rules for a C
1076 identifier. The escaped string can be used as object path component,
1077 interface element component, bus name component or member name in
1080 The escaping consists of replacing all non-alphanumerics, and the
1081 first character if it's a digit, with an underscore and two
1082 lower-case hex digits. As a special case, "" is escaped to
1086 (dbus-escape-as-identifier "0123abc_xyz\x01\xff")
1088 @result{} "_30123abc_5fxyz_01_ff"
1093 @section Output parameters.
1095 Output parameters of D-Bus methods and signals are mapped to Lisp
1099 @multitable {DBUS_TYPE_OBJECT_PATH} {@expansion{}} {natural number or float}
1100 @item D-Bus type @tab @tab Lisp type
1102 @item DBUS_TYPE_BOOLEAN @tab @expansion{} @tab @code{t} or @code{nil}
1103 @item DBUS_TYPE_BYTE @tab @expansion{} @tab natural number
1104 @item DBUS_TYPE_UINT16 @tab @expansion{} @tab natural number
1105 @item DBUS_TYPE_INT16 @tab @expansion{} @tab integer
1106 @item DBUS_TYPE_UINT32 @tab @expansion{} @tab natural number or float
1107 @item DBUS_TYPE_UNIX_FD @tab @expansion{} @tab natural number or float
1108 @item DBUS_TYPE_INT32 @tab @expansion{} @tab integer or float
1109 @item DBUS_TYPE_UINT64 @tab @expansion{} @tab natural number or float
1110 @item DBUS_TYPE_INT64 @tab @expansion{} @tab integer or float
1111 @item DBUS_TYPE_DOUBLE @tab @expansion{} @tab float
1112 @item DBUS_TYPE_STRING @tab @expansion{} @tab string
1113 @item DBUS_TYPE_OBJECT_PATH @tab @expansion{} @tab string
1114 @item DBUS_TYPE_SIGNATURE @tab @expansion{} @tab string
1115 @item DBUS_TYPE_ARRAY @tab @expansion{} @tab list
1116 @item DBUS_TYPE_VARIANT @tab @expansion{} @tab list
1117 @item DBUS_TYPE_STRUCT @tab @expansion{} @tab list
1118 @item DBUS_TYPE_DICT_ENTRY @tab @expansion{} @tab list
1122 A float object in case of @code{DBUS_TYPE_UINT32},
1123 @code{DBUS_TYPE_INT32}, @code{DBUS_TYPE_UINT64},
1124 @code{DBUS_TYPE_INT64} and @code{DBUS_TYPE_UNIX_FD} is returned, when
1125 the C value exceeds the Emacs number size range.
1127 The resulting list of the last 4 D-Bus compound types contains as
1128 elements the elements of the D-Bus container, mapped according to the
1131 The signal @code{PropertyModified}, discussed as example in
1132 @ref{Inspection}, would offer as Lisp data the following object
1133 (@var{BOOL} stands here for either @code{nil} or @code{t}):
1136 (@var{INTEGER} ((@var{STRING} @var{BOOL} @var{BOOL}) (@var{STRING} @var{BOOL} @var{BOOL}) @dots{}))
1139 @defun dbus-byte-array-to-string byte-array
1140 If a D-Bus method or signal returns an array of bytes, which are known
1141 to represent an UTF8 string, this function converts @var{byte-array}
1142 to the corresponding string. Example:
1145 (dbus-byte-array-to-string '(47 101 116 99 47 104 111 115 116 115))
1147 @result{} "/etc/hosts"
1151 @defun dbus-unescape-from-identifier string
1152 Retrieve the original string from the encoded @var{string}.
1153 @var{string} must have been coded with
1154 @code{dbus-escape-as-identifier}. Example:
1157 (dbus-unescape-from-identifier "_30123abc_5fxyz_01_ff")
1160 @result{} "0123abc_xyz^Aÿ"
1163 @result{} "0123abc_xyz^A@"y"
1169 @node Synchronous Methods
1170 @chapter Calling methods in a blocking way.
1171 @cindex method calls, synchronous
1172 @cindex synchronous method calls
1174 Methods can be called synchronously (@dfn{blocking}) or asynchronously
1175 (@dfn{non-blocking}).
1177 At D-Bus level, a method call consist of two messages: one message
1178 which carries the input parameters to the object owning the method to
1179 be called, and a reply message returning the resulting output
1180 parameters from the object.
1182 @defun dbus-call-method bus service path interface method &optional :timeout timeout &rest args
1183 This function calls @var{method} on the D-Bus @var{bus}. @var{bus} is
1184 either the symbol @code{:system} or the symbol @code{:session}.
1186 @var{service} is the D-Bus service name to be used. @var{path} is the
1187 D-Bus object path, @var{service} is registered at. @var{interface} is
1188 an interface offered by @var{service}. It must provide @var{method}.
1190 If the parameter @code{:timeout} is given, the following integer
1191 @var{timeout} specifies the maximum number of milliseconds the method
1192 call must return. The default value is 25,000. If the method call
1193 doesn't return in time, a D-Bus error is raised (@pxref{Errors and
1196 All other arguments args are passed to @var{method} as arguments.
1197 They are converted into D-Bus types as described in @ref{Type
1200 The function returns the resulting values of @var{method} as a list of
1201 Lisp objects, according to the type conversion rules described in
1202 @ref{Type Conversion}. Example:
1206 :session "org.gnome.seahorse" "/org/gnome/seahorse/keys/openpgp"
1207 "org.gnome.seahorse.Keys" "GetKeyField"
1208 "openpgp:657984B8C7A966DD" "simple-name")
1210 @result{} (t ("Philip R. Zimmermann"))
1213 If the result of the method call is just one value, the converted Lisp
1214 object is returned instead of a list containing this single Lisp
1219 :system "org.freedesktop.Hal"
1220 "/org/freedesktop/Hal/devices/computer"
1221 "org.freedesktop.Hal.Device" "GetPropertyString"
1222 "system.kernel.machine")
1227 With the @code{dbus-introspect} function it is possible to explore the
1228 interfaces of @samp{org.freedesktop.Hal} service. It offers the
1229 interfaces @samp{org.freedesktop.Hal.Manager} for the object at the
1230 path @samp{/org/freedesktop/Hal/Manager} as well as the interface
1231 @samp{org.freedesktop.Hal.Device} for all objects prefixed with the
1232 path @samp{/org/freedesktop/Hal/devices}. With the methods
1233 @samp{GetAllDevices} and @samp{GetAllProperties}, it is simple to
1234 emulate the @code{lshal} command on GNU/Linux systems:
1239 :system "org.freedesktop.Hal"
1240 "/org/freedesktop/Hal/Manager"
1241 "org.freedesktop.Hal.Manager" "GetAllDevices"))
1242 (message "\nudi = %s" device)
1245 :system "org.freedesktop.Hal" device
1246 "org.freedesktop.Hal.Device" "GetAllProperties"))
1248 (car properties) (or (caar (cdr properties)) ""))))
1250 @print{} "udi = /org/freedesktop/Hal/devices/computer
1251 info.addons = (\"hald-addon-acpi\")
1252 info.bus = \"unknown\"
1253 info.product = \"Computer\"
1254 info.subsystem = \"unknown\"
1255 info.udi = \"/org/freedesktop/Hal/devices/computer\"
1256 linux.sysfs_path_device = \"(none)\"
1257 power_management.acpi.linux.version = \"20051216\"
1258 power_management.can_suspend_to_disk = t
1259 power_management.can_suspend_to_ram = \"\"
1260 power_management.type = \"acpi\"
1261 smbios.bios.release_date = \"11/07/2001\"
1262 system.chassis.manufacturer = \"COMPAL\"
1263 system.chassis.type = \"Notebook\"
1264 system.firmware.release_date = \"03/19/2005\"
1270 @node Asynchronous Methods
1271 @chapter Calling methods non-blocking.
1272 @cindex method calls, asynchronous
1273 @cindex asynchronous method calls
1275 @defun dbus-call-method-asynchronously bus service path interface method handler &optional :timeout timeout &rest args
1276 This function calls @var{method} on the D-Bus @var{bus}
1277 asynchronously. @var{bus} is either the symbol @code{:system} or the
1278 symbol @code{:session}.
1280 @var{service} is the D-Bus service name to be used. @var{path} is the
1281 D-Bus object path, @var{service} is registered at. @var{interface} is
1282 an interface offered by @var{service}. It must provide @var{method}.
1284 @var{handler} is a Lisp function, which is called when the
1285 corresponding return message has arrived. If @var{handler} is
1286 @code{nil}, no return message will be expected.
1288 If the parameter @code{:timeout} is given, the following integer
1289 @var{timeout} specifies the maximum number of milliseconds a reply
1290 message must arrive. The default value is 25,000. If there is no
1291 reply message in time, a D-Bus error is raised (@pxref{Errors and
1294 All other arguments args are passed to @var{method} as arguments.
1295 They are converted into D-Bus types as described in @ref{Type
1298 If @var{handler} is a Lisp function, the function returns a key into
1299 the hash table @code{dbus-registered-objects-table}. The
1300 corresponding entry in the hash table is removed, when the return
1301 message has been arrived, and @var{handler} is called. Example:
1304 (dbus-call-method-asynchronously
1305 :system "org.freedesktop.Hal"
1306 "/org/freedesktop/Hal/devices/computer"
1307 "org.freedesktop.Hal.Device" "GetPropertyString" 'message
1308 "system.kernel.machine")
1310 @result{} (:serial :system 2)
1317 @node Receiving Method Calls
1318 @chapter Offering own methods.
1319 @cindex method calls, returning
1320 @cindex returning method calls
1322 In order to register methods on the D-Bus, Emacs has to request a well
1323 known name on the D-Bus under which it will be available for other
1324 clients. Names on the D-Bus can be registered and unregistered using
1325 the following functions:
1327 @defun dbus-register-service bus service &rest flags
1328 Register the known name @var{service} on D-Bus @var{bus}.
1330 @var{bus} is either the symbol @code{:system} or the symbol
1333 @var{service} is the service name to be registered on the D-Bus. It
1334 must be a known name.
1336 @var{flags} is a subset of the following keywords:
1339 @item @code{:allow-replacement}: Allow another service to become the primary
1342 @item @code{:replace-existing}: Request to replace the current primary owner.
1344 @item @code{:do-not-queue}: If we can not become the primary owner do not
1345 place us in the queue.
1348 One of the following keywords is returned:
1352 @item @code{:primary-owner}: We have become the primary owner of the name
1355 @item @code{:in-queue}: We could not become the primary owner and
1356 have been placed in the queue.
1358 @item @code{:exists}: We already are in the queue.
1360 @item @code{:already-owner}: We already are the primary
1365 @defun dbus-unregister-service bus service
1366 Unregister all objects from D-Bus @var{bus}, registered by Emacs for
1369 @var{bus} is either the symbol @code{:system} or the symbol
1372 @var{service} is the D-Bus service name of the D-Bus. It must be a
1373 known name. Emacs releases its association to @var{service} from
1376 One of the following keywords is returned:
1379 @item @code{:released}: We successfully released the name @var{service}.
1380 @item @code{:non-existent}: The name @var{service} does not exist on the bus.
1381 @item @code{:not-owner}: We are not an owner of the name @var{service}.
1385 When a name has been chosen, Emacs can offer own methods, which can be
1386 called by other applications. These methods could be an
1387 implementation of an interface of a well known service, like
1388 @samp{org.freedesktop.TextEditor}.
1390 It could be also an implementation of an own interface. In this case,
1391 the service name must be @samp{org.gnu.Emacs}. The object path shall
1392 begin with @samp{/org/gnu/Emacs/@strong{Application}}, and the
1393 interface name shall be @code{org.gnu.Emacs.@strong{Application}}.
1394 @samp{@strong{Application}} is the name of the application which
1395 provides the interface.
1397 @deffn Constant dbus-service-emacs
1398 The well known service name @samp{org.gnu.Emacs} of Emacs.
1401 @deffn Constant dbus-path-emacs
1402 The object path namespace @samp{/org/gnu/Emacs} used by Emacs.
1405 @deffn Constant dbus-interface-emacs
1406 The interface namespace @code{org.gnu.Emacs} used by Emacs.
1409 @defun dbus-register-method bus service path interface method handler dont-register-service
1410 With this function, an application registers @var{method} on the D-Bus
1413 @var{bus} is either the symbol @code{:system} or the symbol
1416 @var{service} is the D-Bus service name of the D-Bus object
1417 @var{method} is registered for. It must be a known name (See
1418 discussion of @var{dont-register-service} below).
1420 @var{path} is the D-Bus object path @var{service} is registered (See
1421 discussion of @var{dont-register-service} below).
1423 @var{interface} is the interface offered by @var{service}. It must
1424 provide @var{method}.
1426 @var{handler} is a Lisp function to be called when a @var{method} call
1427 is received. It must accept as arguments the input arguments of
1428 @var{method}. @var{handler} should return a list, whose elements are
1429 to be used as arguments for the reply message of @var{method}. This
1430 list can be composed like the input parameters in @ref{Type
1433 If @var{handler} wants to return just one Lisp object and it is not a
1434 cons cell, @var{handler} can return this object directly, instead of
1435 returning a list containing the object.
1437 In case @var{handler} shall return a reply message with an empty
1438 argument list, @var{handler} must return the symbol @code{:ignore}.
1440 When @var{dont-register-service} is non-@code{nil}, the known name
1441 @var{service} is not registered. This means that other D-Bus clients
1442 have no way of noticing the newly registered method. When interfaces
1443 are constructed incrementally by adding single methods or properties
1444 at a time, @var{dont-register-service} can be used to prevent other
1445 clients from discovering the still incomplete interface.
1447 The default D-Bus timeout when waiting for a message reply is 25
1448 seconds. This value could be even smaller, depending on the calling
1449 client. Therefore, @var{handler} shall not last longer than
1450 absolutely necessary.
1452 @code{dbus-register-method} returns a Lisp object, which can be used
1453 as argument in @code{dbus-unregister-object} for removing the
1454 registration for @var{method}. Example:
1457 (defun my-dbus-method-handler (filename)
1459 (if (find-file filename)
1460 (setq result '(:boolean t))
1461 (setq result '(:boolean nil)))
1464 @result{} my-dbus-method-handler
1466 (dbus-register-method
1467 :session "org.freedesktop.TextEditor" "/org/freedesktop/TextEditor"
1468 "org.freedesktop.TextEditor" "OpenFile"
1469 'my-dbus-method-handler)
1471 @result{} ((:method :session "org.freedesktop.TextEditor" "OpenFile")
1472 ("org.freedesktop.TextEditor" "/org/freedesktop/TextEditor"
1473 my-dbus-method-handler))
1476 If you invoke the method @samp{org.freedesktop.TextEditor.OpenFile}
1477 from another D-Bus application with a filename as parameter, the file
1478 is opened in Emacs, and the method returns either @var{true} or
1479 @var{false}, indicating the success of the method. As test tool one
1480 could use the command line tool @code{dbus-send} in a shell:
1483 # dbus-send --session --print-reply \
1484 --dest="org.freedesktop.TextEditor" \
1485 "/org/freedesktop/TextEditor" \
1486 "org.freedesktop.TextEditor.OpenFile" string:"/etc/hosts"
1488 @print{} method return sender=:1.22 -> dest=:1.23 reply_serial=2
1492 You can indicate an error by raising the Emacs signal
1493 @code{dbus-error}. The handler above could be changed like this:
1496 (defun my-dbus-method-handler (&rest args)
1497 (unless (and (= (length args) 1) (stringp (car args)))
1498 (signal 'dbus-error (list (format "Wrong argument list: %S" args))))
1500 (find-file (car args))
1501 (error (signal 'dbus-error (cdr err))))
1504 @result{} my-dbus-method-handler
1510 # dbus-send --session --print-reply \
1511 --dest="org.freedesktop.TextEditor" \
1512 "/org/freedesktop/TextEditor" \
1513 "org.freedesktop.TextEditor.OpenFile" \
1514 string:"/etc/hosts" string:"/etc/passwd"
1516 @print{} Error org.freedesktop.DBus.Error.Failed:
1517 Wrong argument list: ("/etc/hosts" "/etc/passwd")
1521 @defun dbus-register-property bus service path interface property access value &optional emits-signal dont-register-service
1522 With this function, an application declares a @var{property} on the D-Bus
1525 @var{bus} is either the symbol @code{:system} or the symbol
1528 @var{service} is the D-Bus service name of the D-Bus. It must be a
1531 @var{path} is the D-Bus object path @var{service} is registered (See
1532 discussion of @var{dont-register-service} below).
1534 @var{interface} is the name of the interface used at @var{path},
1535 @var{property} is the name of the property of @var{interface}.
1537 @var{access} indicates, whether the property can be changed by other
1538 services via D-Bus. It must be either the symbol @code{:read} or
1539 @code{:readwrite}. @var{value} is the initial value of the property,
1540 it can be of any valid type (see @code{dbus-call-method} for details).
1542 If @var{property} already exists on @var{path}, it will be
1543 overwritten. For properties with access type @code{:read} this is the
1544 only way to change their values. Properties with access type
1545 @code{:readwrite} can be changed by @code{dbus-set-property}.
1547 The interface @samp{org.freedesktop.DBus.Properties} is added to
1548 @var{path}, including a default handler for the @samp{Get},
1549 @samp{GetAll} and @samp{Set} methods of this interface. When
1550 @var{emits-signal} is non-@code{nil}, the signal
1551 @samp{PropertiesChanged} is sent when the property is changed by
1552 @code{dbus-set-property}.
1554 When @var{dont-register-service} is non-@code{nil}, the known name
1555 @var{service} is not registered. This means that other D-Bus clients
1556 have no way of noticing the newly registered method. When interfaces
1557 are constructed incrementally by adding single methods or properties
1558 at a time, @var{dont-register-service} can be used to prevent other
1559 clients from discovering the still incomplete interface.
1564 (dbus-register-property
1565 :session "org.freedesktop.TextEditor" "/org/freedesktop/TextEditor"
1566 "org.freedesktop.TextEditor" "name" :read "GNU Emacs")
1568 @result{} ((:property :session "org.freedesktop.TextEditor" "name")
1569 ("org.freedesktop.TextEditor" "/org/freedesktop/TextEditor"))
1571 (dbus-register-property
1572 :session "org.freedesktop.TextEditor" "/org/freedesktop/TextEditor"
1573 "org.freedesktop.TextEditor" "version" :readwrite emacs-version t)
1575 @result{} ((:property :session "org.freedesktop.TextEditor" "version")
1576 ("org.freedesktop.TextEditor" "/org/freedesktop/TextEditor"))
1579 Other D-Bus applications can read the property via the default methods
1580 @samp{org.freedesktop.DBus.Properties.Get} and
1581 @samp{org.freedesktop.DBus.Properties.GetAll}. Testing is also
1582 possible via the command line tool @code{dbus-send} in a shell:
1585 # dbus-send --session --print-reply \
1586 --dest="org.freedesktop.TextEditor" \
1587 "/org/freedesktop/TextEditor" \
1588 "org.freedesktop.DBus.Properties.GetAll" \
1589 string:"org.freedesktop.TextEditor"
1591 @print{} method return sender=:1.22 -> dest=:1.23 reply_serial=3
1595 variant string "GNU Emacs"
1599 variant string "23.1.50.5"
1604 It is also possible, to apply the @code{dbus-get-property},
1605 @code{dbus-get-all-properties} and @code{dbus-set-property} functions
1606 (@pxref{Properties and Annotations}).
1610 :session "org.freedesktop.TextEditor" "/org/freedesktop/TextEditor"
1611 "org.freedesktop.TextEditor" "version" "23.1.50")
1616 :session "org.freedesktop.TextEditor" "/org/freedesktop/TextEditor"
1617 "org.freedesktop.TextEditor" "version")
1623 @defun dbus-unregister-object object
1624 Unregister @var{object} from the D-Bus. @var{object} must be the
1625 result of a preceding @code{dbus-register-method},
1626 @code{dbus-register-property} or @code{dbus-register-signal} call
1627 (@pxref{Signals}). It returns @code{t} if @var{object} has been
1628 unregistered, @code{nil} otherwise.
1630 When @var{object} identifies the last method or property, which is
1631 registered for the respective service, Emacs releases its association
1632 to the service from D-Bus.
1637 @chapter Sending and receiving signals.
1640 Signals are one way messages. They carry input parameters, which are
1641 received by all objects which have registered for such a signal.
1643 @defun dbus-send-signal bus service path interface signal &rest args
1644 This function is similar to @code{dbus-call-method}. The difference
1645 is, that there are no returning output parameters.
1647 The function emits @var{signal} on the D-Bus @var{bus}. @var{bus} is
1648 either the symbol @code{:system} or the symbol @code{:session}. It
1649 doesn't matter whether another object has registered for @var{signal}.
1651 Signals can be unicast or broadcast messages. For broadcast messages,
1652 @var{service} must be @code{nil}. Otherwise, @var{service} is the
1653 D-Bus service name the signal is sent to as unicast
1654 message.@footnote{For backward compatibility, a broadcast message is
1655 also emitted if @var{service} is the known or unique name Emacs is
1656 registered at D-Bus @var{bus}.} @var{path} is the D-Bus object path
1657 @var{signal} is sent from. @var{interface} is an interface available
1658 at @var{path}. It must provide @var{signal}.
1660 All other arguments args are passed to @var{signal} as arguments.
1661 They are converted into D-Bus types as described in @ref{Type
1662 Conversion}. Example:
1666 :session nil dbus-path-emacs
1667 (concat dbus-interface-emacs ".FileManager") "FileModified"
1668 "/home/albinus/.emacs")
1672 @defun dbus-register-signal bus service path interface signal handler &rest args
1673 With this function, an application registers for a signal on the D-Bus
1676 @var{bus} is either the symbol @code{:system} or the symbol
1679 @var{service} is the D-Bus service name used by the sending D-Bus
1680 object. It can be either a known name or the unique name of the D-Bus
1681 object sending the signal. A known name will be mapped onto the
1682 unique name of the object, owning @var{service} at registration time.
1683 When the corresponding D-Bus object disappears, signals won't be
1684 received any longer.
1686 @var{path} is the corresponding D-Bus object path, @var{service} is
1687 registered at. @var{interface} is an interface offered by
1688 @var{service}. It must provide @var{signal}.
1690 @var{service}, @var{path}, @var{interface} and @var{signal} can be
1691 @code{nil}. This is interpreted as a wildcard for the respective
1694 @var{handler} is a Lisp function to be called when the @var{signal} is
1695 received. It must accept as arguments the output parameters
1696 @var{signal} is sending.
1698 The remaining arguments @var{args} can be keywords or keyword string
1699 pairs.@footnote{For backward compatibility, the arguments @var{args}
1700 can also be just strings. They stand for the respective arguments of
1701 @var{signal} in their order, and are used for filtering as well. A
1702 @code{nil} argument might be used to preserve the order.} The meaning
1706 @item @code{:argN} @var{string}:@*
1707 @code{:pathN} @var{string}:@*
1708 This stands for the Nth argument of the signal. @code{:pathN}
1709 arguments can be used for object path wildcard matches as specified by
1710 D-Bus, while an @code{:argN} argument requires an exact match.
1712 @item @code{:arg-namespace} @var{string}:@*
1713 Register for the signals, which first argument defines the service or
1714 interface namespace @var{string}.
1716 @item @code{:path-namespace} @var{string}:@*
1717 Register for the object path namespace @var{string}. All signals sent
1718 from an object path, which has @var{string} as the preceding string,
1719 are matched. This requires @var{path} to be @code{nil}.
1721 @item @code{:eavesdrop}:@*
1722 Register for unicast signals which are not directed to the D-Bus
1723 object Emacs is registered at D-Bus BUS, if the security policy of BUS
1724 allows this. Otherwise, this argument is ignored.
1727 @code{dbus-register-signal} returns a Lisp object, which can be used
1728 as argument in @code{dbus-unregister-object} for removing the
1729 registration for @var{signal}. Example:
1732 (defun my-dbus-signal-handler (device)
1733 (message "Device %s added" device))
1735 @result{} my-dbus-signal-handler
1737 (dbus-register-signal
1738 :system "org.freedesktop.Hal" "/org/freedesktop/Hal/Manager"
1739 "org.freedesktop.Hal.Manager" "DeviceAdded"
1740 'my-dbus-signal-handler)
1742 @result{} ((:signal :system "org.freedesktop.Hal.Manager" "DeviceAdded")
1743 ("org.freedesktop.Hal" "/org/freedesktop/Hal/Manager"
1747 As we know from the introspection data of interface
1748 @samp{org.freedesktop.Hal.Manager}, the signal @samp{DeviceAdded}
1749 provides one single parameter, which is mapped into a Lisp string.
1750 The callback function @code{my-dbus-signal-handler} must define one
1751 single string argument therefore. Plugging an USB device to your
1752 machine, when registered for signal @samp{DeviceAdded}, will show you
1753 which objects the GNU/Linux @code{hal} daemon adds.
1755 Some of the match rules have been added to a later version of D-Bus.
1756 In order to test the availability of such features, you could register
1757 for a dummy signal, and check the result:
1761 (dbus-register-signal
1762 :system nil nil nil nil 'ignore :path-namespace "/invalid/path"))
1769 @node Alternative Buses
1770 @chapter Alternative buses and environments.
1772 @cindex UNIX domain socket
1773 @cindex TCP/IP socket
1775 Until now, we have spoken about the system and the session buses,
1776 which are the default buses to be connected to. However, it is
1777 possible to connect to any bus, from which the address is known. This
1778 is a UNIX domain or TCP/IP socket. Everywhere, where a @var{bus} is
1779 mentioned as argument of a function (the symbol @code{:system} or the
1780 symbol @code{:session}), this address can be used instead. The
1781 connection to this bus must be initialized first.
1783 @defun dbus-init-bus bus &optional private
1784 Establish the connection to D-Bus @var{bus}.
1786 @var{bus} can be either the symbol @code{:system} or the symbol
1787 @code{:session}, or it can be a string denoting the address of the
1788 corresponding bus. For the system and session buses, this function
1789 is called when loading @file{dbus.el}, there is no need to call it
1792 The function returns a number, which counts the connections this Emacs
1793 session has established to the @var{bus} under the same unique name
1794 (see @code{dbus-get-unique-name}). It depends on the libraries Emacs
1795 is linked with, and on the environment Emacs is running. For example,
1796 if Emacs is linked with the gtk toolkit, and it runs in a GTK-aware
1797 environment like Gnome, another connection might already be
1800 When @var{private} is non-@code{nil}, a new connection is established
1801 instead of reusing an existing one. It results in a new unique name
1802 at the bus. This can be used, if it is necessary to distinguish from
1803 another connection used in the same Emacs process, like the one
1804 established by GTK+. It should be used with care for at least the
1805 @code{:system} and @code{:session} buses, because other Emacs Lisp
1806 packages might already use this connection to those buses.
1808 Example: You initialize a connection to the AT-SPI bus on your host:
1813 :session "org.a11y.Bus" "/org/a11y/bus"
1814 "org.a11y.Bus" "GetAddress"))
1816 @result{} "unix:abstract=/tmp/dbus-2yzWHOCdSD,guid=a490dd26625870ca1298b6e10000fd7f"
1818 ;; If Emacs is built with gtk support, and you run in a GTK enabled
1819 ;; environment (like a GNOME session), the initialization reuses the
1820 ;; connection established by GTK's atk bindings.
1821 (dbus-init-bus my-bus)
1825 (dbus-get-unique-name my-bus)
1829 ;; Open a new connection to the same bus. This obsoletes the
1831 (dbus-init-bus my-bus 'private)
1835 (dbus-get-unique-name my-bus)
1840 D-Bus addresses can specify different transport. A possible address
1841 could be based on TCP/IP sockets, see next example. However, it
1842 depends on the bus daemon configuration, which transport is supported.
1845 @defun dbus-setenv bus variable value
1846 Set the value of the @var{bus} environment variable @var{variable} to
1849 @var{bus} is either a Lisp symbol, @code{:system} or @code{:session},
1850 or a string denoting the bus address. Both @var{variable} and
1851 @var{value} should be strings.
1853 Normally, services inherit the environment of the bus daemon. This
1854 function adds to or modifies that environment when activating services.
1856 Some bus instances, such as @code{:system}, may disable setting the
1857 environment. In such cases, or if this feature is not available in
1858 older D-Bus versions, a @code{dbus-error} error is raised.
1860 As an example, it might be desirable to start X11 enabled services on
1861 a remote host's bus on the same X11 server the local Emacs is
1862 running. This could be achieved by
1865 (setq my-bus "unix:host=example.gnu.org,port=4711")
1867 @result{} "unix:host=example.gnu.org,port=4711"
1869 (dbus-init-bus my-bus)
1873 (dbus-setenv my-bus "DISPLAY" (getenv "DISPLAY"))
1880 @node Errors and Events
1881 @chapter Errors and events.
1886 The internal actions can be traced by running in a debug mode.
1889 If this variable is non-@code{nil}, D-Bus specific debug messages are raised.
1892 Input parameters of @code{dbus-call-method},
1893 @code{dbus-call-method-asynchronously}, @code{dbus-send-signal},
1894 @code{dbus-register-method}, @code{dbus-register-property} and
1895 @code{dbus-register-signal} are checked for correct D-Bus types. If
1896 there is a type mismatch, the Lisp error @code{wrong-type-argument}
1897 @code{D-Bus ARG} is raised.
1899 All errors raised by D-Bus are signaled with the error symbol
1900 @code{dbus-error}. If possible, error messages from D-Bus are
1901 appended to the @code{dbus-error}.
1903 @defspec dbus-ignore-errors forms@dots{}
1904 This executes @var{forms} exactly like a @code{progn}, except that
1905 @code{dbus-error} errors are ignored during the @var{forms}. These
1906 errors can be made visible when @code{dbus-debug} is set to @code{t}.
1909 Incoming D-Bus messages are handled as Emacs events, see @pxref{Misc
1910 Events, , , elisp}. They are retrieved only, when Emacs runs in
1911 interactive mode. The generated event has this form:
1914 (dbus-event @var{bus} @var{type} @var{serial} @var{service} @var{path} @var{interface} @var{member} @var{handler}
1918 @var{bus} identifies the D-Bus the message is coming from. It is
1919 either the symbol @code{:system} or the symbol @code{:session}.
1921 @var{type} is the D-Bus message type which has caused the event. It
1922 can be @code{dbus-message-type-invalid},
1923 @code{dbus-message-type-method-call},
1924 @code{dbus-message-type-method-return},
1925 @code{dbus-message-type-error}, or @code{dbus-message-type-signal}.
1926 @var{serial} is the serial number of the received D-Bus message.
1928 @var{service} and @var{path} are the unique name and the object path
1929 of the D-Bus object emitting the message. @var{interface} and
1930 @var{member} denote the message which has been sent.
1932 @var{handler} is the callback function which has been registered for
1933 this message (see @pxref{Signals}). When a @code{dbus-event} event
1934 arrives, @var{handler} is called with @var{args} as arguments.
1936 In order to inspect the @code{dbus-event} data, you could extend the
1937 definition of the callback function in @ref{Signals}:
1940 (defun my-dbus-signal-handler (&rest args)
1941 (message "my-dbus-signal-handler: %S" last-input-event))
1944 There exist convenience functions which could be called inside a
1945 callback function in order to retrieve the information from the event.
1947 @defun dbus-event-bus-name event
1948 Returns the bus name @var{event} is coming from.
1949 The result is either the symbol @code{:system} or the symbol @code{:session}.
1952 @defun dbus-event-message-type event
1953 Returns the message type of the corresponding D-Bus message. The
1954 result is a natural number.
1957 @defun dbus-event-serial-number event
1958 Returns the serial number of the corresponding D-Bus message.
1959 The result is a natural number.
1962 @defun dbus-event-service-name event
1963 Returns the unique name of the D-Bus object @var{event} is coming from.
1966 @defun dbus-event-path-name event
1967 Returns the object path of the D-Bus object @var{event} is coming from.
1970 @defun dbus-event-interface-name event
1971 Returns the interface name of the D-Bus object @var{event} is coming from.
1974 @defun dbus-event-member-name event
1975 Returns the member name of the D-Bus object @var{event} is coming
1976 from. It is either a signal name or a method name.
1979 D-Bus errors are not propagated during event handling, because it is
1980 usually not desired. D-Bus errors in events can be made visible by
1981 setting the variable @code{dbus-debug} to @code{t}. They can also be
1982 handled by a hook function.
1984 @defvar dbus-event-error-functions
1985 This hook variable keeps a list of functions, which are called when a
1986 D-Bus error happens in the event handler. Every function must accept
1987 two arguments, the event and the error variable caught in
1988 @code{condition-case} by @code{dbus-error}.
1990 Such functions can be used the adapt the error signal to be raised.
1994 (defun my-dbus-event-error-handler (event error)
1995 (when (string-equal (concat dbus-interface-emacs ".FileManager")
1996 (dbus-event-interface-name event))
1997 (message "my-dbus-event-error-handler: %S %S" event error)
1998 (signal 'file-error (cdr error))))
2000 (add-hook 'dbus-event-error-functions 'my-dbus-event-error-handler)
2004 Hook functions shall take into account, that there might be other
2005 D-Bus applications running. Therefore, they shall check carefully,
2006 whether a given D-Bus error is related to them.
2015 @node GNU Free Documentation License
2016 @appendix GNU Free Documentation License
2017 @include doclicense.texi