* modest-mail-operation.c:
authorJavier Fernandez Garcia-Boente <jfernandez@igalia.com>
Thu, 10 May 2007 15:30:01 +0000 (15:30 +0000)
committerJavier Fernandez Garcia-Boente <jfernandez@igalia.com>
Thu, 10 May 2007 15:30:01 +0000 (15:30 +0000)
  - Aded new operation  folder_copy_async and their callbacks
  - Fix bug on get_msg_status_cb function (Fixes: NB#56182)
  - Messages transfer use now async operations.
* maemo/modest-main-window.c:
  - Fix bug on Edit menu, options mark as read/unred work now.
  - Headers will be marked as seen when a they are opened.
* modest-ui-actions.c:
  - Review action handlers of mark as read/unread menu options.
* maemo/modest-msg-view-window.c:
  - Messages will marked as seen when next/prev buttons are clicked.

pmo-trunk-r1826

src/maemo/modest-main-window-ui.h
src/maemo/modest-main-window.c
src/maemo/modest-msg-view-window.c
src/modest-mail-operation.c
src/modest-mail-operation.h
src/modest-ui-actions.c
src/modest-ui-actions.h

index 8234741..586f1a3 100644 (file)
@@ -74,8 +74,8 @@ static const GtkActionEntry modest_action_entries [] = {
        { "EditCopy",        NULL,      N_("mcen_me_inbox_copy"),         "<CTRL>C",    NULL, G_CALLBACK (modest_ui_actions_on_copy) },
        { "EditPaste",       NULL,      N_("mcen_me_inbox_paste"),        "<CTRL>V",    NULL, G_CALLBACK (modest_ui_actions_on_paste) },
        { "EditSelectAll",   NULL,      N_("mcen_me_viewer_selectall"),    NULL,        NULL, G_CALLBACK (modest_ui_actions_on_select_all) },
-       { "EditMarkAsRead", NULL,      N_("mcen_me_inbox_mark_as_read"),       NULL,      NULL, NULL },
-       { "EditMarkAsUnread", NULL,      N_("mcen_me_inbox_mark_as_unread"),       NULL,          NULL, NULL },
+       { "EditMarkAsRead", NULL,      N_("mcen_me_inbox_mark_as_read"),       NULL,      NULL, G_CALLBACK (modest_ui_actions_on_mark_as_read) },
+       { "EditMarkAsUnread", NULL,      N_("mcen_me_inbox_mark_as_unread"),       NULL,          NULL, G_CALLBACK (modest_ui_actions_on_mark_as_unread) },
        { "EditMoveTo",      NULL,      N_("mcen_me_inbox_moveto"),    NULL,      NULL, G_CALLBACK (modest_ui_actions_on_move_to) },
        
        /* View */
index 5b59233..99bdd63 100644 (file)
@@ -802,8 +802,8 @@ modest_main_window_show_toolbar (ModestWindow *self,
                priv->cancel_toolitem = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarCancel");
                priv->refresh_toolitem = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarSendReceive");
                priv->sort_toolitem = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarSort");
-               gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->progress_toolitem), FALSE);
-               gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->progress_toolitem), FALSE);
+               gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->progress_toolitem), TRUE);
+               gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->progress_toolitem), TRUE);
                gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (priv->cancel_toolitem), FALSE);
                gtk_tool_item_set_expand (GTK_TOOL_ITEM (priv->cancel_toolitem), FALSE);
 
index a0ffaad..93f526d 100644 (file)
@@ -858,6 +858,7 @@ modest_msg_view_window_is_first_message (ModestMsgViewWindow *window)
 gboolean        
 modest_msg_view_window_select_next_message (ModestMsgViewWindow *window)
 {
+       TnyHeaderFlags flags;
        ModestMailOperation *mail_op = NULL;
        ModestMsgViewWindowPrivate *priv;
        GtkTreeIter tmp_iter;
@@ -879,6 +880,11 @@ modest_msg_view_window_select_next_message (ModestMsgViewWindow *window)
                        if (tny_header_get_flags (header) & TNY_HEADER_FLAG_DELETED)
                                continue;
 
+                       /* Mark as read */
+                       flags = tny_header_get_flags (header);
+                       if (!(flags & TNY_HEADER_FLAG_SEEN))
+                               tny_header_set_flags (header, flags | TNY_HEADER_FLAG_SEEN);
+
                        /* New mail operation */
                        mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE, G_OBJECT(window));
                        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
