2007-06-26 Murray Cumming <murrayc@murrayc.com>
[modest] / src / modest-tny-account-store.c
index f5da3b4..9e0fee1 100644 (file)
@@ -60,7 +60,7 @@
 
 #ifdef MODEST_PLATFORM_MAEMO
 #include <tny-maemo-conic-device.h>
-#ifdef MODEST_HILDON_VERSION_0
+#ifdef MODEST_HAVE_HILDON0_WIDGETS
 #include <hildon-widgets/hildon-note.h>
 #include <hildon-widgets/hildon-banner.h>
 #else
@@ -381,13 +381,15 @@ get_account_store_for_account (TnyAccount *account)
 
 /* This callback will be called by Tinymail when it needs the password
  * from the user, for instance if the password was not remembered.
+ * It also calls forget_password() before calling this,
+ * so that we clear wrong passwords out of our account settings.
  * Note that TnyAccount here will be the server account. */
 static gchar*
-get_password (TnyAccount *account, const gchar *prompt, gboolean *cancel)
+get_password (TnyAccount *account, const gchar * prompt_not_used, gboolean *cancel)
 {
        /* Initialize the output parameter: */
-       if (cancel)
-         *cancel = FALSE;
+         
+       g_return_val_if_fail (account, NULL);
          
        const gchar *key;
        const TnyAccountStore *account_store;
@@ -397,10 +399,22 @@ get_password (TnyAccount *account, const gchar *prompt, gboolean *cancel)
        gchar *pwd = NULL;
        gpointer pwd_ptr;
        gboolean already_asked;
-       
+
+       if (cancel)
+               *cancel = FALSE;
+               
        key           = tny_account_get_id (account);
        account_store = TNY_ACCOUNT_STORE(get_account_store_for_account (account));
-       
+
+       if (!key || !account_store) {
+               g_warning ("BUG: could not retrieve account_store for account %s",
+                          key ? key : "<NULL>");
+               if (cancel)
+                       *cancel = TRUE;
+               
+               return NULL;
+       }
+
        self = MODEST_TNY_ACCOUNT_STORE (account_store);
         priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self);
        
