[Pkg-telepathy-commits] [telepathy-mission-control-6] 89/280: mcd_keyfile_get_value: implement in terms of a new mcd_keyfile_get_variant

Simon McVittie smcv at debian.org
Thu Mar 27 20:07:09 UTC 2014


This is an automated email from the git hooks/post-receive script.

smcv pushed a commit to branch debian
in repository telepathy-mission-control-6.

commit d266e4cf1679524c98ac34c40d9f0298ced9f556
Author: Simon McVittie <simon.mcvittie at collabora.co.uk>
Date:   Wed Sep 12 15:22:02 2012 +0100

    mcd_keyfile_get_value: implement in terms of a new mcd_keyfile_get_variant
    
    Bug: https://bugs.freedesktop.org/show_bug.cgi?id=54874
    Reviewed-by: Guillaume Desmottes <guillaume.desmottes at collabora.co.uk>
---
 src/mcd-storage.c | 205 +++++++++++++++++++++++++++++++++++++++---------------
 src/mcd-storage.h |   5 ++
 2 files changed, 153 insertions(+), 57 deletions(-)

diff --git a/src/mcd-storage.c b/src/mcd-storage.c
index d52e345..44f77b5 100644
--- a/src/mcd-storage.c
+++ b/src/mcd-storage.c
@@ -1121,8 +1121,8 @@ mcd_keyfile_get_value (GKeyFile *keyfile,
     GValue *value,
     GError **error)
 {
-  gboolean ret = FALSE;
   GType type;
+  GVariant *variant = NULL;
 
   g_return_val_if_fail (keyfile != NULL, FALSE);
   g_return_val_if_fail (group != NULL, FALSE);
@@ -1134,20 +1134,132 @@ mcd_keyfile_get_value (GKeyFile *keyfile,
   switch (type)
     {
       case G_TYPE_STRING:
+        variant = mcd_keyfile_get_variant (keyfile, group, key,
+            G_VARIANT_TYPE_STRING, error);
+        break;
+
+      case G_TYPE_INT:
+        variant = mcd_keyfile_get_variant (keyfile, group, key,
+            G_VARIANT_TYPE_INT32, error);
+        break;
+
+      case G_TYPE_INT64:
+        variant = mcd_keyfile_get_variant (keyfile, group, key,
+            G_VARIANT_TYPE_INT64, error);
+        break;
+
+      case G_TYPE_UINT:
+        variant = mcd_keyfile_get_variant (keyfile, group, key,
+            G_VARIANT_TYPE_UINT32, error);
+        break;
+
+      case G_TYPE_UCHAR:
+        variant = mcd_keyfile_get_variant (keyfile, group, key,
+            G_VARIANT_TYPE_BYTE, error);
+        break;
+
+      case G_TYPE_UINT64:
+        variant = mcd_keyfile_get_variant (keyfile, group, key,
+            G_VARIANT_TYPE_UINT64, error);
+        break;
+
+      case G_TYPE_BOOLEAN:
+        variant = mcd_keyfile_get_variant (keyfile, group, key,
+            G_VARIANT_TYPE_BOOLEAN, error);
+        break;
+
+      case G_TYPE_DOUBLE:
+        variant = mcd_keyfile_get_variant (keyfile, group, key,
+            G_VARIANT_TYPE_DOUBLE, error);
+        break;
+
+      default:
+        if (type == G_TYPE_STRV)
+          {
+            variant = mcd_keyfile_get_variant (keyfile, group, key,
+                G_VARIANT_TYPE_STRING_ARRAY, error);
+          }
+        else if (type == DBUS_TYPE_G_OBJECT_PATH)
+          {
+            variant = mcd_keyfile_get_variant (keyfile, group, key,
+                G_VARIANT_TYPE_OBJECT_PATH, error);
+          }
+        else if (type == TP_ARRAY_TYPE_OBJECT_PATH_LIST)
+          {
+            variant = mcd_keyfile_get_variant (keyfile, group, key,
+                G_VARIANT_TYPE_OBJECT_PATH_ARRAY, error);
+          }
+        else if (type == TP_STRUCT_TYPE_SIMPLE_PRESENCE)
+          {
+            variant = mcd_keyfile_get_variant (keyfile, group, key,
+                G_VARIANT_TYPE ("(uss)"), error);
+          }
+        else
+          {
+            gchar *message =
+              g_strdup_printf ("cannot get key %s from group %s: "
+                  "unknown type %s",
+                  key, group, g_type_name (type));
+
+            g_warning ("%s: %s", G_STRFUNC, message);
+            g_set_error (error, MCD_ACCOUNT_ERROR,
+                MCD_ACCOUNT_ERROR_GET_PARAMETER,
+                "%s", message);
+            g_free (message);
+          }
+    }
+
+  if (variant == NULL)
+    return FALSE;
+
+  g_variant_ref_sink (variant);
+  g_value_unset (value);
+  dbus_g_value_parse_g_variant (variant, value);
+  g_assert (G_VALUE_TYPE (value) == type);
+  g_variant_unref (variant);
+  return TRUE;
+}
+
+/*
+ * mcd_keyfile_get_variant:
+ * @keyfile: A #GKeyFile
+ * @group: name of a group
+ * @key: name of a key
+ * @type: the desired type
+ * @error: a place to store any #GError<!-- -->s that occur
+ *
+ * Returns: a new floating #GVariant
+ */
+GVariant *
+mcd_keyfile_get_variant (GKeyFile *keyfile,
+    const gchar *group,
+    const gchar *key,
+    const GVariantType *type,
+    GError **error)
+{
+  const gchar *type_str = g_variant_type_peek_string (type);
+  GVariant *ret = NULL;
+
+  g_return_val_if_fail (keyfile != NULL, NULL);
+  g_return_val_if_fail (group != NULL, NULL);
+  g_return_val_if_fail (key != NULL, NULL);
+  g_return_val_if_fail (g_variant_type_string_scan (type_str, NULL, NULL),
+      NULL);
+
+  switch (type_str[0])
+    {
+      case G_VARIANT_CLASS_STRING:
           {
             gchar *v_string = g_key_file_get_string (keyfile, group,
                 key, error);
 
             if (v_string != NULL)
-              {
-                g_value_take_string (value, v_string);
-                ret = TRUE;
-              }
+              ret = g_variant_new_string (v_string);
             /* else error is already set */
           }
         break;
 
-      case G_TYPE_INT:
+      case G_VARIANT_CLASS_INT32:
           {
             GError *e = NULL;
             gint v_int = g_key_file_get_integer (keyfile, group,
@@ -1159,13 +1271,12 @@ mcd_keyfile_get_value (GKeyFile *keyfile,
               }
             else
               {
-                g_value_set_int (value, v_int);
-                ret = TRUE;
+                ret = g_variant_new_int32 (v_int);
               }
           }
         break;
 
-      case G_TYPE_INT64:
+      case G_VARIANT_CLASS_INT64:
           {
             GError *e = NULL;
             gint64 v_int = g_key_file_get_int64 (keyfile, group,
@@ -1177,13 +1288,12 @@ mcd_keyfile_get_value (GKeyFile *keyfile,
               }
             else
               {
-                g_value_set_int64 (value, v_int);
-                ret = TRUE;
+                ret = g_variant_new_int64 (v_int);
               }
           }
         break;
 
-      case G_TYPE_UINT:
+      case G_VARIANT_CLASS_UINT32:
           {
             GError *e = NULL;
             guint64 v_uint = g_key_file_get_uint64 (keyfile, group,
@@ -1202,13 +1312,12 @@ mcd_keyfile_get_value (GKeyFile *keyfile,
               }
             else
               {
-                g_value_set_uint (value, v_uint);
-                ret = TRUE;
+                ret = g_variant_new_uint32 (v_uint);
               }
           }
         break;
 
-    case G_TYPE_UCHAR:
+    case G_VARIANT_CLASS_BYTE:
           {
             GError *e = NULL;
             gint v_int = g_key_file_get_integer (keyfile, group,
@@ -1227,13 +1336,12 @@ mcd_keyfile_get_value (GKeyFile *keyfile,
               }
             else
               {
-                g_value_set_uchar (value, v_int);
-                ret = TRUE;
+                ret = g_variant_new_byte (v_int);
               }
           }
         break;
 
-      case G_TYPE_UINT64:
+      case G_VARIANT_CLASS_UINT64:
           {
             GError *e = NULL;
             guint64 v_uint = g_key_file_get_uint64 (keyfile, group,
@@ -1245,13 +1353,12 @@ mcd_keyfile_get_value (GKeyFile *keyfile,
               }
             else
               {
-                g_value_set_uint64 (value, v_uint);
-                ret = TRUE;
+                ret = g_variant_new_uint64 (v_uint);
               }
           }
         break;
 
-      case G_TYPE_BOOLEAN:
+      case G_VARIANT_CLASS_BOOLEAN:
           {
             GError *e = NULL;
             gboolean v_bool = g_key_file_get_boolean (keyfile, group,
@@ -1263,13 +1370,12 @@ mcd_keyfile_get_value (GKeyFile *keyfile,
               }
             else
               {
-                g_value_set_boolean (value, v_bool);
-                ret = TRUE;
+                ret = g_variant_new_boolean (v_bool);
               }
           }
         break;
 
-      case G_TYPE_DOUBLE:
+      case G_VARIANT_CLASS_DOUBLE:
           {
             GError *e = NULL;
             gdouble v_double = g_key_file_get_double (keyfile, group,
@@ -1281,25 +1387,24 @@ mcd_keyfile_get_value (GKeyFile *keyfile,
               }
             else
               {
-                g_value_set_double (value, v_double);
-                ret = TRUE;
+                ret = g_variant_new_double (v_double);
               }
           }
         break;
 
       default:
-        if (type == G_TYPE_STRV)
+        if (g_variant_type_equal (type, G_VARIANT_TYPE_STRING_ARRAY))
           {
             gchar **v = g_key_file_get_string_list (keyfile, group,
                 key, NULL, error);
 
             if (v != NULL)
               {
-                g_value_take_boxed (value, v);
-                ret = TRUE;
+                ret = g_variant_new_strv ((const gchar **) v, -1);
+                g_strfreev (v);
               }
           }
-        else if (type == DBUS_TYPE_G_OBJECT_PATH)
+        else if (g_variant_type_equal (type, G_VARIANT_TYPE_OBJECT_PATH))
           {
             gchar *v_string = g_key_file_get_string (keyfile, group,
                 key, error);
@@ -1313,15 +1418,15 @@ mcd_keyfile_get_value (GKeyFile *keyfile,
                 g_set_error (error, MCD_ACCOUNT_ERROR,
                     MCD_ACCOUNT_ERROR_GET_PARAMETER,
                     "Invalid object path %s", v_string);
-                g_free (v_string);
               }
             else
               {
-                g_value_take_boxed (value, v_string);
-                ret = TRUE;
+                ret = g_variant_new_object_path (v_string);
               }
+
+            g_free (v_string);
           }
-        else if (type == TP_ARRAY_TYPE_OBJECT_PATH_LIST)
+        else if (g_variant_type_equal (type, G_VARIANT_TYPE_OBJECT_PATH_ARRAY))
           {
             gchar **v = g_key_file_get_string_list (keyfile, group,
                 key, NULL, error);
@@ -1329,7 +1434,6 @@ mcd_keyfile_get_value (GKeyFile *keyfile,
             if (v != NULL)
               {
                 gchar **iter;
-                GPtrArray *arr = g_ptr_array_new ();
 
                 for (iter = v; iter != NULL && *iter != NULL; iter++)
                   {
@@ -1344,21 +1448,11 @@ mcd_keyfile_get_value (GKeyFile *keyfile,
                       }
                   }
 
-                for (iter = v; iter != NULL && *iter != NULL; iter++)
-                  {
-                    /* transfer ownership from v to arr */
-                    g_ptr_array_add (arr, *iter);
-                  }
-
-                /* not g_strfreev - the strings' ownership has been
-                 * transferred */
-                g_free (v);
-
-                g_value_take_boxed (value, arr);
-                ret = TRUE;
+                ret = g_variant_new_objv ((const gchar **) v, -1);
+                g_strfreev (v);
               }
           }
-        else if (type == TP_STRUCT_TYPE_SIMPLE_PRESENCE)
+        else if (g_variant_type_equal (type, G_VARIANT_TYPE ("(uss)")))
           {
             gchar **v = g_key_file_get_string_list (keyfile, group,
                 key, NULL, error);
@@ -1388,13 +1482,8 @@ mcd_keyfile_get_value (GKeyFile *keyfile,
                 else
                   {
                     /* a syntactically valid simple presence */
-                    g_value_take_boxed (value,
-                        tp_value_array_build (3,
-                          G_TYPE_UINT, (guint) u,
-                          G_TYPE_STRING, v[1],
-                          G_TYPE_STRING, v[2],
-                          G_TYPE_INVALID));
-                    ret = TRUE;
+                    ret = g_variant_new_parsed ("(%u, %s, %s)",
+                        (guint32) u, v[1], v[2]);
                   }
               }
 
@@ -1404,8 +1493,9 @@ mcd_keyfile_get_value (GKeyFile *keyfile,
           {
             gchar *message =
               g_strdup_printf ("cannot get key %s from group %s: "
-                  "unknown type %s",
-                  key, group, g_type_name (type));
+                  "unknown type %.*s", key, group,
+                  (int) g_variant_type_get_string_length (type),
+                  type_str);
 
             g_warning ("%s: %s", G_STRFUNC, message);
             g_set_error (error, MCD_ACCOUNT_ERROR,
@@ -1415,6 +1505,7 @@ mcd_keyfile_get_value (GKeyFile *keyfile,
           }
     }
 
+  g_assert (ret == NULL || g_variant_is_of_type (ret, type));
   return ret;
 }
 
diff --git a/src/mcd-storage.h b/src/mcd-storage.h
index 2cb2c03..14dc890 100644
--- a/src/mcd-storage.h
+++ b/src/mcd-storage.h
@@ -135,6 +135,11 @@ gboolean mcd_storage_add_account_from_plugin (McdStorage *storage,
     McpAccountStorage *plugin,
     const gchar *account);
 
+GVariant *mcd_keyfile_get_variant (GKeyFile *keyfile,
+    const gchar *group,
+    const gchar *key,
+    const GVariantType *type,
+    GError **error);
 gboolean mcd_keyfile_get_value (GKeyFile *keyfile,
     const gchar *group,
     const gchar *key,

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-telepathy/telepathy-mission-control-6.git



More information about the Pkg-telepathy-commits mailing list