priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
- /* Note that if we call cancel with an already canceled mail
- operation the progress changed signal won't be emitted */
- if (priv->status == MODEST_MAIL_OPERATION_STATUS_CANCELED)
- return FALSE;
-
/* Set new status */
priv->status = MODEST_MAIL_OPERATION_STATUS_CANCELED;
ModestMailOperationCreateMsgCallback callback,
gpointer userdata)
{
- ModestMailOperationPrivate *priv;
CreateMsgInfo *info = NULL;
- priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
-
info = g_slice_new0 (CreateMsgInfo);
info->mail_op = g_object_ref (self);
ModestAccountRetrieveType retrieve_type;
TnyList *new_headers = NULL;
gboolean headers_only, ignore_limit;
- TnyTransportAccount *transport_account;
+ TnyTransportAccount *transport_account = NULL;
info = (UpdateAccountInfo *) user_data;
priv = MODEST_MAIL_OPERATION_GET_PRIVATE (info->mail_op);
guint num_messages;
send_queue = modest_runtime_get_send_queue (transport_account);
+ g_object_unref (transport_account);
/* Get outbox folder */
outbox = tny_send_queue_get_outbox (TNY_SEND_QUEUE (send_queue));
- num_messages = tny_folder_get_all_count (outbox);
- g_object_unref (outbox);
-
+ if (outbox) { /* this could fail in some cases */
+ num_messages = tny_folder_get_all_count (outbox);
+ g_object_unref (outbox);
+ } else {
+ g_warning ("%s: could not get outbox", __FUNCTION__);
+ num_messages = 0;
+ }
+
if (num_messages != 0) {
/* Send mails */
g_object_unref (priv->account);
/* Try to send */
tny_camel_send_queue_flush (TNY_CAMEL_SEND_QUEUE (send_queue));
}
- }
+ }
/* Check if the operation was a success */
if (!priv->error)
UpdateAccountInfo *info = NULL;
ModestMailOperationPrivate *priv = NULL;
ModestTnyAccountStore *account_store = NULL;
- TnyStoreAccount *store_account = NULL;
TnyList *folders;
ModestMailOperationState *state;
/* Get the store account */
account_store = modest_runtime_get_account_store ();
- store_account = (TnyStoreAccount *)
+ priv->account =
modest_tny_account_store_get_server_account (account_store,
account_name,
TNY_ACCOUNT_TYPE_STORE);
- priv->account = g_object_ref (store_account);
/* Create the helper object */
info = g_slice_new0 (UpdateAccountInfo);
/* Get all folders and continue in the callback */
folders = tny_simple_list_new ();
- tny_folder_store_get_folders_async (TNY_FOLDER_STORE (store_account),
+ tny_folder_store_get_folders_async (TNY_FOLDER_STORE (priv->account),
folders, NULL,
recurse_folders_async_cb,
NULL, info);
TnyFolder *folder,
gboolean remove_to_trash)
{
- TnyAccount *account;
ModestMailOperationPrivate *priv;
ModestTnyFolderRules rules;
}
/* Get the account */
- account = modest_tny_folder_get_account (folder);
- priv->account = g_object_ref(account);
+ priv->account = modest_tny_folder_get_account (folder);
priv->op_type = MODEST_MAIL_OPERATION_TYPE_DELETE;
/* Delete folder or move to trash */
if (remove_to_trash) {
TnyFolder *trash_folder = NULL;
- trash_folder = modest_tny_account_get_special_folder (account,
+ trash_folder = modest_tny_account_get_special_folder (priv->account,
TNY_FOLDER_TYPE_TRASH);
/* TODO: error_handling */
if (trash_folder) {
} else
g_warning ("%s: could not get parent folder", __FUNCTION__);
}
- g_object_unref (G_OBJECT (account));
end:
/* Notify about operation end */
finished = (priv->done == priv->total) ? TRUE : FALSE;
}
- /* Check errors */
- if (canceled || err) {
+ /* If canceled by the user, ignore the error given by Tinymail */
+ if (priv->status == MODEST_MAIL_OPERATION_STATUS_CANCELED) {
+ canceled = TRUE;
+ finished = TRUE;
+ } else if (canceled || err) {
priv->status = MODEST_MAIL_OPERATION_STATUS_FINISHED_WITH_ERRORS;
if (err) {
priv->error = g_error_copy ((const GError *) err);
} else if (finished && priv->status == MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS) {
/* Set the success status before calling the user callback */
priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
- } else if (priv->status == MODEST_MAIL_OPERATION_STATUS_CANCELED) {
- canceled = TRUE;
- finished = TRUE;
}
g_object_unref (helper->dest_folder);
if (helper->mail_op)
g_object_unref (helper->mail_op);
- if (folder)
- g_object_unref (folder);
g_slice_free (XFerMsgsAsyncHelper, helper);
} else {
/* Transfer more messages */
TnyHeader *header = NULL;
ModestTnyFolderRules rules = 0;
TnyAccount *dst_account = NULL;
+ gboolean leave_on_server;
g_return_if_fail (self && MODEST_IS_MAIL_OPERATION (self));
g_return_if_fail (headers && TNY_IS_LIST (headers));
g_object_unref (hdr);
}
+ /* If leave_on_server is set to TRUE then don't use
+ delete_original, we always pass FALSE. This is because
+ otherwise tinymail will try to sync the source folder and
+ this could cause an error if we're offline while
+ transferring an already downloaded message from a POP
+ account */
+ if (modest_protocol_info_get_transport_store_protocol (tny_account_get_proto (priv->account)) ==
+ MODEST_PROTOCOL_STORE_POP) {
+ const gchar *account_name;
+
+ account_name = modest_tny_account_get_parent_modest_account_name_for_server_account (priv->account);
+ leave_on_server = modest_account_mgr_get_leave_on_server (modest_runtime_get_account_mgr (),
+ account_name);
+ } else {
+ leave_on_server = FALSE;
+ }
+
modest_mail_operation_notify_start (self);
tny_folder_transfer_msgs_async (src_folder,
helper->headers,
folder,
- delete_original,
+ (leave_on_server) ? FALSE : delete_original,
transfer_msgs_cb,
transfer_msgs_status_cb,
helper);
+ g_object_unref (src_folder);
g_object_unref (dst_account);
}
state->total = 0;
g_signal_emit (G_OBJECT (self), signals[PROGRESS_CHANGED_SIGNAL],
0, state, NULL);
+
+ /* FIXME: we're leaking the state here, or? valgrind thinks so */
tny_folder_refresh_async (folder,
on_refresh_folder,