I need help with QDBusArgument unmashalling
-
I am trying to unmarshall the QDBusMessage message into data now i am stuck at how to get the "internal" struct data, I can not find any example whatsoever online,
with the Mount struct below I get the first 10 but how do I get the next? I am out of things to try.
Output from dbus-monitor type=signal interface="org.gtk.vfs.MountTracker"
signal time=1653669688.246585 sender=:1.7 -> destination=(null destination) serial=1483 path=/org/gtk/vfs/mounttracker; interface=org.gtk.vfs.MountTracker; member=Mounted
struct {
string ":1.514"
object path "/org/gtk/vfs/mount/1"
string "root on 172.16.1.2"
string "sftp:host=172.16.1.2,user=root"
string ""
string ". GThemedIcon folder-remote folder folder-remote-symbolic folder-symbolic"
string ". GThemedIcon folder-remote-symbolic folder-symbolic folder-remote folder"
string ""
boolean true
array of bytes "/run/user/1000/gvfs/sftp:host=172.16.1.2,user=root" + \0
struct {
array of bytes "/" + \0
array [
dict entry(
string "host"
variant array of bytes "172.16.1.2" + \0
)
dict entry(
string "type"
variant array of bytes "sftp" + \0
)
dict entry(
string "user"
variant array of bytes "root" + \0
)
]
}
array of bytes "/root" + \0
}//===============================================================
header file// <arg type="(sossssssbay(aya{sv})ay)" name="mount"/>
struct Mount
{QString member1; QDBusObjectPath member2; QString member3; QString member4; QString member5; QString member6; QString member7; QString member8; bool member9; QByteArray member10;};
//===============================================================
source fileQ_DECLARE_METATYPE(Mount)
qRegisterMetaType<Mount>("Mount");
qDBusRegisterMetaType<Mount>();QDBusConnection::sessionBus().connect("org.gtk.vfs.Daemon", "/org/gtk/vfs/mounttracker", "org.gtk.vfs.MountTracker", "Mounted", this, SLOT(Mounted(QDBusMessage)));
// Marshall the MyStructure data into a D-Bus argument
QDBusArgument &operator<<(QDBusArgument &argument, const Mount &mystruct)
{argument.beginStructure(); argument << mystruct.member1; argument << mystruct.member2; argument << mystruct.member3; argument << mystruct.member4; argument << mystruct.member5; argument << mystruct.member6; argument << mystruct.member7; argument << mystruct.member8; argument << mystruct.member9; argument << mystruct.member10; argument.endStructure(); return argument;}
// Retrieve the MyStructure data from the D-Bus argument
const QDBusArgument &operator>>(const QDBusArgument &argument, Mount &mystruct )
{argument.beginStructure(); argument >> mystruct.member1; argument >> mystruct.member2; argument >> mystruct.member3; argument >> mystruct.member4; argument >> mystruct.member5; argument >> mystruct.member6; argument >> mystruct.member7; argument >> mystruct.member8; argument >> mystruct.member9; argument >> mystruct.member10; argument.endStructure(); return argument;}
void mydbusConnections::Mounted(QDBusMessage message)
{Mount structure; message.arguments().at(0).value<QDBusArgument>() >> structure;}
-
Ok, problem solved...
header file
// <arg type="(sossssssbay(aya{sv})ay)" name="mount"/>
struct Mount
{
QString member1;
QDBusObjectPath member2;
QString member3;
QString member4;
QString member5;
QString member6;
QString member7;
QString member8;
bool member9;
QByteArray member10;
struct MountSub
{
QByteArray submember0;
QMap <QString,QVariant> submember1;
} member11;
QByteArray member12;
};Q_DECLARE_METATYPE(Mount)
Q_DECLARE_METATYPE(Mount::MountSub)source file
qRegisterMetaType<Mount>("Mount"); qDBusRegisterMetaType<Mount>(); qRegisterMetaType<Mount::MountSub>("MountSub"); qDBusRegisterMetaType<Mount::MountSub>();// Marshall the MyStructure data into a D-Bus argument
QDBusArgument &operator<<(QDBusArgument &argument, const Mount &mystruct)
{
argument.beginStructure();
argument << mystruct.member1;
argument << mystruct.member2;
argument << mystruct.member3;
argument << mystruct.member4;
argument << mystruct.member5;
argument << mystruct.member6;
argument << mystruct.member7;
argument << mystruct.member8;
argument << mystruct.member9;
argument << mystruct.member10;
argument.beginStructure();
argument << mystruct.member11.submember0;
argument << mystruct.member11.submember1;
argument.endStructure();
argument << mystruct.member12;
argument.endStructure();
return argument;
}// Retrieve the MyStructure data from the D-Bus argument
const QDBusArgument &operator>>(const QDBusArgument &argument, Mount &mystruct )
{argument.beginStructure(); argument >> mystruct.member1; argument >> mystruct.member2; argument >> mystruct.member3; argument >> mystruct.member4; argument >> mystruct.member5; argument >> mystruct.member6; argument >> mystruct.member7; argument >> mystruct.member8; argument >> mystruct.member9; argument >> mystruct.member10; argument.beginStructure(); argument >> mystruct.member11.submember0; argument >> mystruct.member11.submember1; argument.endStructure(); argument >> mystruct.member12; argument.endStructure(); return argument;}
// Marshall the MyStructure data into a D-Bus argument
QDBusArgument &operator<<(QDBusArgument &argument, const Mount::MountSub &mystruct)
{
argument.beginStructure();
argument << mystruct.submember0;
argument << mystruct.submember1;
argument.endStructure();
return argument;
}// Retrieve the MyStructure data from the D-Bus argument
const QDBusArgument &operator>>(const QDBusArgument &argument, Mount::MountSub &mystruct )
{
argument.beginStructure();
argument >> mystruct.submember0;
argument >> mystruct.submember1;
argument.endStructure();
return argument;
}void mydbusConnections::Mounted(QDBusMessage message)
{
// <arg type="(sossssssbay(aya{sv})ay)" name="mount"/>
Mount structure;
message.arguments().at(0).value<QDBusArgument>() >> structure;qInfo() << structure.member1; qInfo() << structure.member2.path(); qInfo() << structure.member3; qInfo() << structure.member4; qInfo() << structure.member5; qInfo() << structure.member6; qInfo() << structure.member7; qInfo() << structure.member8; qInfo() << structure.member9; qInfo() << structure.member10; qInfo() << structure.member11.submember0; qInfo() << structure.member11.submember1; qInfo() << structure.member12;}