dbus-glib - passing structs as arguments
Steve Kreyer
steve.kreyer at web.de
Tue Apr 21 14:51:20 PDT 2009
P.S.: The method described below only works if the remote object is
introspectable (i.e. implementing the Introspectable interface), or if
you are implementing your own object and have a XML spec available. You
can obtain the introspection XML of the remote object e.g. via a
dbus-send command issue:
$ dbus-send --session --type=method_call \
--print-reply --dest=org.dbus.example.Foo \
/org/dbus/example \
org.freedesktop.DBus.Introspectable.Introspect
Kind Regards,
Steve
Steve Kreyer wrote:
> Hi Stanislav,
>
> the function I suggested was only a place holder for the generated
> wrapper function of the dbus-binding-tool. You need to generate a header
> file for your application out of the XML interface specification. An
> example can look like the following:
>
> <?xml version="1.0" encoding="UTF-8" ?>
>
> <node name="/org/dbus/example">
> <interface name="org.dbus.example.Foo">
> <annotation name="org.freedesktop.DBus.GLib.CSymbol"
> value="foo_bar" />
> <method name="bar">
> <arg type="(ss)" name="bar" direction="in" />
> </method>
> </interface>
> </node>
>
> So if you take this interface specification and use it as input for the
> following command:
>
> dbus-binding-tool --mode=glib-client --prefix= cliebt.xml > client.h
>
> you will end up in a file called client.h which you have to include and
> which consists of necessary helper functions:
> gboolean
> org_dbus_example_Foo_bar (DBusGProxy *proxy, const GValueArray*
> IN_param, GError **error); /* use for synchronous calls */
> and
> DBusGProxyCall*
> org_dbus_example_Foo_bar_async (DBusGProxy *proxy, const GValueArray*
> IN_param, org_dbus_example_Foo_bar_reply callback, gpointer userdata) /*
> use for asynchronous calls */
>
> This step is also document in the tutorial:
> http://dbus.freedesktop.org/doc/dbus-tutorial.html#glib-generated-bindings
>
>
> Kind Regards,
> Steve
>
>
> Stanislav Popov wrote:
>
>> Hi Steve,
>> Thanks for you reply!
>>
>> I see that dbus-glib includes dbus-glib-binding tool.
>> I was not able to find this function
>> dbus_binding_tool_generated_method() ?
>>
>> Where can I find it?
>> Which header files should I include in my application?
>>
>> Thanks and Regards,
>> Stanislav
>>
>> Steve Kreyer wrote:
>>
>>> Hi,
>>>
>>> to my knowledge structs are represented by the dbus-glib-binding via the
>>> type GValueArray.
>>>
>>> Why using dbus_g_proxy_call directly? Theres a little tool which
>>> generates you dbus_g_proxy_call invocations in the right way. It is
>>> called dbus-binding-tool. You feed it with your XML interface
>>> specification and it generates for you easy-to-use wrapper functions
>>> around dbus_g_proxy_call for synchronous and asynchronous method calls.
>>>
>>> All you have to do is to allocate the GValueArray and pass it to the
>>> generated function in your application:
>>>
>>> GError *error = NULL;
>>> GValueArray *dbus_struct;
>>> GValue dbus_struct_member = {0};
>>>
>>> dbus_struct = g_value_array_new(0);
>>>
>>> g_value_init (&dbus_struct_member, G_TYPE_STRING);
>>>
>>> g_value_set_string (&dbus_struct_member, "value of first member");
>>> g_value_array_append (dbus_struct, &dbus_struct_member);
>>>
>>> g_value_set_string (&dbus_struct_member, "value of second member");
>>> g_value_array_append (dbus_struct, &dbus_struct_member);
>>>
>>> dbus_binding_tool_generated_method (proxy, dbus_struct, &error);
>>>
>>> HTH,
>>> Steve
>>>
>>> Stanislav Popov wrote:
>>>
>>>
>>>> Hi all,
>>>> I read D-Bus Tutorial and many other documents!
>>>>
>>>> I have only one problem.
>>>> I am using dbus-glib and I am trying to invoke a method with parameters.
>>>> I would like to pass structures to dbus_g_proxy_call() function.
>>>> For example I have (ss) type.
>>>>
>>>> I tried |DBUS_TYPE_STRUCT which is mentioned in |D-Bus Tutorial| but it
>>>> seems it is not working with GLIB.
>>>> I got:
>>>> |
>>>>
>>>> 1.
>>>> (process:835): GLib-GObject-WARNING **: gtype.c:3312: type id
>>>> `115' is invalid
>>>> 2.
>>>>
>>>> 3.
>>>> (process:835): GLib-GObject-WARNING **: can't peek value table for
>>>> type `<unknown>' which is not currently referenced
>>>> 4.
>>>> Segmentation fault
>>>>
>>>>
>>>> So I did the following:
>>>>
>>>> #define G_STRUCT_STR_STR (dbus_g_type_get_struct("GValueArray",
>>>> G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID))
>>>>
>>>> GValue *value;
>>>>
>>>> value = g_new0 (GValue, 1);
>>>> g_value_init (value, G_STRUCT_STR_STR);
>>>> g_value_take_boxed (value, dbus_g_type_specialized_construct
>>>> (G_STRUCT_STR_STR));
>>>>
>>>> dbus_g_type_struct_set (value, 0, "192.168.0.1", 1, "1234", G_MAXUINT);
>>>> .....
>>>>
>>>> dbus_g_proxy_call (proxy, "SetInfo", &error, G_STRUCT_STR_STR, value,
>>>> G_TYPE_INVALID, G_TYPE_INVALID))
>>>>
>>>> ------
>>>> but I got Segmentation Fault on dbus_g_proxy_call().
>>>>
>>>> Where am I wrong?
>>>>
>>>> Can you help me, please?
>>>>
>>>> Thanks in advance,
>>>> Stanislav
>>>> _______________________________________________
>>>> dbus mailing list
>>>> dbus at lists.freedesktop.org
>>>> http://lists.freedesktop.org/mailman/listinfo/dbus
>>>>
>>>>
>>>>
>>>>
>>>
>>>
>
> _______________________________________________
> dbus mailing list
> dbus at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dbus
>
>
More information about the dbus
mailing list