[Gambas-user] DBus - How are signal data converted to Gambas data?

Benoît Minisini g4mba5 at gmail.com
Sun Jan 28 19:53:13 CET 2018


Le 26/01/2018 à 16:26, Hans Lehmann a écrit :
> Hello,
> 
> in a project for the Gambas book on 'D-Bus with gb.dbus' I have the 
> problem to read the arguments of a particular signal. In the text of the 
> XML document (Inspection) I found the number of expected arguments, 
> their names and the signatures. Through the output of the console 
> program, I knew all the values of the three arguments.
> 
> Cutout Introspection-XML-Document:
> ----------------------------------------------------
> 
> ...
> <signal name="VolumeAdded">
>     <arg type="s" name="dbus_name"/>
>     <arg type="s" name="id"/>
>     <arg type="(ssssssbbssa{ss}sa{sv})" name="volume"/>
> </signal>
> ...
> 
> Output of 'dbus-monitor' after inserting the USB stick with label '2_GB_P':
> ------------------------------------------------------------------------------------------------------ 
> 
> 
> ...
> signal sender=:1.10 -> dest=(null destination) serial=173 
> path=/org/gtk/Private/RemoteVolumeMonitor; 
> interface=org.gtk.Private.RemoteVolumeMonitor; member=VolumeAdded
>     string "org.gtk.Private.UDisks2VolumeMonitor"
>     string "0x1449bd0"
>     struct {
>        string "0x1449bd0"
>        string "2_GB_P"
>        string ". GThemedIcon drive-removable-media-usb 
> drive-removable-media drive-removable drive"
>        string ". GThemedIcon drive-removable-media-usb-symbolic ... 
> drive-symbolic drive-removable-media-usb drive-removable-media 
> drive-removable drive"
>        string ""
>        string ""
>        boolean true
>        boolean true
>        string "0x14af500"
>        string ""
>        array [
>           dict entry(
>              string "class"
>              string "device"
>           )
>           dict entry(
>              string "unix-device"
>              string "/dev/sdd1"
>           )
>           dict entry(
>              string "label"
>              string "2_GB_P"
>           )
>           dict entry(
>              string "uuid"
>              string "38ea6e0b-a161-401d-a673-11c06cf1229e"
>           )
>        ]
>        string "gvfs.time_detected_usec.1516884992931147"
>        array [
>        ]
>     }
> ...
> 
> With the following source code I can read the arguments 0 and 1, since 
> they have simple data types. From argument 2, I can only read the values 
> with simple data types.
> 
> *Therefore, my question: Which way do I have to go - certainly about the 
> class DBusValues, whose documentation I do not understand - in order to 
> read out the values of all arguments safely and to map them to Gambas 
> types?*
> 
> Gambas-Code-Cutout
> ------------------
> 
> Public Sub theDBusSignal_Signal(Signal As String, Arguments As Variant[])
> 
>    Dim vElement As Variant
>    Dim i As Integer
>    Dim aDBusArray As New BusValue
> 
>    If Signal = "VolumeAdded" Or Signal = "VolumeRemoved" Then
> 
>       txaResults.Insert("Number of Arguments from 'Arguments' = " & 
> Arguments.Count & gb.NewLine)
>       txaResults.Insert("Arguments[0] = " & Arguments[0] & gb.NewLine)
>       txaResults.Insert("Arguments[1] = " & Arguments[1] & gb.NewLine)
> txaResults.Insert("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" 
> & gb.NewLine)
> 
>       For i = 0 To Arguments[2].Max
>       '   txaResults.Insert("[2][" & Str(i) & "]" & " -> " & 
> Arguments[2][i] & gb.NewLine)
>           txaResults.Insert(TypeOf(Arguments[2][i]) & gb.NewLine)
>       Next
> 
>       Print "Number of Arguments from 'Arguments' = "; Arguments.Count
> 
>       Print "Argument[0] = "; Arguments[0]
>       Print "Arguments[1] = "; Arguments[1]; " | Typ = "; 
> TypeOf(Arguments[1])
>       Print "Arguments[2] = "; Arguments[2]; " | Typ = "; 
> TypeOf(Arguments[2])
> 
>       For Each vElement In Arguments
>         Print vElement
>       Next
> 
>       For i = 0 To Arguments[2].Max
>         Print "[2]["; i; "]"; " -> "; Arguments[2][i]
>       Next
> 
>    Endif
> 
> End
> 
> Cutout Console:
> ---------------------
> 
> Number of Arguments from 'Arguments' = 3
> ---------------------------------------------------------
> Argument[0] = org.gtk.Private.UDisks2VolumeMonitor
> Arguments[1] = 0x1449bd0 | Typ = 9
> Arguments[2] = (Variant[] 0x16ac228) | Typ = 16
> ---------------------------------------------------------
> org.gtk.Private.UDisks2VolumeMonitor
> 0x1449bd0
> (Variant[] 0x16ac228)
> ---------------------------------------------------------
> [2][0] -> 0x1449bd0
> [2][1] -> 2_GB_P
> [2][2] -> . GThemedIcon drive-removable-media-usb ... drive-removable drive
> [2][3] -> . GThemedIcon drive-removable-media-usb-symbolic 
> ...drive-removable-media-usb
> [2][4] ->
> [2][5] ->
> [2][6] -> True
> [2][7] -> True
> [2][8] ->
> [2][9] ->
> [2][10] -> (Collection 0x16ac048)
> [2][11] -> gvfs.time_detected_usec.1516884992931147
> [2][12] -> (Collection 0x16ac188)
> 
> With kind regards
> 
> Hans
> 

I have update the DBus documentation page at 
http://gambaswiki.org/wiki/doc/dbus#t10 with the datatype mapping 
between Gambas and DBus.

It should help you.

Regards,

-- 
Benoît Minisini


More information about the User mailing list