@@ -902,6 +908,7 @@ modest_msg_view_window_select_next_message (ModestMsgViewWindow *window)
 gboolean        
 modest_msg_view_window_select_previous_message (ModestMsgViewWindow *window)
 {
+       TnyHeaderFlags flags;
        ModestMsgViewWindowPrivate *priv = NULL;
        ModestMailOperation *mail_op = NULL;
 
@@ -924,6 +931,11 @@ modest_msg_view_window_select_previous_message (ModestMsgViewWindow *window)
                        if (tny_header_get_flags (header) & TNY_HEADER_FLAG_DELETED)
                                continue;
                        
+                       /* Mark as read */
+                       flags = tny_header_get_flags (header);
+                       if (!(flags & TNY_HEADER_FLAG_SEEN))
+                               tny_header_set_flags (header, flags | TNY_HEADER_FLAG_SEEN);
+
                        /* New mail operation */
                        mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_ID_RECEIVE, G_OBJECT(window));
                        modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);
index a3c3040..325681d 100644 (file)
@@ -127,6 +127,12 @@ typedef struct _XFerMsgAsyncHelper
 
 } XFerMsgAsyncHelper;
 
+typedef struct _XFerFolderAsyncHelper
+{
+       ModestMailOperation *mail_op;
+
+} XFerFolderAsyncHelper;
+
 
 /* globals */
 static GObjectClass *parent_class = NULL;
@@ -437,12 +443,12 @@ update_folders_status_cb (GObject *obj,
        self = MODEST_MAIL_OPERATION (user_data);
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
 
+       if ((status->position == 1) && (status->of_total == 100))
+               return;
+
        priv->done = status->position;
        priv->total = status->of_total;
 
-       if (priv->done == 1 && priv->total == 100)
-               return;
-
        g_signal_emit (G_OBJECT (self), signals[PROGRESS_CHANGED_SIGNAL], 0, NULL);
 }
 