@@ -408,7 +422,8 @@ get_password (TnyAccount *account, const gchar *prompt, gboolean *cancel)
        /* 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,
+       already_asked = priv->password_hash && 
+                               g_hash_table_lookup_extended (priv->password_hash,
                                                      key,
                                                      NULL,
                                                      (gpointer*)&pwd_ptr);
@@ -431,18 +446,25 @@ get_password (TnyAccount *account, const gchar *prompt, gboolean *cancel)
                gboolean remember = FALSE;
                pwd = NULL;
                
-               /* Note that we ignore the returned username here,
-                * because it is enough that it will be stored in gconf 
-                * by the signal handler. */
                g_signal_emit (G_OBJECT(self), signals[PASSWORD_REQUESTED_SIGNAL], 0,
                               account_id, /* server_account_name */
                               &username, &pwd, cancel, &remember);
                
                if (!*cancel) {
-                       if (remember)
+                       /* The password will be returned as the result,
+                        * but we need to tell tinymail about the username too: */
+                       tny_account_set_user (account, username);
+                       
+                       if (remember) {
+                               printf ("%s: Storing username=%s, password=%s\n", 
+                                       __FUNCTION__, username, pwd);
+                               modest_account_mgr_set_string (priv->account_mgr,key,
+                                                              MODEST_ACCOUNT_USERNAME,
+                                                              username, TRUE);
                                modest_account_mgr_set_string (priv->account_mgr,key,
                                                               MODEST_ACCOUNT_PASSWORD,
                                                               pwd, TRUE);
+                       }
                        /* We need to dup the string even knowing that
                           it's already a dup of the contents of an
                           entry, because it if it's wrong, then camel
@@ -543,7 +565,7 @@ modest_tny_account_store_new (ModestAccountMgr *account_mgr, TnyDevice *device)
 
        GObject *obj;
        ModestTnyAccountStorePrivate *priv;
-       TnyList *list; 
+//     TnyList *list; 
        
        g_return_val_if_fail (account_mgr, NULL);
        g_return_val_if_fail (device, NULL);
@@ -561,10 +583,10 @@ modest_tny_account_store_new (ModestAccountMgr *account_mgr, TnyDevice *device)
        tny_session_camel_set_async_connecting (priv->session, TRUE);
        
        /* force a cache fill... ugly */
-       list = TNY_LIST(tny_simple_list_new());
-       tny_account_store_get_accounts (TNY_ACCOUNT_STORE(obj), list,
-                                       TNY_ACCOUNT_STORE_BOTH);
-       g_object_unref(list);
+       /* list = TNY_LIST(tny_simple_list_new()); */
+/*     tny_account_store_get_accounts (TNY_ACCOUNT_STORE(obj), list, */
+/*                                     TNY_ACCOUNT_STORE_BOTH); */
+/*     g_object_unref(list); */
        
        /* Connect signals */
        g_signal_connect (G_OBJECT(account_mgr), "account_changed",
@@ -1088,6 +1110,27 @@ modest_tny_account_store_get_session  (TnyAccountStore *self)
 }
 
 
+static void
+fill_server_account_cache_if_needed (ModestTnyAccountStore *self)
+{
+       /* cache if needed */
+       ModestTnyAccountStorePrivate *priv;     
+       priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self);
+
+       TnyList* list = TNY_LIST(tny_simple_list_new());
+       if (!priv->store_accounts)
+               modest_tny_account_store_get_accounts  (TNY_ACCOUNT_STORE(self),
+                                                       list, TNY_ACCOUNT_STORE_STORE_ACCOUNTS);
+       g_object_unref (list);
+
+       list = TNY_LIST(tny_simple_list_new());
+       if (!priv->transport_accounts)
+               modest_tny_account_store_get_accounts  (TNY_ACCOUNT_STORE(self),
+                                                       list, TNY_ACCOUNT_STORE_TRANSPORT_ACCOUNTS);
+       g_object_unref (list);
+}
+
+
 TnyAccount*
 modest_tny_account_store_get_tny_account_by (ModestTnyAccountStore *self, 
                                             ModestTnyAccountStoreQueryType type,
@@ -1103,6 +1146,8 @@ modest_tny_account_store_get_tny_account_by (ModestTnyAccountStore *self,
        
        priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self);
 
+       fill_server_account_cache_if_needed (self);
+               
        /* Search in store accounts */
        for (cursor = priv->store_accounts; cursor ; cursor = cursor->next) {
                switch (type) {
@@ -1118,7 +1163,7 @@ modest_tny_account_store_get_tny_account_by (ModestTnyAccountStore *self,
                }
                
                if (type == MODEST_TNY_ACCOUNT_STORE_QUERY_URL && 
-                   tny_account_matches_url_string (TNY_ACCOUNT(cursor->data), val)) {
+                   tny_account_matches_url_string (TNY_ACCOUNT(cursor->data), str)) {
                        account = TNY_ACCOUNT (cursor->data);
                        goto end;
                } else {
@@ -1301,6 +1346,20 @@ modest_tny_account_is_virtual_local_folders (TnyAccount *self)
        return MODEST_IS_TNY_LOCAL_FOLDERS_ACCOUNT (self);
 }
 
+
+gboolean
+modest_tny_account_is_memory_card_account (TnyAccount *self)
+{
+       if (!self)
+               return FALSE;
+
+       const gchar* account_id = tny_account_get_id (self);
+       if (!account_id)
+               return FALSE;
+       
+       return (strcmp (account_id, MODEST_MMC_ACCOUNT_ID) == 0);
+}
+
 TnyAccount*
 modest_tny_account_store_get_local_folders_account (TnyAccountStore *self)
 {
@@ -1325,3 +1384,5 @@ modest_tny_account_store_get_local_folders_account (TnyAccountStore *self)
        
        return account;
 }
+
+