* src/modest-tny-account-store.[ch]:
[modest] / src / modest-tny-account-store.c
index 2bdb4eb..5d8307e 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>
@@ -491,16 +491,13 @@ on_account_changed (ModestAccountMgr *acc_mgr,
 static void 
 on_account_settings_hide (GtkWidget *widget, gpointer user_data)
 {
-       TnyAccount *account = (TnyAccount*)user_data;
-       
        /* This is easier than using a struct for the user_data: */
        ModestTnyAccountStore *self = modest_runtime_get_account_store();
        ModestTnyAccountStorePrivate *priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self);
        
-       const gchar *modest_account_name = 
-                       modest_tny_account_get_parent_modest_account_name_for_server_account (account);
-       if (modest_account_name)
-               g_hash_table_remove (priv->account_settings_dialog_hash, modest_account_name);
+       gchar *account_name = (gchar *) user_data;
+       if (account_name)
+               g_hash_table_remove (priv->account_settings_dialog_hash, account_name);
 }
 #endif
 
@@ -524,12 +521,12 @@ show_wrong_password_dialog (TnyAccount *account)
 { 
        /* This is easier than using a struct for the user_data: */
        ModestTnyAccountStore *self = modest_runtime_get_account_store();
-       ModestTnyAccountStorePrivate *priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self);
-       ModestWindow *main_window;
        const gchar *modest_account_name;
+       GtkWidget *main_window;
+       GtkWidget *dialog;
 
-       main_window = modest_window_mgr_get_main_window (modest_runtime_get_window_mgr (),
-                                                        FALSE); /* don't create */
+       main_window = (GtkWidget *) modest_window_mgr_get_main_window (modest_runtime_get_window_mgr (),
+                                                                      FALSE); /* don't create */
        if (!main_window) {
                g_warning ("%s: password was wrong; ignoring because no main window", __FUNCTION__);
                return;
@@ -541,53 +538,9 @@ show_wrong_password_dialog (TnyAccount *account)
                        __FUNCTION__);
        }
        
-       /* Check whether this window is already open,
-        * for instance because of a previous get_password() call: 
-        */
-       gpointer dialog_as_gpointer = NULL;
-       gboolean found = FALSE;
-       if (priv->account_settings_dialog_hash) {
-               found = g_hash_table_lookup_extended (priv->account_settings_dialog_hash,
-                       modest_account_name, NULL, (gpointer*)&dialog_as_gpointer);
-       }
-       ModestAccountSettingsDialog *dialog = dialog_as_gpointer;
-                                       
-       gboolean created_dialog = FALSE;
-       if (!found || !dialog) {
-               ModestAccountSettings *settings;
-               dialog = modest_account_settings_dialog_new ();
-               settings = modest_account_mgr_load_account_settings (priv->account_mgr, modest_account_name);
-               modest_account_settings_dialog_set_account (dialog, settings);
-               g_object_unref (settings);
-               modest_account_settings_dialog_switch_to_user_info (dialog);
-               modest_window_mgr_set_modal (modest_runtime_get_window_mgr (), GTK_WINDOW (dialog));
-               
-               g_hash_table_insert (priv->account_settings_dialog_hash, g_strdup (modest_account_name), dialog);
-               
-               created_dialog = TRUE;
-       }
-       
+       dialog = modest_tny_account_store_show_account_settings_dialog (self, modest_account_name);
        /* Show an explanatory temporary banner: */
        modest_platform_information_banner (GTK_WIDGET(dialog), NULL, _("mcen_ib_username_pw_incorrect"));
-               
-       if (created_dialog) {
-               /* Forget it when it closes: */
-               g_signal_connect_object (G_OBJECT (dialog), "hide", G_CALLBACK (on_account_settings_hide), 
-                       account, 0);
-                       
-               /* Show it and delete it when it closes: */
-               gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (main_window));
-               g_signal_connect_swapped (dialog, 
-                                         "response", 
-                                         G_CALLBACK (gtk_widget_destroy), 
-                                         dialog);
-               gtk_widget_show (GTK_WIDGET (dialog));
-       }
-       else {
-               /* Just show it instead of showing it and deleting it when it closes,
-                * though it is probably open already: */
-               gtk_window_present (GTK_WINDOW (dialog));
-       }
 }
 #endif
 
