X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fmodest-mail-operation.c;h=aa6de1cf6beee1a2ca9183a4bcdbaabeb7df1825;hb=4288a3ad29eb76bee6ab9477a7d72c52836efcf5;hp=2a627a7996f8101d83c54a50f252d213428808e1;hpb=3e060acfc9902bc0dc5e560c4b8ff35ced89d766;p=modest diff --git a/src/modest-mail-operation.c b/src/modest-mail-operation.c index 2a627a7..aa6de1c 100644 --- a/src/modest-mail-operation.c +++ b/src/modest-mail-operation.c @@ -71,6 +71,8 @@ static void get_msg_status_cb (GObject *obj, static void modest_mail_operation_notify_end (ModestMailOperation *self); +static gboolean did_a_cancel = FALSE; + enum _ModestMailOperationSignals { PROGRESS_CHANGED_SIGNAL, @@ -170,6 +172,7 @@ modest_mail_operation_class_init (ModestMailOperationClass *klass) NULL, NULL, g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); + } static void @@ -334,6 +337,8 @@ modest_mail_operation_cancel (ModestMailOperation *self) /* cancel current operation in account */ tny_account_cancel (priv->account); + did_a_cancel = TRUE; + /* Set new status */ priv->status = MODEST_MAIL_OPERATION_STATUS_CANCELED; @@ -473,6 +478,7 @@ modest_mail_operation_send_mail (ModestMailOperation *self, void modest_mail_operation_send_new_mail (ModestMailOperation *self, TnyTransportAccount *transport_account, + TnyMsg *draft_msg, const gchar *from, const gchar *to, const gchar *cc, const gchar *bcc, const gchar *subject, const gchar *plain_body, @@ -481,6 +487,8 @@ modest_mail_operation_send_new_mail (ModestMailOperation *self, TnyHeaderFlags priority_flags) { TnyMsg *new_msg = NULL; + TnyFolder *folder = NULL; + TnyHeader *header = NULL; ModestMailOperationPrivate *priv = NULL; g_return_if_fail (MODEST_IS_MAIL_OPERATION (self)); @@ -511,12 +519,24 @@ modest_mail_operation_send_new_mail (ModestMailOperation *self, return; } - /* TODO: add priority handling. It's received in the priority_flags operator, and - it should have effect in the sending operation */ + /* Set priority flags in message */ + header = tny_msg_get_header (new_msg); + tny_header_set_flags (header, priority_flags); /* Call mail operation */ modest_mail_operation_send_mail (self, transport_account, new_msg); + folder = modest_tny_account_get_special_folder (TNY_ACCOUNT (transport_account), TNY_FOLDER_TYPE_DRAFTS); + if (folder) { + if (draft_msg != NULL) { + header = tny_msg_get_header (draft_msg); + /* Note: This can fail (with a warning) if the message is not really already in a folder, + * because this function requires it to have a UID. */ + tny_folder_remove_msg (folder, header, NULL); + g_object_unref (header); + } + } + /* Free */ g_object_unref (G_OBJECT (new_msg)); } @@ -524,6 +544,7 @@ modest_mail_operation_send_new_mail (ModestMailOperation *self, void modest_mail_operation_save_to_drafts (ModestMailOperation *self, TnyTransportAccount *transport_account, + TnyMsg *draft_msg, const gchar *from, const gchar *to, const gchar *cc, const gchar *bcc, const gchar *subject, const gchar *plain_body, @@ -533,6 +554,7 @@ modest_mail_operation_save_to_drafts (ModestMailOperation *self, { TnyMsg *msg = NULL; TnyFolder *folder = NULL; + TnyHeader *header = NULL; ModestMailOperationPrivate *priv = NULL; g_return_if_fail (MODEST_IS_MAIL_OPERATION (self)); @@ -555,6 +577,10 @@ modest_mail_operation_save_to_drafts (ModestMailOperation *self, goto end; } + /* add priority flags */ + header = tny_msg_get_header (msg); + tny_header_set_flags (header, priority_flags); + folder = modest_tny_account_get_special_folder (TNY_ACCOUNT (transport_account), TNY_FOLDER_TYPE_DRAFTS); if (!folder) { g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR, @@ -562,6 +588,12 @@ modest_mail_operation_save_to_drafts (ModestMailOperation *self, "modest: failed to create a new msg\n"); goto end; } + + if (draft_msg != NULL) { + header = tny_msg_get_header (draft_msg); + tny_folder_remove_msg (folder, header, NULL); + g_object_unref (header); + } tny_folder_add_msg (folder, msg, &(priv->error)); if (priv->error) @@ -746,6 +778,9 @@ static gboolean notify_update_account_queue (gpointer data) { ModestMailOperation *mail_op = MODEST_MAIL_OPERATION (data); + ModestMailOperationPrivate *priv = NULL; + + priv = MODEST_MAIL_OPERATION_GET_PRIVATE(mail_op); modest_mail_operation_notify_end (mail_op); g_object_unref (mail_op); @@ -774,6 +809,21 @@ compare_headers_by_date (gconstpointer a, return -1; } +static gboolean +set_last_updated_idle (gpointer data) +{ + /* It does not matter if the time is not exactly the same than + the time when this idle was called, it's just an + approximation and it won't be very different */ + modest_account_mgr_set_int (modest_runtime_get_account_mgr (), + (gchar *) data, + MODEST_ACCOUNT_LAST_UPDATED, + time(NULL), + TRUE); + + return FALSE; +} + static gpointer update_account_thread (gpointer thr_user_data) { @@ -785,6 +835,7 @@ update_account_thread (gpointer thr_user_data) ModestMailOperationPrivate *priv; ModestTnySendQueue *send_queue; + info = (UpdateAccountInfo *) thr_user_data; priv = MODEST_MAIL_OPERATION_GET_PRIVATE(info->mail_op); @@ -825,7 +876,8 @@ update_account_thread (gpointer thr_user_data) /* Refresh folders */ new_headers = g_ptr_array_new (); iter = tny_list_create_iterator (all_folders); - while (!tny_iterator_is_done (iter) && !priv->error) { + + while (!tny_iterator_is_done (iter) && !priv->error && !did_a_cancel) { InternalFolderObserver *observer; TnyFolderStore *folder = TNY_FOLDER_STORE (tny_iterator_get_current (iter)); @@ -843,13 +895,14 @@ update_account_thread (gpointer thr_user_data) * We use the blocking version, because we are already in a separate * thread. */ - tny_folder_refresh (TNY_FOLDER (folder), &(priv->error)); - /* If the retrieve type is headers only do nothing more */ if (!g_ascii_strcasecmp (info->retrieve_type, MODEST_ACCOUNT_RETRIEVE_VALUE_MESSAGES) || !g_ascii_strcasecmp (info->retrieve_type, MODEST_ACCOUNT_RETRIEVE_VALUE_MESSAGES_AND_ATTACHMENTS)) { TnyIterator *iter; + /* If the retrieve type is full messages, refresh and get the messages */ + tny_folder_refresh (TNY_FOLDER (folder), &(priv->error)); + iter = tny_list_create_iterator (observer->new_headers); while (!tny_iterator_is_done (iter)) { TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter)); @@ -866,7 +919,8 @@ update_account_thread (gpointer thr_user_data) tny_iterator_next (iter); } g_object_unref (iter); - } + } else /* If it's headers only, then just poke the folder status (this will update the unread and total count of folder observers, like the folder list model*/ + tny_folder_poke_status (TNY_FOLDER (folder)); tny_folder_remove_observer (TNY_FOLDER (folder), TNY_FOLDER_OBSERVER (observer)); g_object_unref (observer); @@ -878,6 +932,9 @@ update_account_thread (gpointer thr_user_data) g_object_unref (G_OBJECT (folder)); tny_iterator_next (iter); } + + did_a_cancel = FALSE; + g_object_unref (G_OBJECT (iter)); g_source_remove (timeout); @@ -959,11 +1016,10 @@ update_account_thread (gpointer thr_user_data) priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS; /* Update the last updated key */ - modest_account_mgr_set_int (modest_runtime_get_account_mgr (), - tny_account_get_id (TNY_ACCOUNT (info->account)), - MODEST_ACCOUNT_LAST_UPDATED, - time(NULL), - TRUE); + g_idle_add_full (G_PRIORITY_HIGH_IDLE, + set_last_updated_idle, + g_strdup (tny_account_get_id (TNY_ACCOUNT (info->account))), + (GDestroyNotify) g_free); } out: @@ -997,6 +1053,13 @@ modest_mail_operation_update_account (ModestMailOperation *self, g_return_val_if_fail (MODEST_IS_MAIL_OPERATION (self), FALSE); g_return_val_if_fail (account_name, FALSE); + /* Make sure that we have a connection, and request one + * if necessary: + * TODO: Is there some way to trigger this for every attempt to + * use the network? */ + if (!modest_platform_connect_and_wait(NULL)) + return FALSE; + /* Init mail operation. Set total and done to 0, and do not update them, this way the progress objects will know that we have no clue about the number of the objects */ @@ -1007,7 +1070,7 @@ modest_mail_operation_update_account (ModestMailOperation *self, /* Get the Modest account */ modest_account = (TnyStoreAccount *) - modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store (), + modest_tny_account_store_get_server_account (modest_runtime_get_account_store (), account_name, TNY_ACCOUNT_TYPE_STORE); @@ -1017,6 +1080,7 @@ modest_mail_operation_update_account (ModestMailOperation *self, MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND, "cannot get tny store account for %s\n", account_name); modest_mail_operation_notify_end (self); + return FALSE; } @@ -1031,6 +1095,7 @@ modest_mail_operation_update_account (ModestMailOperation *self, MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND, "cannot get tny transport account for %s\n", account_name); modest_mail_operation_notify_end (self); + return FALSE; } @@ -1059,7 +1124,7 @@ modest_mail_operation_update_account (ModestMailOperation *self, if (info->retrieve_limit == 0) info->retrieve_limit = G_MAXINT; - printf ("DEBUG: %s: info->retrieve_limit = %d\n", __FUNCTION__, info->retrieve_limit); + /* printf ("DEBUG: %s: info->retrieve_limit = %d\n", __FUNCTION__, info->retrieve_limit); */ thread = g_thread_create (update_account_thread, info, FALSE, NULL); @@ -1137,7 +1202,7 @@ modest_mail_operation_remove_folder (ModestMailOperation *self, } /* Get the account */ - account = tny_folder_get_account (folder); + account = modest_tny_folder_get_account (folder); priv->account = g_object_ref(account); /* Delete folder or move to trash */ @@ -1246,7 +1311,7 @@ modest_mail_operation_xfer_folder (ModestMailOperation *self, priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self); /* Get account and set it into mail_operation */ - priv->account = tny_folder_get_account (TNY_FOLDER(folder)); + priv->account = modest_tny_folder_get_account (TNY_FOLDER(folder)); priv->status = MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS; /* Get folder rules */ @@ -1307,7 +1372,7 @@ modest_mail_operation_rename_folder (ModestMailOperation *self, priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self); /* Get account and set it into mail_operation */ - priv->account = tny_folder_get_account (TNY_FOLDER(folder)); + priv->account = modest_tny_folder_get_account (TNY_FOLDER(folder)); /* Check folder rules */ rules = modest_tny_folder_get_rules (TNY_FOLDER (folder)); @@ -1359,7 +1424,7 @@ void modest_mail_operation_get_msg (ModestMailOperation *self, /* Get message from folder */ if (folder) { /* Get account and set it into mail_operation */ - priv->account = tny_folder_get_account (TNY_FOLDER(folder)); + priv->account = modest_tny_folder_get_account (TNY_FOLDER(folder)); helper = g_slice_new0 (GetMsgAsyncHelper); helper->mail_op = self; @@ -1622,13 +1687,18 @@ modest_mail_operation_get_msgs_full (ModestMailOperation *self, priv->total = tny_list_get_length(header_list); /* Get account and set it into mail_operation */ - if (tny_list_get_length (header_list) > 1) { - iter = tny_list_create_iterator (header_list); + if (tny_list_get_length (header_list) >= 1) { + iter = tny_list_create_iterator (header_list); header = TNY_HEADER (tny_iterator_get_current (iter)); folder = tny_header_get_folder (header); - priv->account = tny_folder_get_account (TNY_FOLDER(folder)); + priv->account = modest_tny_folder_get_account (TNY_FOLDER(folder)); g_object_unref (header); g_object_unref (folder); + + if (tny_list_get_length (header_list) == 1) { + g_object_unref (iter); + iter = NULL; + } } /* Get msg size limit */ @@ -1695,7 +1765,7 @@ modest_mail_operation_remove_msg (ModestMailOperation *self, folder = tny_header_get_folder (header); /* Get account and set it into mail_operation */ - priv->account = tny_folder_get_account (TNY_FOLDER(folder)); + priv->account = modest_tny_folder_get_account (TNY_FOLDER(folder)); priv->status = MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS; @@ -1704,7 +1774,7 @@ modest_mail_operation_remove_msg (ModestMailOperation *self, TnyFolder *trash_folder; TnyStoreAccount *store_account; - store_account = TNY_STORE_ACCOUNT (tny_folder_get_account (folder)); + store_account = TNY_STORE_ACCOUNT (modest_tny_folder_get_account (folder)); trash_folder = modest_tny_account_get_special_folder (TNY_ACCOUNT(store_account), TNY_FOLDER_TYPE_TRASH); if (trash_folder) { @@ -1879,7 +1949,7 @@ modest_mail_operation_xfer_msgs (ModestMailOperation *self, g_object_unref (iter); /* Get account and set it into mail_operation */ - priv->account = tny_folder_get_account (src_folder); + priv->account = modest_tny_folder_get_account (src_folder); /* Transfer messages */ tny_folder_transfer_msgs_async (src_folder, @@ -1966,7 +2036,7 @@ modest_mail_operation_refresh_folder (ModestMailOperation *self, priv->status = MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS; /* Get account and set it into mail_operation */ - priv->account = tny_folder_get_account (folder); + priv->account = modest_tny_folder_get_account (folder); /* Refresh the folder. TODO: tinymail could issue a status updates before the callback call then this could happen. We @@ -1994,7 +2064,4 @@ modest_mail_operation_notify_end (ModestMailOperation *self) state = modest_mail_operation_clone_state (self); g_signal_emit (G_OBJECT (self), signals[PROGRESS_CHANGED_SIGNAL], 0, state, NULL); g_slice_free (ModestMailOperationState, state); - - /* Notify the queue */ - modest_mail_operation_queue_remove (modest_runtime_get_mail_operation_queue (), self); }