Fixes NB#78683
[modest] / src / modest-mail-operation.c
index d9e31bc..688399d 100644 (file)
@@ -805,6 +805,7 @@ create_msg_thread (gpointer thread_data)
 
        g_object_unref (info->mail_op);
        g_slice_free (CreateMsgInfo, info);
+       if (new_msg) g_object_unref(new_msg);
        return NULL;
 }
 
@@ -871,8 +872,16 @@ modest_mail_operation_send_new_mail_cb (ModestMailOperation *self,
        /* Remove old mail from its source folder */
        draft_folder = modest_tny_account_get_special_folder (TNY_ACCOUNT (info->transport_account),
                                                              TNY_FOLDER_TYPE_DRAFTS);
+       if (!draft_folder) {
+               g_warning ("%s: modest_tny_account_get_special_folder(..) returned a NULL drafts folder", __FUNCTION__);
+               goto end;
+       }
        outbox_folder = modest_tny_account_get_special_folder (TNY_ACCOUNT (info->transport_account),
                                                               TNY_FOLDER_TYPE_OUTBOX);
+       if (!outbox_folder) {
+               g_warning ("%s: modest_tny_account_get_special_folder(..) returned a NULL outbox folder", __FUNCTION__);
+               goto end;
+       }
        if (info->draft_msg != NULL) {
                TnyFolder *folder = NULL;
                TnyFolder *src_folder = NULL;
@@ -1050,13 +1059,15 @@ modest_mail_operation_save_to_drafts_cb (ModestMailOperation *self,
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
 
        if (!msg) {
-               g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
-                            MODEST_MAIL_OPERATION_ERROR_INSTANCE_CREATION_FAILED,
-                            "modest: failed to create a new msg\n");
+               if (!(priv->error)) {
+                       g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
+                                    MODEST_MAIL_OPERATION_ERROR_INSTANCE_CREATION_FAILED,
+                                    "modest: failed to create a new msg\n");
+               }
        } else {
                drafts = modest_tny_account_get_special_folder (TNY_ACCOUNT (info->transport_account),
                                                                TNY_FOLDER_TYPE_DRAFTS);
-               if (!drafts) {
+               if (!drafts && !(priv->error)) {
                        g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
                                     MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND,
                                     "modest: failed to create a new msg\n");
@@ -1230,7 +1241,6 @@ typedef struct
        gint pending_calls;
        gboolean poke_all;
        TnyFolderObserver *inbox_observer;
-       guint update_timeout;
        RetrieveAllCallback retrieve_all_cb;
 } UpdateAccountInfo;
 
@@ -1238,11 +1248,6 @@ typedef struct
 static void
 destroy_update_account_info (UpdateAccountInfo *info)
 {
-       if (info->update_timeout) {
-               g_source_remove (info->update_timeout);
-               info->update_timeout = 0;
-       }
-
        g_free (info->account_name);
        g_object_unref (info->folders);
        g_object_unref (info->mail_op);
@@ -1453,8 +1458,9 @@ recurse_folders_async_cb (TnyFolderStore *folder_store,
                        /* Add pending call */
                        info->pending_calls++;
                        
-                       tny_folder_store_get_folders_async (folder, folders, recurse_folders_async_cb, 
-                                                           NULL, NULL, info);
+                       tny_folder_store_get_folders_async (folder, folders, NULL,
+                                                           recurse_folders_async_cb, 
+                                                           NULL, info);
                        
                        g_object_unref (G_OBJECT (folder));
                        
@@ -1496,10 +1502,6 @@ recurse_folders_async_cb (TnyFolderStore *folder_store,
                }
                g_object_unref (iter_all_folders);
 
-               /* Stop the progress notification */
-               g_source_remove (info->update_timeout);
-               info->update_timeout = 0;
-
                /* Refresh the INBOX */
                if (inbox) {
                        /* Refresh the folder. Our observer receives
@@ -1520,30 +1522,6 @@ recurse_folders_async_cb (TnyFolderStore *folder_store,
        }
 }
 
-/* 
- * Issues the "progress-changed" signal. The timer won't be removed,
- * so you must call g_source_remove to stop the signal emission
- */
-static gboolean
-timeout_notify_progress (gpointer data)
-{
-       ModestMailOperation *mail_op = MODEST_MAIL_OPERATION (data);
-       ModestMailOperationState *state;
-
-       state = modest_mail_operation_clone_state (mail_op);
-
-       /* This is a GDK lock because we are an idle callback and
-        * the handlers of this signal can contain Gtk+ code */
-
-       gdk_threads_enter (); /* CHECKED */
-       g_signal_emit (G_OBJECT (mail_op), signals[PROGRESS_CHANGED_SIGNAL], 0, state, NULL);
-       gdk_threads_leave (); /* CHECKED */
-
-       g_slice_free (ModestMailOperationState, state);
-       
-       return TRUE;
-}
-
 void
 modest_mail_operation_update_account (ModestMailOperation *self,
                                      const gchar *account_name,
@@ -1582,18 +1560,29 @@ modest_mail_operation_update_account (ModestMailOperation *self,
        info->account_name = g_strdup (account_name);
        info->callback = callback;
        info->user_data = user_data;
-       info->update_timeout = g_timeout_add (250, timeout_notify_progress, self);
        info->retrieve_all_cb = retrieve_all_cb;
 
        /* Set account busy */
        modest_account_mgr_set_account_busy (modest_runtime_get_account_mgr (), account_name, TRUE);
        modest_mail_operation_notify_start (self);
 
+       /* notify about the start of the operation */ 
+       ModestMailOperationState *state;
+       state = modest_mail_operation_clone_state (self);
+       state->done = 0;
+       state->total = 0;
+
+       /* Start notifying progress */
+       g_signal_emit (G_OBJECT (self), signals[PROGRESS_CHANGED_SIGNAL], 
+                       0, state, NULL);
+       g_slice_free (ModestMailOperationState, state);
+       
        /* Get all folders and continue in the callback */    
        folders = tny_simple_list_new ();
        tny_folder_store_get_folders_async (TNY_FOLDER_STORE (store_account),
-                               folders, recurse_folders_async_cb, 
-                               NULL, NULL, info);
+                                           folders, NULL,
+                                           recurse_folders_async_cb, 
+                                           NULL, info);
 }
 
 /*
@@ -1794,6 +1783,8 @@ modest_mail_operation_remove_folder (ModestMailOperation *self,
                                                    TNY_FOLDER_STORE (trash_folder), 
                                                    TRUE, NULL, NULL);
                        g_object_unref (trash_folder);
+               } else {
+                       g_warning ("%s: modest_tny_account_get_special_folder(..) returned a NULL trash folder", __FUNCTION__);
                }
        } else {
                TnyFolderStore *parent = tny_folder_get_folder_store (folder);
@@ -2153,6 +2144,15 @@ modest_mail_operation_get_msg (ModestMailOperation *self,
        helper->total_bytes = tny_header_get_message_size (header);
 
        modest_mail_operation_notify_start (self);
+       
+       /* notify about the start of the operation */ 
+       ModestMailOperationState *state;
+       state = modest_mail_operation_clone_state (self);
+       state->done = 0;
+       state->total = 0;
+       g_signal_emit (G_OBJECT (self), signals[PROGRESS_CHANGED_SIGNAL], 
+                               0, state, NULL);
+       
        tny_folder_get_msg_async (folder, header, get_msg_async_cb, get_msg_status_cb, helper);
 
        g_object_unref (G_OBJECT (folder));
@@ -2241,7 +2241,7 @@ modest_mail_operation_get_msgs_full (ModestMailOperation *self,
        TnyIterator *iter = NULL;
        
        g_return_if_fail (MODEST_IS_MAIL_OPERATION (self));
-       
+
        /* Init mail operation */
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
        priv->status = MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS;
@@ -2301,6 +2301,14 @@ modest_mail_operation_get_msgs_full (ModestMailOperation *self,
                modest_mail_operation_notify_start (self);
                iter = tny_list_create_iterator (header_list);
                while (!tny_iterator_is_done (iter)) { 
+                       /* notify about the start of the operation */ 
+                       ModestMailOperationState *state;
+                       state = modest_mail_operation_clone_state (self);
+                       state->done = 0;
+                       state->total = 0;
+                       g_signal_emit (G_OBJECT (self), signals[PROGRESS_CHANGED_SIGNAL], 
+                                       0, state, NULL);
+                       
                        GetMsgInfo *msg_info = NULL;
                        TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter));
                        TnyFolder *folder = tny_header_get_folder (header);
@@ -2337,6 +2345,7 @@ modest_mail_operation_get_msgs_full (ModestMailOperation *self,
                if (notify)
                        notify (user_data);
        }
+
 }
 
 
@@ -2368,6 +2377,7 @@ modest_mail_operation_remove_msg (ModestMailOperation *self,
                gboolean expunge, leave_on_server;
                const gchar *account_name;
                TnyAccount *account;
+               ModestTransportStoreProtocol account_proto;
 
                tny_header_set_flag (header, TNY_HEADER_FLAG_DELETED);
                tny_header_set_flag (header, TNY_HEADER_FLAG_SEEN);
@@ -2381,7 +2391,10 @@ modest_mail_operation_remove_msg (ModestMailOperation *self,
                        modest_account_mgr_get_leave_on_server (modest_runtime_get_account_mgr (),
                                                                account_name);
 
-               if (TNY_IS_CAMEL_POP_FOLDER (folder) && !leave_on_server)
+               account_proto = modest_protocol_info_get_transport_store_protocol (tny_account_get_proto (account));
+
+               if (((account_proto == MODEST_PROTOCOL_STORE_POP) && !leave_on_server) ||
+                   modest_tny_folder_is_remote_folder (folder) == FALSE)
                        expunge = TRUE;
                else
                        expunge = FALSE;
@@ -2478,6 +2491,7 @@ modest_mail_operation_remove_msgs (ModestMailOperation *self,
                gboolean expunge, leave_on_server;
                const gchar *account_name;
                TnyAccount *account;
+               ModestTransportStoreProtocol account_proto;
                
                account = tny_folder_get_account (folder);
                account_name = modest_tny_account_get_parent_modest_account_name_for_server_account (account);
@@ -2485,7 +2499,10 @@ modest_mail_operation_remove_msgs (ModestMailOperation *self,
                        modest_account_mgr_get_leave_on_server (modest_runtime_get_account_mgr (),
                                        account_name);
 
-               if (TNY_IS_CAMEL_POP_FOLDER (folder) && !leave_on_server)
+               account_proto = modest_protocol_info_get_transport_store_protocol (tny_account_get_proto (account));
+
+               if (((account_proto == MODEST_PROTOCOL_STORE_POP) && !leave_on_server) ||
+                   modest_tny_folder_is_remote_folder (folder) == FALSE)
                        expunge = TRUE;
                else
                        expunge = FALSE;
@@ -2897,6 +2914,15 @@ modest_mail_operation_refresh_folder  (ModestMailOperation *self,
           updates before the callback call then this could happen. We
           must review the design */
        modest_mail_operation_notify_start (self);
+       
+       /* notify that the operation was started */
+       ModestMailOperationState *state;
+       state = modest_mail_operation_clone_state (self);
+       state->done = 0;
+       state->total = 0;
+       g_signal_emit (G_OBJECT (self), signals[PROGRESS_CHANGED_SIGNAL], 
+                       0, state, NULL);
+       
        tny_folder_refresh_async (folder,
                                  on_refresh_folder,
                                  on_refresh_folder_status_update,