/*static*/ void WStringCodec::decode(DBusMessageIter& iter, std::wstring& str) { str.clear(); DBusMessageIter _iter; simppl_dbus_message_iter_recurse(&iter, &_iter, DBUS_TYPE_ARRAY); int count = #if DBUS_MAJOR_VERSION == 1 && DBUS_MINOR_VERSION < 9 dbus_message_iter_get_array_len(&_iter) / sizeof(uint32_t); #else dbus_message_iter_get_element_count(&iter); #endif if (count > 0) str.reserve(count); while(dbus_message_iter_get_arg_type(&_iter) != 0) { uint32_t t; Codec<uint32_t>::decode(_iter, t); str.push_back((wchar_t)t); } // advance to next element dbus_message_iter_next(&iter); }
static QStringList qFetchStringList(DBusMessageIter *arrayIt) { QStringList list; DBusMessageIter it; dbus_message_iter_recurse(arrayIt, &it); if (dbus_message_iter_get_array_len(&it) == 0) return list; do { list.append(QString::fromUtf8(qIterGet<char *>(&it))); } while (dbus_message_iter_next(&it)); return list; }
inline QVariant qFetchList(DBusMessageIter *arrayIt) { QList<QtType> list; DBusMessageIter it; dbus_message_iter_recurse(arrayIt, &it); if (dbus_message_iter_get_array_len(&it) == 0) return QDBusTypeHelper<QList<QtType> >::toVariant(list); do { list.append( static_cast<QtType>( qIterGet<DBusType>(&it) ) ); } while (dbus_message_iter_next(&it)); return QDBusTypeHelper<QList<QtType> >::toVariant(list); }
static dbus_bool_t _wpa_dbus_dict_entry_get_array( DBusMessageIter *iter_dict_val, struct wpa_dbus_dict_entry *entry) { int array_type = dbus_message_iter_get_element_type(iter_dict_val); int array_len; dbus_bool_t success = FALSE; DBusMessageIter iter_array; if (!entry) return FALSE; dbus_message_iter_recurse(iter_dict_val, &iter_array); array_len = dbus_message_iter_get_array_len(&iter_array); if (array_len < 0) return FALSE; switch (array_type) { case DBUS_TYPE_BYTE: success = _wpa_dbus_dict_entry_get_byte_array(&iter_array, array_len, array_type, entry); break; case DBUS_TYPE_STRING: success = _wpa_dbus_dict_entry_get_string_array(&iter_array, array_len, array_type, entry); break; default: break; } return success; }
/*static*/ void WStringCodec::decode(DBusMessageIter& iter, wchar_t*& str) { wchar_t* c_str = nullptr; //assert(str == nullptr); // we allocate the string via Deserializer::alloc -> free with Deserializer::free DBusMessageIter _iter; simppl_dbus_message_iter_recurse(&iter, &_iter, DBUS_TYPE_ARRAY); int count = #if DBUS_MAJOR_VERSION == 1 && DBUS_MINOR_VERSION < 9 dbus_message_iter_get_array_len(&_iter) / sizeof(uint32_t); #else dbus_message_iter_get_element_count(&iter); #endif if (count > 0) { c_str = new wchar_t[count+1]; c_str[count] = 0; int i = 0; while(dbus_message_iter_get_arg_type(&_iter) != 0) { uint32_t t; Codec<uint32_t>::decode(_iter, t); c_str[i++] = (wchar_t)t; } str = c_str; } else str = nullptr; // advance to next element dbus_message_iter_next(&iter); }
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; } }