First-time quickfix
[modest] / src / modest-mail-operation.c
index ca10622..43e893a 100644 (file)
@@ -1,4 +1,3 @@
-
 /* Copyright (c) 2006, Nokia Corporation
  * All rights reserved.
  *
@@ -85,6 +84,7 @@ enum _ModestMailOperationSignals
 typedef struct _ModestMailOperationPrivate ModestMailOperationPrivate;
 struct _ModestMailOperationPrivate {
        TnyAccount                 *account;
+       gchar                                                                            *account_name;
        guint                      done;
        guint                      total;
        GObject                   *source;
@@ -207,6 +207,8 @@ modest_mail_operation_finalize (GObject *obj)
 
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE(obj);
 
+       
+       
        if (priv->error) {
                g_error_free (priv->error);
                priv->error = NULL;
@@ -299,8 +301,14 @@ modest_mail_operation_get_source (ModestMailOperation *self)
 {
        ModestMailOperationPrivate *priv;
 
+       g_return_val_if_fail (self, NULL);
+       
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
-
+       if (!priv) {
+               g_warning ("BUG: %s: priv == NULL", __FUNCTION__);
+               return NULL;
+       }
+       
        return g_object_ref (priv->source);
 }
 
@@ -314,6 +322,11 @@ modest_mail_operation_get_status (ModestMailOperation *self)
                              MODEST_MAIL_OPERATION_STATUS_INVALID);
 
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
+       if (!priv) {
+               g_warning ("BUG: %s: priv == NULL", __FUNCTION__);
+               return MODEST_MAIL_OPERATION_STATUS_INVALID;
+       }
+       
        return priv->status;
 }
 
@@ -326,6 +339,12 @@ modest_mail_operation_get_error (ModestMailOperation *self)
        g_return_val_if_fail (MODEST_IS_MAIL_OPERATION (self), NULL);
 
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
+
+       if (!priv) {
+               g_warning ("BUG: %s: priv == NULL", __FUNCTION__);
+               return NULL;
+       }
+
        return priv->error;
 }
 
@@ -340,18 +359,22 @@ modest_mail_operation_cancel (ModestMailOperation *self)
        }
 
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
+       if (!priv) {
+               g_warning ("BUG: %s: priv == NULL", __FUNCTION__);
+               return FALSE;
+       }
 
-       /* cancel current operation in account */
-       //tny_account_cancel (priv->account);
+       /* Notify about operation end */
+       modest_mail_operation_notify_end (self);
 
        did_a_cancel = TRUE;
 
        /* Set new status */
        priv->status = MODEST_MAIL_OPERATION_STATUS_CANCELED;
+       
+       modest_mail_operation_queue_cancel_all (modest_runtime_get_mail_operation_queue());
 
-       /* Notify about operation end */
-       modest_mail_operation_notify_end (self);
-
+       
        return TRUE;
 }
 
@@ -435,7 +458,17 @@ modest_mail_operation_clone_state (ModestMailOperation *self)
        ModestMailOperationState *state;
        ModestMailOperationPrivate *priv;
 
+       /* FIXME: this should be fixed properly
+        * 
+        * in some cases, priv was NULL, so checking here to
+        * make sure.
+        */
+       g_return_val_if_fail (self, NULL);
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
+       g_return_val_if_fail (priv, NULL);
+
+       if (!priv)
+               return NULL;
 
        state = g_slice_new (ModestMailOperationState);
 
@@ -599,7 +632,9 @@ modest_mail_operation_save_to_drafts (ModestMailOperation *self,
 
        if (draft_msg != NULL) {
                header = tny_msg_get_header (draft_msg);
+               /* Remove the old draft expunging it */
                tny_folder_remove_msg (folder, header, NULL);
+               tny_folder_sync (folder, TRUE, NULL);
                g_object_unref (header);
        }
        
@@ -624,6 +659,7 @@ typedef struct
        gint max_size;
        gint retrieve_limit;
        gchar *retrieve_type;
+       gchar *account_name;
 } UpdateAccountInfo;
 
 /***** I N T E R N A L    F O L D E R    O B S E R V E R *****/
