* add debugging code to the send-queue and the operations-queue;
[modest] / src / modest-mail-operation.c
index ee24c7a..48f3c14 100644 (file)
@@ -635,20 +635,21 @@ modest_mail_operation_send_mail (ModestMailOperation *self,
        } else {
                /* Add the msg to the queue */
                modest_mail_operation_notify_start (self);
-               modest_tny_send_queue_add (MODEST_TNY_SEND_QUEUE(send_queue), 
-                                          msg, 
-                                          &(priv->error));
-
-               priv->status = MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS;
 
                info = g_slice_new0 (SendMsgInfo);
 
                info->mail_op = g_object_ref (self);
                info->msg = g_object_ref (msg);
                info->msg_sent_handler = g_signal_connect (G_OBJECT (send_queue), "msg-sent",
-                                                          G_CALLBACK (send_mail_msg_sent_handler), info);
+                               G_CALLBACK (send_mail_msg_sent_handler), info);
                info->error_happened_handler = g_signal_connect (G_OBJECT (send_queue), "error-happened",
-                                                                G_CALLBACK (send_mail_error_happened_handler), info);
+                               G_CALLBACK (send_mail_error_happened_handler), info);
+
+               modest_tny_send_queue_add (MODEST_TNY_SEND_QUEUE(send_queue), 
+                               msg, 
+                               &(priv->error));
+
+               priv->status = MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS;
        }
 
 }
@@ -672,14 +673,23 @@ send_mail_msg_sent_handler (TnySendQueue *queue, TnyHeader *header, TnyMsg *msg,
                            guint nth, guint total, gpointer userdata)
 {
        SendMsgInfo *info = (SendMsgInfo *) userdata;
-
-       if (!strcmp (tny_msg_get_url_string (msg),
-                    tny_msg_get_url_string (info->msg))) {
+       TnyHeader *hdr1, *hdr2;
+       const char *msgid1, *msgid2;
+       hdr1 = tny_msg_get_header(msg);
+       hdr2 = tny_msg_get_header(info->msg);
+       msgid1 = tny_header_get_message_id(hdr1);
+       msgid2 = tny_header_get_message_id(hdr2);
+       if (msgid1 == NULL) msgid1 = "(null)";
+       if (msgid2 == NULL) msgid2 = "(null)";
+
+       if (!strcmp (msgid1, msgid2)) {
                ModestMailOperationPrivate *priv = MODEST_MAIL_OPERATION_GET_PRIVATE (info->mail_op);
                priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
 
                common_send_mail_operation_end (queue, msg, info);
        }
+       g_object_unref(G_OBJECT(hdr1));
+       g_object_unref(G_OBJECT(hdr2));
 }
 
 static void     
@@ -687,9 +697,19 @@ send_mail_error_happened_handler (TnySendQueue *queue, TnyHeader *header, TnyMsg
                                  GError *error, gpointer userdata)
 {
        SendMsgInfo *info = (SendMsgInfo *) userdata;
-
-       if (!strcmp (tny_msg_get_url_string (msg),
-                    tny_msg_get_url_string (info->msg))) {
+       TnyHeader *hdr1, *hdr2;
+       const char *msgid1, *msgid2;
+       
+       hdr1 = tny_msg_get_header(msg);
+       hdr2 = tny_msg_get_header(info->msg);
+       msgid1 = tny_header_get_message_id(hdr1);
+       msgid2 = tny_header_get_message_id(hdr2);
+       if (msgid1 == NULL) msgid1 = "(null)";
+       if (msgid2 == NULL) msgid2 = "(null)";
+
+       if (!strcmp (msgid1, msgid2)) {
+               if (error != NULL)
+                       g_warning ("%s: %s\n", __FUNCTION__, error->message);
                ModestMailOperationPrivate *priv = MODEST_MAIL_OPERATION_GET_PRIVATE (info->mail_op);
                priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
                g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
@@ -698,6 +718,8 @@ send_mail_error_happened_handler (TnySendQueue *queue, TnyHeader *header, TnyMsg
 
                common_send_mail_operation_end (queue, msg, info);
        }
+       g_object_unref(G_OBJECT(hdr1));
+       g_object_unref(G_OBJECT(hdr2));
 }
 
 
@@ -786,6 +808,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;
 }
 
@@ -852,8 +875,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;
@@ -1031,13 +1062,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");
@@ -1211,18 +1244,13 @@ typedef struct
        gint pending_calls;
        gboolean poke_all;
        TnyFolderObserver *inbox_observer;
-       guint update_timeout;
+       RetrieveAllCallback retrieve_all_cb;
 } UpdateAccountInfo;
 
 
 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);
@@ -1260,7 +1288,7 @@ inbox_refreshed_cb (TnyFolder *inbox,
        ModestAccountMgr *mgr;
        ModestAccountRetrieveType retrieve_type;
        TnyList *new_headers = NULL;
-       gboolean headers_only;
+       gboolean headers_only, ignore_limit;
        TnyTransportAccount *transport_account;
        ModestTnySendQueue *send_queue;
 
@@ -1319,11 +1347,18 @@ inbox_refreshed_cb (TnyFolder *inbox,
        /* Order by date */
        g_ptr_array_sort (new_headers_array, (GCompareFunc) compare_headers_by_date);
        
-       /* TODO: Ask the user, instead of just failing,
-        * showing mail_nc_msg_count_limit_exceeded, with 'Get
-        * all' and 'Newest only' buttons. */
+       /* Ask the users if they want to retrieve all the messages
+          even though the limit was exceeded */
+       ignore_limit = FALSE;
        if (new_headers_array->len > retrieve_limit) {
-               /* TODO */
+               /* Ask the user if a callback has been specified and
+                  if the mail operation has a source (this means that
+                  was invoked by the user and not automatically by a
+                  D-Bus method) */
+               if (info->retrieve_all_cb && priv->source)
+                       ignore_limit = info->retrieve_all_cb (priv->source,
+                                                             new_headers_array->len,
+                                                             retrieve_limit);
        }
        
        if (!headers_only) {
@@ -1331,7 +1366,10 @@ inbox_refreshed_cb (TnyFolder *inbox,
                const gint msg_list_size = compute_message_array_size (new_headers_array);
 
                priv->done = 0;
-               priv->total = MIN (new_headers_array->len, retrieve_limit);
+               if (ignore_limit)
+                       priv->total = new_headers_array->len;
+               else
+                       priv->total = MIN (new_headers_array->len, retrieve_limit);
                while (msg_num < priv->total) {         
                        TnyHeader *header = TNY_HEADER (g_ptr_array_index (new_headers_array, msg_num));
                        TnyFolder *folder = tny_header_get_folder (header);
@@ -1423,8 +1461,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));
                        
@@ -1466,10 +1505,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
@@ -1490,34 +1525,11 @@ 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,
                                      gboolean poke_all,
+                                     RetrieveAllCallback retrieve_all_cb,
                                      UpdateAccountCallback callback,
                                      gpointer user_data)
 {
@@ -1551,17 +1563,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);
 }
 
 /*
@@ -1607,17 +1631,62 @@ compare_headers_by_date (gconstpointer a,
 /* ************************** STORE  ACTIONS ************************* */
 /* ******************************************************************* */
 
+typedef struct {
+       ModestMailOperation *mail_op;
+       CreateFolderUserCallback callback;
+       gpointer user_data;
+} CreateFolderInfo;
+
+
+static void
+create_folder_cb (TnyFolderStore *parent_folder, 
+                 gboolean canceled, 
+                 TnyFolder *new_folder, 
+                 GError *err, 
+                 gpointer user_data)
+{
+       ModestMailOperationPrivate *priv;
+       CreateFolderInfo *info;
+
+       info = (CreateFolderInfo *) user_data;
+       priv = MODEST_MAIL_OPERATION_GET_PRIVATE (info->mail_op);
+
+       if (canceled || err) {
+               priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
+               if (err)
+                       priv->error = g_error_copy (err);
+               else
+                       g_set_error (&(priv->error), MODEST_MAIL_OPERATION_ERROR,
+                                    MODEST_MAIL_OPERATION_ERROR_OPERATION_CANCELED,
+                                    "canceled");               
+       } else {
+               priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
+       }
+
+       /* The user will unref the new_folder */
+       if (info->callback)
+               info->callback (info->mail_op, parent_folder, 
+                               new_folder, info->user_data);
+       
+       /* Notify about operation end */
+       modest_mail_operation_notify_end (info->mail_op);
 
-TnyFolder *
+       /* Frees */
+       g_object_unref (info->mail_op);
+       g_slice_free (CreateFolderInfo, info);
+}
+
+void
 modest_mail_operation_create_folder (ModestMailOperation *self,
                                     TnyFolderStore *parent,
-                                    const gchar *name)
+                                    const gchar *name,
+                                    CreateFolderUserCallback callback,
+                                    gpointer user_data)
 {
        ModestMailOperationPrivate *priv;
-       TnyFolder *new_folder = NULL;
 
-       g_return_val_if_fail (TNY_IS_FOLDER_STORE (parent), NULL);
-       g_return_val_if_fail (name, NULL);
+       g_return_if_fail (TNY_IS_FOLDER_STORE (parent));
+       g_return_if_fail (name);
        
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
        priv->op_type = MODEST_MAIL_OPERATION_TYPE_INFO;
@@ -1654,18 +1723,25 @@ modest_mail_operation_create_folder (ModestMailOperation *self,
        }
 
        if (!priv->error) {
-               /* Create the folder */
-               modest_mail_operation_notify_start (self);
-               new_folder = tny_folder_store_create_folder (parent, name, &(priv->error));
-               CHECK_EXCEPTION (priv, MODEST_MAIL_OPERATION_STATUS_FAILED);
-               if (!priv->error)
-                       priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
-       }
+               CreateFolderInfo *info;
 
-       /* Notify about operation end */
-       modest_mail_operation_notify_end (self);
+               info = g_slice_new0 (CreateFolderInfo);
+               info->mail_op = g_object_ref (self);
+               info->callback = callback;
+               info->user_data = user_data;
+
+               modest_mail_operation_notify_start (self);
 
-       return new_folder;
+               /* Create the folder */
+               tny_folder_store_create_folder_async (parent, name, create_folder_cb, 
+                                                     NULL, info);
+       } else {
+               /* Call the user callback anyway */
+               if (callback)
+                       callback (self, parent, NULL, user_data);
+               /* Notify about operation end */
+               modest_mail_operation_notify_end (self);
+       }
 }
 
 void
