LCOV - code coverage report
Current view: top level - Accounts - utils.cpp (source / functions) Hit Total Coverage
Test: Code Coverage Lines: 78 82 95.1 %
Date: 2024-03-31 17:38:26 Functions: 5 5 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       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-2016 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           4 : static QVariantMap gVariantToQVariantMap(GVariant *variant)
      32             : {
      33           4 :     QVariantMap ret;
      34             :     GVariantIter iter;
      35             :     gchar *key;
      36             :     GVariant *value;
      37             : 
      38           4 :     g_variant_iter_init (&iter, variant);
      39          36 :     while (g_variant_iter_next (&iter, "{sv}", &key, &value)) {
      40          16 :         ret.insert(UTF8(key), gVariantToQVariant(value));
      41          16 :         g_variant_unref(value);
      42          16 :         g_free(key);
      43             :     }
      44             : 
      45           4 :     return ret;
      46             : }
      47             : 
      48           2 : static GVariant *qStringListToGVariant(const QStringList &stringList)
      49             : {
      50             :     GVariantBuilder builder;
      51             : 
      52           2 :     g_variant_builder_init(&builder, G_VARIANT_TYPE_STRING_ARRAY);
      53           8 :     Q_FOREACH (const QString &string, stringList) {
      54           6 :         g_variant_builder_add(&builder, "s", string.toUtf8().constData());
      55             :     }
      56           2 :     return g_variant_builder_end(&builder);
      57             : }
      58             : 
      59           4 : static QStringList gVariantToQStringList(GVariant *variant)
      60             : {
      61           4 :     QStringList ret;
      62             : 
      63             :     gsize length;
      64           4 :     const gchar **strings = g_variant_get_strv(variant, &length);
      65           4 :     ret.reserve(length);
      66          16 :     for (gsize i = 0; i < length; i++) {
      67          12 :         ret.append(UTF8(strings[i]));
      68             :     }
      69             : 
      70           4 :     g_free(strings);
      71           4 :     return ret;
      72             : }
      73             : 
      74          42 : QVariant gVariantToQVariant(GVariant *value)
      75             : {
      76          42 :     GVariantClass variantClass = g_variant_classify(value);
      77             : 
      78          42 :     QVariant variant;
      79             : 
      80          42 :     switch (variantClass)
      81             :     {
      82          14 :     case G_VARIANT_CLASS_STRING:
      83          14 :         variant = UTF8(g_variant_get_string(value, NULL));
      84          14 :         break;
      85           7 :     case G_VARIANT_CLASS_INT32:
      86           7 :         variant = g_variant_get_int32(value);
      87           7 :         break;
      88           3 :     case G_VARIANT_CLASS_UINT32:
      89           3 :         variant = g_variant_get_uint32(value);
      90           3 :         break;
      91           1 :     case G_VARIANT_CLASS_INT64:
      92           1 :         variant = qint64(g_variant_get_int64(value));
      93           1 :         break;
      94           3 :     case G_VARIANT_CLASS_UINT64:
      95           3 :         variant = quint64(g_variant_get_uint64(value));
      96           3 :         break;
      97           6 :     case G_VARIANT_CLASS_BOOLEAN:
      98           6 :         variant = bool(g_variant_get_boolean(value));
      99           6 :         break;
     100           8 :     case G_VARIANT_CLASS_ARRAY:
     101           8 :         if (g_variant_is_of_type(value, G_VARIANT_TYPE_VARDICT)) {
     102           4 :             variant = gVariantToQVariantMap(value);
     103           4 :             break;
     104           4 :         } else if (g_variant_is_of_type(value, G_VARIANT_TYPE_STRING_ARRAY)) {
     105           4 :             variant = gVariantToQStringList(value);
     106           4 :             break;
     107             :         }
     108             :         // fall through
     109             :     default:
     110           0 :         qWarning() << "Unsupported type" << UTF8(g_variant_get_type_string(value));
     111           0 :         break;
     112             :     }
     113             : 
     114          42 :     return variant;
     115             : }
     116             : 
     117          35 : GVariant *qVariantToGVariant(const QVariant &variant)
     118             : {
     119          35 :     GVariant *ret = nullptr;
     120          70 :     QByteArray tmpvalue;
     121             : 
     122          35 :     switch (variant.type())
     123             :     {
     124          18 :     case QVariant::String:
     125          18 :         tmpvalue = variant.toString().toUtf8();
     126          18 :         ret = g_variant_new_string(tmpvalue.constData());
     127          18 :         break;
     128           5 :     case QVariant::Int:
     129           5 :         ret = g_variant_new_int32(variant.toInt());
     130           5 :         break;
     131           3 :     case QVariant::UInt:
     132           3 :         ret = g_variant_new_uint32(variant.toUInt());
     133           3 :         break;
     134           1 :     case QVariant::LongLong:
     135           1 :         ret = g_variant_new_int64(variant.toLongLong());
     136           1 :         break;
     137           1 :     case QVariant::ULongLong:
     138           1 :         ret = g_variant_new_uint64(variant.toULongLong());
     139           1 :         break;
     140           5 :     case QVariant::Bool:
     141           5 :         ret = g_variant_new_boolean(variant.toBool());
     142           5 :         break;
     143           2 :     case QVariant::StringList:
     144           2 :         ret = qStringListToGVariant(variant.toStringList());
     145           2 :         break;
     146           0 :     default:
     147           0 :         qWarning() << "Unsupported datatype" << variant.typeName();
     148             :     }
     149             : 
     150          70 :     return ret;
     151             : }
     152             : 
     153             : }; // namespace

Generated by: LCOV version 1.13