gdbus-codegen1User Commandsgdbus-codegenGLib D-Bus code generatorgdbus-codegenorg.project.PrefixYourProjectOUTFILESOUTFILESelementkeykeyFILEFILEDescriptiongdbus-codegen is used to generate code and/or
documentation for one or more D-Bus interfaces. The tool reads
D-Bus Introspection XML files and generates output files. The tool
currently supports generating C code (via
) and Docbook XML (via
).
When generating C code, an abstract
GInterface-derived type is generated for each D-Bus
interface. Additionally, for every generated type,
FooBar, two concrete instantiable types,
FooBarProxy and FooBarStub, implementing
said interface are also generated. The former is derived from
GDBusProxy and intended for use on the client side
while the latter is derived from the
GDBusInterfaceStub type making it easy to export on a
GDBusConnection either directly or via a
GDBusObjectManagerServer.
Options
The following options are supported:
org.project.Prefix.
A prefix to strip from all D-Bus interface names when
calculating the typename for the C binding and the Docbook
sortas
attribute.
OUTFILES
Generate Docbook Documentation for each D-Bus interface and
put it in
OUTFILES-org.Project.IfaceName.xml (where
org.Project.IfaceName is a place-holder for
the interface name).
OUTFILES
Generate C code for all D-Bus interfaces and put it in
OUTFILES.c and
OUTFILES.h.
YourProject
The namespace to use for generated C code. This must be
provided in CamelCase format.
Used together with and
to annotate the given XML files. It
can be used with interfaces, methods, signals, properties
and arguments in the following way:
Supported D-Bus Annotations
The following D-Bus annotations are supported by
gdbus-codegen:
org.gtk.GDBus.Name
Can be used on any <interface>,
<method>,
<signal> and
<property> element to specify the
name to use.
For interfaces where this annotation is not specified, the
name used is the D-Bus interface name stripped with the
prefix given with and with
the dots removed and initial characters capitalized. For
example the D-Bus interface
com.acme.Coyote the name used is
ComAcmeCoyote. For the D-Bus interface
org.project.Bar.Frobnicator with
org.project., the name used is
BarFrobnicator.
For methods, signals and properties the name used is
calculated by transforming
NameGivenThisWay into
name_given_this_way, e.g. roughly
converting from camel-case to lower-case with underscores
using certain heuristics.
org.gtk.GDBus.C.ForceGVariant
If set to a non-empty string, a GVariant will
be used instead of the natural C type. This annotation can
be used on any <arg> and
<property> element.
org.gtk.GDBus.DocString
A string with Docbook content for documentation. This annotation can
be used on <interface>,
<method>,
<signal>,
<property> and
<arg> elements.
org.gtk.GDBus.DocString.Short
A string with Docbook content for short/brief
documentation. This annotation can only be used on
<interface> elements.
As an easier alternative to using the
org.gtk.GDBus.DocString annotation, note that
XML parser used by gdbus-codegen parses XML
comments in a way similar to gtk-doc:
longer description.
This is a new paragraph.
-->
]]>
For the org.gtk.GDBus.DocString annotation (and
inline comments), note that substrings of the form
#net.Corp.Bar,
net.Corp.Bar.FooMethod(),
#net.Corp.Bar::BarSignal and
#net.Corp.InlineDocs:BazProperty are all expanded
to links to the respective interface, method, signal and property.
Example
Consider the following D-Bus Introspection XML.
]]>
If gdbus-codegen is used on this file like this:
two files called
myapp-generated.[ch] are
generated. The files provide an abstract
GInterface-derived type called
MyAppFrobber as well as two instantiable types with
the same name but suffixed with Proxy and
Stub. The generated file, roughly, contains the
following facilities:
Thus, for every D-Bus method, there will be three C functions for
calling the method, one GObject signal for handling
an incoming call and one C function for completing an incoming
call. For every D-Bus signal, there's one GObject
signal and one C function for emitting it. For every D-Bus
property, two C functions are generated (one setter, one getter)
and one GObject property. The following table
summarizes the generated facilities and where they are applicable:
ClientServerTypesUse MyAppFrobberProxyAny type implementing the MyAppFrobber interfaceMethodsUse m_a_f_hello_world() to call.Receive via the handle_hello_world() signal handler. Complete the call with m_a_f_complete_hello_world()SignalsConnect to the ::notification GObject signal.Use m_a_f_emit_notification() to emit signal.Properties (Reading)Use m_a_f_get_verbose() or :verbose.Implement GObject's get_property() vfunc.Properties (writing)Use m_a_f_set_verbose() or :verbose.Implement GObject's set_property() vfunc.Client-side usage
You can use the generated proxy type with the generated
constructors:
Instead of using the generic GDBusProxy facilities,
one can use the generated methods such as
my_app_frobber_call_hello_world() to invoke
the net.Corp.MyApp.Frobber.HelloWorld()
D-Bus method, connect to the the
::notification GObject signal to receive
the net.Corp.MyApp.Frobber::Notication D-Bus
signal and get/set the
net.Corp.MyApp.Frobber:Verbose D-Bus
Property using either the GObject property
:verbose or the
my_app_get_verbose() and
my_app_set_verbose() methods. Use the
standard GObject::notify signal to listen
to property changes.
Note that all property access is via GDBusProxy's
property cache so no IO is ever done when reading properties.
Also note that setting a property will cause
org.freedesktop.DBus.Properties.Set() to be
called on the remote object. This call, however, is asynchronous
so setting a property won't block. Further, the change is
delayed and no error checking is possible.
Server-side usage
The generated MyAppFrobber interface is designed so
it is easy to implement it in a GObject
subclass. For example, to handle
HelloWorld() method invocations, set the
vfunc for handle_hello_hello_world() in the
MyAppFrobberIface structure. Similary, to handle
the net.Corp.MyApp.Frobber:Verbose
property override the :verbose GObject
property from the subclass. To emit a signal, use
e.g. my_app_emit_signal() or
g_signal_emit_by_name().
Instead of subclassing, it is often easier to use the generated
MyAppFrobberStub subclass. To handle incoming
method calls, use g_signal_connect() with
the ::handle-* signals and instead of
overriding GObject's
get_property() and
set_property() vfuncs, use
g_object_get() and
g_object_set() or the generated property
getters and setters (the generated class has an internal
property bag implementation).
To facility atomic changesets (multiple properties changing at
the same time), GObject::notify signals are
queued up when received. The queue is drained in an idle handler
and will cause emissions of the
org.freedesktop.DBus.Properties::PropertiesChanged
signal with all the properties that has changed. Use
g_dbus_interface_stub_flush() to empty the
queue immediately.
C Type Mapping
Scalar types, strings (including object paths (type-string
o), signatures (type-string
g) and bytestrings (type-string
ay)) and arrays of string (type-string
as) and arrays of bytestrings (type-string
aay) are mapped to the natural types,
e.g. gboolean, gdouble,
gint, gchar*, gchar ** and
so on. Everything else is mapped to the GVariant
type.
This automatic mapping can be turned off by using the annotation
org.gtk.GDBus.C.ForceGVariant - if used then a
GVariant is always exchanged instead of the
corresponding native C type. This annotation may be convenient to
use when using the type-string ay for data with
embedded NUL bytes.
Stability Guarantees
No guarantees about the API and ABI of the code generated by
gdbus-codegen are given. This means that code
generated by future versions of this program may have a different
API or ABI even if the underlying D-Bus interface hasn't
changed. As such, always include the generated code in
distribution tarballs and never expose the code in any stable
interfaces.
Future versions of gdbus-codegen will provide
ABI and API guarantees on the generated code.
Author
Written by David Zeuthen zeuthen@gmail.com with
a lot of help from many others.
Bugs
Please send bug reports to either the distribution bug tracker
or the upstream bug tracker at
.
See alsogdbus1