* process.h (PSET): Remove.
[emacs.git] / doc / misc / dbus.texi
blob865e99a3aa60a2c9aa5320c4df3f7531be3f3c80
1 \input texinfo   @c -*-texinfo-*-
2 @setfilename ../../info/dbus
3 @c %**start of header
4 @settitle Using of D-Bus
5 @c @setchapternewpage odd
6 @c %**end of header
8 @syncodeindex vr cp
9 @syncodeindex fn cp
11 @copying
12 Copyright @copyright{} 2007-2012 Free Software Foundation, Inc.
14 @quotation
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.''
25 @end quotation
26 @end copying
28 @dircategory Emacs lisp libraries
29 @direntry
30 * D-Bus: (dbus).                Using D-Bus in Emacs.
31 @end direntry
33 @contents
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/}.
44 @ifnottex
45 @insertcopying
46 @end ifnottex
48 @menu
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.
61 @end menu
64 @node Overview
65 @chapter An overview of D-Bus
66 @cindex overview
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
78 user's session.
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}.
114 @node Inspection
115 @chapter Inspection of D-Bus services.
116 @cindex inspection
118 @menu
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.
126 @end menu
129 @node Version
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}.
139 @end defvar
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.
145 @end defvar
148 @node Bus names
149 @section Bus names.
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:
167 @lisp
168 ;; Check, whether the document viewer can be accessed via D-Bus.
169 (member "org.gnome.evince.Daemon"
170         (dbus-list-activatable-names :session))
171 @end lisp
172 @end defun
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
182 @code{:session}.
183 @end defun
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
189 known names at all.
191 @var{bus} must be either the symbol @code{:system} or the symbol
192 @code{:session}.
193 @end defun
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
203 string.
204 @end defun
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
210 @var{service}.
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
214 string.
215 @end defun
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:
227 @lisp
228 (message
229    "%s screensaver on board."
230    (cond
231      ((dbus-ping :session "org.gnome.ScreenSaver" 100) "Gnome")
232      ((dbus-ping :session "org.freedesktop.ScreenSaver" 100) "KDE")
233      (t "No")))
234 @end lisp
236 If it shall be checked whether @var{service} is already running
237 without autostarting it, one shall apply
239 @lisp
240 (member service (dbus-list-known-names bus))
241 @end lisp
242 @end defun
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
249 @code{:session}.
250 @end defun
253 @node Introspection
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
258 implementation.
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
268 @code{node} element.
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:
274 @example
275 <node name="/org/bluez">
276   <interface name="org.freedesktop.DBus.Introspectable">
277     @dots{}
278   </interface>
279   <interface name="org.bluez.Manager">
280     @dots{}
281   </interface>
282   <interface name="org.bluez.Database">
283     @dots{}
284   </interface>
285   <interface name="org.bluez.Security">
286     @dots{}
287   </interface>
288   <node name="service_audio"/>
289   <node name="service_input"/>
290   <node name="service_network"/>
291   <node name="service_serial"/>
292 </node>
293 @end example
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:
301 @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"/>
314 </method>
315 @end example
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
326 @samp{in}.
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.
331 Example:
333 @example
334 <signal name="StateChanged">
335   <arg name="state" type="i"/>
336   <arg name="error" type="s"/>
337 </signal>
338 @end example
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}.
344 Example:
346 @example
347 <property name="Status" type="u" direction="read"/>
348 @end example
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:
356 @example
357 <annotation name="de.berlios.Pinot.GetStatistics" value="pinotDBus"/>
358 @end example
360 Annotations have just @code{name} and @code{value} attributes, both
361 must be strings.
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
371 format.  Example:
373 @lisp
374 (dbus-introspect
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">
381     <node>
382       <interface name="org.freedesktop.Hal.Device">
383         <method name="GetAllProperties">
384           <arg name="properties" direction="out" type="a@{sv@}"/>
385         </method>
386         @dots{}
387         <signal name="PropertyModified">
388           <arg name="num_updates" type="i"/>
389           <arg name="updates" type="a(sbb)"/>
390         </signal>
391       </interface>
392       @dots{}
393     </node>"
394 @end lisp
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}.}
409 @end defun
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:
416 @lisp
417 (dbus-introspect-xml
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")))
428        )
429        @dots{}
430        (signal ((name . "HitsAdded"))
431          (arg ((name . "search") (type . "s")))
432          (arg ((name . "count") (type . "u")))
433        )
434      )
435      @dots{}
436    )
437 @end lisp
438 @end defun
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.
445 Example:
447 @lisp
448 (dbus-introspect-get-attribute
449   (dbus-introspect-xml :system "org.freedesktop.SystemToolsBackends"
450     "/org/freedesktop/SystemToolsBackends/UsersConfig")
451   "name")
453 @result{} "/org/freedesktop/SystemToolsBackends/UsersConfig"
454 @end lisp
456 If @var{object} has no @var{attribute}, the function returns
457 @code{nil}.
458 @end defun
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:
471 @lisp
472 (dbus-introspect-get-node-names
473   :session "org.gnome.seahorse" "/org/gnome/seahorse")
475 @result{} ("crypto" "keys")
476 @end lisp
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}.
482 @end defun
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}.
488 Example:
490 @lisp
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")
500 @end lisp
501 @end defun
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}
510 children.  Example:
512 @lisp
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")
521 @end lisp
522 @end defun
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:
530 @lisp
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")))
542      )
543      @dots{}
544      (signal ((name . "HitsAdded"))
545        (arg ((name . "search") (type . "s")))
546        (arg ((name . "count") (type . "u")))
547      )
548    )
549 @end lisp
550 @end defun
552 @noindent
553 With these functions, it is possible to retrieve all introspection
554 data from a running system:
556 @lisp
557 (with-current-buffer (switch-to-buffer "*introspect*")
558   (erase-buffer)
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".
563       (when (delete
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))
568         (redisplay t)))))
569 @end lisp
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:
582 @lisp
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")
591 @end lisp
592 @end defun
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:
600 @lisp
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")))
611    )
612 @end lisp
613 @end defun
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:
619 @lisp
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")
627 @end lisp
628 @end defun
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:
636 @lisp
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")))
645    )
646 @end lisp
647 @end defun
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
657 element.
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:
673 @lisp
674 (dbus-introspect-get-property-names
675   :session "org.kde.kded" "/modules/networkstatus"
676   "org.kde.Solid.Networking.Client")
678 @result{} ("Status")
679 @end lisp
681 If an interface declares properties, the corresponding element supports
682 also the @samp{org.freedesktop.DBus.Properties} interface.
683 @end defun
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:
694 @lisp
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")
705   "access")
707 @result{} "read"
708 @end lisp
709 @end defun
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:
717 @lisp
718 (dbus-get-property
719   :session "org.kde.kded" "/modules/networkstatus"
720   "org.kde.Solid.Networking.Client" "Status")
722 @result{} 4
723 @end lisp
724 @end defun
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:
732 @lisp
733 (dbus-set-property
734   :session "org.kde.kaccess" "/MainApplication"
735   "com.trolltech.Qt.QApplication" "doubleClickInterval" 500)
737 @result{} 500
738 @end lisp
739 @end defun
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:
747 @lisp
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)
756     ("styleSheet" . ""))
757 @end lisp
758 @end defun
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:
769 @lisp
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"))
789     @dots{})
790 @end lisp
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:
800 @lisp
801 (with-current-buffer (switch-to-buffer "*objectmanager*")
802   (erase-buffer)
803   (let (result)
804     (dolist (service (dbus-list-known-names :session) result)
805       (message "%s" service)
806       (add-to-list
807        'result
808        (cons service
809              (dbus-get-all-managed-objects :session service "/"))))
810     (insert (message "%s" (pp result)))
811     (redisplay t)))
812 @end lisp
813 @end defun
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
820 belong to.  Example:
822 @lisp
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")
828 @end lisp
830 Default annotation names@footnote{See
831 @uref{http://dbus.freedesktop.org/doc/dbus-specification.html#introspection-format}}
834 @table @samp
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}
843 @end table
844 @end defun
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:
855 @lisp
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")
869   "value")
871 @result{} "pinotDBus"
872 @end lisp
873 @end defun
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:
886 @lisp
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")
893 @end lisp
895 Argument names are optional; the function can return @code{nil}
896 therefore, even if the method or signal has arguments.
897 @end defun
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:
903 @lisp
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")))
910 @end lisp
911 @end defun
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}
919 is assumed.
921 If @var{name} is a @code{signal}, and @var{direction} is
922 non-@code{nil}, @var{direction} must be @samp{out}.  Example:
924 @lisp
925 (dbus-introspect-get-signature
926   :session "org.freedesktop.xesam.searcher"
927   "/org/freedesktop/xesam/searcher/main"
928   "org.freedesktop.xesam.Search" "GetHitData" "in")
930 @result{} "sauas"
932 (dbus-introspect-get-signature
933   :session "org.freedesktop.xesam.searcher"
934   "/org/freedesktop/xesam/searcher/main"
935   "org.freedesktop.xesam.Search" "HitsAdded")
937 @result{} "su"
938 @end lisp
939 @end defun
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:
962 @example
963 @multitable {negative integer} {@expansion{}} {DBUS_TYPE_BOOLEAN}
964 @item Lisp type               @tab              @tab D-Bus type
965 @item
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
972 @end multitable
973 @end example
975 Other Lisp objects, like symbols or hash tables, are not accepted as
976 input parameters.
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
984 @code{:unix-fd}.
986 @noindent
987 Example:
989 @lisp
990 (dbus-call-method @dots{} @var{NAT-NUMBER} @var{STRING})
991 @end lisp
993 is equivalent to
995 @lisp
996 (dbus-call-method @dots{} :uint32 @var{NAT-NUMBER} :string @var{STRING})
997 @end lisp
999 but different to
1001 @lisp
1002 (dbus-call-method @dots{} :int32 @var{NAT-NUMBER} :signature @var{STRING})
1003 @end lisp
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.
1024 @itemize
1025 @item An array must contain only elements of the same D-Bus type.  It
1026 can be empty.
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
1032 key.
1034 @item There is no restriction for structs.
1035 @end itemize
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:
1042 @lisp
1043 (dbus-call-method
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.
1049   ""                          ;; No icon.
1050   "Notification summary"      ;; Summary.
1051   (format                     ;; Body.
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.
1058 @result{} 3
1059 @end lisp
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:
1066 @lisp
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)
1071 @end lisp
1072 @end defun
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
1078 D-Bus.
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
1083 "_".  Example:
1085 @lisp
1086 (dbus-escape-as-identifier "0123abc_xyz\x01\xff")
1088 @result{} "_30123abc_5fxyz_01_ff"
1089 @end lisp
1090 @end defun
1093 @section Output parameters.
1095 Output parameters of D-Bus methods and signals are mapped to Lisp
1096 objects.
1098 @example
1099 @multitable {DBUS_TYPE_OBJECT_PATH} {@expansion{}} {natural number or float}
1100 @item D-Bus type            @tab              @tab Lisp type
1101 @item
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
1119 @end multitable
1120 @end example
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
1129 same rules.
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}):
1135 @lisp
1136 (@var{INTEGER} ((@var{STRING} @var{BOOL} @var{BOOL}) (@var{STRING} @var{BOOL} @var{BOOL}) @dots{}))
1137 @end lisp
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:
1144 @lisp
1145 (dbus-byte-array-to-string '(47 101 116 99 47 104 111 115 116 115))
1147 @result{} "/etc/hosts"
1148 @end lisp
1149 @end defun
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:
1156 @lisp
1157 (dbus-unescape-from-identifier "_30123abc_5fxyz_01_ff")
1159 @ifinfo
1160 @result{} "0123abc_xyz^Aÿ"
1161 @end ifinfo
1162 @ifnotinfo
1163 @result{} "0123abc_xyz^A@"y"
1164 @end ifnotinfo
1165 @end lisp
1166 @end defun
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
1194 Events}).
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
1198 Conversion}.
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:
1204 @lisp
1205 (dbus-call-method
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"))
1211 @end lisp
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
1215 object.  Example:
1217 @lisp
1218 (dbus-call-method
1219   :system "org.freedesktop.Hal"
1220   "/org/freedesktop/Hal/devices/computer"
1221   "org.freedesktop.Hal.Device" "GetPropertyString"
1222   "system.kernel.machine")
1224 @result{} "i686"
1225 @end lisp
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:
1236 @lisp
1237 (dolist (device
1238           (dbus-call-method
1239             :system "org.freedesktop.Hal"
1240             "/org/freedesktop/Hal/Manager"
1241             "org.freedesktop.Hal.Manager" "GetAllDevices"))
1242   (message "\nudi = %s" device)
1243   (dolist (properties
1244             (dbus-call-method
1245               :system "org.freedesktop.Hal" device
1246               "org.freedesktop.Hal.Device" "GetAllProperties"))
1247     (message "  %s = %S"
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\"
1265       @dots{}"
1266 @end lisp
1267 @end defun
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
1292 Events}).
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
1296 Conversion}.
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:
1303 @lisp
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)
1312 @print{} i686
1313 @end lisp
1314 @end defun
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
1331 @code{:session}.
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:
1338 @itemize
1339 @item @code{:allow-replacement}: Allow another service to become the primary
1340 owner if requested.
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.
1346 @end itemize
1348 One of the following keywords is returned:
1350 @itemize
1352 @item @code{:primary-owner}: We have become the primary owner of the name
1353 @var{service}.
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
1361 owner.
1362 @end itemize
1363 @end defun
1365 @defun dbus-unregister-service bus service
1366 Unregister all objects from D-Bus @var{bus}, registered by Emacs for
1367 @var{service}.
1369 @var{bus} is either the symbol @code{:system} or the symbol
1370 @code{:session}.
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
1374 D-Bus.
1376 One of the following keywords is returned:
1378 @itemize
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}.
1382 @end itemize
1383 @end defun
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.
1399 @end deffn
1401 @deffn Constant dbus-path-emacs
1402 The object path namespace @samp{/org/gnu/Emacs} used by Emacs.
1403 @end deffn
1405 @deffn Constant dbus-interface-emacs
1406 The interface namespace @code{org.gnu.Emacs} used by Emacs.
1407 @end deffn
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
1411 @var{bus}.
1413 @var{bus} is either the symbol @code{:system} or the symbol
1414 @code{:session}.
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
1431 Conversion}.
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:
1456 @lisp
1457 (defun my-dbus-method-handler (filename)
1458   (let (result)
1459     (if (find-file filename)
1460         (setq result '(:boolean t))
1461       (setq result '(:boolean nil)))
1462     result))
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))
1474 @end lisp
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:
1482 @example
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
1489       boolean true
1490 @end example
1492 You can indicate an error by raising the Emacs signal
1493 @code{dbus-error}.  The handler above could be changed like this:
1495 @lisp
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))))
1499   (condition-case err
1500       (find-file (car args))
1501     (error (signal 'dbus-error (cdr err))))
1502   t)
1504 @result{} my-dbus-method-handler
1505 @end lisp
1507 The test runs then
1509 @example
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")
1518 @end example
1519 @end defun
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
1523 @var{bus}.
1525 @var{bus} is either the symbol @code{:system} or the symbol
1526 @code{:session}.
1528 @var{service} is the D-Bus service name of the D-Bus.  It must be a
1529 known name.
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.
1561 @noindent Example:
1563 @lisp
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"))
1577 @end lisp
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:
1584 @example
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
1592       array [
1593          dict entry(
1594             string "name"
1595             variant             string "GNU Emacs"
1596          )
1597          dict entry(
1598             string "version"
1599             variant             string "23.1.50.5"
1600          )
1601       ]
1602 @end example
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}).
1608 @lisp
1609 (dbus-set-property
1610   :session "org.freedesktop.TextEditor" "/org/freedesktop/TextEditor"
1611   "org.freedesktop.TextEditor" "version" "23.1.50")
1613 @result{} "23.1.50"
1615 (dbus-get-property
1616   :session "org.freedesktop.TextEditor" "/org/freedesktop/TextEditor"
1617   "org.freedesktop.TextEditor" "version")
1619 @result{} "23.1.50"
1620 @end lisp
1621 @end defun
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.
1633 @end defun
1636 @node Signals
1637 @chapter Sending and receiving signals.
1638 @cindex 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:
1664 @lisp
1665 (dbus-send-signal
1666   :session nil dbus-path-emacs
1667   (concat dbus-interface-emacs ".FileManager") "FileModified"
1668   "/home/albinus/.emacs")
1669 @end lisp
1670 @end defun
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
1674 @var{bus}.
1676 @var{bus} is either the symbol @code{:system} or the symbol
1677 @code{:session}.
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
1692 argument.
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
1703 is as follows:
1705 @itemize
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.
1725 @end itemize
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:
1731 @lisp
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"
1744      my-signal-handler))
1745 @end lisp
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:
1759 @lisp
1760 (dbus-ignore-errors
1761   (dbus-register-signal
1762     :system nil nil nil nil 'ignore :path-namespace "/invalid/path"))
1764 @result{} nil
1765 @end lisp
1766 @end defun
1769 @node Alternative Buses
1770 @chapter Alternative buses and environments.
1771 @cindex bus names
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
1790 again.
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
1798 established.
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:
1810 @lisp
1811 (setq my-bus
1812   (dbus-call-method
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)
1823 @result{} 2
1825 (dbus-get-unique-name my-bus)
1827 @result{} ":1.19"
1829 ;; Open a new connection to the same bus.  This obsoletes the
1830 ;; previous one.
1831 (dbus-init-bus my-bus 'private)
1833 @result{} 1
1835 (dbus-get-unique-name my-bus)
1837 @result{} ":1.20"
1838 @end lisp
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.
1843 @end defun
1845 @defun dbus-setenv bus variable value
1846 Set the value of the @var{bus} environment variable @var{variable} to
1847 @var{value}.
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
1864 @lisp
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)
1871 @result{} 1
1873 (dbus-setenv my-bus "DISPLAY" (getenv "DISPLAY"))
1875 @result{} nil
1876 @end lisp
1877 @end defun
1880 @node Errors and Events
1881 @chapter Errors and events.
1882 @cindex debugging
1883 @cindex errors
1884 @cindex events
1886 The internal actions can be traced by running in a debug mode.
1888 @defvar dbus-debug
1889 If this variable is non-@code{nil}, D-Bus specific debug messages are raised.
1890 @end defvar
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}.
1907 @end defspec
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:
1913 @lisp
1914 (dbus-event @var{bus} @var{type} @var{serial} @var{service} @var{path} @var{interface} @var{member} @var{handler}
1915         &rest @var{args})
1916 @end lisp
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}:
1939 @lisp
1940 (defun my-dbus-signal-handler (&rest args)
1941   (message "my-dbus-signal-handler: %S" last-input-event))
1942 @end lisp
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}.
1950 @end defun
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.
1955 @end defun
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.
1960 @end defun
1962 @defun dbus-event-service-name event
1963 Returns the unique name of the D-Bus object @var{event} is coming from.
1964 @end defun
1966 @defun dbus-event-path-name event
1967 Returns the object path of the D-Bus object @var{event} is coming from.
1968 @end defun
1970 @defun dbus-event-interface-name event
1971 Returns the interface name of the D-Bus object @var{event} is coming from.
1972 @end defun
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.
1977 @end defun
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-hooks
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.
1991 Example:
1993 @lisp
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-hooks 'my-dbus-event-error-handler)
2001 @end lisp
2002 @end defvar
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.
2009 @node Index
2010 @unnumbered Index
2012 @printindex cp
2015 @node GNU Free Documentation License
2016 @appendix GNU Free Documentation License
2017 @include doclicense.texi
2019 @bye