MODEST_MAIL_OPERATION_NUM_ERROR_CODES
};
-static void set_error (ModestMailOperation *mail_operation,
+static void set_error (ModestMailOperation *mail_operation,
ModestMailOperationErrorCode error_code,
const gchar *fmt, ...);
-static void status_update_cb (TnyFolder *folder,
+static void status_update_cb (TnyFolder *folder,
const gchar *what,
gint status,
+ gint oftotal,
gpointer user_data);
-static void folder_refresh_cb (TnyFolder *folder,
+static void folder_refresh_cb (TnyFolder *folder,
gboolean canceled,
GError **err,
gpointer user_data);
-static void add_attachments (TnyMsg *msg,
+static void update_folders_cb (TnyFolderStore *self,
+ TnyList *list,
+ GError **err,
+ gpointer user_data);
+static void add_attachments (TnyMsg *msg,
GList *attachments_list);
typedef struct _ModestMailOperationPrivate ModestMailOperationPrivate;
struct _ModestMailOperationPrivate {
- guint failed;
- guint canceled;
guint done;
guint total;
- GMutex *cb_lock;
ModestMailOperationStatus status;
GError *error;
};
MODEST_TYPE_MAIL_OPERATION, \
ModestMailOperationPrivate))
+typedef struct _RefreshFolderAsyncHelper
+{
+ ModestMailOperation *mail_op;
+ TnyIterator *iter;
+ guint failed;
+ guint canceled;
+
+} RefreshFolderAsyncHelper;
+
/* some utility functions */
static char * get_content_type(const gchar *s);
static gboolean is_ascii(const gchar *s);
priv->status = MODEST_MAIL_OPERATION_STATUS_INVALID;
priv->error = NULL;
priv->done = 0;
- priv->failed = 0;
- priv->canceled = 0;
priv->total = 0;
- priv->cb_lock = g_mutex_new ();
}
static void
priv->error = NULL;
}
- g_mutex_free (priv->cb_lock);
-
G_OBJECT_CLASS(parent_class)->finalize (obj);
}
if (cc) g_string_append_printf (tmp, ",%s",cc);
if (bcc) g_string_append_printf (tmp, ",%s",bcc);
- /* Remove my own address from the cc list */
+ /* Remove my own address from the cc list. TODO:
+ remove also the To: of the new message, needed due
+ to the new reply_to feature */
new_cc = (gchar *)
modest_text_utils_remove_address ((const gchar *) tmp->str,
- (const gchar *) from);
+ from);
/* FIXME: remove also the mails from the new To: */
tny_header_set_cc (new_header, new_cc);
}
static void
-status_update_cb (TnyFolder *folder, const gchar *what, gint status, gpointer user_data)
+status_update_cb (TnyFolder *folder, const gchar *what, gint status, gint oftotal, gpointer user_data)
{
- g_print ("%s status: %d\n", what, status);
+ g_print ("%s status: %d, of total %d\n", what, status, oftotal);
}
static void
{
ModestMailOperation *mail_op = NULL;
ModestMailOperationPrivate *priv = NULL;
+ RefreshFolderAsyncHelper *helper;
- mail_op = MODEST_MAIL_OPERATION (user_data);
+ helper = (RefreshFolderAsyncHelper *) user_data;
+ mail_op = MODEST_MAIL_OPERATION (helper->mail_op);
priv = MODEST_MAIL_OPERATION_GET_PRIVATE(mail_op);
- g_mutex_lock (priv->cb_lock);
-
if ((canceled && *err) || *err) {
priv->error = g_error_copy (*err);
- priv->failed++;
+ helper->failed++;
} else if (canceled) {
- priv->canceled++;
+ helper->canceled++;
set_error (mail_op,
MODEST_MAIL_OPERATION_ERROR_OPERATION_CANCELED,
_("Error trying to refresh folder %s. Operation canceled"),
if (priv->done == priv->total)
priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
- else if ((priv->done + priv->canceled + priv->failed) == priv->total)
- if (priv->failed == priv->total)
+ else if ((priv->done + helper->canceled + helper->failed) == priv->total)
+ if (helper->failed == priv->total)
priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
- else if (priv->failed == priv->total)
+ else if (helper->failed == priv->total)
priv->status = MODEST_MAIL_OPERATION_STATUS_CANCELED;
else
priv->status = MODEST_MAIL_OPERATION_STATUS_FINISHED_WITH_ERRORS;
- g_mutex_unlock (priv->cb_lock);
-
+ tny_iterator_next (helper->iter);
+ if (tny_iterator_is_done (helper->iter)) {
+ TnyList *list;
+ list = tny_iterator_get_list (helper->iter);
+ g_object_unref (G_OBJECT (helper->iter));
+ g_object_unref (G_OBJECT (list));
+ g_slice_free (RefreshFolderAsyncHelper, helper);
+ } else {
+ tny_folder_refresh_async (TNY_FOLDER (tny_iterator_get_current (helper->iter)),
+ folder_refresh_cb,
+ status_update_cb,
+ helper);
+ }
g_signal_emit (G_OBJECT (mail_op), signals[PROGRESS_CHANGED_SIGNAL], 0, NULL);
}
+
+static void
+update_folders_cb (TnyFolderStore *self, TnyList *list, GError **err, gpointer user_data)
+{
+ ModestMailOperation *mail_op;
+ ModestMailOperationPrivate *priv;
+ TnyList *folders;
+ RefreshFolderAsyncHelper *helper;
+
+ mail_op = MODEST_MAIL_OPERATION (user_data);
+ priv = MODEST_MAIL_OPERATION_GET_PRIVATE (mail_op);
+
+ priv->total = tny_list_get_length (list);
+ priv->done = 0;
+ priv->status = MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS;
+
+ helper = g_slice_new0 (RefreshFolderAsyncHelper);
+ helper->mail_op = mail_op;
+ helper->iter = tny_list_create_iterator (list);
+ helper->failed = 0;
+ helper->canceled = 0;
+
+ /* Async refresh folders */
+ tny_folder_refresh_async (TNY_FOLDER (tny_iterator_get_current (helper->iter)),
+ folder_refresh_cb,
+ status_update_cb,
+ helper);
+}
+
gboolean
modest_mail_operation_update_account (ModestMailOperation *mail_op,
TnyStoreAccount *store_account)
{
ModestMailOperationPrivate *priv;
TnyList *folders;
- TnyIterator *ifolders;
- TnyFolder *cur_folder;
TnyFolderStoreQuery *query;
- g_return_if_fail (MODEST_IS_MAIL_OPERATION (mail_op));
- g_return_if_fail (TNY_IS_STORE_ACCOUNT(store_account));
+ g_return_val_if_fail (MODEST_IS_MAIL_OPERATION (mail_op), FALSE);
+ g_return_val_if_fail (TNY_IS_STORE_ACCOUNT(store_account), FALSE);
priv = MODEST_MAIL_OPERATION_GET_PRIVATE(mail_op);
- /* Get subscribed folders */
+ /* Get subscribed folders & refresh them */
folders = TNY_LIST (tny_simple_list_new ());
query = tny_folder_store_query_new ();
tny_folder_store_query_add_item (query, NULL, TNY_FOLDER_STORE_QUERY_OPTION_SUBSCRIBED);
- tny_folder_store_get_folders (TNY_FOLDER_STORE (store_account),
- folders, query, NULL); /* FIXME */
+ tny_folder_store_get_folders_async (TNY_FOLDER_STORE (store_account),
+ folders, update_folders_cb, query, mail_op);
g_object_unref (query);
-
- ifolders = tny_list_create_iterator (folders);
- priv->total = tny_list_get_length (folders);
- priv->done = 0;
- priv->status = MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS;
-
- gint i =0;
- /* Async refresh folders. Reference the mail_op because
- tinymail destroys the user_data */
- for (tny_iterator_first (ifolders);
- !tny_iterator_is_done (ifolders);
- tny_iterator_next (ifolders)) {
-
- cur_folder = TNY_FOLDER (tny_iterator_get_current (ifolders));
- tny_folder_refresh_async (cur_folder, folder_refresh_cb,
- status_update_cb, g_object_ref (mail_op));
- }
-
- g_object_unref (ifolders);
return TRUE;
}
priv = MODEST_MAIL_OPERATION_GET_PRIVATE (mail_op);
- g_mutex_lock (priv->cb_lock);
-
if (priv->status == MODEST_MAIL_OPERATION_STATUS_SUCCESS ||
priv->status == MODEST_MAIL_OPERATION_STATUS_FAILED ||
priv->status == MODEST_MAIL_OPERATION_STATUS_CANCELED ||
} else {
retval = FALSE;
}
- g_mutex_unlock (priv->cb_lock);
return retval;
}
g_object_unref (G_OBJECT (iter));
}
+
+/* FIXME: this method should be rewritten when the policy for the
+ Trash folder becomes clearer */
static TnyFolder *
modest_mail_operation_find_trash_folder (ModestMailOperation *mail_op,
TnyStoreAccount *store_account)