#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
g_slist_free (accounts);
}
+
+
+/* disconnect the list of TnyAccounts */
+static void
+account_list_disconnect (GSList *accounts)
+{
+ GSList *cursor = accounts;
+
+ while (cursor) {
+ if (TNY_IS_CAMEL_ACCOUNT(cursor->data)) /* check twice... */
+ tny_camel_account_set_online (TNY_CAMEL_ACCOUNT(cursor->data), FALSE, NULL);
+ cursor = g_slist_next (cursor);
+ }
+}
+
+
+
static void
recreate_all_accounts (ModestTnyAccountStore *self)
{
/* Clear the account cache */
store_account = modest_tny_account_store_get_tny_account_by (self,
- MODEST_TNY_ACCOUNT_STORE_QUERY_NAME,
+ MODEST_TNY_ACCOUNT_STORE_QUERY_ID,
account);
if (store_account) {
tny_store_account_delete_cache (TNY_STORE_ACCOUNT (store_account));
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;
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);
/* 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);
if (!*cancel) {
/* The password will be returned as the result,
* but we need to tell tinymail about the username too: */
- /* TODO: This causes a crash because it frees memory that
- * tinymail is already using. tinymail needs to detect the change
- * and stop using the old username:
- * tny_account_set_user (account, username); */
+ tny_account_set_user (account, username);
if (remember) {
printf ("%s: Storing username=%s, password=%s\n",
priv->device = NULL;
}
+ /* disconnect all accounts when we are destroyed */
+ g_debug ("modest: disconnecting all store accounts");
+ account_list_disconnect (priv->store_accounts);
+ g_debug ("modest: disconnecting all transport accounts");
+ account_list_disconnect (priv->transport_accounts);
+
/* this includes the local folder */
account_list_free (priv->store_accounts);
priv->store_accounts = NULL;
GObject *obj;
ModestTnyAccountStorePrivate *priv;
- TnyList *list;
+// TnyList *list;
g_return_val_if_fail (account_mgr, NULL);
g_return_val_if_fail (device, NULL);
priv->device = g_object_ref (device);
priv->session = tny_session_camel_new (TNY_ACCOUNT_STORE(obj));
+ if (!priv->session) {
+ g_warning ("failed to get TnySessionCamel");
+ return NULL;
+ }
tny_session_camel_set_ui_locker (priv->session, tny_gtk_lockable_new ());
- /* FIXME: unref this in the end? */
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);
-
+
/* Connect signals */
g_signal_connect (G_OBJECT(account_mgr), "account_changed",
G_CALLBACK (on_account_changed), obj);
TnyAccount * tny_account = NULL;
/* Add the account: */
tny_account = modest_tny_account_new_from_server_account_name (
- priv->account_mgr, transport_account_name);
+ priv->account_mgr, priv->session, transport_account_name);
if (tny_account) {
g_object_set_data (G_OBJECT(tny_account), "account_store",
(gpointer)self);
/* const gchar *prompt = NULL; */
gchar *prompt = NULL;
switch (error->code) {
+ case TNY_ACCOUNT_STORE_ERROR_CANCEL_ALERT:
+ /* Don't show waste the user's time by showing him a dialog telling the
+ * user that he has just cancelled something: */
+ g_debug ("%s: Handling GError domain=%d, code=%d (cancelled) without showing a dialog, message=%s",
+ __FUNCTION__, error->domain, error->code, error->message);
+ prompt = NULL;
+ break;
+ case TNY_ACCOUNT_ERROR_TRY_CONNECT_HOST_LOOKUP_FAILED:
+ 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"));
+ /*
+ 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);
+ /* TODO: This needs a logical ID for the string: */
+ prompt = g_strdup_printf(
+ _("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);
+ prompt = g_strdup_printf(
+ _("Certificate Problem:\n%s"),
+ error->message);
+ break;
+
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.
* 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); */
+ /* This debug output is useful. Please keep it uncommented until
+ * we have fixed the problems in this function: */
+ g_debug ("%s: Handling GError domain=%d, code=%d, message=%s",
+ __FUNCTION__, error->domain, error->code, error->message);
/* TODO: Remove the internal error message for the real release.
* This is just so the testers can give us more information: */
break;
}
- GtkWidget *dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL,
+ GtkWidget *dialog = gtk_message_dialog_new (NULL, 0,
gtktype, GTK_BUTTONS_YES_NO, prompt);
#endif /* #ifdef MODEST_PLATFORM_MAEMO */
const int response = gtk_dialog_run (GTK_DIALOG (dialog));
if (question) {
retval = (response == GTK_RESPONSE_YES) ||
- (response == GTK_RESPONSE_OK);
+ (response == GTK_RESPONSE_OK);
}
gtk_widget_destroy (dialog);
}
+
TnyAccount*
modest_tny_account_store_get_tny_account_by (ModestTnyAccountStore *self,
ModestTnyAccountStoreQueryType type,
ModestTnyAccountStorePrivate *priv;
GSList *cursor;
const gchar *val = NULL;
-
+ TnyList* list;
+
+
g_return_val_if_fail (self, NULL);
g_return_val_if_fail (str, NULL);
priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self);
+ /* fill the caches, as that may not have happened yet */
+ list = TNY_LIST(tny_simple_list_new());
+ modest_tny_account_store_get_accounts (TNY_ACCOUNT_STORE(self),
+ list, TNY_ACCOUNT_STORE_BOTH);
+ g_object_unref (list);
+
+
+
/* Search in store accounts */
for (cursor = priv->store_accounts; cursor ; cursor = cursor->next) {
switch (type) {
case MODEST_TNY_ACCOUNT_STORE_QUERY_ID:
val = tny_account_get_id (TNY_ACCOUNT(cursor->data));
break;
- case MODEST_TNY_ACCOUNT_STORE_QUERY_NAME:
- val = modest_tny_account_get_parent_modest_account_name_for_server_account (TNY_ACCOUNT(cursor->data));
- break;
case MODEST_TNY_ACCOUNT_STORE_QUERY_URL:
val = tny_account_get_url_string (TNY_ACCOUNT(cursor->data));
break;
}
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 {
case MODEST_TNY_ACCOUNT_STORE_QUERY_ID:
val = tny_account_get_id (TNY_ACCOUNT(cursor->data));
break;
- case MODEST_TNY_ACCOUNT_STORE_QUERY_NAME:
- val = tny_account_get_name (TNY_ACCOUNT(cursor->data));
- break;
case MODEST_TNY_ACCOUNT_STORE_QUERY_URL:
val = tny_account_get_url_string (TNY_ACCOUNT(cursor->data));
break;
end:
if (account)
g_object_ref (G_OBJECT(account));
+ else {
+ /* Warn if nothing was found. This is generally unusual. */
+ switch (type) {
+ case MODEST_TNY_ACCOUNT_STORE_QUERY_ID:
+ g_warning("%s: Failed to find account with ID=%s\n", __FUNCTION__, str);
+ break;
+ case MODEST_TNY_ACCOUNT_STORE_QUERY_URL:
+ g_warning("%s: Failed to find account with URL=%s\n", __FUNCTION__, str);
+ break;
+ }
+ }
return account;
}
g_printerr ("modest: could not get an id for account %s\n",
account_name);
else
- account = modest_tny_account_store_get_tny_account_by (self, MODEST_TNY_ACCOUNT_STORE_QUERY_ID, id);
+ account = modest_tny_account_store_get_tny_account_by (self,
+ MODEST_TNY_ACCOUNT_STORE_QUERY_ID, id);
if (!account)
g_printerr ("modest: could not get tny %s account for %s (id=%s)\n",
type == TNY_ACCOUNT_TYPE_STORE ? "store" : "transport",
account_name, id ? id : "<none>");
+ g_free (id);
return account;
}
if (!tny_device_is_online (device))
return NULL;
+ g_return_val_if_fail (self, NULL);
+ g_return_val_if_fail (account_name, NULL);
+
+
#ifdef MODEST_PLATFORM_MAEMO
g_assert (TNY_IS_MAEMO_CONIC_DEVICE (device));
TnyMaemoConicDevice *maemo_device = TNY_MAEMO_CONIC_DEVICE (device);
modest_tny_account_store_get_transport_account_for_open_connection (ModestTnyAccountStore *self,
const gchar *account_name)
{
+ g_return_val_if_fail (self, NULL);
+ g_return_val_if_fail (account_name, NULL);
+
+ if (!account_name || !self)
+ return NULL;
+
/* Get the connection-specific transport acccount, if any: */
- TnyAccount *account = get_smtp_specific_transport_account_for_open_connection (self, account_name);
+ TnyAccount *account =
+ get_smtp_specific_transport_account_for_open_connection (self, account_name);
/* If there is no connection-specific transport account (the common case),
* just get the regular transport account: */
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)
{
return account;
}
+
+