X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-tny-account-store.c;h=f5da3b4e7cf5a8cc97648a83a7acd96bc47df1b5;hp=bd08cb1c3876c9fb71cf11d69af52908d8495935;hb=886e3dc74b551f9d9f0b3e8f2c12f864d0265a77;hpb=e565f583b5b88c4e1cc330f5ed22c39f86525a32 diff --git a/src/modest-tny-account-store.c b/src/modest-tny-account-store.c index bd08cb1..f5da3b4 100644 --- a/src/modest-tny-account-store.c +++ b/src/modest-tny-account-store.c @@ -81,9 +81,9 @@ static void modest_tny_account_store_instance_init (ModestTnyAccountStore *ob static void modest_tny_account_store_init (gpointer g, gpointer iface_data); -static void -get_server_accounts (TnyAccountStore *self, TnyList *list, TnyAccountType type); - +static void get_server_accounts (TnyAccountStore *self, + TnyList *list, + TnyAccountType type); /* list my signals */ enum { @@ -324,23 +324,28 @@ on_account_removed (ModestAccountMgr *acc_mgr, { ModestTnyAccountStore *self = MODEST_TNY_ACCOUNT_STORE(user_data); TnyAccount *store_account; - + /* Clear the account cache */ - store_account = - modest_tny_account_store_get_server_account (self, - account, - TNY_ACCOUNT_TYPE_STORE); + store_account = modest_tny_account_store_get_tny_account_by (self, + MODEST_TNY_ACCOUNT_STORE_QUERY_NAME, + account); if (store_account) { tny_store_account_delete_cache (TNY_STORE_ACCOUNT (store_account)); - g_object_unref (store_account); - } + + g_signal_emit (G_OBJECT (self), + tny_account_store_signals [TNY_ACCOUNT_STORE_ACCOUNT_REMOVED], + 0, store_account); + g_object_unref (store_account); + } else + g_printerr ("modest: cannot find server account for %s", account); + /* FIXME: make this more finegrained; changes do not * really affect _all_ accounts, and some do not * affect tny accounts at all (such as 'last_update') */ recreate_all_accounts (self); - + g_signal_emit (G_OBJECT(self), signals[ACCOUNT_UPDATE_SIGNAL], 0, account); } @@ -352,17 +357,15 @@ on_account_changed (ModestAccountMgr *acc_mgr, const gchar *account, { ModestTnyAccountStore *self = MODEST_TNY_ACCOUNT_STORE(user_data); - #if 0 /* Ignore the change if it's a change in the last_updated value */ - if (g_str_has_suffix (key, MODEST_ACCOUNT_LAST_UPDATED)) + if (g_slist_length ((GSList *)keys) == 1 && + g_str_has_suffix ((const gchar *) keys->data, MODEST_ACCOUNT_LAST_UPDATED)) return; - #endif /* FIXME: make this more finegrained; changes do not really affect _all_ - * accounts, and some do not affect tny accounts at all (such as 'last_update') + * accounts */ - if (server_account) - recreate_all_accounts (self); + recreate_all_accounts (self); g_signal_emit (G_OBJECT(self), signals[ACCOUNT_UPDATE_SIGNAL], 0, account); @@ -621,8 +624,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; } @@ -635,8 +639,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); @@ -650,8 +652,8 @@ get_server_accounts (TnyAccountStore *self, TnyList *list, TnyAccountType type) return; } - GSList *account_names = NULL, *cursor = NULL; - GSList *accounts = NULL; + GSList *account_names = NULL, *cursor = NULL; + GSList *accounts = NULL; /* These are account names, not server_account names */ account_names = modest_account_mgr_account_names (priv->account_mgr,FALSE); @@ -763,13 +765,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) { @@ -806,11 +806,13 @@ get_server_accounts (TnyAccountStore *self, TnyList *list, TnyAccountType type) g_object_ref (outbox_account); accounts = g_slist_append (accounts, outbox_account); } + } + + /* Add a merged folder, merging all the per-account outbox folders: */ + modest_tny_local_folders_account_add_merged_outbox_folders ( + MODEST_TNY_LOCAL_FOLDERS_ACCOUNT (tny_account), priv->store_accounts_outboxes); - /* Add a merged folder, merging all the per-account outbox folders: */ - modest_tny_local_folders_account_add_merged_outbox_folders ( - MODEST_TNY_LOCAL_FOLDERS_ACCOUNT (tny_account), priv->store_accounts_outboxes); - + if (priv->store_accounts_outboxes) { /* We have finished with this temporary list, so free it: */ account_list_free (priv->store_accounts_outboxes); priv->store_accounts_outboxes = NULL; @@ -901,35 +903,9 @@ modest_tny_account_store_get_device (TnyAccountStore *self) static TnyAccount* modest_tny_account_store_find_account_by_url (TnyAccountStore *self, const gchar* url_string) { - TnyAccount *account = NULL; - ModestTnyAccountStorePrivate *priv; - GSList *cursor; - - g_return_val_if_fail (self, NULL); - g_return_val_if_fail (url_string, NULL); - - priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self); - - for (cursor = priv->store_accounts; cursor ; cursor = cursor->next) { - if (tny_account_matches_url_string (TNY_ACCOUNT(cursor->data), url_string)) { - account = TNY_ACCOUNT(cursor->data); - break; - } - } - - if (!account) { - for (cursor = priv->transport_accounts; !account && cursor ; cursor = cursor->next) { - if (tny_account_matches_url_string (TNY_ACCOUNT(cursor->data), url_string)) { - account = TNY_ACCOUNT(cursor->data); - break; - } - } - } - - if (account) - g_object_ref (G_OBJECT(account)); - - return account; + return modest_tny_account_store_get_tny_account_by (MODEST_TNY_ACCOUNT_STORE (self), + MODEST_TNY_ACCOUNT_STORE_QUERY_URL, + url_string); } @@ -964,14 +940,14 @@ 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); +/* 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: */ /* prompt = _("Modest account not yet fully configured."); */ prompt = g_strdup_printf( - "%s\n (Internal error message, often very misleading:\n%s", + "%s\n (Internal error message, often very misleading):\n%s", _("Incorrect Account Settings"), error->message); @@ -1113,35 +1089,72 @@ modest_tny_account_store_get_session (TnyAccountStore *self) TnyAccount* -modest_tny_account_store_get_tny_account_by_id (ModestTnyAccountStore *self, const gchar *id) +modest_tny_account_store_get_tny_account_by (ModestTnyAccountStore *self, + ModestTnyAccountStoreQueryType type, + const gchar *str) { TnyAccount *account = NULL; ModestTnyAccountStorePrivate *priv; GSList *cursor; + const gchar *val = NULL; g_return_val_if_fail (self, NULL); - g_return_val_if_fail (id, NULL); + g_return_val_if_fail (str, NULL); priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self); - + /* Search in store accounts */ for (cursor = priv->store_accounts; cursor ; cursor = cursor->next) { - const gchar *acc_id = tny_account_get_id (TNY_ACCOUNT(cursor->data)); - if (acc_id && strcmp (acc_id, id) == 0) { - account = TNY_ACCOUNT(cursor->data); + 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)) { + account = TNY_ACCOUNT (cursor->data); + goto end; + } else { + if (strcmp (val, str) == 0) { + account = TNY_ACCOUNT(cursor->data); + goto end; + } + } } /* if we already found something, no need to search the transport accounts */ for (cursor = priv->transport_accounts; !account && cursor ; cursor = cursor->next) { - const gchar *acc_id = tny_account_get_id (TNY_ACCOUNT(cursor->data)); - if (acc_id && strcmp (acc_id, id) == 0) { - account = TNY_ACCOUNT(cursor->data); + 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 = 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; } + + if (type == MODEST_TNY_ACCOUNT_STORE_QUERY_URL && + tny_account_matches_url_string (TNY_ACCOUNT(cursor->data), val)) { + account = TNY_ACCOUNT (cursor->data); + goto end; + } else { + if (strcmp (val, str) == 0) { + account = TNY_ACCOUNT(cursor->data); + goto end; + } + } } - + end: if (account) g_object_ref (G_OBJECT(account)); @@ -1174,10 +1187,10 @@ modest_tny_account_store_get_server_account (ModestTnyAccountStore *self, } } else { ModestAccountData *account_data; - account_data = modest_account_mgr_get_account_data (priv->account_mgr, account_name); if (!account_data) { - g_printerr ("modest: %s: cannot get account data for account '%s'\n", __FUNCTION__, account_name); + g_printerr ("modest: %s: cannot get account data for account '%s'\n", __FUNCTION__, + account_name); return NULL; } @@ -1193,7 +1206,7 @@ modest_tny_account_store_get_server_account (ModestTnyAccountStore *self, g_printerr ("modest: could not get an id for account %s\n", account_name); else - account = modest_tny_account_store_get_tny_account_by_id (self, 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", @@ -1240,7 +1253,9 @@ get_smtp_specific_transport_account_for_open_connection (ModestTnyAccountStore * return NULL; /* No connection-specific SMTP server was specified for this connection. */ } - TnyAccount* account = modest_tny_account_store_get_tny_account_by_id (self, server_account_name); + TnyAccount* account = modest_tny_account_store_get_tny_account_by (self, + MODEST_TNY_ACCOUNT_STORE_QUERY_ID, + server_account_name); /* printf ("DEBUG: %s: account=%p\n", __FUNCTION__, account); */ g_free (server_account_name); @@ -1278,14 +1293,16 @@ modest_tny_account_store_get_transport_account_for_open_connection (ModestTnyAcc return account; } -gboolean modest_tny_account_is_virtual_local_folders (TnyAccount *self) +gboolean +modest_tny_account_is_virtual_local_folders (TnyAccount *self) { /* We should make this more sophisticated if we ever use ModestTnyLocalFoldersAccount * for anything else. */ return MODEST_IS_TNY_LOCAL_FOLDERS_ACCOUNT (self); } -TnyAccount* modest_tny_account_store_get_local_folders_account (TnyAccountStore *self) +TnyAccount* +modest_tny_account_store_get_local_folders_account (TnyAccountStore *self) { TnyAccount *account = NULL; ModestTnyAccountStorePrivate *priv;