-
/* Copyright (c) 2006, Nokia Corporation
* All rights reserved.
*
typedef struct _ModestMailOperationPrivate ModestMailOperationPrivate;
struct _ModestMailOperationPrivate {
TnyAccount *account;
+ gchar *account_name;
guint done;
guint total;
GObject *source;
typedef struct _GetMsgAsyncHelper {
ModestMailOperation *mail_op;
+ TnyHeader *header;
GetMsgAsyncUserCallback user_callback;
gpointer user_data;
} GetMsgAsyncHelper;
priv = MODEST_MAIL_OPERATION_GET_PRIVATE(obj);
+
+
if (priv->error) {
g_error_free (priv->error);
priv->error = NULL;
{
ModestMailOperationPrivate *priv;
+ g_return_val_if_fail (self, NULL);
+
priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
-
+ if (!priv) {
+ g_warning ("BUG: %s: priv == NULL", __FUNCTION__);
+ return NULL;
+ }
+
return g_object_ref (priv->source);
}
MODEST_MAIL_OPERATION_STATUS_INVALID);
priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
+ if (!priv) {
+ g_warning ("BUG: %s: priv == NULL", __FUNCTION__);
+ return MODEST_MAIL_OPERATION_STATUS_INVALID;
+ }
+
return priv->status;
}
g_return_val_if_fail (MODEST_IS_MAIL_OPERATION (self), NULL);
priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
+
+ if (!priv) {
+ g_warning ("BUG: %s: priv == NULL", __FUNCTION__);
+ return NULL;
+ }
+
return priv->error;
}
}
priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
-
- /* cancel current operation in account */
- //tny_account_cancel (priv->account);
+ if (!priv) {
+ g_warning ("BUG: %s: priv == NULL", __FUNCTION__);
+ return FALSE;
+ }
did_a_cancel = TRUE;
/* Set new status */
priv->status = MODEST_MAIL_OPERATION_STATUS_CANCELED;
- /* Notify about operation end */
+ /* 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);
-
+
return 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);
state->done = priv->done;
state->total = priv->total;
state->finished = modest_mail_operation_is_finished (self);
+ state->bytes_done = 0;
+ state->bytes_total = 0;
return state;
}
/* Get account and set it into mail_operation */
priv->account = g_object_ref (transport_account);
+ priv->done = 1;
+ priv->total = 1;
send_queue = TNY_SEND_QUEUE (modest_runtime_get_send_queue (transport_account));
if (!TNY_IS_SEND_QUEUE(send_queue)) {
MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND,
"modest: could not find send queue for account\n");
} else {
+ /* TODO: connect to the msg-sent in order to know when
+ the mail operation is finished */
tny_send_queue_add (send_queue, msg, &(priv->error));
+ /* TODO: we're setting always success, do the check in
+ the handler */
+ priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
}
- /* Notify about operation end */
+ /* TODO: do this in the handler of the "msg-sent"
+ signal.Notify about operation end */
modest_mail_operation_notify_end (self);
}
priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
- /* Get account and set it into mail_operation */
- priv->account = g_object_ref (transport_account);
-
/* Check parametters */
if (to == NULL) {
/* Set status failed and set an error */
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);
}
gint max_size;
gint retrieve_limit;
gchar *retrieve_type;
+ gchar *account_name;
} UpdateAccountInfo;
/***** I N T E R N A L F O L D E R O B S E R V E R *****/
state = modest_mail_operation_clone_state (mail_op);
g_signal_emit (G_OBJECT (mail_op), signals[PROGRESS_CHANGED_SIGNAL], 0, state, NULL);
g_slice_free (ModestMailOperationState, state);
-
+
return TRUE;
}
ModestMailOperationPrivate *priv = NULL;
priv = MODEST_MAIL_OPERATION_GET_PRIVATE(mail_op);
-
+
modest_mail_operation_notify_end (mail_op);
g_object_unref (mail_op);
static gpointer
update_account_thread (gpointer thr_user_data)
{
+ static gboolean first_time = TRUE;
UpdateAccountInfo *info;
TnyList *all_folders = NULL;
GPtrArray *new_headers;
* 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))
+ if (!first_time && 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
iter = tny_list_create_iterator (observer->new_headers);
while (!tny_iterator_is_done (iter)) {
TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter));
- /* printf (" DEBUG1.2 %s: checking size: account=%s, subject=%s\n",
- * __FUNCTION__, tny_account_get_id (priv->account),
- * tny_header_get_subject (header));
- */
/* Apply per-message size limits */
if (tny_header_get_message_size (header) < info->max_size)
tny_iterator_next (iter);
}
g_object_unref (iter);
+ } else {
+ /* We do not need to do it the first time
+ because it's automatically done by the tree
+ model */
+ if (G_UNLIKELY (!first_time))
+ tny_folder_poke_status (TNY_FOLDER (folder));
}
-
tny_folder_remove_observer (TNY_FOLDER (folder), TNY_FOLDER_OBSERVER (observer));
g_object_unref (observer);
observer = NULL;
* user to download them all,
* as per the UI spec "Retrieval Limits" section in 4.4:
*/
- printf ("DEBUG: %s: account=%s, len=%d, retrieve_limit = %d\n", __FUNCTION__,
+ printf ("************************** DEBUG: %s: account=%s, len=%d, retrieve_limit = %d\n", __FUNCTION__,
tny_account_get_id (priv->account), new_headers->len, info->retrieve_limit);
if (new_headers->len > info->retrieve_limit) {
/* TODO: Ask the user, instead of just failing, showing mail_nc_msg_count_limit_exceeded,
freed before this idle happens, but the mail operation will
be still alive */
g_idle_add (notify_update_account_queue, g_object_ref (info->mail_op));
-
+
/* Frees */
g_object_unref (query);
g_object_unref (all_folders);
g_free (info->retrieve_type);
g_slice_free (UpdateAccountInfo, info);
+ first_time = FALSE;
+
return NULL;
}
/* printf ("DEBUG: %s: info->retrieve_limit = %d\n", __FUNCTION__, info->retrieve_limit); */
+ /* Set account busy */
+ modest_account_mgr_set_account_busy(mgr, account_name, TRUE);
+ priv->account_name = g_strdup(account_name);
+
thread = g_thread_create (update_account_thread, info, FALSE, NULL);
return TRUE;
helper->mail_op = self;
helper->user_callback = user_callback;
helper->user_data = user_data;
+ helper->header = g_object_ref (header);
tny_folder_get_msg_async (folder, header, get_msg_cb, get_msg_status_cb, helper);
/* If user defined callback function was defined, call it */
if (helper->user_callback) {
- helper->user_callback (self, NULL, msg, helper->user_data);
+ helper->user_callback (self, helper->header, msg, helper->user_data);
}
out:
/* Free */
+ g_object_unref (helper->header);
g_slice_free (GetMsgAsyncHelper, helper);
/* Notify about operation end */
priv->total = 1;
state = modest_mail_operation_clone_state (self);
+ state->bytes_done = status->position;
+ state->bytes_total = status->of_total;
g_signal_emit (G_OBJECT (self), signals[PROGRESS_CHANGED_SIGNAL], 0, state, NULL);
g_slice_free (ModestMailOperationState, state);
}
modest_mail_operation_notify_end (ModestMailOperation *self)
{
ModestMailOperationState *state;
+ ModestMailOperationPrivate *priv = NULL;
+
+ g_return_if_fail (self);
+
+ priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
+ if (!priv) {
+ g_warning ("BUG: %s: priv == NULL", __FUNCTION__);
+ return;
+ }
+
+ /* Set the account back to not busy */
+ if (priv->account_name) {
+ modest_account_mgr_set_account_busy(modest_runtime_get_account_mgr(), priv->account_name,
+ FALSE);
+ g_free(priv->account_name);
+ priv->account_name = NULL;
+ }
+
/* Notify the observers about the mail opertation end */
state = modest_mail_operation_clone_state (self);
g_signal_emit (G_OBJECT (self), signals[PROGRESS_CHANGED_SIGNAL], 0, state, NULL);