X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fmodest-mail-operation.c;h=79d9c47c755dff185757d2c8638a1bf7c22c1e9e;hb=8b29e39e9d8eca23c2e08ba43232a7c6785d6f72;hp=30f1a57e7c36a9b067447974358c3f5dba1b8689;hpb=f34695cc046a41df511b47a38e043679560893f4;p=modest diff --git a/src/modest-mail-operation.c b/src/modest-mail-operation.c index 30f1a57..79d9c47 100644 --- a/src/modest-mail-operation.c +++ b/src/modest-mail-operation.c @@ -45,6 +45,7 @@ #include #include #include +#include #include "modest-platform.h" #include "modest-account-mgr-helpers.h" #include @@ -1231,16 +1232,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; @@ -1329,8 +1332,7 @@ G_DEFINE_TYPE_WITH_CODE (InternalFolderObserver, static void foreach_add_item (gpointer header, gpointer user_data) { - tny_list_prepend (TNY_LIST (user_data), - G_OBJECT (header)); + tny_list_append (TNY_LIST (user_data), G_OBJECT (header)); } /* This is the method that looks for new messages in a folder */ @@ -1411,9 +1413,9 @@ update_account_send_mail (UpdateAccountInfo *info) return; /* Get the transport account */ - transport_account = (TnyTransportAccount *) - modest_tny_account_store_get_transport_account_for_open_connection (account_store, - info->account_name); + transport_account = (TnyTransportAccount *) + modest_tny_account_store_get_server_account (account_store, info->account_name, + TNY_ACCOUNT_TYPE_TRANSPORT); if (transport_account) { ModestTnySendQueue *send_queue; @@ -1433,13 +1435,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); } @@ -1536,7 +1541,7 @@ inbox_refreshed_cb (TnyFolder *inbox, UpdateAccountInfo *info; ModestMailOperationPrivate *priv; TnyIterator *new_headers_iter; - GPtrArray *new_headers_array = NULL; + GPtrArray *new_headers_array = NULL; gint max_size, retrieve_limit, i; ModestAccountMgr *mgr; ModestAccountRetrieveType retrieve_type; @@ -1547,9 +1552,6 @@ inbox_refreshed_cb (TnyFolder *inbox, priv = MODEST_MAIL_OPERATION_GET_PRIVATE (info->mail_op); mgr = modest_runtime_get_account_mgr (); - /* Set the last updated as the current time, do it even if the inbox refresh failed */ - modest_account_mgr_set_last_updated (mgr, tny_account_get_id (priv->account), time (NULL)); - if (canceled || err) { priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED; if (err) @@ -1559,7 +1561,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; @@ -1573,6 +1576,9 @@ inbox_refreshed_cb (TnyFolder *inbox, goto send_mail; } + /* Set the last updated as the current time */ + modest_account_mgr_set_last_updated (mgr, tny_account_get_id (priv->account), time (NULL)); + /* Get the message max size */ max_size = modest_conf_get_int (modest_runtime_get_conf (), MODEST_CONF_MSG_SIZE_LIMIT, NULL); @@ -1593,7 +1599,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 +1619,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 +1649,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 +1670,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 +1693,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 +1969,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 +2194,6 @@ transfer_folder_status_cb (GObject *obj, g_slice_free (ModestMailOperationState, state); } - static void transfer_folder_cb (TnyFolder *folder, gboolean cancelled, @@ -2202,7 +2207,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 +2226,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); @@ -3419,6 +3430,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;