From: Jose Dapena Paz Date: Thu, 24 Apr 2008 17:56:04 +0000 (+0000) Subject: Fix for bug NB#79005. Improves duplicates detection for cases of saving X-Git-Tag: git_migration_finished~1420 X-Git-Url: http://git.maemo.org/git/?p=modest;a=commitdiff_plain;h=913e02317298030d82f1c2a311c0eeba720190f2 Fix for bug NB#79005. Improves duplicates detection for cases of saving new versions of big files. pmo-trunk-r4470 --- diff --git a/src/widgets/modest-header-view.c b/src/widgets/modest-header-view.c index cee8ad6..895ec95 100644 --- a/src/widgets/modest-header-view.c +++ b/src/widgets/modest-header-view.c @@ -989,22 +989,19 @@ modest_header_view_get_folder (ModestHeaderView *self) } static void -modest_header_view_set_folder_intern (ModestHeaderView *self, TnyFolder *folder) +set_folder_intern_get_headers_async_cb (TnyFolder *folder, + gboolean cancelled, + TnyList *headers, + GError *err, + gpointer user_data) { - TnyFolderType type; - TnyList *headers; + ModestHeaderView *self; ModestHeaderViewPrivate *priv; - GList *cols, *cursor; - GtkTreeModel *filter_model, *sortable; - guint sort_colid; - GtkSortType sort_type; - priv = MODEST_HEADER_VIEW_GET_PRIVATE(self); - - headers = TNY_LIST (tny_gtk_header_list_model_new ()); + g_return_if_fail (MODEST_IS_HEADER_VIEW (user_data)); - tny_gtk_header_list_model_set_folder (TNY_GTK_HEADER_LIST_MODEL(headers), - folder, FALSE, NULL, NULL, NULL); + self = MODEST_HEADER_VIEW (user_data); + priv = MODEST_HEADER_VIEW_GET_PRIVATE(self); /* Add IDLE observer (monitor) and another folder observer for new messages (self) */ @@ -1017,6 +1014,39 @@ modest_header_view_set_folder_intern (ModestHeaderView *self, TnyFolder *folder) tny_folder_monitor_add_list (priv->monitor, TNY_LIST (headers)); tny_folder_monitor_start (priv->monitor); g_mutex_unlock (priv->observers_lock); +} + +static void +modest_header_view_set_folder_intern (ModestHeaderView *self, TnyFolder *folder) +{ + TnyFolderType type; + TnyList *headers; + ModestHeaderViewPrivate *priv; + GList *cols, *cursor; + GtkTreeModel *filter_model, *sortable; + guint sort_colid; + GtkSortType sort_type; + + priv = MODEST_HEADER_VIEW_GET_PRIVATE(self); + + headers = TNY_LIST (tny_gtk_header_list_model_new ()); + + /* Start the monitor in the callback of the + tny_gtk_header_list_model_set_folder call. It's crucial to + do it there and not just after the call because we want the + monitor to observe only the headers returned by the + tny_folder_get_headers_async call that it's inside the + tny_gtk_header_list_model_set_folder call. This way the + monitor infrastructure could successfully cope with + duplicates. For example if a tny_folder_add_msg_async is + happening while tny_gtk_header_list_model_set_folder is + invoked, then the first call could add a header that will + be added again by tny_gtk_header_list_model_set_folder, so + we'd end up with duplicate headers. sergio */ + tny_gtk_header_list_model_set_folder (TNY_GTK_HEADER_LIST_MODEL(headers), + folder, FALSE, + set_folder_intern_get_headers_async_cb, + NULL, self); sortable = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL(headers)); g_object_unref (G_OBJECT (headers));