#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>
typedef struct _GetMsgAsyncHelper {
ModestMailOperation *mail_op;
GetMsgAsyncUserCallback user_callback;
- guint pending_ops;
gpointer user_data;
} GetMsgAsyncHelper;
+typedef struct _RefreshAsyncHelper {
+ ModestMailOperation *mail_op;
+ RefreshAsyncUserCallback user_callback;
+ gpointer user_data;
+} RefreshAsyncHelper;
+
typedef struct _XFerMsgAsyncHelper
{
ModestMailOperation *mail_op;
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;
ModestMailOperationState *state;
ModestMailOperationPrivate *priv;
+ /* FIXME: this should be fixed properly
+ *
+ * in some cases, priv was NULL, so checking here to
+ * make sure.
+ */
+ g_return_val_if_fail (self, NULL);
priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
+ g_return_val_if_fail (priv, NULL);
+
+ if (!priv)
+ return NULL;
state = g_slice_new (ModestMailOperationState);
/* Set priority flags in message */
header = tny_msg_get_header (new_msg);
- tny_header_set_flags (header, priority_flags);
+ if (priority_flags != 0)
+ tny_header_set_flags (header, priority_flags);
/* Call mail operation */
modest_mail_operation_send_mail (self, transport_account, new_msg);
if (draft_msg != NULL) {
header = tny_msg_get_header (draft_msg);
+ /* Remove the old draft expunging it */
tny_folder_remove_msg (folder, header, NULL);
+ tny_folder_sync (folder, TRUE, NULL);
g_object_unref (header);
}
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 ();
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);
if (!priv->error) {
priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
- /* Update the last updated key. TODO: this causes
- sometimes an error in dbus, in order to fix this we
- must call gconf from the main loop */
+ /* Update the last updated key */
g_idle_add_full (G_PRIORITY_HIGH_IDLE,
set_last_updated_idle,
g_strdup (tny_account_get_id (TNY_ACCOUNT (info->account))),
/* 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 (notify_update_account_queue, info->mail_op);
+ g_idle_add (notify_update_account_queue, g_object_ref (info->mail_op));
/* Frees */
g_object_unref (query);
return FALSE;
}
+
/* Get the transport account, we can not do it in the thread
due to some problems with dbus */
transport_account = (TnyTransportAccount *)
helper = g_slice_new0 (GetMsgAsyncHelper);
helper->mail_op = self;
helper->user_callback = user_callback;
- helper->pending_ops = 1;
helper->user_data = user_data;
tny_folder_get_msg_async (folder, header, get_msg_cb, get_msg_status_cb, helper);
self = helper->mail_op;
g_return_if_fail (MODEST_IS_MAIL_OPERATION(self));
priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
-
- helper->pending_ops--;
/* Check errors and cancel */
if (*error) {
helper->user_callback (self, NULL, msg, helper->user_data);
}
- /* Free */
out:
- if (helper->pending_ops == 0) {
- g_slice_free (GetMsgAsyncHelper, helper);
+ /* Free */
+ g_slice_free (GetMsgAsyncHelper, helper);
- /* Notify about operation end */
- modest_mail_operation_notify_end (self);
- }
+ /* Notify about operation end */
+ modest_mail_operation_notify_end (self);
}
static void
priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
/* Notify about operation end */
- g_idle_add (notify_update_account_queue, info->mail_op);
+ g_idle_add (notify_update_account_queue, g_object_ref (info->mail_op));
/* Free thread resources. Will be called after all previous idles */
g_idle_add_full (G_PRIORITY_DEFAULT_IDLE + 1, get_msgs_full_destroyer, info, NULL);
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);
/* Get account and set it into mail_operation */
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
must review the design */
tny_folder_refresh_async (folder,
on_refresh_folder,
on_refresh_folder_status_update,
- self);
+ helper);
}
/**