Spelling fixes.
[bpt/emacs.git] / doc / misc / dbus.texi
CommitLineData
22d8ac3a
MA
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
5bd55c3c
MA
8@syncodeindex vr cp
9@syncodeindex fn cp
10
22d8ac3a 11@copying
73b0cd50 12Copyright @copyright{} 2007-2011 Free Software Foundation, Inc.
22d8ac3a
MA
13
14@quotation
15Permission is granted to copy, distribute and/or modify this document
6a2c4aec 16under the terms of the GNU Free Documentation License, Version 1.3 or
22d8ac3a 17any later version published by the Free Software Foundation; with no
debf4439
GM
18Invariant Sections, with the Front-Cover texts being ``A GNU Manual'',
19and with the Back-Cover Texts as in (a) below. A copy of the license
20is included in the section entitled ``GNU Free Documentation License''.
22d8ac3a 21
6f093307
GM
22(a) The FSF's Back-Cover Text is: ``You have the freedom to copy and
23modify this GNU manual. Buying copies from the FSF supports it in
24developing GNU and promoting software freedom.''
22d8ac3a
MA
25@end quotation
26@end copying
27
0c973505 28@dircategory Emacs lisp libraries
22d8ac3a
MA
29@direntry
30* D-Bus: (dbus). Using D-Bus in Emacs.
31@end direntry
32
5dc584b5 33@contents
cd71b9ae 34
977640ed 35
22d8ac3a
MA
36@node Top, Overview, (dir), (dir)
37@top D-Bus integration in Emacs
38
78176e69
MA
39This manual documents an API for usage of D-Bus in Emacs. D-Bus is a
40message bus system, a simple way for applications to talk to one
41another. An overview of D-Bus can be found at
42@uref{http://dbus.freedesktop.org/}.
22d8ac3a 43
5dc584b5 44@ifnottex
22d8ac3a 45@insertcopying
5dc584b5 46@end ifnottex
22d8ac3a
MA
47
48@menu
49* Overview:: An overview of D-Bus.
cd71b9ae 50* Inspection:: Inspection of D-Bus services.
22d8ac3a
MA
51* Type Conversion:: Mapping Lisp types and D-Bus types.
52* Synchronous Methods:: Calling methods in a blocking way.
21956b56 53* Asynchronous Methods:: Calling methods non-blocking.
addb7f2e 54* Receiving Method Calls:: Offering own methods.
22d8ac3a 55* Signals:: Sending and receiving signals.
7457f7b6 56* Alternative Buses:: Alternative buses.
22d8ac3a 57* Errors and Events:: Errors and events.
5bd55c3c
MA
58* Index:: Index including concepts, functions, variables.
59
22d8ac3a
MA
60* GNU Free Documentation License:: The license for this documentation.
61@end menu
62
cd71b9ae 63
22d8ac3a
MA
64@node Overview
65@chapter An overview of D-Bus
66@cindex overview
67
68D-Bus is an inter-process communication mechanism for applications
69residing on the same host. The communication is based on
70@dfn{messages}. Data in the messages is carried in a structured way,
71it is not just a byte stream.
72
73The communication is connection oriented to two kinds of message
74buses: a so called @dfn{system bus}, and a @dfn{session bus}. On a
75given machine, there is always one single system bus for miscellaneous
76system-wide communication, like changing of hardware configuration.
77On the other hand, the session bus is always related to a single
78user's session.
79
80Every client application, which is connected to a bus, registers under
81a @dfn{unique name} at the bus. This name is used for identifying the
82client application. Such a unique name starts always with a colon,
83and looks like @samp{:1.42}.
84
85Additionally, a client application can register itself to a so called
86@dfn{known name}, which is a series of identifiers separated by dots,
7ef92bc9 87as in @samp{org.gnu.Emacs}. If several applications register to the
22d8ac3a
MA
88same known name, these registrations are queued, and only the first
89application which has registered for the known name is reachable via
90this name. If this application disconnects from the bus, the next
91queued unique name becomes the owner of this known name.
92
93An application can install one or several objects under its name.
94Such objects are identified by an @dfn{object path}, which looks
95similar to paths in a filesystem. An example of such an object path
96could be @samp{/org/gnu/Emacs/}.
97
98Applications might send a request to an object, that means sending a
99message with some data as input parameters, and receiving a message
100from that object with the result of this message, the output
101parameters. Such a request is called @dfn{method} in D-Bus.
102
103The other form of communication are @dfn{signals}. The underlying
104message is emitted from an object and will be received by all other
105applications which have registered for such a signal.
106
107All methods and signals an object supports are called @dfn{interface}
108of the object. Interfaces are specified under a hierarchical name in
109D-Bus; an object can support several interfaces. Such an interface
110name could be @samp{org.gnu.Emacs.TextEditor} or
111@samp{org.gnu.Emacs.FileManager}.
112
113
114@node Inspection
cd71b9ae 115@chapter Inspection of D-Bus services.
22d8ac3a
MA
116@cindex inspection
117
cd71b9ae
MA
118@menu
119* Bus names:: Discovering D-Bus names.
120* Introspection:: Knowing the details of D-Bus services.
121* Nodes and Interfaces:: Detecting object paths and interfaces.
122* Methods and Signal:: Applying the functionality.
123* Properties and Annotations:: What else to know about interfaces.
124* Arguments and Signatures:: The final details.
125@end menu
126
127
128@node Bus names
129@section Bus names.
130
22d8ac3a
MA
131There are several basic functions which inspect the buses for
132registered names. Internally they use the basic interface
133@samp{org.freedesktop.DBus}, which is supported by all objects of a bus.
134
1ff98217
MA
135@defun dbus-list-activatable-names &optional bus
136This function returns the D-Bus service names, which can be activated
137for @var{bus}. It must be either the symbol @code{:system} (the
138default) or the symbol @code{:session}. An activatable service is
139described in a service registration file. Under GNU/Linux, such files
140are located at @file{/usr/share/dbus-1/system-services/} (for the
141@code{:system} bus) or @file{/usr/share/dbus-1/services/}. An
142activatable service is not necessarily registered at @var{bus} at already.
22d8ac3a
MA
143
144The result is a list of strings, which is @code{nil} when there are no
1ff98217
MA
145activatable service names at all. Example:
146
147@lisp
148;; Check, whether the document viewer can be accessed via D-Bus.
149(member "org.gnome.evince.Daemon"
150 (dbus-list-activatable-names :session))
151@end lisp
152
22d8ac3a
MA
153@end defun
154
155@defun dbus-list-names bus
22d8ac3a
MA
156All service names, which are registered at D-Bus @var{bus}, are
157returned. The result is a list of strings, which is @code{nil} when
158there are no registered service names at all. Well known names are
159strings like @samp{org.freedesktop.DBus}. Names starting with
160@samp{:} are unique names for services.
161
162@var{bus} must be either the symbol @code{:system} or the symbol
163@code{:session}.
164@end defun
165
166@defun dbus-list-known-names bus
1ff98217 167Retrieves all registered services which correspond to a known name in @var{bus}.
22d8ac3a
MA
168A service has a known name if it doesn't start with @samp{:}. The
169result is a list of strings, which is @code{nil} when there are no
170known names at all.
171
172@var{bus} must be either the symbol @code{:system} or the symbol
173@code{:session}.
174@end defun
175
176@defun dbus-list-queued-owners bus service
22d8ac3a
MA
177For a given service, registered at D-Bus @var{bus} under the name
178@var{service}, all queued unique names are returned. The result is a
179list of strings, or @code{nil} when there are no queued names for
180@var{service} at all.
181
182@var{bus} must be either the symbol @code{:system} or the symbol
183@code{:session}. @var{service} must be a known service name as
184string.
185@end defun
186
187@defun dbus-get-name-owner bus service
22d8ac3a 188For a given service, registered at D-Bus @var{bus} under the name
06c0751a
MA
189@var{service}, the unique name of the name owner is returned. The
190result is a string, or @code{nil} when there exist no name owner of
191@var{service}.
22d8ac3a
MA
192
193@var{bus} must be either the symbol @code{:system} or the symbol
194@code{:session}. @var{service} must be a known service name as
195string.
196@end defun
197
ecd3d54f 198@defun dbus-ping bus service &optional timeout
06c0751a 199Check whether the service name @var{service} is registered at D-Bus
ecd3d54f
MA
200@var{bus}. @var{service} might not have been started yet, it is
201autostarted if possible. The result is either @code{t} or @code{nil}.
06c0751a
MA
202
203@var{bus} must be either the symbol @code{:system} or the symbol
ecd3d54f
MA
204@code{:session}. @var{service} must be a string. @var{timeout}, a
205nonnegative integer, specifies the maximum number of milliseconds
206@code{dbus-ping} must return. The default value is 25,000. Example:
06c0751a
MA
207
208@lisp
209(message
210 "%s screensaver on board."
211 (cond
ecd3d54f
MA
212 ((dbus-ping :session "org.gnome.ScreenSaver" 100) "Gnome")
213 ((dbus-ping :session "org.freedesktop.ScreenSaver" 100) "KDE")
06c0751a
MA
214 (t "No")))
215@end lisp
ecd3d54f
MA
216
217If it shall be checked whether @var{service} is already running
218without autostarting it, one shall apply
219
220@lisp
221(member service (dbus-list-known-names bus))
222@end lisp
06c0751a
MA
223@end defun
224
22d8ac3a 225@defun dbus-get-unique-name bus
22d8ac3a
MA
226The unique name, under which Emacs is registered at D-Bus @var{bus},
227is returned as string.
228
229@var{bus} must be either the symbol @code{:system} or the symbol
230@code{:session}.
231@end defun
232
cd71b9ae
MA
233
234@node Introspection
235@section Knowing the details of D-Bus services.
236
237D-Bus services publish their interfaces. This can be retrieved and
238analyzed during runtime, in order to understand the used
239implementation.
240
241The resulting introspection data are in XML format. The root
242introspection element is always a @code{node} element. It might have
243a @code{name} attribute, which denotes the (absolute) object path an
244interface is introspected.
245
246The root @code{node} element may have @code{node} and @code{interface}
247children. A child @code{node} element must have a @code{name}
248attribute, this case it is the relative object path to the root
249@code{node} element.
250
251An @code{interface} element has just one attribute, @code{name}, which
252is the full name of that interface. The default interface
253@samp{org.freedesktop.DBus.Introspectable} is always present. Example:
254
255@example
256<node name="/org/bluez">
257 <interface name="org.freedesktop.DBus.Introspectable">
258 @dots{}
259 </interface>
260 <interface name="org.bluez.Manager">
261 @dots{}
262 </interface>
263 <interface name="org.bluez.Database">
264 @dots{}
265 </interface>
266 <interface name="org.bluez.Security">
267 @dots{}
268 </interface>
269 <node name="service_audio"/>
270 <node name="service_input"/>
271 <node name="service_network"/>
272 <node name="service_serial"/>
273</node>
274@end example
275
276Children of an @code{interface} element can be @code{method},
277@code{signal} and @code{property} elements. A @code{method} element
278stands for a D-Bus method of the surrounding interface. The element
279itself has a @code{name} attribute, showing the method name. Children
280elements @code{arg} stand for the arguments of a method. Example:
281
282@example
283<method name="ResolveHostName">
284 <arg name="interface" type="i" direction="in"/>
285 <arg name="protocol" type="i" direction="in"/>
286 <arg name="name" type="s" direction="in"/>
287 <arg name="aprotocol" type="i" direction="in"/>
288 <arg name="flags" type="u" direction="in"/>
289 <arg name="interface" type="i" direction="out"/>
290 <arg name="protocol" type="i" direction="out"/>
291 <arg name="name" type="s" direction="out"/>
292 <arg name="aprotocol" type="i" direction="out"/>
293 <arg name="address" type="s" direction="out"/>
294 <arg name="flags" type="u" direction="out"/>
295</method>
296@end example
297
298@code{arg} elements can have the attributes @code{name}, @code{type}
299and @code{direction}. The @code{name} attribute is optional. The
300@code{type} attribute stands for the @dfn{signature} of the argument
301in D-Bus. For a discussion of D-Bus types and their Lisp
302representation see @ref{Type Conversion}.@footnote{D-Bus signatures
303are explained in the D-Bus specification
304@uref{http://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-signatures}.}
305The @code{direction} attribute of an @code{arg} element can be only
306@samp{in} or @samp{out}; in case it is omitted, it defaults to
307@samp{in}.
308
309A @code{signal} element of an @code{interface} has a similar
310structure. The @code{direction} attribute of an @code{arg} child
311element can be only @samp{out} here; which is also the default value.
312Example:
313
314@example
315<signal name="StateChanged">
316 <arg name="state" type="i"/>
317 <arg name="error" type="s"/>
318</signal>
319@end example
320
321A @code{property} element has no @code{arg} child
322element. It just has the attributes @code{name}, @code{type} and
323@code{access}, which are all mandatory. The @code{access} attribute
324allows the values @samp{readwrite}, @samp{read}, and @samp{write}.
325Example:
326
327@example
328<property name="Status" type="u" direction="read"/>
329@end example
330
331@code{annotation} elements can be children of @code{interface},
332@code{method}, @code{signal}, and @code{property} elements. Unlike
333properties, which can change their values during lifetime of a D-Bus
334object, annotations are static. Often they are used for code
53964682 335generators of D-Bus language bindings. Example:
cd71b9ae
MA
336
337@example
338<annotation name="de.berlios.Pinot.GetStatistics" value="pinotDBus"/>
339@end example
340
341Annotations have just @code{name} and @code{value} attributes, both
342must be strings.
343
22d8ac3a 344@defun dbus-introspect bus service path
cd71b9ae
MA
345This function returns all interfaces and sub-nodes of @var{service},
346registered at object path @var{path} at bus @var{bus}.
22d8ac3a
MA
347
348@var{bus} must be either the symbol @code{:system} or the symbol
349@code{:session}. @var{service} must be a known service name, and
350@var{path} must be a valid object path. The last two parameters are
351strings. The result, the introspection data, is a string in XML
cd71b9ae 352format. Example:
22d8ac3a 353
06c0751a 354@lisp
22d8ac3a
MA
355(dbus-introspect
356 :system "org.freedesktop.Hal"
357 "/org/freedesktop/Hal/devices/computer")
358
d9e21158 359@result{} "<!DOCTYPE node PUBLIC
cd71b9ae
MA
360 "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
361 "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
d9e21158 362 <node>
cd71b9ae
MA
363 <interface name="org.freedesktop.Hal.Device">
364 <method name="GetAllProperties">
365 <arg name="properties" direction="out" type="a@{sv@}"/>
d9e21158 366 </method>
c9ecb5a7 367 @dots{}
cd71b9ae
MA
368 <signal name="PropertyModified">
369 <arg name="num_updates" type="i"/>
370 <arg name="updates" type="a(sbb)"/>
d9e21158
MA
371 </signal>
372 </interface>
c9ecb5a7 373 @dots{}
d9e21158 374 </node>"
06c0751a 375@end lisp
22d8ac3a 376
cd71b9ae
MA
377This example informs us, that the service @samp{org.freedesktop.Hal}
378at object path @samp{/org/freedesktop/Hal/devices/computer} offers the
379interface @samp{org.freedesktop.Hal.Device} (and 2 other interfaces
22d8ac3a 380not documented here). This interface contains the method
cd71b9ae 381@samp{GetAllProperties}, which needs no input parameters, but returns
22d8ac3a
MA
382as output parameter an array of dictionary entries (key-value pairs).
383Every dictionary entry has a string as key, and a variant as value.
384
385The interface offers also a signal, which returns 2 parameters: an
386integer, and an array consisting of elements which are a struct of a
cd71b9ae
MA
387string and 2 boolean values.@footnote{ The interfaces of the service
388@samp{org.freedesktop.Hal} are described at
22d8ac3a
MA
389@uref{http://people.freedesktop.org/~david/hal-spec/hal-spec.html#interfaces}.}
390@end defun
391
cd71b9ae
MA
392@defun dbus-introspect-xml bus service path
393This function has the same intention as function
394@code{dbus-introspect}. The returned value is a parsed XML tree,
395which can be used for further analysis. Example:
396
397@lisp
398(dbus-introspect-xml
399 :session "org.freedesktop.xesam.searcher"
400 "/org/freedesktop/xesam/searcher/main")
401
402@result{} (node ((name . "/org/freedesktop/xesam/searcher/main"))
403 (interface ((name . "org.freedesktop.xesam.Search"))
404 (method ((name . "GetHitData"))
405 (arg ((name . "search") (type . "s") (direction . "in")))
406 (arg ((name . "hit_ids") (type . "au") (direction . "in")))
407 (arg ((name . "fields") (type . "as") (direction . "in")))
408 (arg ((name . "hit_data") (type . "aav") (direction . "out")))
409 )
410 @dots{}
411 (signal ((name . "HitsAdded"))
412 (arg ((name . "search") (type . "s")))
413 (arg ((name . "count") (type . "u")))
414 )
415 )
416 @dots{}
417 )
418@end lisp
419@end defun
420
421@defun dbus-introspect-get-attribute object attribute
422It returns the @var{attribute} value of a D-Bus introspection
423@var{object}. @var{object} can be every subtree of a parsed XML tree
424as retrieved with @code{dbus-introspect-xml}. @var{attribute} must be
425a string according to the attribute names in the D-Bus specification.
426Example:
427
428@lisp
429(dbus-introspect-get-attribute
430 (dbus-introspect-xml :system "org.freedesktop.SystemToolsBackends"
431 "/org/freedesktop/SystemToolsBackends/UsersConfig")
432 "name")
433
434@result{} "/org/freedesktop/SystemToolsBackends/UsersConfig"
435@end lisp
436
5bd55c3c
MA
437If @var{object} has no @var{attribute}, the function returns
438@code{nil}.
cd71b9ae
MA
439@end defun
440
441
442@node Nodes and Interfaces
443@section Detecting object paths and interfaces.
444
445The first elements, to be introspected for a D-Bus object, are further
446object paths and interfaces.
447
448@defun dbus-introspect-get-node-names bus service path
449All node names of @var{service} in D-Bus @var{bus} at object path
450@var{path} are returned as list of strings. Example:
451
452@lisp
453(dbus-introspect-get-node-names
454 :session "org.gnome.seahorse" "/org/gnome/seahorse")
455
456@result{} ("crypto" "keys")
457@end lisp
458
459The node names stand for further object paths of the D-Bus
460@var{service}, relative to @var{path}. In the example,
461@samp{/org/gnome/seahorse/crypto} and @samp{/org/gnome/seahorse/keys}
462are also object paths of the D-Bus service @samp{org.gnome.seahorse}.
463@end defun
464
465@defun dbus-introspect-get-all-nodes bus service path
466This function returns all node names of @var{service} in D-Bus
467@var{bus} at object path @var{path}. It returns a list of strings
468with all object paths of @var{service}, starting at @var{path}.
469Example:
470
471@lisp
472(dbus-introspect-get-all-nodes :session "org.gnome.seahorse" "/")
473
474@result{} ("/" "/org" "/org/gnome" "/org/gnome/seahorse"
475 "/org/gnome/seahorse/crypto"
476 "/org/gnome/seahorse/keys"
477 "/org/gnome/seahorse/keys/openpgp"
478 "/org/gnome/seahorse/keys/openpgp/local"
479 "/org/gnome/seahorse/keys/openssh"
480 "/org/gnome/seahorse/keys/openssh/local")
481@end lisp
482@end defun
483
484@defun dbus-introspect-get-interface-names bus service path
485There will be returned a list strings of all interface names of
486@var{service} in D-Bus @var{bus} at object path @var{path}. This list
487will contain the default interface @samp{org.freedesktop.DBus.Introspectable}.
488
489Another default interface is @samp{org.freedesktop.DBus.Properties}.
490If present, @code{interface} elements can also have @code{property}
491children. Example:
492
493@lisp
494(dbus-introspect-get-interface-names
495 :system "org.freedesktop.Hal"
496 "/org/freedesktop/Hal/devices/computer")
497
498@result{} ("org.freedesktop.DBus.Introspectable"
499 "org.freedesktop.Hal.Device"
500 "org.freedesktop.Hal.Device.SystemPowerManagement"
501 "org.freedesktop.Hal.Device.CPUFreq")
502@end lisp
503@end defun
504
505@defun dbus-introspect-get-interface bus service path interface
506Return @var{interface} of @var{service} in D-Bus @var{bus} at object
507path @var{path}. The return value is an XML element. @var{interface}
508must be a string, element of the list returned by
509@code{dbus-introspect-get-interface-names}. Example:
510
511@lisp
512(dbus-introspect-get-interface
513 :session "org.freedesktop.xesam.searcher"
514 "/org/freedesktop/xesam/searcher/main"
515 "org.freedesktop.xesam.Search")
516
517@result{} (interface ((name . "org.freedesktop.xesam.Search"))
518 (method ((name . "GetHitData"))
519 (arg ((name . "search") (type . "s") (direction . "in")))
520 (arg ((name . "hit_ids") (type . "au") (direction . "in")))
521 (arg ((name . "fields") (type . "as") (direction . "in")))
522 (arg ((name . "hit_data") (type . "aav") (direction . "out")))
523 )
524 @dots{}
525 (signal ((name . "HitsAdded"))
526 (arg ((name . "search") (type . "s")))
527 (arg ((name . "count") (type . "u")))
528 )
529 )
530@end lisp
531@end defun
532
533@noindent
534With these functions, it is possible to retrieve all introspection
535data from a running system:
536
537@lisp
538(with-current-buffer (switch-to-buffer "*introspect*")
539 (erase-buffer)
540 (dolist (service (dbus-list-known-names :session))
541 (dolist (path (dbus-introspect-get-all-nodes :session service "/"))
542 ;; We want to introspect only elements, which have more than
543 ;; the default interface "org.freedesktop.DBus.Introspectable".
544 (when (delete
545 "org.freedesktop.DBus.Introspectable"
546 (dbus-introspect-get-interface-names :session service path))
547 (insert (message "\nservice: \"%s\" path: \"%s\"\n" service path)
548 (dbus-introspect :session service path))
549 (redisplay t)))))
550@end lisp
551
552
553@node Methods and Signal
554@section Applying the functionality.
555
da6062e6 556Methods and signals are the communication means to D-Bus. The
cd71b9ae
MA
557following functions return their specifications.
558
559@defun dbus-introspect-get-method-names bus service path interface
560Return a list of strings of all method names of @var{interface} of
561@var{service} in D-Bus @var{bus} at object path @var{path}. Example:
562
563@lisp
564(dbus-introspect-get-method-names
565 :session "org.freedesktop.xesam.searcher"
566 "/org/freedesktop/xesam/searcher/main"
567 "org.freedesktop.xesam.Search")
568
569@result{} ("GetState" "StartSearch" "GetHitCount" "GetHits" "NewSession"
570 "CloseSession" "GetHitData" "SetProperty" "NewSearch"
571 "GetProperty" "CloseSearch")
572@end lisp
573@end defun
574
575@defun dbus-introspect-get-method bus service path interface method
576This function returns @var{method} of @var{interface} as XML element.
577It must be located at @var{service} in D-Bus @var{bus} at object path
578@var{path}. @var{method} must be a string, element of the list
579returned by @code{dbus-introspect-get-method-names}. Example:
580
581@lisp
582(dbus-introspect-get-method
583 :session "org.freedesktop.xesam.searcher"
584 "/org/freedesktop/xesam/searcher/main"
585 "org.freedesktop.xesam.Search" "GetHitData")
586
587@result{} (method ((name . "GetHitData"))
588 (arg ((name . "search") (type . "s") (direction . "in")))
589 (arg ((name . "hit_ids") (type . "au") (direction . "in")))
590 (arg ((name . "fields") (type . "as") (direction . "in")))
591 (arg ((name . "hit_data") (type . "aav") (direction . "out")))
592 )
593@end lisp
594@end defun
595
596@defun dbus-introspect-get-signal-names bus service path interface
597Return a list of strings of all signal names of @var{interface} of
598@var{service} in D-Bus @var{bus} at object path @var{path}. Example:
599
600@lisp
601(dbus-introspect-get-signal-names
602 :session "org.freedesktop.xesam.searcher"
603 "/org/freedesktop/xesam/searcher/main"
604 "org.freedesktop.xesam.Search")
605
606@result{} ("StateChanged" "SearchDone" "HitsModified"
607 "HitsRemoved" "HitsAdded")
608@end lisp
609@end defun
610
611@defun dbus-introspect-get-signal bus service path interface signal
612This function returns @var{signal} of @var{interface} as XML element.
613It must be located at @var{service} in D-Bus @var{bus} at object path
614@var{path}. @var{signal} must be a string, element of the list
615returned by @code{dbus-introspect-get-signal-names}. Example:
616
617@lisp
618(dbus-introspect-get-signal
619 :session "org.freedesktop.xesam.searcher"
620 "/org/freedesktop/xesam/searcher/main"
621 "org.freedesktop.xesam.Search" "HitsAdded")
622
623@result{} (signal ((name . "HitsAdded"))
624 (arg ((name . "search") (type . "s")))
625 (arg ((name . "count") (type . "u")))
626 )
627@end lisp
628@end defun
629
630
631@node Properties and Annotations
632@section What else to know about interfaces.
633
634Interfaces can have properties. These can be exposed via the
635@samp{org.freedesktop.DBus.Properties} interface@footnote{See
636@uref{http://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces-properties}}.
637That is, properties can be retrieved and changed during lifetime of an
638element.
639
640Annotations, on the other hand, are static values for an element.
641Often, they are used to instruct generators, how to generate code from
642the interface for a given language binding.
643
644@defun dbus-introspect-get-property-names bus service path interface
645Return a list of strings with all property names of @var{interface} of
646@var{service} in D-Bus @var{bus} at object path @var{path}. Example:
647
648@lisp
649(dbus-introspect-get-property-names
650 :session "org.kde.kded" "/modules/networkstatus"
651 "org.kde.Solid.Networking.Client")
652
653@result{} ("Status")
654@end lisp
655
656If an interface declares properties, the corresponding element supports
657also the @samp{org.freedesktop.DBus.Properties} interface.
658@end defun
659
660@defun dbus-introspect-get-property bus service path interface property
661This function returns @var{property} of @var{interface} as XML element.
662It must be located at @var{service} in D-Bus @var{bus} at object path
663@var{path}. @var{property} must be a string, element of the list
664returned by @code{dbus-introspect-get-property-names}.
665
666A @var{property} value can be retrieved by the function
667@code{dbus-introspect-get-attribute}. Example:
668
669@lisp
670(dbus-introspect-get-property
671 :session "org.kde.kded" "/modules/networkstatus"
672 "org.kde.Solid.Networking.Client" "Status")
673
674@result{} (property ((access . "read") (type . "u") (name . "Status")))
675
676(dbus-introspect-get-attribute
677 (dbus-introspect-get-property
678 :session "org.kde.kded" "/modules/networkstatus"
679 "org.kde.Solid.Networking.Client" "Status")
680 "access")
681
682@result{} "read"
683@end lisp
684@end defun
685
686@defun dbus-get-property bus service path interface property
687This function returns the value of @var{property} of @var{interface}.
688It will be checked at @var{bus}, @var{service}, @var{path}. The
5bd55c3c 689result can be any valid D-Bus value, or @code{nil} if there is no
cd71b9ae
MA
690@var{property}. Example:
691
692@lisp
693(dbus-get-property
694 :session "org.kde.kded" "/modules/networkstatus"
695 "org.kde.Solid.Networking.Client" "Status")
696
697@result{} 4
698@end lisp
699@end defun
700
701@defun dbus-set-property bus service path interface property value
702Set value of @var{property} of @var{interface} to @var{value}. It
703will be checked at @var{bus}, @var{service}, @var{path}. When the
704value has been set successful, the result is @var{value}. Otherwise,
705@code{nil} is returned. Example:
706
707@lisp
708(dbus-set-property
709 :session "org.kde.kaccess" "/MainApplication"
710 "com.trolltech.Qt.QApplication" "doubleClickInterval" 500)
711
712@result{} 500
713@end lisp
714@end defun
715
716@defun dbus-get-all-properties bus service path interface
717This function returns all properties of @var{interface}. It will be
718checked at @var{bus}, @var{service}, @var{path}. The result is a list
719of cons. Every cons contains the name of the property, and its value.
720If there are no properties, @code{nil} is returned. Example:
721
722@lisp
723(dbus-get-all-properties
724 :session "org.kde.kaccess" "/MainApplication"
725 "com.trolltech.Qt.QApplication")
726
727@result{} (("cursorFlashTime" . 1000) ("doubleClickInterval" . 500)
728 ("keyboardInputInterval" . 400) ("wheelScrollLines" . 3)
729 ("globalStrut" 0 0) ("startDragTime" . 500)
730 ("startDragDistance" . 4) ("quitOnLastWindowClosed" . t)
731 ("styleSheet" . ""))
732@end lisp
733@end defun
734
735@defun dbus-introspect-get-annotation-names bus service path interface &optional name
736Return a list of all annotation names as list of strings. If
737@var{name} is @code{nil}, the annotations are children of
738@var{interface}, otherwise @var{name} must be a @code{method},
739@code{signal}, or @code{property} XML element, where the annotations
740belong to. Example:
741
742@lisp
743(dbus-introspect-get-annotation-names
744 :session "de.berlios.Pinot" "/de/berlios/Pinot"
745 "de.berlios.Pinot" "GetStatistics")
746
747@result{} ("de.berlios.Pinot.GetStatistics")
748@end lisp
749
750Default annotation names@footnote{See
751@uref{http://dbus.freedesktop.org/doc/dbus-specification.html#introspection-format}}
752are
753
754@table @samp
755@item org.freedesktop.DBus.Deprecated
756Whether or not the entity is deprecated; defaults to @code{nil}
757
758@item org.freedesktop.DBus.GLib.CSymbol
759The C symbol; may be used for @code{methods} and @code{interfaces}
760
761@item org.freedesktop.DBus.Method.NoReply
762If set, don't expect a reply to the @code{method} call; defaults to @code{nil}
763@end table
764@end defun
765
766@defun dbus-introspect-get-annotation bus service path interface name annotation
767Return annotation @var{ANNOTATION} as XML object. If @var{name} is
768@code{nil}, @var{ANNOTATION} is a child of @var{interface}, otherwise
769@var{name} must be the name of a @code{method}, @code{signal}, or
770@code{property} XML element, where the @var{ANNOTATION} belongs to.
771
772An attribute value can be retrieved by
773@code{dbus-introspect-get-attribute}. Example:
774
775@lisp
776(dbus-introspect-get-annotation
777 :session "de.berlios.Pinot" "/de/berlios/Pinot"
778 "de.berlios.Pinot" "GetStatistics"
779 "de.berlios.Pinot.GetStatistics")
780
781@result{} (annotation ((name . "de.berlios.Pinot.GetStatistics")
782 (value . "pinotDBus")))
783
784(dbus-introspect-get-attribute
785 (dbus-introspect-get-annotation
786 :session "de.berlios.Pinot" "/de/berlios/Pinot"
787 "de.berlios.Pinot" "GetStatistics"
788 "de.berlios.Pinot.GetStatistics")
789 "value")
790
791@result{} "pinotDBus"
792@end lisp
793@end defun
794
795
796@node Arguments and Signatures
797@section The final details.
798
799Methods and signals have arguments. They are described in the
800@code{arg} XML elements.
801
802@defun dbus-introspect-get-argument-names bus service path interface name
803Return a list of all argument names as list of strings. @var{name}
804must be a @code{method} or @code{signal} XML element. Example:
805
806@lisp
807(dbus-introspect-get-argument-names
808 :session "org.freedesktop.xesam.searcher"
809 "/org/freedesktop/xesam/searcher/main"
810 "org.freedesktop.xesam.Search" "GetHitData")
811
812@result{} ("search" "hit_ids" "fields" "hit_data")
813@end lisp
814
815Argument names are optional; the function can return @code{nil}
816therefore, even if the method or signal has arguments.
817@end defun
818
819@defun dbus-introspect-get-argument bus service path interface name arg
820Return argument @var{ARG} as XML object. @var{name}
821must be a @code{method} or @code{signal} XML element. Example:
822
823@lisp
824(dbus-introspect-get-argument
825 :session "org.freedesktop.xesam.searcher"
826 "/org/freedesktop/xesam/searcher/main"
827 "org.freedesktop.xesam.Search" "GetHitData" "search")
828
829@result{} (arg ((name . "search") (type . "s") (direction . "in")))
830@end lisp
831@end defun
832
833@defun dbus-introspect-get-signature bus service path interface name &optional direction
834Return signature of a @code{method} or @code{signal}, represented by
835@var{name}, as string.
836
837If @var{name} is a @code{method}, @var{direction} can be either
838@samp{in} or @samp{out}. If @var{direction} is @code{nil}, @samp{in}
839is assumed.
840
841If @var{name} is a @code{signal}, and @var{direction} is
842non-@code{nil}, @var{direction} must be @samp{out}. Example:
843
844@lisp
845(dbus-introspect-get-signature
846 :session "org.freedesktop.xesam.searcher"
847 "/org/freedesktop/xesam/searcher/main"
848 "org.freedesktop.xesam.Search" "GetHitData" "in")
849
850@result{} "sauas"
851
852(dbus-introspect-get-signature
853 :session "org.freedesktop.xesam.searcher"
854 "/org/freedesktop/xesam/searcher/main"
855 "org.freedesktop.xesam.Search" "HitsAdded")
856
21956b56 857@result{} "su"
cd71b9ae
MA
858@end lisp
859@end defun
860
22d8ac3a
MA
861
862@node Type Conversion
863@chapter Mapping Lisp types and D-Bus types.
864@cindex type conversion
865
866D-Bus method calls and signals accept usually several arguments as
867parameters, either as input parameter, or as output parameter. Every
868argument belongs to a D-Bus type.
869
6a31c819 870Such arguments must be mapped between the value encoded as a D-Bus
22d8ac3a
MA
871type, and the corresponding type of Lisp objects. The mapping is
872applied Lisp object @expansion{} D-Bus type for input parameters, and
873D-Bus type @expansion{} Lisp object for output parameters.
874
875
876@section Input parameters.
877
878Input parameters for D-Bus methods and signals occur as arguments of a
6a31c819 879Lisp function call. The following mapping to D-Bus types is
22d8ac3a
MA
880applied, when the corresponding D-Bus message is created:
881
882@example
5bd55c3c 883@multitable {negative integer} {@expansion{}} {DBUS_TYPE_BOOLEAN}
22d8ac3a
MA
884@item Lisp type @tab @tab D-Bus type
885@item
886@item @code{t} and @code{nil} @tab @expansion{} @tab DBUS_TYPE_BOOLEAN
5bd55c3c
MA
887@item natural number @tab @expansion{} @tab DBUS_TYPE_UINT32
888@item negative integer @tab @expansion{} @tab DBUS_TYPE_INT32
22d8ac3a
MA
889@item float @tab @expansion{} @tab DBUS_TYPE_DOUBLE
890@item string @tab @expansion{} @tab DBUS_TYPE_STRING
6a31c819 891@item list @tab @expansion{} @tab DBUS_TYPE_ARRAY
22d8ac3a
MA
892@end multitable
893@end example
894
6a31c819 895Other Lisp objects, like symbols or hash tables, are not accepted as
61cf3a76 896input parameters.
6a31c819
MA
897
898If it is necessary to use another D-Bus type, a corresponding type
61cf3a76 899symbol can be prepended to the corresponding Lisp object. Basic D-Bus
d4e67bc5
MA
900types are represented by the type symbols @code{:byte},
901@code{:boolean}, @code{:int16}, @code{:uint16}, @code{:int32},
902@code{:uint32}, @code{:int64}, @code{:uint64}, @code{:double},
6f8fc60c
MA
903@code{:string}, @code{:object-path}, @code{:signature} and
904@code{:unix-fd}.
6a31c819 905
22d8ac3a 906@noindent
6a31c819
MA
907Example:
908
909@lisp
5bd55c3c 910(dbus-call-method @dots{} @var{NAT-NUMBER} @var{STRING})
6a31c819
MA
911@end lisp
912
913is equivalent to
914
915@lisp
5bd55c3c 916(dbus-call-method @dots{} :uint32 @var{NAT-NUMBER} :string @var{STRING})
6a31c819
MA
917@end lisp
918
919but different to
920
921@lisp
5bd55c3c 922(dbus-call-method @dots{} :int32 @var{NAT-NUMBER} :signature @var{STRING})
6a31c819
MA
923@end lisp
924
4db2806c
MA
925The value for a byte D-Bus type can be any integer in the range 0
926through 255. If a character is used as argument, modifiers
927represented outside this range are stripped of. For example,
928@code{:byte ?x} is equal to @code{:byte ?\M-x}, but it is not equal to
929@code{:byte ?\C-x} or @code{:byte ?\M-\C-x}.
c9ecb5a7 930
4db2806c
MA
931A D-Bus compound type is always represented as a list. The @sc{car}
932of this list can be the type symbol @code{:array}, @code{:variant},
d4e67bc5
MA
933@code{:struct} or @code{:dict-entry}, which would result in a
934corresponding D-Bus container. @code{:array} is optional, because
4db2806c 935this is the default compound D-Bus type for a list.
6a31c819
MA
936
937The objects being elements of the list are checked according to the
938D-Bus compound type rules.
939
940@itemize
4db2806c
MA
941@item An array must contain only elements of the same D-Bus type. It
942can be empty.
943
6a31c819 944@item A variant must contain only one single element.
4db2806c 945
6a31c819 946@item A dictionary entry must be element of an array, and it must
4db2806c
MA
947contain only a key-value pair of two elements, with a basic D-Bus type
948key.
949
6a31c819
MA
950@item There is no restriction for structs.
951@end itemize
952
4db2806c
MA
953If an empty array needs an element D-Bus type other than string, it
954can contain exactly one element of D-Bus type @code{:signature}. The
955value of this element (a string) is used as the signature of the
956elements of this array. Example:
6a31c819
MA
957
958@lisp
4db2806c
MA
959(dbus-call-method
960 :session "org.freedesktop.Notifications"
961 "/org/freedesktop/Notifications"
962 "org.freedesktop.Notifications" "Notify"
963 "GNU Emacs" ;; Application name.
964 0 ;; No replacement of other notifications.
965 "" ;; No icon.
966 "Notification summary" ;; Summary.
967 (format ;; Body.
968 "This is a test notification, raised from %s" (emacs-version))
969 '(:array) ;; No actions (empty array of strings).
970 '(:array :signature "@{sv@}") ;; No hints
971 ;; (empty array of dictionary entries).
0ecd3c90 972 :int32 -1) ;; Default timeout.
4db2806c
MA
973
974@result{} 3
6a31c819 975@end lisp
22d8ac3a 976
ace706d1
MA
977@defun dbus-string-to-byte-array string
978Sometimes, D-Bus methods require as input parameter an array of bytes,
979instead of a string. If it is guaranteed, that @var{string} is an
980UTF8 string, this function performs the conversion. Example:
981
982@lisp
983(dbus-string-to-byte-array "/etc/hosts")
984
985@result{} (:array :byte 47 :byte 101 :byte 116 :byte 99 :byte 47
986 :byte 104 :byte 111 :byte 115 :byte 116 :byte 115)
987@end lisp
988@end defun
989
990@defun dbus-escape-as-identifier string
991Escape an arbitrary @var{string} so it follows the rules for a C
992identifier. The escaped string can be used as object path component,
993interface element component, bus name component or member name in
994D-Bus.
995
996The escaping consists of replacing all non-alphanumerics, and the
997first character if it's a digit, with an underscore and two
998lower-case hex digits. As a special case, "" is escaped to
999"_". Example:
1000
1001@lisp
1002(dbus-escape-as-identifier "0123abc_xyz\x01\xff")
1003
1004@result{} "_30123abc_5fxyz_01_ff"
1005@end lisp
1006@end defun
1007
22d8ac3a
MA
1008
1009@section Output parameters.
1010
1011Output parameters of D-Bus methods and signals are mapped to Lisp
6a31c819 1012objects.
22d8ac3a
MA
1013
1014@example
5bd55c3c 1015@multitable {DBUS_TYPE_OBJECT_PATH} {@expansion{}} {natural number or float}
22d8ac3a
MA
1016@item D-Bus type @tab @tab Lisp type
1017@item
1018@item DBUS_TYPE_BOOLEAN @tab @expansion{} @tab @code{t} or @code{nil}
5bd55c3c
MA
1019@item DBUS_TYPE_BYTE @tab @expansion{} @tab natural number
1020@item DBUS_TYPE_UINT16 @tab @expansion{} @tab natural number
1021@item DBUS_TYPE_INT16 @tab @expansion{} @tab integer
1022@item DBUS_TYPE_UINT32 @tab @expansion{} @tab natural number or float
6f8fc60c 1023@item DBUS_TYPE_UNIX_FD @tab @expansion{} @tab natural number or float
5bd55c3c
MA
1024@item DBUS_TYPE_INT32 @tab @expansion{} @tab integer or float
1025@item DBUS_TYPE_UINT64 @tab @expansion{} @tab natural number or float
1026@item DBUS_TYPE_INT64 @tab @expansion{} @tab integer or float
22d8ac3a
MA
1027@item DBUS_TYPE_DOUBLE @tab @expansion{} @tab float
1028@item DBUS_TYPE_STRING @tab @expansion{} @tab string
1029@item DBUS_TYPE_OBJECT_PATH @tab @expansion{} @tab string
6a31c819 1030@item DBUS_TYPE_SIGNATURE @tab @expansion{} @tab string
22d8ac3a
MA
1031@item DBUS_TYPE_ARRAY @tab @expansion{} @tab list
1032@item DBUS_TYPE_VARIANT @tab @expansion{} @tab list
1033@item DBUS_TYPE_STRUCT @tab @expansion{} @tab list
1034@item DBUS_TYPE_DICT_ENTRY @tab @expansion{} @tab list
1035@end multitable
1036@end example
1037
d4e67bc5 1038A float object in case of @code{DBUS_TYPE_UINT32},
6f8fc60c
MA
1039@code{DBUS_TYPE_INT32}, @code{DBUS_TYPE_UINT64},
1040@code{DBUS_TYPE_INT64} and @code{DBUS_TYPE_UNIX_FD} is returned, when
1041the C value exceeds the Emacs number size range.
d4e67bc5 1042
22d8ac3a
MA
1043The resulting list of the last 4 D-Bus compound types contains as
1044elements the elements of the D-Bus container, mapped according to the
1045same rules.
1046
1047The signal @code{PropertyModified}, discussed as example in
1048@ref{Inspection}, would offer as Lisp data the following object
1049(@var{BOOL} stands here for either @code{nil} or @code{t}):
1050
1051@lisp
5bd55c3c 1052(@var{INTEGER} ((@var{STRING} @var{BOOL} @var{BOOL}) (@var{STRING} @var{BOOL} @var{BOOL}) @dots{}))
22d8ac3a
MA
1053@end lisp
1054
ace706d1
MA
1055@defun dbus-byte-array-to-string byte-array
1056If a D-Bus method or signal returns an array of bytes, which are known
1057to represent an UTF8 string, this function converts @var{byte-array}
1058to the corresponding string. Example:
1059
1060@lisp
1061(dbus-byte-array-to-string '(47 101 116 99 47 104 111 115 116 115))
1062
1063@result{} "/etc/hosts"
1064@end lisp
1065@end defun
1066
1067@defun dbus-unescape-from-identifier string
1068Retrieve the original string from the encoded @var{string}.
1069@var{string} must have been coded with
1070@code{dbus-escape-as-identifier}. Example:
1071
1072@lisp
1073(dbus-unescape-from-identifier "_30123abc_5fxyz_01_ff")
1074
fa0f81b0
AS
1075@ifinfo
1076@result{} "0123abc_xyz^Aÿ"
1077@end ifinfo
1078@ifnotinfo
1079@result{} "0123abc_xyz^A@"y"
1080@end ifnotinfo
ace706d1
MA
1081@end lisp
1082@end defun
1083
22d8ac3a
MA
1084
1085@node Synchronous Methods
1086@chapter Calling methods in a blocking way.
1087@cindex method calls, synchronous
1088@cindex synchronous method calls
1089
1090Methods can be called synchronously (@dfn{blocking}) or asynchronously
21956b56 1091(@dfn{non-blocking}).
22d8ac3a
MA
1092
1093At D-Bus level, a method call consist of two messages: one message
1094which carries the input parameters to the object owning the method to
1095be called, and a reply message returning the resulting output
1096parameters from the object.
1097
134ce16c 1098@defun dbus-call-method bus service path interface method &optional :timeout timeout &rest args
22d8ac3a
MA
1099This function calls @var{method} on the D-Bus @var{bus}. @var{bus} is
1100either the symbol @code{:system} or the symbol @code{:session}.
1101
1102@var{service} is the D-Bus service name to be used. @var{path} is the
1103D-Bus object path, @var{service} is registered at. @var{interface} is
1104an interface offered by @var{service}. It must provide @var{method}.
1105
134ce16c 1106If the parameter @code{:timeout} is given, the following integer
21956b56 1107@var{timeout} specifies the maximum number of milliseconds the method
ecd3d54f 1108call must return. The default value is 25,000. If the method call
134ce16c
MA
1109doesn't return in time, a D-Bus error is raised (@pxref{Errors and
1110Events}).
1111
22d8ac3a
MA
1112All other arguments args are passed to @var{method} as arguments.
1113They are converted into D-Bus types as described in @ref{Type
1114Conversion}.
1115
1116The function returns the resulting values of @var{method} as a list of
1117Lisp objects, according to the type conversion rules described in
1118@ref{Type Conversion}. Example:
1119
06c0751a 1120@lisp
22d8ac3a 1121(dbus-call-method
0ce574ef
MA
1122 :session "org.gnome.seahorse" "/org/gnome/seahorse/keys/openpgp"
1123 "org.gnome.seahorse.Keys" "GetKeyField"
22d8ac3a
MA
1124 "openpgp:657984B8C7A966DD" "simple-name")
1125
1126@result{} (t ("Philip R. Zimmermann"))
06c0751a 1127@end lisp
22d8ac3a
MA
1128
1129If the result of the method call is just one value, the converted Lisp
1130object is returned instead of a list containing this single Lisp
1131object. Example:
1132
06c0751a 1133@lisp
22d8ac3a 1134(dbus-call-method
0ce574ef
MA
1135 :system "org.freedesktop.Hal"
1136 "/org/freedesktop/Hal/devices/computer"
1137 "org.freedesktop.Hal.Device" "GetPropertyString"
22d8ac3a
MA
1138 "system.kernel.machine")
1139
1140@result{} "i686"
06c0751a 1141@end lisp
22d8ac3a
MA
1142
1143With the @code{dbus-introspect} function it is possible to explore the
1144interfaces of @samp{org.freedesktop.Hal} service. It offers the
1145interfaces @samp{org.freedesktop.Hal.Manager} for the object at the
1146path @samp{/org/freedesktop/Hal/Manager} as well as the interface
1147@samp{org.freedesktop.Hal.Device} for all objects prefixed with the
1148path @samp{/org/freedesktop/Hal/devices}. With the methods
1149@samp{GetAllDevices} and @samp{GetAllProperties}, it is simple to
1150emulate the @code{lshal} command on GNU/Linux systems:
1151
06c0751a 1152@lisp
22d8ac3a
MA
1153(dolist (device
1154 (dbus-call-method
0ce574ef 1155 :system "org.freedesktop.Hal"
22d8ac3a 1156 "/org/freedesktop/Hal/Manager"
0ce574ef 1157 "org.freedesktop.Hal.Manager" "GetAllDevices"))
22d8ac3a
MA
1158 (message "\nudi = %s" device)
1159 (dolist (properties
1160 (dbus-call-method
0ce574ef
MA
1161 :system "org.freedesktop.Hal" device
1162 "org.freedesktop.Hal.Device" "GetAllProperties"))
22d8ac3a
MA
1163 (message " %s = %S"
1164 (car properties) (or (caar (cdr properties)) ""))))
1165
7b13a0f2 1166@print{} "udi = /org/freedesktop/Hal/devices/computer
d9e21158
MA
1167 info.addons = (\"hald-addon-acpi\")
1168 info.bus = \"unknown\"
1169 info.product = \"Computer\"
1170 info.subsystem = \"unknown\"
1171 info.udi = \"/org/freedesktop/Hal/devices/computer\"
1172 linux.sysfs_path_device = \"(none)\"
1173 power_management.acpi.linux.version = \"20051216\"
1174 power_management.can_suspend_to_disk = t
1175 power_management.can_suspend_to_ram = \"\"
1176 power_management.type = \"acpi\"
1177 smbios.bios.release_date = \"11/07/2001\"
1178 system.chassis.manufacturer = \"COMPAL\"
1179 system.chassis.type = \"Notebook\"
1180 system.firmware.release_date = \"03/19/2005\"
c9ecb5a7 1181 @dots{}"
06c0751a 1182@end lisp
22d8ac3a
MA
1183@end defun
1184
21956b56
MA
1185@defun dbus-call-method-non-blocking bus service path interface method &optional :timeout timeout &rest args
1186Call @var{method} on the D-Bus @var{bus}, but don't block the event queue.
1187This is necessary for communicating to registered D-Bus methods,
1188which are running in the same Emacs process.
1189
1190The arguments are the same as in @code{dbus-call-method}. Example:
1191
1192@lisp
1193(dbus-call-method-non-blocking
1194 :system "org.freedesktop.Hal"
1195 "/org/freedesktop/Hal/devices/computer"
1196 "org.freedesktop.Hal.Device" "GetPropertyString"
1197 "system.kernel.machine")
1198
1199@result{} "i686"
1200@end lisp
1201@end defun
1202
1203
1204@node Asynchronous Methods
1205@chapter Calling methods non-blocking.
1206@cindex method calls, asynchronous
1207@cindex asynchronous method calls
1208
1209@defun dbus-call-method-asynchronously bus service path interface method handler &optional :timeout timeout &rest args
1210This function calls @var{method} on the D-Bus @var{bus}
1211asynchronously. @var{bus} is either the symbol @code{:system} or the
1212symbol @code{:session}.
1213
1214@var{service} is the D-Bus service name to be used. @var{path} is the
1215D-Bus object path, @var{service} is registered at. @var{interface} is
1216an interface offered by @var{service}. It must provide @var{method}.
1217
1218@var{handler} is a Lisp function, which is called when the
4f22e84d
MA
1219corresponding return message has arrived. If @var{handler} is
1220@code{nil}, no return message will be expected.
21956b56
MA
1221
1222If the parameter @code{:timeout} is given, the following integer
1223@var{timeout} specifies the maximum number of milliseconds a reply
ecd3d54f 1224message must arrive. The default value is 25,000. If there is no
21956b56
MA
1225reply message in time, a D-Bus error is raised (@pxref{Errors and
1226Events}).
1227
1228All other arguments args are passed to @var{method} as arguments.
1229They are converted into D-Bus types as described in @ref{Type
1230Conversion}.
1231
4f22e84d 1232Unless @var{handler} is @code{nil}, the function returns a key into
0ecd3c90 1233the hash table @code{dbus-registered-objects-table}. The
4f22e84d
MA
1234corresponding entry in the hash table is removed, when the return
1235message has been arrived, and @var{handler} is called. Example:
21956b56
MA
1236
1237@lisp
1238(dbus-call-method-asynchronously
1239 :system "org.freedesktop.Hal"
1240 "/org/freedesktop/Hal/devices/computer"
1241 "org.freedesktop.Hal.Device" "GetPropertyString" 'message
1242 "system.kernel.machine")
1243
1244@result{} (:system 2)
1245
1246@print{} i686
1247@end lisp
1248@end defun
1249
22d8ac3a 1250
addb7f2e
MA
1251@node Receiving Method Calls
1252@chapter Offering own methods.
1253@cindex method calls, returning
1254@cindex returning method calls
1255
8c904d82
MA
1256In order to register methods on the D-Bus, Emacs has to request a well
1257known name on the D-Bus under which it will be available for other
1258clients. Names on the D-Bus can be registered and unregistered using
1259the following functions:
1260
1261@defun dbus-register-service bus service &rest flags
1262Register the known name @var{service} on D-Bus @var{bus}.
1263
1264@var{bus} is either the symbol @code{:system} or the symbol
1265@code{:session}.
1266
1267@var{service} is the service name to be registered on the D-Bus. It
1268must be a known name.
1269
1270@var{flags} is a subset of the following keywords:
1271
1272@itemize
1273@item @code{:allow-replacement}: Allow another service to become the primary
1274owner if requested.
1275
1276@item @code{:replace-existing}: Request to replace the current primary owner.
1277
1278@item @code{:do-not-queue}: If we can not become the primary owner do not
1279place us in the queue.
1280@end itemize
1281
1282One of the following keywords is returned:
1283
1284@itemize
1285
1286@item @code{:primary-owner}: We have become the primary owner of the name
1287@var{service}.
1288
1289@item @code{:in-queue}: We could not become the primary owner and
1290have been placed in the queue.
1291
1292@item @code{:exists}: We already are in the queue.
1293
1294@item @code{:already-owner}: We already are the primary
1295owner.
1296@end itemize
1297@end defun
1298
1299@defun dbus-unregister-service bus service
1300Unregister all objects from D-Bus @var{bus}, registered by Emacs for
1301@var{service}.
1302
1303@var{bus} is either the symbol @code{:system} or the symbol
1304@code{:session}.
1305
1306@var{service} is the D-Bus service name of the D-Bus. It must be a
1307known name. Emacs releases its association to @var{service} from
1308D-Bus.
1309
1310One of the following keywords is returned:
1311
1312@itemize
1313@item @code{:released}: We successfully released the name @var{service}.
1314@item @code{:non-existent}: The name @var{service} does not exist on the bus.
1315@item @code{:not-owner}: We are not an owner of the name @var{service}.
1316@end itemize
1317@end defun
1318
1319When a name has been chosen, Emacs can offer own methods, which can be
1320called by other applications. These methods could be an
1321implementation of an interface of a well known service, like
1322@samp{org.freedesktop.TextEditor}.
addb7f2e
MA
1323
1324It could be also an implementation of an own interface. In this case,
cd71b9ae
MA
1325the service name must be @samp{org.gnu.Emacs}. The object path shall
1326begin with @samp{/org/gnu/Emacs/@strong{Application}/}, and the
addb7f2e 1327interface name shall be @code{org.gnu.Emacs.@strong{Application}}.
cd71b9ae 1328@samp{@strong{Application}} is the name of the application which
addb7f2e
MA
1329provides the interface.
1330
ace706d1
MA
1331@deffn Constant dbus-service-emacs
1332The well known service name of Emacs.
1333@end deffn
1334
1335@deffn Constant dbus-path-emacs
1336The object path head "/org/gnu/Emacs" used by Emacs. All object
1337paths, used by offered methods or signals, shall start with this
1338string.
1339@end deffn
1340
0fadf00e 1341@defun dbus-register-method bus service path interface method handler dont-register-service
addb7f2e
MA
1342With this function, an application registers @var{method} on the D-Bus
1343@var{bus}.
1344
1345@var{bus} is either the symbol @code{:system} or the symbol
1346@code{:session}.
1347
1348@var{service} is the D-Bus service name of the D-Bus object
0fadf00e
MA
1349@var{method} is registered for. It must be a known name (See
1350discussion of @var{dont-register-service} below).
addb7f2e 1351
0fadf00e
MA
1352@var{path} is the D-Bus object path @var{service} is registered (See
1353discussion of @var{dont-register-service} below).
addb7f2e
MA
1354
1355@var{interface} is the interface offered by @var{service}. It must
1356provide @var{method}.
1357
ac134f2f
RS
1358@var{handler} is a Lisp function to be called when a @var{method} call
1359is received. It must accept as arguments the input arguments of
1360@var{method}. @var{handler} should return a list, whose elements are
1361to be used as arguments for the reply message of @var{method}. This
1362list can be composed like the input parameters in @ref{Type
1363Conversion}.
1364
1365If @var{handler} wants to return just one Lisp object and it is not a
1366cons cell, @var{handler} can return this object directly, instead of
1367returning a list containing the object.
addb7f2e 1368
42fb7e61
MA
1369In case @var{handler} shall return a reply message with an empty
1370argument list, @var{handler} must return the symbol @code{:ignore}.
1371
0fadf00e
MA
1372When @var{dont-register-service} is non-@code{nil}, the known name
1373@var{service} is not registered. This means that other D-Bus clients
1374have no way of noticing the newly registered method. When interfaces
1375are constructed incrementally by adding single methods or properties
8c904d82 1376at a time, @var{dont-register-service} can be used to prevent other
0fadf00e
MA
1377clients from discovering the still incomplete interface.
1378
4a7c4c40 1379The default D-Bus timeout when waiting for a message reply is 25
134ce16c
MA
1380seconds. This value could be even smaller, depending on the calling
1381client. Therefore, @var{handler} shall not last longer than
4a7c4c40
MA
1382absolutely necessary.
1383
9b7993b4 1384@code{dbus-register-method} returns a Lisp object, which can be used
addb7f2e
MA
1385as argument in @code{dbus-unregister-object} for removing the
1386registration for @var{method}. Example:
1387
06c0751a 1388@lisp
addb7f2e
MA
1389(defun my-dbus-method-handler (filename)
1390 (let (result)
1391 (if (find-file filename)
1392 (setq result '(:boolean t))
1393 (setq result '(:boolean nil)))
1394 result))
1395
1396@result{} my-dbus-method-handler
1397
1398(dbus-register-method
1399 :session "org.freedesktop.TextEditor" "/org/freedesktop/TextEditor"
1400 "org.freedesktop.TextEditor" "OpenFile"
1401 'my-dbus-method-handler)
1402
eb932e8a 1403@result{} ((:session "org.freedesktop.TextEditor" "OpenFile")
addb7f2e 1404 ("org.freedesktop.TextEditor" "/org/freedesktop/TextEditor"
eb932e8a 1405 my-dbus-method-handler))
06c0751a 1406@end lisp
addb7f2e 1407
cd71b9ae 1408If you invoke the method @samp{org.freedesktop.TextEditor.OpenFile}
addb7f2e
MA
1409from another D-Bus application with a filename as parameter, the file
1410is opened in Emacs, and the method returns either @var{true} or
0ecd3c90 1411@var{false}, indicating the success of the method. As test tool one
addb7f2e
MA
1412could use the command line tool @code{dbus-send} in a shell:
1413
1414@example
1415# dbus-send --session --print-reply \
1416 --dest="org.freedesktop.TextEditor" \
1417 "/org/freedesktop/TextEditor" \
1418 "org.freedesktop.TextEditor.OpenFile" string:"/etc/hosts"
1419
1420@print{} method return sender=:1.22 -> dest=:1.23 reply_serial=2
eb932e8a
MA
1421 boolean true
1422@end example
1423
1424You can indicate an error by raising the Emacs signal
1425@code{dbus-error}. The handler above could be changed like this:
1426
1427@lisp
1428(defun my-dbus-method-handler (&rest args)
1429 (unless (and (= (length args) 1) (stringp (car args)))
1430 (signal 'dbus-error (list (format "Wrong argument list: %S" args))))
1431 (condition-case err
1432 (find-file (car args))
1433 (error (signal 'dbus-error (cdr err))))
1434 t)
1435
1436@result{} my-dbus-method-handler
1437@end lisp
1438
1439The test runs then
1440
1441@example
1442# dbus-send --session --print-reply \
1443 --dest="org.freedesktop.TextEditor" \
1444 "/org/freedesktop/TextEditor" \
1445 "org.freedesktop.TextEditor.OpenFile" \
1446 string:"/etc/hosts" string:"/etc/passwd"
1447
1448@print{} Error org.freedesktop.DBus.Error.Failed:
1449 Wrong argument list: ("/etc/hosts" "/etc/passwd")
addb7f2e
MA
1450@end example
1451@end defun
1452
0fadf00e 1453@defun dbus-register-property bus service path interface property access value &optional emits-signal dont-register-service
0ecd3c90
MA
1454With this function, an application declares a @var{property} on the D-Bus
1455@var{bus}.
1456
1457@var{bus} is either the symbol @code{:system} or the symbol
1458@code{:session}.
1459
1460@var{service} is the D-Bus service name of the D-Bus. It must be a
1461known name.
1462
0fadf00e
MA
1463@var{path} is the D-Bus object path @var{service} is registered (See
1464discussion of @var{dont-register-service} below).
0ecd3c90
MA
1465
1466@var{interface} is the name of the interface used at @var{path},
1467@var{property} is the name of the property of @var{interface}.
1468
1469@var{access} indicates, whether the property can be changed by other
1470services via D-Bus. It must be either the symbol @code{:read} or
1471@code{:readwrite}. @var{value} is the initial value of the property,
1472it can be of any valid type (see @code{dbus-call-method} for details).
1473
1474If @var{property} already exists on @var{path}, it will be
1475overwritten. For properties with access type @code{:read} this is the
1476only way to change their values. Properties with access type
1477@code{:readwrite} can be changed by @code{dbus-set-property}.
1478
1479The interface @samp{org.freedesktop.DBus.Properties} is added to
1480@var{path}, including a default handler for the @samp{Get},
820ae8fe 1481@samp{GetAll} and @samp{Set} methods of this interface. When
5bd55c3c
MA
1482@var{emits-signal} is non-@code{nil}, the signal
1483@samp{PropertiesChanged} is sent when the property is changed by
1484@code{dbus-set-property}.
820ae8fe 1485
0fadf00e
MA
1486When @var{dont-register-service} is non-@code{nil}, the known name
1487@var{service} is not registered. This means that other D-Bus clients
1488have no way of noticing the newly registered method. When interfaces
1489are constructed incrementally by adding single methods or properties
8c904d82 1490at a time, @var{dont-register-service} can be used to prevent other
0fadf00e
MA
1491clients from discovering the still incomplete interface.
1492
820ae8fe 1493@noindent Example:
0ecd3c90
MA
1494
1495@lisp
1496(dbus-register-property
1497 :session "org.freedesktop.TextEditor" "/org/freedesktop/TextEditor"
1498 "org.freedesktop.TextEditor" "name" :read "GNU Emacs")
1499
1500@result{} ((:session "org.freedesktop.TextEditor" "name")
1501 ("org.freedesktop.TextEditor" "/org/freedesktop/TextEditor"))
1502
1503(dbus-register-property
1504 :session "org.freedesktop.TextEditor" "/org/freedesktop/TextEditor"
820ae8fe 1505 "org.freedesktop.TextEditor" "version" :readwrite emacs-version t)
0ecd3c90
MA
1506
1507@result{} ((:session "org.freedesktop.TextEditor" "version")
1508 ("org.freedesktop.TextEditor" "/org/freedesktop/TextEditor"))
1509@end lisp
1510
1511Other D-Bus applications can read the property via the default methods
1512@samp{org.freedesktop.DBus.Properties.Get} and
1513@samp{org.freedesktop.DBus.Properties.GetAll}. Testing is also
1514possible via the command line tool @code{dbus-send} in a shell:
1515
1516@example
1517# dbus-send --session --print-reply \
1518 --dest="org.freedesktop.TextEditor" \
1519 "/org/freedesktop/TextEditor" \
1520 "org.freedesktop.DBus.Properties.GetAll" \
1521 string:"org.freedesktop.TextEditor"
1522
1523@print{} method return sender=:1.22 -> dest=:1.23 reply_serial=3
1524 array [
1525 dict entry(
1526 string "name"
1527 variant string "GNU Emacs"
1528 )
1529 dict entry(
1530 string "version"
1531 variant string "23.1.50.5"
1532 )
1533 ]
1534@end example
1535
1536It is also possible, to apply the @code{dbus-get-property},
1537@code{dbus-get-all-properties} and @code{dbus-set-property} functions
1538(@pxref{Properties and Annotations}).
1539
1540@lisp
1541(dbus-set-property
1542 :session "org.freedesktop.TextEditor" "/org/freedesktop/TextEditor"
1543 "org.freedesktop.TextEditor" "version" "23.1.50")
1544
1545@result{} "23.1.50"
1546
1547(dbus-get-property
1548 :session "org.freedesktop.TextEditor" "/org/freedesktop/TextEditor"
1549 "org.freedesktop.TextEditor" "version")
1550
1551@result{} "23.1.50"
1552@end lisp
1553@end defun
1554
1555@defun dbus-unregister-object object
1556Unregister @var{object} from the D-Bus. @var{object} must be the
1557result of a preceding @code{dbus-register-method},
1558@code{dbus-register-property} or @code{dbus-register-signal} call
1559(@pxref{Signals}). It returns @code{t} if @var{object} has been
1560unregistered, @code{nil} otherwise.
1561
1562When @var{object} identifies the last method or property, which is
1563registered for the respective service, Emacs releases its association
1564to the service from D-Bus.
1565@end defun
977640ed 1566
addb7f2e 1567
22d8ac3a
MA
1568@node Signals
1569@chapter Sending and receiving signals.
1570@cindex signals
1571
1572Signals are broadcast messages. They carry input parameters, which
1573are received by all objects which have registered for such a signal.
1574
0ce574ef 1575@defun dbus-send-signal bus service path interface signal &rest args
22d8ac3a
MA
1576This function is similar to @code{dbus-call-method}. The difference
1577is, that there are no returning output parameters.
1578
1579The function emits @var{signal} on the D-Bus @var{bus}. @var{bus} is
1580either the symbol @code{:system} or the symbol @code{:session}. It
1581doesn't matter whether another object has registered for @var{signal}.
1582
1583@var{service} is the D-Bus service name of the object the signal is
1584emitted from. @var{path} is the corresponding D-Bus object path,
1585@var{service} is registered at. @var{interface} is an interface
1586offered by @var{service}. It must provide @var{signal}.
1587
1588All other arguments args are passed to @var{signal} as arguments.
1589They are converted into D-Bus types as described in @ref{Type
1590Conversion}. Example:
1591
06c0751a 1592@lisp
22d8ac3a 1593(dbus-send-signal
ace706d1
MA
1594 :session dbus-service-emacs dbus-path-emacs
1595 (concat dbus-service-emacs ".FileManager") "FileModified"
1596 "/home/albinus/.emacs")
06c0751a 1597@end lisp
22d8ac3a
MA
1598@end defun
1599
9b7993b4 1600@defun dbus-register-signal bus service path interface signal handler &rest args
22d8ac3a
MA
1601With this function, an application registers for @var{signal} on the
1602D-Bus @var{bus}.
1603
1604@var{bus} is either the symbol @code{:system} or the symbol
1605@code{:session}.
1606
a4397af9
MA
1607@var{service} is the D-Bus service name used by the sending D-Bus
1608object. It can be either a known name or the unique name of the D-Bus
1609object sending the signal. In case of a unique name, signals won't be
1610received any longer once the object owning this unique name has
1611disappeared, and a new queued object has replaced it.
1612
1613When @var{service} is @code{nil}, related signals from all D-Bus
1614objects shall be accepted.
1615
1616@var{path} is the corresponding D-Bus object path, @var{service} is
1617registered at. It can also be @code{nil} if the path name of incoming
1618signals shall not be checked.
1619
1620@var{interface} is an interface offered by @var{service}. It must
1621provide @var{signal}.
22d8ac3a
MA
1622
1623@var{handler} is a Lisp function to be called when the @var{signal} is
1624received. It must accept as arguments the output parameters
9b7993b4
MA
1625@var{signal} is sending.
1626
1627All other arguments @var{args}, if specified, must be strings. They
1628stand for the respective arguments of @var{signal} in their order, and
1629are used for filtering as well. A @code{nil} argument might be used
1630to preserve the order.
1631
1632@code{dbus-register-signal} returns a Lisp object, which can be used
1633as argument in @code{dbus-unregister-object} for removing the
1634registration for @var{signal}. Example:
22d8ac3a 1635
06c0751a 1636@lisp
22d8ac3a
MA
1637(defun my-dbus-signal-handler (device)
1638 (message "Device %s added" device))
1639
0ce574ef
MA
1640@result{} my-dbus-signal-handler
1641
22d8ac3a 1642(dbus-register-signal
0ce574ef
MA
1643 :system "org.freedesktop.Hal" "/org/freedesktop/Hal/Manager"
1644 "org.freedesktop.Hal.Manager" "DeviceAdded"
22d8ac3a
MA
1645 'my-dbus-signal-handler)
1646
cd71c3ef
MA
1647@result{} ((:system "org.freedesktop.Hal.Manager" "DeviceAdded")
1648 ("org.freedesktop.Hal" "/org/freedesktop/Hal/Manager"
1649 my-signal-handler))
06c0751a 1650@end lisp
22d8ac3a 1651
cd71b9ae
MA
1652As we know from the introspection data of interface
1653@samp{org.freedesktop.Hal.Manager}, the signal @samp{DeviceAdded}
22d8ac3a
MA
1654provides one single parameter, which is mapped into a Lisp string.
1655The callback function @code{my-dbus-signal-handler} must define one
1656single string argument therefore. Plugging an USB device to your
cd71b9ae 1657machine, when registered for signal @samp{DeviceAdded}, will show you
22d8ac3a 1658which objects the GNU/Linux @code{hal} daemon adds.
22d8ac3a
MA
1659@end defun
1660
22d8ac3a 1661
7457f7b6
MA
1662@node Alternative Buses
1663@chapter Alternative buses.
1664@cindex bus names
1665@cindex UNIX domain socket
1666
1667Until now, we have spoken about the system and the session buses,
1668which are the default buses to be connected to. However, it is
1669possible to connect to any bus, from which the address is known. This
1670is a UNIX domain socket. Everywhere, where a @var{bus} is mentioned
1671as argument of a function (the symbol @code{:system} or the symbol
1672@code{:session}), this address can be used instead. The connection to
1673this bus must be initialized first.
1674
1675@defun dbus-init-bus bus
1676Establish the connection to D-Bus @var{bus}.
1677
1678@var{bus} can be either the symbol @code{:system} or the symbol
1679@code{:session}, or it can be a string denoting the address of the
1680corresponding bus. For the system and session busses, this function
1681is called when loading @file{dbus.el}, there is no need to call it
1682again.
1683
1684Example: You open another session bus in a terminal window on your host:
1685
1686@example
1687# eval `dbus-launch --auto-syntax`
1688# echo $DBUS_SESSION_BUS_ADDRESS
1689
1690@print{} unix:abstract=/tmp/dbus-JoFtAVG92w,guid=2f320a1ebe50b7ef58e
1691@end example
1692
1693In Emacs, you can access to this bus via its address:
1694
1695@lisp
1696(setq my-bus
1697 "unix:abstract=/tmp/dbus-JoFtAVG92w,guid=2f320a1ebe50b7ef58e")
1698
1699@result{} "unix:abstract=/tmp/dbus-JoFtAVG92w,guid=2f320a1ebe50b7ef58e"
1700
1701(dbus-init-bus my-bus)
1702
1703@result{} nil
1704
1705(dbus-get-unique-name my-bus)
1706
1707@result{} ":1.0"
1708@end lisp
1709@end defun
1710
1711
22d8ac3a
MA
1712@node Errors and Events
1713@chapter Errors and events.
5bd55c3c 1714@cindex debugging
22d8ac3a
MA
1715@cindex errors
1716@cindex events
1717
5bd55c3c
MA
1718The internal actions can be traced by running in a debug mode.
1719
1720@defvar dbus-debug
1721If this variable is non-@code{nil}, D-Bus specific debug messages are raised.
1722@end defvar
1723
21956b56
MA
1724Input parameters of @code{dbus-call-method},
1725@code{dbus-call-method-non-blocking},
1726@code{dbus-call-method-asynchronously}, and
6a31c819
MA
1727@code{dbus-register-signal} are checked for correct D-Bus types. If
1728there is a type mismatch, the Lisp error @code{wrong-type-argument}
1729@code{D-Bus ARG} is raised.
1730
22d8ac3a 1731All errors raised by D-Bus are signaled with the error symbol
d2e4a6c9
MA
1732@code{dbus-error}. If possible, error messages from D-Bus are
1733appended to the @code{dbus-error}.
1734
1735@defspec dbus-ignore-errors forms@dots{}
1736This executes @var{forms} exactly like a @code{progn}, except that
1737@code{dbus-error} errors are ignored during the @var{forms}. These
5bd55c3c 1738errors can be made visible when @code{dbus-debug} is set to @code{t}.
d2e4a6c9 1739@end defspec
22d8ac3a 1740
5794c2a5
MA
1741Incoming D-Bus messages are handled as Emacs events, see @pxref{Misc
1742Events, , , elisp}. They are retrieved only, when Emacs runs in
1743interactive mode. The generated event has this form:
22d8ac3a 1744
06c0751a 1745@lisp
21956b56
MA
1746(dbus-event @var{bus} @var{type} @var{serial} @var{service} @var{path} @var{interface} @var{member} @var{handler}
1747 &rest @var{args})
06c0751a 1748@end lisp
22d8ac3a 1749
21956b56 1750@var{bus} identifies the D-Bus the message is coming from. It is
a4397af9 1751either the symbol @code{:system} or the symbol @code{:session}.
22d8ac3a 1752
21956b56
MA
1753@var{type} is the D-Bus message type which has caused the event. It
1754can be @code{dbus-message-type-invalid},
1755@code{dbus-message-type-method-call},
1756@code{dbus-message-type-method-return},
1757@code{dbus-message-type-error}, or @code{dbus-message-type-signal}.
1758@var{serial} is the serial number of the received D-Bus message.
addb7f2e 1759
22d8ac3a 1760@var{service} and @var{path} are the unique name and the object path
addb7f2e
MA
1761of the D-Bus object emitting the message. @var{interface} and
1762@var{member} denote the message which has been sent.
22d8ac3a 1763
0ce574ef 1764@var{handler} is the callback function which has been registered for
addb7f2e 1765this message (see @pxref{Signals}). When a @code{dbus-event} event
0ce574ef
MA
1766arrives, @var{handler} is called with @var{args} as arguments.
1767
22d8ac3a
MA
1768In order to inspect the @code{dbus-event} data, you could extend the
1769definition of the callback function in @ref{Signals}:
1770
06c0751a 1771@lisp
22d8ac3a
MA
1772(defun my-dbus-signal-handler (&rest args)
1773 (message "my-dbus-signal-handler: %S" last-input-event))
06c0751a 1774@end lisp
22d8ac3a
MA
1775
1776There exist convenience functions which could be called inside a
1777callback function in order to retrieve the information from the event.
1778
1779@defun dbus-event-bus-name event
22d8ac3a
MA
1780Returns the bus name @var{event} is coming from.
1781The result is either the symbol @code{:system} or the symbol @code{:session}.
1782@end defun
1783
21956b56
MA
1784@defun dbus-event-message-type event
1785Returns the message type of the corresponding D-Bus message. The
5bd55c3c 1786result is a natural number.
21956b56
MA
1787@end defun
1788
addb7f2e
MA
1789@defun dbus-event-serial-number event
1790Returns the serial number of the corresponding D-Bus message.
5bd55c3c 1791The result is a natural number.
addb7f2e
MA
1792@end defun
1793
22d8ac3a 1794@defun dbus-event-service-name event
22d8ac3a
MA
1795Returns the unique name of the D-Bus object @var{event} is coming from.
1796@end defun
1797
1798@defun dbus-event-path-name event
22d8ac3a
MA
1799Returns the object path of the D-Bus object @var{event} is coming from.
1800@end defun
1801
1802@defun dbus-event-interface-name event
74fc5047 1803Returns the interface name of the D-Bus object @var{event} is coming from.
22d8ac3a
MA
1804@end defun
1805
1806@defun dbus-event-member-name event
74fc5047 1807Returns the member name of the D-Bus object @var{event} is coming
22d8ac3a
MA
1808from. It is either a signal name or a method name.
1809@end defun
1810
c9ecb5a7
MA
1811D-Bus errors are not propagated during event handling, because it is
1812usually not desired. D-Bus errors in events can be made visible by
e7433508
MA
1813setting the variable @code{dbus-debug} to @code{t}. They can also be
1814handled by a hook function.
1815
1816@defvar dbus-event-error-hooks
1817This hook variable keeps a list of functions, which are called when a
1818D-Bus error happens in the event handler. Every function must accept
74fc5047
MA
1819two arguments, the event and the error variable catched in
1820@code{condition-case} by @code{dbus-error}.
1821
1822Such functions can be used the adapt the error signal to be raised.
1823Example:
e7433508
MA
1824
1825@lisp
74fc5047
MA
1826(defun my-dbus-event-error-handler (event error)
1827 (when (string-equal (concat dbus-service-emacs ".FileManager")
1828 (dbus-event-interface-name event))
1829 (message "my-dbus-event-error-handler: %S %S" event error)
1830 (signal 'file-error (cdr error))))
e7433508
MA
1831
1832(add-hook 'dbus-event-error-hooks 'my-dbus-event-error-handler)
1833@end lisp
1834@end defvar
c9ecb5a7 1835
74fc5047
MA
1836Hook functions shall take into account, that there might be other
1837D-Bus applications running. Therefore, they shall check carefully,
1838whether a given D-Bus error is related to them.
1839
22d8ac3a 1840
5bd55c3c
MA
1841@node Index
1842@unnumbered Index
1843
1844@printindex cp
1845
1846
22d8ac3a
MA
1847@node GNU Free Documentation License
1848@appendix GNU Free Documentation License
1849@include doclicense.texi
1850
22d8ac3a 1851@bye