summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2010-11-23 16:57:36 +0100
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>2010-11-24 14:32:38 +0100
commita45f892928636642a78bb8d50a3fc3d7ccff153f (patch)
tree14008a342147af81dcb516734d4162c5b9064d16
parent40c56bb226976d5046bd043f3950bdf1c5acb213 (diff)
downloadtelepathy-logger-a45f892928636642a78bb8d50a3fc3d7ccff153f.tar.gz
Copy the returned list in _finish() functions
Now that we don't leak the result any more, the list is properly freed when it's destroyed. That means we have to make a copy in _finish() functions as the caller get ownership of the list.
-rw-r--r--telepathy-logger/log-manager.c75
1 files changed, 57 insertions, 18 deletions
diff --git a/telepathy-logger/log-manager.c b/telepathy-logger/log-manager.c
index cbbfbbc..24c3493 100644
--- a/telepathy-logger/log-manager.c
+++ b/telepathy-logger/log-manager.c
@@ -964,7 +964,17 @@ tpl_log_manager_get_dates_finish (TplLogManager *self,
return FALSE;
if (dates != NULL)
- *dates = g_simple_async_result_get_op_res_gpointer (simple);
+ {
+ GList *list, *l;
+
+ *dates = NULL;
+ list = g_simple_async_result_get_op_res_gpointer (simple);
+
+ for (l = list; l != NULL; l = g_list_next (l))
+ *dates = g_list_prepend (*dates, copy_date (l->data));
+
+ *dates = g_list_reverse (*dates);
+ }
return TRUE;
}
@@ -1082,7 +1092,12 @@ tpl_log_manager_get_messages_for_date_finish (TplLogManager *self,
return FALSE;
if (messages != NULL)
- *messages = g_simple_async_result_get_op_res_gpointer (simple);
+ {
+ *messages = g_list_copy (g_simple_async_result_get_op_res_gpointer (
+ simple));
+
+ g_list_foreach (*messages, (GFunc) g_object_ref, NULL);
+ }
return TRUE;
}
@@ -1201,7 +1216,12 @@ tpl_log_manager_get_filtered_messages_finish (TplLogManager *self,
return FALSE;
if (messages != NULL)
- *messages = g_simple_async_result_get_op_res_gpointer (simple);
+ {
+ *messages = g_list_copy (g_simple_async_result_get_op_res_gpointer (
+ simple));
+
+ g_list_foreach (*messages, (GFunc) g_object_ref, NULL);
+ }
return TRUE;
}
@@ -1295,6 +1315,21 @@ tpl_log_manager_get_filtered_messages_async (TplLogManager *manager,
g_object_unref (simple);
}
+static GList *
+copy_search_hit_list (GList *list)
+{
+ GList *result = NULL;
+ GList *l;
+
+ for (l = list; l != NULL; l = g_list_next (l))
+ {
+ result = g_list_prepend (result,
+ _tpl_log_manager_search_hit_copy (l->data));
+ }
+
+ return g_list_reverse (result);
+}
+
/**
* tpl_log_manager_get_chats_finish:
* @self: a #TplLogManager
@@ -1323,22 +1358,16 @@ tpl_log_manager_get_chats_finish (TplLogManager *self,
return FALSE;
if (chats != NULL)
- *chats = g_simple_async_result_get_op_res_gpointer (simple);
-
- return TRUE;
-}
+ {
+ GList *list;
-static void
-_get_chats_async_result_free (gpointer data)
-{
- GList *lst = data; /* list of (gchar *) */
- g_return_if_fail (data != NULL);
+ list = g_simple_async_result_get_op_res_gpointer (simple);
+ *chats = copy_search_hit_list (list);
+ }
- g_list_foreach (lst, (GFunc) g_free, NULL);
- g_list_free (lst);
+ return TRUE;
}
-
static void
_get_chats_async_thread (GSimpleAsyncResult *simple,
GObject *object,
@@ -1354,7 +1383,7 @@ _get_chats_async_thread (GSimpleAsyncResult *simple,
lst = _tpl_log_manager_get_chats (async_data->manager, chat_info->account);
g_simple_async_result_set_op_res_gpointer (simple, lst,
- _get_chats_async_result_free);
+ (GDestroyNotify) tpl_log_manager_search_free);
}
/**
@@ -1419,7 +1448,12 @@ _tpl_log_manager_search_in_identifier_chats_new_finish (TplLogManager *self,
return FALSE;
if (chats != NULL)
- *chats = g_simple_async_result_get_op_res_gpointer (simple);
+ {
+ GList *list;
+
+ list = g_simple_async_result_get_op_res_gpointer (simple);
+ *chats = copy_search_hit_list (list);
+ }
return TRUE;
}
@@ -1519,7 +1553,12 @@ tpl_log_manager_search_finish (TplLogManager *self,
return FALSE;
if (chats != NULL)
- *chats = g_simple_async_result_get_op_res_gpointer (simple);
+ {
+ GList *list;
+
+ list = g_simple_async_result_get_op_res_gpointer (simple);
+ *chats = copy_search_hit_list (list);
+ }
return TRUE;
}