#include <tny-folder-store-query.h>
#include <tny-camel-stream.h>
#include <tny-camel-pop-store-account.h>
+#include <tny-camel-pop-folder.h>
+#include <tny-camel-imap-folder.h>
#include <tny-simple-list.h>
#include <tny-send-queue.h>
#include <tny-status.h>
header = tny_msg_get_header (draft_msg);
/* Remove the old draft expunging it */
tny_folder_remove_msg (folder, header, NULL);
- tny_folder_sync (folder, TRUE, NULL);
+ tny_folder_sync (folder, FALSE, &(priv->error)); /* FALSE --> don't expunge */
g_object_unref (header);
}
- tny_folder_add_msg (folder, msg, &(priv->error));
+ if (!priv->error)
+ tny_folder_add_msg (folder, msg, &(priv->error));
+
if (!priv->error)
priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
+ else
+ priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
end:
if (msg)
time(NULL),
TRUE);
+ gdk_threads_leave ();
+
return FALSE;
}
Gtk+. We use a timeout in order to provide more status
information, because the sync tinymail call does not
provide it for the moment */
- gint timeout = g_timeout_add (250, idle_notify_progress, info->mail_op);
+ gint timeout = g_timeout_add (100, idle_notify_progress, info->mail_op);
/* Refresh folders */
new_headers = g_ptr_array_new ();
/* Notify about operation end. Note that the info could be
freed before this idle happens, but the mail operation will
be still alive */
- g_idle_add (notify_update_account_queue, g_object_ref (info->mail_op));
+ g_idle_add (idle_notify_update_account_queue, g_object_ref (info->mail_op));
if (info->callback) {
/* This thread is not in the main lock */
priv->done = 0;
priv->status = MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS;
- /* Make sure that we have a connection, and request one
- * if necessary:
- * TODO: Is there some way to trigger this for every attempt to
- * use the network? */
- if (!modest_platform_connect_and_wait(NULL))
- goto error;
-
/* Get the Modest account */
modest_account = (TnyStoreAccount *)
modest_tny_account_store_get_server_account (modest_runtime_get_account_store (),
}
}
+ if (!strcmp (name, " ") || strchr (name, '/')) {
+ priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
+ g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
+ MODEST_MAIL_OPERATION_ERROR_FOLDER_RULES,
+ _("mail_in_ui_folder_create_error"));
+ }
+
if (!priv->error) {
/* Create the folder */
new_folder = tny_folder_store_create_folder (parent, name, &(priv->error));
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;
gboolean delete_original)
{
ModestMailOperationPrivate *priv = NULL;
- ModestTnyFolderRules parent_rules, rules;
+ ModestTnyFolderRules parent_rules = 0, rules;
g_return_if_fail (MODEST_IS_MAIL_OPERATION (self));
g_return_if_fail (TNY_IS_FOLDER (folder));
- g_return_if_fail (TNY_IS_FOLDER (parent));
priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
/* Get folder rules */
rules = modest_tny_folder_get_rules (TNY_FOLDER (folder));
- parent_rules = modest_tny_folder_get_rules (TNY_FOLDER (parent));
-
- if (!TNY_IS_FOLDER_STORE (parent)) {
-
- }
+ if (TNY_IS_FOLDER (parent))
+ parent_rules = modest_tny_folder_get_rules (TNY_FOLDER (parent));
/* The moveable restriction is applied also to copy operation */
if ((!TNY_IS_FOLDER_STORE (parent)) || (rules & MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE)) {
+ printf("DEBUG: %s: Not allowing the move.\n", __FUNCTION__);
/* Set status failed and set an error */
priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
/* Notify the queue */
modest_mail_operation_notify_end (self, FALSE);
- } else if (parent_rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE) {
+ } else if (TNY_IS_FOLDER (parent) &&
+ (parent_rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE)) {
/* Set status failed and set an error */
priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
/* Notify about operation end */
modest_mail_operation_notify_end (self, FALSE);
+ } else if (!strcmp (name, " ") || strchr (name, '/')) {
+ priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
+ g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
+ MODEST_MAIL_OPERATION_ERROR_FOLDER_RULES,
+ _("FIXME: unable to rename"));
+ /* Notify about operation end */
+ modest_mail_operation_notify_end (self, FALSE);
} else {
- /* Rename. Camel handles folder subscription/unsubscription */
TnyFolderStore *into;
+ /* Rename. Camel handles folder subscription/unsubscription */
into = tny_folder_get_folder_store (folder);
tny_folder_copy_async (folder, into, name, TRUE,
transfer_folder_cb,
transfer_folder_status_cb,
self);
if (into)
- g_object_unref (into);
-
+ g_object_unref (into);
}
}
helper->user_data = user_data;
helper->header = g_object_ref (header);
+ // The callback's reference so that the mail op is not
+ // finalized until the async operation is completed even if
+ // the user canceled the request meanwhile.
+ g_object_ref (G_OBJECT (helper->mail_op));
+
tny_folder_get_msg_async (folder, header, get_msg_cb, get_msg_status_cb, helper);
g_object_unref (G_OBJECT (folder));
goto out;
}
- priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
+ /* The mail operation might have been canceled in which case we do not
+ want to notify anyone anymore. */
+ if(priv->status != MODEST_MAIL_OPERATION_STATUS_CANCELED) {
+ priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
- /* If user defined callback function was defined, call it */
- if (helper->user_callback) {
- /* This callback is called into an iddle by tinymail,
- and idles are not in the main lock */
- gdk_threads_enter ();
- helper->user_callback (self, helper->header, msg, helper->user_data);
- gdk_threads_leave ();
+ /* If user defined callback function was defined, call it */
+ if (helper->user_callback) {
+ /* This callback is called into an iddle by tinymail,
+ and idles are not in the main lock */
+ gdk_threads_enter ();
+ helper->user_callback (self, helper->header, msg, helper->user_data);
+ gdk_threads_leave ();
+ }
}
out:
g_slice_free (GetMsgAsyncHelper, helper);
/* Notify about operation end */
- modest_mail_operation_notify_end (self, TRUE);
+ if(priv->status != MODEST_MAIL_OPERATION_STATUS_CANCELED)
+ modest_mail_operation_notify_end (self, TRUE);
+
+ g_object_unref (G_OBJECT (self));
}
static void
self = helper->mail_op;
priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
- if ((status->position == 1) && (status->of_total == 100))
+ if(priv->status == MODEST_MAIL_OPERATION_STATUS_CANCELED)
return;
priv->done = 1;
priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
/* Notify about operation end */
- g_idle_add (notify_update_account_queue, g_object_ref (info->mail_op));
+ g_idle_add (idle_notify_update_account_queue, g_object_ref (info->mail_op));
/* Free thread resources. Will be called after all previous idles */
g_idle_add_full (G_PRIORITY_DEFAULT_IDLE + 1, get_msgs_full_destroyer, info, NULL);
void
-modest_mail_operation_remove_msg (ModestMailOperation *self,
- TnyHeader *header,
- gboolean remove_to_trash)
+modest_mail_operation_remove_msg (ModestMailOperation *self, TnyHeader *header,
+ gboolean remove_to_trash /*ignored*/)
{
TnyFolder *folder;
ModestMailOperationPrivate *priv;
g_return_if_fail (MODEST_IS_MAIL_OPERATION (self));
g_return_if_fail (TNY_IS_HEADER (header));
+ if (remove_to_trash)
+ g_warning ("remove to trash is not implemented");
+
priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
folder = tny_header_get_folder (header);
priv->status = MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS;
- /* Delete or move to trash */
- if (remove_to_trash) {
- TnyFolder *trash_folder;
- TnyStoreAccount *store_account;
-
- store_account = TNY_STORE_ACCOUNT (modest_tny_folder_get_account (folder));
- trash_folder = modest_tny_account_get_special_folder (TNY_ACCOUNT(store_account),
- TNY_FOLDER_TYPE_TRASH);
- if (trash_folder) {
- TnyList *headers;
-
- /* Create list */
- headers = tny_simple_list_new ();
- tny_list_append (headers, G_OBJECT (header));
- g_object_unref (header);
-
- /* Move to trash */
- modest_mail_operation_xfer_msgs (self, headers, trash_folder, TRUE, NULL, NULL);
- g_object_unref (headers);
-/* g_object_unref (trash_folder); */
- } else {
- ModestMailOperationPrivate *priv;
- /* Set status failed and set an error */
- priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
- priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
- g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
- MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND,
- _("Error trying to delete a message. Trash folder not found"));
- }
-
- g_object_unref (G_OBJECT (store_account));
- } else {
- tny_folder_remove_msg (folder, header, &(priv->error));
- if (!priv->error)
- tny_folder_sync(folder, TRUE, &(priv->error));
+ tny_folder_remove_msg (folder, header, &(priv->error));
+ if (!priv->error) {
+ tny_header_set_flags (header, TNY_HEADER_FLAG_DELETED);
+
+ if (TNY_IS_CAMEL_IMAP_FOLDER (folder))
+ tny_folder_sync(folder, FALSE, &(priv->error)); /* FALSE --> don't expunge */
+ else if (TNY_IS_CAMEL_POP_FOLDER (folder))
+ tny_folder_sync(folder, TRUE, &(priv->error)); /* TRUE --> expunge */
+ else
+ /* lcoal folders */
+ tny_folder_sync(folder, TRUE, &(priv->error)); /* TRUE --> expunge */
}
-
+
+
/* Set status */
if (!priv->error)
priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
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;
priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
}
+ /* Notify about operation end */
+ modest_mail_operation_notify_end (self, TRUE);
+
/* If user defined callback function was defined, call it */
if (helper->user_callback) {
gdk_threads_enter ();
g_slice_free (XFerMsgAsyncHelper, helper);
g_object_unref (folder);
- /* Notify about operation end */
- modest_mail_operation_notify_end (self, TRUE);
}
void
XFerMsgAsyncHelper *helper;
TnyHeader *header;
ModestTnyFolderRules rules;
+ const gchar *id1 = NULL;
+ const gchar *id2 = NULL;
+ gboolean same_folder = FALSE;
g_return_if_fail (MODEST_IS_MAIL_OPERATION (self));
g_return_if_fail (TNY_IS_LIST (headers));
priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
MODEST_MAIL_OPERATION_ERROR_FOLDER_RULES,
- _("FIXME: folder does not accept msgs"));
+ _("ckct_ib_unable_to_paste_here"));
+ /* Notify the queue */
+ modest_mail_operation_notify_end (self, FALSE);
+ return;
+ }
+
+ /* Get source folder */
+ iter = tny_list_create_iterator (headers);
+ header = TNY_HEADER (tny_iterator_get_current (iter));
+ src_folder = tny_header_get_folder (header);
+ g_object_unref (header);
+ g_object_unref (iter);
+
+ /* Check folder source and destination */
+ id1 = tny_folder_get_id (src_folder);
+ id2 = tny_folder_get_id (TNY_FOLDER(folder));
+ same_folder = !g_ascii_strcasecmp (id1, id2);
+ if (same_folder) {
+ /* Set status failed and set an error */
+ priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
+ g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
+ MODEST_MAIL_OPERATION_ERROR_BAD_PARAMETER,
+ _("mcen_ib_unable_to_copy_samefolder"));
+
/* Notify the queue */
modest_mail_operation_notify_end (self, FALSE);
+
+ /* Free */
+ g_object_unref (src_folder);
return;
}
helper->user_callback = user_callback;
helper->user_data = user_data;
- /* Get source folder */
- iter = tny_list_create_iterator (headers);
- header = TNY_HEADER (tny_iterator_get_current (iter));
- src_folder = tny_header_get_folder (header);
- g_object_unref (header);
- g_object_unref (iter);
-
/* Get account and set it into mail_operation */
priv->account = modest_tny_folder_get_account (src_folder);