X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-tny-account-store.c;h=9d46e757d8b2a22a698d20799b6c8bb297a03a44;hp=5b85b3771e9a1726385ecae2164bc72675b47204;hb=43e62768748b9385ba4ba926c14c59ed2eaa3f9f;hpb=69919988cc084f8dd70d17cdd11988386359922b diff --git a/src/modest-tny-account-store.c b/src/modest-tny-account-store.c index 5b85b37..9d46e75 100644 --- a/src/modest-tny-account-store.c +++ b/src/modest-tny-account-store.c @@ -60,7 +60,7 @@ #ifdef MODEST_PLATFORM_MAEMO #include -#ifdef MODEST_HILDON_VERSION_0 +#ifdef MODEST_HAVE_HILDON0_WIDGETS #include #include #else @@ -244,6 +244,23 @@ account_list_free (GSList *accounts) 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) { @@ -381,13 +398,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 +416,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 : ""); + if (cancel) + *cancel = TRUE; + + return NULL; + } + self = MODEST_TNY_ACCOUNT_STORE (account_store); priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self); @@ -408,7 +439,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 +463,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 @@ -522,6 +561,12 @@ modest_tny_account_store_finalize (GObject *obj) 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; @@ -543,7 +588,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); @@ -555,17 +600,14 @@ modest_tny_account_store_new (ModestAccountMgr *account_mgr, TnyDevice *device) 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); @@ -624,8 +666,9 @@ create_per_account_local_outbox_folders (TnyAccountStore *self) accounts = g_slist_append (accounts, tny_account_outbox); /* cache it */ }; - - g_slist_free (account_names); + + modest_account_mgr_free_account_names (account_names); + account_names = NULL; priv->store_accounts_outboxes = accounts; } @@ -638,8 +681,6 @@ static void get_server_accounts (TnyAccountStore *self, TnyList *list, TnyAccountType type) { g_return_if_fail (self); - - /* printf ("DEBUG: %s: list=%p, type=%d\n", __FUNCTION__, list, type); */ ModestTnyAccountStorePrivate *priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self); @@ -766,13 +807,11 @@ get_server_accounts (TnyAccountStore *self, TnyList *list, TnyAccountType type) iter_account_names = g_slist_next (iter_account_names); } } - - g_slist_free (account_names); + + /* free the account_names */ + modest_account_mgr_free_account_names (account_names); account_names = NULL; - - /* TODO: Delete the strings in the GSList */ - - + /* We also create a per-account local outbox folder (a _store_ account) * for each _transport_ account. */ if (type == TNY_ACCOUNT_TYPE_TRANSPORT) { @@ -943,8 +982,10 @@ modest_tny_account_store_alert (TnyAccountStore *self, TnyAlertType type, * 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: */ @@ -1091,6 +1132,7 @@ modest_tny_account_store_get_session (TnyAccountStore *self) } + TnyAccount* modest_tny_account_store_get_tny_account_by (ModestTnyAccountStore *self, ModestTnyAccountStoreQueryType type, @@ -1100,12 +1142,22 @@ 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 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) { @@ -1121,7 +1173,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 { @@ -1304,6 +1356,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) { @@ -1328,3 +1394,5 @@ modest_tny_account_store_get_local_folders_account (TnyAccountStore *self) return account; } + +