* Added preferred edit format global setting
[modest] / src / modest-tny-account-store.c
index 9dcf364..8c7191d 100644 (file)
 
 #ifdef MODEST_PLATFORM_MAEMO
 #include <tny-maemo-conic-device.h>
+#ifdef MODEST_HILDON_VERSION_0
+#include <hildon-widgets/hildon-note.h>
+#else
+#include <hildon/hildon-note.h>
+#endif
 #endif
 
 /* 'private'/'protected' functions */
@@ -175,6 +180,10 @@ modest_tny_account_store_instance_init (ModestTnyAccountStore *obj)
        priv->session                = NULL;
        priv->device                 = NULL;
        
+       /* An in-memory store of passwords, 
+        * for passwords that are not remembered in the configuration,
+         * so they need to be asked for from the user once in each session:
+         */
        priv->password_hash          = g_hash_table_new_full (g_str_hash, g_str_equal,
                                                              g_free, g_free);
 }
@@ -222,8 +231,9 @@ on_account_removed (ModestAccountMgr *acc_mgr, const gchar *account, gboolean se
 
 
 static void
-on_account_changed (ModestAccountMgr *acc_mgr, const gchar *account, gboolean server_account,
-                   const gchar *key, gpointer user_data)
+on_account_changed (ModestAccountMgr *acc_mgr, const gchar *account,
+                              const gchar *key, gboolean server_account, gpointer user_data)
+
 {
        ModestTnyAccountStore *self = MODEST_TNY_ACCOUNT_STORE(user_data);
        ModestTnyAccountStorePrivate *priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self);
@@ -253,7 +263,8 @@ get_account_store_for_account (TnyAccount *account)
                                                           "account_store"));
 }
 
-/* This callback will be called by Tinymail when it needs the password.
+/* This callback will be called by Tinymail when it needs the password
+ * from the user, for instance if the password was not remembered.
  * Note that TnyAccount here will be the server account. */
 static gchar*
 get_password (TnyAccount *account, const gchar *prompt, gboolean *cancel)
@@ -273,7 +284,7 @@ get_password (TnyAccount *account, const gchar *prompt, gboolean *cancel)
        self = MODEST_TNY_ACCOUNT_STORE (account_store);
         priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self);
        
-       /* TODO: What is this hash for? */
+       /* This hash map stores passwords, including passwords that are not stored in gconf. */
        /* 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...*/
@@ -315,14 +326,13 @@ get_password (TnyAccount *account, const gchar *prompt, gboolean *cancel)
                        g_hash_table_insert (priv->password_hash, g_strdup (key), g_strdup(pwd));
                } else {
                        g_hash_table_remove (priv->password_hash, key);
+                       
+                       g_free (pwd);
+                       pwd = NULL;
                }
 
                g_free (username);
                username = NULL;
-               
-               g_free (pwd);
-               pwd = NULL;
-                       
        } else
                *cancel = FALSE;
  
@@ -620,14 +630,49 @@ modest_tny_account_store_alert (TnyAccountStore *self, TnyAlertType type,
                                const GError *error)
 {
        g_return_val_if_fail (error, FALSE);
-       g_return_val_if_fail (error->domain == TNY_ACCOUNT_ERROR, FALSE);
+
+       if ((error->domain != TNY_ACCOUNT_ERROR) 
+               && (error->domain != TNY_ACCOUNT_STORE_ERROR)) {
+               g_warning("%s: Unexpected error domain: != TNY_ACCOUNT_ERROR: %d, message=%s", 
+                       __FUNCTION__, error->domain, error->message); 
+               return FALSE;
+       }
        
        /* printf("DEBUG: %s: error->message=%s\n", __FUNCTION__, error->message); */
        
-       GtkMessageType gtktype;
+
+       
+       const gchar *prompt = NULL;
+       switch (error->code)
+       {
+               case TNY_ACCOUNT_ERROR_TRY_CONNECT:
+               /* 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: */
+               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);
+                       prompt = _("Modest account not yet fully configured.");
+                       break;
+               default:
+                       g_warning ("%s: Unhandled GError code: %d, message=%s", 
+                               __FUNCTION__, error->code, error->message);
+                       prompt = NULL;
+               break;
+       }
+       
+       if (!prompt)
+               return FALSE;
+
        gboolean retval = FALSE;
-       GtkWidget *dialog;
+#ifdef MODEST_PLATFORM_MAEMO
+       /* The Tinymail documentation says that we should show Yes and No buttons, 
+        * but these never seem to be questions: */
+        GtkWidget *dialog = GTK_WIDGET (hildon_note_new_information (NULL, prompt));
+#else
 
+       GtkMessageType gtktype = GTK_MESSAGE_ERROR;
        switch (type)
        {
                case TNY_ALERT_TYPE_INFO:
@@ -642,23 +687,9 @@ modest_tny_account_store_alert (TnyAccountStore *self, TnyAlertType type,
                break;
        }
        
-       const gchar *prompt = NULL;
-       switch (error->code)
-       {
-               case TNY_ACCOUNT_ERROR_TRY_CONNECT:
-                       prompt = _("Modest account not yet fully configured");
-                       break;
-               default:
-                       g_warning ("%s: Unhandled GError code.", __FUNCTION__);
-                       prompt = NULL;
-               break;
-       }
-       
-       if (!prompt)
-               return FALSE;
-
-       dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
+       GtkWidget *dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
                gtktype, GTK_BUTTONS_YES_NO, prompt);
+#endif /* #ifdef MODEST_PLATFORM_MAEMO */
 
        if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_YES)
                retval = TRUE;