@@ -753,7 +789,7 @@ idle_notify_progress (gpointer data)
        state = modest_mail_operation_clone_state (mail_op);
        g_signal_emit (G_OBJECT (mail_op), signals[PROGRESS_CHANGED_SIGNAL], 0, state, NULL);
        g_slice_free (ModestMailOperationState, state);
-
+       
        return TRUE;
 }
 
@@ -789,7 +825,7 @@ notify_update_account_queue (gpointer data)
        ModestMailOperationPrivate *priv = NULL;
 
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE(mail_op);
-
+       
        modest_mail_operation_notify_end (mail_op);
        g_object_unref (mail_op);
 
@@ -835,6 +871,7 @@ set_last_updated_idle (gpointer data)
 static gpointer
 update_account_thread (gpointer thr_user_data)
 {
+       static gboolean first_time = TRUE;
        UpdateAccountInfo *info;
        TnyList *all_folders = NULL;
        GPtrArray *new_headers;
@@ -853,7 +890,7 @@ update_account_thread (gpointer thr_user_data)
         * for POP3, we do a logout-login upon send/receive -- many POP-servers (like Gmail) do not
         * show any updates unless we do that
         */
-       if (TNY_IS_CAMEL_POP_STORE_ACCOUNT(priv->account)) 
+       if (!first_time && TNY_IS_CAMEL_POP_STORE_ACCOUNT(priv->account)) 
                tny_camel_pop_store_account_reconnect (TNY_CAMEL_POP_STORE_ACCOUNT(priv->account));
 
        /* Get all the folders. We can do it synchronously because
@@ -1040,7 +1077,7 @@ update_account_thread (gpointer thr_user_data)
           freed before this idle happens, but the mail operation will
           be still alive */
        g_idle_add (notify_update_account_queue, g_object_ref (info->mail_op));
-
+       
        /* Frees */
        g_object_unref (query);
        g_object_unref (all_folders);
@@ -1049,6 +1086,8 @@ update_account_thread (gpointer thr_user_data)
        g_free (info->retrieve_type);
        g_slice_free (UpdateAccountInfo, info);
 
+       first_time = FALSE;
+
        return NULL;
 }
 
@@ -1140,6 +1179,10 @@ modest_mail_operation_update_account (ModestMailOperation *self,
                
        /* printf ("DEBUG: %s: info->retrieve_limit = %d\n", __FUNCTION__, info->retrieve_limit); */
 
+       /* Set account busy */
+       modest_account_mgr_set_account_busy(mgr, account_name, TRUE);
+       priv->account_name = g_strdup(account_name);
+       
        thread = g_thread_create (update_account_thread, info, FALSE, NULL);
 
        return TRUE;
@@ -2090,7 +2133,25 @@ static void
 modest_mail_operation_notify_end (ModestMailOperation *self)
 {
        ModestMailOperationState *state;
+       ModestMailOperationPrivate *priv = NULL;
+
+       g_return_if_fail (self);
+
+       priv = MODEST_MAIL_OPERATION_GET_PRIVATE(self);
 
+       if (!priv) {
+               g_warning ("BUG: %s: priv == NULL", __FUNCTION__);
+               return;
+       }
+       
+       /* Set the account back to not busy */
+       if (priv->account_name) {
+               modest_account_mgr_set_account_busy(modest_runtime_get_account_mgr(), priv->account_name,
+                                                                                                                                                               FALSE);
+               g_free(priv->account_name);
+               priv->account_name = NULL;
+       }
+       
        /* Notify the observers about the mail opertation end */
        state = modest_mail_operation_clone_state (self);
        g_signal_emit (G_OBJECT (self), signals[PROGRESS_CHANGED_SIGNAL], 0, state, NULL);