* Partially fixes NB#85461, do not unload the folder before synchronizing it
authorSergio Villar Senin <svillar@igalia.com>
Wed, 21 May 2008 07:40:07 +0000 (07:40 +0000)
committerSergio Villar Senin <svillar@igalia.com>
Wed, 21 May 2008 07:40:07 +0000 (07:40 +0000)
pmo-diablo-r4550

src/modest-mail-operation.c
src/widgets/modest-folder-view.c
src/widgets/modest-header-view.c

index b73aafd..bcba71c 100644 (file)
@@ -2680,6 +2680,35 @@ transfer_msgs_status_cb (GObject *obj,
                                              &(helper->sum_total_bytes), helper->total_bytes, TRUE);
 }
 
+static void
+transfer_msgs_sync_folder_cb (TnyFolder *self, 
+                             gboolean cancelled, 
+                             GError *err, 
+                             gpointer user_data)
+{
+       XFerMsgsAsyncHelper *helper;
+       /* We don't care here about the results of the
+          synchronization */
+       helper = (XFerMsgsAsyncHelper *) user_data;
+
+       /* Notify about operation end */
+       modest_mail_operation_notify_end (helper->mail_op);
+
+       /* If user defined callback function was defined, call it */
+       if (helper->user_callback)
+               helper->user_callback (helper->mail_op, helper->user_data);
+       
+       /* Free */
+       if (helper->more_msgs)
+               g_object_unref (helper->more_msgs);
+       if (helper->headers)
+               g_object_unref (helper->headers);
+       if (helper->dest_folder)
+               g_object_unref (helper->dest_folder);
+       if (helper->mail_op)
+               g_object_unref (helper->mail_op);
+       g_slice_free (XFerMsgsAsyncHelper, helper);
+}
 
 static void
 transfer_msgs_cb (TnyFolder *folder, gboolean cancelled, GError *err, gpointer user_data)
@@ -2721,34 +2750,13 @@ transfer_msgs_cb (TnyFolder *folder, gboolean cancelled, GError *err, gpointer u
        }
 
        if (finished) {
-
-               /* Update folder counts */
-               tny_folder_poke_status (folder);
-               tny_folder_poke_status (helper->dest_folder);
-
-               /* Notify about operation end */
-               modest_mail_operation_notify_end (self);
-
-               /* If user defined callback function was defined, call it */
-               if (helper->user_callback) {
-                       /* This is not a GDK lock because we are a Tinymail callback and
-                        * Tinymail already acquires the Gdk lock */
-
-                       /* no gdk_threads_enter (), CHECKED */
-                       helper->user_callback (self, helper->user_data);
-                       /* no gdk_threads_leave (), CHECKED */
-               }
-
-               /* Free */
-               if (helper->more_msgs)
-                       g_object_unref (helper->more_msgs);
-               if (helper->headers)
-                       g_object_unref (helper->headers);
-               if (helper->dest_folder)
-                       g_object_unref (helper->dest_folder);
-               if (helper->mail_op)
-                       g_object_unref (helper->mail_op);
-               g_slice_free (XFerMsgsAsyncHelper, helper);
+               /* Synchronize the source folder contents. This should
+                  be done by tinymail but the camel_folder_sync it's
+                  actually disabled in transfer_msgs_thread_clean
+                  because it's supposed to cause hangs */
+               tny_folder_sync_async (folder, helper->delete, 
+                                      transfer_msgs_sync_folder_cb, 
+                                      NULL, helper);
        } else {
                /* Transfer more messages */
                tny_folder_transfer_msgs_async (folder,
index fe5ab9c..10b8e03 100644 (file)
@@ -1733,14 +1733,18 @@ on_selection_changed (GtkTreeSelection *sel, gpointer user_data)
        
        /* Current folder was unselected */
        if (priv->cur_folder_store) {
-               g_signal_emit (G_OBJECT(tree_view), signals[FOLDER_SELECTION_CHANGED_SIGNAL], 0,
-                      priv->cur_folder_store, FALSE);
-
+               /* We must do this firstly because a libtinymail-camel
+                  implementation detail. If we issue the signal
+                  before doing the sync_async, then that signal could
+                  cause (and it actually does it) a free of the
+                  summary of the folder (because the main window will
+                  clear the headers view */
                if (TNY_IS_FOLDER(priv->cur_folder_store))
                        tny_folder_sync_async (TNY_FOLDER(priv->cur_folder_store),
                                               FALSE, NULL, NULL, NULL);
 
-               /* FALSE --> don't expunge the messages */
+               g_signal_emit (G_OBJECT(tree_view), signals[FOLDER_SELECTION_CHANGED_SIGNAL], 0,
+                      priv->cur_folder_store, FALSE);
 
                g_object_unref (priv->cur_folder_store);
                priv->cur_folder_store = NULL;
index 2df0fd7..aeddf0c 100644 (file)
@@ -1268,8 +1268,10 @@ modest_header_view_set_folder (ModestHeaderView *self,
        }
                                                      
        if (priv->folder) {
-               if (priv->status_timeout)
+               if (priv->status_timeout) {
                        g_source_remove (priv->status_timeout);
+                       priv->status_timeout = 0;
+               }
 
                g_mutex_lock (priv->observers_lock);
                tny_folder_remove_observer (priv->folder, TNY_FOLDER_OBSERVER (self));
@@ -1989,6 +1991,10 @@ static void
 notify_filter_change_destroy (gpointer data)
 {
        NotifyFilterInfo *info = (NotifyFilterInfo *) data;
+       ModestHeaderViewPrivate *priv;
+
+       priv = MODEST_HEADER_VIEW_GET_PRIVATE (info->self);
+       priv->status_timeout = 0;
 
        g_object_unref (info->self);
        g_object_unref (info->folder);