Home | History | Annotate | Download | only in doc
      1 <?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 (a] 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 (a] 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 (a] 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>      
    999 int
   1000 main (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 */
   1348 gboolean
   1349 com_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 */
   1355 DBusGProxyCall*
   1356 com_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 */
   1362 typedef 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>
   1599 gboolean
   1600 my_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>
   1615 gint32
   1616 my_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>
   1631 gint32
   1632 my_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>
   1668