[Telepathy-commits] [telepathy-mission-control/master] Store online requests into a GList

Alberto Mardegan alberto.mardegan at nokia.com
Thu Jan 8 02:36:26 PST 2009


There is no need of storing online requests into a hash table; besides, it
didn't allow to have different requests with the same callback but different
userdata, meaning that some requests could get lost.
---
 src/mcd-account.c |   73 +++++++++++++++++++++++++---------------------------
 1 files changed, 35 insertions(+), 38 deletions(-)

diff --git a/src/mcd-account.c b/src/mcd-account.c
index 2480335..aca3a39 100644
--- a/src/mcd-account.c
+++ b/src/mcd-account.c
@@ -126,8 +126,9 @@ struct _McdAccountPrivate
 				    configuration file as needed */
     gchar *auto_presence_message;
 
-    GHashTable *online_requests; /* callbacks with userdata to be called when
-				    the account will be online */
+    GList *online_requests; /* list of McdOnlineRequestData structures
+                               (callback with user data) to be called when the
+                               account will be online */
 
     guint connect_automatically : 1;
     guint enabled : 1;
@@ -140,8 +141,8 @@ struct _McdAccountPrivate
 };
 
 typedef struct {
-    McdAccount *account;
-    GError *error;
+    McdOnlineRequestCb callback;
+    gpointer user_data;
 } McdOnlineRequestData;
 
 enum
@@ -255,15 +256,6 @@ get_parameter (McdAccount *account, const gchar *name, GValue *value)
     return TRUE;
 }
 
-static void
-process_online_request (gpointer key, gpointer cb_userdata, gpointer userdata)
-{
-    McdOnlineRequestCb callback = key;
-    McdOnlineRequestData *data = userdata;
-
-    callback (data->account, cb_userdata, data->error);
-}
-
 static gboolean
 load_manager (McdAccountPrivate *priv)
 {
@@ -1409,17 +1401,20 @@ _mcd_account_dispose (GObject *object)
 
     if (priv->online_requests)
     {
-	McdOnlineRequestData data;
-
-	data.account = MCD_ACCOUNT (object);
-	data.error = NULL;
-	g_set_error (&data.error, TP_ERRORS, TP_ERROR_DISCONNECTED,
-		     "Disposing account %s", priv->unique_name);
-	g_hash_table_foreach (priv->online_requests,
-			      process_online_request,
-			      &data);
-	g_error_free (data.error);
-	g_hash_table_destroy (priv->online_requests);
+        GError *error;
+        GList *list = priv->online_requests;
+
+        error = g_error_new (TP_ERRORS, TP_ERROR_DISCONNECTED,
+                             "Disposing account %s", priv->unique_name);
+        while (list)
+        {
+            McdOnlineRequestData *data = list->data;
+
+            data->callback (MCD_ACCOUNT (object), data->user_data, error);
+            g_slice_free (McdOnlineRequestData, data);
+            list = g_list_delete_link (list, list);
+        }
+        g_error_free (error);
 	priv->online_requests = NULL;
     }
 
@@ -2015,18 +2010,22 @@ void
 _mcd_account_online_request_completed (McdAccount *account, GError *error)
 {
     McdAccountPrivate *priv = MCD_ACCOUNT_PRIV (account);
-    McdOnlineRequestData data;
+    GList *list;
 
     if (!priv->online_requests) return;
 
-    data.error = error;
-    data.account = account;
-    g_hash_table_foreach (priv->online_requests,
-                          process_online_request,
-                          &data);
+    list = priv->online_requests;
+
+    while (list)
+    {
+        McdOnlineRequestData *data = list->data;
+
+        data->callback (account, data->user_data, error);
+        g_slice_free (McdOnlineRequestData, data);
+        list = g_list_delete_link (list, list);
+    }
     if (error)
         g_error_free (error);
-    g_hash_table_destroy (priv->online_requests);
     priv->online_requests = NULL;
 }
 
@@ -2199,6 +2198,7 @@ _mcd_account_online_request (McdAccount *account,
     }
     else
     {
+        McdOnlineRequestData *data;
 	/* listen to the StatusChanged signal */
        	if (priv->conn_status == TP_CONNECTION_STATUS_DISCONNECTED)
             _mcd_account_request_connection (account);
@@ -2206,13 +2206,10 @@ _mcd_account_online_request (McdAccount *account,
 	/* now the connection should be in connecting state; insert the
 	 * callback in the online_requests hash table, which will be processed
 	 * in the mcd_account_set_connection_status function */
-	if (!priv->online_requests)
-	{
-	    priv->online_requests = g_hash_table_new (g_direct_hash,
-						      g_direct_equal);
-	    g_return_val_if_fail (priv->online_requests, FALSE);
-	}
-	g_hash_table_insert (priv->online_requests, callback, userdata);
+        data = g_slice_new (McdOnlineRequestData);
+        data->callback = callback;
+        data->user_data = userdata;
+        priv->online_requests = g_list_append (priv->online_requests, data);
     }
     return TRUE;
 }
-- 
1.5.6.5




More information about the Telepathy-commits mailing list