@@ -700,9 +706,9 @@ modest_mail_operation_remove_folder (ModestMailOperation *self,
 
        g_return_if_fail (MODEST_IS_MAIL_OPERATION (self));
        g_return_if_fail (TNY_IS_FOLDER (folder));
-
+       
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
-
+       
        /* Check folder rules */
        rules = modest_tny_folder_get_rules (TNY_FOLDER (folder));
        if (rules & MODEST_FOLDER_RULES_FOLDER_NON_DELETABLE) {
@@ -717,13 +723,16 @@ modest_mail_operation_remove_folder (ModestMailOperation *self,
 
        /* Delete folder or move to trash */
        if (remove_to_trash) {
-               TnyFolder *trash_folder, *new_folder;
+               TnyFolder *trash_folder = NULL;
+/*             TnyFolder *trash_folder, *new_folder; */
                trash_folder = modest_tny_account_get_special_folder (account,
                                                                      TNY_FOLDER_TYPE_TRASH);
                /* TODO: error_handling */
-               new_folder = modest_mail_operation_xfer_folder (self, folder, 
-                                                               TNY_FOLDER_STORE (trash_folder), TRUE);
-               g_object_unref (G_OBJECT (new_folder));
+                modest_mail_operation_xfer_folder (self, folder,
+                                                   TNY_FOLDER_STORE (trash_folder), TRUE);
+/*             new_folder = modest_mail_operation_xfer_folder (self, folder,  */
+/*                                                             TNY_FOLDER_STORE (trash_folder), TRUE); */
+/*             g_object_unref (G_OBJECT (new_folder)); */
        } else {
                TnyFolderStore *parent = tny_folder_get_folder_store (folder);
 
@@ -770,6 +779,76 @@ modest_mail_operation_rename_folder (ModestMailOperation *self,
        modest_mail_operation_queue_remove (modest_runtime_get_mail_operation_queue (), self);
  }
 
+static void
+transfer_folder_status_cb (GObject *obj,
+                          TnyStatus *status,  
+                          gpointer user_data)
+{
+       XFerMsgAsyncHelper *helper = NULL;
+       ModestMailOperation *self;
+       ModestMailOperationPrivate *priv;
+
+       g_return_if_fail (status != NULL);
+       g_return_if_fail (status->code == TNY_FOLDER_STATUS_CODE_COPY_FOLDER);
+
+       helper = (XFerMsgAsyncHelper *) user_data;
+       g_return_if_fail (helper != NULL);       
+
+       /* Temporary FIX: useful when tinymail send us status
+          information *after* calling the function callback */
+       if (!MODEST_IS_MAIL_OPERATION (helper->mail_op))
+               return;
+
+       self = helper->mail_op;
+       priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
+
+       if ((status->position == 1) && (status->of_total == 100))
+               return;
+
+       priv->done = status->position;
+       priv->total = status->of_total;
+
+
+       g_signal_emit (G_OBJECT (self), signals[PROGRESS_CHANGED_SIGNAL], 0, NULL);
+}
+
+
+static void
+transfer_folder_cb (TnyFolder *folder, TnyFolderStore *into, const gchar *new_name, gboolean cancelled, GError **err, gpointer user_data)
+{
+       XFerFolderAsyncHelper *helper = NULL;
+       ModestMailOperation *self = NULL;
+       ModestMailOperationPrivate *priv = NULL;
+
+       helper = (XFerFolderAsyncHelper *) user_data;
+       self = helper->mail_op;
+
+       priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
+
+       if (*err) {
+               priv->error = g_error_copy (*err);
+               priv->done = 0;
+               priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;     
+       } else if (cancelled) {
+               priv->status = MODEST_MAIL_OPERATION_STATUS_CANCELED;
+               g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
+                            MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND,
+                            _("Error trying to refresh the contents of %s"),
+                            tny_folder_get_name (folder));
+       } else {
+               priv->done = 1;
+               priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
+       }
+
+       /* Free */
+       g_slice_free   (XFerFolderAsyncHelper, helper);
+       g_object_unref (folder);
+       g_object_unref (into);
+
+       /* Notify the queue */
+       modest_mail_operation_queue_remove (modest_runtime_get_mail_operation_queue (), self);
+}
+
 TnyFolder *
 modest_mail_operation_xfer_folder (ModestMailOperation *self,
                                   TnyFolder *folder,
@@ -797,7 +876,7 @@ modest_mail_operation_xfer_folder (ModestMailOperation *self,
                new_folder = tny_folder_copy (folder,
                                              parent,
                                              tny_folder_get_name (folder),
-                                             delete_original, 
+                                             delete_original,
                                              &(priv->error));
        }
 
@@ -807,6 +886,43 @@ modest_mail_operation_xfer_folder (ModestMailOperation *self,
        return new_folder;
 }
 
+void
+modest_mail_operation_xfer_folder_async (ModestMailOperation *self,
+                                        TnyFolder *folder,
+                                        TnyFolderStore *parent,
+                                        gboolean delete_original)
+{
+       XFerFolderAsyncHelper *helper = NULL;
+       ModestMailOperationPrivate *priv = NULL;
+       ModestTnyFolderRules rules;
+
+       g_return_if_fail (MODEST_IS_MAIL_OPERATION (self));
+       g_return_if_fail (TNY_IS_FOLDER_STORE (parent));
+       g_return_if_fail (TNY_IS_FOLDER (folder));
+
+       priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
+
+       /* The moveable restriction is applied also to copy operation */
+       rules = modest_tny_folder_get_rules (TNY_FOLDER (parent));
+       if (rules & MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE) {
+               g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
+                            MODEST_MAIL_OPERATION_ERROR_FOLDER_RULES,
+                            _("FIXME: unable to rename"));
+       } else {
+               helper = g_slice_new0 (XFerFolderAsyncHelper);
+               helper->mail_op = self;
+
+               /* Move/Copy folder */          
+               tny_folder_copy_async (folder,
+                                      parent,
+                                      tny_folder_get_name (folder),
+                                      delete_original,
+                                      transfer_folder_cb,
+                                      transfer_folder_status_cb,
+                                      helper);
+       }
+}
+
 
 /* ******************************************************************* */
 /* **************************  MSG  ACTIONS  ************************* */
@@ -923,12 +1039,12 @@ get_msg_status_cb (GObject *obj,
        self = helper->mail_op;
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
 
-       priv->done += status->position;
-       priv->total = status->of_total;
-
-       if (priv->done == 1 && priv->total == 100)
+       if ((status->position == 1) && (status->of_total == 100))
                return;
 
+       priv->done = 1;
+       priv->total = 1;
+
        g_signal_emit (G_OBJECT (self), signals[PROGRESS_CHANGED_SIGNAL], 0, NULL);
 }
 
@@ -950,6 +1066,7 @@ void          modest_mail_operation_process_msg     (ModestMailOperation *self,
        priv->status = MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS;
 
        iter = tny_list_create_iterator (header_list); 
+       priv->done = 1;
        priv->total = tny_list_get_length(header_list);
 
        helper = g_slice_new0 (GetMsgAsyncHelper);
@@ -1011,14 +1128,12 @@ update_process_msg_status_cb (GObject *obj,
        self = helper->mail_op;
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
 
+       if ((status->position == 1) && (status->of_total == 100))
+               return;
+
        if (status->of_total > 0)
                priv->done += status->position/status->of_total;
 
-       g_print("TEST: %d/%d", priv->done, priv->total); 
-
-       if (priv->done == 1 && priv->total == 100)
-               return;
-
        g_signal_emit (G_OBJECT (self), signals[PROGRESS_CHANGED_SIGNAL], 0, NULL);
 }
 
@@ -1114,12 +1229,12 @@ transfer_msgs_status_cb (GObject *obj,
        self = helper->mail_op;
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
 
+       if ((status->position == 1) && (status->of_total == 100))
+               return;
+
        priv->done = status->position;
        priv->total = status->of_total;
 
-       if (priv->done == 1 && priv->total == 100)
-               return;
-
        g_signal_emit (G_OBJECT (self), signals[PROGRESS_CHANGED_SIGNAL], 0, NULL);
 }
 
@@ -1155,9 +1270,8 @@ transfer_msgs_cb (TnyFolder *folder, gboolean cancelled, GError **err, gpointer
        g_object_unref (helper->headers);
        g_object_unref (helper->dest_folder);
        g_object_unref (helper->mail_op);
-       g_object_unref (folder);
        g_slice_free   (XFerMsgAsyncHelper, helper);
-       helper = NULL;
+       g_object_unref (folder);
 
        /* Notify the queue */
        modest_mail_operation_queue_remove (modest_runtime_get_mail_operation_queue (), self);
index 4650b3f..34eff04 100644 (file)
@@ -314,11 +314,16 @@ void          modest_mail_operation_rename_folder  (ModestMailOperation *self,
  * Returns: the newly transfered folder
  **/
 TnyFolder*    modest_mail_operation_xfer_folder    (ModestMailOperation *self,
-                                                   TnyFolder *folder, 
+                                                   TnyFolder *folder,
                                                    TnyFolderStore *parent,
                                                    gboolean delete_original);
 
 
+
+void    modest_mail_operation_xfer_folder_async    (ModestMailOperation *self,
+                                                   TnyFolder *folder, 
+                                                   TnyFolderStore *parent,
+                                                   gboolean delete_original);
 /* Functions that performs msg operations */
 
 /**
index ccc4c83..77886d7 100644 (file)
@@ -174,6 +174,36 @@ get_selected_headers (ModestWindow *win)
 }
 
 static void
+headers_action_mark_as_read (TnyHeader *header,
+                            ModestWindow *win,
+                            gpointer user_data)
+{
+       TnyHeaderFlags flags;
+
+       g_return_if_fail (TNY_IS_HEADER(header));
+
+       flags = tny_header_get_flags (header);
+       if (flags & TNY_HEADER_FLAG_SEEN) return;
+       tny_header_set_flags (header, TNY_HEADER_FLAG_SEEN);
+}
+
+static void
+headers_action_mark_as_unread (TnyHeader *header,
+                              ModestWindow *win,
+                              gpointer user_data)
+{
+       TnyHeaderFlags flags;
+
+       g_return_if_fail (TNY_IS_HEADER(header));
+
+       flags = tny_header_get_flags (header);
+       if (flags & TNY_HEADER_FLAG_SEEN)  {
+               tny_header_unset_flags (header, TNY_HEADER_FLAG_SEEN);
+       }
+}
+
+
+static void
 headers_action_delete (TnyHeader *header,
                       ModestWindow *win,
                       gpointer user_data)
@@ -941,6 +971,7 @@ modest_ui_actions_on_header_activated (ModestHeaderView *header_view,
        GtkTreeIter iter;
        GtkTreeSelection *sel = NULL;
        GList *sel_list = NULL;
+       GList *tmp = NULL;
        
        g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
        
@@ -967,6 +998,17 @@ modest_ui_actions_on_header_activated (ModestHeaderView *header_view,
                helper->model = model;
                helper->iter = iter;
 
+               /* Mark as read */
+               for (tmp=sel_list; tmp; tmp=g_list_next(tmp)) {
+                       gtk_tree_model_get_iter (model, &iter, (GtkTreePath *) tmp->data);
+                       gtk_tree_model_get (model, &iter, TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
+                                           &header, -1);
+
+                       headers_action_mark_as_read (header, MODEST_WINDOW(main_window), NULL);
+
+                       g_object_unref(header);
+               }
+                       
                g_list_foreach (sel_list, (GFunc) gtk_tree_path_free, NULL);
                g_list_free (sel_list);
        }
@@ -1838,6 +1880,26 @@ modest_ui_actions_on_select_all (GtkAction *action,
 }
 
 void
+modest_ui_actions_on_mark_as_read (GtkAction *action,
+                                  ModestWindow *window)
+{      
+       g_return_if_fail (MODEST_IS_WINDOW(window));
+               
+       /* Mark each header as read */
+       do_headers_action (window, headers_action_mark_as_read, NULL);
+}
+
+void
+modest_ui_actions_on_mark_as_unread (GtkAction *action,
+                                    ModestWindow *window)
+{      
+       g_return_if_fail (MODEST_IS_WINDOW(window));
+               
+       /* Mark each header as read */
+       do_headers_action (window, headers_action_mark_as_unread, NULL);
+}
+
+void
 modest_ui_actions_on_change_zoom (GtkRadioAction *action,
                                  GtkRadioAction *selected,
                                  ModestWindow *window)
index ebd94d9..469c700 100644 (file)
@@ -169,6 +169,11 @@ void     modest_ui_actions_on_attach_file             (GtkAction *action,
 
 void     modest_ui_actions_on_remove_attachments      (GtkAction *action,
                                                       ModestMsgEditWindow *window);
+void     modest_ui_actions_on_mark_as_read            (GtkAction *action,
+                                                      ModestWindow *window);
+
+void     modest_ui_actions_on_mark_as_unread            (GtkAction *action,
+                                                        ModestWindow *window);
 
 /**
  * modest_ui_actions_do_send_receive_all: