Fixes NB#113192, add mailer addresses to the address book after sending
[modest] / src / modest-mail-operation.c
index 61eead7..c9986db 100644 (file)
@@ -63,6 +63,9 @@
 #include <libgnomevfs/gnome-vfs.h>
 #include "modest-utils.h"
 #include "modest-debug.h"
+#ifdef MODEST_USE_LIBTIME
+#include <clockd/libtime.h>
+#endif
 
 #define KB 1024
 
@@ -765,35 +768,39 @@ send_mail_on_added_to_outbox (TnySendQueue *send_queue,
                ModestTnySendQueue *queue;
 
                trans_account = (TnyTransportAccount *) modest_mail_operation_get_account (self);
-               queue = modest_runtime_get_send_queue (trans_account, TRUE);
-               if (queue) {
-                       RunQueueHelper *helper;
-
-                       /* Create the helper */
-                       helper = g_slice_new0 (RunQueueHelper);
-                       helper->queue = g_object_ref (queue);
-                       helper->self = g_object_ref (self);
-
-                       /* if sending is ongoing wait for the queue to
-                          stop. Otherwise wait for the queue-start
-                          signal. It could happen that the queue
-                          could not start, then check also the error
-                          happened signal */
-                       if (modest_tny_send_queue_sending_in_progress (queue)) {
-                               run_queue_start (TNY_SEND_QUEUE (queue), helper);
+               if (trans_account) {
+                       queue = modest_runtime_get_send_queue (trans_account, TRUE);
+                       if (queue) {
+                               RunQueueHelper *helper;
+
+                               /* Create the helper */
+                               helper = g_slice_new0 (RunQueueHelper);
+                               helper->queue = g_object_ref (queue);
+                               helper->self = g_object_ref (self);
+
+                               /* if sending is ongoing wait for the queue to
+                                  stop. Otherwise wait for the queue-start
+                                  signal. It could happen that the queue
+                                  could not start, then check also the error
+                                  happened signal */
+                               if (modest_tny_send_queue_sending_in_progress (queue)) {
+                                       run_queue_start (TNY_SEND_QUEUE (queue), helper);
+                               } else {
+                                       helper->start_handler = g_signal_connect (queue, "queue-start", 
+                                                                                 G_CALLBACK (run_queue_start), 
+                                                                                 helper);
+                                       helper->error_handler = g_signal_connect (queue, "error-happened", 
+                                                                                 G_CALLBACK (run_queue_error_happened), 
+                                                                                 helper);
+                               }
                        } else {
-                               helper->start_handler = g_signal_connect (queue, "queue-start", 
-                                                                         G_CALLBACK (run_queue_start), 
-                                                                         helper);
-                               helper->error_handler = g_signal_connect (queue, "error-happened", 
-                                                                         G_CALLBACK (run_queue_error_happened), 
-                                                                         helper);
+                               /* Finalize this mail operation */
+                               modest_mail_operation_notify_end (self);
                        }
+                       g_object_unref (trans_account);
                } else {
-                       /* Finalize this mail operation */
-                       modest_mail_operation_notify_end (self);
+                       g_warning ("No transport account for the operation");
                }
-               g_object_unref (trans_account);
        }
 
        g_object_unref (helper->mail_op);
@@ -1566,6 +1573,7 @@ inbox_refreshed_cb (TnyFolder *inbox,
        ModestAccountRetrieveType retrieve_type;
        TnyList *new_headers = NULL;
        gboolean headers_only, ignore_limit;
+       time_t time_to_store;
 
        info = (UpdateAccountInfo *) user_data;
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE (info->mail_op);
@@ -1596,7 +1604,14 @@ inbox_refreshed_cb (TnyFolder *inbox,
        }
 
        /* Set the last updated as the current time */
-       modest_account_mgr_set_last_updated (mgr, tny_account_get_id (priv->account), time (NULL));
+#ifdef MODEST_USE_LIBTIME
+       struct tm utc_tm;
+       time_get_utc (&utc_tm);
+       time_to_store = time_mktime (&utc_tm, "GMT");
+#else
+       time_to_store = time (NULL);
+#endif
+       modest_account_mgr_set_last_updated (mgr, tny_account_get_id (priv->account), time_to_store);
 
        /* Get the message max size */
        max_size  = modest_conf_get_int (modest_runtime_get_conf (),
@@ -2795,7 +2810,7 @@ remove_msgs_async_cb (TnyFolder *folder,
                return;
        }
 
-       account = tny_folder_get_account (folder);
+       account = modest_tny_folder_get_account (folder);
        account_name = modest_tny_account_get_parent_modest_account_name_for_server_account (account);
        leave_on_server =
                modest_account_mgr_get_leave_on_server (modest_runtime_get_account_mgr (),
@@ -2826,6 +2841,7 @@ modest_mail_operation_remove_msgs (ModestMailOperation *self,
        TnyHeader *header = NULL;
        TnyList *remove_headers = NULL;
        TnyFolderType folder_type = TNY_FOLDER_TYPE_UNKNOWN;
+       ModestTnyAccountStore *accstore = modest_runtime_get_account_store();
 
        g_return_if_fail (MODEST_IS_MAIL_OPERATION (self));
        g_return_if_fail (TNY_IS_LIST (headers));
@@ -2837,52 +2853,67 @@ modest_mail_operation_remove_msgs (ModestMailOperation *self,
                g_warning ("%s: list of headers is empty\n", __FUNCTION__);
                goto cleanup; /* nothing to do */
        }
-       
+
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
-       remove_headers = g_object_ref(headers);
 
        /* Get folder from first header and sync it */
-       iter = tny_list_create_iterator (headers);      
+       iter = tny_list_create_iterator (headers);
        header = TNY_HEADER (tny_iterator_get_current (iter));
+       g_object_unref (iter);
 
-       folder = tny_header_get_folder (header);        
+       folder = tny_header_get_folder (header);
        if (!TNY_IS_FOLDER(folder)) {
                g_warning ("%s: could not get folder for header\n", __FUNCTION__);
                goto cleanup;
        }
 
-       /* Don't remove messages that are being sent */
+       /* Use the merged folder if we're removing messages from outbox */
        if (modest_tny_folder_is_local_folder (folder)) {
+               ModestTnyLocalFoldersAccount *local_account;
+
+               local_account = (ModestTnyLocalFoldersAccount *)
+                       modest_tny_account_store_get_local_folders_account (accstore);
                folder_type = modest_tny_folder_get_local_or_mmc_folder_type (folder);
+               if (folder_type == TNY_FOLDER_TYPE_OUTBOX) {
+                       g_object_unref (folder);
+                       folder = modest_tny_local_folders_account_get_merged_outbox (local_account);
+               }
+               g_object_unref (local_account);
        }
+
        if (folder_type == TNY_FOLDER_TYPE_OUTBOX) {
-               TnyTransportAccount *traccount = NULL;
-               ModestTnyAccountStore *accstore = modest_runtime_get_account_store();
-               traccount = modest_tny_account_store_get_transport_account_from_outbox_header(accstore, header);
-               if (traccount) {
-                       ModestTnySendQueueStatus status;
-                       ModestTnySendQueue *send_queue = modest_runtime_get_send_queue(traccount, TRUE);
-
-                       if (TNY_IS_SEND_QUEUE (send_queue)) {
-                               TnyIterator *iter = tny_list_create_iterator(headers);
-                               g_object_unref(remove_headers);
-                               remove_headers = TNY_LIST(tny_simple_list_new());
-                               while (!tny_iterator_is_done(iter)) {
+               TnyIterator *headers_iter = tny_list_create_iterator (headers);
+
+               while (!tny_iterator_is_done (headers_iter)) {
+                       TnyTransportAccount *traccount = NULL;
+                       TnyHeader *hdr = NULL;
+
+                       hdr = TNY_HEADER (tny_iterator_get_current (headers_iter));
+                       traccount = modest_tny_account_store_get_transport_account_from_outbox_header (accstore,
+                                                                                                      header);
+                       if (traccount) {
+                               ModestTnySendQueueStatus status;
+                               ModestTnySendQueue *send_queue;
+
+                               send_queue = modest_runtime_get_send_queue(traccount, TRUE);
+                               if (TNY_IS_SEND_QUEUE (send_queue)) {
                                        char *msg_id;
-                                       TnyHeader *hdr = TNY_HEADER(tny_iterator_get_current(iter));
+
                                        msg_id = modest_tny_send_queue_get_msg_id (hdr);
                                        status = modest_tny_send_queue_get_msg_status(send_queue, msg_id);
                                        if (status != MODEST_TNY_SEND_QUEUE_SENDING) {
+                                               if (G_UNLIKELY (remove_headers == NULL))
+                                                       remove_headers = tny_simple_list_new ();
                                                tny_list_append(remove_headers, G_OBJECT(hdr));
                                        }
-                                       g_object_unref(hdr);
                                        g_free(msg_id);
-                                       tny_iterator_next(iter);
                                }
-                               g_object_unref(iter);
+                               g_object_unref(traccount);
                        }
-                       g_object_unref(traccount);
+                       g_object_unref(hdr);
+                       tny_iterator_next (headers_iter);
                }
+               g_object_unref(headers_iter);
        }
 
        /* Get account and set it into mail_operation */
@@ -2890,6 +2921,9 @@ modest_mail_operation_remove_msgs (ModestMailOperation *self,
        priv->op_type = MODEST_MAIL_OPERATION_TYPE_DELETE;
        priv->status = MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS;
 
+       if (!remove_headers)
+               remove_headers = g_object_ref (headers);
+
        /* remove message from folder */
        modest_mail_operation_notify_start (self);
        tny_folder_remove_msgs_async (folder, remove_headers, remove_msgs_async_cb, 
@@ -2900,8 +2934,6 @@ cleanup:
                g_object_unref (remove_headers);
        if (header)
                g_object_unref (header);
-       if (iter)
-               g_object_unref (iter);
        if (folder)
                g_object_unref (folder);
 }