X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fmodest-mail-operation.c;h=61eead70372cc417a24d699ee084c398c7da3791;hb=57fb79e53b6a84302f1f8d775b136d85e9301169;hp=d1a0e13a4faf52ed3782a51d5110787c7c7372d0;hpb=0fdbbf3fb1f46a38a41104ae435e7e745fa5177f;p=modest diff --git a/src/modest-mail-operation.c b/src/modest-mail-operation.c index d1a0e13..61eead7 100644 --- a/src/modest-mail-operation.c +++ b/src/modest-mail-operation.c @@ -231,6 +231,7 @@ static void modest_mail_operation_create_msg (ModestMailOperation *self const gchar *html_body, const GList *attachments_list, const GList *images_list, TnyHeaderFlags priority_flags, + const gchar *references, const gchar *in_reply_to, ModestMailOperationCreateMsgCallback callback, gpointer userdata); @@ -243,6 +244,8 @@ typedef struct gchar *cc; gchar *bcc; gchar *subject; + gchar *references; + gchar *in_reply_to; gchar *plain_body; gchar *html_body; GList *attachments_list; @@ -828,12 +831,16 @@ create_msg_thread (gpointer thread_data) priv = MODEST_MAIL_OPERATION_GET_PRIVATE(info->mail_op); if (info->html_body == NULL) { new_msg = modest_tny_msg_new (info->to, info->from, info->cc, - info->bcc, info->subject, info->plain_body, + info->bcc, info->subject, + info->references, info->in_reply_to, + info->plain_body, info->attachments_list, &attached, &(priv->error)); } else { new_msg = modest_tny_msg_new_html_plain (info->to, info->from, info->cc, - info->bcc, info->subject, info->html_body, + info->bcc, info->subject, + info->references, info->in_reply_to, + info->html_body, info->plain_body, info->attachments_list, info->images_list, &attached, &(priv->error)); @@ -867,6 +874,8 @@ create_msg_thread (gpointer thread_data) g_free (info->plain_body); g_free (info->html_body); g_free (info->subject); + g_free (info->references); + g_free (info->in_reply_to); g_list_foreach (info->attachments_list, (GFunc) g_object_unref, NULL); g_list_free (info->attachments_list); g_list_foreach (info->images_list, (GFunc) g_object_unref, NULL); @@ -900,6 +909,8 @@ modest_mail_operation_create_msg (ModestMailOperation *self, const GList *attachments_list, const GList *images_list, TnyHeaderFlags priority_flags, + const gchar *references, + const gchar *in_reply_to, ModestMailOperationCreateMsgCallback callback, gpointer userdata) { @@ -915,6 +926,8 @@ modest_mail_operation_create_msg (ModestMailOperation *self, info->subject = g_strdup (subject); info->plain_body = g_strdup (plain_body); info->html_body = g_strdup (html_body); + info->references = g_strdup (references); + info->in_reply_to = g_strdup (in_reply_to); info->attachments_list = g_list_copy ((GList *) attachments_list); g_list_foreach (info->attachments_list, (GFunc) g_object_ref, NULL); info->images_list = g_list_copy ((GList *) images_list); @@ -1074,6 +1087,8 @@ modest_mail_operation_send_new_mail (ModestMailOperation *self, const gchar *html_body, const GList *attachments_list, const GList *images_list, + const gchar *references, + const gchar *in_reply_to, TnyHeaderFlags priority_flags) { ModestMailOperationPrivate *priv = NULL; @@ -1110,6 +1125,7 @@ modest_mail_operation_send_new_mail (ModestMailOperation *self, modest_mail_operation_create_msg (self, from, to, cc, bcc, subject, plain_body, html_body, attachments_list, images_list, priority_flags, + references, in_reply_to, modest_mail_operation_send_new_mail_cb, info); } @@ -1232,16 +1248,18 @@ modest_mail_operation_save_to_drafts_cb (ModestMailOperation *self, } if (!priv->error || priv->error->code == MODEST_MAIL_OPERATION_ERROR_FILE_IO) { - SaveToDraftsAddMsgInfo *cb_info = g_slice_new(SaveToDraftsAddMsgInfo); - cb_info->transport_account = g_object_ref(info->transport_account); - cb_info->draft_msg = info->draft_msg ? g_object_ref(info->draft_msg) : NULL; - cb_info->callback = info->callback; - cb_info->user_data = info->user_data; - cb_info->drafts = g_object_ref(drafts); - cb_info->msg = g_object_ref(msg); - cb_info->mailop = g_object_ref(self); - tny_folder_add_msg_async(drafts, msg, modest_mail_operation_save_to_drafts_add_msg_cb, - NULL, cb_info); + if (drafts) { + SaveToDraftsAddMsgInfo *cb_info = g_slice_new(SaveToDraftsAddMsgInfo); + cb_info->transport_account = g_object_ref(info->transport_account); + cb_info->draft_msg = info->draft_msg ? g_object_ref(info->draft_msg) : NULL; + cb_info->callback = info->callback; + cb_info->user_data = info->user_data; + cb_info->drafts = g_object_ref(drafts); + cb_info->msg = g_object_ref(msg); + cb_info->mailop = g_object_ref(self); + tny_folder_add_msg_async(drafts, msg, modest_mail_operation_save_to_drafts_add_msg_cb, + NULL, cb_info); + } } else { /* Call the user callback */ priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED; @@ -1270,6 +1288,8 @@ modest_mail_operation_save_to_drafts (ModestMailOperation *self, const GList *attachments_list, const GList *images_list, TnyHeaderFlags priority_flags, + const gchar *references, + const gchar *in_reply_to, SaveToDraftstCallback callback, gpointer user_data) { @@ -1295,6 +1315,7 @@ modest_mail_operation_save_to_drafts (ModestMailOperation *self, modest_mail_operation_notify_start (self); modest_mail_operation_create_msg (self, from, to, cc, bcc, subject, plain_body, html_body, attachments_list, images_list, priority_flags, + references, in_reply_to, modest_mail_operation_save_to_drafts_cb, info); } @@ -1433,13 +1454,16 @@ update_account_send_mail (UpdateAccountInfo *info) g_warning ("%s: could not get outbox", __FUNCTION__); num_messages = 0; } - + if (num_messages != 0) { + ModestMailOperation *mail_op; /* Reenable suspended items */ - modest_tny_send_queue_wakeup (MODEST_TNY_SEND_QUEUE (send_queue)); - + mail_op = modest_mail_operation_new (NULL); + modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), + mail_op); + modest_mail_operation_queue_wakeup (mail_op, MODEST_TNY_SEND_QUEUE (send_queue)); + /* Try to send */ - tny_camel_send_queue_flush (TNY_CAMEL_SEND_QUEUE (send_queue)); modest_tny_send_queue_set_requested_send_receive (MODEST_TNY_SEND_QUEUE (send_queue), info->interactive); } @@ -1556,7 +1580,8 @@ inbox_refreshed_cb (TnyFolder *inbox, MODEST_MAIL_OPERATION_ERROR_OPERATION_CANCELED, "canceled"); - tny_folder_remove_observer (inbox, info->inbox_observer); + if (inbox) + tny_folder_remove_observer (inbox, info->inbox_observer); g_object_unref (info->inbox_observer); info->inbox_observer = NULL; @@ -1593,7 +1618,7 @@ inbox_refreshed_cb (TnyFolder *inbox, /* Apply per-message size limits */ if (tny_header_get_message_size (header) < max_size) g_ptr_array_add (new_headers_array, g_object_ref (header)); - + g_object_unref (header); tny_iterator_next (new_headers_iter); } @@ -1613,14 +1638,14 @@ inbox_refreshed_cb (TnyFolder *inbox, retrieve_limit = modest_account_mgr_get_retrieve_limit (mgr, info->account_name); if (retrieve_limit == 0) retrieve_limit = G_MAXINT; - + /* Get per-account retrieval type */ retrieve_type = modest_account_mgr_get_retrieve_type (mgr, info->account_name); headers_only = (retrieve_type == MODEST_ACCOUNT_RETRIEVE_HEADERS_ONLY); /* Order by date */ g_ptr_array_sort (new_headers_array, (GCompareFunc) compare_headers_by_date); - + /* Ask the users if they want to retrieve all the messages even though the limit was exceeded */ ignore_limit = FALSE; @@ -1643,7 +1668,7 @@ 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); - + if (!headers_only && (tny_list_get_length (new_headers) > 0)) { gint msg_num = 0; TnyIterator *iter; @@ -1664,16 +1689,16 @@ inbox_refreshed_cb (TnyFolder *inbox, msg_info->more_msgs = g_object_ref (iter); msg_info->user_data = info; - while ((msg_num < priv->total ) && !tny_iterator_is_done (iter)) { + while ((msg_num < priv->total ) && !tny_iterator_is_done (iter)) { TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter)); TnyFolder *folder = tny_header_get_folder (header); /* Get message in an async way */ - tny_folder_get_msg_async (folder, header, update_account_get_msg_async_cb, + tny_folder_get_msg_async (folder, header, update_account_get_msg_async_cb, NULL, msg_info); g_object_unref (folder); - + msg_num++; tny_iterator_next (iter); } @@ -1687,11 +1712,11 @@ inbox_refreshed_cb (TnyFolder *inbox, /* If we don't have to retrieve the new messages then simply send mail */ update_account_send_mail (info); - + /* Check if the operation was a success */ if (!priv->error) priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS; - + /* Call the user callback and free */ update_account_notify_user_and_free (info, new_headers); } @@ -1963,9 +1988,9 @@ compare_headers_by_date (gconstpointer a, /* We want the most recent ones (greater time_t) at the beginning */ if (sent1 < sent2) - return 1; - else return -1; + else + return 1; } @@ -2188,7 +2213,6 @@ transfer_folder_status_cb (GObject *obj, g_slice_free (ModestMailOperationState, state); } - static void transfer_folder_cb (TnyFolder *folder, gboolean cancelled, @@ -2202,7 +2226,7 @@ transfer_folder_cb (TnyFolder *folder, ModestMailOperationPrivate *priv = NULL; helper = (XFerFolderAsyncHelper *) user_data; - g_return_if_fail (helper != NULL); + g_return_if_fail (helper != NULL); self = helper->mail_op; priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self); @@ -2221,7 +2245,13 @@ transfer_folder_cb (TnyFolder *folder, priv->done = 1; priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS; } - + + /* Update state of new folder */ + if (new_folder) { + tny_folder_refresh_async (new_folder, NULL, NULL, NULL); + tny_folder_poke_status (new_folder); + } + /* Notify about operation end */ modest_mail_operation_notify_end (self); @@ -2569,11 +2599,10 @@ get_msg_async_cb (TnyFolder *folder, priv->status = MODEST_MAIL_OPERATION_STATUS_CANCELED; } else if (err) { priv->status = MODEST_MAIL_OPERATION_STATUS_FINISHED_WITH_ERRORS; - if (err) { - priv->error = g_error_copy ((const GError *) err); + priv->error = g_error_copy ((const GError *) err); + if (priv->error) { priv->error->domain = MODEST_MAIL_OPERATION_ERROR; - } - if (!priv->error) { + } else { g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR, MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND, err->message); @@ -3419,6 +3448,46 @@ modest_mail_operation_run_queue (ModestMailOperation *self, } static void +queue_wakeup_callback (ModestTnySendQueue *queue, + gboolean cancelled, + GError *error, + gpointer userdata) +{ + ModestMailOperation *mail_op; + ModestMailOperationPrivate *priv; + + mail_op = (ModestMailOperation *) userdata; + priv = MODEST_MAIL_OPERATION_GET_PRIVATE (mail_op); + + priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS; + tny_camel_send_queue_flush (TNY_CAMEL_SEND_QUEUE (queue)); + + /* Notify end */ + modest_mail_operation_notify_end (mail_op); + g_object_unref (mail_op); +} + +void +modest_mail_operation_queue_wakeup (ModestMailOperation *self, + ModestTnySendQueue *queue) +{ + ModestMailOperationPrivate *priv; + + g_return_if_fail (MODEST_IS_MAIL_OPERATION (self)); + g_return_if_fail (MODEST_IS_TNY_SEND_QUEUE (queue)); + priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self); + + priv->status = MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS; + priv->account = TNY_ACCOUNT (tny_camel_send_queue_get_transport_account (TNY_CAMEL_SEND_QUEUE (queue))); + priv->op_type = MODEST_MAIL_OPERATION_TYPE_QUEUE_WAKEUP; + + g_object_ref (self); + + modest_tny_send_queue_wakeup (queue, queue_wakeup_callback, self); + modest_mail_operation_notify_start (self); +} + +static void shutdown_callback (ModestTnyAccountStore *account_store, gpointer userdata) { ModestMailOperation *self = (ModestMailOperation *) userdata;