2007-06-10 Johannes Schmid <johannes.schmid@openismus.com>
[modest] / src / modest-mail-operation.c
index 4384bf0..da4eb43 100644 (file)
@@ -172,6 +172,7 @@ modest_mail_operation_class_init (ModestMailOperationClass *klass)
                              NULL, NULL,
                              g_cclosure_marshal_VOID__POINTER,
                              G_TYPE_NONE, 1, G_TYPE_POINTER);
+
 }
 
 static void
@@ -487,6 +488,7 @@ modest_mail_operation_send_new_mail (ModestMailOperation *self,
 {
        TnyMsg *new_msg = NULL;
        TnyFolder *folder = NULL;
+       TnyHeader *header = NULL;
        ModestMailOperationPrivate *priv = NULL;
 
        g_return_if_fail (MODEST_IS_MAIL_OPERATION (self));
@@ -517,8 +519,9 @@ modest_mail_operation_send_new_mail (ModestMailOperation *self,
                return;
        }
 
-       /* TODO: add priority handling. It's received in the priority_flags operator, and
-          it should have effect in the sending operation */
+       /* Set priority flags in message */
+       header = tny_msg_get_header (new_msg);
+       tny_header_set_flags (header, priority_flags);
 
        /* Call mail operation */
        modest_mail_operation_send_mail (self, transport_account, new_msg);
@@ -526,7 +529,9 @@ modest_mail_operation_send_new_mail (ModestMailOperation *self,
        folder = modest_tny_account_get_special_folder (TNY_ACCOUNT (transport_account), TNY_FOLDER_TYPE_DRAFTS);
        if (folder) {
                if (draft_msg != NULL) {
-                       TnyHeader *header = tny_msg_get_header (draft_msg);
+                       header = tny_msg_get_header (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);
                        g_object_unref (header);
                }
@@ -549,6 +554,7 @@ modest_mail_operation_save_to_drafts (ModestMailOperation *self,
 {
        TnyMsg *msg = NULL;
        TnyFolder *folder = NULL;
+       TnyHeader *header = NULL;
        ModestMailOperationPrivate *priv = NULL;
 
        g_return_if_fail (MODEST_IS_MAIL_OPERATION (self));
@@ -571,6 +577,10 @@ modest_mail_operation_save_to_drafts (ModestMailOperation *self,
                goto end;
        }
 
+       /* add priority flags */
+       header = tny_msg_get_header (msg);
+       tny_header_set_flags (header, priority_flags);
+
        folder = modest_tny_account_get_special_folder (TNY_ACCOUNT (transport_account), TNY_FOLDER_TYPE_DRAFTS);
        if (!folder) {
                g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
@@ -580,7 +590,7 @@ modest_mail_operation_save_to_drafts (ModestMailOperation *self,
        }
 
        if (draft_msg != NULL) {
-               TnyHeader *header = tny_msg_get_header (draft_msg);
+               header = tny_msg_get_header (draft_msg);
                tny_folder_remove_msg (folder, header, NULL);
                g_object_unref (header);
        }
@@ -768,6 +778,9 @@ static gboolean
 notify_update_account_queue (gpointer data)
 {
        ModestMailOperation *mail_op = MODEST_MAIL_OPERATION (data);
+       ModestMailOperationPrivate *priv = NULL;
+
+       priv = MODEST_MAIL_OPERATION_GET_PRIVATE(mail_op);
 
        modest_mail_operation_notify_end (mail_op);
        g_object_unref (mail_op);
@@ -796,6 +809,21 @@ compare_headers_by_date (gconstpointer a,
                return -1;
 }
 
+static gboolean 
+set_last_updated_idle (gpointer data)
+{
+       /* It does not matter if the time is not exactly the same than
+          the time when this idle was called, it's just an
+          approximation and it won't be very different */
+       modest_account_mgr_set_int (modest_runtime_get_account_mgr (), 
+                                   (gchar *) data, 
+                                   MODEST_ACCOUNT_LAST_UPDATED, 
+                                   time(NULL), 
+                                   TRUE);
+
+       return FALSE;
+}
+
 static gpointer
 update_account_thread (gpointer thr_user_data)
 {
@@ -807,6 +835,7 @@ update_account_thread (gpointer thr_user_data)
        ModestMailOperationPrivate *priv;
        ModestTnySendQueue *send_queue;
 
+
        info = (UpdateAccountInfo *) thr_user_data;
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE(info->mail_op);
 
@@ -866,13 +895,14 @@ update_account_thread (gpointer thr_user_data)
                 * We use the blocking version, because we are already in a separate 
                 * thread.
                 */
-               tny_folder_refresh (TNY_FOLDER (folder), &(priv->error));
 
-               /* If the retrieve type is headers only do nothing more */
                if (!g_ascii_strcasecmp (info->retrieve_type, MODEST_ACCOUNT_RETRIEVE_VALUE_MESSAGES) || 
                    !g_ascii_strcasecmp (info->retrieve_type, MODEST_ACCOUNT_RETRIEVE_VALUE_MESSAGES_AND_ATTACHMENTS)) {
                        TnyIterator *iter;
 
+                       /* If the retrieve type is full messages, refresh and get the messages */
+                       tny_folder_refresh (TNY_FOLDER (folder), &(priv->error));
+
                        iter = tny_list_create_iterator (observer->new_headers);
                        while (!tny_iterator_is_done (iter)) {
                                TnyHeader *header = TNY_HEADER (tny_iterator_get_current (iter));
@@ -889,7 +919,8 @@ update_account_thread (gpointer thr_user_data)
                                tny_iterator_next (iter);
                        }
                        g_object_unref (iter);
-               }
+               } else /* If it's headers only, then just poke the folder status (this will update the unread and total count of folder observers, like the folder list model*/
+                       tny_folder_poke_status (TNY_FOLDER (folder));
                
                tny_folder_remove_observer (TNY_FOLDER (folder), TNY_FOLDER_OBSERVER (observer));
                g_object_unref (observer);
@@ -984,12 +1015,13 @@ update_account_thread (gpointer thr_user_data)
        if (!priv->error) {
                priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
 
-               /* Update the last updated key */
-               modest_account_mgr_set_int (modest_runtime_get_account_mgr (), 
-                                           tny_account_get_id (TNY_ACCOUNT (info->account)), 
-                                           MODEST_ACCOUNT_LAST_UPDATED, 
-                                           time(NULL), 
-                                           TRUE);
+               /* Update the last updated key. TODO: this causes
+                  sometimes an error in dbus, in order to fix this we
+                  must call gconf from the main loop */
+               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:
@@ -1040,7 +1072,7 @@ modest_mail_operation_update_account (ModestMailOperation *self,
        
        /* Get the Modest account */
        modest_account = (TnyStoreAccount *)
-               modest_tny_account_store_get_tny_account_by_account (modest_runtime_get_account_store (),
+               modest_tny_account_store_get_server_account (modest_runtime_get_account_store (),
                                                                     account_name,
                                                                     TNY_ACCOUNT_TYPE_STORE);
 
@@ -1050,6 +1082,7 @@ modest_mail_operation_update_account (ModestMailOperation *self,
                             MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND,
                             "cannot get tny store account for %s\n", account_name);
                modest_mail_operation_notify_end (self);
+
                return FALSE;
        }
 
@@ -1064,6 +1097,7 @@ modest_mail_operation_update_account (ModestMailOperation *self,
                             MODEST_MAIL_OPERATION_ERROR_ITEM_NOT_FOUND,
                             "cannot get tny transport account for %s\n", account_name);
                modest_mail_operation_notify_end (self);
+
                return FALSE;
        }