blob: 5c385f0ee6385a66fb6a566328d2965d8e80b8fb [file] [log] [blame]
Emeric Vigier2f625822012-08-06 11:09:52 -04001<?xml version="1.0" standalone="no"?>
2<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
3"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"
4[
5]>
6
7<article id="index">
8 <articleinfo>
9 <title>D-Bus Tutorial</title>
10 <releaseinfo>Version 0.5.0</releaseinfo>
11 <date>20 August 2006</date>
12 <authorgroup>
13 <author>
14 <firstname>Havoc</firstname>
15 <surname>Pennington</surname>
16 <affiliation>
17 <orgname>Red Hat, Inc.</orgname>
18 <address><email>hp@pobox.com</email></address>
19 </affiliation>
20 </author>
21 <author>
22 <firstname>David</firstname>
23 <surname>Wheeler</surname>
24 </author>
25 <author>
26 <firstname>John</firstname>
27 <surname>Palmieri</surname>
28 <affiliation>
29 <orgname>Red Hat, Inc.</orgname>
30 <address><email>johnp@redhat.com</email></address>
31 </affiliation>
32 </author>
33 <author>
34 <firstname>Colin</firstname>
35 <surname>Walters</surname>
36 <affiliation>
37 <orgname>Red Hat, Inc.</orgname>
38 <address><email>walters@redhat.com</email></address>
39 </affiliation>
40 </author>
41 </authorgroup>
42 </articleinfo>
43
44 <sect1 id="meta">
45 <title>Tutorial Work In Progress</title>
46
47 <para>
48 This tutorial is not complete; it probably contains some useful information, but
49 also has plenty of gaps. Right now, you'll also need to refer to the D-Bus specification,
50 Doxygen reference documentation, and look at some examples of how other apps use D-Bus.
51 </para>
52
53 <para>
54 Enhancing the tutorial is definitely encouraged - send your patches or suggestions to the
55 mailing list. If you create a D-Bus binding, please add a section to the tutorial for your
56 binding, if only a short section with a couple of examples.
57 </para>
58
59 </sect1>
60
61 <sect1 id="whatis">
62 <title>What is D-Bus?</title>
63 <para>
64 D-Bus is a system for <firstterm>interprocess communication</firstterm>
65 (IPC). Architecturally, it has several layers:
66
67 <itemizedlist>
68 <listitem>
69 <para>
70 A library, <firstterm>libdbus</firstterm>, that allows two
71 applications to connect to each other and exchange messages.
72 </para>
73 </listitem>
74 <listitem>
75 <para>
76 A <firstterm>message bus daemon</firstterm> executable, built on
77 libdbus, that multiple applications can connect to. The daemon can
78 route messages from one application to zero or more other
79 applications.
80 </para>
81 </listitem>
82 <listitem>
83 <para>
84 <firstterm>Wrapper libraries</firstterm> or <firstterm>bindings</firstterm>
85 based on particular application frameworks. For example, libdbus-glib and
86 libdbus-qt. There are also bindings to languages such as
87 Python. These wrapper libraries are the API most people should use,
88 as they simplify the details of D-Bus programming. libdbus is
89 intended to be a low-level backend for the higher level bindings.
90 Much of the libdbus API is only useful for binding implementation.
91 </para>
92 </listitem>
93 </itemizedlist>
94 </para>
95
96 <para>
97 libdbus only supports one-to-one connections, just like a raw network
98 socket. However, rather than sending byte streams over the connection, you
99 send <firstterm>messages</firstterm>. Messages have a header identifying
100 the kind of message, and a body containing a data payload. libdbus also
101 abstracts the exact transport used (sockets vs. whatever else), and
102 handles details such as authentication.
103 </para>
104
105 <para>
106 The message bus daemon forms the hub of a wheel. Each spoke of the wheel
107 is a one-to-one connection to an application using libdbus. An
108 application sends a message to the bus daemon over its spoke, and the bus
109 daemon forwards the message to other connected applications as
110 appropriate. Think of the daemon as a router.
111 </para>
112
113 <para>
114 The bus daemon has multiple instances on a typical computer. The
115 first instance is a machine-global singleton, that is, a system daemon
116 similar to sendmail or Apache. This instance has heavy security
117 restrictions on what messages it will accept, and is used for systemwide
118 communication. The other instances are created one per user login session.
119 These instances allow applications in the user's session to communicate
120 with one another.
121 </para>
122
123 <para>
124 The systemwide and per-user daemons are separate. Normal within-session
125 IPC does not involve the systemwide message bus process and vice versa.
126 </para>
127
128 <sect2 id="uses">
129 <title>D-Bus applications</title>
130 <para>
131 There are many, many technologies in the world that have "Inter-process
132 communication" or "networking" in their stated purpose: <ulink
133 url="http://www.omg.org">CORBA</ulink>, <ulink
134 url="http://www.opengroup.org/dce/">DCE</ulink>, <ulink
135 url="http://www.microsoft.com/com/">DCOM</ulink>, <ulink
136 url="http://developer.kde.org/documentation/library/kdeqt/dcop.html">DCOP</ulink>, <ulink
137 url="http://www.xmlrpc.com">XML-RPC</ulink>, <ulink
138 url="http://www.w3.org/TR/SOAP/">SOAP</ulink>, <ulink
139 url="http://www.mbus.org/">MBUS</ulink>, <ulink
140 url="http://www.zeroc.com/ice.html">Internet Communications Engine (ICE)</ulink>,
141 and probably hundreds more.
142 Each of these is tailored for particular kinds of application.
143 D-Bus is designed for two specific cases:
144 <itemizedlist>
145 <listitem>
146 <para>
147 Communication between desktop applications in the same desktop
148 session; to allow integration of the desktop session as a whole,
149 and address issues of process lifecycle (when do desktop components
150 start and stop running).
151 </para>
152 </listitem>
153 <listitem>
154 <para>
155 Communication between the desktop session and the operating system,
156 where the operating system would typically include the kernel
157 and any system daemons or processes.
158 </para>
159 </listitem>
160 </itemizedlist>
161 </para>
162 <para>
163 For the within-desktop-session use case, the GNOME and KDE desktops
164 have significant previous experience with different IPC solutions
165 such as CORBA and DCOP. D-Bus is built on that experience and
166 carefully tailored to meet the needs of these desktop projects
167 in particular. D-Bus may or may not be appropriate for other
168 applications; the FAQ has some comparisons to other IPC systems.
169 </para>
170 <para>
171 The problem solved by the systemwide or communication-with-the-OS case
172 is explained well by the following text from the Linux Hotplug project:
173 <blockquote>
174 <para>
175 A gap in current Linux support is that policies with any sort of
176 dynamic "interact with user" component aren't currently
177 supported. For example, that's often needed the first time a network
178 adapter or printer is connected, and to determine appropriate places
179 to mount disk drives. It would seem that such actions could be
180 supported for any case where a responsible human can be identified:
181 single user workstations, or any system which is remotely
182 administered.
183 </para>
184
185 <para>
186 This is a classic "remote sysadmin" problem, where in this case
187 hotplugging needs to deliver an event from one security domain
188 (operating system kernel, in this case) to another (desktop for
189 logged-in user, or remote sysadmin). Any effective response must go
190 the other way: the remote domain taking some action that lets the
191 kernel expose the desired device capabilities. (The action can often
192 be taken asynchronously, for example letting new hardware be idle
193 until a meeting finishes.) At this writing, Linux doesn't have
194 widely adopted solutions to such problems. However, the new D-Bus
195 work may begin to solve that problem.
196 </para>
197 </blockquote>
198 </para>
199 <para>
200 D-Bus may happen to be useful for purposes other than the one it was
201 designed for. Its general properties that distinguish it from
202 other forms of IPC are:
203 <itemizedlist>
204 <listitem>
205 <para>
206 Binary protocol designed to be used asynchronously
207 (similar in spirit to the X Window System protocol).
208 </para>
209 </listitem>
210 <listitem>
211 <para>
212 Stateful, reliable connections held open over time.
213 </para>
214 </listitem>
215 <listitem>
216 <para>
217 The message bus is a daemon, not a "swarm" or
218 distributed architecture.
219 </para>
220 </listitem>
221 <listitem>
222 <para>
223 Many implementation and deployment issues are specified rather
224 than left ambiguous/configurable/pluggable.
225 </para>
226 </listitem>
227 <listitem>
228 <para>
229 Semantics are similar to the existing DCOP system, allowing
230 KDE to adopt it more easily.
231 </para>
232 </listitem>
233 <listitem>
234 <para>
235 Security features to support the systemwide mode of the
236 message bus.
237 </para>
238 </listitem>
239 </itemizedlist>
240 </para>
241 </sect2>
242 </sect1>
243 <sect1 id="concepts">
244 <title>Concepts</title>
245 <para>
246 Some basic concepts apply no matter what application framework you're
247 using to write a D-Bus application. The exact code you write will be
248 different for GLib vs. Qt vs. Python applications, however.
249 </para>
250
251 <para>
252 Here is a diagram (<ulink url="diagram.png">png</ulink> <ulink
253 url="diagram.svg">svg</ulink>) that may help you visualize the concepts
254 that follow.
255 </para>
256
257 <sect2 id="objects">
258 <title>Native Objects and Object Paths</title>
259 <para>
260 Your programming framework probably defines what an "object" is like;
261 usually with a base class. For example: java.lang.Object, GObject, QObject,
262 python's base Object, or whatever. Let's call this a <firstterm>native object</firstterm>.
263 </para>
264 <para>
265 The low-level D-Bus protocol, and corresponding libdbus API, does not care about native objects.
266 However, it provides a concept called an
267 <firstterm>object path</firstterm>. The idea of an object path is that
268 higher-level bindings can name native object instances, and allow remote applications
269 to refer to them.
270 </para>
271 <para>
272 The object path
273 looks like a filesystem path, for example an object could be
274 named <literal>/org/kde/kspread/sheets/3/cells/4/5</literal>.
275 Human-readable paths are nice, but you are free to create an
276 object named <literal>/com/mycompany/c5yo817y0c1y1c5b</literal>
277 if it makes sense for your application.
278 </para>
279 <para>
280 Namespacing object paths is smart, by starting them with the components
281 of a domain name you own (e.g. <literal>/org/kde</literal>). This
282 keeps different code modules in the same process from stepping
283 on one another's toes.
284 </para>
285 </sect2>
286
287 <sect2 id="members">
288 <title>Methods and Signals</title>
289
290 <para>
291 Each object has <firstterm>members</firstterm>; the two kinds of member
292 are <firstterm>methods</firstterm> and
293 <firstterm>signals</firstterm>. Methods are operations that can be
294 invoked on an object, with optional input (aka arguments or "in
295 parameters") and output (aka return values or "out parameters").
296 Signals are broadcasts from the object to any interested observers
297 of the object; signals may contain a data payload.
298 </para>
299
300 <para>
301 Both methods and signals are referred to by name, such as
302 "Frobate" or "OnClicked".
303 </para>
304
305 </sect2>
306
307 <sect2 id="interfaces">
308 <title>Interfaces</title>
309 <para>
310 Each object supports one or more <firstterm>interfaces</firstterm>.
311 Think of an interface as a named group of methods and signals,
312 just as it is in GLib or Qt or Java. Interfaces define the
313 <emphasis>type</emphasis> of an object instance.
314 </para>
315 <para>
316 DBus identifies interfaces with a simple namespaced string,
317 something like <literal>org.freedesktop.Introspectable</literal>.
318 Most bindings will map these interface names directly to
319 the appropriate programming language construct, for example
320 to Java interfaces or C++ pure virtual classes.
321 </para>
322 </sect2>
323
324 <sect2 id="proxies">
325 <title>Proxies</title>
326 <para>
327 A <firstterm>proxy object</firstterm> is a convenient native object created to
328 represent a remote object in another process. The low-level DBus API involves manually creating
329 a method call message, sending it, then manually receiving and processing
330 the method reply message. Higher-level bindings provide proxies as an alternative.
331 Proxies look like a normal native object; but when you invoke a method on the proxy
332 object, the binding converts it into a DBus method call message, waits for the reply
333 message, unpacks the return value, and returns it from the native method..
334 </para>
335 <para>
336 In pseudocode, programming without proxies might look like this:
337 <programlisting>
338 Message message = new Message("/remote/object/path", "MethodName", arg1, arg2);
339 Connection connection = getBusConnection();
340 connection.send(message);
341 Message reply = connection.waitForReply(message);
342 if (reply.isError()) {
343
344 } else {
345 Object returnValue = reply.getReturnValue();
346 }
347 </programlisting>
348 </para>
349 <para>
350 Programming with proxies might look like this:
351 <programlisting>
352 Proxy proxy = new Proxy(getBusConnection(), "/remote/object/path");
353 Object returnValue = proxy.MethodName(arg1, arg2);
354 </programlisting>
355 </para>
356 </sect2>
357
358 <sect2 id="bus-names">
359 <title>Bus Names</title>
360
361 <para>
362 When each application connects to the bus daemon, the daemon immediately
363 assigns it a name, called the <firstterm>unique connection name</firstterm>.
364 A unique name begins with a ':' (colon) character. These names are never
365 reused during the lifetime of the bus daemon - that is, you know
366 a given name will always refer to the same application.
367 An example of a unique name might be
368 <literal>:34-907</literal>. The numbers after the colon have
369 no meaning other than their uniqueness.
370 </para>
371
372 <para>
373 When a name is mapped
374 to a particular application's connection, that application is said to
375 <firstterm>own</firstterm> that name.
376 </para>
377
378 <para>
379 Applications may ask to own additional <firstterm>well-known
380 names</firstterm>. For example, you could write a specification to
381 define a name called <literal>com.mycompany.TextEditor</literal>.
382 Your definition could specify that to own this name, an application
383 should have an object at the path
384 <literal>/com/mycompany/TextFileManager</literal> supporting the
385 interface <literal>org.freedesktop.FileHandler</literal>.
386 </para>
387
388 <para>
389 Applications could then send messages to this bus name,
390 object, and interface to execute method calls.
391 </para>
392
393 <para>
394 You could think of the unique names as IP addresses, and the
395 well-known names as domain names. So
396 <literal>com.mycompany.TextEditor</literal> might map to something like
397 <literal>:34-907</literal> just as <literal>mycompany.com</literal> maps
398 to something like <literal>192.168.0.5</literal>.
399 </para>
400
401 <para>
402 Names have a second important use, other than routing messages. They
403 are used to track lifecycle. When an application exits (or crashes), its
404 connection to the message bus will be closed by the operating system
405 kernel. The message bus then sends out notification messages telling
406 remaining applications that the application's names have lost their
407 owner. By tracking these notifications, your application can reliably
408 monitor the lifetime of other applications.
409 </para>
410
411 <para>
412 Bus names can also be used to coordinate single-instance applications.
413 If you want to be sure only one
414 <literal>com.mycompany.TextEditor</literal> application is running for
415 example, have the text editor application exit if the bus name already
416 has an owner.
417 </para>
418
419 </sect2>
420
421 <sect2 id="addresses">
422 <title>Addresses</title>
423
424 <para>
425 Applications using D-Bus are either servers or clients. A server
426 listens for incoming connections; a client connects to a server. Once
427 the connection is established, it is a symmetric flow of messages; the
428 client-server distinction only matters when setting up the
429 connection.
430 </para>
431
432 <para>
433 If you're using the bus daemon, as you probably are, your application
434 will be a client of the bus daemon. That is, the bus daemon listens
435 for connections and your application initiates a connection to the bus
436 daemon.
437 </para>
438
439 <para>
440 A D-Bus <firstterm>address</firstterm> specifies where a server will
441 listen, and where a client will connect. For example, the address
442 <literal>unix:path=/tmp/abcdef</literal> specifies that the server will
443 listen on a UNIX domain socket at the path
444 <literal>/tmp/abcdef</literal> and the client will connect to that
445 socket. An address can also specify TCP/IP sockets, or any other
446 transport defined in future iterations of the D-Bus specification.
447 </para>
448
449 <para>
450 When using D-Bus with a message bus daemon,
451 libdbus automatically discovers the address of the per-session bus
452 daemon by reading an environment variable. It discovers the
453 systemwide bus daemon by checking a well-known UNIX domain socket path
454 (though you can override this address with an environment variable).
455 </para>
456
457 <para>
458 If you're using D-Bus without a bus daemon, it's up to you to
459 define which application will be the server and which will be
460 the client, and specify a mechanism for them to agree on
461 the server's address. This is an unusual case.
462 </para>
463
464 </sect2>
465
466 <sect2 id="bigpicture">
467 <title>Big Conceptual Picture</title>
468
469 <para>
470 Pulling all these concepts together, to specify a particular
471 method call on a particular object instance, a number of
472 nested components have to be named:
473 <programlisting>
474 Address -&gt; [Bus Name] -&gt; Path -&gt; Interface -&gt; Method
475 </programlisting>
476 The bus name is in brackets to indicate that it's optional -- you only
477 provide a name to route the method call to the right application
478 when using the bus daemon. If you have a direct connection to another
479 application, bus names aren't used; there's no bus daemon.
480 </para>
481
482 <para>
483 The interface is also optional, primarily for historical
484 reasons; DCOP does not require specifying the interface,
485 instead simply forbidding duplicate method names
486 on the same object instance. D-Bus will thus let you
487 omit the interface, but if your method name is ambiguous
488 it is undefined which method will be invoked.
489 </para>
490
491 </sect2>
492
493 <sect2 id="messages">
494 <title>Messages - Behind the Scenes</title>
495 <para>
496 D-Bus works by sending messages between processes. If you're using
497 a sufficiently high-level binding, you may never work with messages directly.
498 </para>
499 <para>
500 There are 4 message types:
501 <itemizedlist>
502 <listitem>
503 <para>
504 Method call messages ask to invoke a method
505 on an object.
506 </para>
507 </listitem>
508 <listitem>
509 <para>
510 Method return messages return the results
511 of invoking a method.
512 </para>
513 </listitem>
514 <listitem>
515 <para>
516 Error messages return an exception caused by
517 invoking a method.
518 </para>
519 </listitem>
520 <listitem>
521 <para>
522 Signal messages are notifications that a given signal
523 has been emitted (that an event has occurred).
524 You could also think of these as "event" messages.
525 </para>
526 </listitem>
527 </itemizedlist>
528 </para>
529 <para>
530 A method call maps very simply to messages: you send a method call
531 message, and receive either a method return message or an error message
532 in reply.
533 </para>
534 <para>
535 Each message has a <firstterm>header</firstterm>, including <firstterm>fields</firstterm>,
536 and a <firstterm>body</firstterm>, including <firstterm>arguments</firstterm>. You can think
537 of the header as the routing information for the message, and the body as the payload.
538 Header fields might include the sender bus name, destination bus name, method or signal name,
539 and so forth. One of the header fields is a <firstterm>type signature</firstterm> describing the
540 values found in the body. For example, the letter "i" means "32-bit integer" so the signature
541 "ii" means the payload has two 32-bit integers.
542 </para>
543 </sect2>
544
545 <sect2 id="callprocedure">
546 <title>Calling a Method - Behind the Scenes</title>
547
548 <para>
549 A method call in DBus consists of two messages; a method call message sent from process A to process B,
550 and a matching method reply message sent from process B to process A. Both the call and the reply messages
551 are routed through the bus daemon. The caller includes a different serial number in each call message, and the
552 reply message includes this number to allow the caller to match replies to calls.
553 </para>
554
555 <para>
556 The call message will contain any arguments to the method.
557 The reply message may indicate an error, or may contain data returned by the method.
558 </para>
559
560 <para>
561 A method invocation in DBus happens as follows:
562 <itemizedlist>
563 <listitem>
564 <para>
565 The language binding may provide a proxy, such that invoking a method on
566 an in-process object invokes a method on a remote object in another process. If so, the
567 application calls a method on the proxy, and the proxy
568 constructs a method call message to send to the remote process.
569 </para>
570 </listitem>
571 <listitem>
572 <para>
573 For more low-level APIs, the application may construct a method call message itself, without
574 using a proxy.
575 </para>
576 </listitem>
577 <listitem>
578 <para>
579 In either case, the method call message contains: a bus name belonging to the remote process; the name of the method;
580 the arguments to the method; an object path inside the remote process; and optionally the name of the
581 interface that specifies the method.
582 </para>
583 </listitem>
584 <listitem>
585 <para>
586 The method call message is sent to the bus daemon.
587 </para>
588 </listitem>
589 <listitem>
590 <para>
591 The bus daemon looks at the destination bus name. If a process owns that name,
592 the bus daemon forwards the method call to that process. Otherwise, the bus daemon
593 creates an error message and sends it back as the reply to the method call message.
594 </para>
595 </listitem>
596 <listitem>
597 <para>
598 The receiving process unpacks the method call message. In a simple low-level API situation, it
599 may immediately run the method and send a method reply message to the bus daemon.
600 When using a high-level binding API, the binding might examine the object path, interface,
601 and method name, and convert the method call message into an invocation of a method on
602 a native object (GObject, java.lang.Object, QObject, etc.), then convert the return
603 value from the native method into a method reply message.
604 </para>
605 </listitem>
606 <listitem>
607 <para>
608 The bus daemon receives the method reply message and sends it to the process that
609 made the method call.
610 </para>
611 </listitem>
612 <listitem>
613 <para>
614 The process that made the method call looks at the method reply and makes use of any
615 return values included in the reply. The reply may also indicate that an error occurred.
616 When using a binding, the method reply message may be converted into the return value of
617 of a proxy method, or into an exception.
618 </para>
619 </listitem>
620 </itemizedlist>
621 </para>
622
623 <para>
624 The bus daemon never reorders messages. That is, if you send two method call messages to the same recipient,
625 they will be received in the order they were sent. The recipient is not required to reply to the calls
626 in order, however; for example, it may process each method call in a separate thread, and return reply messages
627 in an undefined order depending on when the threads complete. Method calls have a unique serial
628 number used by the method caller to match reply messages to call messages.
629 </para>
630
631 </sect2>
632
633 <sect2 id="signalprocedure">
634 <title>Emitting a Signal - Behind the Scenes</title>
635
636 <para>
637 A signal in DBus consists of a single message, sent by one process to any number of other processes.
638 That is, a signal is a unidirectional broadcast. The signal may contain arguments (a data payload), but
639 because it is a broadcast, it never has a "return value." Contrast this with a method call
640 (see <xref linkend="callprocedure"/>) where the method call message has a matching method reply message.
641 </para>
642
643 <para>
644 The emitter (aka sender) of a signal has no knowledge of the signal recipients. Recipients register
645 with the bus daemon to receive signals based on "match rules" - these rules would typically include the sender and
646 the signal name. The bus daemon sends each signal only to recipients who have expressed interest in that
647 signal.
648 </para>
649
650 <para>
651 A signal in DBus happens as follows:
652 <itemizedlist>
653 <listitem>
654 <para>
655 A signal message is created and sent to the bus daemon. When using the low-level API this may be
656 done manually, with certain bindings it may be done for you by the binding when a native object
657 emits a native signal or event.
658 </para>
659 </listitem>
660 <listitem>
661 <para>
662 The signal message contains the name of the interface that specifies the signal;
663 the name of the signal; the bus name of the process sending the signal; and
664 any arguments
665 </para>
666 </listitem>
667 <listitem>
668 <para>
669 Any process on the message bus can register "match rules" indicating which signals it
670 is interested in. The bus has a list of registered match rules.
671 </para>
672 </listitem>
673 <listitem>
674 <para>
675 The bus daemon examines the signal and determines which processes are interested in it.
676 It sends the signal message to these processes.
677 </para>
678 </listitem>
679 <listitem>
680 <para>
681 Each process receiving the signal decides what to do with it; if using a binding,
682 the binding may choose to emit a native signal on a proxy object. If using the
683 low-level API, the process may just look at the signal sender and name and decide
684 what to do based on that.
685 </para>
686 </listitem>
687 </itemizedlist>
688 </para>
689
690 </sect2>
691
692 <sect2 id="introspection">
693 <title>Introspection</title>
694
695 <para>
696 D-Bus objects may support the interface <literal>org.freedesktop.DBus.Introspectable</literal>.
697 This interface has one method <literal>Introspect</literal> which takes no arguments and returns
698 an XML string. The XML string describes the interfaces, methods, and signals of the object.
699 See the D-Bus specification for more details on this introspection format.
700 </para>
701
702 </sect2>
703
704 </sect1>
705
706 <sect1 id="glib-client">
707 <title>GLib API: Using Remote Objects</title>
708
709 <para>
710 The GLib binding is defined in the header file
711 <literal>&lt;dbus/dbus-glib.h&gt;</literal>.
712 </para>
713
714 <sect2 id="glib-typemappings">
715 <title>D-Bus - GLib type mappings</title>
716 <para>
717 The heart of the GLib bindings for D-Bus is the mapping it
718 provides between D-Bus "type signatures" and GLib types
719 (<literal>GType</literal>). The D-Bus type system is composed of
720 a number of "basic" types, along with several "container" types.
721 </para>
722 <sect3 id="glib-basic-typemappings">
723 <title>Basic type mappings</title>
724 <para>
725 Below is a list of the basic types, along with their associated
726 mapping to a <literal>GType</literal>.
727 <informaltable>
728 <tgroup cols="4">
729 <thead>
730 <row>
731 <entry>D-Bus basic type</entry>
732 <entry>GType</entry>
733 <entry>Free function</entry>
734 <entry>Notes</entry>
735 </row>
736 </thead>
737 <tbody>
738 <row>
739 <entry><literal>BYTE</literal></entry>
740 <entry><literal>G_TYPE_UCHAR</literal></entry>
741 <entry></entry>
742 <entry></entry>
743 </row><row>
744 <entry><literal>BOOLEAN</literal></entry>
745 <entry><literal>G_TYPE_BOOLEAN</literal></entry>
746 <entry></entry>
747 <entry></entry>
748 </row><row>
749 <entry><literal>INT16</literal></entry>
750 <entry><literal>G_TYPE_INT</literal></entry>
751 <entry></entry>
752 <entry>Will be changed to a <literal>G_TYPE_INT16</literal> once GLib has it</entry>
753 </row><row>
754 <entry><literal>UINT16</literal></entry>
755 <entry><literal>G_TYPE_UINT</literal></entry>
756 <entry></entry>
757 <entry>Will be changed to a <literal>G_TYPE_UINT16</literal> once GLib has it</entry>
758 </row><row>
759 <entry><literal>INT32</literal></entry>
760 <entry><literal>G_TYPE_INT</literal></entry>
761 <entry></entry>
762 <entry>Will be changed to a <literal>G_TYPE_INT32</literal> once GLib has it</entry>
763 </row><row>
764 <entry><literal>UINT32</literal></entry>
765 <entry><literal>G_TYPE_UINT</literal></entry>
766 <entry></entry>
767 <entry>Will be changed to a <literal>G_TYPE_UINT32</literal> once GLib has it</entry>
768 </row><row>
769 <entry><literal>INT64</literal></entry>
770 <entry><literal>G_TYPE_GINT64</literal></entry>
771 <entry></entry>
772 <entry></entry>
773 </row><row>
774 <entry><literal>UINT64</literal></entry>
775 <entry><literal>G_TYPE_GUINT64</literal></entry>
776 <entry></entry>
777 <entry></entry>
778 </row><row>
779 <entry><literal>DOUBLE</literal></entry>
780 <entry><literal>G_TYPE_DOUBLE</literal></entry>
781 <entry></entry>
782 <entry></entry>
783 </row><row>
784 <entry><literal>STRING</literal></entry>
785 <entry><literal>G_TYPE_STRING</literal></entry>
786 <entry><literal>g_free</literal></entry>
787 <entry></entry>
788 </row><row>
789 <entry><literal>OBJECT_PATH</literal></entry>
790 <entry><literal>DBUS_TYPE_G_PROXY</literal></entry>
791 <entry><literal>g_object_unref</literal></entry>
792 <entry>The returned proxy does not have an interface set; use <literal>dbus_g_proxy_set_interface</literal> to invoke methods</entry>
793 </row>
794 </tbody>
795 </tgroup>
796 </informaltable>
797 As you can see, the basic mapping is fairly straightforward.
798 </para>
799 </sect3>
800 <sect3 id="glib-container-typemappings">
801 <title>Container type mappings</title>
802 <para>
803 The D-Bus type system also has a number of "container"
804 types, such as <literal>DBUS_TYPE_ARRAY</literal> and
805 <literal>DBUS_TYPE_STRUCT</literal>. The D-Bus type system
806 is fully recursive, so one can for example have an array of
807 array of strings (i.e. type signature
808 <literal>aas</literal>).
809 </para>
810 <para>
811 However, not all of these types are in common use; for
812 example, at the time of this writing the author knows of no
813 one using <literal>DBUS_TYPE_STRUCT</literal>, or a
814 <literal>DBUS_TYPE_ARRAY</literal> containing any non-basic
815 type. The approach the GLib bindings take is pragmatic; try
816 to map the most common types in the most obvious way, and
817 let using less common and more complex types be less
818 "natural".
819 </para>
820 <para>
821 First, D-Bus type signatures which have an "obvious"
822 corresponding built-in GLib type are mapped using that type:
823 <informaltable>
824 <tgroup cols="6">
825 <thead>
826 <row>
827 <entry>D-Bus type signature</entry>
828 <entry>Description</entry>
829 <entry>GType</entry>
830 <entry>C typedef</entry>
831 <entry>Free function</entry>
832 <entry>Notes</entry>
833 </row>
834 </thead>
835 <tbody>
836 <row>
837 <entry><literal>as</literal></entry>
838 <entry>Array of strings</entry>
839 <entry><literal>G_TYPE_STRV</literal></entry>
840 <entry><literal>char **</literal></entry>
841 <entry><literal>g_strfreev</literal></entry>
842 <entry></entry>
843 </row><row>
844 <entry><literal>v</literal></entry>
845 <entry>Generic value container</entry>
846 <entry><literal>G_TYPE_VALUE</literal></entry>
847 <entry><literal>GValue *</literal></entry>
848 <entry><literal>g_value_unset</literal></entry>
849 <entry>The calling conventions for values expect that method callers have allocated return values; see below.</entry>
850 </row>
851 </tbody>
852 </tgroup>
853 </informaltable>
854 </para>
855 <para>
856 The next most common recursive type signatures are arrays of
857 basic values. The most obvious mapping for arrays of basic
858 types is a <literal>GArray</literal>. Now, GLib does not
859 provide a builtin <literal>GType</literal> for
860 <literal>GArray</literal>. However, we actually need more than
861 that - we need a "parameterized" type which includes the
862 contained type. Why we need this we will see below.
863 </para>
864 <para>
865 The approach taken is to create these types in the D-Bus GLib
866 bindings; however, there is nothing D-Bus specific about them.
867 In the future, we hope to include such "fundamental" types in GLib
868 itself.
869 <informaltable>
870 <tgroup cols="6">
871 <thead>
872 <row>
873 <entry>D-Bus type signature</entry>
874 <entry>Description</entry>
875 <entry>GType</entry>
876 <entry>C typedef</entry>
877 <entry>Free function</entry>
878 <entry>Notes</entry>
879 </row>
880 </thead>
881 <tbody>
882 <row>
883 <entry><literal>ay</literal></entry>
884 <entry>Array of bytes</entry>
885 <entry><literal>DBUS_TYPE_G_BYTE_ARRAY</literal></entry>
886 <entry><literal>GArray *</literal></entry>
887 <entry>g_array_free</entry>
888 <entry></entry>
889 </row>
890 <row>
891 <entry><literal>au</literal></entry>
892 <entry>Array of uint</entry>
893 <entry><literal>DBUS_TYPE_G_UINT_ARRAY</literal></entry>
894 <entry><literal>GArray *</literal></entry>
895 <entry>g_array_free</entry>
896 <entry></entry>
897 </row>
898 <row>
899 <entry><literal>ai</literal></entry>
900 <entry>Array of int</entry>
901 <entry><literal>DBUS_TYPE_G_INT_ARRAY</literal></entry>
902 <entry><literal>GArray *</literal></entry>
903 <entry>g_array_free</entry>
904 <entry></entry>
905 </row>
906 <row>
907 <entry><literal>ax</literal></entry>
908 <entry>Array of int64</entry>
909 <entry><literal>DBUS_TYPE_G_INT64_ARRAY</literal></entry>
910 <entry><literal>GArray *</literal></entry>
911 <entry>g_array_free</entry>
912 <entry></entry>
913 </row>
914 <row>
915 <entry><literal>at</literal></entry>
916 <entry>Array of uint64</entry>
917 <entry><literal>DBUS_TYPE_G_UINT64_ARRAY</literal></entry>
918 <entry><literal>GArray *</literal></entry>
919 <entry>g_array_free</entry>
920 <entry></entry>
921 </row>
922 <row>
923 <entry><literal>ad</literal></entry>
924 <entry>Array of double</entry>
925 <entry><literal>DBUS_TYPE_G_DOUBLE_ARRAY</literal></entry>
926 <entry><literal>GArray *</literal></entry>
927 <entry>g_array_free</entry>
928 <entry></entry>
929 </row>
930 <row>
931 <entry><literal>ab</literal></entry>
932 <entry>Array of boolean</entry>
933 <entry><literal>DBUS_TYPE_G_BOOLEAN_ARRAY</literal></entry>
934 <entry><literal>GArray *</literal></entry>
935 <entry>g_array_free</entry>
936 <entry></entry>
937 </row>
938 </tbody>
939 </tgroup>
940 </informaltable>
941 </para>
942 <para>
943 D-Bus also includes a special type DBUS_TYPE_DICT_ENTRY which
944 is only valid in arrays. It's intended to be mapped to a "dictionary"
945 type by bindings. The obvious GLib mapping here is GHashTable. Again,
946 however, there is no builtin <literal>GType</literal> for a GHashTable.
947 Moreover, just like for arrays, we need a parameterized type so that
948 the bindings can communiate which types are contained in the hash table.
949 </para>
950 <para>
951 At present, only strings are supported. Work is in progress to
952 include more types.
953 <informaltable>
954 <tgroup cols="6">
955 <thead>
956 <row>
957 <entry>D-Bus type signature</entry>
958 <entry>Description</entry>
959 <entry>GType</entry>
960 <entry>C typedef</entry>
961 <entry>Free function</entry>
962 <entry>Notes</entry>
963 </row>
964 </thead>
965 <tbody>
966 <row>
967 <entry><literal>a{ss}</literal></entry>
968 <entry>Dictionary mapping strings to strings</entry>
969 <entry><literal>DBUS_TYPE_G_STRING_STRING_HASHTABLE</literal></entry>
970 <entry><literal>GHashTable *</literal></entry>
971 <entry>g_hash_table_destroy</entry>
972 <entry></entry>
973 </row>
974 </tbody>
975 </tgroup>
976 </informaltable>
977 </para>
978 </sect3>
979 <sect3 id="glib-generic-typemappings">
980 <title>Arbitrarily recursive type mappings</title>
981 <para>
982 Finally, it is possible users will want to write or invoke D-Bus
983 methods which have arbitrarily complex type signatures not
984 directly supported by these bindings. For this case, we have a
985 <literal>DBusGValue</literal> which acts as a kind of special
986 variant value which may be iterated over manually. The
987 <literal>GType</literal> associated is
988 <literal>DBUS_TYPE_G_VALUE</literal>.
989 </para>
990 <para>
991 TODO insert usage of <literal>DBUS_TYPE_G_VALUE</literal> here.
992 </para>
993 </sect3>
994 </sect2>
995 <sect2 id="sample-program-1">
996 <title>A sample program</title>
997 <para>Here is a D-Bus program using the GLib bindings.
998<programlisting>
999int
1000main (int argc, char **argv)
1001{
1002 DBusGConnection *connection;
1003 GError *error;
1004 DBusGProxy *proxy;
1005 char **name_list;
1006 char **name_list_ptr;
1007
1008 g_type_init ();
1009
1010 error = NULL;
1011 connection = dbus_g_bus_get (DBUS_BUS_SESSION,
1012 &amp;error);
1013 if (connection == NULL)
1014 {
1015 g_printerr ("Failed to open connection to bus: %s\n",
1016 error-&gt;message);
1017 g_error_free (error);
1018 exit (1);
1019 }
1020
1021 /* Create a proxy object for the "bus driver" (name "org.freedesktop.DBus") */
1022
1023 proxy = dbus_g_proxy_new_for_name (connection,
1024 DBUS_SERVICE_DBUS,
1025 DBUS_PATH_DBUS,
1026 DBUS_INTERFACE_DBUS);
1027
1028 /* Call ListNames method, wait for reply */
1029 error = NULL;
1030 if (!dbus_g_proxy_call (proxy, "ListNames", &amp;error, G_TYPE_INVALID,
1031 G_TYPE_STRV, &amp;name_list, G_TYPE_INVALID))
1032 {
1033 /* Just do demonstrate remote exceptions versus regular GError */
1034 if (error->domain == DBUS_GERROR &amp;&amp; error->code == DBUS_GERROR_REMOTE_EXCEPTION)
1035 g_printerr ("Caught remote method exception %s: %s",
1036 dbus_g_error_get_name (error),
1037 error-&gt;message);
1038 else
1039 g_printerr ("Error: %s\n", error-&gt;message);
1040 g_error_free (error);
1041 exit (1);
1042 }
1043
1044 /* Print the results */
1045
1046 g_print ("Names on the message bus:\n");
1047
1048 for (name_list_ptr = name_list; *name_list_ptr; name_list_ptr++)
1049 {
1050 g_print (" %s\n", *name_list_ptr);
1051 }
1052 g_strfreev (name_list);
1053
1054 g_object_unref (proxy);
1055
1056 return 0;
1057}
1058</programlisting>
1059 </para>
1060 </sect2>
1061 <sect2 id="glib-program-setup">
1062 <title>Program initalization</title>
1063 <para>
1064 A connection to the bus is acquired using
1065 <literal>dbus_g_bus_get</literal>. Next, a proxy
1066 is created for the object "/org/freedesktop/DBus" with
1067 interface <literal>org.freedesktop.DBus</literal>
1068 on the service <literal>org.freedesktop.DBus</literal>.
1069 This is a proxy for the message bus itself.
1070 </para>
1071 </sect2>
1072 <sect2 id="glib-method-invocation">
1073 <title>Understanding method invocation</title>
1074 <para>
1075 You have a number of choices for method invocation. First, as
1076 used above, <literal>dbus_g_proxy_call</literal> sends a
1077 method call to the remote object, and blocks until a reply is
1078 recieved. The outgoing arguments are specified in the varargs
1079 array, terminated with <literal>G_TYPE_INVALID</literal>.
1080 Next, pointers to return values are specified, followed again
1081 by <literal>G_TYPE_INVALID</literal>.
1082 </para>
1083 <para>
1084 To invoke a method asynchronously, use
1085 <literal>dbus_g_proxy_begin_call</literal>. This returns a
1086 <literal>DBusGPendingCall</literal> object; you may then set a
1087 notification function using
1088 <literal>dbus_g_pending_call_set_notify</literal>.
1089 </para>
1090 </sect2>
1091 <sect2 id="glib-signal-connection">
1092 <title>Connecting to object signals</title>
1093 <para>
1094 You may connect to signals using
1095 <literal>dbus_g_proxy_add_signal</literal> and
1096 <literal>dbus_g_proxy_connect_signal</literal>. You must
1097 invoke <literal>dbus_g_proxy_add_signal</literal> to specify
1098 the signature of your signal handlers; you may then invoke
1099 <literal>dbus_g_proxy_connect_signal</literal> multiple times.
1100 </para>
1101 <para>
1102 Note that it will often be the case that there is no builtin
1103 marshaller for the type signature of a remote signal. In that
1104 case, you must generate a marshaller yourself by using
1105 <application>glib-genmarshal</application>, and then register
1106 it using <literal>dbus_g_object_register_marshaller</literal>.
1107 </para>
1108 </sect2>
1109 <sect2 id="glib-error-handling">
1110 <title>Error handling and remote exceptions</title>
1111 <para>
1112 All of the GLib binding methods such as
1113 <literal>dbus_g_proxy_end_call</literal> return a
1114 <literal>GError</literal>. This <literal>GError</literal> can
1115 represent two different things:
1116 <itemizedlist>
1117 <listitem>
1118 <para>
1119 An internal D-Bus error, such as an out-of-memory
1120 condition, an I/O error, or a network timeout. Errors
1121 generated by the D-Bus library itself have the domain
1122 <literal>DBUS_GERROR</literal>, and a corresponding code
1123 such as <literal>DBUS_GERROR_NO_MEMORY</literal>. It will
1124 not be typical for applications to handle these errors
1125 specifically.
1126 </para>
1127 </listitem>
1128 <listitem>
1129 <para>
1130 A remote D-Bus exception, thrown by the peer, bus, or
1131 service. D-Bus remote exceptions have both a textual
1132 "name" and a "message". The GLib bindings store this
1133 information in the <literal>GError</literal>, but some
1134 special rules apply.
1135 </para>
1136 <para>
1137 The set error will have the domain
1138 <literal>DBUS_GERROR</literal> as above, and will also
1139 have the code
1140 <literal>DBUS_GERROR_REMOTE_EXCEPTION</literal>. In order
1141 to access the remote exception name, you must use a
1142 special accessor, such as
1143 <literal>dbus_g_error_has_name</literal> or
1144 <literal>dbus_g_error_get_name</literal>. The remote
1145 exception detailed message is accessible via the regular
1146 GError <literal>message</literal> member.
1147 </para>
1148 </listitem>
1149 </itemizedlist>
1150 </para>
1151 </sect2>
1152 <sect2 id="glib-more-examples">
1153 <title>More examples of method invocation</title>
1154 <sect3 id="glib-sending-stuff">
1155 <title>Sending an integer and string, receiving an array of bytes</title>
1156 <para>
1157<programlisting>
1158 GArray *arr;
1159
1160 error = NULL;
1161 if (!dbus_g_proxy_call (proxy, "Foobar", &amp;error,
1162 G_TYPE_INT, 42, G_TYPE_STRING, "hello",
1163 G_TYPE_INVALID,
1164 DBUS_TYPE_G_UCHAR_ARRAY, &amp;arr, G_TYPE_INVALID))
1165 {
1166 /* Handle error */
1167 }
1168 g_assert (arr != NULL);
1169 printf ("got back %u values", arr->len);
1170</programlisting>
1171 </para>
1172 </sect3>
1173 <sect3 id="glib-sending-hash">
1174 <title>Sending a GHashTable</title>
1175 <para>
1176<programlisting>
1177 GHashTable *hash = g_hash_table_new (g_str_hash, g_str_equal);
1178 guint32 ret;
1179
1180 g_hash_table_insert (hash, "foo", "bar");
1181 g_hash_table_insert (hash, "baz", "whee");
1182
1183 error = NULL;
1184 if (!dbus_g_proxy_call (proxy, "HashSize", &amp;error,
1185 DBUS_TYPE_G_STRING_STRING_HASH, hash, G_TYPE_INVALID,
1186 G_TYPE_UINT, &amp;ret, G_TYPE_INVALID))
1187 {
1188 /* Handle error */
1189 }
1190 g_assert (ret == 2);
1191 g_hash_table_destroy (hash);
1192</programlisting>
1193 </para>
1194 </sect3>
1195 <sect3 id="glib-receiving-bool-int">
1196 <title>Receiving a boolean and a string</title>
1197 <para>
1198<programlisting>
1199 gboolean boolret;
1200 char *strret;
1201
1202 error = NULL;
1203 if (!dbus_g_proxy_call (proxy, "GetStuff", &amp;error,
1204 G_TYPE_INVALID,
1205 G_TYPE_BOOLEAN, &amp;boolret,
1206 G_TYPE_STRING, &amp;strret,
1207 G_TYPE_INVALID))
1208 {
1209 /* Handle error */
1210 }
1211 printf ("%s %s", boolret ? "TRUE" : "FALSE", strret);
1212 g_free (strret);
1213</programlisting>
1214 </para>
1215 </sect3>
1216 <sect3 id="glib-sending-str-arrays">
1217 <title>Sending two arrays of strings</title>
1218 <para>
1219<programlisting>
1220 /* NULL terminate */
1221 char *strs_static[] = {"foo", "bar", "baz", NULL};
1222 /* Take pointer to array; cannot pass array directly */
1223 char **strs_static_p = strs_static;
1224 char **strs_dynamic;
1225
1226 strs_dynamic = g_new (char *, 4);
1227 strs_dynamic[0] = g_strdup ("hello");
1228 strs_dynamic[1] = g_strdup ("world");
1229 strs_dynamic[2] = g_strdup ("!");
1230 /* NULL terminate */
1231 strs_dynamic[3] = NULL;
1232
1233 error = NULL;
1234 if (!dbus_g_proxy_call (proxy, "TwoStrArrays", &amp;error,
1235 G_TYPE_STRV, strs_static_p,
1236 G_TYPE_STRV, strs_dynamic,
1237 G_TYPE_INVALID,
1238 G_TYPE_INVALID))
1239 {
1240 /* Handle error */
1241 }
1242 g_strfreev (strs_dynamic);
1243</programlisting>
1244 </para>
1245 </sect3>
1246 <sect3 id="glib-getting-str-array">
1247 <title>Sending a boolean, receiving an array of strings</title>
1248 <para>
1249<programlisting>
1250 char **strs;
1251 char **strs_p;
1252 gboolean blah;
1253
1254 error = NULL;
1255 blah = TRUE;
1256 if (!dbus_g_proxy_call (proxy, "GetStrs", &amp;error,
1257 G_TYPE_BOOLEAN, blah,
1258 G_TYPE_INVALID,
1259 G_TYPE_STRV, &amp;strs,
1260 G_TYPE_INVALID))
1261 {
1262 /* Handle error */
1263 }
1264 for (strs_p = strs; *strs_p; strs_p++)
1265 printf ("got string: \"%s\"", *strs_p);
1266 g_strfreev (strs);
1267</programlisting>
1268 </para>
1269 </sect3>
1270 <sect3 id="glib-sending-variant">
1271 <title>Sending a variant</title>
1272 <para>
1273<programlisting>
1274 GValue val = {0, };
1275
1276 g_value_init (&amp;val, G_TYPE_STRING);
1277 g_value_set_string (&amp;val, "hello world");
1278
1279 error = NULL;
1280 if (!dbus_g_proxy_call (proxy, "SendVariant", &amp;error,
1281 G_TYPE_VALUE, &amp;val, G_TYPE_INVALID,
1282 G_TYPE_INVALID))
1283 {
1284 /* Handle error */
1285 }
1286 g_assert (ret == 2);
1287 g_value_unset (&amp;val);
1288</programlisting>
1289 </para>
1290 </sect3>
1291 <sect3 id="glib-receiving-variant">
1292 <title>Receiving a variant</title>
1293 <para>
1294<programlisting>
1295 GValue val = {0, };
1296
1297 error = NULL;
1298 if (!dbus_g_proxy_call (proxy, "GetVariant", &amp;error, G_TYPE_INVALID,
1299 G_TYPE_VALUE, &amp;val, G_TYPE_INVALID))
1300 {
1301 /* Handle error */
1302 }
1303 if (G_VALUE_TYPE (&amp;val) == G_TYPE_STRING)
1304 printf ("%s\n", g_value_get_string (&amp;val));
1305 else if (G_VALUE_TYPE (&amp;val) == G_TYPE_INT)
1306 printf ("%d\n", g_value_get_int (&amp;val));
1307 else
1308 ...
1309 g_value_unset (&amp;val);
1310</programlisting>
1311 </para>
1312 </sect3>
1313 </sect2>
1314
1315 <sect2 id="glib-generated-bindings">
1316 <title>Generated Bindings</title>
1317 <para>
1318 By using the Introspection XML files, convenient client-side bindings
1319 can be automatically created to ease the use of a remote DBus object.
1320 </para>
1321 <para>
1322 Here is a sample XML file which describes an object that exposes
1323 one method, named <literal>ManyArgs</literal>.
1324 <programlisting>
1325&lt;?xml version="1.0" encoding="UTF-8" ?&gt;
1326&lt;node name="/com/example/MyObject"&gt;
1327 &lt;interface name="com.example.MyObject"&gt;
1328 &lt;method name="ManyArgs"&gt;
1329 &lt;arg type="u" name="x" direction="in" /&gt;
1330 &lt;arg type="s" name="str" direction="in" /&gt;
1331 &lt;arg type="d" name="trouble" direction="in" /&gt;
1332 &lt;arg type="d" name="d_ret" direction="out" /&gt;
1333 &lt;arg type="s" name="str_ret" direction="out" /&gt;
1334 &lt;/method&gt;
1335 &lt;/interface&gt;
1336&lt;/node&gt;
1337</programlisting>
1338 </para>
1339 <para>
1340 Run <literal>dbus-binding-tool --mode=glib-client
1341 <replaceable>FILENAME</replaceable> &gt;
1342 <replaceable>HEADER_NAME</replaceable></literal> to generate the header
1343 file. For example: <command>dbus-binding-tool --mode=glib-client
1344 my-object.xml &gt; my-object-bindings.h</command>. This will generate
1345 inline functions with the following prototypes:
1346 <programlisting>
1347/* This is a blocking call */
1348gboolean
1349com_example_MyObject_many_args (DBusGProxy *proxy, const guint IN_x,
1350 const char * IN_str, const gdouble IN_trouble,
1351 gdouble* OUT_d_ret, char ** OUT_str_ret,
1352 GError **error);
1353
1354/* This is a non-blocking call */
1355DBusGProxyCall*
1356com_example_MyObject_many_args_async (DBusGProxy *proxy, const guint IN_x,
1357 const char * IN_str, const gdouble IN_trouble,
1358 com_example_MyObject_many_args_reply callback,
1359 gpointer userdata);
1360
1361/* This is the typedef for the non-blocking callback */
1362typedef void
1363(*com_example_MyObject_many_args_reply)
1364(DBusGProxy *proxy, gdouble OUT_d_ret, char * OUT_str_ret,
1365 GError *error, gpointer userdata);
1366</programlisting>
1367 The first argument in all functions is a <literal>DBusGProxy
1368 *</literal>, which you should create with the usual
1369 <literal>dbus_g_proxy_new_*</literal> functions. Following that are the
1370 "in" arguments, and then either the "out" arguments and a
1371 <literal>GError *</literal> for the synchronous (blocking) function, or
1372 callback and user data arguments for the asynchronous (non-blocking)
1373 function. The callback in the asynchronous function passes the
1374 <literal>DBusGProxy *</literal>, the returned "out" arguments, an
1375 <literal>GError *</literal> which is set if there was an error otherwise
1376 <literal>NULL</literal>, and the user data.
1377 </para>
1378 <para>
1379 As with the server-side bindings support (see <xref
1380 linkend="glib-server"/>), the exact behaviour of the client-side
1381 bindings can be manipulated using "annotations". Currently the only
1382 annotation used by the client bindings is
1383 <literal>org.freedesktop.DBus.GLib.NoReply</literal>, which sets the
1384 flag indicating that the client isn't expecting a reply to the method
1385 call, so a reply shouldn't be sent. This is often used to speed up
1386 rapid method calls where there are no "out" arguments, and not knowing
1387 if the method succeeded is an acceptable compromise to half the traffic
1388 on the bus.
1389 </para>
1390 </sect2>
1391 </sect1>
1392
1393 <sect1 id="glib-server">
1394 <title>GLib API: Implementing Objects</title>
1395 <para>
1396 At the moment, to expose a GObject via D-Bus, you must
1397 write XML by hand which describes the methods exported
1398 by the object. In the future, this manual step will
1399 be obviated by the upcoming GLib introspection support.
1400 </para>
1401 <para>
1402 Here is a sample XML file which describes an object that exposes
1403 one method, named <literal>ManyArgs</literal>.
1404<programlisting>
1405&lt;?xml version="1.0" encoding="UTF-8" ?&gt;
1406
1407&lt;node name="/com/example/MyObject"&gt;
1408
1409 &lt;interface name="com.example.MyObject"&gt;
1410 &lt;annotation name="org.freedesktop.DBus.GLib.CSymbol" value="my_object"/&gt;
1411 &lt;method name="ManyArgs"&gt;
1412 &lt;!-- This is optional, and in this case is redunundant --&gt;
1413 &lt;annotation name="org.freedesktop.DBus.GLib.CSymbol" value="my_object_many_args"/&gt;
1414 &lt;arg type="u" name="x" direction="in" /&gt;
1415 &lt;arg type="s" name="str" direction="in" /&gt;
1416 &lt;arg type="d" name="trouble" direction="in" /&gt;
1417 &lt;arg type="d" name="d_ret" direction="out" /&gt;
1418 &lt;arg type="s" name="str_ret" direction="out" /&gt;
1419 &lt;/method&gt;
1420 &lt;/interface&gt;
1421&lt;/node&gt;
1422</programlisting>
1423 </para>
1424 <para>
1425 This XML is in the same format as the D-Bus introspection XML
1426 format. Except we must include an "annotation" which give the C
1427 symbols corresponding to the object implementation prefix
1428 (<literal>my_object</literal>). In addition, if particular
1429 methods symbol names deviate from C convention
1430 (i.e. <literal>ManyArgs</literal> -&gt;
1431 <literal>many_args</literal>), you may specify an annotation
1432 giving the C symbol.
1433 </para>
1434 <para>
1435 Once you have written this XML, run <literal>dbus-binding-tool --mode=glib-server <replaceable>FILENAME</replaceable> &gt; <replaceable>HEADER_NAME</replaceable>.</literal> to
1436 generate a header file. For example: <command>dbus-binding-tool --mode=glib-server my-object.xml &gt; my-object-glue.h</command>.
1437 </para>
1438 <para>
1439 Next, include the generated header in your program, and invoke
1440 <literal>dbus_g_object_class_install_info</literal> in the class
1441 initializer, passing the object class and "object info" included in the
1442 header. For example:
1443 <programlisting>
1444 dbus_g_object_type_install_info (COM_FOO_TYPE_MY_OBJECT, &amp;com_foo_my_object_info);
1445 </programlisting>
1446 This should be done exactly once per object class.
1447 </para>
1448 <para>
1449 To actually implement the method, just define a C function named e.g.
1450 <literal>my_object_many_args</literal> in the same file as the info
1451 header is included. At the moment, it is required that this function
1452 conform to the following rules:
1453 <itemizedlist>
1454 <listitem>
1455 <para>
1456 The function must return a value of type <literal>gboolean</literal>;
1457 <literal>TRUE</literal> on success, and <literal>FALSE</literal>
1458 otherwise.
1459 </para>
1460 </listitem>
1461 <listitem>
1462 <para>
1463 The first parameter is a pointer to an instance of the object.
1464 </para>
1465 </listitem>
1466 <listitem>
1467 <para>
1468 Following the object instance pointer are the method
1469 input values.
1470 </para>
1471 </listitem>
1472 <listitem>
1473 <para>
1474 Following the input values are pointers to return values.
1475 </para>
1476 </listitem>
1477 <listitem>
1478 <para>
1479 The final parameter must be a <literal>GError **</literal>.
1480 If the function returns <literal>FALSE</literal> for an
1481 error, the error parameter must be initalized with
1482 <literal>g_set_error</literal>.
1483 </para>
1484 </listitem>
1485 </itemizedlist>
1486 </para>
1487 <para>
1488 Finally, you can export an object using <literal>dbus_g_connection_register_g_object</literal>. For example:
1489 <programlisting>
1490 dbus_g_connection_register_g_object (connection,
1491 "/com/foo/MyObject",
1492 obj);
1493 </programlisting>
1494 </para>
1495
1496 <sect2 id="glib-annotations">
1497 <title>Server-side Annotations</title>
1498 <para>
1499 There are several annotations that are used when generating the
1500 server-side bindings. The most common annotation is
1501 <literal>org.freedesktop.DBus.GLib.CSymbol</literal> but there are other
1502 annotations which are often useful.
1503 <variablelist>
1504 <varlistentry>
1505 <term><literal>org.freedesktop.DBus.GLib.CSymbol</literal></term>
1506 <listitem>
1507 <para>
1508 This annotation is used to specify the C symbol names for
1509 the various types (interface, method, etc), if it differs from the
1510 name DBus generates.
1511 </para>
1512 </listitem>
1513 </varlistentry>
1514 <varlistentry>
1515 <term><literal>org.freedesktop.DBus.GLib.Async</literal></term>
1516 <listitem>
1517 <para>
1518 This annotation marks the method implementation as an
1519 asynchronous function, which doesn't return a response straight
1520 away but will send the response at some later point to complete
1521 the call. This is used to implement non-blocking services where
1522 method calls can take time.
1523 </para>
1524 <para>
1525 When a method is asynchronous, the function prototype is
1526 different. It is required that the function conform to the
1527 following rules:
1528 <itemizedlist>
1529 <listitem>
1530 <para>
1531 The function must return a value of type <literal>gboolean</literal>;
1532 <literal>TRUE</literal> on success, and <literal>FALSE</literal>
1533 otherwise. TODO: the return value is currently ignored.
1534 </para>
1535 </listitem>
1536 <listitem>
1537 <para>
1538 The first parameter is a pointer to an instance of the object.
1539 </para>
1540 </listitem>
1541 <listitem>
1542 <para>
1543 Following the object instance pointer are the method
1544 input values.
1545 </para>
1546 </listitem>
1547 <listitem>
1548 <para>
1549 The final parameter must be a
1550 <literal>DBusGMethodInvocation *</literal>. This is used
1551 when sending the response message back to the client, by
1552 calling <literal>dbus_g_method_return</literal> or
1553 <literal>dbus_g_method_return_error</literal>.
1554 </para>
1555 </listitem>
1556 </itemizedlist>
1557 </para>
1558 </listitem>
1559 </varlistentry>
1560 <varlistentry>
1561 <term><literal>org.freedesktop.DBus.GLib.Const</literal></term>
1562 <listitem>
1563 <para>This attribute can only be applied to "out"
1564 <literal>&lt;arg&gt;</literal> nodes, and specifies that the
1565 parameter isn't being copied when returned. For example, this
1566 turns a 's' argument from a <literal>char **</literal> to a
1567 <literal>const char **</literal>, and results in the argument not
1568 being freed by DBus after the message is sent.
1569 </para>
1570 </listitem>
1571 </varlistentry>
1572 <varlistentry>
1573 <term><literal>org.freedesktop.DBus.GLib.ReturnVal</literal></term>
1574 <listitem>
1575 <para>
1576 This attribute can only be applied to "out"
1577 <literal>&lt;arg&gt;</literal> nodes, and alters the expected
1578 function signature. It currently can be set to two values:
1579 <literal>""</literal> or <literal>"error"</literal>. The
1580 argument marked with this attribute is not returned via a
1581 pointer argument, but by the function's return value. If the
1582 attribute's value is the empty string, the <literal>GError
1583 *</literal> argument is also omitted so there is no standard way
1584 to return an error value. This is very useful for interfacing
1585 with existing code, as it is possible to match existing APIs.
1586 If the attribute's value is <literal>"error"</literal>, then the
1587 final argument is a <literal>GError *</literal> as usual.
1588 </para>
1589 <para>
1590 Some examples to demonstrate the usage. This introspection XML:
1591 <programlisting>
1592&lt;method name="Increment"&gt;
1593 &lt;arg type="u" name="x" /&gt;
1594 &lt;arg type="u" direction="out" /&gt;
1595&lt;/method&gt;
1596 </programlisting>
1597 Expects the following function declaration:
1598 <programlisting>
1599gboolean
1600my_object_increment (MyObject *obj, gint32 x, gint32 *ret, GError **error);
1601 </programlisting>
1602 </para>
1603 <para>
1604 This introspection XML:
1605 <programlisting>
1606&lt;method name="IncrementRetval"&gt;
1607 &lt;arg type="u" name="x" /&gt;
1608 &lt;arg type="u" direction="out" &gt;
1609 &lt;annotation name="org.freedesktop.DBus.GLib.ReturnVal" value=""/&gt;
1610 &lt;/arg&gt;
1611&lt;/method&gt;
1612 </programlisting>
1613 Expects the following function declaration:
1614 <programlisting>
1615gint32
1616my_object_increment_retval (MyObject *obj, gint32 x)
1617 </programlisting>
1618 </para>
1619 <para>
1620 This introspection XML:
1621 <programlisting>
1622&lt;method name="IncrementRetvalError"&gt;
1623 &lt;arg type="u" name="x" /&gt;
1624 &lt;arg type="u" direction="out" &gt;
1625 &lt;annotation name="org.freedesktop.DBus.GLib.ReturnVal" value="error"/&gt;
1626 &lt;/arg&gt;
1627&lt;/method&gt;
1628 </programlisting>
1629 Expects the following function declaration:
1630 <programlisting>
1631gint32
1632my_object_increment_retval_error (MyObject *obj, gint32 x, GError **error)
1633 </programlisting>
1634 </para>
1635 </listitem>
1636 </varlistentry>
1637 </variablelist>
1638 </para>
1639 </sect2>
1640 </sect1>
1641
1642 <sect1 id="python-client">
1643 <title>Python API</title>
1644 <para>
1645 The Python API, dbus-python, is now documented separately in
1646 <ulink url="http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html">the dbus-python tutorial</ulink> (also available in doc/tutorial.txt,
1647 and doc/tutorial.html if built with python-docutils, in the dbus-python
1648 source distribution).
1649 </para>
1650 </sect1>
1651
1652 <sect1 id="qt-client">
1653 <title>Qt API: Using Remote Objects</title>
1654 <para>
1655
1656 The Qt bindings are not yet documented.
1657
1658 </para>
1659 </sect1>
1660
1661 <sect1 id="qt-server">
1662 <title>Qt API: Implementing Objects</title>
1663 <para>
1664 The Qt bindings are not yet documented.
1665 </para>
1666 </sect1>
1667</article>