diff options
author | Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> | 2010-11-23 16:57:36 +0100 |
---|---|---|
committer | Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> | 2010-11-24 14:32:38 +0100 |
commit | a45f892928636642a78bb8d50a3fc3d7ccff153f (patch) | |
tree | 14008a342147af81dcb516734d4162c5b9064d16 | |
parent | 40c56bb226976d5046bd043f3950bdf1c5acb213 (diff) | |
download | telepathy-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.c | 75 |
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; } |