if (new_msg) {
TnyHeader *header;
+ TnyHeaderFlags flags = 0;
+
/* Set priority flags in message */
header = tny_msg_get_header (new_msg);
if (info->priority_flags != 0)
- tny_header_set_flags (header, info->priority_flags);
- if (info->attachments_list != NULL) {
- tny_header_set_flags (header, TNY_HEADER_FLAG_ATTACHMENTS);
- }
+ flags |= info->priority_flags;
+
+ /* Set attachment flags in message */
+ if (info->attachments_list != NULL)
+ flags |= TNY_HEADER_FLAG_ATTACHMENTS;
+
+ tny_header_set_flags (header, flags);
g_object_unref (G_OBJECT(header));
} else {
priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
idle_info->mail_op = g_object_ref (info->mail_op);
idle_info->new_headers = num_new_headers;
idle_info->callback = info->callback;
+ idle_info->user_data = info->user_data;
g_idle_add (idle_update_account_cb, idle_info);
}
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,
ModestMailOperationPrivate *priv = NULL;
ModestTnyFolderRules parent_rules = 0, rules;
XFerMsgAsyncHelper *helper = NULL;
+ const gchar *folder_name = NULL;
g_return_if_fail (MODEST_IS_MAIL_OPERATION (self));
g_return_if_fail (TNY_IS_FOLDER (folder));
+ g_return_if_fail (TNY_IS_FOLDER_STORE (parent));
priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
+ folder_name = tny_folder_get_name (folder);
/* Get account and set it into mail_operation */
priv->account = modest_tny_folder_get_account (TNY_FOLDER(folder));
if ((gpointer) parent == (gpointer) folder ||
(!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);
+
} 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 the queue */
modest_mail_operation_notify_end (self);
- } else {
+ } 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,
+ _("mail_in_ui_folder_copy_target_error"));
+
+ /* Notify the queue */
+ modest_mail_operation_notify_end (self);
+
+ } 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,
+ _("mail_in_ui_folder_move_target_error"));
+ /* Notify the queue */
+ modest_mail_operation_notify_end (self);
+
+ } 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 */
- if (new_name_valid_if_local_account (priv, parent,
- tny_folder_get_name (folder))) {
- /* Create the helper */
- helper = g_slice_new0 (XFerMsgAsyncHelper);
- 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 */
- tny_folder_copy_async (folder,
- parent,
- tny_folder_get_name (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,
+ _("mail_in_ui_folder_move_target_error"));
+
+ /* Notify the queue */
+ modest_mail_operation_notify_end (self);
+ } else {
+ /* Create the helper */
+ helper = g_slice_new0 (XFerMsgAsyncHelper);
+ 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 */
+ tny_folder_copy_async (folder,
+ parent,
+ tny_folder_get_name (folder),
delete_original,
- transfer_folder_cb,
- transfer_folder_status_cb,
- helper);
- } else {
- modest_mail_operation_notify_end (self);
- }
- }
+ transfer_folder_cb,
+ transfer_folder_status_cb,
+ helper);
+ }
+
}
void