* Some more changes related to the migration to the new tinymail "architecture"
authorSergio Villar Senin <svillar@igalia.com>
Fri, 27 Jul 2007 16:54:39 +0000 (16:54 +0000)
committerSergio Villar Senin <svillar@igalia.com>
Fri, 27 Jul 2007 16:54:39 +0000 (16:54 +0000)
* Still experimental and incomplete

pmo-sessionwork-r2835

src/modest-account-mgr.c
src/modest-account-mgr.h
src/modest-tny-account-store.c
src/modest-tny-local-folders-account.c
src/modest-tny-local-folders-account.h
src/widgets/modest-folder-view.c

index 46ed9d4..3da0df3 100644 (file)
 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);
 }
 
 
index 9fc6e16..f93a712 100644 (file)
@@ -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);   
 };
 
 /**
index 6f35370..a801b28 100644 (file)
@@ -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;
 }
 
index 2efb499..5fb942d 100644 (file)
@@ -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
index 49b90de..388e862 100644 (file)
@@ -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);
index 25979ac..28d8808 100644 (file)
@@ -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 &&