* all:
[modest] / src / modest-tny-account-store.c
index 7455bc5..784d77a 100644 (file)
 #include <tny-camel-pop-store-account.h>
 #include <modest-marshal.h>
 #include <modest-protocol-info.h>
-#include "modest-account-mgr.h"
+#include <modest-local-folder-info.h>
+
+#include <modest-account-mgr.h>
+#include <modest-account-mgr-helpers.h>
+
 #include "modest-tny-account-store.h"
 #include "modest-tny-platform-factory.h"
 #include <tny-gtk-lockable.h>
@@ -54,33 +58,38 @@ static void modest_tny_account_store_finalize     (GObject *obj);
 
 /* implementations for tny-account-store-iface */
 static void    modest_tny_account_store_instance_init (ModestTnyAccountStore *obj);
-
 static void    modest_tny_account_store_init                     (gpointer g, gpointer iface_data);
-static void    modest_tny_account_store_add_store_account       (TnyAccountStore *self,
-                                                                TnyStoreAccount *account);
-static void    modest_tny_account_store_add_transport_account   (TnyAccountStore *self,
-                                                                TnyTransportAccount *account);
-static void    modest_tny_account_store_get_accounts            (TnyAccountStore *iface, TnyList *list,
-                                                                TnyGetAccountsRequestType type);
+
+
 /* list my signals */
 enum {
-       PASSWORD_REQUESTED_SIGNAL,
        ACCOUNT_UPDATE_SIGNAL,
        LAST_SIGNAL
 };
 
 typedef struct _ModestTnyAccountStorePrivate ModestTnyAccountStorePrivate;
 struct _ModestTnyAccountStorePrivate {
+
        gchar              *cache_dir;
+       
        GHashTable         *password_hash;
        TnyDevice          *device;
-       TnyPlatformFactory *platform_fact;
        TnySessionCamel    *tny_session_camel;
+
+       ModestAccountMgr   *account_mgr;
+       TnyAccount         *local_folders;
 };
 
 #define MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
                                                       MODEST_TYPE_TNY_ACCOUNT_STORE, \
                                                       ModestTnyAccountStorePrivate))
+
+static void    on_password_requested        (ModestTnyAccountStore *account_store, 
+                                            const gchar* account_name,
+                                            gchar **password, 
+                                            gboolean *cancel, 
+                                            gboolean *remember);
+
 /* globals */
 static GObjectClass *parent_class = NULL;
 
@@ -132,15 +141,6 @@ modest_tny_account_store_class_init (ModestTnyAccountStoreClass *klass)
        g_type_class_add_private (gobject_class,
                                  sizeof(ModestTnyAccountStorePrivate));
 
-       signals[PASSWORD_REQUESTED_SIGNAL] =
-               g_signal_new ("password_requested",
-                             G_TYPE_FROM_CLASS (gobject_class),
-                             G_SIGNAL_RUN_FIRST,
-                             G_STRUCT_OFFSET(ModestTnyAccountStoreClass, password_requested),
-                             NULL, NULL,
-                             modest_marshal_VOID__STRING_POINTER_POINTER_POINTER,
-                             G_TYPE_NONE, 4, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER);
-       
        signals[ACCOUNT_UPDATE_SIGNAL] =
                g_signal_new ("account_update",
                              G_TYPE_FROM_CLASS (gobject_class),
@@ -152,6 +152,7 @@ modest_tny_account_store_class_init (ModestTnyAccountStoreClass *klass)
        
 }
 
+
 static void
 modest_tny_account_store_instance_init (ModestTnyAccountStore *obj)
 {
@@ -159,15 +160,56 @@ modest_tny_account_store_instance_init (ModestTnyAccountStore *obj)
                MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(obj);
 
        priv->cache_dir              = NULL;
-       priv->platform_fact          = NULL;
+       priv->account_mgr            = NULL;
        priv->tny_session_camel      = NULL;
        priv->device                 = NULL;
        
        priv->password_hash          = g_hash_table_new_full (g_str_hash, g_str_equal,
                                                              g_free, g_free);
+
+       priv->local_folders          = NULL;
 }
 
 
+
+
+/* create a pseudo-account for our local folders */
+static TnyAccount*
+get_local_folders_account (ModestTnyAccountStore *self)
+{
+       TnyStoreAccount *tny_account;
+       CamelURL *url;
+       gchar *maildir, *url_string;
+       ModestTnyAccountStorePrivate *priv;
+
+       priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self);
+       
+       tny_account = tny_camel_store_account_new ();
+       if (!tny_account) {
+               g_printerr ("modest: cannot create account for local folders");
+               return NULL;
+       }
+       
+       tny_camel_account_set_session (TNY_CAMEL_ACCOUNT(tny_account),priv->tny_session_camel);
+       
+       maildir = modest_local_folder_info_get_maildir_path ();
+       url = camel_url_new ("maildir:", NULL);
+       camel_url_set_path (url, maildir);
+       url_string = camel_url_to_string (url, 0);
+       
+       tny_account_set_url_string (TNY_ACCOUNT(tny_account), url_string);
+       tny_account_set_name (TNY_ACCOUNT(tny_account), MODEST_LOCAL_FOLDERS_ACCOUNT_NAME); 
+       tny_account_set_id (TNY_ACCOUNT(tny_account), MODEST_LOCAL_FOLDERS_ACCOUNT_NAME); 
+       
+       camel_url_free (url);
+       g_free (maildir);
+       g_free (url_string);
+
+       return TNY_ACCOUNT(tny_account);
+}
+
+
+
 static void
 on_account_removed (ModestAccountMgr *acc_mgr, const gchar *account, gboolean server_account,
                    gpointer user_data)
@@ -194,7 +236,8 @@ on_account_changed (ModestAccountMgr *acc_mgr, const gchar *account, gboolean se
 static ModestTnyAccountStore*
 get_account_store_for_account (TnyAccount *account)
 {
-       return MODEST_TNY_ACCOUNT_STORE(g_object_get_data (G_OBJECT(account), "account_store"));
+       return MODEST_TNY_ACCOUNT_STORE(g_object_get_data (G_OBJECT(account),
+                                                          "account_store"));
 }
 
 
@@ -205,33 +248,91 @@ set_account_store_for_account (TnyAccount *account, ModestTnyAccountStore *store
        g_object_set_data (G_OBJECT(account), "account_store", (gpointer)store);
 }
 
+static void
+on_password_requested (ModestTnyAccountStore *account_store, 
+                      const gchar* account_name,
+                      gchar **password, 
+                      gboolean *cancel, 
+                      gboolean *remember)
+{
+       gchar *txt;
+       GtkWidget *dialog, *entry, *remember_pass_check;
+
+       dialog = gtk_dialog_new_with_buttons (_("Password requested"),
+                                             NULL,
+                                             GTK_DIALOG_MODAL,
+                                             GTK_STOCK_CANCEL,
+                                             GTK_RESPONSE_REJECT,
+                                             GTK_STOCK_OK,
+                                             GTK_RESPONSE_ACCEPT,
+                                             NULL);
+
+       txt = g_strdup_printf (_("Please enter your password for %s"), account_name);
+       gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(txt),
+                           FALSE, FALSE, 0);
+       g_free (txt);
+
+       entry = gtk_entry_new_with_max_length (40);
+       gtk_entry_set_visibility (GTK_ENTRY(entry), FALSE);
+       gtk_entry_set_invisible_char (GTK_ENTRY(entry), 0x2022); /* bullet unichar */
+       
+       gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry,
+                           TRUE, FALSE, 0);    
+
+       remember_pass_check = gtk_check_button_new_with_label (_("Remember password"));
+       gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), remember_pass_check,
+                           TRUE, FALSE, 0);
+
+       gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox));
+       
+       if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
+               *password = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry)));
+               *cancel   = FALSE;
+       } else {
+               *password = NULL;
+               *cancel   = TRUE;
+       }
+
+       if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (remember_pass_check)))
+               *remember = TRUE;
+       else
+               *remember = FALSE;
+
+       gtk_widget_destroy (dialog);
+
+       while (gtk_events_pending ())
+               gtk_main_iteration ();
+}
+
 static gchar*
 get_password (TnyAccount *account, const gchar *prompt, gboolean *cancel)
 {
        const gchar *key;
-       ModestAccountMgr *account_mgr;
        const TnyAccountStore *account_store;
        ModestTnyAccountStore *self;
        ModestTnyAccountStorePrivate *priv;
        gchar *pwd = NULL;
+       gpointer pwd_ptr;
        gboolean already_asked;
-               
+
+       
        key           = tny_account_get_id (account);
        account_store = TNY_ACCOUNT_STORE(get_account_store_for_account (account));
-
+       
        self = MODEST_TNY_ACCOUNT_STORE (account_store);
         priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self);
        
-       account_mgr = modest_tny_platform_factory_get_account_mgr_instance
-               (MODEST_TNY_PLATFORM_FACTORY(priv->platform_fact));
-       
        /* is it in the hash? if it's already there, it must be wrong... */
+       pwd_ptr = (gpointer)&pwd; /* pwd_ptr so the compiler does not complained about
+                                  * type-punned ptrs...*/
        already_asked = g_hash_table_lookup_extended (priv->password_hash,
-                                                     key, NULL, (gpointer *) &pwd);
+                                                     key,
+                                                     NULL,
+                                                     (gpointer*)&pwd_ptr);
 
        /* if the password is not already there, try ModestConf */
        if (!already_asked) {
-               pwd  = modest_account_mgr_get_string (account_mgr,
+               pwd  = modest_account_mgr_get_string (priv->account_mgr,
                                                      key, MODEST_ACCOUNT_PASSWORD,
                                                      TRUE, NULL);
                g_hash_table_insert (priv->password_hash, g_strdup (key), g_strdup (pwd));
@@ -240,17 +341,16 @@ get_password (TnyAccount *account, const gchar *prompt, gboolean *cancel)
        /* if it was already asked, it must have been wrong, so ask again */
        if (already_asked || !pwd || strlen(pwd) == 0) {
 
-               /* we don't have it yet. we emit a signal to get the password somewhere */
+               /* we don't have it yet. Get the password from the user */
                const gchar* name = tny_account_get_name (account);
                gboolean remember;
                pwd = NULL;
 
-               g_signal_emit (G_OBJECT(self), signals[PASSWORD_REQUESTED_SIGNAL], 0,
-                              name, &pwd, cancel, &remember);
+               on_password_requested (self, name, &pwd, cancel, &remember);
 
                if (!*cancel) {
                        if (remember)
-                               modest_account_mgr_set_string (account_mgr,
+                               modest_account_mgr_set_string (priv->account_mgr,
                                                               key, MODEST_ACCOUNT_PASSWORD,
                                                               pwd,
                                                               TRUE, NULL);
@@ -272,14 +372,13 @@ get_password (TnyAccount *account, const gchar *prompt, gboolean *cancel)
 
 
 static void
-forget_password (TnyAccount *account) {
-
+forget_password (TnyAccount *account)
+{
        ModestTnyAccountStore *self;
        ModestTnyAccountStorePrivate *priv;
        const TnyAccountStore *account_store;
        gchar *pwd;
        const gchar *key;
-       ModestAccountMgr *account_mgr;
        
         account_store = TNY_ACCOUNT_STORE(get_account_store_for_account (account));
        self = MODEST_TNY_ACCOUNT_STORE (account_store);
@@ -294,11 +393,8 @@ forget_password (TnyAccount *account) {
                g_hash_table_insert (priv->password_hash, g_strdup (key), NULL);
        }
 
-       account_mgr = modest_tny_platform_factory_get_account_mgr_instance
-               (MODEST_TNY_PLATFORM_FACTORY(priv->platform_fact));
-
        /* Remove from configuration system */
-       modest_account_mgr_unset (account_mgr,
+       modest_account_mgr_unset (priv->account_mgr,
                                  key, MODEST_ACCOUNT_PASSWORD,
                                  TRUE, NULL);
 }
@@ -313,14 +409,14 @@ tny_account_for_proto (ModestProtocol proto)
        TnyAccount *tny_account = NULL;
        
        type  = modest_protocol_info_get_protocol_type (proto);
-
+       
        if (type == MODEST_PROTOCOL_TYPE_TRANSPORT) 
                tny_account = TNY_ACCOUNT(tny_camel_transport_account_new ());
        else if (proto == MODEST_PROTOCOL_STORE_POP)
                tny_account = TNY_ACCOUNT(tny_camel_pop_store_account_new ());
        else if (proto == MODEST_PROTOCOL_STORE_IMAP)
                tny_account = TNY_ACCOUNT(tny_camel_imap_store_account_new ());
-       else
+       else 
                g_return_val_if_reached (NULL);
        
        if (tny_account)
@@ -349,6 +445,12 @@ get_tny_account_from_server_account (ModestTnyAccountStore *self,
        priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self);
        
        /* proto */
+       if (account_data->proto == MODEST_PROTOCOL_UNKNOWN) {
+               g_printerr ("modest: '%s' does not provide a protocol\n",
+                           account_data->account_name);
+               return NULL;
+       }
+               
        tny_account = tny_account_for_proto (account_data->proto);
        if (!tny_account) {
                g_printerr ("modest: could not create tny account for '%s'\n",
@@ -356,17 +458,29 @@ get_tny_account_from_server_account (ModestTnyAccountStore *self,
                return NULL;
        }
        
+       /* Set account store, session and id */
        set_account_store_for_account (TNY_ACCOUNT(tny_account), self);
        tny_camel_account_set_session (TNY_CAMEL_ACCOUNT(tny_account),  /* session */
-                                      priv->tny_session_camel);        
-       tny_account_set_id            (tny_account, account_data->account_name); /* id */
+                                      priv->tny_session_camel);
+       tny_account_set_id (tny_account, account_data->account_name); /* id */
+
+       /* Options */
+       if (account_data->options) {
+               GSList *tmp = account_data->options;
+               while (tmp) {
+                       tny_camel_account_add_option (TNY_CAMEL_ACCOUNT (tny_account),
+                                                     tmp->data);
+                       tmp = g_slist_next (tmp);
+               }
+       }
+       /* Hostname & Username */
+       if (account_data->username) 
+               tny_account_set_user (tny_account, account_data->username);
 
        if (account_data->hostname)
                tny_account_set_hostname (tny_account, account_data->hostname);
 
-       if (account_data->username) 
-               tny_account_set_user (tny_account, account_data->username);
-
+       /* Password functions */
        tny_account_set_pass_func (tny_account, get_password);
         tny_account_set_forget_pass_func (tny_account, forget_password);
 
@@ -398,6 +512,11 @@ modest_tny_account_store_finalize (GObject *obj)
                g_hash_table_destroy (priv->password_hash);
                priv->password_hash = NULL;
        }
+
+       if (priv->account_mgr) {
+               g_object_unref (priv->account_mgr);
+               priv->account_mgr = NULL;
+       }
        
        G_OBJECT_CLASS(parent_class)->finalize (obj);
 }
@@ -408,116 +527,65 @@ modest_tny_account_store_new (ModestAccountMgr *account_mgr) {
 
        GObject *obj;
        ModestTnyAccountStorePrivate *priv;
-       TnyPlatformFactory *pfact;
        
        g_return_val_if_fail (account_mgr, NULL);
 
        obj  = G_OBJECT(g_object_new(MODEST_TYPE_TNY_ACCOUNT_STORE, NULL));
        priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(obj);
 
-       g_signal_connect (G_OBJECT(account_mgr), "account_changed",
-                                      G_CALLBACK (on_account_changed), obj);
-       g_signal_connect (G_OBJECT(account_mgr), "account_removed",
-                                      G_CALLBACK (on_account_removed), obj);
-
-       pfact = TNY_PLATFORM_FACTORY (modest_tny_platform_factory_get_instance());
-       if (!pfact) {
-               g_printerr ("modest: cannot get platform factory instance\n");
-               g_object_unref (obj);
-               return NULL;
-       } else
-               priv->platform_fact = pfact;
+       priv->account_mgr = account_mgr;
+       g_object_ref (G_OBJECT(priv->account_mgr));
        
+       /* The session needs the platform factory */
        priv->tny_session_camel = tny_session_camel_new (TNY_ACCOUNT_STORE(obj));
        if (!priv->tny_session_camel) {
                g_printerr ("modest: cannot create TnySessionCamel instance\n");
                g_object_unref (obj);
                return NULL;
        }
-
-       tny_session_camel_set_ui_locker (priv->tny_session_camel, tny_gtk_lockable_new ());
-
-       return MODEST_TNY_ACCOUNT_STORE(obj);
-}
-
-
-static gboolean
-add_account  (TnyAccountStore *self, TnyAccount *account) {
-
-       ModestTnyAccountStore *account_store;
-       ModestTnyAccountStorePrivate *priv;
-       ModestAccountMgr *account_mgr;  
-       const gchar *account_name;
-       const gchar *hostname, *username, *proto;
-
-       g_return_val_if_fail (self, FALSE);
-       g_return_val_if_fail (account, FALSE);
-
-       account_store  = MODEST_TNY_ACCOUNT_STORE(self);
-       priv           = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self);
-       account_mgr    = modest_tny_platform_factory_get_account_mgr_instance
-                           (MODEST_TNY_PLATFORM_FACTORY(priv->platform_fact));
        
+       tny_session_camel_set_ui_locker (priv->tny_session_camel, tny_gtk_lockable_new ());
+       /* FIXME: unref this in the end? */
        
-       account_name   = tny_account_get_id(account);
-       if (!account_name) {
-               g_printerr ("modest: failed to retrieve account name\n");
-               return FALSE;
-       }
-
-       hostname =  tny_account_get_hostname(account);
-       username =  tny_account_get_user(account);
-       proto    =  tny_account_get_proto(account);
+       /* Connect signals */
+       g_signal_connect (G_OBJECT(account_mgr), "account_changed",
+                                      G_CALLBACK (on_account_changed), obj);
+       g_signal_connect (G_OBJECT(account_mgr), "account_removed",
+                                      G_CALLBACK (on_account_removed), obj);
 
-       return modest_account_mgr_add_server_account (account_mgr,
-                                                     account_name,
-                                                     hostname, username, NULL,
-                                                     modest_protocol_info_get_protocol(proto));
+       return MODEST_TNY_ACCOUNT_STORE(obj);
 }
 
-
 static void
 modest_tny_account_store_add_store_account  (TnyAccountStore *self,
                                             TnyStoreAccount *account)
 {
-       ModestTnyAccountStorePrivate *priv;
-
-       priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self);
-       tny_camel_account_set_session (TNY_CAMEL_ACCOUNT(account),
-                                      priv->tny_session_camel);
-       
-       if (!add_account (self, TNY_ACCOUNT(account)))
-               g_printerr ("modest: failed to add store account\n");
+       /* we should not need this...*/
+       g_printerr ("modest: add_store_account_func not implemented\n");
 }
 
 
 static void
 modest_tny_account_store_add_transport_account  (TnyAccountStore *self,
                                                 TnyTransportAccount *account)
-{
-       ModestTnyAccountStorePrivate *priv;
-       
-       priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self);
-       tny_camel_account_set_session (TNY_CAMEL_ACCOUNT(account),
-                                      priv->tny_session_camel);        
-       if (!add_account (self, TNY_ACCOUNT(account)))
-               g_printerr ("modest: failed to add transport account\n");
+{      
+       /* we should not need this...*/
+       g_printerr ("modest: add_transport_account_func not implemented\n");
 }
 
 
+
 static TnyAccount*
 get_tny_account_from_account (ModestTnyAccountStore *self, ModestAccountData *account_data,
                              TnyGetAccountsRequestType type) 
 {
        TnyAccount *tny_account = NULL;
-       ModestServerAccountData *server_account;
+       ModestServerAccountData *server_account = NULL;
 
        if (type == TNY_ACCOUNT_STORE_STORE_ACCOUNTS && account_data->store_account)
                server_account = account_data->store_account;
        else if (type == TNY_ACCOUNT_STORE_TRANSPORT_ACCOUNTS && account_data->transport_account)
                server_account = account_data->transport_account;
-       else
-               g_return_val_if_reached (NULL);
        
        if (!server_account) {
                g_printerr ("modest: no %s account defined for '%s'\n",
@@ -535,38 +603,37 @@ get_tny_account_from_account (ModestTnyAccountStore *self, ModestAccountData *ac
        
        if (account_data->display_name)
                tny_account_set_name (tny_account, account_data->display_name); 
-
+       
        return tny_account;
 }
 
 
 static void
-modest_tny_account_store_get_accounts  (TnyAccountStore *iface, TnyList *list,
+modest_tny_account_store_get_accounts  (TnyAccountStore *account_store, TnyList *list,
                                        TnyGetAccountsRequestType type)
 {
        ModestTnyAccountStore        *self;
        ModestTnyAccountStorePrivate *priv;
        GSList                       *accounts, *cursor;
-       ModestAccountMgr             *account_mgr; 
        
-       g_return_if_fail (iface);
+       g_return_if_fail (account_store);
        g_return_if_fail (TNY_IS_LIST(list));
 
-       self        = MODEST_TNY_ACCOUNT_STORE(iface);
+       self        = MODEST_TNY_ACCOUNT_STORE(account_store);
        priv        = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self);
-       account_mgr = modest_tny_platform_factory_get_account_mgr_instance
-               (MODEST_TNY_PLATFORM_FACTORY(priv->platform_fact));
        
        if (type == TNY_ACCOUNT_STORE_BOTH) {
-               modest_tny_account_store_get_accounts (iface, list, TNY_ACCOUNT_STORE_STORE_ACCOUNTS);
-               modest_tny_account_store_get_accounts (iface, list, TNY_ACCOUNT_STORE_TRANSPORT_ACCOUNTS);
+               modest_tny_account_store_get_accounts (account_store, list,
+                                                      TNY_ACCOUNT_STORE_STORE_ACCOUNTS);
+               modest_tny_account_store_get_accounts (account_store, list,
+                                                      TNY_ACCOUNT_STORE_TRANSPORT_ACCOUNTS);
        }
-       
-       accounts = modest_account_mgr_account_names (account_mgr, NULL); 
+
+       accounts = modest_account_mgr_account_names (priv->account_mgr, NULL); 
        for (cursor = accounts; cursor; cursor = cursor->next) {
-               TnyAccount *tny_account;
+               TnyAccount *tny_account = NULL;
                ModestAccountData *account_data =
-                       modest_account_mgr_get_account_data (account_mgr, 
+                       modest_account_mgr_get_account_data (priv->account_mgr, 
                                                             (gchar*)cursor->data);
                if (account_data && account_data->enabled) {
                        tny_account = get_tny_account_from_account (self, account_data, type);
@@ -574,17 +641,22 @@ modest_tny_account_store_get_accounts  (TnyAccountStore *iface, TnyList *list,
                                tny_list_prepend (list, G_OBJECT(tny_account));
                }
                g_free (cursor->data);
-               modest_account_mgr_free_account_data (account_mgr, account_data);
+               modest_account_mgr_free_account_data (priv->account_mgr, account_data);
        }
        g_slist_free (accounts);
-       tny_session_camel_set_account_store (priv->tny_session_camel, iface);
-}
 
+       /* also, add the local folder pseudo-account */
+       if (type != TNY_ACCOUNT_STORE_TRANSPORT_ACCOUNTS) {
+               if (!priv->local_folders)
+                       priv->local_folders = get_local_folders_account (self);
+               if (!priv->local_folders)
+                       g_printerr ("modest: no local folders account\n");
+               else
+                       tny_list_prepend (list, G_OBJECT(priv->local_folders));
+       }
+       tny_session_camel_set_account_store (priv->tny_session_camel, account_store);
+}
 
-/*
- * the cache dir will be ~/.modest/cache
- * might want to change this in a simple #define...
- */
 static const gchar*
 modest_tny_account_store_get_cache_dir (TnyAccountStore *self)
 {
@@ -592,7 +664,9 @@ modest_tny_account_store_get_cache_dir (TnyAccountStore *self)
        priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self);
        
        if (!priv->cache_dir)
-               priv->cache_dir = g_build_filename (g_get_home_dir(), ".modest",
+               priv->cache_dir = g_build_filename (g_get_home_dir(), 
+                                                   MODEST_DIR,
+                                                   MODEST_CACHE_DIR,
                                                    "cache", NULL);
        return priv->cache_dir;
 }
@@ -609,7 +683,8 @@ modest_tny_account_store_get_device (TnyAccountStore *self)
        priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE (self);
 
        if (!priv->device) 
-               priv->device = tny_platform_factory_new_device (priv->platform_fact);
+               priv->device = tny_platform_factory_new_device
+                       (modest_tny_platform_factory_get_instance());
        
        return g_object_ref (G_OBJECT(priv->device));
 }
@@ -620,7 +695,8 @@ static gboolean
 modest_tny_account_store_alert (TnyAccountStore *self, TnyAlertType type,
                                const gchar *prompt)
 {
-       g_printerr ("modest: alert [%d]: %s", type, prompt);
+       g_printerr ("modest: alert_func not implemented (%d, %s)\n",
+                   type, prompt);
        return TRUE;
 }
 
@@ -652,14 +728,23 @@ void
 modest_tny_account_store_set_get_pass_func (ModestTnyAccountStore *self,
                                            ModestTnyGetPassFunc func)
 {
-       g_warning (__FUNCTION__);
-       return; /* not implemented, we use signals */
+       /* not implemented, we use signals */
+       g_printerr ("modest: set_get_pass_func not implemented\n");
 }
 
-
 TnySessionCamel*
-tny_account_store_get_session    (TnyAccountStore *self)
+tny_account_store_get_session  (TnyAccountStore *self)
 {
        g_return_val_if_fail (self, NULL);      
        return MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self)->tny_session_camel;
 }
+
+
+TnyAccount*
+modest_tny_account_store_get_local_folders_account    (ModestTnyAccountStore *self)
+{
+       g_return_val_if_fail (self, NULL);
+       
+       return MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE (self)->local_folders;
+}
+