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

Hans Lehmann hans at gambas-buch.de
Fri Jan 26 16:26:44 CET 2018


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


More information about the User mailing list