Hallo zusammen!
Ich verzweifle nun schon seit Stunden daran Informationen vom DBUS mundgerecht zu servieren. Hintergrund ist in meinem Fall connman, es geht aber generell um das Vorgehen die DBUS-Methoden zu entschlüsseln.
Um das ganze nicht mit massiv langen Codeblöcken zuzuspammen, versuche ich mal das relevante zusammenzufassen:
Introspect des DBUS und das automatische Klassen genererieren mit bspw. qdbusxml2cpp funktioniert so nicht, da die Methoden zu komplex sind (oder ich zu doof das xml aufzubereiten, was wahrscheinlicher ist^^).
Die Quelle List of DBus data types entschlüsselt den obigen Aufbau als
array( struct( objectPath, array( dict{string,variant} ) ) )
eine funktionierende Lösung findet sich unter wifi-runner (Python), die ich aber mangels Kenntnisse nicht verstehe, bzw. auf C++ ummünzen kann. (siehe filter mit lambda)
Meine bisherigen Versuche mit diversen Ansätzen, wie bspw:
Vector< Pair< DBusObjectPath, Vector< Map< String,Variant > > > >
struct { DBusObjectPath, Map<String,Variant> }; innerhalb eines Vector,
etc.
sind kläglich gescheitert. Die Fehler-Meldung lautet stets:
Unexpected reply signature: got \"a(oa{sv})\", expected \"\" (MeinVersuchHier)
Nun hoffe ich, einer von euch kann mir sagen, wie ich das Denken muss, um zu einem Ziel zu kommen. Das reine a{sv} lässt sich übrigens mit Map<String, Variant> abbilden. Ein paar Beispielausgaben mit funktionierendem Connman vom Sailfish OS-Device:
Beispiel für a{sv}:
[Argument: a{sv} { "Name" = [Variant(QString): "WiFi"], "Type" = [Variant(QString): "wifi"], "Powered" = [Variant(bool): true], "Connected" = [Variant(bool): true], "Tethering" = [Variant(bool): false], "TetheringIdentifier" = [Variant(QString): "Shared"], "TetheringPassphrase" = [Variant(QString): "HierStehtEinPasswort"]}]
Beispiel für a(oa{sv}) (Auszug):
[Argument: a(oa{sv}) { [Argument: (oa{sv}) [ObjectPath: /net/connman/service/wifi_5056a8016f7e_5363686967676e4f6e416972_managed_psk], [Argument: a{sv} { "Type" = [Variant(QString): "wifi"], "Security" = [Variant(QStringList): {"psk", "wps"}], "State" = [Variant(QString): "online"], "Strength" = [Variant(uchar): 46], "Favorite" = [Variant(bool): true], "Immutable" = [Variant(bool): false], "AutoConnect" = [Variant(bool): true], "Name" = [Variant(QString): "MyHomeWireless"], "BSSID" = [Variant(QString): "00:11:55:44:33:cc"], "MaxRate" = [Variant(uint): 54000000], "Frequency" = [Variant(ushort): 2427], "EncryptionMode" = [Variant(QString): "aes"], "Ethernet" = [Variant: [Argument: a{sv} {"Method" = [Variant(QString): "auto"], "Interface" = [Variant(QString): "wlan0"], "Address" = [Variant(QString): "00:11:55:44:33:dd"], "MTU" = [Variant(ushort): 1500]}]], "Hidden" = [Variant(bool): false], "IPv4" = [Variant: [Argument: a{sv} {"Method" = [Variant(QString): "manual"], "Address" = [Variant(QString): "192.168.1.40"], "Netmask" = [Variant(QString): "255.255.255.0"], "Gateway" = [Variant(QString): "192.168.1.1"]}]], "IPv4.Configuration" = [Variant: [Argument: a{sv} {"Method" = [Variant(QString): "manual"], "Address" = [Variant(QString): "192.168.1.40"], "Netmask" = [Variant(QString): "255.255.255.0"], "Gateway" = [Variant(QString): "192.168.1.1"]}]], "IPv6" = [Variant: [Argument: a{sv} {"Method" = [Variant(QString): "auto"], "Address" = [Variant(QString): "1234:5678:910a:bcde:fghi:jklm:nopq:rstu"], "PrefixLength" = [Variant(uchar): 64], "Privacy" = [Variant(QString): "disabled"]}]], "IPv6.Configuration" = [Variant: [Argument: a{sv} {"Method" = [Variant(QString): "auto"], "Privacy" = [Variant(QString): "disabled"]}]], "Nameservers" = [Variant(QStringList): {"127.0.0.1", "192.168.1.1"}], "Nameservers.Configuration" = [Variant(QStringList): {"127.0.0.1", "192.168.16.1"}], "Timeservers" = [Variant(QStringList): {"0.pool.ntp.org", "1.pool.ntp.org", "2.pool.ntp.org", "3.pool.ntp.org"}], "Timeservers.Configuration" = [Variant(QStringList): {}], "Domains" = [Variant(QStringList): {}], "Domains.Configuration" = [Variant(QStringList): {}], "Proxy" = [Variant: [Argument: a{sv} {"Method" = [Variant(QString): "direct"]}]], "Proxy.Configuration" = [Variant: [Argument: a{sv} {}]], "Provider" = [Variant: [Argument: a{sv} {}]], "Available" = [Variant(bool): true], "Saved" = [Variant(bool): true], "Access" = [Variant(QString): ""], "DefaultAccess" = [Variant(QString): "sailfish:1;ClearProperty(*)|Connect()|Disconnect()|Remove()|ResetCounters()=deny;group(privileged)=allow"] } ] ], [Argument: (oa{sv}) [ObjectPath: /net/connman/service/cellular_262017400417810_context1], [Argument: a{sv} {"Type" = [Variant(QString): "cellular"], "Security" = [Variant(QStringList): {}], "State" = [Variant(QString): "ready"], "Strength" = [Variant(uchar): 45], "Favorite" = [Variant(bool): true], "Immutable" = [Variant(bool): false], "AutoConnect" = [Variant(bool): true], "Name" = [Variant(QString): "Anbieter.de"], "Roaming" = [Variant(bool): false], "Ethernet" = [Variant: [Argument: a{sv} {"Method" = [Variant(QString): "auto"], "Interface" = [Variant(QString): "rmnet0"], "Address" = [Variant(QString): "AB:CD:EF:11:22:33"], "MTU" = [Variant(ushort): 1280]}]], "IPv4" = [Variant: [Argument: a{sv} {"Method" = [Variant(QString): "fixed"], "Address" = [Variant(QString): "12.34.45.789"], "Netmask" = [Variant(QString): "255.0.0.0"], "Gateway" = [Variant(QString): "37.84.96.197"]}]], "IPv4.Configuration" = [Variant: [Argument: a{sv} {"Method" = [Variant(QString): "fixed"], "Address" = [Variant(QString): "12.34.45.789"], "Netmask" = [Variant(QString): "255.0.0.0"], "Gateway" = [Variant(QString): "37.84.96.197"]}]], "IPv6" = [Variant: [Argument: a{sv} {}]], "IPv6.Configuration" = [Variant: [Argument: a{sv} {"Method" = [Variant(QString): "auto"], "Privacy" = [Variant(QString): "disabled"]}]], "Nameservers" = [Variant(QStringList): {"12.34.45.700", "12.34.45.800"}], "Nameservers.Configuration" = [Variant(QStringList): {}], "Timeservers" = [Variant(QStringList): {"0.pool.ntp.org", "1.pool.ntp.org", "2.pool.ntp.org", "3.pool.ntp.org"}], "Timeservers.Configuration" = [Variant(QStringList): {}], "Domains" = [Variant(QStringList): {}], "Domains.Configuration" = [Variant(QStringList): {}], "Proxy" = [Variant: [Argument: a{sv} {"Method" = [Variant(QString): "direct"]}]], "Proxy.Configuration" = [Variant: [Argument: a{sv} {}]], "Provider" = [Variant: [Argument: a{sv} {}]], "Available" = [Variant(bool): true], "Saved" = [Variant(bool): true], "Access" = [Variant(QString): ""], "DefaultAccess" = [Variant(QString): "sailfish:1;ClearProperty(*)|Connect()|Disconnect()|Remove()|ResetCounters()=deny;group(privileged)=allow"]}]], …
Ich versuche natürlich das ganze in Qt umzusetzen, aber die Implementierung ist gerade zweitrangig. Ich möchte in erster Linie wissen, was ich da falsch verstehe oder wo meine Ansätze haken.