#include <tny-folder-store-query.h>
#include <tny-camel-stream.h>
#include <tny-camel-pop-store-account.h>
+#include <tny-camel-pop-folder.h>
+#include <tny-camel-imap-folder.h>
#include <tny-simple-list.h>
#include <tny-send-queue.h>
#include <tny-status.h>
TnyStatus *status,
gpointer user_data);
-static void modest_mail_operation_notify_end (ModestMailOperation *self,
- gboolean need_lock);
+static void modest_mail_operation_notify_end (ModestMailOperation *self);
static gboolean did_a_cancel = FALSE;
/* This emits progress-changed on which the mail operation queue is
* listening, so the mail operation is correctly removed from the
* queue without further explicit calls. */
- modest_mail_operation_notify_end (self, FALSE);
+ modest_mail_operation_notify_end (self);
return TRUE;
}
/* TODO: do this in the handler of the "msg-sent"
signal.Notify about operation end */
- modest_mail_operation_notify_end (self, FALSE);
+ modest_mail_operation_notify_end (self);
}
void
header = tny_msg_get_header (new_msg);
if (priority_flags != 0)
tny_header_set_flags (header, priority_flags);
+ if (attachments_list != NULL) {
+ tny_header_set_flags (header, TNY_HEADER_FLAG_ATTACHMENTS);
+ }
+ g_object_unref (G_OBJECT(header));
/* Call mail operation */
modest_mail_operation_send_mail (self, transport_account, new_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);
+ tny_header_set_flags (header, TNY_HEADER_FLAG_DELETED);
g_object_unref (header);
}
}
g_object_unref (G_OBJECT (new_msg));
}
-void
+TnyMsg*
modest_mail_operation_save_to_drafts (ModestMailOperation *self,
TnyTransportAccount *transport_account,
TnyMsg *draft_msg,
TnyHeader *header = NULL;
ModestMailOperationPrivate *priv = NULL;
- g_return_if_fail (MODEST_IS_MAIL_OPERATION (self));
- g_return_if_fail (TNY_IS_TRANSPORT_ACCOUNT (transport_account));
+ g_return_val_if_fail (MODEST_IS_MAIL_OPERATION (self), NULL);
+ g_return_val_if_fail (TNY_IS_TRANSPORT_ACCOUNT (transport_account), NULL);
priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
/* add priority flags */
header = tny_msg_get_header (msg);
tny_header_set_flags (header, priority_flags);
+ if (attachments_list != NULL)
+ tny_header_set_flags (header, TNY_HEADER_FLAG_ATTACHMENTS);
+ g_object_unref (G_OBJECT(header));
folder = modest_tny_account_get_special_folder (TNY_ACCOUNT (transport_account), TNY_FOLDER_TYPE_DRAFTS);
if (!folder) {
header = tny_msg_get_header (draft_msg);
/* Remove the old draft expunging it */
tny_folder_remove_msg (folder, header, NULL);
+ tny_header_set_flags (header, TNY_HEADER_FLAG_DELETED);
tny_folder_sync (folder, FALSE, &(priv->error)); /* FALSE --> don't expunge */
g_object_unref (header);
}
priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
end:
- if (msg)
- g_object_unref (G_OBJECT(msg));
if (folder)
g_object_unref (G_OBJECT(folder));
- modest_mail_operation_notify_end (self, FALSE);
+ modest_mail_operation_notify_end (self);
+ return msg;
}
typedef struct
gchar *account_name;
UpdateAccountCallback callback;
gpointer user_data;
+ gint new_headers;
} UpdateAccountInfo;
/***** I N T E R N A L F O L D E R O B S E R V E R *****/
priv = MODEST_MAIL_OPERATION_GET_PRIVATE(mail_op);
/* Do not need to block, the notify end will do it for us */
- modest_mail_operation_notify_end (mail_op, TRUE);
+ modest_mail_operation_notify_end (mail_op);
g_object_unref (mail_op);
return FALSE;
return FALSE;
}
+static gboolean
+idle_update_account_cb (gpointer data)
+{
+ UpdateAccountInfo *idle_info;
+
+ idle_info = (UpdateAccountInfo *) data;
+
+ gdk_threads_enter ();
+ idle_info->callback (idle_info->mail_op,
+ idle_info->new_headers,
+ idle_info->user_data);
+ gdk_threads_leave ();
+
+ /* Frees */
+ g_object_unref (idle_info->mail_op);
+ g_free (idle_info);
+
+ return FALSE;
+}
+
+
static gpointer
update_account_thread (gpointer thr_user_data)
{
}
out:
+
+ if (info->callback) {
+ UpdateAccountInfo *idle_info;
+
+ /* This thread is not in the main lock */
+ idle_info = g_malloc0 (sizeof (UpdateAccountInfo));
+ idle_info->mail_op = g_object_ref (info->mail_op);
+ idle_info->new_headers = (new_headers) ? new_headers->len : 0;
+ idle_info->callback = info->callback;
+ g_idle_add (idle_update_account_cb, idle_info);
+ }
+
/* Notify about operation end. Note that the info could be
freed before this idle happens, but the mail operation will
be still alive */
g_idle_add (idle_notify_update_account_queue, g_object_ref (info->mail_op));
- if (info->callback) {
- /* This thread is not in the main lock */
- gdk_threads_enter ();
- info->callback (info->mail_op,
- (new_headers) ? new_headers->len : 0,
- info->user_data);
- gdk_threads_leave ();
- }
-
/* Frees */
g_object_unref (query);
g_object_unref (all_folders);
priv->done = 0;
priv->status = MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS;
+ /* 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))
+ goto error;
+
/* Get the Modest account */
modest_account = (TnyStoreAccount *)
modest_tny_account_store_get_server_account (modest_runtime_get_account_store (),
priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
if (callback)
callback (self, 0, user_data);
- modest_mail_operation_notify_end (self, FALSE);
+ modest_mail_operation_notify_end (self);
return FALSE;
}
}
/* Notify about operation end */
- modest_mail_operation_notify_end (self, FALSE);
+ modest_mail_operation_notify_end (self);
return new_folder;
}
TNY_FOLDER_TYPE_TRASH);
/* TODO: error_handling */
modest_mail_operation_xfer_folder (self, folder,
- TNY_FOLDER_STORE (trash_folder), TRUE);
+ TNY_FOLDER_STORE (trash_folder),
+ TRUE, NULL, NULL);
} else {
TnyFolderStore *parent = tny_folder_get_folder_store (folder);
end:
/* Notify about operation end */
- modest_mail_operation_notify_end (self, FALSE);
+ modest_mail_operation_notify_end (self);
}
static void
ModestMailOperation *self;
ModestMailOperationPrivate *priv;
ModestMailOperationState *state;
+ XFerMsgAsyncHelper *helper;
g_return_if_fail (status != NULL);
g_return_if_fail (status->code == TNY_FOLDER_STATUS_CODE_COPY_FOLDER);
- self = MODEST_MAIL_OPERATION (user_data);
- priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
+ helper = (XFerMsgAsyncHelper *) user_data;
+ g_return_if_fail (helper != NULL);
- if ((status->position == 1) && (status->of_total == 100))
- return;
+ self = helper->mail_op;
+ priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
priv->done = status->position;
priv->total = status->of_total;
GError **err,
gpointer user_data)
{
+ XFerMsgAsyncHelper *helper;
ModestMailOperation *self = NULL;
ModestMailOperationPrivate *priv = NULL;
- self = MODEST_MAIL_OPERATION (user_data);
+ helper = (XFerMsgAsyncHelper *) user_data;
+ g_return_if_fail (helper != NULL);
- priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
+ self = helper->mail_op;
+ priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
if (*err) {
priv->error = g_error_copy (*err);
priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
}
+ /* Notify about operation end */
+ modest_mail_operation_notify_end (self);
+
+ /* If user defined callback function was defined, call it */
+ if (helper->user_callback) {
+ gdk_threads_enter ();
+ helper->user_callback (priv->source, helper->user_data);
+ gdk_threads_leave ();
+ }
+
/* Free */
+ g_object_unref (helper->mail_op);
+ g_slice_free (XFerMsgAsyncHelper, helper);
g_object_unref (folder);
g_object_unref (into);
-
- /* Notify about operation end */
- modest_mail_operation_notify_end (self, TRUE);
}
void
modest_mail_operation_xfer_folder (ModestMailOperation *self,
TnyFolder *folder,
TnyFolderStore *parent,
- gboolean delete_original)
+ gboolean delete_original,
+ XferMsgsAsynUserCallback user_callback,
+ gpointer user_data)
{
ModestMailOperationPrivate *priv = NULL;
ModestTnyFolderRules parent_rules = 0, rules;
+ XFerMsgAsyncHelper *helper = NULL;
g_return_if_fail (MODEST_IS_MAIL_OPERATION (self));
g_return_if_fail (TNY_IS_FOLDER (folder));
_("mail_in_ui_folder_move_target_error"));
/* Notify the queue */
- modest_mail_operation_notify_end (self, FALSE);
+ modest_mail_operation_notify_end (self);
} else if (TNY_IS_FOLDER (parent) &&
(parent_rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE)) {
/* Set status failed and set an error */
_("FIXME: parent folder does not accept new folders"));
/* Notify the queue */
- modest_mail_operation_notify_end (self, FALSE);
+ modest_mail_operation_notify_end (self);
} else {
/* Pick references for async calls */
g_object_ref (folder);
g_object_ref (parent);
+ /* Create the helper */
+ helper = g_slice_new0 (XFerMsgAsyncHelper);
+ helper->mail_op = g_object_ref(self);
+ helper->dest_folder = NULL;
+ helper->headers = NULL;
+ helper->user_callback = user_callback;
+ helper->user_data = user_data;
+
/* Move/Copy folder */
tny_folder_copy_async (folder,
parent,
delete_original,
transfer_folder_cb,
transfer_folder_status_cb,
- self);
+ helper);
+/* self); */
}
}
{
ModestMailOperationPrivate *priv;
ModestTnyFolderRules rules;
+ XFerMsgAsyncHelper *helper;
g_return_if_fail (MODEST_IS_MAIL_OPERATION (self));
g_return_if_fail (TNY_IS_FOLDER_STORE (folder));
_("FIXME: unable to rename"));
/* Notify about operation end */
- modest_mail_operation_notify_end (self, FALSE);
+ modest_mail_operation_notify_end (self);
} else if (!strcmp (name, " ") || strchr (name, '/')) {
priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
MODEST_MAIL_OPERATION_ERROR_FOLDER_RULES,
_("FIXME: unable to rename"));
/* Notify about operation end */
- modest_mail_operation_notify_end (self, FALSE);
+ modest_mail_operation_notify_end (self);
} else {
TnyFolderStore *into;
+ /* Create the helper */
+ helper = g_slice_new0 (XFerMsgAsyncHelper);
+ helper->mail_op = g_object_ref(self);
+ helper->dest_folder = NULL;
+ helper->headers = NULL;
+ helper->user_callback = NULL;
+ helper->user_data = NULL;
+
/* Rename. Camel handles folder subscription/unsubscription */
into = tny_folder_get_folder_store (folder);
tny_folder_copy_async (folder, into, name, TRUE,
transfer_folder_cb,
transfer_folder_status_cb,
- self);
+ helper);
+/* self); */
if (into)
g_object_unref (into);
}
_("Error trying to get a message. No folder found for header"));
/* Notify the queue */
- modest_mail_operation_notify_end (self, FALSE);
+ modest_mail_operation_notify_end (self);
}
}
if (*error) {
priv->error = g_error_copy (*error);
priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
- goto out;
- }
- if (cancelled) {
+ } else if (cancelled) {
priv->status = MODEST_MAIL_OPERATION_STATUS_CANCELED;
g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND,
_("Error trying to refresh the contents of %s"),
tny_folder_get_name (folder));
- goto out;
- }
-
- /* The mail operation might have been canceled in which case we do not
- want to notify anyone anymore. */
- if(priv->status != MODEST_MAIL_OPERATION_STATUS_CANCELED) {
+ } else {
priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
+ }
- /* If user defined callback function was defined, call it */
- if (helper->user_callback) {
- /* This callback is called into an iddle by tinymail,
- and idles are not in the main lock */
- gdk_threads_enter ();
- helper->user_callback (self, helper->header, msg, helper->user_data);
- gdk_threads_leave ();
- }
+ /* If user defined callback function was defined, call it even
+ if the operation failed*/
+ if (helper->user_callback) {
+ /* This callback is called into an iddle by tinymail,
+ and idles are not in the main lock */
+ gdk_threads_enter ();
+ helper->user_callback (self, helper->header, msg, helper->user_data);
+ gdk_threads_leave ();
}
- out:
/* Free */
+ g_object_unref (helper->mail_op);
g_object_unref (helper->header);
g_slice_free (GetMsgAsyncHelper, helper);
/* Notify about operation end */
- if(priv->status != MODEST_MAIL_OPERATION_STATUS_CANCELED)
- modest_mail_operation_notify_end (self, TRUE);
-
- g_object_unref (G_OBJECT (self));
+ modest_mail_operation_notify_end (self);
}
static void
if(priv->status == MODEST_MAIL_OPERATION_STATUS_CANCELED)
return;
- if ((status->position == 1) && (status->of_total == 100))
- return;
-
priv->done = 1;
priv->total = 1;
MODEST_MAIL_OPERATION_ERROR_MESSAGE_SIZE_LIMIT,
_("emev_ni_ui_imap_msg_size_exceed_error"));
/* Remove from queue and free resources */
- modest_mail_operation_notify_end (self, FALSE);
+ modest_mail_operation_notify_end (self);
if (notify)
notify (user_data);
}
void
-modest_mail_operation_remove_msg (ModestMailOperation *self,
- TnyHeader *header,
- gboolean remove_to_trash)
+modest_mail_operation_remove_msg (ModestMailOperation *self, TnyHeader *header,
+ gboolean remove_to_trash /*ignored*/)
{
TnyFolder *folder;
ModestMailOperationPrivate *priv;
g_return_if_fail (MODEST_IS_MAIL_OPERATION (self));
g_return_if_fail (TNY_IS_HEADER (header));
+ if (remove_to_trash)
+ g_warning ("remove to trash is not implemented");
+
priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
folder = tny_header_get_folder (header);
priv->status = MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS;
- /* Delete or move to trash */
- if (remove_to_trash) {
- TnyFolder *trash_folder;
- TnyStoreAccount *store_account;
- 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) {
- TnyList *headers;
-
- /* Create list */
- headers = tny_simple_list_new ();
- tny_list_append (headers, G_OBJECT (header));
- g_object_unref (header);
-
- /* Move to trash */
- modest_mail_operation_xfer_msgs (self, headers, trash_folder, TRUE, NULL, NULL);
- g_object_unref (headers);
-/* g_object_unref (trash_folder); */
- } else {
- ModestMailOperationPrivate *priv;
-
- /* Set status failed and set an error */
- priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
- priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
- g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
- MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND,
- _("Error trying to delete a message. Trash folder not found"));
- }
+ tny_folder_remove_msg (folder, header, &(priv->error));
+ if (!priv->error) {
+ tny_header_set_flags (header, TNY_HEADER_FLAG_DELETED);
- g_object_unref (G_OBJECT (store_account));
- } else {
- tny_folder_remove_msg (folder, header, &(priv->error));
- if (!priv->error) {
- tny_header_set_flags (header, TNY_HEADER_FLAG_DELETED);
+ if (TNY_IS_CAMEL_IMAP_FOLDER (folder))
tny_folder_sync(folder, FALSE, &(priv->error)); /* FALSE --> don't expunge */
- }
+ else if (TNY_IS_CAMEL_POP_FOLDER (folder))
+ tny_folder_sync(folder, TRUE, &(priv->error)); /* TRUE --> expunge */
+ else
+ /* lcoal folders */
+ tny_folder_sync(folder, TRUE, &(priv->error)); /* TRUE --> expunge */
}
-
+
+
/* Set status */
if (!priv->error)
priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
g_object_unref (G_OBJECT (folder));
/* Notify about operation end */
- modest_mail_operation_notify_end (self, FALSE);
+ modest_mail_operation_notify_end (self);
}
static void
self = helper->mail_op;
priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
- if ((status->position == 1) && (status->of_total == 100))
- return;
-
priv->done = status->position;
priv->total = status->of_total;
}
/* Notify about operation end */
- modest_mail_operation_notify_end (self, TRUE);
+ modest_mail_operation_notify_end (self);
/* If user defined callback function was defined, call it */
if (helper->user_callback) {
MODEST_MAIL_OPERATION_ERROR_FOLDER_RULES,
_("ckct_ib_unable_to_paste_here"));
/* Notify the queue */
- modest_mail_operation_notify_end (self, FALSE);
+ modest_mail_operation_notify_end (self);
return;
}
_("mcen_ib_unable_to_copy_samefolder"));
/* Notify the queue */
- modest_mail_operation_notify_end (self, FALSE);
+ modest_mail_operation_notify_end (self);
/* Free */
g_object_unref (src_folder);
/* Call user defined callback, if it exists */
if (helper->user_callback) {
gdk_threads_enter ();
- helper->user_callback (priv->source, folder, helper->user_data);
+ helper->user_callback (self, folder, helper->user_data);
gdk_threads_leave ();
}
g_object_unref (folder);
/* Notify about operation end */
- modest_mail_operation_notify_end (self, TRUE);
+ modest_mail_operation_notify_end (self);
}
static void
* callback).
*/
static void
-modest_mail_operation_notify_end (ModestMailOperation *self,
- gboolean need_lock)
+modest_mail_operation_notify_end (ModestMailOperation *self)
{
ModestMailOperationState *state;
ModestMailOperationPrivate *priv = NULL;
/* Notify the observers about the mail opertation end */
state = modest_mail_operation_clone_state (self);
- if (need_lock)
- gdk_threads_enter ();
g_signal_emit (G_OBJECT (self), signals[PROGRESS_CHANGED_SIGNAL], 0, state, NULL);
- if (need_lock)
- gdk_threads_leave ();
g_slice_free (ModestMailOperationState, state);
}