- TnyHeader *header = TNY_HEADER (g_ptr_array_index (new_headers, msg_num));
- TnyFolder *folder = tny_header_get_folder (header);
- TnyMsg *msg = tny_folder_get_msg (folder, header, NULL);
- ModestMailOperationState *state;
- ModestPair* pair;
-
- priv->done++;
- /* We can not just use the mail operation because the
- values of done and total could change before the
- idle is called */
- state = modest_mail_operation_clone_state (info->mail_op);
- pair = modest_pair_new (g_object_ref (info->mail_op), state, FALSE);
- g_idle_add_full (G_PRIORITY_HIGH_IDLE, idle_notify_progress_once,
- pair, (GDestroyNotify) modest_pair_free);
-
- g_object_unref (msg);
- g_object_unref (folder);
-
- msg_num++;
- }
- g_ptr_array_foreach (new_headers, (GFunc) g_object_unref, NULL);
- g_ptr_array_free (new_headers, FALSE);
- }
-
- /* Perform send */
- priv->op_type = MODEST_MAIL_OPERATION_TYPE_SEND;
- priv->done = 0;
- priv->total = 0;
- if (priv->account != NULL)
- g_object_unref (priv->account);
- priv->account = g_object_ref (info->transport_account);
-
- send_queue = modest_runtime_get_send_queue (info->transport_account);
- if (send_queue) {
- timeout = g_timeout_add (250, idle_notify_progress, info->mail_op);
- modest_tny_send_queue_try_to_send (send_queue);
- g_source_remove (timeout);
- } else {
- g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
- MODEST_MAIL_OPERATION_ERROR_INSTANCE_CREATION_FAILED,
- "cannot create a send queue for %s\n",
- tny_account_get_name (TNY_ACCOUNT (info->transport_account)));
- priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
- }
-
- /* Check if the operation was a success */
- if (!priv->error) {
- priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
-
- /* 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))),
- (GDestroyNotify) g_free);
- }
-
- 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));
-
- /* Frees */
- g_object_unref (query);
- g_object_unref (all_folders);
- g_object_unref (info->account);
- g_object_unref (info->transport_account);
- g_free (info->retrieve_type);
- g_slice_free (UpdateAccountInfo, info);
-
- first_time = FALSE;
-
- return NULL;
-}
-
-gboolean
-modest_mail_operation_update_account (ModestMailOperation *self,
- const gchar *account_name,
- UpdateAccountCallback callback,
- gpointer user_data)
-{
- GThread *thread;
- UpdateAccountInfo *info;
- ModestMailOperationPrivate *priv;
- ModestAccountMgr *mgr;
- TnyStoreAccount *modest_account;
- TnyTransportAccount *transport_account;
-
- g_return_val_if_fail (MODEST_IS_MAIL_OPERATION (self), FALSE);
- g_return_val_if_fail (account_name, FALSE);
-
- /* Init mail operation. Set total and done to 0, and do not
- update them, this way the progress objects will know that
- we have no clue about the number of the objects */
- priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
- priv->total = 0;
- 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 (),
- account_name,
- TNY_ACCOUNT_TYPE_STORE);
-
- if (!modest_account) {
- g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
- MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND,
- "cannot get tny store account for %s\n", account_name);
- goto error;
- }
-
-
- /* Get the transport account, we can not do it in the thread
- due to some problems with dbus */
- transport_account = (TnyTransportAccount *)
- modest_tny_account_store_get_transport_account_for_open_connection (modest_runtime_get_account_store(),
- account_name);
- if (!transport_account) {
- g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
- MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND,
- "cannot get tny transport account for %s\n", account_name);
- goto error;
- }
-
- /* Create the helper object */
- info = g_slice_new (UpdateAccountInfo);
- info->mail_op = self;
- info->account = modest_account;
- info->transport_account = transport_account;
- info->callback = callback;
- info->user_data = user_data;
-
- /* Get the message size limit */
- info->max_size = modest_conf_get_int (modest_runtime_get_conf (),
- MODEST_CONF_MSG_SIZE_LIMIT, NULL);
- if (info->max_size == 0)
- info->max_size = G_MAXINT;
- else
- info->max_size = info->max_size * KB;
-
- /* Get per-account retrieval type */
- mgr = modest_runtime_get_account_mgr ();
- info->retrieve_type = modest_account_mgr_get_string (mgr, account_name,
- MODEST_ACCOUNT_RETRIEVE, FALSE);
-
- /* Get per-account message amount retrieval limit */
- info->retrieve_limit = modest_account_mgr_get_int (mgr, account_name,
- MODEST_ACCOUNT_LIMIT_RETRIEVE, FALSE);
- if (info->retrieve_limit == 0)
- info->retrieve_limit = G_MAXINT;
-
- /* 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;
-
- error:
- priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
- if (callback)
- callback (self, 0, user_data);
- modest_mail_operation_notify_end (self);
- return FALSE;
-}
-
-/* ******************************************************************* */
-/* ************************** STORE ACTIONS ************************* */
-/* ******************************************************************* */
-
-
-TnyFolder *
-modest_mail_operation_create_folder (ModestMailOperation *self,
- TnyFolderStore *parent,
- const gchar *name)
-{
- ModestMailOperationPrivate *priv;
- TnyFolder *new_folder = NULL;
-
- g_return_val_if_fail (TNY_IS_FOLDER_STORE (parent), NULL);
- g_return_val_if_fail (name, NULL);
-
- priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
-
- /* Check parent */
- if (TNY_IS_FOLDER (parent)) {
- /* Check folder rules */
- ModestTnyFolderRules rules = modest_tny_folder_get_rules (TNY_FOLDER (parent));
- if (rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE) {
- /* Set status failed and set an error */
- priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
- g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
- MODEST_MAIL_OPERATION_ERROR_FOLDER_RULES,
- _("mail_in_ui_folder_create_error"));
- }
- }
-
- 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,
- _("mail_in_ui_folder_create_error"));
- }
-
- if (!priv->error) {
- /* Create the folder */
- new_folder = tny_folder_store_create_folder (parent, name, &(priv->error));
- CHECK_EXCEPTION (priv, MODEST_MAIL_OPERATION_STATUS_FAILED);
- if (!priv->error)
- priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
- }
-
- /* Notify about operation end */
- modest_mail_operation_notify_end (self);
-
- return new_folder;
-}