Show a generic error (instead of the one from Tinymail) when
[modest] / src / modest-mail-operation.c
index 6bb9047..d7b24ce 100644 (file)
@@ -388,6 +388,8 @@ void
 modest_mail_operation_execute_error_handler (ModestMailOperation *self)
 {
        ModestMailOperationPrivate *priv;
+
+       g_return_if_fail (self && MODEST_IS_MAIL_OPERATION(self));
        
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
        g_return_if_fail(priv->status != MODEST_MAIL_OPERATION_STATUS_SUCCESS);     
@@ -403,6 +405,9 @@ modest_mail_operation_get_type_operation (ModestMailOperation *self)
 {
        ModestMailOperationPrivate *priv;
 
+       g_return_val_if_fail (self && MODEST_IS_MAIL_OPERATION(self),
+                             MODEST_MAIL_OPERATION_TYPE_UNKNOWN);
+       
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
        
        return priv->op_type;
@@ -414,6 +419,9 @@ modest_mail_operation_is_mine (ModestMailOperation *self,
 {
        ModestMailOperationPrivate *priv;
 
+       g_return_val_if_fail (self && MODEST_IS_MAIL_OPERATION(self),
+                             FALSE);
+       
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
        if (priv->source == NULL) return FALSE;
 
@@ -425,7 +433,8 @@ modest_mail_operation_get_source (ModestMailOperation *self)
 {
        ModestMailOperationPrivate *priv;
 
-       g_return_val_if_fail (self, NULL);
+       g_return_val_if_fail (self && MODEST_IS_MAIL_OPERATION(self),
+                             NULL);
        
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
        if (!priv) {
@@ -477,8 +486,8 @@ modest_mail_operation_cancel (ModestMailOperation *self)
 {
        ModestMailOperationPrivate *priv;
        gboolean canceled = FALSE;
-
-       g_return_val_if_fail (MODEST_IS_MAIL_OPERATION (self), FALSE);
+       
+       g_return_val_if_fail (self && MODEST_IS_MAIL_OPERATION (self), FALSE);
 
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
 
@@ -513,8 +522,9 @@ modest_mail_operation_get_task_done (ModestMailOperation *self)
 {
        ModestMailOperationPrivate *priv;
 
-       g_return_val_if_fail (MODEST_IS_MAIL_OPERATION (self), 0);
-
+       g_return_val_if_fail (self && MODEST_IS_MAIL_OPERATION(self),
+                             0);
+       
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
        return priv->done;
 }
@@ -524,7 +534,8 @@ modest_mail_operation_get_task_total (ModestMailOperation *self)
 {
        ModestMailOperationPrivate *priv;
 
-       g_return_val_if_fail (MODEST_IS_MAIL_OPERATION (self), 0);
+       g_return_val_if_fail (self && MODEST_IS_MAIL_OPERATION(self),
+                             0);
 
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
        return priv->total;
@@ -536,11 +547,9 @@ modest_mail_operation_is_finished (ModestMailOperation *self)
        ModestMailOperationPrivate *priv;
        gboolean retval = FALSE;
 
-       if (!MODEST_IS_MAIL_OPERATION (self)) {
-               g_warning ("%s: invalid parametter", G_GNUC_FUNCTION);
-               return retval;
-       }
-
+       g_return_val_if_fail (self && MODEST_IS_MAIL_OPERATION(self),
+                             FALSE);
+       
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
 
        if (priv->status == MODEST_MAIL_OPERATION_STATUS_SUCCESS   ||
@@ -603,9 +612,9 @@ modest_mail_operation_send_mail (ModestMailOperation *self,
        ModestMailOperationPrivate *priv;
        SendMsgInfo *info;
        
-       g_return_if_fail (MODEST_IS_MAIL_OPERATION (self));
-       g_return_if_fail (TNY_IS_TRANSPORT_ACCOUNT (transport_account));
-       g_return_if_fail (TNY_IS_MSG (msg));
+       g_return_if_fail (self && MODEST_IS_MAIL_OPERATION (self));
+       g_return_if_fail (transport_account && TNY_IS_TRANSPORT_ACCOUNT (transport_account));
+       g_return_if_fail (msg && TNY_IS_MSG (msg));
        
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
 
@@ -663,14 +672,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     
@@ -678,9 +696,17 @@ 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)) {
                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,
@@ -689,6 +715,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));
 }
 
 
@@ -1203,6 +1231,7 @@ typedef struct
        gboolean poke_all;
        TnyFolderObserver *inbox_observer;
        guint update_timeout;
+       RetrieveAllCallback retrieve_all_cb;
 } UpdateAccountInfo;
 
 
@@ -1249,9 +1278,9 @@ inbox_refreshed_cb (TnyFolder *inbox,
        GPtrArray *new_headers_array = NULL;   
        gint max_size, retrieve_limit, i;
        ModestAccountMgr *mgr;
-       gchar *retrieve_type = NULL;
+       ModestAccountRetrieveType retrieve_type;
        TnyList *new_headers = NULL;
-       gboolean headers_only;
+       gboolean headers_only, ignore_limit;
        TnyTransportAccount *transport_account;
        ModestTnySendQueue *send_queue;
 
@@ -1305,17 +1334,23 @@ inbox_refreshed_cb (TnyFolder *inbox,
        
        /* Get per-account retrieval type */
        retrieve_type = modest_account_mgr_get_retrieve_type (mgr, info->account_name); 
-       headers_only = !g_ascii_strcasecmp (retrieve_type, MODEST_ACCOUNT_RETRIEVE_VALUE_HEADERS_ONLY);
-       g_free (retrieve_type);
+       headers_only = (retrieve_type == MODEST_ACCOUNT_RETRIEVE_HEADERS_ONLY);
 
        /* 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) {
@@ -1323,7 +1358,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);
@@ -1510,6 +1548,7 @@ void
 modest_mail_operation_update_account (ModestMailOperation *self,
                                      const gchar *account_name,
                                      gboolean poke_all,
+                                     RetrieveAllCallback retrieve_all_cb,
                                      UpdateAccountCallback callback,
                                      gpointer user_data)
 {
@@ -1544,6 +1583,7 @@ modest_mail_operation_update_account (ModestMailOperation *self,
        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);
@@ -2273,16 +2313,32 @@ 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;
+
                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);
+
+               if (TNY_IS_CAMEL_POP_FOLDER (folder) && !leave_on_server)
+                       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);
        }