X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-mail-operation.c;h=d7b24ce7def6b6c4ce50945168ddce99420b5caa;hp=0b68327bbd3fa8f4baf0fb43f0c42d0038e63f42;hb=12c8ed43dedce8fb9a7ceb0061152cdd8d10ee08;hpb=485870760ff8f682e2d2cb76f9772306be45e230 diff --git a/src/modest-mail-operation.c b/src/modest-mail-operation.c index 0b68327..d7b24ce 100644 --- a/src/modest-mail-operation.c +++ b/src/modest-mail-operation.c @@ -388,6 +388,8 @@ void modest_mail_operation_execute_error_handler (ModestMailOperation *self) { ModestMailOperationPrivate *priv; + + g_return_if_fail (self && MODEST_IS_MAIL_OPERATION(self)); priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self); g_return_if_fail(priv->status != MODEST_MAIL_OPERATION_STATUS_SUCCESS); @@ -403,6 +405,9 @@ modest_mail_operation_get_type_operation (ModestMailOperation *self) { ModestMailOperationPrivate *priv; + g_return_val_if_fail (self && MODEST_IS_MAIL_OPERATION(self), + MODEST_MAIL_OPERATION_TYPE_UNKNOWN); + priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self); return priv->op_type; @@ -414,6 +419,9 @@ modest_mail_operation_is_mine (ModestMailOperation *self, { ModestMailOperationPrivate *priv; + g_return_val_if_fail (self && MODEST_IS_MAIL_OPERATION(self), + FALSE); + priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self); if (priv->source == NULL) return FALSE; @@ -425,7 +433,8 @@ modest_mail_operation_get_source (ModestMailOperation *self) { ModestMailOperationPrivate *priv; - g_return_val_if_fail (self, NULL); + g_return_val_if_fail (self && MODEST_IS_MAIL_OPERATION(self), + NULL); priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self); if (!priv) { @@ -477,8 +486,8 @@ modest_mail_operation_cancel (ModestMailOperation *self) { ModestMailOperationPrivate *priv; gboolean canceled = FALSE; - - g_return_val_if_fail (MODEST_IS_MAIL_OPERATION (self), FALSE); + + g_return_val_if_fail (self && MODEST_IS_MAIL_OPERATION (self), FALSE); priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self); @@ -513,8 +522,9 @@ modest_mail_operation_get_task_done (ModestMailOperation *self) { ModestMailOperationPrivate *priv; - g_return_val_if_fail (MODEST_IS_MAIL_OPERATION (self), 0); - + g_return_val_if_fail (self && MODEST_IS_MAIL_OPERATION(self), + 0); + priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self); return priv->done; } @@ -524,7 +534,8 @@ modest_mail_operation_get_task_total (ModestMailOperation *self) { ModestMailOperationPrivate *priv; - g_return_val_if_fail (MODEST_IS_MAIL_OPERATION (self), 0); + g_return_val_if_fail (self && MODEST_IS_MAIL_OPERATION(self), + 0); priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self); return priv->total; @@ -536,11 +547,9 @@ modest_mail_operation_is_finished (ModestMailOperation *self) ModestMailOperationPrivate *priv; gboolean retval = FALSE; - if (!MODEST_IS_MAIL_OPERATION (self)) { - g_warning ("%s: invalid parametter", G_GNUC_FUNCTION); - return retval; - } - + g_return_val_if_fail (self && MODEST_IS_MAIL_OPERATION(self), + FALSE); + priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self); if (priv->status == MODEST_MAIL_OPERATION_STATUS_SUCCESS || @@ -603,9 +612,9 @@ modest_mail_operation_send_mail (ModestMailOperation *self, ModestMailOperationPrivate *priv; SendMsgInfo *info; - g_return_if_fail (MODEST_IS_MAIL_OPERATION (self)); - g_return_if_fail (TNY_IS_TRANSPORT_ACCOUNT (transport_account)); - g_return_if_fail (TNY_IS_MSG (msg)); + g_return_if_fail (self && MODEST_IS_MAIL_OPERATION (self)); + g_return_if_fail (transport_account && TNY_IS_TRANSPORT_ACCOUNT (transport_account)); + g_return_if_fail (msg && TNY_IS_MSG (msg)); priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self); @@ -648,16 +657,14 @@ static void common_send_mail_operation_end (TnySendQueue *queue, TnyMsg *msg, SendMsgInfo *info) { - if (msg == info->msg) { - g_signal_handler_disconnect (queue, info->msg_sent_handler); - info->msg_sent_handler = 0; - g_signal_handler_disconnect (queue, info->error_happened_handler); - info->error_happened_handler = 0; - g_object_unref (info->msg); - modest_mail_operation_notify_end (info->mail_op); - g_object_unref (info->mail_op); - g_slice_free (SendMsgInfo, info); - } + g_signal_handler_disconnect (queue, info->msg_sent_handler); + g_signal_handler_disconnect (queue, info->error_happened_handler); + + g_object_unref (info->msg); + modest_mail_operation_notify_end (info->mail_op); + g_object_unref (info->mail_op); + + g_slice_free (SendMsgInfo, info); } static void @@ -665,13 +672,23 @@ send_mail_msg_sent_handler (TnySendQueue *queue, TnyHeader *header, TnyMsg *msg, guint nth, guint total, gpointer userdata) { SendMsgInfo *info = (SendMsgInfo *) userdata; - - if (msg == info->msg) { + TnyHeader *hdr1, *hdr2; + const char *msgid1, *msgid2; + hdr1 = tny_msg_get_header(msg); + hdr2 = tny_msg_get_header(info->msg); + msgid1 = tny_header_get_message_id(hdr1); + msgid2 = tny_header_get_message_id(hdr2); + if (msgid1 == NULL) msgid1 = "(null)"; + if (msgid2 == NULL) msgid2 = "(null)"; + + if (!strcmp (msgid1, msgid2)) { ModestMailOperationPrivate *priv = MODEST_MAIL_OPERATION_GET_PRIVATE (info->mail_op); priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS; + + common_send_mail_operation_end (queue, msg, info); } - - common_send_mail_operation_end (queue, msg, info); + g_object_unref(G_OBJECT(hdr1)); + g_object_unref(G_OBJECT(hdr2)); } static void @@ -679,16 +696,27 @@ send_mail_error_happened_handler (TnySendQueue *queue, TnyHeader *header, TnyMsg GError *error, gpointer userdata) { SendMsgInfo *info = (SendMsgInfo *) userdata; - - if (msg == info->msg) { + TnyHeader *hdr1, *hdr2; + const char *msgid1, *msgid2; + + hdr1 = tny_msg_get_header(msg); + hdr2 = tny_msg_get_header(info->msg); + msgid1 = tny_header_get_message_id(hdr1); + msgid2 = tny_header_get_message_id(hdr2); + if (msgid1 == NULL) msgid1 = "(null)"; + if (msgid2 == NULL) msgid2 = "(null)"; + + if (!strcmp (msgid1, msgid2)) { ModestMailOperationPrivate *priv = MODEST_MAIL_OPERATION_GET_PRIVATE (info->mail_op); priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED; g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR, MODEST_MAIL_OPERATION_ERROR_OPERATION_CANCELED, "modest: send mail failed\n"); + + common_send_mail_operation_end (queue, msg, info); } - - common_send_mail_operation_end (queue, msg, info); + g_object_unref(G_OBJECT(hdr1)); + g_object_unref(G_OBJECT(hdr2)); } @@ -908,7 +936,8 @@ modest_mail_operation_send_new_mail (ModestMailOperation *self, priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self); priv->op_type = MODEST_MAIL_OPERATION_TYPE_SEND; priv->account = TNY_ACCOUNT (g_object_ref (transport_account)); - + priv->status = MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS; + /* Check parametters */ if (to == NULL) { /* Set status failed and set an error */ @@ -1202,6 +1231,7 @@ typedef struct gboolean poke_all; TnyFolderObserver *inbox_observer; guint update_timeout; + RetrieveAllCallback retrieve_all_cb; } UpdateAccountInfo; @@ -1248,9 +1278,9 @@ inbox_refreshed_cb (TnyFolder *inbox, GPtrArray *new_headers_array = NULL; gint max_size, retrieve_limit, i; ModestAccountMgr *mgr; - gchar *retrieve_type = NULL; + ModestAccountRetrieveType retrieve_type; TnyList *new_headers = NULL; - gboolean headers_only; + gboolean headers_only, ignore_limit; TnyTransportAccount *transport_account; ModestTnySendQueue *send_queue; @@ -1291,6 +1321,9 @@ inbox_refreshed_cb (TnyFolder *inbox, g_object_unref (info->inbox_observer); info->inbox_observer = NULL; + /* Update the last updated key, even if we don't have to get new headers */ + modest_account_mgr_set_last_updated (mgr, tny_account_get_id (priv->account), time (NULL)); + if (new_headers_array->len == 0) goto send_mail; @@ -1301,17 +1334,23 @@ inbox_refreshed_cb (TnyFolder *inbox, /* Get per-account retrieval type */ retrieve_type = modest_account_mgr_get_retrieve_type (mgr, info->account_name); - headers_only = !g_ascii_strcasecmp (retrieve_type, MODEST_ACCOUNT_RETRIEVE_VALUE_HEADERS_ONLY); - g_free (retrieve_type); + headers_only = (retrieve_type == MODEST_ACCOUNT_RETRIEVE_HEADERS_ONLY); /* Order by date */ g_ptr_array_sort (new_headers_array, (GCompareFunc) compare_headers_by_date); - /* TODO: Ask the user, instead of just failing, - * showing mail_nc_msg_count_limit_exceeded, with 'Get - * all' and 'Newest only' buttons. */ + /* Ask the users if they want to retrieve all the messages + even though the limit was exceeded */ + ignore_limit = FALSE; if (new_headers_array->len > retrieve_limit) { - /* TODO */ + /* Ask the user if a callback has been specified and + if the mail operation has a source (this means that + was invoked by the user and not automatically by a + D-Bus method) */ + if (info->retrieve_all_cb && priv->source) + ignore_limit = info->retrieve_all_cb (priv->source, + new_headers_array->len, + retrieve_limit); } if (!headers_only) { @@ -1319,7 +1358,10 @@ inbox_refreshed_cb (TnyFolder *inbox, const gint msg_list_size = compute_message_array_size (new_headers_array); priv->done = 0; - priv->total = MIN (new_headers_array->len, retrieve_limit); + if (ignore_limit) + priv->total = new_headers_array->len; + else + priv->total = MIN (new_headers_array->len, retrieve_limit); while (msg_num < priv->total) { TnyHeader *header = TNY_HEADER (g_ptr_array_index (new_headers_array, msg_num)); TnyFolder *folder = tny_header_get_folder (header); @@ -1350,9 +1392,6 @@ inbox_refreshed_cb (TnyFolder *inbox, g_ptr_array_foreach (new_headers_array, (GFunc) g_object_unref, NULL); g_ptr_array_free (new_headers_array, FALSE); - /* Update the last updated key */ - modest_account_mgr_set_last_updated (mgr, tny_account_get_id (priv->account), time (NULL)); - send_mail: /* Send mails */ priv->done = 0; @@ -1509,6 +1548,7 @@ void modest_mail_operation_update_account (ModestMailOperation *self, const gchar *account_name, gboolean poke_all, + RetrieveAllCallback retrieve_all_cb, UpdateAccountCallback callback, gpointer user_data) { @@ -1543,6 +1583,7 @@ modest_mail_operation_update_account (ModestMailOperation *self, info->callback = callback; info->user_data = user_data; info->update_timeout = g_timeout_add (250, timeout_notify_progress, self); + info->retrieve_all_cb = retrieve_all_cb; /* Set account busy */ modest_account_mgr_set_account_busy (modest_runtime_get_account_mgr (), account_name, TRUE); @@ -1550,9 +1591,9 @@ modest_mail_operation_update_account (ModestMailOperation *self, /* Get all folders and continue in the callback */ folders = tny_simple_list_new (); - tny_folder_store_get_folders_async (TNY_FOLDER_STORE (store_account), - folders, recurse_folders_async_cb, - NULL, NULL, info); + tny_folder_store_get_folders_async (TNY_FOLDER_STORE (store_account), + folders, recurse_folders_async_cb, + NULL, NULL, info); } /* @@ -2272,16 +2313,32 @@ modest_mail_operation_remove_msg (ModestMailOperation *self, /* remove message from folder */ tny_folder_remove_msg (folder, header, &(priv->error)); if (!priv->error) { + gboolean expunge, leave_on_server; + const gchar *account_name; + TnyAccount *account; + tny_header_set_flag (header, TNY_HEADER_FLAG_DELETED); tny_header_set_flag (header, TNY_HEADER_FLAG_SEEN); modest_mail_operation_notify_start (self); - if (TNY_IS_CAMEL_IMAP_FOLDER (folder) || - TNY_IS_CAMEL_POP_FOLDER (folder)) - tny_folder_sync_async(folder, FALSE, NULL, NULL, NULL); /* FALSE --> dont expunge */ + /* Get leave on server setting */ + account = tny_folder_get_account (folder); + account_name = modest_tny_account_get_parent_modest_account_name_for_server_account (account); + leave_on_server = + modest_account_mgr_get_leave_on_server (modest_runtime_get_account_mgr (), + account_name); + + if (TNY_IS_CAMEL_POP_FOLDER (folder) && !leave_on_server) + expunge = TRUE; else - tny_folder_sync_async(folder, TRUE, NULL, NULL, NULL); /* TRUE --> expunge */ + expunge = FALSE; + + /* Sync folder */ + tny_folder_sync_async(folder, expunge, NULL, NULL, NULL); + + /* Unref */ + g_object_unref (account); }