@@ -1710,6 +1786,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);
@@ -2069,6 +2147,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));
@@ -2157,7 +2244,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;
@@ -2217,6 +2304,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);
@@ -2253,6 +2348,7 @@ modest_mail_operation_get_msgs_full (ModestMailOperation *self,
                if (notify)
                        notify (user_data);
        }
+
 }
 
 
@@ -2281,16 +2377,36 @@ modest_mail_operation_remove_msg (ModestMailOperation *self,
        /* remove message from folder */
        tny_folder_remove_msg (folder, header, &(priv->error));
        if (!priv->error) {
+               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);
 
                modest_mail_operation_notify_start (self);
 
-               if (TNY_IS_CAMEL_IMAP_FOLDER (folder) ||
-                   TNY_IS_CAMEL_POP_FOLDER (folder))
-                       tny_folder_sync_async(folder, FALSE, NULL, NULL, NULL); /* FALSE --> dont expunge */
+               /* Get leave on server setting */
+               account = 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 (),
+                                                               account_name);
+
+               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
-                       tny_folder_sync_async(folder, TRUE, NULL, NULL, NULL); /* TRUE --> expunge */
+                       expunge = FALSE;
+
+               /* Sync folder */
+               tny_folder_sync_async(folder, expunge, NULL, NULL, NULL);
+
+               /* Unref */
+               g_object_unref (account);
        }
        
        
