59
60
const gchar *v = g_variant_get_string(value, &size);
60
61
result.setValue(QString::fromUtf8(v, size));
62
} else if (g_variant_type_equal(type, G_VARIANT_TYPE_STRING_ARRAY)) {
64
const gchar **sa = g_variant_get_strv(value, &size);
66
for (gsize i = 0; i < size; ++i) {
67
list << QString::fromUtf8(sa[i]);
69
result.setValue(list);
71
} else if (g_variant_type_equal(type, G_VARIANT_TYPE_BYTESTRING)) {
72
result.setValue(QByteArray(g_variant_get_bytestring(value)));
73
} else if (g_variant_type_equal(type, G_VARIANT_TYPE_BYTESTRING_ARRAY)) {
75
const gchar **bsa = g_variant_get_bytestring_array(value, &size);
77
for (gsize i = 0; i < size; ++i) {
80
result.setValue(list);
61
82
} else if (g_variant_type_equal(type, G_VARIANT_TYPE_VARIANT)) {
62
83
GVariant *var = g_variant_get_variant(value);
63
84
result = toQVariant(var);
110
131
* G_VARIANT_TYPE_UNIT
111
132
* G_VARIANT_TYPE_DICT_ENTRY
112
133
* G_VARIANT_TYPE_DICTIONARY
113
* G_VARIANT_TYPE_STRING_ARRAY
114
* G_VARIANT_TYPE_BYTESTRING
115
134
* G_VARIANT_TYPE_OBJECT_PATH_ARRAY
116
* G_VARIANT_TYPE_BYTESTRING_ARRAY
122
static GVariant* toGVariant(const QString &typeName, const QVariant &value)
124
if (typeName == "uchar") {
125
return g_variant_new_byte(value.value<uchar>());
126
} else if (typeName == "short") {
127
return g_variant_new_int16(value.value<short>());
128
} else if (typeName == "ushort") {
129
return g_variant_new_uint16(value.value<ushort>());
130
} else if (typeName == "long") {
131
return g_variant_new_int64(value.value<long>());
132
} else if (typeName == "ulong") {
133
return g_variant_new_uint64(value.value<ulong>());
135
qWarning() << "QVariant type not supported:" << typeName;
141
140
QVariant Converter::toQVariantFromVariantString(const QString &variantString)
143
142
GVariant *gvariant;
201
215
QMapIterator<QString, QVariant> i(value.toMap());
202
216
while (i.hasNext()) {
204
g_variant_builder_add(b, "{sv}", i.key().toUtf8().data(), toGVariant(i.value()));
218
g_variant_builder_add(b, "{sv}", qUtf8Printable(i.key()), toGVariant(i.value()));
220
result = g_variant_builder_end(b);
221
g_variant_builder_unref(b);
224
case QMetaType::QByteArrayList:
226
const QByteArrayList &list = qvariant_cast<QByteArrayList>(value);
227
GVariantBuilder *b = g_variant_builder_new(G_VARIANT_TYPE_BYTESTRING_ARRAY);
229
for (const QByteArray &ba : list) {
230
g_variant_builder_add_value(b, g_variant_new_bytestring(ba));
206
232
result = g_variant_builder_end(b);
207
233
g_variant_builder_unref(b);
210
236
case QVariant::List:
212
QVariantList lst = value.toList();
213
GVariant **vars = g_new(GVariant*, lst.size());
214
for (int i=0; i < lst.size(); i++) {
215
vars[i] = toGVariant(lst[i]);
217
result = g_variant_new_tuple(vars, lst.size());
238
GVariantBuilder *b = g_variant_builder_new(G_VARIANT_TYPE_TUPLE);
240
for (const QVariant &v : value.toList()) {
241
g_variant_builder_add_value(b, toGVariant(v));
243
result = g_variant_builder_end(b);
244
g_variant_builder_unref(b);
247
case QVariant::StringList:
249
GVariantBuilder *b = g_variant_builder_new(G_VARIANT_TYPE_STRING_ARRAY);
251
for (const QString &s : value.toStringList()) {
252
g_variant_builder_add(b, "s", qUtf8Printable(s));
254
result = g_variant_builder_end(b);
255
g_variant_builder_unref(b);
222
result = ::toGVariant(value.typeName(), value);
259
qWarning() << "QVariant type not supported:" << value.type();
274
310
} else if (g_variant_type_equal(schema_type, G_VARIANT_TYPE_STRING)) {
275
311
if (value.canConvert<QString>()) {
276
result = g_variant_new_string(value.toString().toUtf8().data());
312
result = g_variant_new_string(qUtf8Printable(value.toString()));
278
314
} else if (g_variant_type_equal(schema_type, G_VARIANT_TYPE_VARIANT)) {
279
result = Converter::toGVariant(value);
315
result = g_variant_new_variant(Converter::toGVariant(value));
280
316
} else if (g_variant_type_equal(schema_type, G_VARIANT_TYPE_VARDICT)) {
281
317
if (value.canConvert(QVariant::Map)) {
282
318
result = Converter::toGVariant(value.toMap());
284
320
} else if (g_variant_type_is_array(schema_type)) {
285
321
if (value.canConvert(QVariant::List)) {
287
const GVariantType* entry_type;
289
entry_type = g_variant_type_element(schema_type);
290
gchar* entryTypeString = g_variant_type_dup_string(entry_type);
292
QVariantList lst = value.toList();
293
GVariant **vars = g_new(GVariant*, lst.size());
322
const GVariantType* entryType = g_variant_type_element(schema_type);
323
const gchar* entryTypeString = g_variant_type_peek_string(entryType);
325
GVariantBuilder *b = g_variant_builder_new(G_VARIANT_TYPE_ARRAY);
296
for (int i=0; i < lst.size(); i++) {
297
data = Converter::toGVariantWithSchema(lst[i], entryTypeString);
328
for (const QVariant &v : value.toList()) {
329
GVariant *data = toGVariantWithSchema(v, entryTypeString);
332
g_variant_builder_add_value(b, data);
304
335
qWarning() << "Failed to convert list to array with schema:" << schema;
309
result = g_variant_new_array(entry_type, vars, lst.size());
340
result = g_variant_builder_end(b);
311
g_free(entryTypeString);
342
g_variant_builder_unref(b);
314
344
} else if (g_variant_type_is_tuple(schema_type)) {
315
345
if (value.canConvert(QVariant::List)) {
318
QVariantList lst = value.toList();
319
GVariant **vars = g_new(GVariant*, lst.size());
321
const GVariantType* entry_type = g_variant_type_first(schema_type);
346
const GVariantType* entryType = g_variant_type_first(schema_type);
348
GVariantBuilder *b = g_variant_builder_new(G_VARIANT_TYPE_TUPLE);
324
for (int i=0; i < lst.size(); i++) {
326
gchar* entryTypeString = g_variant_type_dup_string(entry_type);
328
data = Converter::toGVariantWithSchema(lst[i], entryTypeString);
335
qWarning() << "Failed to convert list to tuple with schema:" << schema;
336
g_free(entryTypeString);
351
for (const QVariant &v : value.toList()) {
352
gchar* entryTypeString = g_variant_type_dup_string(entryType);
353
GVariant *data = toGVariantWithSchema(v, entryTypeString);
339
354
g_free(entryTypeString);
341
entry_type = g_variant_type_next(entry_type);
357
g_variant_builder_add_value(b, data);
358
entryType = g_variant_type_next(entryType);
363
qWarning() << "Failed to convert list to array with schema:" << schema;
347
result = g_variant_new_tuple(vars, lst.size());
368
result = g_variant_builder_end(b);
370
g_variant_builder_unref(b);