void qFetchStringKeyMapEntry(QDBusDataMap<QString>& map, DBusMessageIter* it) { DBusMessageIter itemIter; dbus_message_iter_recurse(it, &itemIter); Q_ASSERT(dbus_message_iter_has_next(&itemIter)); QString key = qFetchParameter(&itemIter).toString(); dbus_message_iter_next(&itemIter); map.insert(key, qFetchParameter(&itemIter)); }
void qFetchUInt64KeyMapEntry(QDBusDataMap<Q_UINT64>& map, DBusMessageIter* it) { DBusMessageIter itemIter; dbus_message_iter_recurse(it, &itemIter); Q_ASSERT(dbus_message_iter_has_next(&itemIter)); Q_UINT64 key = qFetchParameter(&itemIter).toUInt64(); dbus_message_iter_next(&itemIter); map.insert(key, qFetchParameter(&itemIter)); }
void QDBusMarshall::messageToList(QList<QVariant> &list, DBusMessage *message) { Q_ASSERT(message); DBusMessageIter it; if (!dbus_message_iter_init(message, &it)) return; do { list.append(qFetchParameter(&it)); } while (dbus_message_iter_next(&it)); }
void QDBusMarshall::messageToList(QValueList<QDBusData>& list, DBusMessage* message) { Q_ASSERT(message); DBusMessageIter it; if (!dbus_message_iter_init(message, &it)) return; do { list << qFetchParameter(&it); } while (dbus_message_iter_next(&it)); }
static QDBusData qFetchParameter(DBusMessageIter *it) { switch (dbus_message_iter_get_arg_type(it)) { case DBUS_TYPE_BOOLEAN: return QDBusData::fromBool(qIterGet<dbus_bool_t>(it)); case DBUS_TYPE_BYTE: return QDBusData::fromByte(qIterGet<unsigned char>(it)); case DBUS_TYPE_INT16: return QDBusData::fromInt16(qIterGet<dbus_int16_t>(it)); case DBUS_TYPE_UINT16: return QDBusData::fromUInt16(qIterGet<dbus_uint16_t>(it)); case DBUS_TYPE_INT32: return QDBusData::fromInt32(qIterGet<dbus_int32_t>(it)); case DBUS_TYPE_UINT32: return QDBusData::fromUInt32(qIterGet<dbus_uint32_t>(it)); case DBUS_TYPE_INT64: return QDBusData::fromInt64(qIterGet<dbus_int64_t>(it)); case DBUS_TYPE_UINT64: return QDBusData::fromUInt64(qIterGet<dbus_uint64_t>(it)); case DBUS_TYPE_DOUBLE: return QDBusData::fromDouble(qIterGet<double>(it)); case DBUS_TYPE_STRING: case DBUS_TYPE_SIGNATURE: return QDBusData::fromString(QString::fromUtf8(qIterGet<char *>(it))); case DBUS_TYPE_OBJECT_PATH: return QDBusData::fromObjectPath(QDBusObjectPath(qIterGet<char *>(it))); case DBUS_TYPE_ARRAY: { int arrayType = dbus_message_iter_get_element_type(it); char* sig = dbus_message_iter_get_signature(it); QCString signature = sig; dbus_free(sig); QValueList<QDBusData> prototypeList = parseSignature(signature); if (arrayType == DBUS_TYPE_DICT_ENTRY) { DBusMessageIter sub; dbus_message_iter_recurse(it, &sub); return qFetchMap(&sub, prototypeList[0]); // } else if (arrayType == DBUS_TYPE_BYTE) { // DBusMessageIter sub; // dbus_message_iter_recurse(it, &sub); // int len = dbus_message_iter_get_array_len(&sub); // char* data; // dbus_message_iter_get_fixed_array(&sub,&data,&len); // return QCString(data,len); // } else { } else { QDBusDataList list = prototypeList[0].toList(); DBusMessageIter arrayIt; dbus_message_iter_recurse(it, &arrayIt); while (dbus_message_iter_get_arg_type(&arrayIt) != DBUS_TYPE_INVALID) { list << qFetchParameter(&arrayIt); dbus_message_iter_next(&arrayIt); } return QDBusData::fromList(list); } } case DBUS_TYPE_VARIANT: { QDBusVariant dvariant; DBusMessageIter sub; dbus_message_iter_recurse(it, &sub); char* signature = dbus_message_iter_get_signature(&sub); dvariant.signature = QString::fromUtf8(signature); dbus_free(signature); dvariant.value = qFetchParameter(&sub); return QDBusData::fromVariant(dvariant); } case DBUS_TYPE_STRUCT: { QValueList<QDBusData> memberList; DBusMessageIter subIt; dbus_message_iter_recurse(it, &subIt); uint index = 0; while (dbus_message_iter_get_arg_type(&subIt) != DBUS_TYPE_INVALID) { memberList << qFetchParameter(&subIt); dbus_message_iter_next(&subIt); ++index; } return QDBusData::fromStruct(memberList); } #if 0 case DBUS_TYPE_INVALID: // TODO: check if there is better way to detect empty arrays return QDBusData(); break; #endif default: qWarning("QDBusMarshall: Don't know how to de-marshall type %d '%c'", dbus_message_iter_get_arg_type(it), dbus_message_iter_get_arg_type(it)); return QDBusData(); break; } }
static QVariant qFetchParameter(DBusMessageIter *it) { switch (dbus_message_iter_get_arg_type(it)) { case DBUS_TYPE_BYTE: return qVariantFromValue(qIterGet<unsigned char>(it)); case DBUS_TYPE_INT16: return qVariantFromValue(qIterGet<dbus_int16_t>(it)); case DBUS_TYPE_UINT16: return qVariantFromValue(qIterGet<dbus_uint16_t>(it)); case DBUS_TYPE_INT32: return qIterGet<dbus_int32_t>(it); case DBUS_TYPE_UINT32: return qIterGet<dbus_uint32_t>(it); case DBUS_TYPE_DOUBLE: return qIterGet<double>(it); case DBUS_TYPE_BOOLEAN: return bool(qIterGet<dbus_bool_t>(it)); case DBUS_TYPE_INT64: return static_cast<qlonglong>(qIterGet<dbus_int64_t>(it)); case DBUS_TYPE_UINT64: return static_cast<qulonglong>(qIterGet<dbus_uint64_t>(it)); case DBUS_TYPE_STRING: case DBUS_TYPE_OBJECT_PATH: case DBUS_TYPE_SIGNATURE: return QString::fromUtf8(qIterGet<char *>(it)); case DBUS_TYPE_VARIANT: return qIterGet<QVariant>(it); case DBUS_TYPE_ARRAY: { int arrayType = dbus_message_iter_get_element_type(it); switch (arrayType) { case DBUS_TYPE_BYTE: { // QByteArray DBusMessageIter sub; dbus_message_iter_recurse(it, &sub); int len = dbus_message_iter_get_array_len(&sub); char* data; dbus_message_iter_get_fixed_array(&sub,&data,&len); return QByteArray(data,len); } case DBUS_TYPE_INT16: return qFetchList<dbus_int16_t, short>(it); case DBUS_TYPE_UINT16: return qFetchList<dbus_uint16_t, ushort>(it); case DBUS_TYPE_INT32: return qFetchList<dbus_int32_t, int>(it); case DBUS_TYPE_UINT32: return qFetchList<dbus_uint32_t, uint>(it); case DBUS_TYPE_BOOLEAN: return qFetchList<dbus_bool_t, bool>(it); case DBUS_TYPE_DOUBLE: return qFetchList<double, double>(it); case DBUS_TYPE_INT64: return qFetchList<dbus_int64_t, qlonglong>(it); case DBUS_TYPE_UINT64: return qFetchList<dbus_uint64_t, qulonglong>(it); case DBUS_TYPE_STRING: case DBUS_TYPE_OBJECT_PATH: case DBUS_TYPE_SIGNATURE: return qFetchStringList(it); case DBUS_TYPE_VARIANT: return qFetchList<QVariant, QVariant>(it); case DBUS_TYPE_DICT_ENTRY: { // ### support other types of maps? QMap<QString, QVariant> map; DBusMessageIter sub; dbus_message_iter_recurse(it, &sub); if (dbus_message_iter_get_array_len(&sub) == 0) // empty map return map; do { DBusMessageIter itemIter; dbus_message_iter_recurse(&sub, &itemIter); Q_ASSERT(dbus_message_iter_has_next(&itemIter)); QString key = qFetchParameter(&itemIter).toString(); dbus_message_iter_next(&itemIter); map.insertMulti(key, qFetchParameter(&itemIter)); } while (dbus_message_iter_next(&sub)); return map; } } } // fall through // common handling for structs and lists of lists (for now) case DBUS_TYPE_STRUCT: { QList<QVariant> list; DBusMessageIter sub; dbus_message_iter_recurse(it, &sub); if (dbus_message_iter_get_array_len(&sub) == 0) return list; do { list.append(qFetchParameter(&sub)); } while (dbus_message_iter_next(&sub)); return list; } default: qWarning("Don't know how to handle type %d '%c'", dbus_message_iter_get_arg_type(it), dbus_message_iter_get_arg_type(it)); return QVariant(); break; } }
inline QVariant qIterGet(DBusMessageIter *it) { DBusMessageIter sub; dbus_message_iter_recurse(it, &sub); return QDBusTypeHelper<QVariant>::toVariant(qFetchParameter(&sub)); }