@@ -853,6 +806,8 @@ modest_tny_account_store_finalize (GObject *obj)
                camel_object_unref (CAMEL_OBJECT(priv->session));
                priv->session = NULL;
        }
+
+       camel_shutdown ();
        
        G_OBJECT_CLASS(parent_class)->finalize (obj);
 }
@@ -1063,7 +1018,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; 
@@ -1163,15 +1118,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;
 }
 
@@ -1199,14 +1154,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);
@@ -1221,7 +1187,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;
                        }
@@ -1321,6 +1287,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." \
@@ -1334,8 +1301,8 @@ modest_tny_account_store_get_server_account (ModestTnyAccountStore *self,
 }
 
 TnyAccount*
-modest_tny_account_store_get_smtp_specific_transport_account_for_open_connection (ModestTnyAccountStore *self,
-                                                                                 const gchar *account_name)
+modest_tny_account_store_get_smtp_specific_transport_account_for_open_connection (
+       ModestTnyAccountStore *self, const gchar *account_name)
 {
        TnyDevice *device;
 
@@ -1344,7 +1311,12 @@ modest_tny_account_store_get_smtp_specific_transport_account_for_open_connection
 
        /* Get the current connection: */
        device = modest_runtime_get_device ();
-       
+
+       if (!device) {
+               g_warning ("%s: could not get device", __FUNCTION__);
+               return NULL;
+       }
+               
        if (!tny_device_is_online (device))
                return NULL;
        
@@ -1467,6 +1439,7 @@ modest_tny_account_store_get_mmc_folders_account (ModestTnyAccountStore *self)
 {
        g_return_val_if_fail (MODEST_IS_TNY_ACCOUNT_STORE (self), NULL);
        
+       /* New reference */
        return modest_tny_account_store_get_tny_account_by (self, MODEST_TNY_ACCOUNT_STORE_QUERY_ID,
                                                            MODEST_MMC_ACCOUNT_ID);
 
@@ -1840,6 +1813,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);
@@ -1880,7 +1854,49 @@ modest_tny_account_store_get_transport_account_from_outbox_header(ModestTnyAccou
                g_object_unref (account);
                tny_iterator_next (acc_iter);
        }
-
        g_object_unref(acc_iter);
+
+       /* New reference */
        return header_acc;
 }
+
+GtkWidget *
+modest_tny_account_store_show_account_settings_dialog (ModestTnyAccountStore *self,
+                                                     const gchar *account_name)
+{
+       ModestTnyAccountStorePrivate *priv;
+       gpointer dialog_as_gpointer = NULL;
+       gboolean found;
+
+       priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self);
+       found = g_hash_table_lookup_extended (priv->account_settings_dialog_hash,
+                                             account_name, NULL, (gpointer*)&dialog_as_gpointer);
+
+       if (found)
+               return (GtkWidget *) dialog_as_gpointer;
+       else {
+               ModestAccountSettings *settings;
+               GtkWidget *dialog;
+               dialog = (GtkWidget *) modest_account_settings_dialog_new ();
+               settings = modest_account_mgr_load_account_settings (priv->account_mgr, account_name);
+               modest_account_settings_dialog_set_account (MODEST_ACCOUNT_SETTINGS_DIALOG (dialog), settings);
+               g_object_unref (settings);
+               modest_account_settings_dialog_switch_to_user_info (MODEST_ACCOUNT_SETTINGS_DIALOG (dialog));
+               modest_window_mgr_set_modal (modest_runtime_get_window_mgr (), GTK_WINDOW (dialog));
+               
+               g_hash_table_insert (priv->account_settings_dialog_hash, g_strdup (account_name), dialog);
+               
+               g_signal_connect (G_OBJECT (dialog), "hide", G_CALLBACK (on_account_settings_hide), 
+                                 g_strdup (account_name));
+                       
+               /* Show it and delete it when it closes: */
+               g_signal_connect_swapped (dialog, 
+                                         "response", 
+                                         G_CALLBACK (gtk_widget_destroy), 
+                                         dialog);
+               gtk_widget_show (GTK_WIDGET (dialog));
+
+               return dialog;
+       }
+       
+}