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