accounts-qt  1.13
utils.cpp
1 /* vi: set et sw=4 ts=4 cino=t0,(0: */
2 /*
3  * This file is part of libaccounts-qt
4  *
5  * Copyright (C) 2012 Canonical Ltd.
6  *
7  * Contact: Alberto Mardegan <alberto.mardegan@canonical.com>
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public License
11  * version 2.1 as published by the Free Software Foundation.
12  *
13  * This library is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
21  * 02110-1301 USA
22  */
23 
24 #include "accountscommon.h"
25 #include "utils.h"
26 
27 #include <QStringList>
28 
29 namespace Accounts {
30 
31 static QVariantMap gVariantToQVariantMap(GVariant *variant)
32 {
33  QVariantMap ret;
34  GVariantIter iter;
35  gchar *key;
36  GVariant *value;
37 
38  g_variant_iter_init (&iter, variant);
39  while (g_variant_iter_next (&iter, "{sv}", &key, &value)) {
40  ret.insert(UTF8(key), gVariantToQVariant(value));
41  g_variant_unref(value);
42  g_free(key);
43  }
44 
45  return ret;
46 }
47 
48 static GVariant *qStringListToGVariant(const QStringList &stringList)
49 {
50  GVariantBuilder builder;
51 
52  g_variant_builder_init(&builder, G_VARIANT_TYPE_STRING_ARRAY);
53  Q_FOREACH (const QString &string, stringList) {
54  g_variant_builder_add(&builder, "s", string.toUtf8().constData());
55  }
56  return g_variant_builder_end(&builder);
57 }
58 
59 static QStringList gVariantToQStringList(GVariant *variant)
60 {
61  QStringList ret;
62 
63  gsize length;
64  const gchar **strings = g_variant_get_strv(variant, &length);
65  for (gsize i = 0; i < length; i++) {
66  ret.append(UTF8(strings[i]));
67  }
68 
69  g_free(strings);
70  return ret;
71 }
72 
73 QVariant gVariantToQVariant(GVariant *value)
74 {
75  GVariantClass variantClass = g_variant_classify(value);
76 
77  QVariant variant;
78 
79  switch (variantClass)
80  {
81  case G_VARIANT_CLASS_STRING:
82  variant = UTF8(g_variant_get_string(value, NULL));
83  break;
84  case G_VARIANT_CLASS_INT32:
85  variant = g_variant_get_int32(value);
86  break;
87  case G_VARIANT_CLASS_UINT32:
88  variant = g_variant_get_uint32(value);
89  break;
90  case G_VARIANT_CLASS_INT64:
91  variant = qint64(g_variant_get_int64(value));
92  break;
93  case G_VARIANT_CLASS_UINT64:
94  variant = quint64(g_variant_get_uint64(value));
95  break;
96  case G_VARIANT_CLASS_BOOLEAN:
97  variant = bool(g_variant_get_boolean(value));
98  break;
99  case G_VARIANT_CLASS_ARRAY:
100  if (g_variant_is_of_type(value, G_VARIANT_TYPE_VARDICT)) {
101  variant = gVariantToQVariantMap(value);
102  break;
103  } else if (g_variant_is_of_type(value, G_VARIANT_TYPE_STRING_ARRAY)) {
104  variant = gVariantToQStringList(value);
105  break;
106  }
107  // fall through
108  default:
109  qWarning() << "Unsupported type" << UTF8(g_variant_get_type_string(value));
110  break;
111  }
112 
113  return variant;
114 }
115 
116 GVariant *qVariantToGVariant(const QVariant &variant)
117 {
118  GVariant *ret = 0;
119  QByteArray tmpvalue;
120 
121  switch (variant.type())
122  {
123  case QVariant::String:
124  tmpvalue = variant.toString().toUtf8();
125  ret = g_variant_new_string(tmpvalue.constData());
126  break;
127  case QVariant::Int:
128  ret = g_variant_new_int32(variant.toInt());
129  break;
130  case QVariant::UInt:
131  ret = g_variant_new_uint32(variant.toUInt());
132  break;
133  case QVariant::LongLong:
134  ret = g_variant_new_int64(variant.toLongLong());
135  break;
136  case QVariant::ULongLong:
137  ret = g_variant_new_uint64(variant.toULongLong());
138  break;
139  case QVariant::Bool:
140  ret = g_variant_new_boolean(variant.toBool());
141  break;
142  case QVariant::StringList:
143  ret = qStringListToGVariant(variant.toStringList());
144  break;
145  default:
146  qWarning() << "Unsupported datatype" << variant.typeName();
147  }
148 
149  return ret;
150 }
151 
152 }; // namespace