Fix for bug NB#79005. Improves duplicates detection for cases of saving
authorJose Dapena Paz <jdapena@igalia.com>
Thu, 24 Apr 2008 17:56:04 +0000 (17:56 +0000)
committerJose Dapena Paz <jdapena@igalia.com>
Thu, 24 Apr 2008 17:56:04 +0000 (17:56 +0000)
new versions of big files.

pmo-trunk-r4470

src/widgets/modest-header-view.c

index cee8ad6..895ec95 100644 (file)
@@ -989,22 +989,19 @@ modest_header_view_get_folder (ModestHeaderView *self)
 }
 
 static void
 }
 
 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;
        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) */
 
        /* 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);
        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));
 
        sortable = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL(headers));
        g_object_unref (G_OBJECT (headers));