struct _ModestTnyAccountStorePrivate {
gchar *cache_dir;
GHashTable *password_hash;
+ GHashTable *account_settings_dialog_hash;
ModestAccountMgr *account_mgr;
TnySessionCamel *session;
TnyDevice *device;
*/
priv->password_hash = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, g_free);
+
+ /* A hash-map of modest account names to dialog pointers,
+ * so we can avoid showing the account settings twice for the same modest account: */
+ priv->account_settings_dialog_hash = g_hash_table_new_full (g_str_hash, g_str_equal,
+ g_free, NULL);
/* Respond to volume mounts and unmounts, such
* as the insertion/removal of the memory card: */
"account_store"));
}
-gboolean on_idle_wrong_password (gpointer user_data)
+static
+void on_account_settings_hide (GtkWidget *widget, gpointer user_data)
{
- /* TODO: Remember the window per account,
- * so we can just reshow it
- * instead of showing multiple ones.
- */
-
- TnyAccount *account = user_data;
+ TnyAccount *account = (TnyAccount*)user_data;
+
+ /* This is easier than using a struct for the user_data: */
+ ModestTnyAccountStore *self = modest_runtime_get_account_store();
+ ModestTnyAccountStorePrivate *priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self);
+
+ const gchar *modest_account_name =
+ modest_tny_account_get_parent_modest_account_name_for_server_account (account);
+ if (modest_account_name)
+ g_hash_table_remove (priv->account_settings_dialog_hash, modest_account_name);
+}
+
+static
+gboolean on_idle_wrong_password (gpointer user_data)
+{
+ TnyAccount *account = (TnyAccount*)user_data;
+ /* This is easier than using a struct for the user_data: */
+ ModestTnyAccountStore *self = modest_runtime_get_account_store();
+ ModestTnyAccountStorePrivate *priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self);
- ModestWindow *main_window =
- modest_window_mgr_get_main_window (modest_runtime_get_window_mgr ());
- hildon_banner_show_information (
- GTK_WIDGET(main_window), NULL, _("mcen_ib_username_pw_incorrect"));
-
const gchar *modest_account_name =
- modest_tny_account_get_parent_modest_account_name_for_server_account (account);
+ modest_tny_account_get_parent_modest_account_name_for_server_account (account);
if (!modest_account_name) {
g_warning ("%s: modest_tny_account_get_parent_modest_account_name_for_server_account() failed.\n",
__FUNCTION__);
+
+ g_object_unref (account);
+ return FALSE;
}
- ModestAccountSettingsDialog *dialog = modest_account_settings_dialog_new ();
- modest_account_settings_dialog_set_account_name (dialog, modest_account_name);
- modest_maemo_show_dialog_and_forget (GTK_WINDOW (main_window), GTK_DIALOG (dialog));
+
+ /* Check whether this window is already open,
+ * for instance because of a previous get_password() call:
+ */
+ gpointer dialog_as_gpointer = NULL;
+ gboolean found = FALSE;
+ if (priv->account_settings_dialog_hash) {
+ found = g_hash_table_lookup_extended (priv->account_settings_dialog_hash,
+ modest_account_name, NULL, (gpointer*)&dialog_as_gpointer);
+ }
+ ModestAccountSettingsDialog *dialog = dialog_as_gpointer;
+
+ ModestWindow *main_window =
+ modest_window_mgr_get_main_window (modest_runtime_get_window_mgr ());
+
+ gdk_threads_enter ();
+ gboolean created_dialog = FALSE;
+ if (!found || !dialog) {
+ dialog = modest_account_settings_dialog_new ();
+ modest_account_settings_dialog_set_account_name (dialog, modest_account_name);
+ modest_account_settings_dialog_switch_to_user_info (dialog);
+
+ g_hash_table_insert (priv->account_settings_dialog_hash, g_strdup (modest_account_name), dialog);
+
+ created_dialog = TRUE;
+ }
+
+ /* Show an explanatory temporary banner: */
+ hildon_banner_show_information (
+ GTK_WIDGET(dialog), NULL, _("mcen_ib_username_pw_incorrect"));
+
+ if (created_dialog) {
+ /* Forget it when it closes: */
+ g_signal_connect_object (G_OBJECT (dialog), "hide", G_CALLBACK (on_account_settings_hide),
+ account, 0);
+
+ /* Show it and delete it when it closes: */
+ modest_maemo_show_dialog_and_forget (GTK_WINDOW (main_window), GTK_DIALOG (dialog));
+ }
+ else {
+ /* Just show it instead of showing it and deleting it when it closes,
+ * though it is probably open already: */
+ gtk_window_present (GTK_WINDOW (dialog));
+ }
g_object_unref (account);
+ gdk_threads_leave ();
return FALSE; /* Dont' call this again. */
}
* same dialogs repeatedly.
*/
- /* printf ("%s: prompt (not shown) = %s\n", __FUNCTION__, prompt_not_used); */
+ printf ("DEBUG: modest: %s: prompt (not shown) = %s\n", __FUNCTION__, prompt_not_used);
g_return_val_if_fail (account, NULL);
g_hash_table_destroy (priv->password_hash);
priv->password_hash = NULL;
}
+
+ if (priv->account_settings_dialog_hash) {
+ g_hash_table_destroy (priv->account_settings_dialog_hash);
+ priv->account_settings_dialog_hash = NULL;
+ }
if (priv->account_mgr) {
g_object_unref (G_OBJECT(priv->account_mgr));
TNY_ACCOUNT_STORE_STORE_ACCOUNTS);
modest_tny_account_store_get_accounts (self, list,
TNY_ACCOUNT_STORE_TRANSPORT_ACCOUNTS);
+
+ tny_session_camel_set_initialized (priv->session);
+
return;
}
get_server_accounts (self, list, TNY_ACCOUNT_TYPE_STORE);
else
get_cached_accounts (self, list, TNY_ACCOUNT_TYPE_STORE);
+
+ tny_session_camel_set_initialized (priv->session);
} else if (request_type == TNY_ACCOUNT_STORE_TRANSPORT_ACCOUNTS) {
if (!priv->transport_accounts)
get_server_accounts (self, list, TNY_ACCOUNT_TYPE_TRANSPORT);
else
get_cached_accounts (self, list, TNY_ACCOUNT_TYPE_TRANSPORT);
+
+ tny_session_camel_set_initialized (priv->session);
} else
g_return_if_reached (); /* incorrect req type */
}
static gboolean
-modest_tny_account_store_alert (TnyAccountStore *self, TnyAlertType type,
+modest_tny_account_store_alert (TnyAccountStore *self, TnyAccount *account, 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)
&& (error->domain != TNY_ACCOUNT_STORE_ERROR)) {
- g_warning("%s: Unexpected error domain: != TNY_ACCOUNT_ERROR: %d, message=%s",
+ g_warning("modest: %s: Unexpected error domain: != TNY_ACCOUNT_ERROR: %d, message=%s",
__FUNCTION__, error->domain, error->message);
return FALSE;
}
- printf("DEBUG: %s: GError code: %d, message=%s",
+ printf("DEBUG: %s: GError code: %d, message=%s\n",
__FUNCTION__, error->code, error->message);
-
+ /* Get the server name: */
+ const gchar* server_name = NULL;
+ if (account && TNY_IS_ACCOUNT (account)) {
+ server_name = tny_account_get_hostname (account);
+ printf ("modest: %s: account name = %s, server_name=%s\n", __FUNCTION__,
+ tny_account_get_id (account), server_name);
+ }
+
+ if (!server_name)
+ server_name = _("Unknown Server");
+
+ ModestTransportStoreProtocol proto = MODEST_PROTOCOL_STORE_POP; /* Arbitrary default. */
+ if (account) {
+ const gchar *proto_name = tny_account_get_proto (account);
+ if (proto_name)
+ proto = modest_protocol_info_get_transport_store_protocol (proto_name);
+ else {
+ g_warning("modest: %s: account with id=%s has no proto.\n", __FUNCTION__,
+ tny_account_get_id (account));
+ }
+ }
+
/* const gchar *prompt = NULL; */
gchar *prompt = NULL;
switch (error->code) {
__FUNCTION__, error->domain, error->code, error->message);
prompt = NULL;
break;
+
case TNY_ACCOUNT_ERROR_TRY_CONNECT_HOST_LOOKUP_FAILED:
+ /* TODO: Show the appropriate message, depending on whether it's POP or IMAP: */
g_debug ("%s: Handling GError domain=%d, code=%d (lookup failed), message=%s",
__FUNCTION__, error->domain, error->code, error->message);
- prompt = g_strdup (_("emev_ni_ui_pop3_msg_connect_error"));
+
+ switch (proto) {
+ case MODEST_PROTOCOL_STORE_POP:
+ prompt = g_strdup_printf (_("emev_ni_ui_pop3_msg_connect_error"), server_name);
+ break;
+ case MODEST_PROTOCOL_STORE_IMAP:
+ prompt = g_strdup_printf (_("emev_ni_ui_imap_connect_server_error"), server_name);
+ break;
+ case MODEST_PROTOCOL_TRANSPORT_SMTP:
+ default: /* Arbitrary default. */
+ prompt = g_strdup_printf (_("emev_ib_ui_smtp_server_invalid"), server_name);
+ break;
+ }
+
/*
prompt = g_strdup_printf(
_("Incorrect Account Settings:\n Host lookup failed.%s"),
error->message);
*/
break;
+
case TNY_ACCOUNT_ERROR_TRY_CONNECT_AUTHENTICATION_NOT_SUPPORTED:
g_debug ("%s: Handling GError domain=%d, code=%d (authentication not supported), message=%s",
__FUNCTION__, error->domain, error->code, error->message);
_("Incorrect Account Settings:\nThe secure authentication method is not supported.\n%s"),
error->message);
break;
+
case TNY_ACCOUNT_ERROR_TRY_CONNECT_CERTIFICATE:
g_debug ("%s: Handling GError domain=%d, code=%d (certificatae), message=%s",
__FUNCTION__, error->domain, error->code, error->message);
_("Incorrect Account Settings"),
error->message);
- /* TODO: If we can ever determine that the problem is a wrong password:
- * In this case, the UI spec wants us to show a banner, and then
- * open the Account Settings dialog. */
- /* Note: Sometimes, the get_password() function seems to be called again
- * when a password is wrong, but sometimes this alert_func is called. */
- #if 0
- GtkWidget *parent_widget =
- GTK_WIDGET (
- modest_window_mgr_get_main_window (
- modest_runtime_get_window_mgr ()));
-
- hildon_banner_show_information (
- parent_widget,
- NULL /* icon name */,
- _("mcen_ib_username_pw_incorrect") );
-
- /* Show the Account Settings window: */
- ModestAccountSettingsDialog *dialog = modest_account_settings_dialog_new ();
- /* TODO: Get the account somehow. Maybe tinymail should send it with the signal. */
- const gchar* modest_account_name =
- modest_tny_account_get_parent_modest_account_name_for_server_account (account);
- g_assert (modest_account_name);
- modest_account_settings_dialog_set_account_name (dialog,
- modest_account_name);
-
- gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (self));
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (GTK_WIDGET (dialog));
- #endif
+ /* Note: If the password was wrong then get_password() would be called again,
+ * instead of this vfunc being called. */
break;
-
- //TODO: We have started receiving errors of
- //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.
default:
g_warning ("%s: Unhandled GError code: %d, message=%s",