X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-mail-operation.c;h=a84ba177c3ba2ad76d5de11c2dcc072a3e69c200;hp=19274c687f76df2a98a29597809e099a2c468352;hb=58862afe7770c07e425d5f893f552d0342b82fbe;hpb=45cb983bddff407659d517414bf5ecbca8aea382 diff --git a/src/modest-mail-operation.c b/src/modest-mail-operation.c index 19274c6..a84ba17 100644 --- a/src/modest-mail-operation.c +++ b/src/modest-mail-operation.c @@ -58,7 +58,6 @@ #include "modest-mail-operation.h" #define KB 1024 -#define GET_SIZE_BUFFER_SIZE 128 /* * Remove all these #ifdef stuff when the tinymail's idle calls become @@ -131,6 +130,7 @@ typedef struct _XFerMsgAsyncHelper TnyList *headers; TnyFolder *dest_folder; XferMsgsAsynUserCallback user_callback; + gboolean delete; gpointer user_data; } XFerMsgAsyncHelper; @@ -417,6 +417,7 @@ modest_mail_operation_cancel (ModestMailOperation *self) /* Cancel the mail operation. We need to wrap it between this start/stop operations to allow following calls to the account */ + g_return_val_if_fail (priv->account, FALSE); tny_account_cancel (priv->account); return canceled; @@ -574,9 +575,14 @@ idle_create_msg_cb (gpointer idle_data) { CreateMsgIdleInfo *info = (CreateMsgIdleInfo *) idle_data; + /* GDK LOCK: this one is here because we call this from a thread */ + /* callback could be 'send mail' or 'save to draft'; i dont knonw */ + /* why these tow operations must serialized, i think it could be */ + /* removed */ gdk_threads_enter (); info->callback (info->mail_op, info->msg, info->userdata); gdk_threads_leave (); + g_object_unref (info->mail_op); if (info->msg) g_object_unref (info->msg); @@ -671,6 +677,7 @@ modest_mail_operation_create_msg (ModestMailOperation *self, info->from = g_strdup (from); info->to = g_strdup (to); info->cc = g_strdup (cc); + info->bcc = g_strdup (bcc); info->subject = g_strdup (subject); info->plain_body = g_strdup (plain_body); info->html_body = g_strdup (html_body); @@ -696,7 +703,8 @@ modest_mail_operation_send_new_mail_cb (ModestMailOperation *self, gpointer userdata) { SendNewMailInfo *info = (SendNewMailInfo *) userdata; - TnyFolder *folder; + TnyFolder *draft_folder = NULL; + TnyFolder *outbox_folder = NULL; TnyHeader *header; if (!msg) { @@ -706,22 +714,38 @@ modest_mail_operation_send_new_mail_cb (ModestMailOperation *self, /* Call mail operation */ modest_mail_operation_send_mail (self, info->transport_account, msg); - folder = modest_tny_account_get_special_folder (TNY_ACCOUNT (info->transport_account), TNY_FOLDER_TYPE_DRAFTS); - if (folder) { - if (info->draft_msg != NULL) { - header = tny_msg_get_header (info->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); - tny_header_set_flags (header, TNY_HEADER_FLAG_DELETED); - tny_header_set_flags (header, TNY_HEADER_FLAG_SEEN); - g_object_unref (header); - } + /* Remove old mail from its source folder */ + draft_folder = modest_tny_account_get_special_folder (TNY_ACCOUNT (info->transport_account), TNY_FOLDER_TYPE_DRAFTS); + outbox_folder = modest_tny_account_get_special_folder (TNY_ACCOUNT (info->transport_account), TNY_FOLDER_TYPE_OUTBOX); + if (info->draft_msg != NULL) { + TnyFolder *folder = NULL; + TnyFolder *src_folder = NULL; + TnyFolderType folder_type; + folder = tny_msg_get_folder (info->draft_msg); + if (folder == NULL) goto end; + folder_type = modest_tny_folder_guess_folder_type (folder); + if (folder_type == TNY_FOLDER_TYPE_OUTBOX) + src_folder = outbox_folder; + else + src_folder = draft_folder; + + /* 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. */ + header = tny_msg_get_header (info->draft_msg); + tny_folder_remove_msg (src_folder, header, NULL); + tny_header_set_flags (header, TNY_HEADER_FLAG_DELETED); + tny_header_set_flags (header, TNY_HEADER_FLAG_SEEN); + g_object_unref (header); + g_object_unref (folder); } end: if (info->draft_msg) g_object_unref (info->draft_msg); + if (draft_folder) + g_object_unref (draft_folder); + if (outbox_folder) + g_object_unref (outbox_folder); if (info->transport_account) g_object_unref (info->transport_account); g_slice_free (SendNewMailInfo, info); @@ -781,6 +805,7 @@ modest_mail_operation_save_to_drafts_cb (ModestMailOperation *self, TnyMsg *msg, gpointer userdata) { + TnyFolder *src_folder = NULL; TnyFolder *folder = NULL; TnyHeader *header = NULL; ModestMailOperationPrivate *priv = NULL; @@ -804,20 +829,21 @@ modest_mail_operation_save_to_drafts_cb (ModestMailOperation *self, goto end; } - if (info->draft_msg != NULL) { + if (!priv->error) + tny_folder_add_msg (folder, msg, &(priv->error)); + + if ((!priv->error) && (info->draft_msg != NULL)) { header = tny_msg_get_header (info->draft_msg); + src_folder = tny_header_get_folder (header); /* Remove the old draft expunging it */ - tny_folder_remove_msg (folder, header, NULL); + tny_folder_remove_msg (src_folder, header, NULL); tny_header_set_flags (header, TNY_HEADER_FLAG_DELETED); tny_header_set_flags (header, TNY_HEADER_FLAG_SEEN); - tny_folder_sync (folder, FALSE, &(priv->error)); /* FALSE --> don't expunge */ + tny_folder_sync_async (src_folder, TRUE, NULL, NULL, NULL); /* expunge */ g_object_unref (header); } if (!priv->error) - tny_folder_add_msg (folder, msg, &(priv->error)); - - if (!priv->error) priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS; else priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED; @@ -829,6 +855,8 @@ modest_mail_operation_save_to_drafts_cb (ModestMailOperation *self, end: if (folder) g_object_unref (G_OBJECT(folder)); + if (src_folder) + g_object_unref (G_OBJECT(src_folder)); if (info->edit_window) g_object_unref (G_OBJECT(info->edit_window)); if (info->draft_msg) @@ -997,10 +1025,11 @@ recurse_folders (TnyFolderStore *store, TnyFolderStoreQuery *query, TnyList *all while (!tny_iterator_is_done (iter)) { TnyFolderStore *folder = (TnyFolderStore*) tny_iterator_get_current (iter); - - tny_list_prepend (all_folders, G_OBJECT (folder)); - recurse_folders (folder, query, all_folders); - g_object_unref (G_OBJECT (folder)); + if (folder) { + tny_list_prepend (all_folders, G_OBJECT (folder)); + recurse_folders (folder, query, all_folders); + g_object_unref (G_OBJECT (folder)); + } tny_iterator_next (iter); } @@ -1020,6 +1049,11 @@ idle_notify_progress (gpointer data) state = modest_mail_operation_clone_state (mail_op); #ifdef TINYMAIL_IDLES_NOT_LOCKED_YET + /* GDK LOCK: this one is here because we call this from a thread */ + /* However, refresh_account operations call async operations on */ + /* on tinymail, which also emmit 'progress-changed' signal. This */ + /* may be is required to serialize executions of progress-changed'*/ + /* signal handlers. */ gdk_threads_enter (); #endif g_signal_emit (G_OBJECT (mail_op), signals[PROGRESS_CHANGED_SIGNAL], 0, state, NULL); @@ -1043,6 +1077,11 @@ idle_notify_progress_once (gpointer data) pair = (ModestPair *) data; + /* GDK LOCK: this one is here because we call this from a thread */ + /* However, refresh_account operations call async operations on */ + /* on tinymail, which also emmit 'progress-changed' signal. This */ + /* may be is required to serialize executions of progress-changed'*/ + /* signal handlers */ #ifdef TINYMAIL_IDLES_NOT_LOCKED_YET gdk_threads_enter (); #endif @@ -1098,6 +1137,10 @@ compare_headers_by_date (gconstpointer a, static gboolean set_last_updated_idle (gpointer data) { + /* GDK LOCK: this one is here because we call this from a thread */ + /* and executed with g_idle_add_full during process of method */ + /* update_account_thread, to serialize access to LAST_UPDATED */ + /* property of each account */ gdk_threads_enter (); /* It does not matter if the time is not exactly the same than @@ -1121,6 +1164,10 @@ idle_update_account_cb (gpointer data) idle_info = (UpdateAccountInfo *) data; + /* GDK LOCK: this one is here because we call this from a thread */ + /* and executed with g_idle_add during update_account_thread, to */ + /* serialize the execution of refresh user callback (mainloop) */ + /* received as parameter in modest_mail_operation_update_account */ gdk_threads_enter (); idle_info->callback (idle_info->mail_op, idle_info->new_headers, @@ -1155,11 +1202,17 @@ update_account_thread (gpointer thr_user_data) 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 + * Previousl, we did this for POP3, to do a logout-login upon send/receive, + * because many POP-servers (like Gmail) do not + * show any updates unless we do that. + * But that didn't work with gmail anyway, + * and tinymail now takes care of this itself by disconnecting + * automatically after using the connection. */ - if (!first_time && 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 we're already running in a different thread than the UI */ @@ -1178,8 +1231,10 @@ update_account_thread (gpointer thr_user_data) iter = tny_list_create_iterator (all_folders); while (!tny_iterator_is_done (iter)) { TnyFolderStore *folder = TNY_FOLDER_STORE (tny_iterator_get_current (iter)); - - recurse_folders (folder, query, all_folders); + if (folder) { + recurse_folders (folder, query, all_folders); + g_object_unref (folder); + } tny_iterator_next (iter); } g_object_unref (G_OBJECT (iter)); @@ -1245,7 +1300,9 @@ update_account_thread (gpointer thr_user_data) g_object_unref (observer); observer = NULL; - g_object_unref (G_OBJECT (folder)); + if (folder) + g_object_unref (G_OBJECT (folder)); + if (priv->error) priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED; @@ -1584,9 +1641,12 @@ modest_mail_operation_remove_folder (ModestMailOperation *self, trash_folder = modest_tny_account_get_special_folder (account, TNY_FOLDER_TYPE_TRASH); /* TODO: error_handling */ - modest_mail_operation_xfer_folder (self, folder, + if (trash_folder) { + modest_mail_operation_xfer_folder (self, folder, TNY_FOLDER_STORE (trash_folder), TRUE, NULL, NULL); + g_object_unref (trash_folder); + } } else { TnyFolderStore *parent = tny_folder_get_folder_store (folder); @@ -1627,6 +1687,11 @@ transfer_folder_status_cb (GObject *obj, state = modest_mail_operation_clone_state (self); #ifdef TINYMAIL_IDLES_NOT_LOCKED_YET + /* GDK LOCK: this one is here because we call this from a thread */ + /* However, refresh_account operations call async operations on */ + /* on tinymail, which also emmit 'progress-changed' signal. This */ + /* may be is required to serialize executions of progress-changed'*/ + /* signal handlers. */ gdk_threads_enter (); #endif g_signal_emit (G_OBJECT (self), signals[PROGRESS_CHANGED_SIGNAL], 0, state, NULL); @@ -1675,6 +1740,9 @@ transfer_folder_cb (TnyFolder *folder, /* If user defined callback function was defined, call it */ if (helper->user_callback) { + /* GDK LOCK: I think this one can be removed if Tinymail */ + /* wraps the lock itself. */ + /* This function is called as idle in tinymail. */ gdk_threads_enter (); helper->user_callback (priv->source, helper->user_data); gdk_threads_leave (); @@ -1715,8 +1783,8 @@ new_name_valid_if_local_account (ModestMailOperationPrivate *priv, { if (TNY_IS_ACCOUNT (into) && modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (into)) && - modest_tny_local_folders_account_extra_folder_exists (MODEST_TNY_LOCAL_FOLDERS_ACCOUNT (into), - new_name)) { + modest_tny_local_folders_account_folder_name_in_use (MODEST_TNY_LOCAL_FOLDERS_ACCOUNT (into), + new_name)) { priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED; g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR, MODEST_MAIL_OPERATION_ERROR_FOLDER_RULES, @@ -1753,7 +1821,9 @@ modest_mail_operation_xfer_folder (ModestMailOperation *self, parent_rules = modest_tny_folder_get_rules (TNY_FOLDER (parent)); /* The moveable restriction is applied also to copy operation */ - if ((!TNY_IS_FOLDER_STORE (parent)) || (rules & MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE)) { + if ((gpointer) parent == (gpointer) folder || + (!TNY_IS_FOLDER_STORE (parent)) || + (rules & MODEST_FOLDER_RULES_FOLDER_NON_MOVEABLE)) { printf("DEBUG: %s: Not allowing the move.\n", __FUNCTION__); /* Set status failed and set an error */ priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED; @@ -1918,99 +1988,6 @@ void modest_mail_operation_get_msg (ModestMailOperation *self, } } -static gboolean -idle_get_mime_part_size_cb (gpointer userdata) -{ - GetMimePartSizeInfo *idle_info; - - idle_info = (GetMimePartSizeInfo *) userdata; - - gdk_threads_enter (); - idle_info->callback (idle_info->mail_op, - idle_info->size, - idle_info->userdata); - gdk_threads_leave (); - - g_object_unref (idle_info->mail_op); - g_slice_free (GetMimePartSizeInfo, idle_info); - - return FALSE; -} - -static gpointer -get_mime_part_size_thread (gpointer thr_user_data) -{ - GetMimePartSizeInfo *info; - gchar read_buffer[GET_SIZE_BUFFER_SIZE]; - TnyStream *stream; - gssize readed_size; - gssize total = 0; - ModestMailOperationPrivate *priv; - - info = (GetMimePartSizeInfo *) thr_user_data; - priv = MODEST_MAIL_OPERATION_GET_PRIVATE (info->mail_op); - - stream = tny_camel_mem_stream_new (); - tny_mime_part_decode_to_stream (info->mime_part, stream); - tny_stream_reset (stream); - if (tny_stream_is_eos (stream)) { - tny_stream_close (stream); - stream = tny_mime_part_get_stream (info->mime_part); - } - - while (!tny_stream_is_eos (stream)) { - readed_size = tny_stream_read (stream, read_buffer, GET_SIZE_BUFFER_SIZE); - total += readed_size; - } - - if (info->callback) { - GetMimePartSizeInfo *idle_info; - - idle_info = g_slice_new0 (GetMimePartSizeInfo); - idle_info->mail_op = g_object_ref (info->mail_op); - idle_info->size = total; - idle_info->callback = info->callback; - idle_info->userdata = info->userdata; - g_idle_add (idle_get_mime_part_size_cb, idle_info); - } - - g_idle_add (idle_notify_queue, g_object_ref (info->mail_op)); - - g_object_unref (info->mail_op); - g_object_unref (stream); - g_object_unref (info->mime_part); - g_slice_free (GetMimePartSizeInfo, info); - - return NULL; -} - -void -modest_mail_operation_get_mime_part_size (ModestMailOperation *self, - TnyMimePart *part, - GetMimePartSizeCallback user_callback, - gpointer user_data, - GDestroyNotify notify) -{ - GetMimePartSizeInfo *info; - ModestMailOperationPrivate *priv; - GThread *thread; - - g_return_if_fail (MODEST_IS_MAIL_OPERATION (self)); - g_return_if_fail (TNY_IS_MIME_PART (part)); - - priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self); - - priv->status = MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS; - info = g_slice_new0 (GetMimePartSizeInfo); - info->mail_op = g_object_ref (self); - info->mime_part = g_object_ref (part); - info->callback = user_callback; - info->userdata = user_data; - - thread = g_thread_create (get_mime_part_size_thread, info, FALSE, NULL); - -} - static void get_msg_cb (TnyFolder *folder, gboolean cancelled, @@ -2087,6 +2064,11 @@ get_msg_status_cb (GObject *obj, state->bytes_done = status->position; state->bytes_total = status->of_total; #ifdef TINYMAIL_IDLES_NOT_LOCKED_YET + /* GDK LOCK: this one is here because we call this from a thread */ + /* However, refresh_account operations call async operations on */ + /* on tinymail, which also emmit 'progress-changed' signal. This */ + /* may be is required to serialize executions of progress-changed'*/ + /* signal handlers. */ gdk_threads_enter (); #endif g_signal_emit (G_OBJECT (self), signals[PROGRESS_CHANGED_SIGNAL], 0, state, NULL); @@ -2148,6 +2130,9 @@ get_msgs_full_destroyer (gpointer data) info = (GetFullMsgsInfo *) data; if (info->notify) { + /* GDK LOCK: this one is here because we call this from */ + /* a thread. */ + /* It's used to free user_data, like pasted attachments */ gdk_threads_enter (); info->notify (info->user_data); gdk_threads_leave (); @@ -2219,7 +2204,10 @@ get_msgs_full_thread (gpointer thr_user_data) MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND, "Error trying to get a message. No folder found for header"); } - g_object_unref (header); + + if (header) + g_object_unref (header); + tny_iterator_next (iter); } @@ -2264,10 +2252,16 @@ modest_mail_operation_get_msgs_full (ModestMailOperation *self, 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 = modest_tny_folder_get_account (TNY_FOLDER(folder)); - g_object_unref (header); - g_object_unref (folder); + if (header) { + folder = tny_header_get_folder (header); + if (folder) { + priv->account = modest_tny_folder_get_account (TNY_FOLDER(folder)); + + g_object_unref (folder); + } + + g_object_unref (header); + } if (tny_list_get_length (header_list) == 1) { g_object_unref (iter); @@ -2291,9 +2285,12 @@ modest_mail_operation_get_msgs_full (ModestMailOperation *self, if (iter != NULL) { while (!tny_iterator_is_done (iter) && size_ok) { header = TNY_HEADER (tny_iterator_get_current (iter)); - if (tny_header_get_message_size (header) >= max_size) - size_ok = FALSE; - g_object_unref (header); + if (header) { + if (tny_header_get_message_size (header) >= max_size) + size_ok = FALSE; + g_object_unref (header); + } + tny_iterator_next (iter); } g_object_unref (iter); @@ -2345,20 +2342,23 @@ modest_mail_operation_remove_msg (ModestMailOperation *self, TnyHeader *header, priv->status = MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS; - + /* remove message from folder */ tny_folder_remove_msg (folder, header, &(priv->error)); - if (!priv->error) { - tny_header_set_flags (header, TNY_HEADER_FLAG_DELETED); - tny_header_set_flags (header, TNY_HEADER_FLAG_SEEN); - - if (TNY_IS_CAMEL_IMAP_FOLDER (folder)) - tny_folder_sync(folder, FALSE, &(priv->error)); /* FALSE --> don't expunge */ - else if (TNY_IS_CAMEL_POP_FOLDER (folder)) - tny_folder_sync(folder, TRUE, &(priv->error)); /* TRUE --> expunge */ - else - /* lcoal folders */ - tny_folder_sync(folder, TRUE, &(priv->error)); /* TRUE --> expunge */ - } +/* if (!priv->error) { */ +/* tny_header_set_flags (header, TNY_HEADER_FLAG_DELETED); */ +/* tny_header_set_flags (header, TNY_HEADER_FLAG_SEEN); */ + +/* if (TNY_IS_CAMEL_IMAP_FOLDER (folder)) */ +/* tny_folder_sync_async(folder, FALSE, NULL, NULL, NULL); /\* FALSE --> don't expunge *\/ */ +/* /\* tny_folder_sync (folder, FALSE, &(priv->error)); /\\* FALSE --> don't expunge *\\/ *\/ */ +/* else if (TNY_IS_CAMEL_POP_FOLDER (folder)) */ +/* tny_folder_sync_async(folder, FALSE, NULL, NULL, NULL); /\* TRUE --> dont expunge *\/ */ +/* /\* tny_folder_sync (folder, TRUE, &(priv->error)); /\\* TRUE --> expunge *\\/ *\/ */ +/* else */ +/* /\* local folders *\/ */ +/* tny_folder_sync_async(folder, TRUE, NULL, NULL, NULL); /\* TRUE --> expunge *\/ */ +/* /\* tny_folder_sync (folder, TRUE, &(priv->error)); /\\* TRUE --> expunge *\\/ *\/ */ +/* } */ /* Set status */ @@ -2399,6 +2399,11 @@ transfer_msgs_status_cb (GObject *obj, state = modest_mail_operation_clone_state (self); #ifdef TINYMAIL_IDLES_NOT_LOCKED_YET + /* GDK LOCK: this one is here because we call this from a thread */ + /* However, refresh_account operations call async operations on */ + /* on tinymail, which also emmit 'progress-changed' signal. This */ + /* may be is required to serialize executions of progress-changed'*/ + /* signal handlers. */ gdk_threads_enter (); #endif g_signal_emit (G_OBJECT (self), signals[PROGRESS_CHANGED_SIGNAL], 0, state, NULL); @@ -2415,6 +2420,8 @@ transfer_msgs_cb (TnyFolder *folder, gboolean cancelled, GError **err, gpointer XFerMsgAsyncHelper *helper; ModestMailOperation *self; ModestMailOperationPrivate *priv; + TnyIterator *iter = NULL; + TnyHeader *header = NULL; helper = (XFerMsgAsyncHelper *) user_data; self = helper->mail_op; @@ -2436,22 +2443,48 @@ transfer_msgs_cb (TnyFolder *folder, gboolean cancelled, GError **err, gpointer priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS; } + + /* Mark headers as deleted and seen */ + if ((helper->delete) && + (priv->status == MODEST_MAIL_OPERATION_STATUS_SUCCESS)) { + iter = tny_list_create_iterator (helper->headers); + while (!tny_iterator_is_done (iter)) { + header = TNY_HEADER (tny_iterator_get_current (iter)); + tny_header_set_flags (header, TNY_HEADER_FLAG_DELETED); + tny_header_set_flags (header, TNY_HEADER_FLAG_SEEN); + g_object_unref (header); + + tny_iterator_next (iter); + } + + } + + /* Notify about operation end */ modest_mail_operation_notify_end (self); /* If user defined callback function was defined, call it */ if (helper->user_callback) { + /* GDK LOCK: I think this one can be removed if Tinymail */ + /* wraps the lock itself. */ + /* This function is called as idle in tinymail. */ gdk_threads_enter (); helper->user_callback (priv->source, helper->user_data); gdk_threads_leave (); } /* Free */ - g_object_unref (helper->headers); - g_object_unref (helper->dest_folder); - g_object_unref (helper->mail_op); + if (helper->headers) + g_object_unref (helper->headers); + if (helper->dest_folder) + g_object_unref (helper->dest_folder); + if (helper->mail_op) + g_object_unref (helper->mail_op); + if (folder) + g_object_unref (folder); + if (iter) + g_object_unref (iter); g_slice_free (XFerMsgAsyncHelper, helper); - g_object_unref (folder); } @@ -2463,12 +2496,12 @@ modest_mail_operation_xfer_msgs (ModestMailOperation *self, XferMsgsAsynUserCallback user_callback, gpointer user_data) { - ModestMailOperationPrivate *priv; - TnyIterator *iter; - TnyFolder *src_folder; - XFerMsgAsyncHelper *helper; - TnyHeader *header; - ModestTnyFolderRules rules; + ModestMailOperationPrivate *priv = NULL; + TnyIterator *iter = NULL; + TnyFolder *src_folder = NULL; + XFerMsgAsyncHelper *helper = NULL; + TnyHeader *header = NULL; + ModestTnyFolderRules rules = 0; const gchar *id1 = NULL; const gchar *id2 = NULL; gboolean same_folder = FALSE; @@ -2498,8 +2531,11 @@ modest_mail_operation_xfer_msgs (ModestMailOperation *self, /* Get source folder */ iter = tny_list_create_iterator (headers); header = TNY_HEADER (tny_iterator_get_current (iter)); - src_folder = tny_header_get_folder (header); - g_object_unref (header); + if (header) { + src_folder = tny_header_get_folder (header); + g_object_unref (header); + } + g_object_unref (iter); /* Check folder source and destination */ @@ -2528,6 +2564,7 @@ modest_mail_operation_xfer_msgs (ModestMailOperation *self, helper->headers = g_object_ref(headers); helper->user_callback = user_callback; helper->user_data = user_data; + helper->delete = delete_original; /* Get account and set it into mail_operation */ priv->account = modest_tny_folder_get_account (src_folder); @@ -2557,6 +2594,8 @@ on_refresh_folder (TnyFolder *folder, self = helper->mail_op; priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self); + g_return_if_fail(priv!=NULL); + if (*error) { priv->error = g_error_copy (*error); priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED; @@ -2576,17 +2615,20 @@ on_refresh_folder (TnyFolder *folder, out: /* Call user defined callback, if it exists */ if (helper->user_callback) { + /* GDK LOCK: I think this one can be removed if Tinymail */ + /* wraps the lock itself. */ + /* This function is called as idle in tinymail. */ gdk_threads_enter (); helper->user_callback (self, folder, helper->user_data); gdk_threads_leave (); } /* Free */ -/* g_object_unref (helper->mail_op); */ g_slice_free (RefreshAsyncHelper, helper); /* Notify about operation end */ modest_mail_operation_notify_end (self); + g_object_unref(self); } static void @@ -2614,6 +2656,11 @@ on_refresh_folder_status_update (GObject *obj, state = modest_mail_operation_clone_state (self); #ifdef TINYMAIL_IDLES_NOT_LOCKED_YET + /* GDK LOCK: this one is here because we call this from a thread */ + /* However, refresh_account operations call async operations on */ + /* on tinymail, which also emmit 'progress-changed' signal. This */ + /* may be is required to serialize executions of progress-changed'*/ + /* signal handlers. */ gdk_threads_enter (); #endif g_signal_emit (G_OBJECT (self), signals[PROGRESS_CHANGED_SIGNAL], 0, state, NULL); @@ -2641,7 +2688,7 @@ modest_mail_operation_refresh_folder (ModestMailOperation *self, /* Create the helper */ helper = g_slice_new0 (RefreshAsyncHelper); - helper->mail_op = g_object_ref (self); + helper->mail_op = g_object_ref(self); helper->user_callback = user_callback; helper->user_data = user_data;