@@ -2375,12 +2491,33 @@ modest_mail_operation_remove_msgs (ModestMailOperation *self,
 
        tny_folder_remove_msgs (folder, remove_headers, &(priv->error));
        if (!priv->error) {
-               if (TNY_IS_CAMEL_IMAP_FOLDER (folder) || 
-                   TNY_IS_CAMEL_POP_FOLDER (folder))
-                       tny_folder_sync_async(folder, FALSE, NULL, NULL, NULL); /* FALSE --> don't expunge */ 
+               gboolean expunge, leave_on_server;
+               const gchar *account_name;
+               const gchar *proto;
+               TnyAccount *account;
+               ModestTransportStoreProtocol account_proto = MODEST_PROTOCOL_TRANSPORT_STORE_UNKNOWN;
+               
+               account = 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 (),
+                                       account_name);
+
+               proto = tny_account_get_proto (account);
+               if (proto) {
+                       account_proto = modest_protocol_info_get_transport_store_protocol (proto);
+               }
+
+               if (((account_proto == MODEST_PROTOCOL_STORE_POP) && !leave_on_server) ||
+                   modest_tny_folder_is_remote_folder (folder) == FALSE)
+                       expunge = TRUE;
                else
-                       /* local folders */
-                       tny_folder_sync_async(folder, TRUE, NULL, NULL, NULL); /* TRUE --> expunge */
+                       expunge = FALSE;
+
+               /* Sync folder */
+               tny_folder_sync_async(folder, expunge, NULL, NULL, NULL);
+               
+               g_object_unref (account);
        }
        
        
@@ -2512,7 +2649,6 @@ transfer_msgs_cb (TnyFolder *folder, gboolean cancelled, GError *err, gpointer u
 
                        tny_iterator_next (iter);
                }
-
        }
                
 
@@ -2784,6 +2920,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,
@@ -2865,3 +3010,41 @@ modest_mail_operation_noop (ModestMailOperation *self)
        modest_mail_operation_notify_start (self);
        modest_mail_operation_notify_end (self);
 }
+
+
+gchar*
+modest_mail_operation_to_string (ModestMailOperation *self)
+{
+       const gchar *type, *status, *account_id;
+       ModestMailOperationPrivate *priv = NULL;
+       
+       g_return_val_if_fail (self, NULL);
+
+       priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
+       
+       switch (priv->op_type) {
+       case MODEST_MAIL_OPERATION_TYPE_SEND:    type= "SEND";    break;
+       case MODEST_MAIL_OPERATION_TYPE_RECEIVE: type= "RECEIVE"; break;
+       case MODEST_MAIL_OPERATION_TYPE_OPEN:    type= "OPEN";    break;
+       case MODEST_MAIL_OPERATION_TYPE_DELETE:  type= "DELETE";  break;
+       case MODEST_MAIL_OPERATION_TYPE_INFO:    type= "INFO";    break;
+       case MODEST_MAIL_OPERATION_TYPE_UNKNOWN: type= "UNKNOWN"; break;
+       default: type = "UNEXPECTED"; break;
+       }
+
+       switch (priv->status) {
+       case MODEST_MAIL_OPERATION_STATUS_INVALID:              status= "INVALID"; break;
+       case MODEST_MAIL_OPERATION_STATUS_SUCCESS:              status= "SUCCESS"; break;
+       case MODEST_MAIL_OPERATION_STATUS_FINISHED_WITH_ERRORS: status= "FINISHED-WITH-ERRORS"; break;
+       case MODEST_MAIL_OPERATION_STATUS_FAILED:               status= "FAILED"; break;
+       case MODEST_MAIL_OPERATION_STATUS_IN_PROGRESS:          status= "IN-PROGRESS"; break;
+       case MODEST_MAIL_OPERATION_STATUS_CANCELED:             status= "CANCELLED"; break;
+       default:                                                status= "UNEXPECTED"; break;
+       } 
+
+       account_id = priv->account ? tny_account_get_id (priv->account) : "";
+       
+       return g_strdup_printf ("%p \"%s\" (%s) [%s] {%d/%d} '%s'", self, account_id,type, status,
+                               priv->done, priv->total,
+                               priv->error && priv->error->message ? priv->error->message : "");
+}