X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-tny-account-store.c;h=73fe5b7a9db9519b4e33dab222b36e38596c4dc1;hp=dacd6878ef8bd99368d2acbf54c53aad9b4a64ef;hb=622a810e13a3b84ecff6c620ae39c3828ea3214e;hpb=5025480c1a855fdcd1a96d685f4f4d88509db20c diff --git a/src/modest-tny-account-store.c b/src/modest-tny-account-store.c index dacd687..73fe5b7 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) { @@ -327,7 +344,7 @@ on_account_removed (ModestAccountMgr *acc_mgr, /* 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)); @@ -388,8 +405,8 @@ static gchar* 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; @@ -399,10 +416,22 @@ get_password (TnyAccount *account, const gchar * prompt_not_used, gboolean *canc 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); @@ -410,7 +439,8 @@ get_password (TnyAccount *account, const gchar * prompt_not_used, gboolean *canc /* 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); @@ -531,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; @@ -552,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); @@ -564,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); @@ -754,7 +787,7 @@ get_server_accounts (TnyAccountStore *self, TnyList *list, TnyAccountType type) 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); @@ -949,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: */ @@ -1097,6 +1132,7 @@ modest_tny_account_store_get_session (TnyAccountStore *self) } + TnyAccount* modest_tny_account_store_get_tny_account_by (ModestTnyAccountStore *self, ModestTnyAccountStoreQueryType type, @@ -1106,28 +1142,35 @@ 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) { 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 { @@ -1144,9 +1187,6 @@ modest_tny_account_store_get_tny_account_by (ModestTnyAccountStore *self, 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; @@ -1166,6 +1206,17 @@ modest_tny_account_store_get_tny_account_by (ModestTnyAccountStore *self, 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; } @@ -1310,6 +1361,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) { @@ -1334,3 +1399,5 @@ modest_tny_account_store_get_local_folders_account (TnyAccountStore *self) return account; } + +