X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-mail-operation.c;h=4f0f94227e47f3c2f5e9a84626f056a3171530e5;hp=1f1b3b4db78701e2c6451e815cf6d476022cf7c2;hb=152ee6945dc5142b5e63f2a6ac6efc2dbb94df0c;hpb=67574f05fc7dbc619b6c33f073d346824c72f1f4 diff --git a/src/modest-mail-operation.c b/src/modest-mail-operation.c index 1f1b3b4..4f0f942 100644 --- a/src/modest-mail-operation.c +++ b/src/modest-mail-operation.c @@ -73,7 +73,7 @@ static void modest_mail_operation_finalize (GObject *obj); static void get_msg_cb (TnyFolder *folder, gboolean cancelled, TnyMsg *msg, - GError **err, + GError *rr, gpointer user_data); static void get_msg_status_cb (GObject *obj, @@ -610,13 +610,18 @@ create_msg_thread (gpointer thread_data) 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; @@ -1362,7 +1367,6 @@ update_account_thread (gpointer thr_user_data) goto out; /* Perform send (if operation was not cancelled) */ -/* priv->op_type = MODEST_MAIL_OPERATION_TYPE_SEND; */ priv->done = 0; priv->total = 0; if (priv->account != NULL) @@ -1371,9 +1375,7 @@ update_account_thread (gpointer thr_user_data) send_queue = modest_runtime_get_send_queue (info->transport_account); if (send_queue) { -/* timeout = g_timeout_add (250, idle_notify_progress, info->mail_op); */ modest_tny_send_queue_try_to_send (send_queue); -/* g_source_remove (timeout); */ } else { g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR, MODEST_MAIL_OPERATION_ERROR_INSTANCE_CREATION_FAILED, @@ -1403,6 +1405,7 @@ update_account_thread (gpointer thr_user_data) 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); } @@ -1680,7 +1683,9 @@ transfer_folder_status_cb (GObject *obj, * which is already GDK locked by Tinymail */ /* no gdk_threads_enter (), CHECKED */ - g_signal_emit (G_OBJECT (self), signals[PROGRESS_CHANGED_SIGNAL], 0, state, NULL); + + g_signal_emit (G_OBJECT (self), signals[PROGRESS_CHANGED_SIGNAL], 0, state, NULL); + /* no gdk_threads_leave (), CHECKED */ g_slice_free (ModestMailOperationState, state); @@ -1688,11 +1693,10 @@ transfer_folder_status_cb (GObject *obj, static void -transfer_folder_cb (TnyFolder *folder, +transfer_folder_cb (TnyFolder *folder, gboolean cancelled, TnyFolderStore *into, - gboolean cancelled, TnyFolder *new_folder, - GError **err, + GError *err, gpointer user_data) { XFerMsgAsyncHelper *helper; @@ -1705,8 +1709,8 @@ transfer_folder_cb (TnyFolder *folder, self = helper->mail_op; priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self); - if (*err) { - priv->error = g_error_copy (*err); + if (err) { + priv->error = g_error_copy (err); priv->done = 0; priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED; } else if (cancelled) { @@ -1780,6 +1784,31 @@ new_name_valid_if_local_account (ModestMailOperationPrivate *priv, 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, @@ -1791,11 +1820,14 @@ modest_mail_operation_xfer_folder (ModestMailOperation *self, 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)); @@ -1810,7 +1842,7 @@ modest_mail_operation_xfer_folder (ModestMailOperation *self, 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, @@ -1819,8 +1851,10 @@ modest_mail_operation_xfer_folder (ModestMailOperation *self, /* 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, @@ -1829,33 +1863,64 @@ modest_mail_operation_xfer_folder (ModestMailOperation *self, /* 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 @@ -1984,7 +2049,7 @@ static void get_msg_cb (TnyFolder *folder, gboolean cancelled, TnyMsg *msg, - GError **error, + GError *error, gpointer user_data) { GetMsgAsyncHelper *helper = NULL; @@ -1998,8 +2063,8 @@ get_msg_cb (TnyFolder *folder, priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self); /* Check errors and cancel */ - if (*error) { - priv->error = g_error_copy (*error); + if (error) { + priv->error = g_error_copy (error); priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED; } else if (cancelled) { priv->status = MODEST_MAIL_OPERATION_STATUS_CANCELED; @@ -2410,7 +2475,7 @@ transfer_msgs_status_cb (GObject *obj, static void -transfer_msgs_cb (TnyFolder *folder, gboolean cancelled, GError **err, gpointer user_data) +transfer_msgs_cb (TnyFolder *folder, gboolean cancelled, GError *err, gpointer user_data) { XFerMsgAsyncHelper *helper; ModestMailOperation *self; @@ -2423,8 +2488,8 @@ transfer_msgs_cb (TnyFolder *folder, gboolean cancelled, GError **err, gpointer priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self); - if (*err) { - priv->error = g_error_copy (*err); + if (err) { + priv->error = g_error_copy (err); priv->done = 0; priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED; } else if (cancelled) { @@ -2578,7 +2643,7 @@ modest_mail_operation_xfer_msgs (ModestMailOperation *self, static void on_refresh_folder (TnyFolder *folder, gboolean cancelled, - GError **error, + GError *error, gpointer user_data) { RefreshAsyncHelper *helper = NULL; @@ -2591,9 +2656,11 @@ on_refresh_folder (TnyFolder *folder, g_return_if_fail(priv!=NULL); - if (*error) { - priv->error = g_error_copy (*error); + if (error) { + priv->error = g_error_copy (error); priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED; + printf("DEBUG: %s: Operation error:\n %s", __FUNCTION__, + error->message); goto out; } @@ -2603,11 +2670,12 @@ on_refresh_folder (TnyFolder *folder, MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND, _("Error trying to refresh the contents of %s"), tny_folder_get_name (folder)); + printf("DEBUG: %s: Operation cancelled.\n", __FUNCTION__); goto out; } priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS; - out: + /* Call user defined callback, if it exists */ if (helper->user_callback) { @@ -2619,6 +2687,7 @@ on_refresh_folder (TnyFolder *folder, /* no gdk_threads_leave (), CHECKED */ } + out: /* Free */ g_slice_free (RefreshAsyncHelper, helper);