Thread: [SailfishOS+Harmattan] QDBusConnection: receive/send message
View Single Post
marxian's Avatar
Posts: 2,448 | Thanked: 9,523 times | Joined on Aug 2010 @ Wigan, UK
#2
I think you will need to use QDBusMessage and QDBusArgument in order to convert the reply arguments:

Code:
void ImControlThread::telepathyMessageReceived(const QDBusMessage &reply) {
    foreach (QVariant arg, reply.arguments()) {
        if (arg.canConvert<QDBusArgument>()) {
            qDebug() << dbusArgumentToVariant(arg.value<QDBusArgument>());
        }
        else {
            qDebug() << arg;
        }
    }
}

QVariant dbusArgumentToVariant(const QDBusArgument &arg) {
    switch (arg.currentType()) {
    case QDBusArgument::BasicType:
    case QDBusArgument::VariantType:
        return basicTypeToVariant(arg);
    case QDBusArgument::ArrayType:
        return arrayTypeToVariant(arg);
    case QDBusArgument::MapType:
        return mapTypeToVariant(arg);
    default:
        return QVariant();
    }
}

QVariant basicTypeToVariant(const QDBusArgument &arg) {
    return arg.asVariant();
}

QVariant arrayTypeToVariant(const QDBusArgument &arg) {
    QVariantList list;
    arg.beginArray();

    while (!arg.atEnd()) {
        list << dbusArgumentToVariant(arg);
    }

    arg.endArray();
    return list;
}

QVariant mapTypeToVariant(const QDBusArgument &arg) {
    QVariantMap map;
    arg.beginMap();

    while (!arg.atEnd()) {
        arg.beginMapEntry();
        map[basicTypeToVariant(arg).toString()] = dbusArgumentToVariant(arg);
        arg.endMapEntry();
    }

    arg.endMap();
    return map;
}
__________________
'Men of high position are allowed, by a special act of grace, to accomodate their reasoning to the answer they need. Logic is only required in those of lesser rank.' - J K Galbraith

My website

GitHub
 

The Following 3 Users Say Thank You to marxian For This Useful Post: