Fixed several TnyIterator leaks
[modest] / src / modest-tny-account-store.c
index 54f7e17..ac77bfc 100644 (file)
 #include <string.h>
 #include <glib/gi18n.h>
 
+#include <tny-error.h>
 #include <tny-account.h>
 #include <tny-account-store.h>
 #include <tny-store-account.h>
-#include <tny-error.h>
 #include <tny-transport-account.h>
 #include <tny-simple-list.h>
 #include <tny-account-store.h>
@@ -1063,7 +1063,7 @@ modest_tny_account_store_alert (TnyAccountStore *self,
                                TnyAccount *account, 
                                TnyAlertType type,
                                gboolean question, 
-                               const GError *error)
+                               GError *error)
 {
        ModestTransportStoreProtocol proto =
                MODEST_PROTOCOL_TRANSPORT_STORE_UNKNOWN; 
@@ -1075,9 +1075,6 @@ modest_tny_account_store_alert (TnyAccountStore *self,
        g_return_val_if_fail (account, FALSE);
        g_return_val_if_fail (error, FALSE);
        
-       if ((error->domain != TNY_ACCOUNT_ERROR) && (error->domain != TNY_ACCOUNT_STORE_ERROR))
-               return FALSE;
-       
        /* Get the server name: */
        server_name = tny_account_get_hostname (account);
 
@@ -1093,14 +1090,18 @@ modest_tny_account_store_alert (TnyAccountStore *self,
        }
 
        switch (error->code) {
-       case TNY_ACCOUNT_STORE_ERROR_CANCEL_ALERT:
-       case TNY_ACCOUNT_ERROR_TRY_CONNECT_USER_CANCEL:
+       case TNY_SYSTEM_ERROR_CANCEL:
                /* Don't show waste the user's time by showing him a dialog telling 
                 * him that he has just cancelled something: */
                return TRUE;
 
-       case TNY_ACCOUNT_ERROR_TRY_CONNECT_HOST_LOOKUP_FAILED:
-       case TNY_ACCOUNT_ERROR_TRY_CONNECT_SERVICE_UNAVAILABLE:
+       case TNY_SERVICE_ERROR_PROTOCOL:
+               /* Like a BAD from IMAP (protocol error) */
+       case TNY_SERVICE_ERROR_LOST_CONNECTION:
+               /* Lost the connection with the service */
+       case TNY_SERVICE_ERROR_UNAVAILABLE:
+               /* You must be working online for this operation */
+       case TNY_SERVICE_ERROR_CONNECT:
                /* TODO: Show the appropriate message, depending on whether it's POP or IMAP: */                
                switch (proto) {
                case MODEST_PROTOCOL_STORE_POP:
@@ -1120,32 +1121,27 @@ modest_tny_account_store_alert (TnyAccountStore *self,
                }
                break;
                
-       case TNY_ACCOUNT_ERROR_TRY_CONNECT_AUTHENTICATION_NOT_SUPPORTED:
+       case TNY_SERVICE_ERROR_AUTHENTICATE:
                /* This is "Secure connection failed", even though the logical
                 * ID has _certificate_ in the name: */
                prompt = g_strdup (_("mail_ni_ssl_certificate_error")); 
                break;
                        
-       case TNY_ACCOUNT_ERROR_TRY_CONNECT_CERTIFICATE:
+       case TNY_SERVICE_ERROR_CERTIFICATE:
                /* We'll show the proper dialog later */
                break;
-               
-       case TNY_ACCOUNT_ERROR_TRY_CONNECT:
-               /* The tinymail camel implementation just sends us this for almost 
-                * everything, so we have to guess at the cause.
-                * It could be a wrong password, or inability to resolve a hostname, 
-                * or lack of network, or incorrect authentication method, or something entirely different: */
-               /* TODO: Fix camel to provide specific error codes, and then use the 
-                * specific dialog messages from Chapter 12 of the UI spec.
-                */
-       case TNY_ACCOUNT_STORE_ERROR_UNKNOWN_ALERT: 
+
+       case TNY_SYSTEM_ERROR_MEMORY:
+               /* Can't allocate memory for this operation */
+
+       case TNY_SERVICE_ERROR_UNKNOWN: 
                return FALSE;                   
        default:
                g_return_val_if_reached (FALSE);
        }
        
 
-       if (error->code == TNY_ACCOUNT_ERROR_TRY_CONNECT_CERTIFICATE)
+       if (error->code == TNY_SERVICE_ERROR_CERTIFICATE)
                retval = modest_platform_run_certificate_confirmation_dialog (server_name,
                                                                              error->message);
        else
@@ -1167,15 +1163,15 @@ modest_tny_account_store_init (gpointer g, gpointer iface_data)
 
        klass = (TnyAccountStoreIface *)g;
 
-       klass->get_accounts_func =
+       klass->get_accounts =
                modest_tny_account_store_get_accounts;
-       klass->get_cache_dir_func =
+       klass->get_cache_dir =
                modest_tny_account_store_get_cache_dir;
-       klass->get_device_func =
+       klass->get_device =
                modest_tny_account_store_get_device;
-       klass->alert_func =
+       klass->alert =
                modest_tny_account_store_alert;
-       klass->find_account_func =
+       klass->find_account =
                modest_tny_account_store_find_account_by_url;
 }
 
@@ -1203,14 +1199,25 @@ get_tny_account_by (TnyList *accounts,
        gboolean found = FALSE;
        TnyAccount *retval = NULL;
 
-       g_return_val_if_fail (accounts && TNY_IS_LIST(accounts), NULL);
+       g_return_val_if_fail (TNY_IS_LIST(accounts), NULL);
 
+       if (tny_list_get_length(accounts) == 0) {
+               g_warning ("%s: account list is empty", __FUNCTION__);
+               return NULL;
+       }
+       
        iter = tny_list_create_iterator (accounts);
        while (!tny_iterator_is_done (iter) && !found) {
                TnyAccount *tmp_account = NULL;
                const gchar *val = NULL;
 
                tmp_account = TNY_ACCOUNT (tny_iterator_get_current (iter));
+               if (!TNY_IS_ACCOUNT(tmp_account)) {
+                       g_warning ("%s: not a valid account", __FUNCTION__);
+                       tmp_account = NULL;
+                       break;
+               }
+
                switch (type) {
                case MODEST_TNY_ACCOUNT_STORE_QUERY_ID:
                        val = tny_account_get_id (tmp_account);
@@ -1225,7 +1232,7 @@ get_tny_account_by (TnyList *accounts,
                        retval = g_object_ref (tmp_account);
                        found = TRUE;
                } else {
-                       if (strcmp (val, str) == 0) {
+                       if (val && str && strcmp (val, str) == 0) {
                                retval = g_object_ref (tmp_account);
                                found = TRUE;
                        }
@@ -1325,6 +1332,7 @@ modest_tny_account_store_get_server_account (ModestTnyAccountStore *self,
                g_object_unref (tmp_account);
                tny_iterator_next (iter);
        }
+       g_object_unref (iter);
 
        if (!found) {
                g_printerr ("modest: %s: could not get tny %s account for %s\n." \
@@ -1365,9 +1373,9 @@ modest_tny_account_store_get_smtp_specific_transport_account_for_open_connection
        if (!connection)
                return NULL;
                
-       const gchar *connection_name = con_ic_iap_get_name (connection);
-       /* printf ("DEBUG: %s: connection_name=%s\n", __FUNCTION__, connection_name); */
-       if (!connection_name)
+       const gchar *connection_id = con_ic_iap_get_id (connection);
+       /* printf ("DEBUG: %s: connection_id=%s\n", __FUNCTION__, connection_id); */
+       if (!connection_id)
                return NULL;
        
        /*  Get the connection-specific transport acccount, if any: */
@@ -1379,7 +1387,7 @@ modest_tny_account_store_get_smtp_specific_transport_account_for_open_connection
        }
 
        gchar* server_account_name = modest_account_mgr_get_connection_specific_smtp (account_manager, 
-               connection_name);
+               connection_id);
 
        /* printf ("DEBUG: %s: server_account_name=%s\n", __FUNCTION__, server_account_name); */
        if (!server_account_name) {
@@ -1844,6 +1852,7 @@ modest_tny_account_store_find_msg_in_outboxes (ModestTnyAccountStore *self,
                        g_object_unref (folder);
                        tny_iterator_next (folders_iter);
                }
+               g_object_unref (folders_iter);
 
                g_object_unref (folders);
                g_object_unref (account);