[Telepathy-commits] [telepathy-mission-control/master] Create a separate method for getting an account parameter.

Alberto Mardegan alberto.mardegan at nokia.com
Fri Dec 5 01:42:29 PST 2008


---
 src/mcd-account.c |  145 ++++++++++++++++++++++++++++++++--------------------
 src/mcd-account.h |    2 +
 2 files changed, 91 insertions(+), 56 deletions(-)

diff --git a/src/mcd-account.c b/src/mcd-account.c
index 33b82af..1948e66 100644
--- a/src/mcd-account.c
+++ b/src/mcd-account.c
@@ -915,15 +915,6 @@ mc_param_type (McdProtocolParam *param)
     return G_TYPE_INVALID;
 }
 
-static gboolean
-has_param (McdAccountPrivate *priv, const gchar *name)
-{
-    gchar key[MAX_KEY_LENGTH];
-
-    g_snprintf (key, sizeof (key), "param-%s", name);
-    return g_key_file_has_key (priv->keyfile, priv->unique_name, key, NULL);
-}
-
 gboolean
 mcd_account_delete (McdAccount *account, GError **error)
 {
@@ -1000,7 +991,7 @@ mcd_account_check_parameters (McdAccount *account)
 	type = mc_param_type (param);
 	if (param->flags & MCD_PROTOCOL_PARAM_REQUIRED)
 	{
-	    if (!has_param (priv, param->name))
+	    if (!mcd_account_get_parameter (account, param->name, NULL))
 	    {
 		g_debug ("missing required parameter %s", param->name);
 		valid = FALSE;
@@ -1510,74 +1501,42 @@ mcd_account_get_object_path (McdAccount *account)
 }
 
 static inline void
-add_parameter (McdAccountPrivate *priv, McdProtocolParam *param,
+add_parameter (McdAccount *account, McdProtocolParam *param,
 	       GHashTable *params)
 {
-    GValue *value = NULL;
-    GError *error = NULL;
-    gchar key[MAX_KEY_LENGTH];
-    gchar *v_string = NULL;
-    gint v_int = 0;
-    gboolean v_bool = FALSE;
+    GValue *value;
+    GType type;
 
     g_return_if_fail (param != NULL);
     g_return_if_fail (param->name != NULL);
     g_return_if_fail (param->signature != NULL);
 
-    g_snprintf (key, sizeof (key), "param-%s", param->name);
-
     switch (param->signature[0])
     {
     case DBUS_TYPE_STRING:
-	v_string = g_key_file_get_string (priv->keyfile, priv->unique_name,
-					  key, &error);
+        type = G_TYPE_STRING;
 	break;
     case DBUS_TYPE_INT16:
     case DBUS_TYPE_INT32:
+        type = G_TYPE_INT;
+        break;
     case DBUS_TYPE_UINT16:
     case DBUS_TYPE_UINT32:
-	v_int = g_key_file_get_integer (priv->keyfile, priv->unique_name,
-					key, &error);
+        type = G_TYPE_UINT;
 	break;
     case DBUS_TYPE_BOOLEAN:
-	v_bool = g_key_file_get_boolean (priv->keyfile, priv->unique_name,
-					 key, &error);
+        type = G_TYPE_BOOLEAN;
 	break;
     default:
-	g_warning ("%s: skipping parameter %s, unknown type %s", G_STRFUNC, param->name, param->signature);
+        g_warning ("%s: skipping parameter %s, unknown type %s", G_STRFUNC,
+                   param->name, param->signature);
 	return;
     }
 
-    if (error)
-    {
-	g_error_free (error);
-	return;
-    }
-    value = g_slice_new0 (GValue);
-
-    switch (param->signature[0])
-    {
-    case DBUS_TYPE_STRING:
-	g_value_init (value, G_TYPE_STRING);
-	g_value_take_string (value, v_string);
-	break;
-    case DBUS_TYPE_INT16:
-    case DBUS_TYPE_INT32:
-	g_value_init (value, G_TYPE_INT);
-	g_value_set_int (value, v_int);
-	break;
-    case DBUS_TYPE_UINT16:
-    case DBUS_TYPE_UINT32:
-	g_value_init (value, G_TYPE_UINT);
-	g_value_set_uint (value, (guint)v_int);
-	break;
-    case DBUS_TYPE_BOOLEAN:
-	g_value_init (value, G_TYPE_BOOLEAN);
-	g_value_set_boolean (value, v_bool);
-	break;
-    }
+    value = tp_g_value_slice_new (type);
 
-    g_hash_table_insert (params, g_strdup (param->name), value);
+    if (mcd_account_get_parameter (account, param->name, value))
+        g_hash_table_insert (params, g_strdup (param->name), value);
 }
 
 /**
@@ -1610,12 +1569,86 @@ mcd_account_get_parameters (McdAccount *account)
 	McdProtocolParam *param;
 
 	param = &g_array_index (parameters, McdProtocolParam, i);
-	add_parameter (priv, param, params);
+	add_parameter (account, param, params);
     }
     return params;
 }
 
 /**
+ * mcd_account_get_parameter:
+ * @account: the #McdAccount.
+ * @name: the parameter name.
+ * @value: a initialized #GValue to receive the parameter value, or %NULL.
+ *
+ * Get the @name parameter for @account.
+ *
+ * Returns: %TRUE if found, %FALSE otherwise.
+ */
+gboolean
+mcd_account_get_parameter (McdAccount *account, const gchar *name,
+                           GValue *value)
+{
+    McdAccountPrivate *priv = account->priv;
+    gchar key[MAX_KEY_LENGTH];
+
+    g_snprintf (key, sizeof (key), "param-%s", name);
+    if (!g_key_file_has_key (priv->keyfile, priv->unique_name, key, NULL))
+        return FALSE;
+
+    if (value)
+    {
+        gchar *v_string = NULL;
+        gint v_int = 0;
+        gboolean v_bool = FALSE;
+
+        switch (G_VALUE_TYPE (value))
+        {
+        case G_TYPE_STRING:
+            v_string = g_key_file_get_string (priv->keyfile, priv->unique_name,
+                                              key, NULL);
+            g_value_take_string (value, v_string);
+            break;
+        case G_TYPE_INT:
+            v_int = g_key_file_get_integer (priv->keyfile, priv->unique_name,
+                                            key, NULL);
+            g_value_set_int (value, v_int);
+            break;
+        case G_TYPE_INT64:
+            v_int = g_key_file_get_integer (priv->keyfile, priv->unique_name,
+                                            key, NULL);
+            g_value_set_int64 (value, v_int);
+            break;
+        case G_TYPE_UCHAR:
+            v_int = g_key_file_get_integer (priv->keyfile, priv->unique_name,
+                                            key, NULL);
+            g_value_set_uchar (value, v_int);
+            break;
+        case G_TYPE_UINT:
+            v_int = g_key_file_get_integer (priv->keyfile, priv->unique_name,
+                                            key, NULL);
+            g_value_set_uint (value, v_int);
+            break;
+        case G_TYPE_UINT64:
+            v_int = g_key_file_get_integer (priv->keyfile, priv->unique_name,
+                                            key, NULL);
+            g_value_set_uint64 (value, v_int);
+            break;
+        case G_TYPE_BOOLEAN:
+            v_bool = g_key_file_get_boolean (priv->keyfile, priv->unique_name,
+                                             key, NULL);
+            g_value_set_boolean (value, v_bool);
+            break;
+        default:
+            g_warning ("%s: skipping parameter %s, unknown type %s", G_STRFUNC,
+                       name, G_VALUE_TYPE_NAME (value));
+            return FALSE;
+        }
+    }
+
+    return TRUE;
+}
+
+/**
  * mcd_account_request_presence:
  * @account: the #McdAccount.
  * @presence: a #TpConnectionPresenceType.
diff --git a/src/mcd-account.h b/src/mcd-account.h
index 4386fce..fa33352 100644
--- a/src/mcd-account.h
+++ b/src/mcd-account.h
@@ -88,6 +88,8 @@ gboolean mcd_account_set_parameters (McdAccount *account, GHashTable *params,
 				     GError **error);
 GHashTable *mcd_account_get_parameters (McdAccount *account);
 gboolean mcd_account_check_parameters (McdAccount *account);
+gboolean mcd_account_get_parameter (McdAccount *account, const gchar *name,
+                                    GValue *value);
 
 void mcd_account_request_presence (McdAccount *account,
 				   TpConnectionPresenceType type,
-- 
1.5.6.5




More information about the Telepathy-commits mailing list