gdbus-codegen 1 User Commands gdbus-codegen GLib D-Bus code generator gdbus-codegen org.project.Prefix YourProject OUTFILES OUTFILES element key key FILE FILE Description gdbus-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: Client Server Types Use MyAppFrobberProxy Any type implementing the MyAppFrobber interface Methods Use 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() Signals Connect 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 also gdbus1