summaryrefslogtreecommitdiffstats
path: root/doc
diff options
context:
space:
mode:
authorHavoc Pennington <hp@redhat.com>2005-01-18 20:42:15 +0000
committerHavoc Pennington <hp@redhat.com>2005-01-18 20:42:15 +0000
commit8873c90f99303f9cc308f15f8d03e637911f5b9e (patch)
tree03e459881912388cc6c3759d91fb0cf75739a5a7 /doc
parent4fce285052c143296cd9e08a48de0175b5207853 (diff)
2005-01-18 Havoc Pennington <hp@redhat.com>
* Throughout, grand renaming to strip out the use of "service", just say "name" instead (or "bus name" when ambiguous). Did not change the internal code of the message bus itself, only the programmer-facing API and messages. * doc/dbus-specification.xml: further update the message bus section * bus/config-parser.c (all_are_equiv): fix bug using freed string in error case
Diffstat (limited to 'doc')
-rw-r--r--doc/TODO16
-rw-r--r--doc/dbus-specification.xml962
-rw-r--r--doc/dbus-tutorial.xml90
-rw-r--r--doc/diagram.pngbin0 -> 78762 bytes
-rw-r--r--doc/diagram.svg590
5 files changed, 1104 insertions, 554 deletions
diff --git a/doc/TODO b/doc/TODO
index c688583e..eac3e50b 100644
--- a/doc/TODO
+++ b/doc/TODO
@@ -1,5 +1,7 @@
Important for 1.0
===
+
+ - change .service files to have Names=list rather than Name=string
- How we will handle DCOP needs sorting out. Among other things, we
need to check that service and service-ownership semantics map to DCOP
@@ -38,18 +40,14 @@ Important for 1.0
(though they are kind of a pita to pass in as size_t with the
varargs, so maybe not - what does glib do with g_object_get()?)
- - rename the service thing. unique service names (":1") and well-known
- ("org.foo.bar") should have different names probably; something like
- "address" for the unique and "alias" for the well-known, or
- "application id" for the unique and "common name" or "published
- name" for the well-known; not sure yet.
-
- things are broken now when mixing endianness, because DBusMessage
doesn't autoswap itself when you access a message of alternate
endian.
- add string array support back to append_args()
+ - auto-activate by default
+
Important for 1.0 GLib Bindings
===
@@ -71,6 +69,8 @@ Important for 1.0 GLib Bindings
so it can figure out how to invoke the callback, or we have to rely
on having introspection data.
+ - DBusGProxy doesn't emit "destroy" when it should
+
Might as Well for 1.0
===
@@ -90,6 +90,10 @@ Might as Well for 1.0
Can Be Post 1.0
===
+ - The message bus internal code still says "service" for
+ "name", "base service" for "unique name", "activate" for
+ "start"; would be nice to clean up.
+
- Property list feature on message bus (list of properties associated
with a connection). May also include message matching rules
that involve the properties of the source or destination
diff --git a/doc/dbus-specification.xml b/doc/dbus-specification.xml
index f2c0146b..821c6011 100644
--- a/doc/dbus-specification.xml
+++ b/doc/dbus-specification.xml
@@ -96,6 +96,30 @@
monitoring service or a configuration service.
</para>
+ <para>
+ D-BUS is designed for two specific use cases:
+ <itemizedlist>
+ <listitem>
+ <para>
+ A "system bus" for notifications from the system to user sessions,
+ and to allow the system to request input from user sessions.
+ </para>
+ </listitem>
+ <listitem>
+ <para>
+ A "session bus" used to implement desktop environments such as
+ GNOME and KDE.
+ </para>
+ </listitem>
+ </itemizedlist>
+ D-BUS is not intended to be a generic IPC system for any possible
+ application, and intentionally omits many features found in other
+ IPC systems for this reason. D-BUS may turn out to be useful
+ in unanticipated applications, but future versions of this
+ spec and the reference implementation probably will not
+ incorporate features that interfere with the core use cases.
+ </para>
+
</sect1>
<sect1 id="message-protocol">
@@ -733,10 +757,11 @@
to return the reply despite this flag.</entry>
</row>
<row>
- <entry><literal>AUTO_ACTIVATION</literal></entry>
+ <entry><literal>AUTO_START</literal></entry>
<entry>0x2</entry>
- <entry>This message automatically activates the
- addressed service before the message is delivered.</entry>
+ <entry>This message automatically launches an owner
+ for the destination name before the message is delivered.
+ </entry>
</row>
</tbody>
</tgroup>
@@ -841,7 +866,7 @@
<entry>6</entry>
<entry><literal>STRING</literal></entry>
<entry>optional</entry>
- <entry>The name of the service this message should be routed to.
+ <entry>The name of the connection this message should be routed to.
Only used in combination with the message bus, see
<xref linkend="message-bus"/>.</entry>
</row>
@@ -850,8 +875,8 @@
<entry>7</entry>
<entry><literal>STRING</literal></entry>
<entry>optional</entry>
- <entry>Sender service. The name of the base service that sent
- this message. The message bus fills in this field; the field is
+ <entry>Unique name of the sending connection.
+ The message bus fills in this field so it is reliable; the field is
only meaningful in combination with the message bus.</entry>
</row>
<row>
@@ -877,8 +902,7 @@
</para>
<para>
There is a <firstterm>maximum name length</firstterm>
- of 255 which applies to service, interface, and member
- names.
+ of 255 which applies to bus names, interfaces, and members.
</para>
<sect3 id="message-protocol-names-interface">
<title>Interface names</title>
@@ -907,15 +931,15 @@
</itemizedlist>
</para>
</sect3>
- <sect3 id="message-protocol-names-service">
- <title>Service names</title>
+ <sect3 id="message-protocol-names-bus">
+ <title>Bus names</title>
<para>
- Service names have the same restrictions as interface names, with a
- special exception for base services. A base service name's first
+ Bus names have the same restrictions as interface names, with a
+ special exception for unique connection names. A unique name's first
element must start with a colon (':') character. After the colon, any
characters in "[A-Z][a-z][0-9]_" may appear. Elements after
the first must follow the usual rules, except that they may start with
- a digit. Service names not starting with a colon have none of these
+ a digit. Bus names not starting with a colon have none of these
exceptions and follow the same rules as interface names.
</para>
</sect3>
@@ -966,10 +990,11 @@
implementations must not require an interface field.
</para>
<para>
- Method call messages also include a <literal>PATH</literal> field indicating the
- object to invoke the method on. If the call is passing through
- a message bus, the message will also have a <literal>DESTINATION</literal> field giving
- the service to receive the message.
+ Method call messages also include a <literal>PATH</literal> field
+ indicating the object to invoke the method on. If the call is passing
+ through a message bus, the message will also have a
+ <literal>DESTINATION</literal> field giving the name of the connection
+ to receive the message.
</para>
<para>
When an application handles a method call message, it is expected to
@@ -1002,14 +1027,13 @@
flag and reply anyway.
</para>
<para>
- If a message has the flag <literal>AUTO_ACTIVATION</literal>, then the addressed
- service will be activated before the message is delivered, if
- not already active. The message will be held until the service
- is successfully activated or has failed to activate; in case
- of failure, an activation error will be returned. Activation
- is only relevant in the context of a message bus, so this
- flag is ignored for one-to-one communication with no
- intermediate bus.
+ If a message has the flag <literal>AUTO_START</literal> and the
+ destination name does not exist, then a program to own the destination
+ name will be started before the message is delivered. The message
+ will be held until the new program is successfully started or has
+ failed to start; in case of failure, an error will be returned. This
+ flag is only relevant in the context of a message bus, it is ignored
+ during one-to-one communication with no intermediate bus.
</para>
<sect4 id="message-protocol-types-method-apis">
<title>Mapping method calls to native APIs</title>
@@ -1086,10 +1110,10 @@
This document uses a simple pseudo-IDL to describe particular method
calls and signals. Here is an example of a method call:
<programlisting>
- org.freedesktop.DBus.ActivateService (in STRING service_name, in UINT32 flags,
- out UINT32 resultcode)
+ org.freedesktop.DBus.StartServiceByName (in STRING name, in UINT32 flags,
+ out UINT32 resultcode)
</programlisting>
- This means <literal>INTERFACE</literal> = org.freedesktop.DBus, <literal>MEMBER</literal> = ActivateService,
+ This means <literal>INTERFACE</literal> = org.freedesktop.DBus, <literal>MEMBER</literal> = StartServiceByName,
<literal>METHOD_CALL</literal> arguments are <literal>STRING</literal> and <literal>UINT32</literal>, <literal>METHOD_RETURN</literal> argument
is <literal>UINT32</literal>. Remember that the <literal>MEMBER</literal> field can't contain any '.' (period)
characters so it's known that the last part of the name in
@@ -1098,14 +1122,14 @@
<para>
In C++ that might end up looking like this:
<programlisting>
- unsigned int org::freedesktop::DBus::ActivateService (const char *service_name,
- unsigned int flags);
+ unsigned int org::freedesktop::DBus::StartServiceByName (const char *name,
+ unsigned int flags);
</programlisting>
or equally valid, the return value could be done as an argument:
<programlisting>
- void org::freedesktop::DBus::ActivateService (const char *service_name,
- unsigned int flags,
- unsigned int *resultcode);
+ void org::freedesktop::DBus::StartServiceByName (const char *name,
+ unsigned int flags,
+ unsigned int *resultcode);
</programlisting>
It's really up to the API designer how they want to make
this look. You could design an API where the namespace wasn't used
@@ -1114,7 +1138,7 @@
<para>
Signals are written as follows:
<programlisting>
- org.freedesktop.DBus.ServiceLost (STRING service_name)
+ org.freedesktop.DBus.NameLost (STRING name)
</programlisting>
Signals don't specify "in" vs. "out" because only
a single direction is possible.
@@ -1988,42 +2012,6 @@
</para>
</sect2>
- <sect2 id="standard-messages-get-props">
- <title><literal>org.freedesktop.Props.Get</literal></title>
- <para>
- [FIXME this is just a bogus made-up method that isn't implemented
- or thought through, to save an example of table formatting for the
- argument descriptions]
- <programlisting>
- org.freedesktop.Props.Get (in STRING property_name,
- out ANY_OR_NIL property_value)
- </programlisting>
- Message arguments:
- <informaltable>
- <tgroup cols="3">
- <thead>
- <row>
- <entry>Argument</entry>
- <entry>Type</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>0</entry>
- <entry>in STRING</entry>
- <entry>Name of the property to get</entry>
- </row>
- <row>
- <entry>1</entry>
- <entry>out ANY_OR_NIL</entry>
- <entry>The value of the property. The type depends on the property.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </para>
- </sect2>
</sect1>
<sect1 id="message-bus">
@@ -2032,188 +2020,316 @@
<title>Message Bus Overview</title>
<para>
The message bus accepts connections from one or more applications.
- Once connected, applications can send and receive messages from
- the message bus, as in the one-to-one case.
+ Once connected, applications can exchange messages with other
+ applications that are also connected to the bus.
</para>
<para>
- The message bus keeps track of a set of
- <firstterm>services</firstterm>. A service is simply a name, such as
- <literal>com.yoyodyne.Screensaver</literal>, which can be
- <firstterm>owned</firstterm> by one or more of the connected
- applications. The message bus itself always owns the special service
- <literal>org.freedesktop.DBus</literal>.
+ In order to route messages among connections, the message bus keeps a
+ mapping from names to connections. Each connection has one
+ unique-for-the-lifetime-of-the-bus name automatically assigned.
+ Applications may request additional names for a connection. Additional
+ names are usually "well-known names" such as
+ "org.freedesktop.TextEditor". When a name is bound to a connection,
+ that connection is said to <firstterm>own</firstterm> the name.
</para>
<para>
- Services may have <firstterm>secondary owners</firstterm>. Secondary owners
- of a service are kept in a queue; if the primary owner of a service
- disconnects, or releases the service, the next secondary owner becomes
- the new owner of the service.
+ The bus itself owns a special name, <literal>org.freedesktop.DBus</literal>.
+ This name routes messages to the bus, allowing applications to make
+ administrative requests. For example, applications can ask the bus
+ to assign a name to a connection.
</para>
<para>
+ Each name may have <firstterm>queued owners</firstterm>. When an
+ application requests a name for a connection and the name is already in
+ use, the bus will optionally add the connection to a queue waiting for
+ the name. If the current owner of the name disconnects or releases
+ the name, the next connection in the queue will become the new owner.
+ </para>
+
+ <para>
+ This feature causes the right thing to happen if you start two text
+ editors for example; the first one may request "org.freedesktop.TextEditor",
+ and the second will be queued as a possible owner of that name. When
+ the first exits, the second will take over.
+ </para>
+
+ <para>
Messages may have a <literal>DESTINATION</literal> field (see <xref
- linkend="message-protocol-header-fields"/>). When the message bus
- receives a message, if the <literal>DESTINATION</literal> field is absent, the
- message is taken to be a standard one-to-one message and interpreted
- by the message bus itself. For example, sending
- an <literal>org.freedesktop.Peer.Ping</literal> message with no
- <literal>DESTINATION</literal> will cause the message bus itself to reply
- to the ping immediately; the message bus would never make
- this message visible to other applications.
- </para>
- <para>
- If the <literal>DESTINATION</literal> field is present, then it indicates a
- request for the message bus to route the message. In the usual case,
- messages are routed to the owner of the named service.
- Messages may also be <firstterm>broadcast</firstterm>
- by sending them to the special service
- <literal>org.freedesktop.DBus.Broadcast</literal>. Broadcast messages are
- sent to all applications with <firstterm>message matching
- rules</firstterm> that match the message.
+ linkend="message-protocol-header-fields"/>). If the
+ <literal>DESTINATION</literal> field is present, it specifies a message
+ recipient by name. Method calls and replies normally specify this field.
</para>
+
+ <para>
+ Signals normally do not specify a destination; they are sent to all
+ applications with <firstterm>message matching rules</firstterm> that
+ match the message.
+ </para>
+
+ <para>
+ When the message bus receives a method call, if the
+ <literal>DESTINATION</literal> field is absent, the call is taken to be
+ a standard one-to-one message and interpreted by the message bus
+ itself. For example, sending an
+ <literal>org.freedesktop.Peer.Ping</literal> message with no
+ <literal>DESTINATION</literal> will cause the message bus itself to
+ reply to the ping immediately; the message bus will not make this
+ message visible to other applications.
+ </para>
+
<para>
Continuing the <literal>org.freedesktop.Peer.Ping</literal> example, if
the ping message were sent with a <literal>DESTINATION</literal> name of
<literal>com.yoyodyne.Screensaver</literal>, then the ping would be
forwarded, and the Yoyodyne Corporation screensaver application would be
- expected to reply to the ping. If
- <literal>org.freedesktop.Peer.Ping</literal> were sent to
- <literal>org.freedesktop.DBus.Broadcast</literal>, then multiple applications
- might receive the ping, and all would normally reply to it.
+ expected to reply to the ping.
</para>
</sect2>
- <sect2 id="message-bus-services">
- <title>Message Bus Services</title>
+ <sect2 id="message-bus-names">
+ <title>Message Bus Names</title>
<para>
- A service is a name that identifies a certain application. Each
- application connected to the message bus has at least one service name
- assigned at connection time and returned in response to the
- <literal>org.freedesktop.DBus.Hello</literal> message.
- This automatically-assigned service name is called
- the application's <firstterm>base service</firstterm>.
- Base service names are unique and MUST never be reused for two different
- applications.
+ Each connection has at least one name, assigned at connection time and
+ returned in response to the
+ <literal>org.freedesktop.DBus.Hello</literal> method call. This
+ automatically-assigned name is called the connection's <firstterm>unique
+ name</firstterm>. Unique names are never reused for two different
+ connections to the same bus.
</para>
<para>
- Ownership of the base service is a prerequisite for interaction with
- the message bus. It logically follows that the base service is always
- the first service that an application comes to own, and the last
- service that it loses ownership of.
+ Ownership of a unique name is a prerequisite for interaction with
+ the message bus. It logically follows that the unique name is always
+ the first name that an application comes to own, and the last
+ one that it loses ownership of.
</para>
<para>
- Base service names must begin with the character ':' (ASCII colon
- character); service names that are not base service names must not begin
+ Unique connection names must begin with the character ':' (ASCII colon
+ character); bus names that are not unique names must not begin
with this character. (The bus must reject any attempt by an application
- to manually create a service name beginning with ':'.) This restriction
- categorically prevents "spoofing"; messages sent to a base service name
- will always go to a single application instance and that instance only.
- </para>
- <para>
- An application can request additional service names to be associated
- with it using the
- <literal>org.freedesktop.DBus.AcquireService</literal>
- message. [FIXME what service names are allowed; ASCII or unicode;
- length limit; etc.]
- </para>
- <para>
- [FIXME this needs more detail, and should move the service-related message
- descriptions up into this section perhaps]
- Service ownership handling can be specified in the flags part
- of the <literal>org.freedesktop.DBus.AcquireService</literal>
- message. If an application specifies the
- <literal>DBUS_SERVICE_FLAGS_PROHIBIT_REPLACEMENT</literal> flag, then all applications
- trying to acquire the service will be put in a queue. When the
- primary owner disconnects from the bus or removes ownership
- from the service, the next application in the queue will be the
- primary owner. If the <literal>DBUS_SERVICE_FLAGS_PROHIBIT_REPLACEMENT</literal>
- flag is not specified, then the primary owner will lose
- ownership whenever another application requests ownership of the
- service.
- </para>
- <para>
- When a client disconnects from the bus, all the services that
- the clients own are deleted, or in the case of a service that
- prohibits replacement, ownership is transferred to the next
- client in the queue, if any.
+ to manually request a name beginning with ':'.) This restriction
+ categorically prevents "spoofing"; messages sent to a unique name
+ will always go to the expected connection.
</para>
+ <para>
+ When a connection is closed, all the names that it owns are deleted (or
+ transferred to the next connection in the queue if any).
+ </para>
+ <para>
+ A connection can request additional names to be associated with it using
+ the <literal>org.freedesktop.DBus.RequestName</literal> message. <xref
+ linkend="message-protocol-names-bus"/> describes the format of a valid
+ name.
+ </para>
+
+ <sect3 id="bus-messages-request-name">
+ <title><literal>org.freedesktop.DBus.RequestName</literal></title>
+ <para>
+ As a method:
+ <programlisting>
+ UINT32 RequestName (in STRING name, in UINT32 flags)
+ </programlisting>
+ Message arguments:
+ <informaltable>
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>Argument</entry>
+ <entry>Type</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>0</entry>
+ <entry>STRING</entry>
+ <entry>Name to request</entry>
+ </row>
+ <row>
+ <entry>1</entry>
+ <entry>UINT32</entry>
+ <entry>Flags</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ Reply arguments:
+ <informaltable>
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>Argument</entry>
+ <entry>Type</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>0</entry>
+ <entry>UINT32</entry>
+ <entry>Return value</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+ <para>
+ This method call should be sent to
+ <literal>org.freedesktop.DBus</literal> and asks the message bus to
+ assign the given name to the method caller. The flags argument
+ contains any of the following values logically ORed together:
+
+ <informaltable>
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>Conventional Name</entry>
+ <entry>Value</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>DBUS_NAME_FLAG_PROHIBIT_REPLACEMENT</entry>
+ <entry>0x1</entry>
+ <entry>
+ If the application succeeds in becoming the owner of the specified name,
+ then ownership of the name can't be transferred until the application
+ disconnects. If this flag is not set, then any application trying to become
+ the owner of the name will succeed and the previous owner will be
+ sent a <literal>org.freedesktop.DBus.NameOwnerChanged</literal> signal.
+ </entry>
+ </row>
+ <row>
+ <entry>DBUS_NAME_FLAG_REPLACE_EXISTING</entry>
+ <entry>0x2</entry>
+ <entry>
+ Try to replace the current owner if there is one. If this
+ flag is not set the application will only become the owner of
+ the name if there is no current owner.
+ </entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+
+ The return code can be one of the following values:
+
+ <informaltable>
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>Conventional Name</entry>
+ <entry>Value</entry>
+ <entry>Description</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER</entry>
+ <entry>1</entry> <entry>The caller is now the primary owner of
+ the name, replacing any previous owner. Either the name had no
+ owner before, or the caller specified
+ DBUS_NAME_FLAG_REPLACE_EXISTING and the current owner did not
+ specify DBUS_NAME_FLAG_PROHIBIT_REPLACEMENT.</entry>
+ </row>
+ <row>
+ <entry>DBUS_REQUEST_NAME_REPLY_IN_QUEUE</entry>
+ <entry>2</entry>
+ <entry>The name already had an owner, DBUS_NAME_FLAG_REPLACE_EXISTING was not specified, and the current owner specified DBUS_NAME_FLAG_PROHIBIT_REPLACEMENT.</entry>
+ </row>
+ <row>
+ <entry>DBUS_REQUEST_NAME_REPLY_EXISTS</entry>
+ <entry>3</entry>
+ <entry>The name already has an owner, and DBUS_NAME_FLAG_REPLACE_EXISTING was not specified.</entry>
+ </row>
+ <row>
+ <entry>DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER</entry>
+ <entry>4</entry>
+ <entry>The application trying to request ownership of a name is already the owner of it.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </informaltable>
+ </para>
+ </sect3>
</sect2>
+
<sect2 id="message-bus-routing">
<title>Message Bus Message Routing</title>
<para>
- When a message is received by the message bus, the message's
- <literal>sndr</literal> header field MUST be set to the base service of
- the application which sent the message. If the service already has
- a <literal>sndr</literal> field, the pre-existing field is replaced.
- This rule means that a replies are always sent to the base service name,
- i.e. to the same application that sent the message being replied to.
+ FIXME
</para>
+ </sect2>
+ <sect2 id="message-bus-starting-services">
+ <title>Message Bus Starting Services</title>
<para>
- [FIXME go into detail about broadcast, multicast, unicast, etc.]
+ The message bus can start applications on behalf of other applications.
+ In CORBA terms, this would be called <firstterm>activation</firstterm>.
+ An application that can be started in this way is called a
+ <firstterm>service</firstterm>.
</para>
- </sect2>
- <sect2 id="message-bus-activation">
- <title>Message Bus Service Activation</title>
<para>
- <firstterm>Activation</firstterm> means to locate a service
- owner for a service that is currently unowned. For now, it
- means to launch an executable that will take ownership of
- a particular service.
+ With D-BUS, starting a service is normally done by name. That is,
+ applications ask the message bus to start some program that will own a
+ well-known name, such as <literal>org.freedesktop.TextEditor</literal>.
+ This implies a contract documented along with the name
+ <literal>org.freedesktop.TextEditor</literal> for which objects
+ the owner of that name will provide, and what interfaces those
+ objects will have.
</para>
<para>
- To find an executable corresponding to a particular service, the bus
- daemon looks for <firstterm>service description files</firstterm>.
- Service description files define a mapping from service names to
- executables. Different kinds of message bus will look for these files
- in different places, see <xref linkend="message-bus-types"/>.
+ To find an executable corresponding to a particular name, the bus daemon
+ looks for <firstterm>service description files</firstterm>. Service
+ description files define a mapping from names to executables. Different
+ kinds of message bus will look for these files in different places, see
+ <xref linkend="message-bus-types"/>.
</para>
<para>
- [FIXME the file format should be much better specified than
- "similar to .desktop entries" esp. since desktop entries are
- already badly-specified. ;-)] Service description files have
- the ".service" file extension. The message bus will only load
- service description files ending with .service; all other
- files will be ignored. The file format is similar to that of
- <ulink
+ [FIXME the file format should be much better specified than "similar to
+ .desktop entries" esp. since desktop entries are already
+ badly-specified. ;-)] Service description files have the ".service" file
+ extension. The message bus will only load service description files
+ ending with .service; all other files will be ignored. The file format
+ is similar to that of <ulink
url="http://www.freedesktop.org/standards/desktop-entry-spec/desktop-entry-spec.html">desktop
- entries</ulink>. All service description files must be in
- UTF-8 encoding. To ensure that there will be no name
- collisions, service files must be namespaced using the same
- mechanism as messages and service names.
+ entries</ulink>. All service description files must be in UTF-8
+ encoding. To ensure that there will be no name collisions, service files
+ must be namespaced using the same mechanism as messages and service
+ names.
<figure>
<title>Example service description file</title>
<programlisting>
# Sample service description file
[D-BUS Service]
- Name=org.gnome.ConfigurationDatabase
+ Names=org.freedesktop.ConfigurationDatabase;org.gnome.GConf;
Exec=/usr/libexec/gconfd-2
</programlisting>
</figure>
</para>
<para>
- When an application requests a service to be activated, the
- bus daemon tries to find it in the list of activation
- entries. It then tries to spawn the executable associated with
- it. If this fails, it will report an error. [FIXME what
- happens if two .service files offer the same service; what
- kind of error is reported, should we have a way for the client
- to choose one?]
+ When an application asks to start a service by name, the bus daemon tries to
+ find a service that will own that name. It then tries to spawn the
+ executable associated with it. If this fails, it will report an
+ error. [FIXME what happens if two .service files offer the same service;
+ what kind of error is reported, should we have a way for the client to
+ choose one?]
</para>
<para>
The executable launched will have the environment variable
- <literal>DBUS_ACTIVATION_ADDRESS</literal> set to the address of the
- message bus so it can connect and register the appropriate services.
+ <literal>DBUS_STARTER_ADDRESS</literal> set to the address of the
+ message bus so it can connect and request the appropriate names.
</para>
<para>
The executable being launched may want to know whether the message bus
- activating it is one of the well-known message buses (see <xref
+ starting it is one of the well-known message buses (see <xref
linkend="message-bus-types"/>). To facilitate this, the bus MUST also set
- the <literal>DBUS_ACTIVATION_BUS_TYPE</literal> environment variable if it is one
+ the <literal>DBUS_STARTER_BUS_TYPE</literal> environment variable if it is one
of the well-known buses. The currently-defined values for this variable
are <literal>system</literal> for the systemwide message bus,
and <literal>session</literal> for the per-login-session message
- bus. The activated executable must still connect to the address given
- in <literal>DBUS_ACTIVATION_ADDRESS</literal>, but may assume that the
+ bus. The new executable must still connect to the address given
+ in <literal>DBUS_STARTER_ADDRESS</literal>, but may assume that the
resulting connection is to the well-known bus.
</para>
<para>
@@ -2262,7 +2378,7 @@
changes in the printer queue, and so forth.
</para>
<para>
- The address of the login session message bus is given
+ The address of the system message bus is given
in the <literal>DBUS_SYSTEM_BUS_ADDRESS</literal> environment
variable. If that variable is not set, applications should try
to connect to the well-known address
@@ -2284,9 +2400,8 @@
<sect2 id="message-bus-messages">
<title>Message Bus Messages</title>
<para>
- The special message bus service <literal>org.freedesktop.DBus</literal>
- responds to a number of messages, allowing applications to
- interact with the message bus.
+ The special message bus name <literal>org.freedesktop.DBus</literal>
+ responds to a number of additional messages.
</para>
<sect3 id="bus-messages-hello">
@@ -2310,34 +2425,33 @@
<row>
<entry>0</entry>
<entry>STRING</entry>
- <entry>Name of the service assigned to the application</entry>
+ <entry>Unique name assigned to the connection</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>
<para>
- Before an application is able to send messages to other
- applications it must send the
- <literal>org.freedesktop.DBus.Hello</literal> message to the
- message bus service. If an application tries to send a
- message to another application, or a message to the message
- bus service that isn't the
- <literal>org.freedesktop.DBus.Hello</literal> message, it
- will be disconnected from the bus. If a client wishes to
- disconnect from the bus, it just has to disconnect from the
- transport used. No de-registration message is necessary.
+ Before an application is able to send messages to other applications
+ it must send the <literal>org.freedesktop.DBus.Hello</literal> message
+ to the message bus to obtain a unique name. If an application without
+ a unique name tries to send a message to another application, or a
+ message to the message bus itself that isn't the
+ <literal>org.freedesktop.DBus.Hello</literal> message, it will be
+ disconnected from the bus.
</para>
<para>
- The reply message contains the name of the application's base service.
+ There is no corresponding "disconnect" request; if a client wishes to
+ disconnect from the bus, it simply closes the socket (or other
+ communication channel).
</para>
</sect3>
- <sect3 id="bus-messages-list-services">
- <title><literal>org.freedesktop.DBus.ListServices</literal></title>
+ <sect3 id="bus-messages-list-names">
+ <title><literal>org.freedesktop.DBus.ListNames</literal></title>
<para>
As a method:
<programlisting>
- STRING_ARRAY ListServices ()
+ ARRAY of STRING ListNames ()
</programlisting>
Reply arguments:
<informaltable>
@@ -2352,23 +2466,23 @@
<tbody>
<row>
<entry>0</entry>
- <entry>STRING_ARRAY</entry>
- <entry>Array of strings where each string is the name of a service</entry>
+ <entry>ARRAY of STRING</entry>
+ <entry>Array of strings where each string is a bus name</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>
<para>
- Returns a list of all existing services registered with the message bus.
+ Returns a list of all currently-owned names on the bus.
</para>
</sect3>
- <sect3 id="bus-messages-service-exists">
- <title><literal>org.freedesktop.DBus.ServiceExists</literal></title>
+ <sect3 id="bus-messages-name-exists">
+ <title><literal>org.freedesktop.DBus.NameHasOwner</literal></title>
<para>
As a method:
<programlisting>
- BOOLEAN ServiceExists (in STRING service_name)
+ BOOLEAN NameHasOwner (in STRING name)
</programlisting>
Message arguments:
<informaltable>
@@ -2384,7 +2498,7 @@
<row>
<entry>0</entry>
<entry>STRING</entry>
- <entry>Name of the service</entry>
+ <entry>Name to check</entry>
</row>
</tbody>
</tgroup>
@@ -2403,23 +2517,23 @@
<row>
<entry>0</entry>
<entry>BOOLEAN</entry>
- <entry>Return value, true if the service exists</entry>
+ <entry>Return value, true if the name exists</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>
<para>
- Checks if a service with a specified name exists.
+ Checks if the specified name exists (currently has an owner).
</para>
</sect3>
- <sect3 id="bus-messages-acquire-service">
- <title><literal>org.freedesktop.DBus.AcquireService</literal></title>
+ <sect3 id="bus-messages-name-owner-changed">
+ <title><literal>org.freedesktop.DBus.NameOwnerChanged</literal></title>
<para>
- As a method:
+ This is a signal:
<programlisting>
- UINT32 AcquireService (in STRING service_name)
+ NameOwnerChanged (STRING name, STRING old_owner, STRING new_owner)
</programlisting>
Message arguments:
<informaltable>
@@ -2435,154 +2549,34 @@
<row>
<entry>0</entry>
<entry>STRING</entry>
- <entry>Name of the service</entry>
+ <entry>Name with a new owner</entry>
</row>
<row>
<entry>1</entry>
- <entry>UINT32</entry>
- <entry>Flags</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- Reply arguments:
- <informaltable>
- <tgroup cols="3">
- <thead>
- <row>
- <entry>Argument</entry>
- <entry>Type</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>0</entry>
- <entry>UINT32</entry>
- <entry>Return value</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </para>
- <para>
- Tries to become owner of a specific service. The flags
- specified can be the following values logically ORed together:
-
- <informaltable>
- <tgroup cols="3">
- <thead>
- <row>
- <entry>Identifier</entry>
- <entry>Value</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>DBUS_SERVICE_FLAGS_PROHIBIT_REPLACEMENT</entry>
- <entry>0x1</entry>
- <entry>
- If the application succeeds in being the owner of the specified service,
- then ownership of the service can't be transferred until the service
- disconnects. If this flag is not set, then any application trying to become
- the owner of the service will succeed and the previous owner will be
- sent a <literal>org.freedesktop.DBus.ServiceLost</literal> message.
- </entry>
- </row>
- <row>
- <entry>DBUS_SERVICE_FLAGS_REPLACE_EXISTING</entry>
- <entry>0x2</entry>
- <entry>Try to replace the current owner if there is one. If this flag
- is not set the application will only become the owner of the service if
- there is no current owner.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- [FIXME if it's one of the following values, why are the values
- done as flags instead of just 0, 1, 2, 3, 4]
- The return value can be one of the following values:
-
- <informaltable>
- <tgroup cols="3">
- <thead>
- <row>
- <entry>Identifier</entry>
- <entry>Value</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>DBUS_SERVICE_REPLY_PRIMARY_OWNER</entry>
- <entry>0x1</entry>
- <entry>The application is now the primary owner of the service.</entry>
- </row>
- <row>
- <entry>DBUS_SERVICE_REPLY_IN_QUEUE</entry>
- <entry>0x2</entry>
- <entry>The service already has an owner which do not want to give up ownership and therefore the application has been put in a queue.</entry>
- </row>
- <row>
- <entry>DBUS_SERVICE_REPLY_SERVICE_EXISTS</entry>
- <entry>0x4</entry>
- <entry>The service does already have a primary owner, and DBUS_SERVICE_FLAG_REPLACE_EXISTING was not specified when trying to acquire the service.</entry>
- </row>
- <row>
- <entry>DBUS_SERVICE_REPLY_ALREADY_OWNER</entry>
- <entry>0x8</entry>
- <entry>The application trying to request ownership of the service is already the owner of it.</entry>
+ <entry>STRING</entry>
+ <entry>Old owner or empty string if none</entry>
</row>
- </tbody>
- </tgroup>
- </informaltable>
- </para>
- </sect3>
- <sect3 id="bus-messages-service-acquired">
- <title><literal>org.freedesktop.DBus.ServiceAcquired</literal></title>
- <para>
- As a method:
- <programlisting>
- ServiceAcquired (in STRING service_name)
- </programlisting>
- Message arguments:
- <informaltable>
- <tgroup cols="3">
- <thead>
- <row>
- <entry>Argument</entry>
- <entry>Type</entry>
- <entry>Description</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry>0</entry>
- <entry>STRING</entry>
- <entry>Name of the service</entry>
- </row>
<row>
- <entry>1</entry>
- <entry>UINT32</entry>
- <entry>Flags</entry>
+ <entry>2</entry>
+ <entry>STRING</entry>
+ <entry>New owner or empty string if none</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>
<para>
- This message is sent to a specific application when it becomes the
- primary owner of a service.
+ This signal indicates that the owner of a name has changed.
+ It's also the signal to use to detect the appearance of
+ new names on the bus.
</para>
</sect3>
- <sect3 id="bus-messages-service-lost">
- <title><literal>org.freedesktop.DBus.ServiceLost</literal></title>
+ <sect3 id="bus-messages-name-lost">
+ <title><literal>org.freedesktop.DBus.NameLost</literal></title>
<para>
- As a method:
+ This is a signal:
<programlisting>
- ServiceLost (in STRING service_name)
+ NameLost (STRING name)
</programlisting>
Message arguments:
<informaltable>
@@ -2598,28 +2592,24 @@
<row>
<entry>0</entry>
<entry>STRING</entry>
- <entry>Name of the service</entry>
+ <entry>Name which was lost</entry>
</row>
- <row>
- <entry>1</entry>
- <entry>UINT32</entry>
- <entry>Flags</entry>
- </row>
</tbody>
</tgroup>
</informaltable>
</para>
<para>
- This message is sent to a specific application when it loses primary
- ownership of a service.
+ This signal is sent to a specific application when it loses
+ ownership of a name.
</para>
</sect3>
- <sect3 id="bus-messages-service-owner-changed">
- <title><literal>org.freedesktop.DBus.ServiceOwnerChanged</literal></title>
+ <sect3 id="bus-messages-name-acquired">
+ <title><literal>org.freedesktop.DBus.NameAcquired</literal></title>
<para>
+ This is a signal:
<programlisting>
- ServiceOwnerChanged (STRING service_name, STRING old_owner, STRING new_owner)
+ NameAcquired (STRING name)
</programlisting>
Message arguments:
<informaltable>
@@ -2635,37 +2625,24 @@
<row>
<entry>0</entry>
<entry>STRING</entry>
- <entry>Name of the service</entry>
+ <entry>Name which was acquired</entry>
</row>
- <row>
- <entry>1</entry>
- <entry>STRING</entry>
- <entry>Base service of previous owner, empty string if the
- service is newly created</entry>
- </row>
- <row>
- <entry>2</entry>
- <entry>STRING</entry>
- <entry>Base service of new owner, empty string if the
- service is no longer available</entry>
- </row>
</tbody>
</tgroup>
</informaltable>
</para>
<para>
- This message is broadcast to all applications when a service has been
- successfully registered on the message bus, has been deleted
- or its primary owner has changed.
+ This signal is sent to a specific application when it gains
+ ownership of a name.
</para>
</sect3>
- <sect3 id="bus-messages-activate-service">
- <title><literal>org.freedesktop.DBus.ActivateService</literal></title>
+ <sect3 id="bus-messages-start-service-by-name">
+ <title><literal>org.freedesktop.DBus.StartServiceByName</literal></title>
<para>
As a method:
<programlisting>
- UINT32 ActivateService (in STRING service_name, in UINT32 flags)
+ UINT32 StartServiceByName (in STRING name, in UINT32 flags)
</programlisting>
Message arguments:
<informaltable>
@@ -2681,7 +2658,7 @@
<row>
<entry>0</entry>
<entry>STRING</entry>
- <entry>Name of the service to activate</entry>
+ <entry>Name of the service to start</entry>
</row>
<row>
<entry>1</entry>
@@ -2710,15 +2687,12 @@
</tbody>
</tgroup>
</informaltable>
- Tries to launch the executable associated with a service. For more information, see <xref linkend="message-bus-activation"/>.
+ Tries to launch the executable associated with a name. For more information, see <xref linkend="message-bus-starting-services"/>.
- [FIXME need semantics in much more detail here; for example,
- if I activate a service then send it a message, is the message
- queued for the new service or is there a race]
</para>
<para>
The return value can be one of the following values:
- <informaltable>
+ <informaltable>
<tgroup cols="3">
<thead>
<row>
@@ -2729,14 +2703,14 @@
</thead>
<tbody>
<row>
- <entry>DBUS_ACTIVATION_REPLY_ACTIVATED</entry>
- <entry>0x0</entry>
- <entry>The service was activated successfully.</entry>
+ <entry>DBUS_START_REPLY_SUCCESS</entry>
+ <entry>1</entry>
+ <entry>The service was successfully started.</entry>
</row>
<row>
- <entry>DBUS_ACTIVATION_REPLY_ALREADY_ACTIVE</entry>
- <entry>0x1</entry>
- <entry>The service is already active.</entry>
+ <entry>DBUS_START_REPLY_ALREADY_RUNNING</entry>
+ <entry>2</entry>
+ <entry>A connection already owns the given name.</entry>
</row>
</tbody>
</tgroup>
@@ -2745,12 +2719,12 @@
</sect3>
- <sect3 id="bus-messages-get-service-owner">
- <title><literal>org.freedesktop.DBus.GetServiceOwner</literal></title>
+ <sect3 id="bus-messages-get-name-owner">
+ <title><literal>org.freedesktop.DBus.GetNameOwner</literal></title>
<para>
As a method:
<programlisting>
- STRING GetServiceOwner (in STRING service_name)
+ STRING GetNameOwner (in STRING name)
</programlisting>
Message arguments:
<informaltable>
@@ -2766,7 +2740,7 @@
<row>
<entry>0</entry>
<entry>STRING</entry>
- <entry>Name of the service to query</entry>
+ <entry>Name to get the owner of</entry>
</row>
</tbody>
</tgroup>
@@ -2785,15 +2759,14 @@
<row>
<entry>0</entry>
<entry>STRING</entry>
- <entry>Return value, a base service name</entry>
+ <entry>Return value, a unique connection name</entry>
</row>
</tbody>
</tgroup>
</informaltable>
- Returns the base service name of the primary owner of the
- service in argument. If the requested service isn't active,
- returns a
- <literal>org.freedesktop.DBus.Error.ServiceHasNoOwner</literal> error.
+ Returns the unique connection name of the primary owner of the name
+ given. If the requested name doesn't have an owner, returns a
+ <literal>org.freedesktop.DBus.Error.NameHasNoOwner</literal> error.
</para>
</sect3>
@@ -2818,7 +2791,7 @@
<row>
<entry>0</entry>
<entry>STRING</entry>
- <entry>Name of the connection/service to query</entry>
+ <entry>Name of the connection to query</entry>
</row>
</tbody>
</tgroup>
@@ -2848,31 +2821,6 @@
</para>
</sect3>
- <sect3 id="bus-messages-out-of-memory">
- <title><literal>org.freedesktop.DBus.Error.NoMemory</literal></title>
- <para>
- As a method:
- <programlisting>
- void NoMemory ()
- </programlisting>
- </para>
- <para>
- Sent by the message bus when it can't process a message due to an out of memory failure.
- </para>
- </sect3>
-
- <sect3 id="bus-messages-service-does-not-exist">
- <title><literal>org.freedesktop.DBus.Error.ServiceDoesNotExist</literal></title>
- <para>
- As a method:
- <programlisting>
- void ServiceDoesNotExist (in STRING error)
- </programlisting>
- </para>
- <para>
- Sent by the message bus as a reply to a client that tried to send a message to a service that doesn't exist.
- </para>
- </sect3>
</sect2>
</sect1>
@@ -2892,32 +2840,22 @@
This glossary defines some of the terms used in this specification.
</para>
- <glossentry id="term-activation"><glossterm>Activation</glossterm>
+ <glossentry id="term-bus-name"><glossterm>Bus Name</glossterm>
<glossdef>
<para>
- The process of creating an owner for a particular service,
- typically by launching an executable.
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="term-base-service"><glossterm>Base Service</glossterm>
- <glossdef>
- <para>
- The special service automatically assigned to an application by the
- message bus. This service may never change owner, and the service
- name will be unique (never reused during the lifetime of the
- message bus).
- </para>
- </glossdef>
- </glossentry>
-
- <glossentry id="term-broadcast"><glossterm>Broadcast</glossterm>
- <glossdef>
- <para>
- A message sent to the special <literal>org.freedesktop.DBus.Broadcast</literal>
- service; the message bus will forward the broadcast message
- to all applications that have expressed interest in it.
+ The message bus maintains an association between names and
+ connections. (Normally, there's one connection per application.) A
+ bus name is simply an identifier used to locate connections. For
+ example, the hypothetical <literal>com.yoyodyne.Screensaver</literal>
+ name might be used to send a message to a screensaver from Yoyodyne
+ Corporation. An application is said to <firstterm>own</firstterm> a
+ name if the message bus has associated the application's connection
+ with the name. Names may also have <firstterm>queued
+ owners</firstterm> (see <xref linkend="term-queued-owner"/>).
+ The bus assigns a unique name to each connection,
+ see <xref linkend="term-unique-name"/>. Other names
+ can be thought of as "well-known names" and are
+ used to find applications that offer specific functionality.
</para>
</glossdef>
</glossentry>
@@ -2937,9 +2875,20 @@
<glossdef>
<para>
The message bus is a special application that forwards
- or broadcasts messages between a group of applications
+ or routes messages between a group of applications
connected to the message bus. It also manages
- <firstterm>services</firstterm>.
+ <firstterm>names</firstterm> used for routing
+ messages.
+ </para>
+ </glossdef>
+ </glossentry>
+
+ <glossentry id="term-name"><glossterm>Name</glossterm>
+ <glossdef>
+ <para>
+ See <xref linkend="term-bus-name"/>. "Name" may
+ also be used to refer to some of the other names
+ in D-BUS, such as interface names.
</para>
</glossdef>
</glossentry>
@@ -2947,9 +2896,9 @@
<glossentry id="namespace"><glossterm>Namespace</glossterm>
<glossdef>
<para>
- Used to prevent collisions when defining message and service
- names. The convention used is the same as Java uses for
- defining classes: a reversed domain name.
+ Used to prevent collisions when defining new interfaces or bus
+ names. The convention used is the same one Java uses for defining
+ classes: a reversed domain name.
</para>
</glossdef>
</glossentry>
@@ -2957,73 +2906,80 @@
<glossentry id="term-object"><glossterm>Object</glossterm>
<glossdef>
<para>
- Each application contains <firstterm>objects</firstterm>,
- which have <firstterm>interfaces</firstterm> and
- <firstterm>methods</firstterm>. Objects are referred to
- by a name, called a <firstterm>path</firstterm> or
- <firstterm>object reference</firstterm>.
+ Each application contains <firstterm>objects</firstterm>, which have
+ <firstterm>interfaces</firstterm> and
+ <firstterm>methods</firstterm>. Objects are referred to by a name,
+ called a <firstterm>path</firstterm>.
</para>
</glossdef>
</glossentry>
- <glossentry id="term-path"><glossterm>Path</glossterm>
+ <glossentry id="one-to-one"><glossterm>One-to-One</glossterm>
<glossdef>
- <para>
- Object references (object names) in D-BUS are
- organized into a filesystem-style hierarchy, so
- each object is named by a path. As in LDAP,
- there's no difference between "files" and "directories";
- a path can refer to an object, while still having
- child objects below it.
+ <para>
+ An application talking directly to another application, without going
+ through a message bus. One-to-one connections may be "peer to peer" or
+ "client to server." The D-BUS protocol has no concept of client
+ vs. server after a connection has authenticated; the flow of messages
+ is symmetrical (full duplex).
</para>
</glossdef>
</glossentry>
- <glossentry id="one-to-one"><glossterm>One-to-One</glossterm>
+ <glossentry id="term-path"><glossterm>Path</glossterm>
<glossdef>
- <para>
- An application talking directly to another application, without going through a message bus.
+ <para>
+ Object references (object names) in D-BUS are organized into a
+ filesystem-style hierarchy, so each object is named by a path. As in
+ LDAP, there's no difference between "files" and "directories"; a path
+ can refer to an object, while still having child objects below it.
</para>
</glossdef>
</glossentry>
- <glossentry id="term-secondary-owner"><glossterm>Secondary service owner</glossterm>
+
+ <glossentry id="term-queued-owner"><glossterm>Queued Name Owner</glossterm>
<glossdef>
<para>
- Each service has a primary owner; messages sent to the service name
- go to the primary owner. However, certain services also maintain
- a queue of secondary owners "waiting in the wings." If
- the primary owner releases the service, then the first secondary
- owner in the queue automatically becomes the primary owner.
+ Each bus name has a primary owner; messages sent to the name go to the
+ primary owner. However, certain names also maintain a queue of
+ secondary owners "waiting in the wings." If the primary owner releases
+ the name, then the first secondary owner in the queue automatically
+ becomes the new owner of the name.
</para>
</glossdef>
</glossentry>
+
<glossentry id="term-service"><glossterm>Service</glossterm>
<glossdef>
<para>
- A service is simply a named list of applications. For example, the
- hypothetical <literal>com.yoyodyne.Screensaver</literal> service might
- accept messages that affect a screensaver from Yoyodyne Corporation.
- An application is said to <firstterm>own</firstterm> a service if the
- message bus has associated the application with the service name.
- Services may also have <firstterm>secondary owners</firstterm> (see
- <xref linkend="term-secondary-owner"/>).
+ A service is an executable that can be launched by the bus daemon.
+ Services normally guarantee some particular features, for example they
+ may guarantee that they will request a specific name such as
+ "org.freedesktop.Screensaver", have a singleton object
+ "/org/freedesktop/Application", and that object will implement the
+ interface "org.freedesktop.ScreensaverControl".
</para>
</glossdef>
</glossentry>
- <glossentry id="term-service-name"><glossterm>Service name</glossterm>
+
+ <glossentry id="term-service-description-files"><glossterm>Service Description Files</glossterm>
<glossdef>
- <para>
- The name used when referring to a service. If the service is
- a base service it has a unique service name, for example
- ":1-20", and otherwise it should be namespaced.
+ <para>
+ ".service files" tell the bus about service applications that can be
+ launched (see <xref linkend="term-service"/>). Most importantly they
+ provide a mapping from bus names to services that will request those
+ names when they start up.
</para>
</glossdef>
</glossentry>
- <glossentry id="term-service-description-files"><glossterm>Service Description Files</glossterm>
+
+ <glossentry id="term-unique-name"><glossterm>Unique Connection Name</glossterm>
<glossdef>
<para>
- ".service files" tell the bus how to activate a particular service.
- See <xref linkend="term-activation"/>
+ The special name automatically assigned to each connection by the
+ message bus. This name will never change owner, and will be unique
+ (never reused during the lifetime of the message bus).
+ It will begin with a ':' character.
</para>
</glossdef>
</glossentry>
diff --git a/doc/dbus-tutorial.xml b/doc/dbus-tutorial.xml
index 6d1b7f3b..44f2f7ca 100644
--- a/doc/dbus-tutorial.xml
+++ b/doc/dbus-tutorial.xml
@@ -7,8 +7,8 @@
<article id="index">
<articleinfo>
<title>D-BUS Tutorial</title>
- <releaseinfo>Version 0.2</releaseinfo>
- <date>10 August 2004</date>
+ <releaseinfo>Version 0.3</releaseinfo>
+ <date>18 January 2005</date>
<authorgroup>
<author>
<firstname>Havoc</firstname>
@@ -296,8 +296,8 @@
</para>
</sect2>
- <sect2 id="services">
- <title>Services</title>
+ <sect2 id="bus-names">
+ <title>Bus Names</title>
<para>
Object paths, interfaces, and messages exist on the level of
@@ -306,55 +306,55 @@
</para>
<para>
- Services, on the other hand, are a property of the message bus daemon.
- A <firstterm>service</firstterm> is simply a name mapped to
- some application connected to the message bus daemon.
+ Bus names, on the other hand, are a property of the message bus daemon.
+ The bus maintains a mapping from names to message bus connections.
These names are used to specify the origin and destination
of messages passing through the message bus. When a name is mapped
- to a particular application, the application is said to
- <firstterm>own</firstterm> that service.
+ to a particular application's connection, that application is said to
+ <firstterm>own</firstterm> that name.
</para>
<para>
On connecting to the bus daemon, each application immediately owns a
- special name called the <firstterm>base service</firstterm>. A base
- service begins with a ':' (colon) character; no other services are
- allowed to begin with that character. Base services are special because
- each one is unique. They are created dynamically, and are never re-used
- during the lifetime of the same bus daemon. You know that a given
- base service name will have the same owner at all times.
- An example of a base service name might be <literal>:34-907</literal>.
+ special name called the <firstterm>unique connection name</firstterm>.
+ A unique name begins with a ':' (colon) character; no other names are
+ allowed to begin with that character. Unique names are special because
+ they are created dynamically, and are never re-used during the lifetime
+ of the same bus daemon. You know that a given unique name will have the
+ same owner at all times. An example of a unique name might be
+ <literal>:34-907</literal>. The numbers after the colon have
+ no meaning other than their uniqueness.
</para>
<para>
Applications may ask to own additional <firstterm>well-known
- services</firstterm>. For example, you could write a specification to
- define a service called <literal>com.mycompany.TextEditor</literal>.
- Your definition could specify that to own this service, an application
+ names</firstterm>. For example, you could write a specification to
+ define a name called <literal>com.mycompany.TextEditor</literal>.
+ Your definition could specify that to own this name, an application
should have an object at the path
<literal>/com/mycompany/TextFileManager</literal> supporting the
interface <literal>org.freedesktop.FileHandler</literal>.
</para>
<para>
- Applications could then send messages to this service,
+ Applications could then send messages to this bus name,
object, and interface to execute method calls.
</para>
<para>
- You could think of the base service names as IP addresses, and the
- well-known services as domain names. So
+ You could think of the unique names as IP addresses, and the
+ well-known names as domain names. So
<literal>com.mycompany.TextEditor</literal> might map to something like
<literal>:34-907</literal> just as <literal>mycompany.com</literal> maps
to something like <literal>192.168.0.5</literal>.
</para>
<para>
- Services have a second important use, other than routing messages. They
+ Names have a second important use, other than routing messages. They
are used to track lifecycle. When an application exits (or crashes), its
connection to the message bus will be closed by the operating system
kernel. The message bus then sends out notification messages telling
- remaining applications that the application's services have lost their
+ remaining applications that the application's names have lost their
owner. By tracking these notifications, your application can reliably
monitor the lifetime of other applications.
</para>
@@ -408,12 +408,12 @@
method call on a particular object instance, a number of
nested components have to be named:
<programlisting>
- Address -> [Service] -> Path -> Interface -> Method
+ Address -> [Bus Name] -> Path -> Interface -> Method
</programlisting>
- The service is in brackets to indicate that it's optional -- you only
- provide a service name to route the method call to the right application
+ The bus name is in brackets to indicate that it's optional -- you only
+ provide a name to route the method call to the right application
when using the bus daemon. If you have a direct connection to another
- application, services aren't used; there's no bus daemon.
+ application, bus names aren't used; there's no bus daemon.
</para>
<para>
@@ -455,8 +455,8 @@ main (int argc, char **argv)
GError *error;
DBusGProxy *proxy;
DBusGPendingCall *call;
- char **service_list;
- int service_list_len;
+ char **name_list;
+ int name_list_len;
int i;
g_type_init ();
@@ -472,24 +472,24 @@ main (int argc, char **argv)
exit (1);
}
- /* Create a proxy object for the "bus driver" (service org.freedesktop.DBus) */
+ /* Create a proxy object for the "bus driver" (name "org.freedesktop.DBus") */
- proxy = dbus_g_proxy_new_for_service (connection,
- DBUS_SERVICE_ORG_FREEDESKTOP_DBUS,
- DBUS_PATH_ORG_FREEDESKTOP_DBUS,
- DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS);
+ proxy = dbus_g_proxy_new_for_name (connection,
+ DBUS_SERVICE_ORG_FREEDESKTOP_DBUS,
+ DBUS_PATH_ORG_FREEDESKTOP_DBUS,
+ DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS);
- /* Call ListServices method */
+ /* Call ListNames method */
- call = dbus_g_proxy_begin_call (proxy, "ListServices", DBUS_TYPE_INVALID);
+ call = dbus_g_proxy_begin_call (proxy, "ListNames", DBUS_TYPE_INVALID);
error = NULL;
if (!dbus_g_proxy_end_call (proxy, call, &amp;error,
DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
- &amp;service_list, &amp;service_list_len,
+ &amp;name_list, &amp;name_list_len,
DBUS_TYPE_INVALID))
{
- g_printerr ("Failed to complete ListServices call: %s\n",
+ g_printerr ("Failed to complete ListNames call: %s\n",
error->message);
g_error_free (error);
exit (1);
@@ -497,17 +497,17 @@ main (int argc, char **argv)
/* Print the results */
- g_print ("Services on the message bus:\n");
+ g_print ("Names on the message bus:\n");
i = 0;
- while (i &lt; service_list_len)
+ while (i &lt; name_list_len)
{
- g_assert (service_list[i] != NULL);
- g_print (" %s\n", service_list[i]);
+ g_assert (name_list[i] != NULL);
+ g_print (" %s\n", name_list[i]);
++i;
}
- g_assert (service_list[i] == NULL);
+ g_assert (name_list[i] == NULL);
- g_strfreev (service_list);
+ g_strfreev (name_list);
return 0;
}
diff --git a/doc/diagram.png b/doc/diagram.png
new file mode 100644
index 00000000..5cb84a99
--- /dev/null
+++ b/doc/diagram.png
Binary files differ
diff --git a/doc/diagram.svg b/doc/diagram.svg
new file mode 100644
index 00000000..193c5679
--- /dev/null
+++ b/doc/diagram.svg
@@ -0,0 +1,590 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"
+"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg
+ id="svg1"
+ sodipodi:version="0.32"
+ inkscape:version="0.39"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:cc="http://web.resource.org/cc/"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ width="841.88975pt"
+ height="595.27559pt"
+ sodipodi:docbase="/home/hp/dbus-cvs/dbus/doc"
+ sodipodi:docname="diagram.svg">
+ <defs
+ id="defs3">
+ <marker
+ style="overflow:visible;"
+ id="Arrow1M"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow1M">
+ <path
+ transform="scale(0.4)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ id="path3519"
+ sodipodi:nodetypes="ccccc" />
+ </marker>
+ <marker
+ style="overflow:visible;"
+ id="Arrow2L"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow2L">
+ <path
+ transform="scale(1.1) translate(-5,0)"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ id="path3515"
+ sodipodi:nodetypes="cccc" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.90210318"
+ inkscape:cx="420.94487"
+ inkscape:cy="297.63779"
+ inkscape:window-width="1024"
+ inkscape:window-height="701"
+ showgrid="false"
+ inkscape:grid-bbox="false"
+ inkscape:grid-points="true"
+ inkscape:window-x="0"
+ inkscape:window-y="24"
+ gridspacingy="2.5000000mm"
+ gridspacingx="2.5000000mm"
+ showguides="true"
+ inkscape:guide-bbox="true">
+ <sodipodi:guide
+ orientation="horizontal"
+ position="268.85797"
+ id="guide3566" />
+ <sodipodi:guide
+ orientation="horizontal"
+ position="294.31223"
+ id="guide4235" />
+ <sodipodi:guide
+ orientation="horizontal"
+ position="300.40909"
+ id="guide4882" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata4">
+ <rdf:RDF
+ id="RDF5">
+ <cc:Work
+ rdf:about=""
+ id="Work6">
+ <dc:format
+ id="format7">image/svg+xml</dc:format>
+ <dc:type
+ id="type9"
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <rect
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:3.7500000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000;"
+ id="rect908"
+ width="325.23203"
+ height="354.33072"
+ x="17.716536"
+ y="372.04724" />
+ <text
+ xml:space="preserve"
+ style="font-size:18.000000;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans;text-anchor:start;writing-mode:lr;"
+ x="70.778252"
+ y="712.73920"
+ id="text1532"
+ sodipodi:linespacing="100%"><tspan
+ id="tspan1533">Application Process 1</tspan></text>
+ <rect
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:2.5000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:2.5000000 2.5000000 ;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;"
+ id="rect1535"
+ width="148.46259"
+ height="46.656849"
+ x="106.29921"
+ y="378.54001" />
+ <text
+ xml:space="preserve"
+ style="font-size:14.000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans;text-anchor:middle;writing-mode:lr;"
+ x="180.61389"
+ y="400.40048"
+ id="text2158"
+ sodipodi:linespacing="100%"><tspan
+ id="tspan2159">DBusConnection</tspan><tspan
+ sodipodi:role="line"
+ id="tspan2161"
+ x="180.61389"
+ y="414.40048">Instance</tspan></text>
+ <rect
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:2.9950929;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:2.9950928 2.9950928 ;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;"
+ id="rect2170"
+ width="148.46259"
+ height="66.966240"
+ x="28.702768"
+ y="549.21259" />
+ <text
+ xml:space="preserve"
+ style="font-size:14.000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans;text-anchor:middle;writing-mode:lr;"
+ x="103.01745"
+ y="577.56586"
+ id="text2171"
+ sodipodi:linespacing="100%"><tspan
+ x="103.01745"
+ y="577.56586"
+ sodipodi:role="line"
+ id="tspan2176">C/C++/Python/etc.</tspan><tspan
+ x="103.01745"
+ y="591.56586"
+ sodipodi:role="line"
+ id="tspan2178">Object Instance</tspan></text>
+ <path
+ style="fill:#000000;fill-opacity:1.0000000;fill-rule:nonzero;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;"
+ id="path3535"
+ d="M 98.938952,408.61479 C 98.744753,409.20303 97.917886,409.67295 97.440945,410.11435 C 95.534947,411.94763 94.266934,414.11555 93.172614,416.33858 C 91.902056,419.02725 90.969281,421.79944 90.107252,424.59229 C 89.589105,426.27374 88.983534,427.90634 88.266907,429.53700 C 87.919667,430.33438 87.622593,431.17598 87.120464,431.91970 C 86.832222,432.30665 86.469422,432.65145 86.167985,433.03184 C 86.015931,433.22254 85.868997,433.41563 85.722131,433.60898 L 82.914336,433.11743 C 83.063402,432.91879 83.213428,432.72069 83.368121,432.52498 C 83.654681,432.15308 83.980737,431.80834 84.285389,431.44731 C 84.811957,430.77175 85.122523,429.97914 85.482400,429.23872 C 86.253056,427.64929 86.903084,426.03861 87.474578,424.39321 C 88.439548,421.58552 89.442843,418.78792 90.703938,416.05898 C 91.810966,413.77525 92.999191,411.45961 94.849464,409.50748 C 95.094704,409.24876 96.091789,407.90149 95.865737,408.61479 L 98.938952,408.61479 z " />
+ <text
+ xml:space="preserve"
+ style="font-size:12.000000;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans;"
+ x="34.109497"
+ y="446.13382"
+ id="text3536"><tspan
+ id="tspan3537">Locate Object</tspan><tspan
+ sodipodi:role="line"
+ id="tspan3539"
+ x="34.109497"
+ y="458.13382">via Object Path</tspan></text>
+ <path
+ style="fill:#000000;fill-opacity:1.0000000;fill-rule:nonzero;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;"
+ id="path3541"
+ d="M 60.509867,462.78767 C 60.704066,463.37591 61.530933,463.84583 62.007874,464.28723 C 63.913872,466.12051 65.181885,468.28843 66.276205,470.51146 C 67.546763,473.20013 68.479538,475.97232 69.341567,478.76517 C 69.859714,480.44662 70.465285,482.07922 71.181912,483.70988 C 71.529152,484.50726 71.826226,485.34886 72.328355,486.09258 C 72.616597,486.47953 72.979397,486.82433 73.280834,487.20472 C 73.432888,487.39542 73.579822,487.58851 73.726688,487.78186 L 76.534483,487.29031 C 76.385417,487.09167 76.235391,486.89357 76.080698,486.69786 C 75.794138,486.32596 75.468082,485.98122 75.163430,485.62019 C 74.636862,484.94463 74.326296,484.15202 73.966419,483.41160 C 73.195763,481.82217 72.545735,480.21149 71.974241,478.56609 C 71.009271,475.75840 70.005976,472.96080 68.744881,470.23186 C 67.637853,467.94813 66.449628,465.63249 64.599355,463.68036 C 64.354115,463.42164 63.357030,462.07437 63.583082,462.78767 L 60.509867,462.78767 z " />
+ <text
+ xml:space="preserve"
+ style="font-size:12.000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans;text-anchor:start;writing-mode:lr;"
+ x="49.100315"
+ y="501.60959"
+ id="text3542"
+ sodipodi:linespacing="100%"><tspan
+ x="49.100315"
+ y="501.60959"
+ sodipodi:role="line"
+ id="tspan3547">Bindings Marshal</tspan><tspan
+ x="49.100315"
+ y="513.60959"
+ sodipodi:role="line"
+ id="tspan3549">to Method Call</tspan></text>
+ <path
+ style="fill:#000000;fill-opacity:1.0000000;fill-rule:nonzero;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;"
+ id="path3551"
+ d="M 95.295239,519.43211 C 95.101039,520.02035 94.274169,520.49027 93.797229,520.93167 C 91.891239,522.76495 90.623219,524.93287 89.528899,527.15590 C 88.258339,529.84457 87.325569,532.61676 86.463539,535.40961 C 85.945389,537.09106 85.339819,538.72366 84.623199,540.35432 C 84.275959,541.15170 83.978879,541.99330 83.476749,542.73702 C 83.188509,543.12397 82.825709,543.46877 82.524269,543.84916 C 82.372219,544.03986 82.225289,544.23295 82.078419,544.42630 L 79.270619,543.93475 C 79.419689,543.73611 79.569719,543.53801 79.724409,543.34230 C 80.010969,542.97040 80.337029,542.62566 80.641679,542.26463 C 81.168249,541.58907 81.478809,540.79646 81.838689,540.05604 C 82.609339,538.46661 83.259369,536.85593 83.830869,535.21053 C 84.795839,532.40284 85.799129,529.60524 87.060229,526.87630 C 88.167249,524.59257 89.355479,522.27693 91.205749,520.32480 C 91.450989,520.06608 92.448079,518.71881 92.222029,519.43211 L 95.295239,519.43211 z " />
+ <path
+ style="fill:#000000;fill-opacity:1.0000000;fill-rule:nonzero;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;"
+ id="path3552"
+ d="M 261.83533,408.61479 C 262.02953,409.20303 262.85640,409.67295 263.33334,410.11435 C 265.23934,411.94763 266.50735,414.11555 267.60167,416.33858 C 268.87223,419.02725 269.80501,421.79944 270.66703,424.59229 C 271.18518,426.27374 271.79075,427.90634 272.50738,429.53700 C 272.85462,430.33438 273.15169,431.17598 273.65382,431.91970 C 273.94206,432.30665 274.30486,432.65145 274.60630,433.03184 C 274.75836,433.22254 274.90529,433.41563 275.05216,433.60898 L 277.85995,433.11743 C 277.71088,432.91879 277.56086,432.72069 277.40617,432.52498 C 277.11961,432.15308 276.79355,431.80834 276.48890,431.44731 C 275.96233,430.77175 275.65176,429.97914 275.29189,429.23872 C 274.52123,427.64929 273.87120,426.03861 273.29971,424.39321 C 272.33474,421.58552 271.33144,418.78792 270.07035,416.05898 C 268.96332,413.77525 267.77510,411.45961 265.92482,409.50748 C 265.67958,409.24876 264.68250,407.90149 264.90855,408.61479 L 261.83533,408.61479 z " />
+ <text
+ xml:space="preserve"
+ style="font-size:12.000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans;text-anchor:start;writing-mode:lr;"
+ x="223.98749"
+ y="446.13382"
+ id="text3553"
+ sodipodi:linespacing="100%"><tspan
+ x="223.98749"
+ y="446.13382"
+ sodipodi:role="line"
+ id="tspan3562">Marshal Method</tspan><tspan
+ x="223.98749"
+ y="458.13382"
+ sodipodi:role="line"
+ id="tspan3564">Call to Message</tspan></text>
+ <path
+ style="fill:#000000;fill-opacity:1.0000000;fill-rule:nonzero;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;"
+ id="path3567"
+ d="M 278.96485,463.29453 C 278.77065,463.88277 277.94378,464.35269 277.46684,464.79409 C 275.56085,466.62737 274.29283,468.79529 273.19851,471.01832 C 271.92795,473.70699 270.99518,476.47918 270.13315,479.27203 C 269.61500,480.95348 269.00943,482.58608 268.29281,484.21674 C 267.94557,485.01412 267.64849,485.85572 267.14636,486.59944 C 266.85812,486.98639 266.49532,487.33119 266.19388,487.71158 C 266.04183,487.90228 265.89490,488.09537 265.74803,488.28872 L 262.94023,487.79717 C 263.08930,487.59853 263.23933,487.40043 263.39402,487.20472 C 263.68058,486.83282 264.00664,486.48808 264.31129,486.12705 C 264.83786,485.45149 265.14842,484.65888 265.50830,483.91846 C 266.27895,482.32903 266.92898,480.71835 267.50048,479.07295 C 268.46545,476.26526 269.46874,473.46766 270.72984,470.73872 C 271.83686,468.45499 273.02509,466.13935 274.87536,464.18722 C 275.12060,463.92850 276.11769,462.58123 275.89164,463.29453 L 278.96485,463.29453 z " />
+ <rect
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:2.7377086;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:2.7377084 2.7377084 ;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;"
+ id="rect3568"
+ width="124.01746"
+ height="66.979813"
+ x="189.79265"
+ y="495.08902" />
+ <text
+ xml:space="preserve"
+ style="font-size:14.000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans;text-anchor:middle;writing-mode:lr;"
+ x="248.94049"
+ y="523.44220"
+ id="text3569"
+ sodipodi:linespacing="100%"><tspan
+ x="248.94049"
+ y="523.44220"
+ sodipodi:role="line"
+ id="tspan3574">Bindings Proxy</tspan><tspan
+ x="248.94049"
+ y="537.44220"
+ sodipodi:role="line"
+ id="tspan3576">Object Instance</tspan></text>
+ <path
+ style="fill:#000000;fill-opacity:1.0000000;fill-rule:nonzero;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;"
+ id="path3578"
+ d="M 259.03547,566.92913 C 259.22967,567.51737 260.05653,567.98729 260.53348,568.42869 C 262.43947,570.26197 263.70749,572.42989 264.80181,574.65292 C 266.07236,577.34159 267.00514,580.11378 267.86717,582.90663 C 268.38532,584.58808 268.99089,586.22068 269.70751,587.85134 C 270.05475,588.64872 270.35183,589.49032 270.85396,590.23404 C 271.14220,590.62099 271.50500,590.96579 271.80644,591.34618 C 271.95849,591.53688 272.10542,591.72997 272.25229,591.92332 L 275.06008,591.43177 C 274.91102,591.23313 274.76099,591.03503 274.60630,590.83932 C 274.31974,590.46742 273.99368,590.12268 273.68903,589.76165 C 273.16246,589.08609 272.85190,588.29348 272.49202,587.55306 C 271.72136,585.96363 271.07134,584.35295 270.49984,582.70755 C 269.53487,579.89986 268.53158,577.10226 267.27048,574.37332 C 266.16345,572.08959 264.97523,569.77395 263.12496,567.82182 C 262.87972,567.56310 261.88263,566.21583 262.10868,566.92913 L 259.03547,566.92913 z " />
+ <text
+ xml:space="preserve"
+ style="font-size:12.000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans;text-anchor:start;writing-mode:lr;"
+ x="217.40741"
+ y="607.90881"
+ id="text3579"
+ sodipodi:linespacing="100%"><tspan
+ x="217.40741"
+ y="607.90881"
+ sodipodi:role="line"
+ id="tspan3584">Application Code</tspan></text>
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.96172028pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;marker-end:url(#Arrow1M);"
+ d="M 26.574803,408.60009 C 26.574803,539.68912 26.574803,539.68911 26.574803,531.49606"
+ id="path3586"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.000000;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans;text-anchor:start;writing-mode:lr;"
+ x="25.977146"
+ y="386.45212"
+ id="text4220"
+ sodipodi:linespacing="100%"><tspan
+ id="tspan4221">Incoming</tspan><tspan
+ sodipodi:role="line"
+ id="tspan4223"
+ x="25.977146"
+ y="398.45212">Call</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.000000;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans;text-anchor:end;writing-mode:lr;"
+ x="335.61411"
+ y="386.45212"
+ id="text4226"
+ sodipodi:linespacing="100%"><tspan
+ x="335.61411"
+ y="386.45212"
+ sodipodi:role="line"
+ id="tspan4231">Outgoing</tspan><tspan
+ x="335.61411"
+ y="398.45212"
+ sodipodi:role="line"
+ id="tspan4233">Call</tspan></text>
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:0.96172028pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;marker-start:url(#Arrow1M);marker-end:none;"
+ d="M 327.75591,416.33858 C 327.75591,547.42761 327.75591,547.42760 327.75591,539.23455"
+ id="path4236"
+ sodipodi:nodetypes="cc" />
+ <rect
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:5.7914310;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000;"
+ id="rect4870"
+ width="885.86591"
+ height="310.27252"
+ x="88.582680"
+ y="8.8582621" />
+ <text
+ xml:space="preserve"
+ style="font-size:18.000000;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans;text-anchor:middle;writing-mode:lr;"
+ x="515.42737"
+ y="305.44489"
+ id="text4871"
+ sodipodi:linespacing="100%"><tspan
+ x="515.42737"
+ y="305.44489"
+ sodipodi:role="line"
+ id="tspan4874">Bus Daemon Process</tspan></text>
+ <rect
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:3.7500000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000;"
+ id="rect4876"
+ width="325.23203"
+ height="354.33072"
+ x="708.66144"
+ y="373.08359" />
+ <text
+ xml:space="preserve"
+ style="font-size:18.000000;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans;text-anchor:start;writing-mode:lr;"
+ x="761.72314"
+ y="713.77551"
+ id="text4877"
+ sodipodi:linespacing="100%"><tspan
+ x="761.72314"
+ y="713.77551"
+ sodipodi:role="line"
+ id="tspan4880">Application Process 2</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans;text-anchor:start;writing-mode:lr;"
+ x="823.49664"
+ y="505.18018"
+ id="text4883"
+ sodipodi:linespacing="100%"><tspan
+ x="823.49664"
+ y="505.18018"
+ sodipodi:role="line"
+ id="tspan4888">Same Stuff as in</tspan><tspan
+ x="823.49664"
+ y="517.18018"
+ sodipodi:role="line"
+ id="tspan4890">Process 1</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans;text-anchor:start;writing-mode:lr;"
+ x="47.891071"
+ y="638.05420"
+ id="text4892"
+ sodipodi:linespacing="100%"><tspan
+ x="47.891071"
+ y="638.05420"
+ sodipodi:role="line"
+ id="tspan4901">(Object Instance Has</tspan><tspan
+ x="47.891071"
+ y="650.05420"
+ sodipodi:role="line"
+ id="tspan4903">1 or More Interfaces)</tspan></text>
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.2500000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000;marker-start:url(#Arrow1M);marker-end:url(#Arrow1M);stroke-dasharray:none;"
+ d="M 162.57260,358.02041 C 165.25213,354.60516 186.01858,328.13688 184.00893,330.69832"
+ id="path4905"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.000000;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans;"
+ x="190.57170"
+ y="342.62018"
+ id="text5539"><tspan
+ id="tspan5540">Socket</tspan><tspan
+ sodipodi:role="line"
+ id="tspan5544"
+ x="190.57170"
+ y="354.62018">(Bidirectional Message Stream)</tspan></text>
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.2500000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-opacity:1.0000000;marker-start:url(#Arrow1M);marker-end:url(#Arrow1M);"
+ d="M 827.53876,363.18897 C 824.85916,359.77372 804.09276,333.30544 806.10236,335.86688"
+ id="path5546"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.000000;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans;"
+ x="840.79150"
+ y="345.73135"
+ id="text5547"><tspan
+ id="tspan5548">Socket</tspan><tspan
+ sodipodi:role="line"
+ id="tspan5550"
+ x="840.79150"
+ y="357.73135">(Bidirectional Message Stream)</tspan></text>
+ <rect
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:2.5000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:2.5000000 2.5000000 ;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;"
+ id="rect5552"
+ width="148.46259"
+ height="46.656849"
+ x="124.01575"
+ y="263.38251" />
+ <text
+ xml:space="preserve"
+ style="font-size:14.000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans;text-anchor:middle;writing-mode:lr;"
+ x="198.33043"
+ y="285.24298"
+ id="text5553"
+ sodipodi:linespacing="100%"><tspan
+ id="tspan5554">DBusConnection</tspan><tspan
+ sodipodi:role="line"
+ id="tspan5556"
+ x="198.33043"
+ y="299.24298">Instance</tspan></text>
+ <rect
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:2.5000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:2.5000000 2.5000000 ;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;"
+ id="rect5558"
+ width="148.46259"
+ height="46.656849"
+ x="719.64764"
+ y="263.38251" />
+ <text
+ xml:space="preserve"
+ style="font-size:14.000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans;text-anchor:middle;writing-mode:lr;"
+ x="793.96234"
+ y="285.24298"
+ id="text5559"
+ sodipodi:linespacing="100%"><tspan
+ id="tspan5560">DBusConnection</tspan><tspan
+ sodipodi:role="line"
+ id="tspan5562"
+ x="793.96234"
+ y="299.24298">Instance</tspan></text>
+ <rect
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:2.5000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:2.5000000 2.5000000 ;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;"
+ id="rect5564"
+ width="148.46259"
+ height="46.656849"
+ x="763.77222"
+ y="378.54001" />
+ <text
+ xml:space="preserve"
+ style="font-size:14.000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans;text-anchor:middle;writing-mode:lr;"
+ x="838.08691"
+ y="400.40048"
+ id="text5565"
+ sodipodi:linespacing="100%"><tspan
+ id="tspan5566">DBusConnection</tspan><tspan
+ sodipodi:role="line"
+ id="tspan5568"
+ x="838.08691"
+ y="414.40048">Instance</tspan></text>
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;marker-end:url(#Arrow1M);"
+ d="M 186.02362,248.03149 C 106.29921,26.574797 372.04724,26.574797 372.04724,26.574797"
+ id="path5571"
+ sodipodi:nodetypes="cc" />
+ <rect
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:2.1854961;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4.0000000;stroke-dasharray:2.1854960 2.1854960 ;stroke-dashoffset:0.0000000;stroke-opacity:1.0000000;"
+ id="rect6205"
+ width="148.46259"
+ height="35.656227"
+ x="391.89175"
+ y="17.493374" />
+ <text
+ xml:space="preserve"
+ style="font-size:14.000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans;text-anchor:middle;writing-mode:lr;"
+ x="466.20642"
+ y="39.577003"
+ id="text6206"
+ sodipodi:linespacing="100%"><tspan
+ x="466.20642"
+ y="39.577003"
+ sodipodi:role="line"
+ id="tspan6211">Message Dispatcher</tspan></text>
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;marker-end:url(#Arrow1M);"
+ d="M 806.10236,248.03149 C 814.96063,17.716530 549.21260,26.574797 558.07087,26.574797"
+ id="path6213"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans;text-anchor:start;writing-mode:lr;"
+ x="380.24341"
+ y="71.125053"
+ id="text6214"
+ sodipodi:linespacing="100%"><tspan
+ x="380.24341"
+ y="71.125053"
+ sodipodi:role="line"
+ id="tspan6860">if (message is signal)</tspan><tspan
+ x="380.24341"
+ y="83.125053"
+ sodipodi:role="line"
+ id="tspan6862"> broadcast</tspan><tspan
+ x="380.24341"
+ y="95.125053"
+ sodipodi:role="line"
+ id="tspan6864">else</tspan><tspan
+ x="380.24341"
+ y="107.12505"
+ sodipodi:role="line"
+ id="tspan6866"> find destination named by message</tspan></text>
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;marker-end:url(#Arrow1M);"
+ d="M 380.90551,79.724404 C 177.16536,53.149601 203.74016,256.88976 203.74016,248.03149"
+ id="path6868"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;marker-end:url(#Arrow1M);"
+ d="M 451.77165,79.724404 C 788.38583,44.291333 779.52756,256.88976 779.52756,248.03149"
+ id="path6869"
+ sodipodi:nodetypes="cc" />
+ <rect
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#6a6a6a;stroke-width:2.5000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;stroke-miterlimit:4.0000000;stroke-dasharray:1.2500000,1.2500000;stroke-dashoffset:0.0000000;"
+ id="rect7503"
+ width="318.89764"
+ height="168.30708"
+ x="345.47244"
+ y="115.15748" />
+ <text
+ xml:space="preserve"
+ style="font-size:12.000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans;text-anchor:middle;writing-mode:lr;"
+ x="507.10016"
+ y="132.70409"
+ id="text8137"
+ sodipodi:linespacing="100%"><tspan
+ id="tspan8138">Destination Table</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:12.000000;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1.0000000;stroke:none;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;font-family:Bitstream Vera Sans;font-stretch:normal;font-variant:normal;text-anchor:start;writing-mode:lr;"
+ x="422.71124"
+ y="158.39366"
+ id="text8140"
+ sodipodi:linespacing="120%"><tspan
+ x="422.71124"
+ y="158.39366"
+ sodipodi:role="line"
+ id="tspan8818">Connection 1</tspan><tspan
+ x="422.71124"
+ y="172.79366"
+ sodipodi:role="line"
+ id="tspan8820">Connection 2</tspan><tspan
+ x="422.71124"
+ y="187.19366"
+ sodipodi:role="line"
+ id="tspan8822">&quot;The Session Manager&quot;</tspan><tspan
+ x="422.71124"
+ y="201.59366"
+ sodipodi:role="line"
+ id="tspan8824">&quot;The Window Manager&quot;</tspan><tspan
+ x="422.71124"
+ y="215.99366"
+ sodipodi:role="line"
+ id="tspan8826">&quot;The Screensaver&quot;</tspan><tspan
+ x="422.71124"
+ y="230.39366"
+ sodipodi:role="line"
+ id="tspan8828">&quot;The Text Editor&quot;</tspan><tspan
+ x="422.71124"
+ y="244.79366"
+ sodipodi:role="line"
+ id="tspan8830">&quot;The Hardware Directory&quot;</tspan><tspan
+ x="422.71124"
+ y="259.19367"
+ sodipodi:role="line"
+ id="tspan8832">&quot;The Address Book&quot;</tspan><tspan
+ x="422.71124"
+ y="273.59367"
+ sodipodi:role="line"
+ id="tspan8834">&quot;The Dictionary&quot;</tspan></text>
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;marker-end:url(#Arrow1M);"
+ d="M 416.33858,150.59055 C 239.17323,97.440935 221.45669,256.88976 221.45669,248.03149"
+ id="path8179"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;marker-end:url(#Arrow1M);"
+ d="M 504.92126,168.30708 C 726.37795,106.29921 770.66929,265.74802 761.81102,239.17322"
+ id="path8180"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;"
+ d=""
+ id="path8181"
+ sodipodi:nodetypes="" />
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;marker-end:url(#Arrow1M);"
+ d="M 584.64567,239.17322 C 717.51969,194.88188 761.81102,256.88976 752.95276,248.03149"
+ id="path8182"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-opacity:0.75000000;fill-rule:evenodd;stroke:#000000;stroke-width:1.0000000pt;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1.0000000;marker-end:url(#Arrow1M);"
+ d="M 416.33858,177.16535 C 301.18111,124.01574 230.31496,265.74803 239.17323,248.03149"
+ id="path8184"
+ sodipodi:nodetypes="cc" />
+</svg>