X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fmodest-tny-account-store.c;h=a48682ff718c9965e3c108f3d14022992b94eb57;hb=bc9bbede5d63979b331c72fbc291379be01df0ad;hp=4d005e0554d9752b7a9b2fa3cef4826b6b325b90;hpb=27eb32137472bfe15e7126baafe581f097817413;p=modest diff --git a/src/modest-tny-account-store.c b/src/modest-tny-account-store.c index 4d005e0..a48682f 100644 --- a/src/modest-tny-account-store.c +++ b/src/modest-tny-account-store.c @@ -34,12 +34,12 @@ #include #include #include -#include #include #include #include #include #include +#include #include #include #include @@ -73,9 +73,9 @@ typedef struct _ModestTnyAccountStorePrivate ModestTnyAccountStorePrivate; struct _ModestTnyAccountStorePrivate { gchar *cache_dir; GHashTable *password_hash; - TnyDevice *device; ModestAccountMgr *account_mgr; TnySessionCamel *session; + TnyDevice *device; /* we cache them here */ GSList *store_accounts; @@ -166,19 +166,26 @@ modest_tny_account_store_instance_init (ModestTnyAccountStore *obj) priv->cache_dir = NULL; priv->account_mgr = NULL; - priv->device = NULL; priv->session = NULL; + priv->device = NULL; priv->password_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); } + + static void account_list_free (GSList *accounts) { GSList *cursor = accounts; + while (cursor) { g_object_unref (G_OBJECT(cursor->data)); + if (G_IS_OBJECT(cursor->data)) { /* check twice... */ + const gchar *id = tny_account_get_id(TNY_ACCOUNT(cursor->data)); + modest_runtime_verify_object_death(cursor->data,id); + } cursor = cursor->next; } g_slist_free (accounts); @@ -195,6 +202,8 @@ on_account_removed (ModestAccountMgr *acc_mgr, const gchar *account, gboolean se /* 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') */ + + account_list_free (priv->store_accounts); priv->store_accounts = NULL; @@ -222,7 +231,6 @@ on_account_changed (ModestAccountMgr *acc_mgr, const gchar *account, gboolean se account_list_free (priv->transport_accounts); priv->transport_accounts = NULL; - g_signal_emit (G_OBJECT(self), signals[ACCOUNT_UPDATE_SIGNAL], 0, account); } @@ -333,6 +341,8 @@ modest_tny_account_store_finalize (GObject *obj) { ModestTnyAccountStore *self = MODEST_TNY_ACCOUNT_STORE(obj); ModestTnyAccountStorePrivate *priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self); + + //gboolean debug = modest_runtime_get_debug_flags() & MODEST_RUNTIME_DEBUG_DEBUG_OBJECTS; g_free (priv->cache_dir); priv->cache_dir = NULL; @@ -347,6 +357,11 @@ modest_tny_account_store_finalize (GObject *obj) priv->account_mgr = NULL; } + if (priv->device) { + g_object_unref (G_OBJECT(priv->device)); + priv->device = NULL; + } + /* this includes the local folder */ account_list_free (priv->store_accounts); priv->store_accounts = NULL; @@ -356,39 +371,36 @@ modest_tny_account_store_finalize (GObject *obj) if (priv->session) { camel_object_unref (CAMEL_OBJECT(priv->session)); + modest_runtime_verify_object_death(priv->session, ""); priv->session = NULL; } - - /* the device should be unref'ed *AFTER* the session */ - if (priv->device) { - g_object_unref (G_OBJECT(priv->device)); - priv->device = NULL; - } G_OBJECT_CLASS(parent_class)->finalize (obj); } ModestTnyAccountStore* -modest_tny_account_store_new (ModestAccountMgr *account_mgr) { +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); obj = G_OBJECT(g_object_new(MODEST_TYPE_TNY_ACCOUNT_STORE, NULL)); priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(obj); - priv->account_mgr = account_mgr; - g_object_ref (G_OBJECT(priv->account_mgr)); - + priv->account_mgr = g_object_ref (G_OBJECT(account_mgr)); + priv->device = g_object_ref (device); + priv->session = tny_session_camel_new (TNY_ACCOUNT_STORE(obj)); 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, @@ -421,6 +433,8 @@ get_cached_accounts (TnyAccountStore *self, TnyList *list, TnyAccountType type) } } + + /* this function fills the TnyList, and also returns a GSList of the accounts, * for caching purposes */ @@ -442,15 +456,19 @@ get_accounts (TnyAccountStore *self, TnyList *list, TnyAccountType type) /* only return enabled accounts */ if (modest_account_mgr_get_enabled(priv->account_mgr, account_name)) { TnyAccount *tny_account = - modest_tny_account_new_from_account (priv->account_mgr, account_name, - type, priv->session, get_password, + modest_tny_account_new_from_account (priv->account_mgr, + account_name, + type, priv->session, + get_password, forget_password); - if (tny_account) { /* something went wrong */ - g_object_set_data (G_OBJECT(tny_account), "account_store", (gpointer)self); + if (tny_account) { + g_object_set_data (G_OBJECT(tny_account), "account_store", + (gpointer)self); tny_list_prepend (list, G_OBJECT(tny_account)); accounts = g_slist_append (accounts, tny_account); /* cache it */ } else - g_printerr ("modest: failed to create account for %s\n", account_name); + g_printerr ("modest: failed to create account for %s\n", + account_name); } g_free (account_name); } @@ -462,11 +480,10 @@ get_accounts (TnyAccountStore *self, TnyList *list, TnyAccountType type) modest_tny_account_new_for_local_folders (priv->account_mgr, priv->session); tny_list_prepend (list, G_OBJECT(tny_account)); accounts = g_slist_append (accounts, tny_account); /* cache it */ - } - + } return accounts; -} - +} + static void modest_tny_account_store_get_accounts (TnyAccountStore *self, TnyList *list, @@ -480,8 +497,10 @@ modest_tny_account_store_get_accounts (TnyAccountStore *self, TnyList *list, priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self); if (request_type == TNY_ACCOUNT_STORE_BOTH) { - modest_tny_account_store_get_accounts (self, list, TNY_ACCOUNT_STORE_STORE_ACCOUNTS); - modest_tny_account_store_get_accounts (self, list, TNY_ACCOUNT_STORE_TRANSPORT_ACCOUNTS); + modest_tny_account_store_get_accounts (self, list, + TNY_ACCOUNT_STORE_STORE_ACCOUNTS); + modest_tny_account_store_get_accounts (self, list, + TNY_ACCOUNT_STORE_TRANSPORT_ACCOUNTS); return; } @@ -495,7 +514,8 @@ modest_tny_account_store_get_accounts (TnyAccountStore *self, TnyList *list, } else if (request_type == TNY_ACCOUNT_STORE_TRANSPORT_ACCOUNTS) { if (!priv->transport_accounts) - priv->transport_accounts = get_accounts (self, list, TNY_ACCOUNT_TYPE_TRANSPORT); + priv->transport_accounts = + get_accounts (self, list, TNY_ACCOUNT_TYPE_TRANSPORT); else get_cached_accounts (self, list, TNY_ACCOUNT_TYPE_TRANSPORT); } else @@ -511,9 +531,7 @@ modest_tny_account_store_get_cache_dir (TnyAccountStore *self) if (!priv->cache_dir) priv->cache_dir = g_build_filename (g_get_home_dir(), - MODEST_DIR, - MODEST_CACHE_DIR, - "cache", NULL); + MODEST_DIR, MODEST_CACHE_DIR, NULL); return priv->cache_dir; } @@ -526,13 +544,49 @@ modest_tny_account_store_get_device (TnyAccountStore *self) { ModestTnyAccountStorePrivate *priv; - priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE (self); + g_return_val_if_fail (self, NULL); + + priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self); + + if (priv->device) + return g_object_ref (G_OBJECT(priv->device)); + else + return NULL; +} + + +static TnyAccount* +modest_tny_account_store_find_account_by_url (TnyAccountStore *self, const gchar* url_string) +{ + TnyAccount *account = NULL; + ModestTnyAccountStorePrivate *priv; + GSList *cursor; - if (!priv->device) - priv->device = tny_platform_factory_new_device - (modest_tny_platform_factory_get_instance()); + g_return_val_if_fail (self, NULL); + g_return_val_if_fail (url_string, NULL); - return g_object_ref (G_OBJECT(priv->device)); + 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; } @@ -612,6 +666,8 @@ modest_tny_account_store_init (gpointer g, gpointer iface_data) modest_tny_account_store_get_device; klass->alert_func = modest_tny_account_store_alert; + klass->find_account_func = + modest_tny_account_store_find_account_by_url; } void @@ -625,7 +681,7 @@ modest_tny_account_store_set_get_pass_func (ModestTnyAccountStore *self, TnySessionCamel* tny_account_store_get_session (TnyAccountStore *self) { - g_return_val_if_fail (self, NULL); + g_return_val_if_fail (self, NULL); return MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE (self)->session; } @@ -644,7 +700,7 @@ modest_tny_account_store_get_tny_account_by_id (ModestTnyAccountStore *self, co 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) { + if (acc_id && strcmp (acc_id, id) == 0) { account = TNY_ACCOUNT(cursor->data); break; } @@ -694,8 +750,12 @@ modest_tny_account_store_get_tny_account_by_account (ModestTnyAccountStore *self else if (account_data->transport_account) id = account_data->transport_account->account_name; - if (id) + if (!id) + 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); + if (!account) g_printerr ("modest: could not get tny %s account for %s (id=%s)\n", type == TNY_ACCOUNT_TYPE_STORE? "store" : "transport",