[next] telepathy-glib: protocol: store properties using a GVariant

Guillaume Desmottes gdesmott at kemper.freedesktop.org
Mon Mar 17 07:25:41 PDT 2014


Module: telepathy-glib
Branch: next
Commit: d46629713e79ca493b63cb0b21e5050cd887ceb0
URL:    http://cgit.freedesktop.org/telepathy/telepathy-glib/commit/?id=d46629713e79ca493b63cb0b21e5050cd887ceb0

Author: Guillaume Desmottes <guillaume.desmottes at collabora.co.uk>
Date:   Thu Mar  6 13:16:30 2014 +0100

protocol: store properties using a GVariant

---

 telepathy-glib/protocol.c |   93 +++++++++++++++++++++++----------------------
 1 file changed, 47 insertions(+), 46 deletions(-)

diff --git a/telepathy-glib/protocol.c b/telepathy-glib/protocol.c
index 9a14475..9a9f3d2 100644
--- a/telepathy-glib/protocol.c
+++ b/telepathy-glib/protocol.c
@@ -140,7 +140,7 @@ struct _TpProtocolPrivate
 {
   gchar *name;
   GPtrArray *params;
-  GHashTable *protocol_properties;
+  GVariant *protocol_properties;
   gchar *vcard_field;
   gchar *english_name;
   gchar *icon_name;
@@ -253,7 +253,8 @@ tp_protocol_get_property (GObject *object,
       break;
 
     case PROP_PROTOCOL_PROPERTIES:
-      g_value_set_boxed (value, self->priv->protocol_properties);
+      g_value_take_boxed (value,
+          tp_asv_from_vardict (self->priv->protocol_properties));
       break;
 
     case PROP_PROTOCOL_PROPERTIES_VARDICT:
@@ -325,7 +326,9 @@ tp_protocol_set_property (GObject *object,
 
     case PROP_PROTOCOL_PROPERTIES:
       g_assert (self->priv->protocol_properties == NULL);
-      self->priv->protocol_properties = g_value_dup_boxed (value);
+      self->priv->protocol_properties = tp_asv_to_vardict (
+          g_value_get_boxed (value));
+      g_variant_ref_sink (self->priv->protocol_properties);
       break;
 
     case PROP_CM_NAME:
@@ -384,7 +387,7 @@ tp_protocol_finalize (GObject *object)
     g_hash_table_unref (self->priv->presence_statuses);
 
   if (self->priv->protocol_properties != NULL)
-    g_hash_table_unref (self->priv->protocol_properties);
+    g_variant_unref (self->priv->protocol_properties);
 
   if (finalize != NULL)
     finalize (object);
@@ -393,24 +396,27 @@ tp_protocol_finalize (GObject *object)
 static gboolean
 tp_protocol_check_for_core (TpProtocol *self)
 {
-  const GHashTable *props = self->priv->protocol_properties;
-  const GValue *value;
-
-  /* this one can legitimately be NULL so we need to be more careful */
-  value = tp_asv_lookup (props, TP_PROP_PROTOCOL_CONNECTION_INTERFACES);
+  GVariant *v;
 
-  if (value == NULL || !G_VALUE_HOLDS (value, G_TYPE_STRV))
+  v = g_variant_lookup_value (self->priv->protocol_properties,
+        TP_PROP_PROTOCOL_CONNECTION_INTERFACES, G_VARIANT_TYPE ("as"));
+  if (v == NULL)
     {
       DEBUG ("Interfaces not found");
       return FALSE;
     }
+  g_variant_unref (v);
+
+  v = g_variant_lookup_value (self->priv->protocol_properties,
+        TP_PROP_PROTOCOL_REQUESTABLE_CHANNEL_CLASSES,
+        G_VARIANT_TYPE ("a(a{sv}as)"));
 
-  if (tp_asv_get_boxed (props, TP_PROP_PROTOCOL_REQUESTABLE_CHANNEL_CLASSES,
-        TP_ARRAY_TYPE_REQUESTABLE_CHANNEL_CLASS_LIST) == NULL)
+  if (v == NULL)
     {
       DEBUG ("Requestable channel classes not found");
       return FALSE;
     }
+  g_variant_unref (v);
 
   /* Interfaces has a sensible default, the empty list.
    * VCardField, EnglishName and Icon have a sensible default, "". */
@@ -466,6 +472,7 @@ tp_protocol_constructed (GObject *object)
   const GPtrArray *rccs;
   gboolean had_immutables = TRUE;
   const gchar * const *interfaces;
+  GHashTable *protocol_properties;
 
   if (chain_up != NULL)
     chain_up (object);
@@ -479,36 +486,29 @@ tp_protocol_constructed (GObject *object)
     {
       DEBUG ("immutable properties not supplied");
       had_immutables = FALSE;
-      self->priv->protocol_properties = g_hash_table_new_full (g_str_hash,
-          g_str_equal, g_free, (GDestroyNotify) tp_g_value_slice_free);
+      self->priv->protocol_properties = g_variant_new ("a{sv}", NULL);
     }
   else
     {
-      GHashTableIter iter;
-      gpointer k, v;
+      gchar *print;
 
       DEBUG ("immutable properties already supplied");
 
-      g_hash_table_iter_init (&iter, self->priv->protocol_properties);
-
-      while (g_hash_table_iter_next (&iter, &k, &v))
-        {
-          gchar *printed;
-
-          printed = g_strdup_value_contents (v);
-          DEBUG ("%s = %s", (const gchar *) k, printed);
-          g_free (printed);
-        }
+      print = g_variant_print (self->priv->protocol_properties, TRUE);
+      DEBUG ("%s\n", print);
+      g_free (print);
     }
 
+  protocol_properties = tp_asv_from_vardict (self->priv->protocol_properties);
+
   self->priv->params = tp_protocol_params_from_param_specs (
-        tp_asv_get_boxed (self->priv->protocol_properties,
+        tp_asv_get_boxed (protocol_properties,
           TP_PROP_PROTOCOL_PARAMETERS,
           TP_ARRAY_TYPE_PARAM_SPEC_LIST),
         tp_proxy_get_bus_name (self), self->priv->name);
 
   /* force vCard field to lower case, even if the CM is spec-incompliant */
-  s = tp_asv_get_string (self->priv->protocol_properties,
+  s = tp_asv_get_string (protocol_properties,
       TP_PROP_PROTOCOL_VCARD_FIELD);
 
   if (tp_str_empty (s))
@@ -516,7 +516,7 @@ tp_protocol_constructed (GObject *object)
   else
     self->priv->vcard_field = g_utf8_strdown (s, -1);
 
-  s = tp_asv_get_string (self->priv->protocol_properties,
+  s = tp_asv_get_string (protocol_properties,
       TP_PROP_PROTOCOL_ENGLISH_NAME);
 
   if (tp_str_empty (s))
@@ -524,7 +524,7 @@ tp_protocol_constructed (GObject *object)
   else
     self->priv->english_name = g_strdup (s);
 
-  s = tp_asv_get_string (self->priv->protocol_properties,
+  s = tp_asv_get_string (protocol_properties,
       TP_PROP_PROTOCOL_ICON);
 
   if (tp_str_empty (s))
@@ -533,7 +533,7 @@ tp_protocol_constructed (GObject *object)
   else
     self->priv->icon_name = g_strdup (s);
 
-  rccs = tp_asv_get_boxed (self->priv->protocol_properties,
+  rccs = tp_asv_get_boxed (protocol_properties,
         TP_PROP_PROTOCOL_REQUESTABLE_CHANNEL_CLASSES,
         TP_ARRAY_TYPE_REQUESTABLE_CHANNEL_CLASS_LIST);
 
@@ -541,10 +541,10 @@ tp_protocol_constructed (GObject *object)
     self->priv->capabilities = _tp_capabilities_new (rccs, FALSE);
 
   self->priv->authentication_types = asv_strdupv_or_empty (
-      self->priv->protocol_properties,
+      protocol_properties,
       TP_PROP_PROTOCOL_AUTHENTICATION_TYPES);
 
-  interfaces = tp_asv_get_strv (self->priv->protocol_properties,
+  interfaces = tp_asv_get_strv (protocol_properties,
       TP_PROP_PROTOCOL_INTERFACES);
 
   tp_proxy_add_interfaces (proxy, interfaces);
@@ -556,21 +556,21 @@ tp_protocol_constructed (GObject *object)
           self->priv->name);
 
       self->priv->avatar_req = tp_avatar_requirements_new (
-          (GStrv) tp_asv_get_strv (self->priv->protocol_properties,
+          (GStrv) tp_asv_get_strv (protocol_properties,
             TP_PROP_PROTOCOL_INTERFACE_AVATARS1_SUPPORTED_AVATAR_MIME_TYPES),
-          tp_asv_get_uint32 (self->priv->protocol_properties,
+          tp_asv_get_uint32 (protocol_properties,
             TP_PROP_PROTOCOL_INTERFACE_AVATARS1_MINIMUM_AVATAR_WIDTH, NULL),
-          tp_asv_get_uint32 (self->priv->protocol_properties,
+          tp_asv_get_uint32 (protocol_properties,
             TP_PROP_PROTOCOL_INTERFACE_AVATARS1_MINIMUM_AVATAR_HEIGHT, NULL),
-          tp_asv_get_uint32 (self->priv->protocol_properties,
+          tp_asv_get_uint32 (protocol_properties,
             TP_PROP_PROTOCOL_INTERFACE_AVATARS1_RECOMMENDED_AVATAR_WIDTH, NULL),
-          tp_asv_get_uint32 (self->priv->protocol_properties,
+          tp_asv_get_uint32 (protocol_properties,
             TP_PROP_PROTOCOL_INTERFACE_AVATARS1_RECOMMENDED_AVATAR_HEIGHT, NULL),
-          tp_asv_get_uint32 (self->priv->protocol_properties,
+          tp_asv_get_uint32 (protocol_properties,
             TP_PROP_PROTOCOL_INTERFACE_AVATARS1_MAXIMUM_AVATAR_WIDTH, NULL),
-          tp_asv_get_uint32 (self->priv->protocol_properties,
+          tp_asv_get_uint32 (protocol_properties,
             TP_PROP_PROTOCOL_INTERFACE_AVATARS1_MAXIMUM_AVATAR_HEIGHT, NULL),
-          tp_asv_get_uint32 (self->priv->protocol_properties,
+          tp_asv_get_uint32 (protocol_properties,
             TP_PROP_PROTOCOL_INTERFACE_AVATARS1_MAXIMUM_AVATAR_BYTES, NULL));
     }
 
@@ -581,10 +581,10 @@ tp_protocol_constructed (GObject *object)
           self->priv->name);
 
       self->priv->addressable_vcard_fields = asv_strdupv_or_empty (
-          self->priv->protocol_properties,
+          protocol_properties,
           TP_PROP_PROTOCOL_INTERFACE_ADDRESSING1_ADDRESSABLE_VCARD_FIELDS);
       self->priv->addressable_uri_schemes = asv_strdupv_or_empty (
-          self->priv->protocol_properties,
+          protocol_properties,
           TP_PROP_PROTOCOL_INTERFACE_ADDRESSING1_ADDRESSABLE_URI_SCHEMES);
     }
 
@@ -595,7 +595,7 @@ tp_protocol_constructed (GObject *object)
           self->priv->name);
 
       self->priv->presence_statuses = tp_asv_get_boxed (
-          self->priv->protocol_properties,
+          protocol_properties,
           TP_PROP_PROTOCOL_INTERFACE_PRESENCE1_STATUSES,
           TP_HASH_TYPE_STATUS_SPEC_MAP);
 
@@ -631,6 +631,8 @@ tp_protocol_constructed (GObject *object)
       had_immutables);
   _tp_proxy_set_feature_prepared (proxy, TP_PROTOCOL_FEATURE_CORE,
       had_immutables && tp_protocol_check_for_core (self));
+
+  g_hash_table_unref (protocol_properties);
 }
 
 enum {
@@ -2369,6 +2371,5 @@ tp_protocol_dup_presence_statuses (TpProtocol *self)
 GVariant *
 tp_protocol_dup_immutable_properties (TpProtocol *self)
 {
-  return g_variant_ref_sink (tp_asv_to_vardict (
-        self->priv->protocol_properties));
+  return g_variant_ref (self->priv->protocol_properties);
 }



More information about the telepathy-commits mailing list