2007-06-10 Johannes Schmid <johannes.schmid@openismus.com>
[modest] / src / modest-mail-operation.c
index 7a5bb33..da4eb43 100644 (file)
@@ -809,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)
 {
@@ -820,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);
 
@@ -879,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));
@@ -902,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);
@@ -997,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: