if (priv->op_type == MODEST_MAIL_OPERATION_TYPE_SEND) {
ModestTnySendQueue *queue;
- queue = modest_runtime_get_send_queue (TNY_TRANSPORT_ACCOUNT (priv->account));
+ queue = modest_runtime_get_send_queue (TNY_TRANSPORT_ACCOUNT (priv->account),
+ TRUE);
/* Cancel the sending of the following next messages */
tny_send_queue_cancel (TNY_SEND_QUEUE (queue), TNY_SEND_QUEUE_CANCEL_ACTION_SUSPEND, NULL);
/* ************************** SEND ACTIONS ************************* */
/* ******************************************************************* */
+static void
+send_mail_on_added_to_outbox (TnySendQueue *send_queue,
+ gboolean cancelled,
+ TnyMsg *msg,
+ GError *err,
+ gpointer user_data)
+{
+ ModestMailOperationPrivate *priv;
+ ModestMailOperation *self;
+
+ self = MODEST_MAIL_OPERATION (user_data);
+ priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
+
+ if (cancelled || err)
+ goto end;
+
+ if (err) {
+ g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
+ MODEST_MAIL_OPERATION_ERROR_SEND_QUEUE_ADD_ERROR,
+ "Error adding a msg to the send queue\n");
+ priv->status = MODEST_MAIL_OPERATION_STATUS_FINISHED_WITH_ERRORS;
+ } else {
+ priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
+ }
+ end:
+ modest_mail_operation_notify_end (self);
+ g_object_unref (self);
+}
+
void
modest_mail_operation_send_mail (ModestMailOperation *self,
TnyTransportAccount *transport_account,
priv->done = 1;
priv->total = 1;
- send_queue = TNY_SEND_QUEUE (modest_runtime_get_send_queue (transport_account));
+ send_queue = TNY_SEND_QUEUE (modest_runtime_get_send_queue (transport_account, TRUE));
if (!TNY_IS_SEND_QUEUE(send_queue)) {
+ if (priv->error) {
+ g_error_free (priv->error);
+ priv->error = NULL;
+ }
g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND,
"modest: could not find send queue for account\n");
priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
modest_mail_operation_notify_end (self);
-
} else {
- /* Add the msg to the queue */
modest_mail_operation_notify_start (self);
-
- tny_send_queue_add_async (send_queue, msg, NULL, NULL, NULL);
- modest_tny_send_queue_set_requested_send_receive (MODEST_TNY_SEND_QUEUE (send_queue), FALSE);
-
- priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
- modest_mail_operation_notify_end (self);
+ /* Add the msg to the queue. The callback will
+ finalize the mail operation */
+ tny_send_queue_add_async (send_queue, msg, send_mail_on_added_to_outbox,
+ NULL, g_object_ref (self));
+ modest_tny_send_queue_set_requested_send_receive (MODEST_TNY_SEND_QUEUE (send_queue),
+ FALSE);
}
-
}
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->attachments_list);
+ info->attachments_list,
+ &(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->plain_body, info->attachments_list,
- info->images_list);
+ info->images_list,
+ &(priv->error));
}
if (new_msg) {
g_object_unref (G_OBJECT(header));
} else {
priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
- g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
- MODEST_MAIL_OPERATION_ERROR_INSTANCE_CREATION_FAILED,
- "modest: failed to create a new msg\n");
+ if (!priv->error)
+ g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
+ MODEST_MAIL_OPERATION_ERROR_INSTANCE_CREATION_FAILED,
+ "modest: failed to create a new msg\n");
}
TnyFolder *outbox_folder = NULL;
TnyHeader *header = NULL;
+ priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
+
if (!msg) {
+ priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
+ modest_mail_operation_notify_end (self);
goto end;
}
- priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
-
- if (priv->error) {
+ if (priv->error && priv->error->code != MODEST_MAIL_OPERATION_ERROR_FILE_IO) {
priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
modest_mail_operation_notify_end (self);
goto end;
{
ModestMailOperationPrivate *priv = NULL;
SaveToDraftsAddMsgInfo *info = (SaveToDraftsAddMsgInfo *) userdata;
+ GError *io_error = NULL;
priv = MODEST_MAIL_OPERATION_GET_PRIVATE(info->mailop);
+ if (priv->error && priv->error->code == MODEST_MAIL_OPERATION_ERROR_FILE_IO) {
+ io_error = priv->error;
+ priv->error = NULL;
+ }
if (priv->error) {
g_warning ("%s: priv->error != NULL", __FUNCTION__);
g_error_free(priv->error);
g_object_unref (G_OBJECT(src_folder));
}
- if (!priv->error)
- priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
- else
+ if (priv->error) {
priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
+ if (io_error) {
+ g_error_free (io_error);
+ io_error = NULL;
+ }
+ } else if (io_error) {
+ priv->error = io_error;
+ priv->status = MODEST_MAIL_OPERATION_STATUS_FINISHED_WITH_ERRORS;
+ } else {
+ priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
+ }
/* Call the user callback */
if (info->callback)
}
}
- if (!priv->error) {
+ 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;
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)
g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
MODEST_MAIL_OPERATION_ERROR_OPERATION_CANCELED,
"canceled");
+
/* Notify the user about the error and then exit */
update_account_notify_user_and_free (info, NULL);
return;
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;
TnyFolder *outbox;
guint num_messages;
- send_queue = modest_runtime_get_send_queue (transport_account);
+ send_queue = modest_runtime_get_send_queue (transport_account, TRUE);
g_object_unref (transport_account);
/* Get outbox folder */
update_account_notify_user_and_free (info, new_headers);
}
+static void
+inbox_refresh_status_update (GObject *obj,
+ TnyStatus *status,
+ gpointer user_data)
+{
+ UpdateAccountInfo *info = NULL;
+ ModestMailOperation *self = NULL;
+ ModestMailOperationPrivate *priv = NULL;
+ ModestMailOperationState *state;
+
+ g_return_if_fail (user_data != NULL);
+ g_return_if_fail (status != NULL);
+
+ /* Show only the status information we want */
+ if (status->code != TNY_FOLDER_STATUS_CODE_REFRESH)
+ return;
+
+ info = (UpdateAccountInfo *) user_data;
+ self = info->mail_op;
+ g_return_if_fail (MODEST_IS_MAIL_OPERATION(self));
+
+ priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
+
+ priv->done = status->position;
+ priv->total = status->of_total;
+
+ state = modest_mail_operation_clone_state (self);
+
+ /* This is not a GDK lock because we are a Tinymail callback and
+ * Tinymail already acquires the Gdk lock */
+ g_signal_emit (G_OBJECT (self), signals[PROGRESS_CHANGED_SIGNAL], 0, state, NULL);
+
+ g_slice_free (ModestMailOperationState, state);
+}
+
static void
recurse_folders_async_cb (TnyFolderStore *folder_store,
gboolean canceled,
tny_folder_add_observer (inbox, info->inbox_observer);
/* Refresh the INBOX */
- tny_folder_refresh_async (inbox, inbox_refreshed_cb, NULL, info);
+ tny_folder_refresh_async (inbox, inbox_refreshed_cb, inbox_refresh_status_update, info);
g_object_unref (inbox);
} else {
/* We could not perform the inbox refresh but
void
modest_mail_operation_get_msg (ModestMailOperation *self,
TnyHeader *header,
+ gboolean progress_feedback,
GetMsgAsyncUserCallback user_callback,
gpointer user_data)
{
priv->account = modest_tny_folder_get_account (TNY_FOLDER(folder));
/* Check for cached messages */
- if (tny_header_get_flags (header) & TNY_HEADER_FLAG_CACHED)
- priv->op_type = MODEST_MAIL_OPERATION_TYPE_OPEN;
- else
- priv->op_type = MODEST_MAIL_OPERATION_TYPE_RECEIVE;
+ if (progress_feedback) {
+ if (tny_header_get_flags (header) & TNY_HEADER_FLAG_CACHED)
+ priv->op_type = MODEST_MAIL_OPERATION_TYPE_OPEN;
+ else
+ priv->op_type = MODEST_MAIL_OPERATION_TYPE_RECEIVE;
+ } else {
+ priv->op_type = MODEST_MAIL_OPERATION_TYPE_UNKNOWN;
+ }
/* Create the helper */
helper = g_slice_new0 (GetMsgInfo);
helper->last_total_bytes = 0;
helper->sum_total_bytes = 0;
helper->total_bytes = tny_header_get_message_size (header);
+ helper->more_msgs = NULL;
modest_mail_operation_notify_start (self);
}
/* If canceled by the user, ignore the error given by Tinymail */
- if (priv->status == MODEST_MAIL_OPERATION_STATUS_CANCELED || canceled) {
+ if (canceled) {
canceled = TRUE;
finished = TRUE;
+ priv->status = MODEST_MAIL_OPERATION_STATUS_CANCELED;
} else if (err) {
priv->status = MODEST_MAIL_OPERATION_STATUS_FINISHED_WITH_ERRORS;
if (err) {
traccount = modest_tny_account_store_get_transport_account_from_outbox_header(accstore, header);
if (traccount) {
ModestTnySendQueueStatus status;
- ModestTnySendQueue *send_queue = modest_runtime_get_send_queue(traccount);
+ ModestTnySendQueue *send_queue = modest_runtime_get_send_queue(traccount, TRUE);
TnyIterator *iter = tny_list_create_iterator(headers);
g_object_unref(remove_headers);
remove_headers = TNY_LIST(tny_simple_list_new());
helper->dest_folder = g_object_ref(folder);
helper->user_callback = user_callback;
helper->user_data = user_data;
- helper->delete = delete_original;
helper->last_total_bytes = 0;
helper->sum_total_bytes = 0;
helper->total_bytes = compute_message_list_size (headers);
leave_on_server = FALSE;
}
+ /* Do not delete messages if leave on server is TRUE */
+ helper->delete = (leave_on_server) ? FALSE : delete_original;
+
modest_mail_operation_notify_start (self);
tny_folder_transfer_msgs_async (src_folder,
helper->headers,
folder,
- (leave_on_server) ? FALSE : delete_original,
+ helper->delete,
transfer_msgs_cb,
transfer_msgs_status_cb,
helper);
priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
priv->status = MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS;
- priv->account = TNY_ACCOUNT (tny_folder_get_account (folder));
+ priv->account = modest_tny_folder_get_account (folder);
priv->op_type = MODEST_MAIL_OPERATION_TYPE_SYNC_FOLDER;
modest_mail_operation_notify_start (self);