#include <tny-folder-store.h>
#include <tny-folder-store-query.h>
#include <tny-camel-stream.h>
+#include <tny-camel-pop-store-account.h>
#include <tny-simple-list.h>
#include <tny-send-queue.h>
#include <tny-status.h>
static void modest_mail_operation_notify_end (ModestMailOperation *self);
+static gboolean did_a_cancel = FALSE;
+
enum _ModestMailOperationSignals
{
PROGRESS_CHANGED_SIGNAL,
gpointer user_data;
} GetMsgAsyncHelper;
+typedef struct _RefreshAsyncHelper {
+ ModestMailOperation *mail_op;
+ RefreshAsyncUserCallback user_callback;
+ gpointer user_data;
+} RefreshAsyncHelper;
+
typedef struct _XFerMsgAsyncHelper
{
ModestMailOperation *mail_op;
NULL, NULL,
g_cclosure_marshal_VOID__POINTER,
G_TYPE_NONE, 1, G_TYPE_POINTER);
+
}
static void
priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
/* cancel current operation in account */
- tny_account_cancel (priv->account);
+ //tny_account_cancel (priv->account);
+
+ did_a_cancel = TRUE;
/* Set new status */
priv->status = MODEST_MAIL_OPERATION_STATUS_CANCELED;
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,
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));
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);
+ if (priority_flags != 0)
+ 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));
}
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,
{
TnyMsg *msg = NULL;
TnyFolder *folder = NULL;
+ TnyHeader *header = NULL;
ModestMailOperationPrivate *priv = NULL;
g_return_if_fail (MODEST_IS_MAIL_OPERATION (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,
"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)
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);
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)
{
ModestMailOperationPrivate *priv;
ModestTnySendQueue *send_queue;
+
info = (UpdateAccountInfo *) thr_user_data;
priv = MODEST_MAIL_OPERATION_GET_PRIVATE(info->mail_op);
/* Get account and set it into mail_operation */
priv->account = g_object_ref (info->account);
+ /*
+ * for POP3, we do a logout-login upon send/receive -- many POP-servers (like Gmail) do not
+ * show any updates unless we do that
+ */
+ if (TNY_IS_CAMEL_POP_STORE_ACCOUNT(priv->account))
+ tny_camel_pop_store_account_reconnect (TNY_CAMEL_POP_STORE_ACCOUNT(priv->account));
+
/* Get all the folders. We can do it synchronously because
we're already running in a different thread than the UI */
all_folders = tny_simple_list_new ();
/* 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));
* 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));
g_object_unref (G_OBJECT (folder));
tny_iterator_next (iter);
}
+
+ did_a_cancel = FALSE;
+
g_object_unref (G_OBJECT (iter));
g_source_remove (timeout);
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:
/* 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);
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;
}
+
/* Get the transport account, we can not do it in the thread
due to some problems with dbus */
transport_account = (TnyTransportAccount *)
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;
}
}
/* 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 */
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 */
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));
/* 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;
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 */
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;
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) {
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,
GError **error,
gpointer user_data)
{
- ModestMailOperation *self;
- ModestMailOperationPrivate *priv;
+ RefreshAsyncHelper *helper = NULL;
+ ModestMailOperation *self = NULL;
+ ModestMailOperationPrivate *priv = NULL;
- self = MODEST_MAIL_OPERATION (user_data);
+ helper = (RefreshAsyncHelper *) user_data;
+ self = helper->mail_op;
priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
if (*error) {
priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
out:
+ /* Call user defined callback, if it exists */
+ if (helper->user_callback)
+ helper->user_callback (priv->source, folder, helper->user_data);
+
/* Free */
+ g_object_unref (helper->mail_op);
+ g_slice_free (RefreshAsyncHelper, helper);
g_object_unref (folder);
/* Notify about operation end */
TnyStatus *status,
gpointer user_data)
{
- ModestMailOperation *self;
- ModestMailOperationPrivate *priv;
+ RefreshAsyncHelper *helper = NULL;
+ ModestMailOperation *self = NULL;
+ ModestMailOperationPrivate *priv = NULL;
ModestMailOperationState *state;
+ g_return_if_fail (user_data != NULL);
g_return_if_fail (status != NULL);
g_return_if_fail (status->code == TNY_FOLDER_STATUS_CODE_REFRESH);
- self = MODEST_MAIL_OPERATION (user_data);
+ helper = (RefreshAsyncHelper *) user_data;
+ self = helper->mail_op;
+ g_return_if_fail (MODEST_IS_MAIL_OPERATION(self));
+
priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
priv->done = status->position;
void
modest_mail_operation_refresh_folder (ModestMailOperation *self,
- TnyFolder *folder)
+ TnyFolder *folder,
+ RefreshAsyncUserCallback user_callback,
+ gpointer user_data)
{
- ModestMailOperationPrivate *priv;
+ ModestMailOperationPrivate *priv = NULL;
+ RefreshAsyncHelper *helper = NULL;
priv = MODEST_MAIL_OPERATION_GET_PRIVATE(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);
+
+ /* Create the helper */
+ helper = g_slice_new0 (RefreshAsyncHelper);
+ helper->mail_op = g_object_ref(self);
+ helper->user_callback = user_callback;
+ helper->user_data = user_data;
/* Refresh the folder. TODO: tinymail could issue a status
updates before the callback call then this could happen. We
tny_folder_refresh_async (folder,
on_refresh_folder,
on_refresh_folder_status_update,
- self);
+ helper);
}
/**
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);
}