ModestMailOperation *mail_op;
TnyList *headers;
TnyFolder *dest_folder;
- XferMsgsAsynUserCallback user_callback;
+ XferAsyncUserCallback user_callback;
gboolean delete;
gpointer user_data;
} XFerMsgAsyncHelper;
return NULL;
}
- return g_object_ref (priv->source);
+ return (priv->source) ? g_object_ref (priv->source) : NULL;
}
ModestMailOperationStatus
/* Frees */
if (new_headers)
g_object_unref (new_headers);
- g_object_unref (all_folders);
+ if (all_folders)
+ g_object_unref (all_folders);
g_object_unref (info->account);
g_object_unref (info->transport_account);
g_free (info->retrieve_type);
priv->done = 0;
priv->status = MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS;
- /* Get the Modest account */
+ /* Get the store account */
store_account = (TnyStoreAccount *)
modest_tny_account_store_get_server_account (modest_runtime_get_account_store (),
account_name,
TNY_ACCOUNT_TYPE_STORE);
- /* 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, TNY_ACCOUNT (store_account)))
- goto error;
-
if (!store_account) {
g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND,
error:
priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
- if (callback)
- callback (self, 0, user_data);
+ if (callback) {
+ callback (self, NULL, user_data);
+ }
modest_mail_operation_notify_end (self);
return FALSE;
}
* which is already GDK locked by Tinymail */
/* no gdk_threads_enter (), CHECKED */
- helper->user_callback (priv->source, helper->user_data);
+ helper->user_callback (self, helper->user_data);
/* no gdk_threads_leave () , CHECKED */
}
return TRUE;
}
-/**
- * This function checks if @ancestor is an acestor of @folder and
- * returns TRUE in that case
- */
-static gboolean
-folder_is_ancestor (TnyFolder *folder,
- TnyFolderStore *ancestor)
-{
- TnyFolder *tmp = NULL;
- gboolean found = FALSE;
-
- tmp = folder;
- while (!found && tmp && !TNY_IS_ACCOUNT (tmp)) {
- TnyFolderStore *folder_store;
-
- folder_store = tny_folder_get_folder_store (tmp);
- if (ancestor == folder_store)
- found = TRUE;
- else
- tmp = g_object_ref (folder_store);
- g_object_unref (folder_store);
- }
- return found;
-}
-
void
modest_mail_operation_xfer_folder (ModestMailOperation *self,
TnyFolder *folder,
TnyFolderStore *parent,
gboolean delete_original,
- XferMsgsAsynUserCallback user_callback,
+ XferAsyncUserCallback user_callback,
gpointer user_data)
{
ModestMailOperationPrivate *priv = NULL;
if (TNY_IS_FOLDER (parent))
parent_rules = modest_tny_folder_get_rules (TNY_FOLDER (parent));
- /* The moveable restriction is applied also to copy operation */
+ /* Apply operation constraints */
if ((gpointer) parent == (gpointer) folder ||
(!TNY_IS_FOLDER_STORE (parent)) ||
(rules & MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE)) {
-
- /* 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_FOLDER_RULES,
- error_msg);
-
- /* Notify the queue */
- modest_mail_operation_notify_end (self);
-
+ /* Folder rules */
+ goto error;
} 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,
- MODEST_MAIL_OPERATION_ERROR_FOLDER_RULES,
- error_msg);
-
- /* Notify the queue */
- modest_mail_operation_notify_end (self);
+ /* Folder rules */
+ goto error;
} else if (TNY_IS_FOLDER (parent) &&
TNY_IS_FOLDER_STORE (folder) &&
- folder_is_ancestor (TNY_FOLDER (parent), TNY_FOLDER_STORE (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_FOLDER_RULES,
- error_msg);
-
- /* Notify the queue */
- modest_mail_operation_notify_end (self);
-
+ modest_tny_folder_is_ancestor (TNY_FOLDER (parent),
+ TNY_FOLDER_STORE (folder))) {
+ /* Do not move a parent into a child */
+ goto error;
} else if (TNY_IS_FOLDER_STORE (parent) &&
modest_tny_folder_has_subfolder_with_name (parent, folder_name)) {
/* Check that the new folder name is not used by any
- parent subfolder */
-
- /* 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_FOLDER_RULES,
- error_msg);
-
- /* Notify the queue */
- modest_mail_operation_notify_end (self);
-
+ parent subfolder */
+ goto error;
} else if (!(new_name_valid_if_local_account (priv, parent, folder_name))) {
/* Check that the new folder name is not used by any
special local 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_FOLDER_RULES,
- error_msg);
-
- /* Notify the queue */
- modest_mail_operation_notify_end (self);
+ goto error;
} else {
/* Create the helper */
helper = g_slice_new0 (XFerMsgAsyncHelper);
- helper->mail_op = g_object_ref(self);
+ helper->mail_op = g_object_ref (self);
helper->dest_folder = NULL;
helper->headers = NULL;
helper->user_callback = user_callback;
helper->user_data = user_data;
- /* Move/Copy folder */
+ /* Move/Copy folder */
tny_folder_copy_async (folder,
parent,
tny_folder_get_name (folder),
delete_original,
transfer_folder_cb,
transfer_folder_status_cb,
- helper);
- }
-
+ helper);
+ return;
+ }
+
+ error:
+ /* 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_FOLDER_RULES,
+ error_msg);
+
+ /* Call the user callback if exists */
+ if (user_callback)
+ user_callback (self, user_data);
+
+ /* Notify the queue */
+ modest_mail_operation_notify_end (self);
}
void
/* remove message from folder */
tny_folder_remove_msgs (folder, headers, &(priv->error));
if (!priv->error) {
- if (TNY_IS_CAMEL_IMAP_FOLDER (folder))
+ if (TNY_IS_CAMEL_IMAP_FOLDER (folder) ||
+ TNY_IS_CAMEL_POP_FOLDER (folder))
tny_folder_sync_async(folder, FALSE, NULL, NULL, NULL); /* FALSE --> don't expunge */
-/* tny_folder_sync (folder, FALSE, &(priv->error)); /\* FALSE --> don't expunge */
- else if (TNY_IS_CAMEL_POP_FOLDER (folder))
- tny_folder_sync_async(folder, FALSE, NULL, NULL, NULL); /* TRUE --> dont expunge */
-/* tny_folder_sync (folder, TRUE, &(priv->error)); /\* TRUE --> expunge */
else
/* local folders */
tny_folder_sync_async(folder, TRUE, NULL, NULL, NULL); /* TRUE --> expunge */
-/* tny_folder_sync (folder, TRUE, &(priv->error)); /\* TRUE --> expunge */
}
* Tinymail already acquires the Gdk lock */
/* no gdk_threads_enter (), CHECKED */
- helper->user_callback (priv->source, helper->user_data);
+ helper->user_callback (self, helper->user_data);
/* no gdk_threads_leave (), CHECKED */
}
g_object_unref (folder);
if (iter)
g_object_unref (iter);
- g_slice_free (XFerMsgAsyncHelper, helper);
-
+ g_slice_free (XFerMsgAsyncHelper, helper);
}
void
TnyList *headers,
TnyFolder *folder,
gboolean delete_original,
- XferMsgsAsynUserCallback user_callback,
+ XferAsyncUserCallback user_callback,
gpointer user_data)
{
ModestMailOperationPrivate *priv = NULL;
XFerMsgAsyncHelper *helper = NULL;
TnyHeader *header = NULL;
ModestTnyFolderRules rules = 0;
- 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));
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) {
+ if (src_folder == folder) {
/* Set status failed and set an error */
priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,