merge trunk
[bpt/emacs.git] / doc / misc / dbus.texi
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
7
8 @syncodeindex vr cp
9 @syncodeindex fn cp
10
11 @copying
12 Copyright @copyright{} 2007-2012 Free Software Foundation, Inc.
13
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''.
21
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
27
28 @dircategory Emacs lisp libraries
29 @direntry
30 * D-Bus: (dbus). Using D-Bus in Emacs.
31 @end direntry
32
33 @contents
34
35
36 @node Top, Overview, (dir), (dir)
37 @top D-Bus integration in Emacs
38
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/}.
43
44 @ifnottex
45 @insertcopying
46 @end ifnottex
47
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.
59
60 * GNU Free Documentation License:: The license for this documentation.
61 @end menu
62
63
64 @node Overview
65 @chapter An overview of D-Bus
66 @cindex overview
67
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.
72
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.
79
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}.
84
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.
92
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/}.
97
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.
102
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.
106
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}.
112
113
114 @node Inspection
115 @chapter Inspection of D-Bus services.
116 @cindex inspection
117
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
127
128
129 @node Version
130 @section D-Bus version.
131
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.
135
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
140
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
146
147
148 @node Bus names
149 @section Bus names.
150
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.
154
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.
163
164 The result is a list of strings, which is @code{nil} when there are no
165 activatable service names at all. Example:
166
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
173
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.
180
181 @var{bus} must be either the symbol @code{:system} or the symbol
182 @code{:session}.
183 @end defun
184
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.
190
191 @var{bus} must be either the symbol @code{:system} or the symbol
192 @code{:session}.
193 @end defun
194
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.
200
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
205
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}.
211
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
216
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}.
221
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:
226
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
235
236 If it shall be checked whether @var{service} is already running
237 without autostarting it, one shall apply
238
239 @lisp
240 (member service (dbus-list-known-names bus))
241 @end lisp
242 @end defun
243
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.
247
248 @var{bus} must be either the symbol @code{:system} or the symbol
249 @code{:session}.
250 @end defun
251
252
253 @node Introspection
254 @section Knowing the details of D-Bus services.
255
256 D-Bus services publish their interfaces. This can be retrieved and
257 analyzed during runtime, in order to understand the used
258 implementation.
259
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.
264
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.
269
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:
273
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
294
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:
300
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
316
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}.
327
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:
332
333 @example
334 <signal name="StateChanged">
335 <arg name="state" type="i"/>
336 <arg name="error" type="s"/>
337 </signal>
338 @end example
339
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:
345
346 @example
347 <property name="Status" type="u" direction="read"/>
348 @end example
349
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:
355
356 @example
357 <annotation name="de.berlios.Pinot.GetStatistics" value="pinotDBus"/>
358 @end example
359
360 Annotations have just @code{name} and @code{value} attributes, both
361 must be strings.
362
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}.
366
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:
372
373 @lisp
374 (dbus-introspect
375 :system "org.freedesktop.Hal"
376 "/org/freedesktop/Hal/devices/computer")
377
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
395
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.
403
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
410
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:
415
416 @lisp
417 (dbus-introspect-xml
418 :session "org.freedesktop.xesam.searcher"
419 "/org/freedesktop/xesam/searcher/main")
420
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
439
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:
446
447 @lisp
448 (dbus-introspect-get-attribute
449 (dbus-introspect-xml :system "org.freedesktop.SystemToolsBackends"
450 "/org/freedesktop/SystemToolsBackends/UsersConfig")
451 "name")
452
453 @result{} "/org/freedesktop/SystemToolsBackends/UsersConfig"
454 @end lisp
455
456 If @var{object} has no @var{attribute}, the function returns
457 @code{nil}.
458 @end defun
459
460
461 @node Nodes and Interfaces
462 @section Detecting object paths and interfaces.
463
464 The first elements, to be introspected for a D-Bus object, are further
465 object paths and interfaces.
466
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:
470
471 @lisp
472 (dbus-introspect-get-node-names
473 :session "org.gnome.seahorse" "/org/gnome/seahorse")
474
475 @result{} ("crypto" "keys")
476 @end lisp
477
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
483
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:
489
490 @lisp
491 (dbus-introspect-get-all-nodes :session "org.gnome.seahorse" "/")
492
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
502
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}.
507
508 Another default interface is @samp{org.freedesktop.DBus.Properties}.
509 If present, @code{interface} elements can also have @code{property}
510 children. Example:
511
512 @lisp
513 (dbus-introspect-get-interface-names
514 :system "org.freedesktop.Hal"
515 "/org/freedesktop/Hal/devices/computer")
516
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
523
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:
529
530 @lisp
531 (dbus-introspect-get-interface
532 :session "org.freedesktop.xesam.searcher"
533 "/org/freedesktop/xesam/searcher/main"
534 "org.freedesktop.xesam.Search")
535
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
551
552 @noindent
553 With these functions, it is possible to retrieve all introspection
554 data from a running system:
555
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
570
571
572 @node Methods and Signal
573 @section Applying the functionality.
574
575 Methods and signals are the communication means to D-Bus. The
576 following functions return their specifications.
577
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:
581
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")
587
588 @result{} ("GetState" "StartSearch" "GetHitCount" "GetHits" "NewSession"
589 "CloseSession" "GetHitData" "SetProperty" "NewSearch"
590 "GetProperty" "CloseSearch")
591 @end lisp
592 @end defun
593
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:
599
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")
605
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
614
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:
618
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")
624
625 @result{} ("StateChanged" "SearchDone" "HitsModified"
626 "HitsRemoved" "HitsAdded")
627 @end lisp
628 @end defun
629
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:
635
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")
641
642 @result{} (signal ((name . "HitsAdded"))
643 (arg ((name . "search") (type . "s")))
644 (arg ((name . "count") (type . "u")))
645 )
646 @end lisp
647 @end defun
648
649
650 @node Properties and Annotations
651 @section What else to know about interfaces.
652
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.
658
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.
664
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.
668
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:
672
673 @lisp
674 (dbus-introspect-get-property-names
675 :session "org.kde.kded" "/modules/networkstatus"
676 "org.kde.Solid.Networking.Client")
677
678 @result{} ("Status")
679 @end lisp
680
681 If an interface declares properties, the corresponding element supports
682 also the @samp{org.freedesktop.DBus.Properties} interface.
683 @end defun
684
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}.
690
691 A @var{property} value can be retrieved by the function
692 @code{dbus-introspect-get-attribute}. Example:
693
694 @lisp
695 (dbus-introspect-get-property
696 :session "org.kde.kded" "/modules/networkstatus"
697 "org.kde.Solid.Networking.Client" "Status")
698
699 @result{} (property ((access . "read") (type . "u") (name . "Status")))
700
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")
706
707 @result{} "read"
708 @end lisp
709 @end defun
710
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:
716
717 @lisp
718 (dbus-get-property
719 :session "org.kde.kded" "/modules/networkstatus"
720 "org.kde.Solid.Networking.Client" "Status")
721
722 @result{} 4
723 @end lisp
724 @end defun
725
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:
731
732 @lisp
733 (dbus-set-property
734 :session "org.kde.kaccess" "/MainApplication"
735 "com.trolltech.Qt.QApplication" "doubleClickInterval" 500)
736
737 @result{} 500
738 @end lisp
739 @end defun
740
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:
746
747 @lisp
748 (dbus-get-all-properties
749 :session "org.kde.kaccess" "/MainApplication"
750 "com.trolltech.Qt.QApplication")
751
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
759
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:
768
769 @lisp
770 (dbus-get-all-managed-objects
771 :session "org.gnome.SettingsDaemon" "/")
772
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
791
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.
796
797 An overview of all existing object paths, their interfaces and
798 properties could be retrieved by the following code:
799
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
814
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:
821
822 @lisp
823 (dbus-introspect-get-annotation-names
824 :session "de.berlios.Pinot" "/de/berlios/Pinot"
825 "de.berlios.Pinot" "GetStatistics")
826
827 @result{} ("de.berlios.Pinot.GetStatistics")
828 @end lisp
829
830 Default annotation names@footnote{See
831 @uref{http://dbus.freedesktop.org/doc/dbus-specification.html#introspection-format}}
832 are
833
834 @table @samp
835 @item org.freedesktop.DBus.Deprecated
836 Whether or not the entity is deprecated; defaults to @code{nil}
837
838 @item org.freedesktop.DBus.GLib.CSymbol
839 The C symbol; may be used for @code{methods} and @code{interfaces}
840
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
845
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.
851
852 An attribute value can be retrieved by
853 @code{dbus-introspect-get-attribute}. Example:
854
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")
860
861 @result{} (annotation ((name . "de.berlios.Pinot.GetStatistics")
862 (value . "pinotDBus")))
863
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")
870
871 @result{} "pinotDBus"
872 @end lisp
873 @end defun
874
875
876 @node Arguments and Signatures
877 @section The final details.
878
879 Methods and signals have arguments. They are described in the
880 @code{arg} XML elements.
881
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:
885
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")
891
892 @result{} ("search" "hit_ids" "fields" "hit_data")
893 @end lisp
894
895 Argument names are optional; the function can return @code{nil}
896 therefore, even if the method or signal has arguments.
897 @end defun
898
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:
902
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")
908
909 @result{} (arg ((name . "search") (type . "s") (direction . "in")))
910 @end lisp
911 @end defun
912
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.
916
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.
920
921 If @var{name} is a @code{signal}, and @var{direction} is
922 non-@code{nil}, @var{direction} must be @samp{out}. Example:
923
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")
929
930 @result{} "sauas"
931
932 (dbus-introspect-get-signature
933 :session "org.freedesktop.xesam.searcher"
934 "/org/freedesktop/xesam/searcher/main"
935 "org.freedesktop.xesam.Search" "HitsAdded")
936
937 @result{} "su"
938 @end lisp
939 @end defun
940
941
942 @node Type Conversion
943 @chapter Mapping Lisp types and D-Bus types.
944 @cindex type conversion
945
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.
949
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.
954
955
956 @section Input parameters.
957
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:
961
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
974
975 Other Lisp objects, like symbols or hash tables, are not accepted as
976 input parameters.
977
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}.
985
986 @noindent
987 Example:
988
989 @lisp
990 (dbus-call-method @dots{} @var{NAT-NUMBER} @var{STRING})
991 @end lisp
992
993 is equivalent to
994
995 @lisp
996 (dbus-call-method @dots{} :uint32 @var{NAT-NUMBER} :string @var{STRING})
997 @end lisp
998
999 but different to
1000
1001 @lisp
1002 (dbus-call-method @dots{} :int32 @var{NAT-NUMBER} :signature @var{STRING})
1003 @end lisp
1004
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}.
1010
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.
1014
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.
1020
1021 The objects being elements of the list are checked according to the
1022 D-Bus compound type rules.
1023
1024 @itemize
1025 @item An array must contain only elements of the same D-Bus type. It
1026 can be empty.
1027
1028 @item A variant must contain only one single element.
1029
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.
1033
1034 @item There is no restriction for structs.
1035 @end itemize
1036
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:
1041
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.
1057
1058 @result{} 3
1059 @end lisp
1060
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:
1065
1066 @lisp
1067 (dbus-string-to-byte-array "/etc/hosts")
1068
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
1073
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.
1079
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:
1084
1085 @lisp
1086 (dbus-escape-as-identifier "0123abc_xyz\x01\xff")
1087
1088 @result{} "_30123abc_5fxyz_01_ff"
1089 @end lisp
1090 @end defun
1091
1092
1093 @section Output parameters.
1094
1095 Output parameters of D-Bus methods and signals are mapped to Lisp
1096 objects.
1097
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
1121
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.
1126
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.
1130
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}):
1134
1135 @lisp
1136 (@var{INTEGER} ((@var{STRING} @var{BOOL} @var{BOOL}) (@var{STRING} @var{BOOL} @var{BOOL}) @dots{}))
1137 @end lisp
1138
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:
1143
1144 @lisp
1145 (dbus-byte-array-to-string '(47 101 116 99 47 104 111 115 116 115))
1146
1147 @result{} "/etc/hosts"
1148 @end lisp
1149 @end defun
1150
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:
1155
1156 @lisp
1157 (dbus-unescape-from-identifier "_30123abc_5fxyz_01_ff")
1158
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
1167
1168
1169 @node Synchronous Methods
1170 @chapter Calling methods in a blocking way.
1171 @cindex method calls, synchronous
1172 @cindex synchronous method calls
1173
1174 Methods can be called synchronously (@dfn{blocking}) or asynchronously
1175 (@dfn{non-blocking}).
1176
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.
1181
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}.
1185
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}.
1189
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}).
1195
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}.
1199
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:
1203
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")
1209
1210 @result{} (t ("Philip R. Zimmermann"))
1211 @end lisp
1212
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:
1216
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")
1223
1224 @result{} "i686"
1225 @end lisp
1226
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:
1235
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)) ""))))
1249
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
1268
1269
1270 @node Asynchronous Methods
1271 @chapter Calling methods non-blocking.
1272 @cindex method calls, asynchronous
1273 @cindex asynchronous method calls
1274
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}.
1279
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}.
1283
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.
1287
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}).
1293
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}.
1297
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:
1302
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")
1309
1310 @result{} (:serial :system 2)
1311
1312 @print{} i686
1313 @end lisp
1314 @end defun
1315
1316
1317 @node Receiving Method Calls
1318 @chapter Offering own methods.
1319 @cindex method calls, returning
1320 @cindex returning method calls
1321
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:
1326
1327 @defun dbus-register-service bus service &rest flags
1328 Register the known name @var{service} on D-Bus @var{bus}.
1329
1330 @var{bus} is either the symbol @code{:system} or the symbol
1331 @code{:session}.
1332
1333 @var{service} is the service name to be registered on the D-Bus. It
1334 must be a known name.
1335
1336 @var{flags} is a subset of the following keywords:
1337
1338 @itemize
1339 @item @code{:allow-replacement}: Allow another service to become the primary
1340 owner if requested.
1341
1342 @item @code{:replace-existing}: Request to replace the current primary owner.
1343
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
1347
1348 One of the following keywords is returned:
1349
1350 @itemize
1351
1352 @item @code{:primary-owner}: We have become the primary owner of the name
1353 @var{service}.
1354
1355 @item @code{:in-queue}: We could not become the primary owner and
1356 have been placed in the queue.
1357
1358 @item @code{:exists}: We already are in the queue.
1359
1360 @item @code{:already-owner}: We already are the primary
1361 owner.
1362 @end itemize
1363 @end defun
1364
1365 @defun dbus-unregister-service bus service
1366 Unregister all objects from D-Bus @var{bus}, registered by Emacs for
1367 @var{service}.
1368
1369 @var{bus} is either the symbol @code{:system} or the symbol
1370 @code{:session}.
1371
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.
1375
1376 One of the following keywords is returned:
1377
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
1384
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}.
1389
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.
1396
1397 @deffn Constant dbus-service-emacs
1398 The well known service name @samp{org.gnu.Emacs} of Emacs.
1399 @end deffn
1400
1401 @deffn Constant dbus-path-emacs
1402 The object path namespace @samp{/org/gnu/Emacs} used by Emacs.
1403 @end deffn
1404
1405 @deffn Constant dbus-interface-emacs
1406 The interface namespace @code{org.gnu.Emacs} used by Emacs.
1407 @end deffn
1408
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}.
1412
1413 @var{bus} is either the symbol @code{:system} or the symbol
1414 @code{:session}.
1415
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).
1419
1420 @var{path} is the D-Bus object path @var{service} is registered (See
1421 discussion of @var{dont-register-service} below).
1422
1423 @var{interface} is the interface offered by @var{service}. It must
1424 provide @var{method}.
1425
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}.
1432
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.
1436
1437 In case @var{handler} shall return a reply message with an empty
1438 argument list, @var{handler} must return the symbol @code{:ignore}.
1439
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.
1446
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.
1451
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:
1455
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))
1463
1464 @result{} my-dbus-method-handler
1465
1466 (dbus-register-method
1467 :session "org.freedesktop.TextEditor" "/org/freedesktop/TextEditor"
1468 "org.freedesktop.TextEditor" "OpenFile"
1469 'my-dbus-method-handler)
1470
1471 @result{} ((:method :session "org.freedesktop.TextEditor" "OpenFile")
1472 ("org.freedesktop.TextEditor" "/org/freedesktop/TextEditor"
1473 my-dbus-method-handler))
1474 @end lisp
1475
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:
1481
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"
1487
1488 @print{} method return sender=:1.22 -> dest=:1.23 reply_serial=2
1489 boolean true
1490 @end example
1491
1492 You can indicate an error by raising the Emacs signal
1493 @code{dbus-error}. The handler above could be changed like this:
1494
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)
1503
1504 @result{} my-dbus-method-handler
1505 @end lisp
1506
1507 The test runs then
1508
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"
1515
1516 @print{} Error org.freedesktop.DBus.Error.Failed:
1517 Wrong argument list: ("/etc/hosts" "/etc/passwd")
1518 @end example
1519 @end defun
1520
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}.
1524
1525 @var{bus} is either the symbol @code{:system} or the symbol
1526 @code{:session}.
1527
1528 @var{service} is the D-Bus service name of the D-Bus. It must be a
1529 known name.
1530
1531 @var{path} is the D-Bus object path @var{service} is registered (See
1532 discussion of @var{dont-register-service} below).
1533
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}.
1536
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).
1541
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}.
1546
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}.
1553
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.
1560
1561 @noindent Example:
1562
1563 @lisp
1564 (dbus-register-property
1565 :session "org.freedesktop.TextEditor" "/org/freedesktop/TextEditor"
1566 "org.freedesktop.TextEditor" "name" :read "GNU Emacs")
1567
1568 @result{} ((:property :session "org.freedesktop.TextEditor" "name")
1569 ("org.freedesktop.TextEditor" "/org/freedesktop/TextEditor"))
1570
1571 (dbus-register-property
1572 :session "org.freedesktop.TextEditor" "/org/freedesktop/TextEditor"
1573 "org.freedesktop.TextEditor" "version" :readwrite emacs-version t)
1574
1575 @result{} ((:property :session "org.freedesktop.TextEditor" "version")
1576 ("org.freedesktop.TextEditor" "/org/freedesktop/TextEditor"))
1577 @end lisp
1578
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:
1583
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"
1590
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
1603
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}).
1607
1608 @lisp
1609 (dbus-set-property
1610 :session "org.freedesktop.TextEditor" "/org/freedesktop/TextEditor"
1611 "org.freedesktop.TextEditor" "version" "23.1.50")
1612
1613 @result{} "23.1.50"
1614
1615 (dbus-get-property
1616 :session "org.freedesktop.TextEditor" "/org/freedesktop/TextEditor"
1617 "org.freedesktop.TextEditor" "version")
1618
1619 @result{} "23.1.50"
1620 @end lisp
1621 @end defun
1622
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.
1629
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
1634
1635
1636 @node Signals
1637 @chapter Sending and receiving signals.
1638 @cindex signals
1639
1640 Signals are one way messages. They carry input parameters, which are
1641 received by all objects which have registered for such a signal.
1642
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.
1646
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}.
1650
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}.
1659
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:
1663
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
1671
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}.
1675
1676 @var{bus} is either the symbol @code{:system} or the symbol
1677 @code{:session}.
1678
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.
1685
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}.
1689
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.
1693
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.
1697
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:
1704
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.
1711
1712 @item @code{:arg-namespace} @var{string}:@*
1713 Register for the signals, which first argument defines the service or
1714 interface namespace @var{string}.
1715
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}.
1720
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
1726
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:
1730
1731 @lisp
1732 (defun my-dbus-signal-handler (device)
1733 (message "Device %s added" device))
1734
1735 @result{} my-dbus-signal-handler
1736
1737 (dbus-register-signal
1738 :system "org.freedesktop.Hal" "/org/freedesktop/Hal/Manager"
1739 "org.freedesktop.Hal.Manager" "DeviceAdded"
1740 'my-dbus-signal-handler)
1741
1742 @result{} ((:signal :system "org.freedesktop.Hal.Manager" "DeviceAdded")
1743 ("org.freedesktop.Hal" "/org/freedesktop/Hal/Manager"
1744 my-signal-handler))
1745 @end lisp
1746
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.
1754
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:
1758
1759 @lisp
1760 (dbus-ignore-errors
1761 (dbus-register-signal
1762 :system nil nil nil nil 'ignore :path-namespace "/invalid/path"))
1763
1764 @result{} nil
1765 @end lisp
1766 @end defun
1767
1768
1769 @node Alternative Buses
1770 @chapter Alternative buses and environments.
1771 @cindex bus names
1772 @cindex UNIX domain socket
1773 @cindex TCP/IP socket
1774
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.
1782
1783 @defun dbus-init-bus bus &optional private
1784 Establish the connection to D-Bus @var{bus}.
1785
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.
1791
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.
1799
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.
1807
1808 Example: You initialize a connection to the AT-SPI bus on your host:
1809
1810 @lisp
1811 (setq my-bus
1812 (dbus-call-method
1813 :session "org.a11y.Bus" "/org/a11y/bus"
1814 "org.a11y.Bus" "GetAddress"))
1815
1816 @result{} "unix:abstract=/tmp/dbus-2yzWHOCdSD,guid=a490dd26625870ca1298b6e10000fd7f"
1817
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)
1822
1823 @result{} 2
1824
1825 (dbus-get-unique-name my-bus)
1826
1827 @result{} ":1.19"
1828
1829 ;; Open a new connection to the same bus. This obsoletes the
1830 ;; previous one.
1831 (dbus-init-bus my-bus 'private)
1832
1833 @result{} 1
1834
1835 (dbus-get-unique-name my-bus)
1836
1837 @result{} ":1.20"
1838 @end lisp
1839
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
1844
1845 @defun dbus-setenv bus variable value
1846 Set the value of the @var{bus} environment variable @var{variable} to
1847 @var{value}.
1848
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.
1852
1853 Normally, services inherit the environment of the bus daemon. This
1854 function adds to or modifies that environment when activating services.
1855
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.
1859
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
1863
1864 @lisp
1865 (setq my-bus "unix:host=example.gnu.org,port=4711")
1866
1867 @result{} "unix:host=example.gnu.org,port=4711"
1868
1869 (dbus-init-bus my-bus)
1870
1871 @result{} 1
1872
1873 (dbus-setenv my-bus "DISPLAY" (getenv "DISPLAY"))
1874
1875 @result{} nil
1876 @end lisp
1877 @end defun
1878
1879
1880 @node Errors and Events
1881 @chapter Errors and events.
1882 @cindex debugging
1883 @cindex errors
1884 @cindex events
1885
1886 The internal actions can be traced by running in a debug mode.
1887
1888 @defvar dbus-debug
1889 If this variable is non-@code{nil}, D-Bus specific debug messages are raised.
1890 @end defvar
1891
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.
1898
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}.
1902
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
1908
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:
1912
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
1917
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}.
1920
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.
1927
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.
1931
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.
1935
1936 In order to inspect the @code{dbus-event} data, you could extend the
1937 definition of the callback function in @ref{Signals}:
1938
1939 @lisp
1940 (defun my-dbus-signal-handler (&rest args)
1941 (message "my-dbus-signal-handler: %S" last-input-event))
1942 @end lisp
1943
1944 There exist convenience functions which could be called inside a
1945 callback function in order to retrieve the information from the event.
1946
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
1951
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
1956
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
1961
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
1965
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
1969
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
1973
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
1978
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.
1983
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}.
1989
1990 Such functions can be used the adapt the error signal to be raised.
1991 Example:
1992
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))))
1999
2000 (add-hook 'dbus-event-error-functions 'my-dbus-event-error-handler)
2001 @end lisp
2002 @end defvar
2003
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.
2007
2008
2009 @node Index
2010 @unnumbered Index
2011
2012 @printindex cp
2013
2014
2015 @node GNU Free Documentation License
2016 @appendix GNU Free Documentation License
2017 @include doclicense.texi
2018
2019 @bye