From: Javier Fernandez Garcia-Boente Date: Mon, 30 Jul 2007 10:38:58 +0000 (+0000) Subject: * Outbox messsages are opened in edit window. X-Git-Tag: git_migration_finished~2707 X-Git-Url: http://git.maemo.org/git/?p=modest;a=commitdiff_plain;h=48c2d1405e2c7235bddc21a34842ad3a6f6b9713 * Outbox messsages are opened in edit window. * 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 --- diff --git a/src/maemo/modest-msg-edit-window.c b/src/maemo/modest-msg-edit-window.c index 8abbada..fc777c2 100644 --- a/src/maemo/modest-msg-edit-window.c +++ b/src/maemo/modest-msg-edit-window.c @@ -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; } diff --git a/src/modest-mail-operation.c b/src/modest-mail-operation.c index 4d16d48..b3161ce 100644 --- a/src/modest-mail-operation.c +++ b/src/modest-mail-operation.c @@ -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) diff --git a/src/modest-tny-send-queue.c b/src/modest-tny-send-queue.c index 0db96a1..a1dace8 100644 --- a/src/modest-tny-send-queue.c +++ b/src/modest-tny-send-queue.c @@ -34,6 +34,8 @@ #include #include #include +#include +#include #include #include /* 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); diff --git a/src/modest-ui-actions.c b/src/modest-ui-actions.c index 9a9aa95..65ee0c5 100644 --- a/src/modest-ui-actions.c +++ b/src/modest-ui-actions.c @@ -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); diff --git a/src/widgets/modest-header-view.c b/src/widgets/modest-header-view.c index 47cda76..5a62caa 100644 --- a/src/widgets/modest-header-view.c +++ b/src/widgets/modest-header-view.c @@ -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)); } diff --git a/src/widgets/modest-window-mgr.c b/src/widgets/modest-window-mgr.c index d66cc14..a66271e 100644 --- a/src/widgets/modest-window-mgr.c +++ b/src/widgets/modest-window-mgr.c @@ -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)); - } + } } }