X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-mail-operation.c;h=6d8e4e1b25bff77b221e8ab7702bbc0714887669;hp=8f339731d24f17b9aca1047c58e3d79032b3c1e7;hb=a7decb707f783a7de18e83f4085a42d018b018c3;hpb=8328e0f0490f0f930bd03a066b2d5d89e91cc9a1;ds=sidebyside diff --git a/src/modest-mail-operation.c b/src/modest-mail-operation.c index 8f33973..6d8e4e1 100644 --- a/src/modest-mail-operation.c +++ b/src/modest-mail-operation.c @@ -305,6 +305,7 @@ modest_mail_operation_new_with_error_handling (ModestMailOperationTypeOperation g_return_val_if_fail (error_handler != NULL, obj); priv->error_checking = error_handler; + priv->error_checking_user_data = user_data; return obj; } @@ -556,15 +557,25 @@ modest_mail_operation_send_mail (ModestMailOperation *self, g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR, MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND, "modest: could not find send queue for account\n"); + priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED; + } else { /* TODO: connect to the msg-sent in order to know when the mail operation is finished */ - tny_send_queue_add (send_queue, msg, &(priv->error)); + +/* tny_send_queue_add (send_queue, msg, &(priv->error)); */ + modest_tny_send_queue_add (MODEST_TNY_SEND_QUEUE(send_queue), + msg, + &(priv->error)); + /* TODO: we're setting always success, do the check in the handler */ priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS; } + if (priv->status == MODEST_MAIL_OPERATION_STATUS_SUCCESS) + modest_platform_information_banner (NULL, NULL, _("mcen_ib_outbox_waiting_to_be_sent")); + /* TODO: do this in the handler of the "msg-sent" signal.Notify about operation end */ modest_mail_operation_notify_end (self); @@ -710,6 +721,7 @@ modest_mail_operation_send_new_mail_cb (ModestMailOperation *self, TnyFolder *draft_folder = NULL; TnyFolder *outbox_folder = NULL; TnyHeader *header; + GError *err = NULL; if (!msg) { goto end; @@ -737,13 +749,17 @@ modest_mail_operation_send_new_mail_cb (ModestMailOperation *self, * 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); + + tny_folder_sync (folder, TRUE, &err); /* FALSE --> don't expunge */ +/* tny_folder_sync_async (src_folder, TRUE, NULL, NULL, NULL); /\* expunge *\/ */ + g_object_unref (header); g_object_unref (folder); } end: + if (err != NULL) + g_error_free(err); if (info->draft_msg) g_object_unref (info->draft_msg); if (draft_folder) @@ -839,11 +855,15 @@ modest_mail_operation_save_to_drafts_cb (ModestMailOperation *self, if ((!priv->error) && (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 (src_folder, header, NULL); - tny_header_set_flags (header, TNY_HEADER_FLAG_DELETED); - tny_header_set_flags (header, TNY_HEADER_FLAG_SEEN); +/* tny_header_set_flags (header, TNY_HEADER_FLAG_DELETED); */ +/* tny_header_set_flags (header, TNY_HEADER_FLAG_SEEN); */ + + tny_folder_sync (folder, TRUE, &(priv->error)); /* FALSE --> don't expunge */ tny_folder_sync_async (src_folder, TRUE, NULL, NULL, NULL); /* expunge */ + g_object_unref (header); } @@ -1290,6 +1310,7 @@ update_account_thread (gpointer thr_user_data) if (G_UNLIKELY (!first_time)) tny_folder_poke_status (TNY_FOLDER (folder)); } + tny_folder_remove_observer (TNY_FOLDER (folder), TNY_FOLDER_OBSERVER (observer)); g_object_unref (observer); observer = NULL; @@ -1542,28 +1563,19 @@ modest_mail_operation_create_folder (ModestMailOperation *self, ModestMailOperationPrivate *priv; TnyFolder *new_folder = NULL; - TnyList *list = tny_simple_list_new (); - TnyFolderStoreQuery *query = tny_folder_store_query_new (); - g_return_val_if_fail (TNY_IS_FOLDER_STORE (parent), NULL); g_return_val_if_fail (name, NULL); priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self); /* Check for already existing folder */ - tny_folder_store_query_add_item (query, name, TNY_FOLDER_STORE_QUERY_OPTION_MATCH_ON_NAME); - tny_folder_store_get_folders (parent, list, query, NULL); - g_object_unref (G_OBJECT (query)); - - if (tny_list_get_length (list) > 0) { + if (modest_tny_folder_has_subfolder_with_name (parent, name)) { priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED; g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR, MODEST_MAIL_OPERATION_ERROR_FOLDER_EXISTS, _CS("ckdg_ib_folder_already_exists")); } - g_object_unref (G_OBJECT (list)); - /* Check parent */ if (TNY_IS_FOLDER (parent)) { /* Check folder rules */ @@ -1645,6 +1657,9 @@ modest_mail_operation_remove_folder (ModestMailOperation *self, tny_folder_store_remove_folder (parent, folder, &(priv->error)); CHECK_EXCEPTION (priv, MODEST_MAIL_OPERATION_STATUS_FAILED); + if (!priv->error) + priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS; + if (parent) g_object_unref (G_OBJECT (parent)); } @@ -1693,7 +1708,8 @@ transfer_folder_status_cb (GObject *obj, static void -transfer_folder_cb (TnyFolder *folder, gboolean cancelled, +transfer_folder_cb (TnyFolder *folder, + gboolean cancelled, TnyFolderStore *into, TnyFolder *new_folder, GError *err, @@ -1777,13 +1793,38 @@ new_name_valid_if_local_account (ModestMailOperationPrivate *priv, new_name)) { priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED; g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR, - MODEST_MAIL_OPERATION_ERROR_FOLDER_RULES, - _("FIXME: folder name already in use")); + MODEST_MAIL_OPERATION_ERROR_FOLDER_EXISTS, + _("ckdg_ib_folder_already_exists")); return FALSE; } else 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, @@ -1795,11 +1836,20 @@ modest_mail_operation_xfer_folder (ModestMailOperation *self, ModestMailOperationPrivate *priv = NULL; ModestTnyFolderRules parent_rules = 0, rules; XFerMsgAsyncHelper *helper = NULL; + const gchar *folder_name = NULL; + const gchar *error_msg; 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); + + /* Set the error msg */ + error_msg = (delete_original) ? + _("mail_in_ui_folder_move_target_error") : + _("mail_in_ui_folder_copy_target_error"); /* Get account and set it into mail_operation */ priv->account = modest_tny_folder_get_account (TNY_FOLDER(folder)); @@ -1814,52 +1864,85 @@ 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, MODEST_MAIL_OPERATION_ERROR_FOLDER_RULES, - _("mail_in_ui_folder_move_target_error")); + error_msg); /* 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, MODEST_MAIL_OPERATION_ERROR_FOLDER_RULES, - _("FIXME: parent folder does not accept new folders")); + error_msg); /* 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, + error_msg); + + /* 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, + error_msg); + + /* 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), - delete_original, - transfer_folder_cb, - transfer_folder_status_cb, - helper); - } else { - modest_mail_operation_notify_end (self); - } - } + + /* 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); + } 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); + } + } void @@ -2323,7 +2406,8 @@ modest_mail_operation_get_msgs_full (ModestMailOperation *self, void -modest_mail_operation_remove_msg (ModestMailOperation *self, TnyHeader *header, +modest_mail_operation_remove_msg (ModestMailOperation *self, + TnyHeader *header, gboolean remove_to_trash /*ignored*/) { TnyFolder *folder; @@ -2345,21 +2429,78 @@ modest_mail_operation_remove_msg (ModestMailOperation *self, TnyHeader *header, /* remove message from folder */ tny_folder_remove_msg (folder, header, &(priv->error)); -/* if (!priv->error) { */ -/* tny_header_set_flags (header, TNY_HEADER_FLAG_DELETED); */ -/* tny_header_set_flags (header, TNY_HEADER_FLAG_SEEN); */ + if (!priv->error) { + tny_header_set_flags (header, TNY_HEADER_FLAG_DELETED); + tny_header_set_flags (header, TNY_HEADER_FLAG_SEEN); + + if (TNY_IS_CAMEL_IMAP_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 */ + } + + + /* Set status */ + if (!priv->error) + priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS; + else + priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED; + + /* Free */ + g_object_unref (G_OBJECT (folder)); + + /* Notify about operation end */ + modest_mail_operation_notify_end (self); +} + +void +modest_mail_operation_remove_msgs (ModestMailOperation *self, + TnyList *headers, + gboolean remove_to_trash /*ignored*/) +{ + TnyFolder *folder; + ModestMailOperationPrivate *priv; + TnyIterator *iter = NULL; + TnyHeader *header = NULL; + + g_return_if_fail (MODEST_IS_MAIL_OPERATION (self)); + g_return_if_fail (TNY_IS_LIST (headers)); + + if (remove_to_trash) + g_warning ("remove to trash is not implemented"); + + priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self); -/* if (TNY_IS_CAMEL_IMAP_FOLDER (folder)) */ + /* Get folder from first header and sync it */ + iter = tny_list_create_iterator (headers); + header = TNY_HEADER (tny_iterator_get_current (iter)); + folder = tny_header_get_folder (header); + + /* Get account and set it into mail_operation */ + priv->account = modest_tny_folder_get_account (TNY_FOLDER(folder)); + + priv->status = MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS; + + /* remove message from folder */ + tny_folder_remove_msgs (folder, headers, &(priv->error)); + if (!priv->error) { + if (TNY_IS_CAMEL_IMAP_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 (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 (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 *\\/ *\/ */ -/* } */ + tny_folder_sync (folder, TRUE, &(priv->error)); /* TRUE --> expunge */ + } /* Set status */ @@ -2369,12 +2510,15 @@ modest_mail_operation_remove_msg (ModestMailOperation *self, TnyHeader *header, priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED; /* Free */ + g_object_unref (header); + g_object_unref (iter); g_object_unref (G_OBJECT (folder)); /* Notify about operation end */ modest_mail_operation_notify_end (self); } + static void transfer_msgs_status_cb (GObject *obj, TnyStatus *status, @@ -2440,6 +2584,10 @@ transfer_msgs_cb (TnyFolder *folder, gboolean cancelled, GError *err, gpointer u } else { priv->done = 1; priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS; + + /* Update folder counts */ + tny_folder_poke_status (folder); + tny_folder_poke_status (helper->dest_folder); } @@ -2620,10 +2768,7 @@ on_refresh_folder (TnyFolder *folder, /* This is not a GDK lock because we are a Tinymail callback and * Tinymail already acquires the Gdk lock */ - - /* no gdk_threads_enter (), CHECKED */ helper->user_callback (self, folder, helper->user_data); - /* no gdk_threads_leave (), CHECKED */ } out: @@ -2662,13 +2807,8 @@ on_refresh_folder_status_update (GObject *obj, /* This is not a GDK lock because we are a Tinymail callback and * Tinymail already acquires the Gdk lock */ - - /* no gdk_threads_enter (), CHECKED */ - g_signal_emit (G_OBJECT (self), signals[PROGRESS_CHANGED_SIGNAL], 0, state, NULL); - /* no gdk_threads_leave (), CHECKED */ - g_slice_free (ModestMailOperationState, state); }