X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmodest-tny-account-store.c;h=9868a5145b3584c59873c12a868c9cfd790ae19e;hp=4d005e0554d9752b7a9b2fa3cef4826b6b325b90;hb=150b4cb3020b18a35b08703f5caa6386025805c7;hpb=27eb32137472bfe15e7126baafe581f097817413 diff --git a/src/modest-tny-account-store.c b/src/modest-tny-account-store.c index 4d005e0..9868a51 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,8 +166,8 @@ 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); @@ -177,8 +177,14 @@ static void account_list_free (GSList *accounts) { GSList *cursor = accounts; + gboolean debug = modest_runtime_get_debug_flags() & MODEST_RUNTIME_DEBUG_DEBUG_OBJECTS; + while (cursor) { g_object_unref (G_OBJECT(cursor->data)); + if (debug && G_IS_OBJECT(cursor->data)) + g_warning ("BUG: account %s still holds %d ref(s)", + tny_account_get_id (TNY_ACCOUNT(cursor->data)), + G_OBJECT(cursor->data)->ref_count); cursor = cursor->next; } g_slist_free (accounts); @@ -222,7 +228,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 +338,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 +354,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,27 +368,25 @@ modest_tny_account_store_finalize (GObject *obj) if (priv->session) { camel_object_unref (CAMEL_OBJECT(priv->session)); + if (debug && CAMEL_IS_OBJECT(priv->session)) + g_warning ("BUG: TnyCamelSession still holds %d ref(s)", + CAMEL_OBJECT(priv->session)->ref_count); 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; 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); @@ -384,6 +394,9 @@ modest_tny_account_store_new (ModestAccountMgr *account_mgr) { priv->account_mgr = account_mgr; g_object_ref (G_OBJECT(priv->account_mgr)); + priv->device = device; + g_object_ref (priv->device); + priv->session = tny_session_camel_new (TNY_ACCOUNT_STORE(obj)); tny_session_camel_set_ui_locker (priv->session, tny_gtk_lockable_new ()); @@ -442,15 +455,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); + 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); } @@ -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,11 +514,14 @@ 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 + } else { g_return_if_reached (); /* incorrect req type */ + return; + } } @@ -526,13 +548,14 @@ modest_tny_account_store_get_device (TnyAccountStore *self) { ModestTnyAccountStorePrivate *priv; - priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE (self); - - if (!priv->device) - priv->device = tny_platform_factory_new_device - (modest_tny_platform_factory_get_instance()); + g_return_val_if_fail (self, NULL); - return g_object_ref (G_OBJECT(priv->device)); + priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self); + + if (priv->device) + return g_object_ref (G_OBJECT(priv->device)); + else + return NULL; }