dbus-glib - passing structs as arguments
Stanislav Popov
s.popov at rsc.bg
Wed Apr 22 01:39:26 PDT 2009
Hi Steve,
thank you very much for your reply.
This is maybe exactly what I am looking for!
I will test it now!
I will just get the available methods with Introspect method and
copy/paste the XML ;)
BR,
Stanislav
Steve Kreyer wrote:
> 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