From: Sergio Villar Senin Date: Fri, 27 Jul 2007 16:54:39 +0000 (+0000) Subject: * Some more changes related to the migration to the new tinymail "architecture" X-Git-Url: http://vcs.maemo.org/git/?a=commitdiff_plain;h=a63133bd2585c3a0d3000ed95ae51e3568856391;p=modest * Some more changes related to the migration to the new tinymail "architecture" * Still experimental and incomplete pmo-sessionwork-r2835 --- diff --git a/src/modest-account-mgr.c b/src/modest-account-mgr.c index 46ed9d4..3da0df3 100644 --- a/src/modest-account-mgr.c +++ b/src/modest-account-mgr.c @@ -37,9 +37,11 @@ static void modest_account_mgr_class_init (ModestAccountMgrClass * klass); static void modest_account_mgr_init (ModestAccountMgr * obj); static void modest_account_mgr_finalize (GObject * obj); +static void modest_account_mgr_base_init (gpointer g_class); /* list my signals */ enum { + ACCOUNT_INSERTED_SIGNAL, ACCOUNT_CHANGED_SIGNAL, ACCOUNT_REMOVED_SIGNAL, ACCOUNT_BUSY_SIGNAL, @@ -149,7 +151,7 @@ modest_account_mgr_get_type (void) if (!my_type) { static const GTypeInfo my_info = { sizeof (ModestAccountMgrClass), - NULL, /* base init */ + modest_account_mgr_base_init, /* base init */ NULL, /* base finalize */ (GClassInitFunc) modest_account_mgr_class_init, NULL, /* class finalize */ @@ -167,6 +169,53 @@ modest_account_mgr_get_type (void) return my_type; } +static void +modest_account_mgr_base_init (gpointer g_class) +{ + static gboolean modest_account_mgr_initialized = FALSE; + + if (!modest_account_mgr_initialized) { + /* signal definitions */ + signals[ACCOUNT_INSERTED_SIGNAL] = + g_signal_new ("account_inserted", + MODEST_TYPE_ACCOUNT_MGR, + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET(ModestAccountMgrClass,account_inserted), + NULL, NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, 1, G_TYPE_STRING); + + signals[ACCOUNT_REMOVED_SIGNAL] = + g_signal_new ("account_removed", + MODEST_TYPE_ACCOUNT_MGR, + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET(ModestAccountMgrClass,account_removed), + NULL, NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, 1, G_TYPE_STRING); + + signals[ACCOUNT_CHANGED_SIGNAL] = + g_signal_new ("account_changed", + MODEST_TYPE_ACCOUNT_MGR, + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET(ModestAccountMgrClass,account_changed), + NULL, NULL, + modest_marshal_VOID__STRING_POINTER_BOOLEAN, + G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_BOOLEAN); + + signals[ACCOUNT_BUSY_SIGNAL] = + g_signal_new ("account_busy_changed", + MODEST_TYPE_ACCOUNT_MGR, + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET(ModestAccountMgrClass,account_busy_changed), + NULL, NULL, + modest_marshal_VOID__STRING_BOOLEAN, + G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_BOOLEAN); + + modest_account_mgr_initialized = TRUE; + } +} + static void modest_account_mgr_class_init (ModestAccountMgrClass * klass) { @@ -178,32 +227,6 @@ modest_account_mgr_class_init (ModestAccountMgrClass * klass) g_type_class_add_private (gobject_class, sizeof (ModestAccountMgrPrivate)); - - /* signal definitions */ - signals[ACCOUNT_REMOVED_SIGNAL] = - g_signal_new ("account_removed", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET(ModestAccountMgrClass,account_removed), - NULL, NULL, - g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, 1, G_TYPE_STRING); - signals[ACCOUNT_CHANGED_SIGNAL] = - g_signal_new ("account_changed", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET(ModestAccountMgrClass,account_changed), - NULL, NULL, - modest_marshal_VOID__STRING_POINTER_BOOLEAN, - G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_BOOLEAN); - signals[ACCOUNT_BUSY_SIGNAL] = - g_signal_new ("account_busy_changed", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET(ModestAccountMgrClass,account_busy_changed), - NULL, NULL, - modest_marshal_VOID__STRING_BOOLEAN, - G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_BOOLEAN); } diff --git a/src/modest-account-mgr.h b/src/modest-account-mgr.h index 9fc6e16..f93a712 100644 --- a/src/modest-account-mgr.h +++ b/src/modest-account-mgr.h @@ -56,6 +56,10 @@ struct _ModestAccountMgr { struct _ModestAccountMgrClass { GObjectClass parent_class; + void (* account_inserted) (ModestAccountMgr *obj, + const gchar* account, + gpointer user_data); + void (* account_removed) (ModestAccountMgr *obj, const gchar* account, gpointer user_data); @@ -67,9 +71,9 @@ struct _ModestAccountMgrClass { gpointer user_data); void (* account_busy_changed) (ModestAccountMgr *obj, - const gchar* account, - gboolean busy, - gpointer user_data); + const gchar* account, + gboolean busy, + gpointer user_data); }; /** diff --git a/src/modest-tny-account-store.c b/src/modest-tny-account-store.c index 6f35370..a801b28 100644 --- a/src/modest-tny-account-store.c +++ b/src/modest-tny-account-store.c @@ -92,6 +92,7 @@ enum { ACCOUNT_CHANGED_SIGNAL, ACCOUNT_INSERTED_SIGNAL, ACCOUNT_REMOVED_SIGNAL, + ACCOUNT_UPDATE_SIGNAL, PASSWORD_REQUESTED_SIGNAL, LAST_SIGNAL @@ -108,15 +109,15 @@ struct _ModestTnyAccountStorePrivate { /* We cache the lists of accounts here. * They are created in our get_accounts_func() implementation. */ - GSList *store_accounts; - GSList *transport_accounts; + TnyList *store_accounts; + TnyList *transport_accounts; /* This is also contained in store_accounts, * but we cached it temporarily separately, * because we create this while creating the transport accounts, * but return it when requesting the store accounts: */ - GSList *store_accounts_outboxes; + TnyList *store_accounts_outboxes; }; #define MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ @@ -288,39 +289,26 @@ modest_tny_account_store_instance_init (ModestTnyAccountStore *obj) obj); } +/* disconnect the list of TnyAccounts */ static void -account_list_free (GSList *accounts) +foreach_account_disconnect (gpointer data, + gpointer user_data) { - GSList *cursor = accounts; - - while (cursor) { - if (G_IS_OBJECT(cursor->data)) { /* check twice... */ - const gchar *id = tny_account_get_id(TNY_ACCOUNT(cursor->data)); - modest_runtime_verify_object_last_ref(cursor->data,id); - } - g_object_unref (G_OBJECT(cursor->data)); - cursor = cursor->next; - } - g_slist_free (accounts); + tny_camel_account_set_online (TNY_CAMEL_ACCOUNT(data), FALSE, NULL); } - -/* disconnect the list of TnyAccounts */ static void -account_list_disconnect (GSList *accounts) +foreach_account_append_to_list (gpointer data, + gpointer user_data) { - GSList *cursor = accounts; + TnyList *list; - 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); - } + list = TNY_LIST (user_data); + tny_list_append (list, G_OBJECT (data)); } - static void recreate_all_accounts (ModestTnyAccountStore *self) { @@ -330,27 +318,27 @@ recreate_all_accounts (ModestTnyAccountStore *self) MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self); if (priv->store_accounts_outboxes) { - account_list_free (priv->store_accounts_outboxes); + g_object_unref (priv->store_accounts_outboxes); priv->store_accounts_outboxes = NULL; } if (priv->store_accounts) { - account_list_free (priv->store_accounts); + g_object_unref (priv->store_accounts); priv->store_accounts = NULL; } get_server_accounts (TNY_ACCOUNT_STORE(self), - NULL, TNY_ACCOUNT_TYPE_STORE); + NULL, TNY_ACCOUNT_TYPE_STORE); if (priv->transport_accounts) { - account_list_free (priv->transport_accounts); + g_object_unref (priv->transport_accounts); priv->transport_accounts = NULL; } get_server_accounts (TNY_ACCOUNT_STORE(self), NULL, - TNY_ACCOUNT_TYPE_TRANSPORT); + TNY_ACCOUNT_TYPE_TRANSPORT); } static void @@ -878,19 +866,19 @@ 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; - - account_list_free (priv->transport_accounts); - priv->transport_accounts = NULL; + /* Destroy all accounts. Disconnect all accounts before they are destroyed */ + if (priv->store_accounts) { + tny_list_foreach (priv->store_accounts, foreach_account_disconnect, NULL); + g_object_unref (priv->store_accounts); + priv->store_accounts = NULL; + } + if (priv->transport_accounts) { + tny_list_foreach (priv->transport_accounts, foreach_account_disconnect, NULL); + g_object_unref (priv->transport_accounts); + priv->transport_accounts = NULL; + } + if (priv->session) { camel_object_unref (CAMEL_OBJECT(priv->session)); priv->session = NULL; @@ -921,15 +909,15 @@ modest_tny_account_store_new (ModestAccountMgr *account_mgr, TnyDevice *device) g_warning ("failed to get TnySessionCamel"); return NULL; } - + + /* Set the ui locker */ tny_session_camel_set_ui_locker (priv->session, tny_gtk_lockable_new ()); -/* tny_session_camel_set_async_connecting (priv->session, TRUE); */ /* Connect signals */ g_signal_connect (G_OBJECT(account_mgr), "account_changed", - G_CALLBACK (on_account_changed), obj); + G_CALLBACK (on_account_changed), obj); g_signal_connect (G_OBJECT(account_mgr), "account_removed", - G_CALLBACK (on_account_removed), obj); + G_CALLBACK (on_account_removed), obj); return MODEST_TNY_ACCOUNT_STORE(obj); } @@ -938,55 +926,47 @@ modest_tny_account_store_new (ModestAccountMgr *account_mgr, TnyDevice *device) static void get_cached_accounts (TnyAccountStore *self, TnyList *list, TnyAccountType type) { - ModestTnyAccountStorePrivate *priv; - GSList *accounts, *cursor; + ModestTnyAccountStorePrivate *priv = NULL; + TnyList *accounts = NULL; - priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self); - accounts = (type == TNY_ACCOUNT_TYPE_STORE ? priv->store_accounts : priv->transport_accounts); + priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE (self); + accounts = (type == TNY_ACCOUNT_TYPE_STORE) ? priv->store_accounts : priv->transport_accounts; - cursor = accounts; - while (cursor) { - if (cursor->data) { - GObject *object = G_OBJECT(cursor->data); - tny_list_prepend (list, object); - } - - cursor = cursor->next; - } + /* Add accounts to the list */ + tny_list_foreach (accounts, foreach_account_append_to_list, list); } static void create_per_account_local_outbox_folders (TnyAccountStore *self) { + ModestTnyAccountStorePrivate *priv; + TnyList *accounts = NULL; + GSList *account_names = NULL, *iter = NULL; + g_return_if_fail (self); - ModestTnyAccountStorePrivate *priv = - MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self); - - /* printf("DEBUG: %s: priv->store_accounts_outboxes = %p\n", __FUNCTION__, priv->store_accounts_outboxes); */ - - GSList *accounts = NULL; + priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self); + /* including disabled accounts */ + account_names = modest_account_mgr_account_names (priv->account_mgr, TRUE); - GSList *account_names = modest_account_mgr_account_names (priv->account_mgr, - TRUE /* including disabled accounts */); - - GSList *iter = NULL; + accounts = tny_simple_list_new (); for (iter = account_names; iter; iter = g_slist_next (iter)) { - + TnyAccount *tny_account_outbox = NULL; const gchar* account_name = (const gchar*)iter->data; /* Create a per-account local outbox folder (a _store_ account) * for each _transport_ account: */ - TnyAccount *tny_account_outbox = - modest_tny_account_new_for_per_account_local_outbox_folder ( - priv->account_mgr, account_name, priv->session); - - accounts = g_slist_append (accounts, tny_account_outbox); /* cache it */ + tny_account_outbox = + modest_tny_account_new_for_per_account_local_outbox_folder (priv->account_mgr, + account_name, + priv->session); + /* Cache it */ + tny_list_append (accounts, G_OBJECT (tny_account_outbox)); + g_object_unref (tny_account_outbox); }; + /* Free and save */ modest_account_mgr_free_account_names (account_names); - account_names = NULL; - priv->store_accounts_outboxes = accounts; } @@ -997,29 +977,34 @@ create_per_account_local_outbox_folders (TnyAccountStore *self) static void get_server_accounts (TnyAccountStore *self, TnyList *list, TnyAccountType type) { + GSList *account_names = NULL, *cursor = NULL; + TnyList *accounts = NULL; + ModestTnyAccountStorePrivate *priv = NULL; + + g_return_if_fail (type == TNY_ACCOUNT_TYPE_STORE || + type == TNY_ACCOUNT_TYPE_TRANSPORT); + g_return_if_fail (list); g_return_if_fail (self); - - ModestTnyAccountStorePrivate *priv = - MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self); + + priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self); /* Do nothing if the accounts are already cached: */ if (type == TNY_ACCOUNT_TYPE_STORE) { if (priv->store_accounts) return; - } else if (type == TNY_ACCOUNT_TYPE_TRANSPORT) { + } else { if (priv->transport_accounts) return; } - GSList *account_names = NULL, *cursor = NULL; - GSList *accounts = NULL; /* These are account names, not server_account names */ + accounts = tny_simple_list_new (); account_names = modest_account_mgr_account_names (priv->account_mgr,FALSE); for (cursor = account_names; cursor; cursor = cursor->next) { - gchar *account_name = (gchar*)cursor->data; + gchar *account_name = (gchar*) cursor->data; /* we get the server_accounts for enabled accounts */ if (modest_account_mgr_get_enabled(priv->account_mgr, account_name)) { @@ -1043,17 +1028,17 @@ get_server_accounts (TnyAccountStore *self, TnyList *list, TnyAccountType type) g_object_set_data (G_OBJECT(tny_account), "account_store", (gpointer)self); - if (list) - tny_list_prepend (list, G_OBJECT(tny_account)); - - accounts = g_slist_append (accounts, tny_account); /* cache it */ + + /* Append to the list and cache it */ + tny_list_append (list, G_OBJECT (tny_account)); + tny_list_append (accounts, G_OBJECT (tny_account)); } else g_printerr ("modest: failed to create account for %s\n", account_name); } } - if (type == TNY_ACCOUNT_TYPE_STORE) { + if (type == TNY_ACCOUNT_TYPE_STORE) { /* Also add the Memory card account if it is mounted: */ gboolean mmc_is_mounted = FALSE; GnomeVFSVolumeMonitor* monitor = @@ -1082,9 +1067,10 @@ get_server_accounts (TnyAccountStore *self, TnyList *list, TnyAccountType type) TnyAccount *tny_account = modest_tny_account_new_for_local_folders (priv->account_mgr, priv->session, MODEST_MCC1_VOLUMEPATH); - if (list) - tny_list_prepend (list, G_OBJECT(tny_account)); - accounts = g_slist_append (accounts, tny_account); /* cache it */ + + /* Append to the list and cache it */ + tny_list_prepend (list, G_OBJECT(tny_account)); + tny_list_append (accounts, G_OBJECT (tny_account)); } } @@ -1119,10 +1105,10 @@ get_server_accounts (TnyAccountStore *self, TnyList *list, TnyAccountType type) modest_tny_account_set_parent_modest_account_name_for_server_account (tny_account, account_name); g_object_set_data (G_OBJECT(tny_account), "account_store", (gpointer)self); - if (list) - tny_list_prepend (list, G_OBJECT(tny_account)); - accounts = g_slist_append (accounts, tny_account); /* cache it */ + /* Append to the list and cache it */ + tny_list_prepend (list, G_OBJECT(tny_account)); + tny_list_append (accounts, G_OBJECT (tny_account)); } else g_printerr ("modest: failed to create smtp-specific account for %s\n", transport_account_name); @@ -1142,40 +1128,25 @@ get_server_accounts (TnyAccountStore *self, TnyList *list, TnyAccountType type) /* We also create a per-account local outbox folder (a _store_ account) * for each _transport_ account. */ - if (type == TNY_ACCOUNT_TYPE_TRANSPORT) { - /* Now would be a good time to create the per-account local outbox folder - * _store_ accounts corresponding to each transport account: */ - if (!priv->store_accounts_outboxes) { - create_per_account_local_outbox_folders (self); - } - } + if (!priv->store_accounts_outboxes) + create_per_account_local_outbox_folders (self); /* But we only return the per-account local outbox folder when * _store_ accounts are requested. */ if (type == TNY_ACCOUNT_TYPE_STORE) { - /* Create them if necessary, - * (which also requires creating the transport accounts, - * if necessary.) */ - if (!priv->store_accounts_outboxes) { - create_per_account_local_outbox_folders (self); - } - + /* Also add the local folder pseudo-account: */ TnyAccount *tny_account = modest_tny_account_new_for_local_folders (priv->account_mgr, - priv->session, NULL); + priv->session, NULL); /* Add them to the TnyList: */ if (priv->store_accounts_outboxes) { - GSList *iter = NULL; - for (iter = priv->store_accounts_outboxes; iter; iter = g_slist_next (iter)) { - TnyAccount *outbox_account = (TnyAccount*)iter->data; - if (list && outbox_account) - tny_list_prepend (list, G_OBJECT(outbox_account)); - - g_object_ref (outbox_account); - accounts = g_slist_append (accounts, outbox_account); - } + /* Add accounts to the lists */ + tny_list_foreach (priv->store_accounts_outboxes, + foreach_account_append_to_list, list); + tny_list_foreach (priv->store_accounts_outboxes, + foreach_account_append_to_list, accounts); } /* Add a merged folder, merging all the per-account outbox folders: */ @@ -1184,23 +1155,22 @@ get_server_accounts (TnyAccountStore *self, TnyList *list, TnyAccountType type) if (priv->store_accounts_outboxes) { /* We have finished with this temporary list, so free it: */ - account_list_free (priv->store_accounts_outboxes); + g_object_unref (priv->store_accounts_outboxes); priv->store_accounts_outboxes = NULL; } - if (list) - tny_list_prepend (list, G_OBJECT(tny_account)); - accounts = g_slist_append (accounts, tny_account); /* cache it */ + /* Append to the list and cache it */ + tny_list_append (list, G_OBJECT(tny_account)); + tny_list_append (accounts, G_OBJECT(tny_account)); } + /* Store the cache: */ if (type == TNY_ACCOUNT_TYPE_STORE) { - /* Store the cache: */ - priv->store_accounts = accounts; + priv->store_accounts = accounts; } else if (type == TNY_ACCOUNT_TYPE_TRANSPORT) { - /* Store the cache: */ - priv->transport_accounts = accounts; + priv->transport_accounts = accounts; } -} +} static void @@ -1490,81 +1460,79 @@ modest_tny_account_store_get_session (TnyAccountStore *self) -TnyAccount* -modest_tny_account_store_get_tny_account_by (ModestTnyAccountStore *self, - ModestTnyAccountStoreQueryType type, - const gchar *str) + +static TnyAccount* +get_tny_account_by (TnyList *accounts, + ModestTnyAccountStoreQueryType type, + const gchar *str) { - TnyAccount *account = NULL; - 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); + TnyIterator *iter = NULL; + gboolean found = FALSE; + TnyAccount *retval = NULL; - /* 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); + iter = tny_list_create_iterator (accounts); + while (!tny_iterator_is_done (iter) && !found) { + TnyAccount *tmp_account = NULL; + const gchar *val = NULL; - - - /* Search in store accounts */ - for (cursor = priv->store_accounts; cursor ; cursor = cursor->next) { + tmp_account = TNY_ACCOUNT (tny_iterator_get_current (iter)); switch (type) { case MODEST_TNY_ACCOUNT_STORE_QUERY_ID: - val = tny_account_get_id (TNY_ACCOUNT(cursor->data)); + val = tny_account_get_id (tmp_account); break; case MODEST_TNY_ACCOUNT_STORE_QUERY_URL: - val = tny_account_get_url_string (TNY_ACCOUNT(cursor->data)); + val = tny_account_get_url_string (tmp_account); break; } if (type == MODEST_TNY_ACCOUNT_STORE_QUERY_URL && - tny_account_matches_url_string (TNY_ACCOUNT(cursor->data), str)) { - account = TNY_ACCOUNT (cursor->data); - goto end; + tny_account_matches_url_string (tmp_account, str)) { + retval = g_object_ref (tmp_account); + found = TRUE; } else { if (strcmp (val, str) == 0) { - account = TNY_ACCOUNT(cursor->data); - goto end; + retval = g_object_ref (tmp_account); + found = TRUE; } } + g_object_unref (tmp_account); + tny_iterator_next (iter); } + g_object_unref (iter); + + return retval; +} + +TnyAccount* +modest_tny_account_store_get_tny_account_by (ModestTnyAccountStore *self, + ModestTnyAccountStoreQueryType type, + const gchar *str) +{ + TnyAccount *account = NULL; + ModestTnyAccountStorePrivate *priv; + + g_return_val_if_fail (self, NULL); + g_return_val_if_fail (str, NULL); + + priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self); + + /* ******************** WARNING ******************** */ + /* 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); */ - /* if we already found something, no need to search the transport accounts */ - for (cursor = priv->transport_accounts; !account && 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_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; - } - } + /* Search in store accounts */ + account = get_tny_account_by (priv->store_accounts, type, str); + + /* If we already found something, no need to search the transport accounts */ + if (!account) { + account = get_tny_account_by (priv->transport_accounts, type, str); } - end: - if (account) - g_object_ref (G_OBJECT(account)); - else { - /* Warn if nothing was found. This is generally unusual. */ + + /* Warn if nothing was found. This is generally unusual. */ + if (!account) { switch (type) { case MODEST_TNY_ACCOUNT_STORE_QUERY_ID: g_warning("%s: Failed to find account with ID=%s\n", __FUNCTION__, str); @@ -1574,7 +1542,8 @@ modest_tny_account_store_get_tny_account_by (ModestTnyAccountStore *self, break; } } - + + /* Returns a new reference to the account if found*/ return account; } @@ -1584,9 +1553,10 @@ modest_tny_account_store_get_server_account (ModestTnyAccountStore *self, TnyAccountType type) { ModestTnyAccountStorePrivate *priv = NULL; - TnyAccount *account = NULL; - GSList *account_list = NULL; - gboolean found = FALSE; + TnyAccount *retval = NULL; + TnyList *account_list = NULL; + TnyIterator *iter = NULL; + gboolean found; g_return_val_if_fail (self, NULL); g_return_val_if_fail (account_name, NULL); @@ -1596,11 +1566,12 @@ modest_tny_account_store_get_server_account (ModestTnyAccountStore *self, priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self); - /* Make sure that the tny accounts have been created: - * TODO: We might want to do this in several places. - */ - if (!priv->store_accounts || !priv->transport_accounts) - recreate_all_accounts (self); + /* ******************** WARNING ******************** */ +/* /\* Make sure that the tny accounts have been created: */ +/* * TODO: We might want to do this in several places. */ +/* *\/ */ +/* if (!priv->store_accounts || !priv->transport_accounts) */ +/* recreate_all_accounts (self); */ account_list = (type == TNY_ACCOUNT_TYPE_STORE) ? priv->store_accounts : @@ -1613,29 +1584,34 @@ modest_tny_account_store_get_server_account (ModestTnyAccountStore *self, } /* Look for the server account */ - while (account_list && !found) { + found = FALSE; + iter = tny_list_create_iterator (account_list); + while (!tny_iterator_is_done (iter) && !found) { const gchar *modest_acc_name; + TnyAccount *tmp_account; - account = TNY_ACCOUNT (account_list->data); + tmp_account = TNY_ACCOUNT (tny_iterator_get_current (iter)); modest_acc_name = - modest_tny_account_get_parent_modest_account_name_for_server_account (account); + modest_tny_account_get_parent_modest_account_name_for_server_account (tmp_account); - if (!strcmp (account_name, modest_acc_name)) + if (!strcmp (account_name, modest_acc_name)) { found = TRUE; - else - account_list = g_slist_next (account_list); + retval = g_object_ref (tmp_account); + } + /* Free and continue */ + g_object_unref (tmp_account); + tny_iterator_next (iter); } if (!found) { - g_printerr ("modest: %s: could not get tny %s account for %s\n. Number of server accounts of this type=%d\n", __FUNCTION__, + g_printerr ("modest: %s: could not get tny %s account for %s\n." \ + "Number of server accounts of this type=%d\n", __FUNCTION__, (type == TNY_ACCOUNT_TYPE_STORE) ? "store" : "transport", - account_name, g_slist_length (account_list)); - } else { - /* Pick a reference */ - g_object_ref (account); + account_name, tny_list_get_length (account_list)); } - return account; + /* Returns a new reference */ + return retval; } static TnyAccount* @@ -1752,24 +1728,30 @@ TnyAccount* modest_tny_account_store_get_local_folders_account (TnyAccountStore *self) { TnyAccount *account = NULL; - ModestTnyAccountStorePrivate *priv; - GSList *cursor; + ModestTnyAccountStorePrivate *priv; + TnyIterator *iter; + gboolean found; g_return_val_if_fail (self, NULL); priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self); - for (cursor = priv->store_accounts; cursor ; cursor = cursor->next) { - TnyAccount *this_account = TNY_ACCOUNT(cursor->data); - if (modest_tny_account_is_virtual_local_folders (this_account)) { - account = this_account; - break; + found = FALSE; + iter = tny_list_create_iterator (priv->store_accounts); + while (!tny_iterator_is_done (iter) && !found) { + TnyAccount *tmp_account; + + tmp_account = TNY_ACCOUNT (tny_iterator_get_current (iter)); + if (modest_tny_account_is_virtual_local_folders (tmp_account)) { + account = g_object_ref (tmp_account); + found = TRUE; } + g_object_unref (tmp_account); + tny_iterator_next (iter); } + g_object_unref (iter); - if (account) - g_object_ref (G_OBJECT(account)); - + /* Returns a new reference to the account */ return account; } diff --git a/src/modest-tny-local-folders-account.c b/src/modest-tny-local-folders-account.c index 2efb499..5fb942d 100644 --- a/src/modest-tny-local-folders-account.c +++ b/src/modest-tny-local-folders-account.c @@ -132,7 +132,7 @@ modest_tny_local_folders_account_new (void) void modest_tny_local_folders_account_add_extra_folder (ModestTnyLocalFoldersAccount *store, - TnyFolder *folder) + TnyFolder *folder) { ModestTnyLocalFoldersAccountPrivate *priv = TNY_LOCAL_FOLDERS_ACCOUNT_GET_PRIVATE (store); @@ -260,41 +260,43 @@ add_account_folders_to_merged_folder (TnyAccount *account, TnyMergeFolder* merge g_object_unref (list_outbox_folders); } -void modest_tny_local_folders_account_add_merged_outbox_folders (ModestTnyLocalFoldersAccount *self, - GSList *accounts) +void +modest_tny_local_folders_account_add_merged_outbox_folders (ModestTnyLocalFoldersAccount *self, + TnyList *accounts) { + TnyMergeFolder *merged_outbox = NULL; + TnyIterator *iter = NULL; + modest_tny_local_folders_account_remove_all_extra_folders (self); /* All per-account outbox folders are merged into one folders * so that they appear as one outbox to the user: */ - TnyMergeFolder *merged_outbox = TNY_MERGE_FOLDER (tny_merge_folder_new(_("mcen_me_folder_outbox"))); + merged_outbox = TNY_MERGE_FOLDER (tny_merge_folder_new(_("mcen_me_folder_outbox"))); - /* Set type to outbox (NB#61580) */ + /* Set type to outbox */ tny_merge_folder_set_folder_type (merged_outbox, TNY_FOLDER_TYPE_OUTBOX); - GSList *iter = accounts; - while (iter) - { - TnyAccount *account = TNY_ACCOUNT (iter->data); - if (account) { - /* Add both outbox account and local-folders account folders - * to our one combined account: - */ - if (MODEST_IS_TNY_OUTBOX_ACCOUNT (account)) { - /* Add the folder to the merged folder. - * We will add it later to the virtual local-folders store: */ - add_account_folders_to_merged_folder (account, merged_outbox); - } + iter = tny_list_create_iterator (accounts); + while (!tny_iterator_is_done (iter)){ + + TnyAccount *account = TNY_ACCOUNT (tny_iterator_get_current (iter)); + + /* Add both outbox account and local-folders account folders + * to our one combined account: + */ + if (MODEST_IS_TNY_OUTBOX_ACCOUNT (account)) { + /* Add the folder to the merged folder. + * We will add it later to the virtual local-folders store: */ + add_account_folders_to_merged_folder (account, merged_outbox); } - - iter = g_slist_next (iter); + g_object_unref (account); + tny_iterator_next (iter); } + g_object_unref (iter); /* Add the merged outbox folder to the virtual local-folders store: */ - /* printf ("Debug: %s: adding merged outbox.\n", __FUNCTION__); */ modest_tny_local_folders_account_add_extra_folder (self, TNY_FOLDER(merged_outbox)); g_object_unref (merged_outbox); - merged_outbox = NULL; } gboolean diff --git a/src/modest-tny-local-folders-account.h b/src/modest-tny-local-folders-account.h index 49b90de..388e862 100644 --- a/src/modest-tny-local-folders-account.h +++ b/src/modest-tny-local-folders-account.h @@ -76,7 +76,7 @@ void modest_tny_local_folders_account_add_extra_folder (ModestTny TnyFolder *folder); void modest_tny_local_folders_account_add_merged_outbox_folders (ModestTnyLocalFoldersAccount *store, - GSList *accounts); + TnyList *accounts); gboolean modest_tny_local_folders_account_extra_folder_exists (ModestTnyLocalFoldersAccount *self, const gchar *name); diff --git a/src/widgets/modest-folder-view.c b/src/widgets/modest-folder-view.c index 25979ac..28d8808 100644 --- a/src/widgets/modest-folder-view.c +++ b/src/widgets/modest-folder-view.c @@ -77,8 +77,9 @@ static void on_account_removed (TnyAccountStore *self, TnyAccount *account, gpointer user_data); -/* static void on_accounts_reloaded (TnyAccountStore *store, */ -/* gpointer user_data); */ +static void on_account_inserted (TnyAccountStore *self, + TnyAccount *account, + gpointer user_data); static gint cmp_rows (GtkTreeModel *tree_model, GtkTreeIter *iter1, @@ -151,7 +152,7 @@ struct _ModestFolderViewPrivate { gulong account_update_signal; gulong changed_signal; -/* gulong accounts_reloaded_signal; */ + gulong account_inserted_signal; gulong account_removed_signal; gulong conf_key_signal; @@ -696,8 +697,8 @@ modest_folder_view_finalize (GObject *obj) if (priv->account_store) { g_signal_handler_disconnect (G_OBJECT(priv->account_store), priv->account_update_signal); -/* g_signal_handler_disconnect (G_OBJECT(priv->account_store), */ -/* priv->accounts_reloaded_signal); */ + g_signal_handler_disconnect (G_OBJECT(priv->account_store), + priv->account_inserted_signal); g_signal_handler_disconnect (G_OBJECT(priv->account_store), priv->account_removed_signal); g_object_unref (G_OBJECT(priv->account_store)); @@ -761,10 +762,10 @@ modest_folder_view_set_account_store (TnyAccountStoreView *self, TnyAccountStore priv->account_update_signal)) g_signal_handler_disconnect (G_OBJECT (priv->account_store), priv->account_update_signal); -/* if (g_signal_handler_is_connected (G_OBJECT (priv->account_store), */ -/* priv->accounts_reloaded_signal)) */ -/* g_signal_handler_disconnect (G_OBJECT (priv->account_store), */ -/* priv->accounts_reloaded_signal); */ + if (g_signal_handler_is_connected (G_OBJECT (priv->account_store), + priv->account_inserted_signal)) + g_signal_handler_disconnect (G_OBJECT (priv->account_store), + priv->account_inserted_signal); if (g_signal_handler_is_connected (G_OBJECT (priv->account_store), priv->account_removed_signal)) g_signal_handler_disconnect (G_OBJECT (priv->account_store), @@ -783,28 +784,58 @@ modest_folder_view_set_account_store (TnyAccountStoreView *self, TnyAccountStore g_signal_connect (G_OBJECT(account_store), "account_removed", G_CALLBACK (on_account_removed), self); -/* priv->accounts_reloaded_signal = */ -/* g_signal_connect (G_OBJECT(account_store), "accounts_reloaded", */ -/* G_CALLBACK (on_accounts_reloaded), self); */ + priv->account_inserted_signal = + g_signal_connect (G_OBJECT(account_store), "account_inserted", + G_CALLBACK (on_account_inserted), self); + /* g_signal_connect (G_OBJECT(account_store), "connecting_finished", */ /* G_CALLBACK (on_accounts_reloaded), self); */ /* on_accounts_reloaded (account_store, (gpointer ) self); */ + + modest_folder_view_update_model (MODEST_FOLDER_VIEW (self), account_store); g_object_unref (G_OBJECT (device)); } static void +on_account_inserted (TnyAccountStore *account_store, + TnyAccount *account, + gpointer user_data) +{ + GtkTreeModel *sort_model, *filter_model; + + /* TODO: invalidate the cur_folder_* and folder_to_select things */ + + /* Get the inner model */ + filter_model = gtk_tree_view_get_model (GTK_TREE_VIEW (user_data)); + sort_model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (filter_model)); + + /* Insert the account in the model */ + tny_list_append (TNY_LIST (gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (sort_model))), + G_OBJECT (account)); +} + +static void on_account_removed (TnyAccountStore *account_store, TnyAccount *account, gpointer user_data) { ModestFolderView *self = MODEST_FOLDER_VIEW (user_data); ModestFolderViewPrivate *priv; + GtkTreeModel *sort_model, *filter_model; priv = MODEST_FOLDER_VIEW_GET_PRIVATE (self); + /* TODO: invalidate the cur_folder_* and folder_to_select things */ + + /* Remove the account from the model */ + filter_model = gtk_tree_view_get_model (GTK_TREE_VIEW (self)); + sort_model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (filter_model)); + tny_list_remove (TNY_LIST (gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (sort_model))), + G_OBJECT (account)); + /* If the removed account is the currently viewed one then clear the configuration value. The new visible account will be the default account */ if (priv->visible_account_id &&