From 0070a889409096ff23df3d819c38ec7110664ee5 Mon Sep 17 00:00:00 2001 From: Sergio Villar Senin Date: Wed, 28 Oct 2009 12:59:56 +0100 Subject: [PATCH] Sync the flags using a mail operation. This way you'll get progress information Fixes NB#140509 (3/3) --- src/dbus_api/modest-dbus-callbacks.c | 2 +- src/hildon2/modest-msg-view-window.c | 2 +- src/modest-mail-operation.c | 61 +++++++++++++++++++++++++--------- src/modest-mail-operation.h | 19 ++++++++++- src/modest-ui-actions.c | 25 ++++++++------ 5 files changed, 81 insertions(+), 28 deletions(-) diff --git a/src/dbus_api/modest-dbus-callbacks.c b/src/dbus_api/modest-dbus-callbacks.c index f03629b..4b8e722 100644 --- a/src/dbus_api/modest-dbus-callbacks.c +++ b/src/dbus_api/modest-dbus-callbacks.c @@ -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); diff --git a/src/hildon2/modest-msg-view-window.c b/src/hildon2/modest-msg-view-window.c index 7002d6c..ba5e013 100644 --- a/src/hildon2/modest-msg-view-window.c +++ b/src/hildon2/modest-msg-view-window.c @@ -3832,7 +3832,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); } diff --git a/src/modest-mail-operation.c b/src/modest-mail-operation.c index e8cfaeb..2541e5f 100644 --- a/src/modest-mail-operation.c +++ b/src/modest-mail-operation.c @@ -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 diff --git a/src/modest-mail-operation.h b/src/modest-mail-operation.h index 8bc9bbf..bd3e381 100644 --- a/src/modest-mail-operation.h +++ b/src/modest-mail-operation.h @@ -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: diff --git a/src/modest-ui-actions.c b/src/modest-ui-actions.c index 372c190..22b9011 100644 --- a/src/modest-ui-actions.c +++ b/src/modest-ui-actions.c @@ -2169,20 +2169,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); } @@ -2210,8 +2212,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); } } -- 1.7.9.5