* Outbox messsages are opened in edit window.
authorJavier Fernandez Garcia-Boente <jfernandez@igalia.com>
Mon, 30 Jul 2007 10:38:58 +0000 (10:38 +0000)
committerJavier Fernandez Garcia-Boente <jfernandez@igalia.com>
Mon, 30 Jul 2007 10:38:58 +0000 (10:38 +0000)
* If they are modifed, they are saved to draf if ther was not send.
* Otherwise, they are saved again into outbox
* Messages which are being edited are excluded from sent-queue.
* Fixes: NB#57915

pmo-trunk-r2843

src/maemo/modest-msg-edit-window.c
src/modest-mail-operation.c
src/modest-tny-send-queue.c
src/modest-ui-actions.c
src/widgets/modest-header-view.c
src/widgets/modest-window-mgr.c

index 8abbada..fc777c2 100644 (file)
@@ -249,6 +249,7 @@ struct _ModestMsgEditWindowPrivate {
        gulong      clipboard_change_handler_id;
 
        TnyMsg      *draft_msg;
+       TnyMsg      *outbox_msg;
        gboolean    sent;
 };
 
@@ -352,6 +353,7 @@ modest_msg_edit_window_init (ModestMsgEditWindow *obj)
        priv->last_search = NULL;
 
        priv->draft_msg = NULL;
+       priv->outbox_msg = NULL;
        priv->clipboard_change_handler_id = 0;
        priv->sent = FALSE;
 }
@@ -575,6 +577,15 @@ modest_msg_edit_window_finalize (GObject *obj)
                g_object_unref (priv->draft_msg);
                priv->draft_msg = NULL;
        }
+       if (priv->outbox_msg != NULL) {
+               TnyHeader *header = tny_msg_get_header (priv->outbox_msg);
+               if (TNY_IS_HEADER (header)) {
+                       ModestWindowMgr *mgr = modest_runtime_get_window_mgr ();
+                       modest_window_mgr_unregister_header (mgr, header);
+               }
+               g_object_unref (priv->outbox_msg);
+               priv->outbox_msg = NULL;
+       }
 
        /* This had to stay alive for as long as the combobox that used it: */
        modest_pair_list_free (priv->from_field_protos);
@@ -793,10 +804,14 @@ set_msg (ModestMsgEditWindow *self, TnyMsg *msg)
 
        /* we should set a reference to the incoming message if it is a draft */
        msg_folder = tny_msg_get_folder (msg);
-       if (msg_folder) {
-               if (modest_tny_folder_is_local_folder (msg_folder) &&
-                   modest_tny_folder_get_local_or_mmc_folder_type (msg_folder) == TNY_FOLDER_TYPE_DRAFTS)
-                       priv->draft_msg = g_object_ref(msg);
+       if (msg_folder) {               
+               if (modest_tny_folder_is_local_folder (msg_folder)) {
+                       TnyFolderType type = modest_tny_folder_get_local_or_mmc_folder_type (msg_folder);
+                       if (type == TNY_FOLDER_TYPE_DRAFTS) 
+                               priv->draft_msg = g_object_ref(msg);
+                       if (type == TNY_FOLDER_TYPE_OUTBOX)
+                               priv->outbox_msg = g_object_ref(msg);
+               }
                g_object_unref (msg_folder);
        }
 }
@@ -1184,6 +1199,9 @@ modest_msg_edit_window_get_msg_data (ModestMsgEditWindow *edit_window)
        data->subject =  g_strdup (gtk_entry_get_text (GTK_ENTRY (priv->subject_field)));
        if (priv->draft_msg) {
                data->draft_msg = g_object_ref (priv->draft_msg);
+       } 
+       if (priv->outbox_msg) {
+               data->draft_msg = g_object_ref (priv->outbox_msg);
        } else {
                data->draft_msg = NULL;
        }
