Sync the flags using a mail operation. This way you'll get progress
authorSergio Villar Senin <svillar@igalia.com>
Wed, 28 Oct 2009 11:59:56 +0000 (12:59 +0100)
committerSergio Villar Senin <svillar@igalia.com>
Wed, 28 Oct 2009 12:29:43 +0000 (13:29 +0100)
information

Fixes NB#140509 (3/3)

src/dbus_api/modest-dbus-callbacks.c
src/hildon2/modest-main-window.c
src/hildon2/modest-msg-view-window.c
src/modest-mail-operation.c
src/modest-mail-operation.h
src/modest-ui-actions.c

index 7450644..a41f4ea 100644 (file)
@@ -546,7 +546,7 @@ find_msg_async_cb (TnyFolder *folder,
                                mail_op = modest_mail_operation_new (NULL);
                                modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
                                                                 mail_op);
-                               modest_mail_operation_sync_folder (mail_op, folder, FALSE);
+                               modest_mail_operation_sync_folder (mail_op, folder, FALSE, NULL, NULL);
                                g_object_unref (mail_op);
                        }
                         g_object_unref (header);
index 9116829..295850f 100644 (file)
@@ -2536,7 +2536,7 @@ on_window_hide (GObject    *gobject,
                        mail_op = modest_mail_operation_new (NULL);
                        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
                                                         mail_op);
-                       modest_mail_operation_sync_folder (mail_op, TNY_FOLDER (folder_store), FALSE);
+                       modest_mail_operation_sync_folder (mail_op, TNY_FOLDER (folder_store), FALSE, NULL, NULL);
                        g_object_unref (mail_op);
                        g_object_unref (folder_store);
                }
index 1aed5f5..6b0f9db 100644 (file)
@@ -3819,7 +3819,7 @@ sync_flags (ModestMsgViewWindow *self)
                        mail_op = modest_mail_operation_new (NULL);
                        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (),
                                                         mail_op);
-                       modest_mail_operation_sync_folder (mail_op, folder, FALSE);
+                       modest_mail_operation_sync_folder (mail_op, folder, FALSE, NULL, NULL);
                        g_object_unref (mail_op);
                        g_object_unref (folder);
                }
index e8cfaeb..2541e5f 100644 (file)
@@ -223,6 +223,12 @@ typedef struct _XFerFolderAsyncHelper
        gpointer user_data;
 } XFerFolderAsyncHelper;
 
+typedef struct _SyncFolderHelper {
+       ModestMailOperation *mail_op;
+       SyncFolderCallback user_callback;
+       gpointer user_data;
+} SyncFolderHelper;
+
 typedef void (*ModestMailOperationCreateMsgCallback) (ModestMailOperation *mail_op,
                                                      TnyMsg *msg,
                                                      gpointer userdata);
@@ -2907,6 +2913,7 @@ remove_msgs_async_cb (TnyFolder *folder,
        ModestMailOperation *self;
        ModestMailOperationPrivate *priv;
        ModestProtocolRegistry *protocol_registry;
+       SyncFolderHelper *helper;
 
        self = (ModestMailOperation *) user_data;
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
@@ -2942,9 +2949,17 @@ remove_msgs_async_cb (TnyFolder *folder,
        else
                expunge = FALSE;
 
+       /* Create helper */
+       helper = g_slice_new0 (SyncFolderHelper);
+       helper->mail_op = g_object_ref (self);
+       helper->user_callback = NULL;
+       helper->user_data = NULL;
+
        /* Sync folder */
-       tny_folder_sync_async(folder, expunge, sync_folder_finish_callback, 
-                             NULL, self);
+       tny_folder_sync_async(folder, expunge, sync_folder_finish_callback, NULL, helper);
+
+       /* Remove the extra reference */
+       g_object_unref (self);
 }
 
 void 
@@ -3673,17 +3688,17 @@ modest_mail_operation_shutdown (ModestMailOperation *self, ModestTnyAccountStore
 }
 
 static void
-sync_folder_finish_callback (TnyFolder *self, 
-                            gboolean cancelled, 
-                            GError *err, 
+sync_folder_finish_callback (TnyFolder *self,
+                            gboolean cancelled,
+                            GError *err,
                             gpointer user_data)
 
 {
-       ModestMailOperation *mail_op;
        ModestMailOperationPrivate *priv;
+       SyncFolderHelper *helper;
 
-       mail_op = (ModestMailOperation *) user_data;
-       priv = MODEST_MAIL_OPERATION_GET_PRIVATE (mail_op);
+       helper = (SyncFolderHelper *) user_data;
+       priv = MODEST_MAIL_OPERATION_GET_PRIVATE (helper->mail_op);
 
        /* If canceled by the user, ignore the error given by Tinymail */
        if (cancelled) {
@@ -3702,15 +3717,26 @@ sync_folder_finish_callback (TnyFolder *self,
                priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
        }
 
-       modest_mail_operation_notify_end (mail_op);
-       g_object_unref (mail_op);
+       /* User callback */
+       if (helper->user_callback)
+               helper->user_callback (helper->mail_op, self, helper->user_data);
+
+       modest_mail_operation_notify_end (helper->mail_op);
+
+       /* Frees */
+       g_object_unref (helper->mail_op);
+       g_slice_free (SyncFolderHelper, helper);
 }
 
 void
 modest_mail_operation_sync_folder (ModestMailOperation *self,
-                                  TnyFolder *folder, gboolean expunge)
+                                  TnyFolder *folder,
+                                  gboolean expunge,
+                                  SyncFolderCallback callback,
+                                  gpointer user_data)
 {
        ModestMailOperationPrivate *priv;
+       SyncFolderHelper *helper;
 
        g_return_if_fail (MODEST_IS_MAIL_OPERATION (self));
        g_return_if_fail (TNY_IS_FOLDER (folder));
@@ -3720,11 +3746,16 @@ modest_mail_operation_sync_folder (ModestMailOperation *self,
        priv->account = modest_tny_folder_get_account (folder);
        priv->op_type = MODEST_MAIL_OPERATION_TYPE_SYNC_FOLDER;
 
+       /* Create helper */
+       helper = g_slice_new0 (SyncFolderHelper);
+       helper->mail_op = g_object_ref (self);
+       helper->user_callback = callback;
+       helper->user_data = user_data;
+
        modest_mail_operation_notify_start (self);
-       g_object_ref (self);
-       tny_folder_sync_async (folder, expunge, 
-                              (TnyFolderCallback) sync_folder_finish_callback, 
-                              NULL, self);
+       tny_folder_sync_async (folder, expunge,
+                              (TnyFolderCallback) sync_folder_finish_callback,
+                              NULL, helper);
 }
 
 static void
index 8bc9bbf..bd3e381 100644 (file)
@@ -230,6 +230,20 @@ typedef void (*CreateFolderUserCallback) (ModestMailOperation *mail_op,
                                          TnyFolder *new_folder, 
                                          gpointer user_data);
 
+/**
+ * SyncFolderCallback:
+ *
+ * @self: a #ModestMailOperation
+ * @folder: the #TnyFolder to sync
+ * @user_data: generic data passed to user defined function.
+ *
+ * This is the callback of the sync_folder operation.
+ */
+typedef void (*SyncFolderCallback) (ModestMailOperation *self,
+                                   TnyFolder *folder,
+                                   gpointer user_data);
+
+
 /* This struct represents the internal state of a mail operation in a
    given time */
 typedef struct {
@@ -679,7 +693,10 @@ void          modest_mail_operation_queue_wakeup       (ModestMailOperation *sel
  * running while we do that sync operation.
  */
 void          modest_mail_operation_sync_folder     (ModestMailOperation *self,
-                                                    TnyFolder *folder, gboolean expunge);
+                                                    TnyFolder *folder,
+                                                    gboolean expunge,
+                                                    SyncFolderCallback callback,
+                                                    gpointer user_data);
 
 /**
  * modest_mail_operation_shutdown:
index 87f8627..e80359f 100644 (file)
@@ -2152,20 +2152,22 @@ modest_ui_actions_on_sort (GtkAction *action,
 }
 
 static void
-sync_folder_cb (TnyFolder *folder,
-               gboolean cancelled,
-               GError *err,
+sync_folder_cb (ModestMailOperation *mail_op,
+               TnyFolder *folder,
                gpointer user_data)
 {
        ModestHeaderView *header_view = (ModestHeaderView *) user_data;
 
-       tny_folder_refresh_async (folder, NULL, NULL, NULL);
-       /* ModestWindow *parent = (ModestWindow *) gtk_widget_get_ancestor ((GtkWidget *) user_data, GTK_TYPE_WINDOW); */
+       if (modest_mail_operation_get_status (mail_op) == MODEST_MAIL_OPERATION_STATUS_SUCCESS) {
+               ModestWindow *parent = (ModestWindow *) modest_mail_operation_get_source (mail_op);
 
-       /* We must clear first, because otherwise set_folder will ignore
-          the change as the folders are the same */
-       /* modest_header_view_clear (header_view); */
-       /* modest_header_view_set_folder (header_view, folder, TRUE, parent, NULL, NULL); */
+               /* We must clear first, because otherwise set_folder will ignore */
+               /*    the change as the folders are the same */
+               modest_header_view_clear (header_view);
+               modest_header_view_set_folder (header_view, folder, TRUE, parent, NULL, NULL);
+
+               g_object_unref (parent);
+       }
 
        g_object_unref (header_view);
 }
@@ -2193,8 +2195,11 @@ idle_refresh_folder (gpointer source)
                TnyFolder *folder = modest_header_view_get_folder (header_view);
                if (folder) {
                        /* Sync the folder status */
-                       tny_folder_sync_async (folder, TRUE, sync_folder_cb, NULL, g_object_ref (header_view));
+                       ModestMailOperation *mail_op = modest_mail_operation_new (source);
+                       modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
+                       modest_mail_operation_sync_folder (mail_op, folder, FALSE, sync_folder_cb, g_object_ref (header_view));
                        g_object_unref (folder);
+                       g_object_unref (mail_op);
                }
        }