* 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
gulong clipboard_change_handler_id;
TnyMsg *draft_msg;
+ TnyMsg *outbox_msg;
gboolean sent;
};
priv->last_search = NULL;
priv->draft_msg = NULL;
+ priv->outbox_msg = NULL;
priv->clipboard_change_handler_id = 0;
priv->sent = FALSE;
}
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);
/* 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);
}
}
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;
}
gpointer userdata)
{
SendNewMailInfo *info = (SendNewMailInfo *) userdata;
- TnyFolder *folder;
+ TnyFolder *draft_folder = NULL;
+ TnyFolder *outbox_folder = NULL;
TnyHeader *header;
if (!msg) {
/* 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);
TnyMsg *msg,
gpointer userdata)
{
+ TnyFolder *src_folder = NULL;
TnyFolder *folder = NULL;
TnyHeader *header = NULL;
ModestMailOperationPrivate *priv = NULL;
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);
}
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)
#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 */
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 */
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));
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);
goto cleanup;
}
win = modest_msg_edit_window_new (msg, account);
+
} else {
gchar *uid = modest_tny_folder_get_header_unique_id (header);
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));
}
if (response != GTK_RESPONSE_CANCEL)
modest_ui_actions_on_save_to_drafts (NULL, MODEST_MSG_EDIT_WINDOW (window));
- }
+ }
}
}