index 4d16d48..b3161ce 100644 (file)
@@ -698,7 +698,8 @@ modest_mail_operation_send_new_mail_cb (ModestMailOperation *self,
                                        gpointer userdata)
 {
        SendNewMailInfo *info = (SendNewMailInfo *) userdata;
-       TnyFolder *folder;
+       TnyFolder *draft_folder = NULL;
+       TnyFolder *outbox_folder = NULL;
        TnyHeader *header;
 
        if (!msg) {
@@ -708,23 +709,38 @@ modest_mail_operation_send_new_mail_cb (ModestMailOperation *self,
        /* Call mail operation */
        modest_mail_operation_send_mail (self, info->transport_account, msg);
 
-       folder = modest_tny_account_get_special_folder (TNY_ACCOUNT (info->transport_account), TNY_FOLDER_TYPE_DRAFTS);
-       if (folder) {
-               if (info->draft_msg != NULL) {
-                       header = tny_msg_get_header (info->draft_msg);
-                       /* Note: This can fail (with a warning) if the message is not really already in a folder,
-                        * because this function requires it to have a UID. */
-                       tny_folder_remove_msg (folder, header, NULL);
-                       tny_header_set_flags (header, TNY_HEADER_FLAG_DELETED);
-                       tny_header_set_flags (header, TNY_HEADER_FLAG_SEEN);
-                       g_object_unref (header);
-                       g_object_unref (folder);
-               }
+       /* Remove old mail from its source folder */
+       draft_folder = modest_tny_account_get_special_folder (TNY_ACCOUNT (info->transport_account), TNY_FOLDER_TYPE_DRAFTS);
+       outbox_folder = modest_tny_account_get_special_folder (TNY_ACCOUNT (info->transport_account), TNY_FOLDER_TYPE_OUTBOX);
+       if (info->draft_msg != NULL) {
+               TnyFolder *folder = NULL;
+               TnyFolder *src_folder = NULL;
+               TnyFolderType folder_type;              
+               folder = tny_msg_get_folder (info->draft_msg);          
+               if (folder == NULL) goto end;
+               folder_type = modest_tny_folder_guess_folder_type (folder);
+               if (folder_type == TNY_FOLDER_TYPE_OUTBOX) 
+                       src_folder = outbox_folder;
+               else 
+                       src_folder = draft_folder;
+
+               /* Note: This can fail (with a warning) if the message is not really already in a folder,
+                * because this function requires it to have a UID. */          
+               header = tny_msg_get_header (info->draft_msg);
+               tny_folder_remove_msg (src_folder, header, NULL);
+               tny_header_set_flags (header, TNY_HEADER_FLAG_DELETED);
+               tny_header_set_flags (header, TNY_HEADER_FLAG_SEEN);
+               g_object_unref (header);
+               g_object_unref (folder);
        }
 
 end:
        if (info->draft_msg)
                g_object_unref (info->draft_msg);
+       if (draft_folder)
+               g_object_unref (draft_folder);
+       if (outbox_folder)
+               g_object_unref (outbox_folder);
        if (info->transport_account)
                g_object_unref (info->transport_account);
        g_slice_free (SendNewMailInfo, info);
@@ -784,6 +800,7 @@ modest_mail_operation_save_to_drafts_cb (ModestMailOperation *self,
                                         TnyMsg *msg,
                                         gpointer userdata)
 {
+       TnyFolder *src_folder = NULL;
        TnyFolder *folder = NULL;
        TnyHeader *header = NULL;
        ModestMailOperationPrivate *priv = NULL;
@@ -809,11 +826,12 @@ modest_mail_operation_save_to_drafts_cb (ModestMailOperation *self,
 
        if (info->draft_msg != NULL) {
                header = tny_msg_get_header (info->draft_msg);
+               src_folder = tny_header_get_folder (header); 
                /* Remove the old draft expunging it */
-               tny_folder_remove_msg (folder, header, NULL);
+               tny_folder_remove_msg (src_folder, header, NULL);
                tny_header_set_flags (header, TNY_HEADER_FLAG_DELETED);
                tny_header_set_flags (header, TNY_HEADER_FLAG_SEEN);
-               tny_folder_sync (folder, FALSE, &(priv->error));  /* FALSE --> don't expunge */
+               tny_folder_sync (src_folder, TRUE, &(priv->error));  /* expunge */
                g_object_unref (header);
        }
        
@@ -832,6 +850,8 @@ modest_mail_operation_save_to_drafts_cb (ModestMailOperation *self,
 end:
        if (folder)
                g_object_unref (G_OBJECT(folder));
+       if (src_folder)
+               g_object_unref (G_OBJECT(src_folder));
        if (info->edit_window)
                g_object_unref (G_OBJECT(info->edit_window));
        if (info->draft_msg)
index 0db96a1..a1dace8 100644 (file)
@@ -34,6 +34,8 @@
 #include <tny-folder.h>
 #include <tny-camel-msg.h>
 #include <modest-tny-account.h>
+#include <modest-runtime.h>
+#include <widgets/modest-window-mgr.h>
 #include <modest-marshal.h>
 #include <string.h> /* strcmp */
 
@@ -170,19 +172,17 @@ static void
 modest_tny_send_queue_add (TnySendQueue *self, TnyMsg *msg, GError **err)
 {
        ModestTnySendQueuePrivate *priv;
-       TnyHeader *header;
+       TnyHeader *header = NULL;
        SendInfo *info = NULL;
-       GList* existing;
-       const gchar* msg_id;
+       GList* existing = NULL;
+       const gchar* msg_id = NULL;
 
        g_return_if_fail (TNY_IS_SEND_QUEUE(self));
        g_return_if_fail (TNY_IS_CAMEL_MSG(msg));
 
        priv = MODEST_TNY_SEND_QUEUE_GET_PRIVATE (self);
        header = tny_msg_get_header (msg);
-
-       /* FIXME: do something smart here... */
-
+       
        /* Note that this call actually sets the message id to something
         * sensible. */ 
        TNY_CAMEL_SEND_QUEUE_CLASS(parent_class)->add_func (self, msg, err); /* FIXME */
@@ -219,11 +219,13 @@ modest_tny_send_queue_add (TnySendQueue *self, TnyMsg *msg, GError **err)
 static void
 _add_message (ModestTnySendQueue *self, TnyHeader *header)
 {
+       ModestWindowMgr *mgr = NULL;
        ModestTnySendQueuePrivate *priv;
        SendInfo *info = NULL;
        GList* existing = NULL;
        gchar* msg_uid = NULL;
        ModestTnySendQueueStatus status = MODEST_TNY_SEND_QUEUE_WAITING;
+       gboolean editing = FALSE;
 
        g_return_if_fail (TNY_IS_SEND_QUEUE(self));
        g_return_if_fail (TNY_IS_HEADER(header));
@@ -238,9 +240,16 @@ _add_message (ModestTnySendQueue *self, TnyHeader *header)
        case MODEST_TNY_SEND_QUEUE_FAILED:
                if (status != MODEST_TNY_SEND_QUEUE_SUSPENDED)
                        tny_header_unset_flags (header, TNY_HEADER_FLAG_PRIORITY);
+               
+               /* Check if it already exists on queue */
                existing = modest_tny_send_queue_lookup_info (MODEST_TNY_SEND_QUEUE(self), msg_uid);
                if(existing != NULL) return;
        
+               /* Check if its being edited */
+               mgr = modest_runtime_get_window_mgr ();
+               editing = modest_window_mgr_find_registered_header (mgr, header, NULL);
+               if (editing) return;
+               
                /* Add new meesage info */
                info = g_slice_new (SendInfo);
                info->msg_id = strdup(msg_uid);
index 9a9aa95..65ee0c5 100644 (file)
@@ -773,6 +773,7 @@ open_msg_cb (ModestMailOperation *mail_op,
                        goto cleanup;
                }
                win = modest_msg_edit_window_new (msg, account);
+               
        } else {
                gchar *uid = modest_tny_folder_get_header_unique_id (header);
                
index 47cda76..5a62caa 100644 (file)
@@ -1500,7 +1500,7 @@ folder_monitor_update (TnyFolderObserver *self,
                return;
 
        /* Check header removed  (hide marked as DELETED headers) */
-       if (changed & TNY_FOLDER_CHANGE_CHANGED_ADDED_HEADERS) {
+       if (changed & TNY_FOLDER_CHANGE_CHANGED_EXPUNGED_HEADERS) {
                modest_header_view_refilter (MODEST_HEADER_VIEW(self));
        }
 
index d66cc14..a66271e 100644 (file)
@@ -477,7 +477,7 @@ on_window_destroy (ModestWindow *window,
                                if (response != GTK_RESPONSE_CANCEL)                            
                                        modest_ui_actions_on_save_to_drafts (NULL, MODEST_MSG_EDIT_WINDOW (window));
                                
-                       }
+                       } 
                }
        }