* some crash fixes - in some cases, modest core'd because of errors when copying...
[modest] / src / modest-tny-account-store.c
index 0952eb4..6af53da 100644 (file)
@@ -46,6 +46,7 @@
 #include <modest-protocol-info.h>
 #include <modest-local-folder-info.h>
 #include <modest-tny-account.h>
+#include <modest-tny-local-folders-account.h>
 #include <modest-account-mgr.h>
 #include <modest-account-mgr-helpers.h>
 #include <widgets/modest-window-mgr.h>
@@ -316,16 +317,29 @@ on_vfs_volume_unmounted(GnomeVFSVolumeMonitor *volume_monitor,
 }
 
 static void
-on_account_removed (ModestAccountMgr *acc_mgr, const gchar *account, gboolean server_account,
+on_account_removed (ModestAccountMgr *acc_mgr, 
+                   const gchar *account,
+                   gboolean server_account,
                    gpointer user_data)
 {
        ModestTnyAccountStore *self = MODEST_TNY_ACCOUNT_STORE(user_data);
-       
-       /* FIXME: make this more finegrained; changes do not really affect _all_
-        * accounts, and some do not affect tny accounts at all (such as 'last_update')
+       TnyAccount *store_account;
+
+       /* Clear the account cache */
+       store_account =
+               modest_tny_account_store_get_server_account (self,
+                                                            account,
+                                                            TNY_ACCOUNT_TYPE_STORE);
+       if (store_account) {
+               tny_store_account_delete_cache (TNY_STORE_ACCOUNT (store_account));
+               g_object_unref (store_account);
+       }
+
+       /* FIXME: make this more finegrained; changes do not
+        * really affect _all_ accounts, and some do not
+        * affect tny accounts at all (such as 'last_update')
         */
-       if (server_account)
-               recreate_all_accounts (self);
+       recreate_all_accounts (self);
        
        g_signal_emit (G_OBJECT(self), signals[ACCOUNT_UPDATE_SIGNAL], 0,
                       account);
@@ -333,13 +347,14 @@ on_account_removed (ModestAccountMgr *acc_mgr, const gchar *account, gboolean se
 
 static void
 on_account_changed (ModestAccountMgr *acc_mgr, const gchar *account,
-                   const gchar *key, gboolean server_account, gpointer user_data)
+                   const GSList *keys, gboolean server_account, gpointer user_data)
 
 {
        ModestTnyAccountStore *self = MODEST_TNY_ACCOUNT_STORE(user_data);
        
        /* Ignore the change if it's a change in the last_updated value */
-       if (g_str_has_suffix (key, MODEST_ACCOUNT_LAST_UPDATED))
+       if (g_slist_length ((GSList *)keys) == 1 &&
+           g_str_has_suffix ((const gchar *) keys->data, MODEST_ACCOUNT_LAST_UPDATED))
                return;
 
        /* FIXME: make this more finegrained; changes do not really affect _all_
@@ -667,16 +682,7 @@ get_server_accounts  (TnyAccountStore *self, TnyList *list, TnyAccountType type)
                        }
        }
        
-       if (type == TNY_ACCOUNT_TYPE_STORE) {
-               /* Also add the local folder pseudo-account: */
-               TnyAccount *tny_account =
-                       modest_tny_account_new_for_local_folders (priv->account_mgr, 
-                               priv->session, NULL);
-               if (list)
-                       tny_list_prepend (list, G_OBJECT(tny_account));
-               accounts = g_slist_append (accounts, tny_account); /* cache it */
-               
-               
+       if (type == TNY_ACCOUNT_TYPE_STORE) {           
                /* Also add the Memory card account if it is mounted: */
                gboolean mmc_is_mounted = FALSE;
                GnomeVFSVolumeMonitor* monitor = 
@@ -783,6 +789,11 @@ get_server_accounts  (TnyAccountStore *self, TnyList *list, TnyAccountType type)
                        create_per_account_local_outbox_folders (self);
                }
        
+               /* Also add the local folder pseudo-account: */
+               TnyAccount *tny_account =
+                       modest_tny_account_new_for_local_folders (priv->account_mgr, 
+                               priv->session, NULL);
+                                       
                /* Add them to the TnyList: */
                if (priv->store_accounts_outboxes) {
                        GSList *iter = NULL;
@@ -795,9 +806,18 @@ get_server_accounts  (TnyAccountStore *self, TnyList *list, TnyAccountType type)
                                accounts = g_slist_append (accounts, outbox_account);
                        }
                        
+                       /* Add a merged folder, merging all the per-account outbox folders: */
+                       modest_tny_local_folders_account_add_merged_outbox_folders (
+                               MODEST_TNY_LOCAL_FOLDERS_ACCOUNT (tny_account), priv->store_accounts_outboxes);
+       
+                       /* We have finished with this temporary list, so free it: */
                        account_list_free (priv->store_accounts_outboxes);
                        priv->store_accounts_outboxes = NULL;
                }
+               
+               if (list)
+                       tny_list_prepend (list, G_OBJECT(tny_account));
+               accounts = g_slist_append (accounts, tny_account); /* cache it */       
        }
                
        if (type == TNY_ACCOUNT_TYPE_STORE) {
@@ -917,6 +937,8 @@ static gboolean
 modest_tny_account_store_alert (TnyAccountStore *self, TnyAlertType type,
                                gboolean question, const GError *error)
 {
+       /* TODO: It would be nice to know what account caused this error. */
+       
        g_return_val_if_fail (error, FALSE);
 
        if ((error->domain != TNY_ACCOUNT_ERROR) 
@@ -936,7 +958,10 @@ modest_tny_account_store_alert (TnyAccountStore *self, TnyAlertType type,
                /* The tinymail camel implementation just sends us this for almost 
                 * everything, so we have to guess at the cause.
                 * It could be a wrong password, or inability to resolve a hostname, 
-                * or lack of network, or something entirely different: */
+                * or lack of network, or incorrect authentication method, or something entirely different: */
+               /* TODO: Fix camel to provide specific error codes, and then use the 
+                * specific dialog messages from Chapter 12 of the UI spec.
+                */
                case TNY_ACCOUNT_STORE_ERROR_UNKNOWN_ALERT: 
                    g_debug ("%s: Handling GError domain=%d, code=%d, message=%s", 
                                __FUNCTION__, error->domain, error->code, error->message);
@@ -944,7 +969,9 @@ modest_tny_account_store_alert (TnyAccountStore *self, TnyAlertType type,
                        /* TODO: Remove the internal error message for the real release.
                         * This is just so the testers can give us more information: */
                        /* prompt = _("Modest account not yet fully configured."); */
-                       prompt = g_strdup_printf(_("Modest account not yet fully configured. Error=%s"), 
+                       prompt = g_strdup_printf(
+                               "%s\n (Internal error message, often very misleading):\n%s", 
+                               _("Incorrect Account Settings"), 
                                error->message);
                                
                        /* TODO: If we can ever determine that the problem is a wrong password:
@@ -980,7 +1007,7 @@ modest_tny_account_store_alert (TnyAccountStore *self, TnyAlertType type,
                        break;
                        
                //TODO: We have started receiving errors of 
-               //domain=TNY_ACCOUNT_ERROR, code=TNY_ACCOUNT_ERROR_TRY_CONNECT, messagae="Canceled".
+               //domain=TNY_ACCOUNT_ERROR, code=TNY_ACCOUNT_ERROR_TRY_CONNECT, message="Canceled".
                //If this is really a result of us cancelling our own operation then 
                //a) this probably shouldn't be an error, and
                //b) should have its own error code.
@@ -1121,7 +1148,7 @@ modest_tny_account_store_get_tny_account_by_id  (ModestTnyAccountStore *self, co
 }
 
 TnyAccount*
-modest_tny_account_store_get_tny_account_by_account (ModestTnyAccountStore *self,
+modest_tny_account_store_get_server_account (ModestTnyAccountStore *self,
                                                     const gchar *account_name,
                                                     TnyAccountType type)
 {
@@ -1137,9 +1164,13 @@ modest_tny_account_store_get_tny_account_by_account (ModestTnyAccountStore *self
        priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self);
 
        /* Special case for the local account */
-       if (!strcmp (account_name, MODEST_ACTUAL_LOCAL_FOLDERS_ACCOUNT_ID) && 
-           type == TNY_ACCOUNT_TYPE_STORE) {
-               id = g_strdup (MODEST_ACTUAL_LOCAL_FOLDERS_ACCOUNT_ID);
+       if (!strcmp (account_name, MODEST_LOCAL_FOLDERS_ACCOUNT_ID)) {
+               if(type == TNY_ACCOUNT_TYPE_STORE)
+                       id = g_strdup (MODEST_LOCAL_FOLDERS_ACCOUNT_ID);
+               else {
+                       /* The local folders modest account has no transport server account. */
+                       return NULL;
+               }
        } else {
                ModestAccountData *account_data;
 
@@ -1234,16 +1265,45 @@ modest_tny_account_store_get_transport_account_for_open_connection (ModestTnyAcc
         * just get the regular transport account: */
        if (!account) {
                /* printf("DEBUG: %s: using regular transport account for account %s.\n", __FUNCTION__, account_name); */
-               account = modest_tny_account_store_get_tny_account_by_account (self, account_name, 
+
+               /* The special local folders don't have transport accounts. */
+               if (strcmp (account_name, MODEST_LOCAL_FOLDERS_ACCOUNT_ID) == 0)
+                       account = NULL;
+               else
+                       account = modest_tny_account_store_get_server_account (self, account_name, 
                                                     TNY_ACCOUNT_TYPE_TRANSPORT);
        }
                             
        return account;
 }
 
-gboolean modest_tny_folder_store_is_virtual_local_folders (TnyFolderStore *self)
+gboolean modest_tny_account_is_virtual_local_folders (TnyAccount *self)
 {
-       /* We should make this more sophisticated if we ever use ModestTnySimpleFolderStore 
+       /* We should make this more sophisticated if we ever use ModestTnyLocalFoldersAccount 
         * for anything else. */
-       return MODEST_IS_TNY_SIMPLE_FOLDER_STORE (self);
+       return MODEST_IS_TNY_LOCAL_FOLDERS_ACCOUNT (self);
+}
+
+TnyAccount* modest_tny_account_store_get_local_folders_account (TnyAccountStore *self)
+{
+       TnyAccount *account = NULL;
+       ModestTnyAccountStorePrivate *priv;     
+       GSList *cursor;
+
+       g_return_val_if_fail (self, NULL);
+       
+       priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self);
+
+       for (cursor = priv->store_accounts; cursor ; cursor = cursor->next) {
+               TnyAccount *this_account = TNY_ACCOUNT(cursor->data);
+               if (modest_tny_account_is_virtual_local_folders (this_account)) {
+                                account = this_account;
+                                break;
+               }
+       }
+
+       if (account)
+               g_object_ref (G_OBJECT(account));
+       
+       return account;
 }