From 88bd0aad7510a75c701fcb4ea33abd8d74ddadbe Mon Sep 17 00:00:00 2001 From: Sergio Villar Senin Date: Wed, 24 Jan 2007 11:26:02 +0000 Subject: [PATCH] * Removed the password_selected signal * Added a g_main_depth check before setting a critical section with g_threads_* * Removed an unused marshaller (because the password_selected signal removal) * Added the options located in the configuration to the TnyAccount * Removed the view_is_empty field from the ModestFolderView * Moved the get_pass, forget_pass functions to the account store pmo-trunk-r728 --- src/modest-account-mgr-helpers.c | 14 ++++ src/modest-account-mgr-helpers.h | 1 + src/modest-account-mgr.c | 1 - src/modest-account-mgr.h | 1 - src/modest-marshal.list | 2 +- src/modest-tny-account-store.c | 134 ++++++++++++++++++++++++++++---------- src/modest-tny-account-store.h | 5 -- src/modest-ui.c | 85 +++--------------------- src/widgets/modest-folder-view.c | 33 +++------- src/widgets/modest-header-view.c | 1 + 10 files changed, 135 insertions(+), 142 deletions(-) diff --git a/src/modest-account-mgr-helpers.c b/src/modest-account-mgr-helpers.c index ffe4445..45bb567 100644 --- a/src/modest-account-mgr-helpers.c +++ b/src/modest-account-mgr-helpers.c @@ -76,6 +76,11 @@ modest_account_mgr_get_server_account_data (ModestAccountMgr *self, const gchar* data->password = modest_account_mgr_get_string (self, name, MODEST_ACCOUNT_PASSWORD, TRUE, NULL); + + data->options = modest_account_mgr_get_list (self, name, + MODEST_ACCOUNT_OPTIONS, + MODEST_CONF_VALUE_STRING, + TRUE, NULL); return data; } @@ -101,6 +106,15 @@ modest_account_mgr_free_server_account_data (ModestAccountMgr *self, g_free (data->password); data->password = NULL; + if (data->options) { + GSList *tmp = data->options; + while (tmp) { + g_free (tmp->data); + tmp = g_slist_next (tmp); + } + g_slist_free (data->options); + } + g_free (data); } diff --git a/src/modest-account-mgr-helpers.h b/src/modest-account-mgr-helpers.h index 8d63aba..9457de9 100644 --- a/src/modest-account-mgr-helpers.h +++ b/src/modest-account-mgr-helpers.h @@ -41,6 +41,7 @@ typedef struct { gchar *username; ModestProtocol proto; gchar *password; + GSList *options; } ModestServerAccountData; typedef struct { diff --git a/src/modest-account-mgr.c b/src/modest-account-mgr.c index 196a9fa..fc0994e 100644 --- a/src/modest-account-mgr.c +++ b/src/modest-account-mgr.c @@ -447,7 +447,6 @@ modest_account_mgr_account_names (ModestAccountMgr * self, GError ** err) } - gchar * modest_account_mgr_get_string (ModestAccountMgr *self, const gchar *name, const gchar *key, gboolean server_account, GError **err) { diff --git a/src/modest-account-mgr.h b/src/modest-account-mgr.h index 4171581..48e56bf 100644 --- a/src/modest-account-mgr.h +++ b/src/modest-account-mgr.h @@ -64,7 +64,6 @@ struct _ModestAccountMgrClass { gpointer user_data); }; - /** * modest_account_mgr_get_type: * diff --git a/src/modest-marshal.list b/src/modest-marshal.list index 187d0bb..65b694c 100644 --- a/src/modest-marshal.list +++ b/src/modest-marshal.list @@ -5,4 +5,4 @@ VOID:STRING,INT VOID:STRING,INT,INT VOID:STRING,BOOL VOID:STRING,STRING,BOOL -VOID:STRING,POINTER,POINTER,POINTER + diff --git a/src/modest-tny-account-store.c b/src/modest-tny-account-store.c index 964269d..e4ba8ee 100644 --- a/src/modest-tny-account-store.c +++ b/src/modest-tny-account-store.c @@ -63,7 +63,6 @@ static void modest_tny_account_store_init (gpointer g, gp /* list my signals */ enum { - PASSWORD_REQUESTED_SIGNAL, ACCOUNT_UPDATE_SIGNAL, LAST_SIGNAL }; @@ -82,6 +81,13 @@ struct _ModestTnyAccountStorePrivate { #define MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ MODEST_TYPE_TNY_ACCOUNT_STORE, \ ModestTnyAccountStorePrivate)) + +static void on_password_requested (ModestTnyAccountStore *account_store, + const gchar* account_name, + gchar **password, + gboolean *cancel, + gboolean *remember); + /* globals */ static GObjectClass *parent_class = NULL; @@ -133,15 +139,6 @@ modest_tny_account_store_class_init (ModestTnyAccountStoreClass *klass) g_type_class_add_private (gobject_class, sizeof(ModestTnyAccountStorePrivate)); - signals[PASSWORD_REQUESTED_SIGNAL] = - g_signal_new ("password_requested", - G_TYPE_FROM_CLASS (gobject_class), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET(ModestTnyAccountStoreClass, password_requested), - NULL, NULL, - modest_marshal_VOID__STRING_POINTER_POINTER_POINTER, - G_TYPE_NONE, 4, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER); - signals[ACCOUNT_UPDATE_SIGNAL] = g_signal_new ("account_update", G_TYPE_FROM_CLASS (gobject_class), @@ -207,6 +204,62 @@ set_account_store_for_account (TnyAccount *account, ModestTnyAccountStore *store g_object_set_data (G_OBJECT(account), "account_store", (gpointer)store); } +static void +on_password_requested (ModestTnyAccountStore *account_store, + const gchar* account_name, + gchar **password, + gboolean *cancel, + gboolean *remember) +{ + gchar *txt; + GtkWidget *dialog, *entry, *remember_pass_check; + + dialog = gtk_dialog_new_with_buttons (_("Password requested"), + NULL, + GTK_DIALOG_MODAL, + GTK_STOCK_CANCEL, + GTK_RESPONSE_REJECT, + GTK_STOCK_OK, + GTK_RESPONSE_ACCEPT, + NULL); + + txt = g_strdup_printf (_("Please enter your password for %s"), account_name); + gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(txt), + FALSE, FALSE, 0); + g_free (txt); + + entry = gtk_entry_new_with_max_length (40); + gtk_entry_set_visibility (GTK_ENTRY(entry), FALSE); + gtk_entry_set_invisible_char (GTK_ENTRY(entry), 0x2022); /* bullet unichar */ + + gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry, + TRUE, FALSE, 0); + + remember_pass_check = gtk_check_button_new_with_label (_("Remember password")); + gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), remember_pass_check, + TRUE, FALSE, 0); + + gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox)); + + if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { + *password = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry))); + *cancel = FALSE; + } else { + *password = NULL; + *cancel = TRUE; + } + + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (remember_pass_check))) + *remember = TRUE; + else + *remember = FALSE; + + gtk_widget_destroy (dialog); + + while (gtk_events_pending ()) + gtk_main_iteration (); +} + static gchar* get_password (TnyAccount *account, const gchar *prompt, gboolean *cancel) { @@ -248,13 +301,12 @@ get_password (TnyAccount *account, const gchar *prompt, gboolean *cancel) /* if it was already asked, it must have been wrong, so ask again */ if (already_asked || !pwd || strlen(pwd) == 0) { - /* we don't have it yet. we emit a signal to get the password somewhere */ + /* we don't have it yet. Get the password from the user */ const gchar* name = tny_account_get_name (account); gboolean remember; pwd = NULL; - g_signal_emit (G_OBJECT(self), signals[PASSWORD_REQUESTED_SIGNAL], 0, - name, &pwd, cancel, &remember); + on_password_requested (self, name, &pwd, cancel, &remember); if (!*cancel) { if (remember) @@ -370,17 +422,29 @@ get_tny_account_from_server_account (ModestTnyAccountStore *self, return NULL; } + /* Set account store, session and id */ set_account_store_for_account (TNY_ACCOUNT(tny_account), self); tny_camel_account_set_session (TNY_CAMEL_ACCOUNT(tny_account), /* session */ - priv->tny_session_camel); - tny_account_set_id (tny_account, account_data->account_name); /* id */ + priv->tny_session_camel); + tny_account_set_id (tny_account, account_data->account_name); /* id */ + + /* Options */ + if (account_data->options) { + GSList *tmp = account_data->options; + while (tmp) { + tny_camel_account_add_option (TNY_CAMEL_ACCOUNT (tny_account), + tmp->data); + tmp = g_slist_next (tmp); + } + } + /* Hostname & Username */ + if (account_data->username) + tny_account_set_user (tny_account, account_data->username); if (account_data->hostname) tny_account_set_hostname (tny_account, account_data->hostname); - if (account_data->username) - tny_account_set_user (tny_account, account_data->username); - + /* Password functions */ tny_account_set_pass_func (tny_account, get_password); tny_account_set_forget_pass_func (tny_account, forget_password); @@ -429,11 +493,6 @@ modest_tny_account_store_new (ModestAccountMgr *account_mgr) { obj = G_OBJECT(g_object_new(MODEST_TYPE_TNY_ACCOUNT_STORE, NULL)); priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(obj); - g_signal_connect (G_OBJECT(account_mgr), "account_changed", - G_CALLBACK (on_account_changed), obj); - g_signal_connect (G_OBJECT(account_mgr), "account_removed", - G_CALLBACK (on_account_removed), obj); - pfact = TNY_PLATFORM_FACTORY (modest_tny_platform_factory_get_instance()); if (!pfact) { g_printerr ("modest: cannot get platform factory instance\n"); @@ -441,16 +500,23 @@ modest_tny_account_store_new (ModestAccountMgr *account_mgr) { return NULL; } else priv->platform_fact = pfact; - + + /* The session needs the platform factory */ priv->tny_session_camel = tny_session_camel_new (TNY_ACCOUNT_STORE(obj)); if (!priv->tny_session_camel) { g_printerr ("modest: cannot create TnySessionCamel instance\n"); g_object_unref (obj); return NULL; } - tny_session_camel_set_ui_locker (priv->tny_session_camel, tny_gtk_lockable_new ()); + + /* Connect signals */ + g_signal_connect (G_OBJECT(account_mgr), "account_changed", + G_CALLBACK (on_account_changed), obj); + g_signal_connect (G_OBJECT(account_mgr), "account_removed", + G_CALLBACK (on_account_removed), obj); + return MODEST_TNY_ACCOUNT_STORE(obj); } @@ -544,7 +610,7 @@ get_tny_account_from_account (ModestTnyAccountStore *self, ModestAccountData *ac static void -modest_tny_account_store_get_accounts (TnyAccountStore *iface, TnyList *list, +modest_tny_account_store_get_accounts (TnyAccountStore *account_store, TnyList *list, TnyGetAccountsRequestType type) { ModestTnyAccountStore *self; @@ -553,22 +619,22 @@ modest_tny_account_store_get_accounts (TnyAccountStore *iface, TnyList *list, ModestAccountMgr *account_mgr; TnyAccount *local_folder_account; - g_return_if_fail (iface); + g_return_if_fail (account_store); g_return_if_fail (TNY_IS_LIST(list)); - self = MODEST_TNY_ACCOUNT_STORE(iface); + self = MODEST_TNY_ACCOUNT_STORE(account_store); priv = MODEST_TNY_ACCOUNT_STORE_GET_PRIVATE(self); account_mgr = modest_tny_platform_factory_get_account_mgr_instance (MODEST_TNY_PLATFORM_FACTORY(priv->platform_fact)); if (type == TNY_ACCOUNT_STORE_BOTH) { - modest_tny_account_store_get_accounts (iface, list, TNY_ACCOUNT_STORE_STORE_ACCOUNTS); - modest_tny_account_store_get_accounts (iface, list, TNY_ACCOUNT_STORE_TRANSPORT_ACCOUNTS); + modest_tny_account_store_get_accounts (account_store, list, TNY_ACCOUNT_STORE_STORE_ACCOUNTS); + modest_tny_account_store_get_accounts (account_store, list, TNY_ACCOUNT_STORE_TRANSPORT_ACCOUNTS); } - + accounts = modest_account_mgr_account_names (account_mgr, NULL); for (cursor = accounts; cursor; cursor = cursor->next) { - TnyAccount *tny_account; + TnyAccount *tny_account = NULL; ModestAccountData *account_data = modest_account_mgr_get_account_data (account_mgr, (gchar*)cursor->data); @@ -584,12 +650,12 @@ modest_tny_account_store_get_accounts (TnyAccountStore *iface, TnyList *list, /* also, add the local folder pseudo-account */ local_folder_account = get_local_folder_account (MODEST_TNY_ACCOUNT_STORE(self)); - if (!local_folder_account) + if (!local_folder_account) g_printerr ("modest: failed to add local folders account\n"); else tny_list_prepend (list, G_OBJECT(local_folder_account)); - tny_session_camel_set_account_store (priv->tny_session_camel, iface); + tny_session_camel_set_account_store (priv->tny_session_camel, account_store); } static const gchar* diff --git a/src/modest-tny-account-store.h b/src/modest-tny-account-store.h index aa29ea8..a6b744d 100644 --- a/src/modest-tny-account-store.h +++ b/src/modest-tny-account-store.h @@ -63,11 +63,6 @@ struct _ModestTnyAccountStore { struct _ModestTnyAccountStoreClass { GObjectClass parent_class; - void (*password_requested) (ModestTnyAccountStore *self, - const gchar *account_name, - gchar **password, - gboolean *cancel, - gpointer user_data); void (*account_update) (ModestTnyAccountStore *self, const gchar *account_name, gpointer user_data); diff --git a/src/modest-ui.c b/src/modest-ui.c index 1c028b2..dc3a7c5 100644 --- a/src/modest-ui.c +++ b/src/modest-ui.c @@ -96,13 +96,6 @@ static void reply_forward (GtkWidget *widget, static gchar* ask_for_folder_name (GtkWindow *parent_window, const gchar *title); -static void _modest_ui_actions_on_password_requested (ModestTnyAccountStore *account_store, - const gchar* account_name, - gchar **password, - gboolean *cancel, - gboolean *remember, - ModestMainWindow *main_window); - GType modest_ui_get_type (void) { @@ -287,7 +280,7 @@ register_stock_icons () { MODEST_STOCK_DELETE, "delete", 0, 0, NULL }, { MODEST_STOCK_NEXT, "next", 0, 0, NULL }, { MODEST_STOCK_PREV, "prev", 0, 0, NULL }, - { MODEST_STOCK_STOP, "stop", 0, 0, NULL } +/* { MODEST_STOCK_STOP, "stop", 0, 0, NULL } */ }; static gchar *items_names [] = { @@ -300,7 +293,7 @@ register_stock_icons () MODEST_TOOLBAR_ICON_DELETE, MODEST_TOOLBAR_ICON_NEXT, MODEST_TOOLBAR_ICON_PREV, - MODEST_TOOLBAR_ICON_STOP +/* MODEST_TOOLBAR_ICON_STOP */ }; registered = TRUE; @@ -389,12 +382,6 @@ connect_signals (ModestUI *self) G_CALLBACK(_modest_ui_actions_on_online_toggle_toggled), priv->main_window); - /* account store */ - g_signal_connect (G_OBJECT (priv->account_store), - "password_requested", - G_CALLBACK(_modest_ui_actions_on_password_requested), - priv->main_window); - /* Destroy window */ g_signal_connect (G_OBJECT(priv->main_window), "destroy", @@ -787,8 +774,8 @@ get_msg_cb (TnyFolder *folder, TnyMsg *msg, GError **err, gpointer user_data) widget_factory = modest_window_get_widget_factory (MODEST_WINDOW (helper->main_window)); header_view = modest_widget_factory_get_header_view (widget_factory); g_object_unref (G_OBJECT (widget_factory)); - _modest_ui_actions_on_item_not_found (header_view, - MODEST_ITEM_TYPE_MESSAGE, + _modest_ui_actions_on_item_not_found (header_view, + MODEST_ITEM_TYPE_MESSAGE, helper->main_window); return; } @@ -911,62 +898,6 @@ _modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view, } } -void -_modest_ui_actions_on_password_requested (ModestTnyAccountStore *account_store, - const gchar* account_name, - gchar **password, - gboolean *cancel, - gboolean *remember, - ModestMainWindow *main_window) -{ - gchar *txt; - GtkWidget *dialog, *entry, *remember_pass_check; - - dialog = gtk_dialog_new_with_buttons (_("Password requested"), - GTK_WINDOW (main_window), - GTK_DIALOG_MODAL, - GTK_STOCK_CANCEL, - GTK_RESPONSE_REJECT, - GTK_STOCK_OK, - GTK_RESPONSE_ACCEPT, - NULL); - - txt = g_strdup_printf (_("Please enter your password for %s"), account_name); - gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_label_new(txt), - FALSE, FALSE, 0); - g_free (txt); - - entry = gtk_entry_new_with_max_length (40); - gtk_entry_set_visibility (GTK_ENTRY(entry), FALSE); - gtk_entry_set_invisible_char (GTK_ENTRY(entry), 0x2022); /* bullet unichar */ - - gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), entry, - TRUE, FALSE, 0); - - remember_pass_check = gtk_check_button_new_with_label (_("Remember password")); - gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), remember_pass_check, - TRUE, FALSE, 0); - - gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox)); - - if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { - *password = g_strdup (gtk_entry_get_text (GTK_ENTRY(entry))); - *cancel = FALSE; - } else { - *password = NULL; - *cancel = TRUE; - } - - if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (remember_pass_check))) - *remember = TRUE; - else - *remember = FALSE; - - gtk_widget_destroy (dialog); - - while (gtk_events_pending ()) - gtk_main_iteration (); -} static gboolean @@ -1082,8 +1013,9 @@ _modest_ui_actions_on_item_not_found (ModestHeaderView *header_view, factory = modest_tny_platform_factory_get_instance (); account_store = tny_platform_factory_new_account_store (factory); device = tny_account_store_get_device (account_store); - - gdk_threads_enter (); + + if (g_main_depth > 0) + gdk_threads_enter (); online = tny_device_is_online (device); if (online) { @@ -1119,7 +1051,8 @@ _modest_ui_actions_on_item_not_found (ModestHeaderView *header_view, } } gtk_widget_destroy (dialog); - gdk_threads_leave (); + if (g_main_depth > 0) + gdk_threads_leave (); } diff --git a/src/widgets/modest-folder-view.c b/src/widgets/modest-folder-view.c index b8683bb..102c4e5 100644 --- a/src/widgets/modest-folder-view.c +++ b/src/widgets/modest-folder-view.c @@ -77,7 +77,6 @@ struct _ModestFolderViewPrivate { TnyAccountStore *account_store; TnyFolder *cur_folder; - gboolean view_is_empty; gulong sig1, sig2; gulong *store_accounts_handlers; @@ -155,12 +154,19 @@ text_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, gint unread; TnyFolderType type; + g_return_if_fail (column); + g_return_if_fail (tree_model); + gtk_tree_model_get (tree_model, iter, TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN, &fname, + TNY_GTK_FOLDER_STORE_TREE_MODEL_UNREAD_COLUMN, &unread, TNY_GTK_FOLDER_STORE_TREE_MODEL_TYPE_COLUMN, &type, - TNY_GTK_FOLDER_STORE_TREE_MODEL_UNREAD_COLUMN, &unread, -1); + -1); rendobj = G_OBJECT(renderer); + if (!fname) + return; + if (unread > 0) { gchar *folder_title = g_strdup_printf ("%s (%d)", fname, unread); g_object_set (rendobj,"text", folder_title, "weight", 800, NULL); @@ -247,7 +253,6 @@ modest_folder_view_init (ModestFolderView *obj) priv = MODEST_FOLDER_VIEW_GET_PRIVATE(obj); - priv->view_is_empty = TRUE; priv->account_store = NULL; priv->cur_folder = NULL; priv->query = NULL; @@ -349,8 +354,6 @@ static void on_account_update (TnyAccountStore *account_store, const gchar *account, gpointer user_data) { - update_model_empty (MODEST_FOLDER_VIEW(user_data)); - if (!update_model (MODEST_FOLDER_VIEW(user_data), MODEST_TNY_ACCOUNT_STORE(account_store))) g_printerr ("modest: failed to update model for changes in '%s'", @@ -409,8 +412,6 @@ modest_folder_view_new (ModestTnyAccountStore *account_store, static gboolean update_model_empty (ModestFolderView *self) { - GtkTreeIter iter; - GtkTreeStore *store; ModestFolderViewPrivate *priv; g_return_val_if_fail (self, FALSE); @@ -423,17 +424,6 @@ update_model_empty (ModestFolderView *self) priv->store_accounts_handlers = NULL; } - /* Create the new model */ - store = gtk_tree_store_new (1, G_TYPE_STRING); - gtk_tree_store_append (store, &iter, NULL); - - gtk_tree_store_set (store, &iter, 0, _("(empty)"), -1); - - gtk_tree_view_set_model (GTK_TREE_VIEW(self), - GTK_TREE_MODEL(store)); - g_object_unref (store); - priv->view_is_empty = TRUE; - g_signal_emit (G_OBJECT(self), signals[FOLDER_SELECTION_CHANGED_SIGNAL], 0, NULL, TRUE); return TRUE; @@ -459,7 +449,6 @@ update_store_account_handlers (ModestFolderView *self, TnyList *account_list) if (!tny_iterator_is_done (iter)) { gint i = 0; - priv->view_is_empty = FALSE; do { priv->store_accounts_handlers [i++] = @@ -489,7 +478,7 @@ update_model (ModestFolderView *self, ModestTnyAccountStore *account_store) priv = MODEST_FOLDER_VIEW_GET_PRIVATE(self); - model = tny_gtk_folder_store_tree_model_new (TRUE, NULL); + model = tny_gtk_folder_store_tree_model_new (FALSE, NULL); account_list = TNY_LIST(model); tny_account_store_get_accounts (TNY_ACCOUNT_STORE(account_store), @@ -530,10 +519,6 @@ on_selection_changed (GtkTreeSelection *sel, gpointer user_data) priv = MODEST_FOLDER_VIEW_GET_PRIVATE(user_data); priv->cur_selection = sel; - /* is_empty means that there is only the 'empty' item */ - if (priv->view_is_empty) - return; - /* folder was _un_selected if true */ if (!gtk_tree_selection_get_selected (sel, &model, &iter)) { priv->cur_folder = NULL; /* FIXME: need this? */ diff --git a/src/widgets/modest-header-view.c b/src/widgets/modest-header-view.c index 0febbb9..bf131f5 100644 --- a/src/widgets/modest-header-view.c +++ b/src/widgets/modest-header-view.c @@ -615,6 +615,7 @@ modest_header_view_set_folder (ModestHeaderView *self, TnyFolder *folder) on_refresh_folder, on_refresh_folder_status_update, self); + /* no message selected */ g_signal_emit (G_OBJECT(self), signals[HEADER_SELECTED_SIGNAL], 0, NULL); -- 1.7.9.5