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));
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;
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);
}
-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,
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_server_account_cache_if_needed (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;
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: */