X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmaemo%2Fmodest-account-assistant.c;h=d68b4bbd51619360fd4295175514ff2cf524b31c;hp=75fd1fd83bde5f7146116e5b3e103cdd69b98225;hb=8f5689576717728885ab7d8477dc01ad5cfb5541;hpb=b691e563dd858d472dc25de76704c5410e60d352 diff --git a/src/maemo/modest-account-assistant.c b/src/maemo/modest-account-assistant.c index 75fd1fd..d68b4bb 100644 --- a/src/maemo/modest-account-assistant.c +++ b/src/maemo/modest-account-assistant.c @@ -28,9 +28,14 @@ */ #include +#include +#include +#include #include "modest-account-assistant.h" #include "modest-store-widget.h" #include "modest-transport-widget.h" +#include "modest-text-utils.h" +#include #include @@ -49,9 +54,8 @@ enum { typedef struct _ModestAccountAssistantPrivate ModestAccountAssistantPrivate; struct _ModestAccountAssistantPrivate { - ModestWidgetFactory *factory; ModestAccountMgr *account_mgr; - + GtkWidget *account_name; GtkWidget *fullname; GtkWidget *email; @@ -67,7 +71,7 @@ struct _ModestAccountAssistantPrivate { MODEST_TYPE_ACCOUNT_ASSISTANT, \ ModestAccountAssistantPrivate)) /* globals */ -static GtkAssistantClass *parent_class = NULL; +static GtkNotebookClass *parent_class = NULL; /* uncomment the following if you have defined any signals */ /* static guint signals[LAST_SIGNAL] = {0}; */ @@ -89,7 +93,7 @@ modest_account_assistant_get_type (void) (GInstanceInitFunc) modest_account_assistant_init, NULL }; - my_type = g_type_register_static (GTK_TYPE_ASSISTANT, + my_type = g_type_register_static (GTK_TYPE_NOTEBOOK, "ModestAccountAssistant", &my_info, 0); } @@ -118,10 +122,13 @@ modest_account_assistant_class_init (ModestAccountAssistantClass *klass) static void -add_intro_page (ModestAccountAssistant *assistant) +add_intro_page (ModestAccountAssistant *self) { GtkWidget *page, *label; - + ModestAccountAssistantPrivate *priv; + + priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self); + page = gtk_vbox_new (FALSE, 6); label = gtk_label_new ( @@ -130,17 +137,17 @@ add_intro_page (ModestAccountAssistant *assistant) gtk_box_pack_start (GTK_BOX(page), label, FALSE, FALSE, 6); gtk_widget_show_all (page); - gtk_assistant_append_page (GTK_ASSISTANT(assistant), page); - - gtk_assistant_set_page_title (GTK_ASSISTANT(assistant), page, - _("Modest Account Assistant")); - gtk_assistant_set_page_type (GTK_ASSISTANT(assistant), page, - GTK_ASSISTANT_PAGE_INTRO); - gtk_assistant_set_page_complete (GTK_ASSISTANT(assistant), - page, TRUE); + gtk_notebook_append_page (GTK_NOTEBOOK(self), page, gtk_label_new(_("Modest Account Assistant"))); + + //gtk_assistant_set_page_title (GTK_ASSISTANT(assistant), page, + // _("Modest Account Assistant")); + //gtk_assistant_set_page_type (GTK_ASSISTANT(assistant), page, + // GTK_ASSISTANT_PAGE_INTRO); + //gtk_assistant_set_page_complete (GTK_ASSISTANT(assistant), + // page, TRUE); } - +#if 0 static void set_current_page_complete (ModestAccountAssistant *self, gboolean complete) { @@ -148,9 +155,11 @@ set_current_page_complete (ModestAccountAssistant *self, gboolean complete) gint pageno; pageno = gtk_assistant_get_current_page (GTK_ASSISTANT(self)); - page = gtk_assistant_get_nth_page (GTK_ASSISTANT(self), pageno); - gtk_assistant_set_page_complete (GTK_ASSISTANT(self), page, complete); + if (pageno != -1) { + page = gtk_assistant_get_nth_page (GTK_ASSISTANT(self), pageno); + gtk_assistant_set_page_complete (GTK_ASSISTANT(self), page, complete); + } } @@ -171,13 +180,12 @@ identity_page_update_completeness (GtkEditable *editable, /* FIXME: regexp check for email address */ txt = gtk_entry_get_text (GTK_ENTRY(priv->email)); - if (!txt || strlen(txt) == 0) { + if (!modest_text_utils_validate_email_address (txt)) set_current_page_complete (self, FALSE); - return; - } - set_current_page_complete (self, TRUE); + else + set_current_page_complete (self, TRUE); } - +#endif static void add_identity_page (ModestAccountAssistant *self) @@ -206,41 +214,78 @@ add_identity_page (ModestAccountAssistant *self) gtk_table_attach_defaults (GTK_TABLE(table),priv->email, 1,2,1,2); - g_signal_connect (G_OBJECT(priv->fullname), "changed", - G_CALLBACK(identity_page_update_completeness), - self); - g_signal_connect (G_OBJECT(priv->email), "changed", - G_CALLBACK(identity_page_update_completeness), - self); +/* g_signal_connect (G_OBJECT(priv->fullname), "changed", */ +/* G_CALLBACK(identity_page_update_completeness), */ +/* self); */ +/* g_signal_connect (G_OBJECT(priv->email), "changed", */ +/* G_CALLBACK(identity_page_update_completeness), */ +/* self); */ gtk_box_pack_start (GTK_BOX(page), table, FALSE, FALSE, 6); gtk_widget_show_all (page); - gtk_assistant_append_page (GTK_ASSISTANT(self), page); + gtk_notebook_append_page (GTK_NOTEBOOK(self), page, gtk_label_new (_("Identity"))); - gtk_assistant_set_page_title (GTK_ASSISTANT(self), page, - _("Identity")); - gtk_assistant_set_page_type (GTK_ASSISTANT(self), page, - GTK_ASSISTANT_PAGE_INTRO); - gtk_assistant_set_page_complete (GTK_ASSISTANT(self), - page, FALSE); +/* gtk_assistant_set_page_title (GTK_ASSISTANT(self), page, */ +/* _("Identity")); */ +/* gtk_assistant_set_page_type (GTK_ASSISTANT(self), page, */ +/* GTK_ASSISTANT_PAGE_INTRO); */ +/* gtk_assistant_set_page_complete (GTK_ASSISTANT(self), */ +/* page, FALSE); */ } +#if 0 +static void +receiving_page_update_completeness (GtkEditable *editable, + ModestAccountAssistant *self) +{ + ModestAccountAssistantPrivate *priv; + const gchar *txt; + + priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self); + + txt = modest_store_widget_get_username (MODEST_STORE_WIDGET (priv->store_widget)); + if (!txt || strlen(txt) == 0) { + set_current_page_complete (self, FALSE); + return; + } + + txt = modest_store_widget_get_servername (MODEST_STORE_WIDGET (priv->store_widget)); + if (!txt || strlen(txt) == 0) { + set_current_page_complete (self, FALSE); + return; + } + set_current_page_complete (self, TRUE); +} +#endif + static void on_receiving_combo_box_changed (GtkComboBox *combo, ModestAccountAssistant *self) { ModestAccountAssistantPrivate *priv; gchar *chosen; + ModestProtocol proto; priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self); chosen = gtk_combo_box_get_active_text (GTK_COMBO_BOX(combo)); - if (priv->store_widget) gtk_container_remove (GTK_CONTAINER(priv->store_holder), priv->store_widget); + + proto = modest_protocol_info_get_protocol (chosen); - priv->store_widget = modest_store_widget_new (priv->factory, chosen); + /* FIXME: we could have these widgets cached instead of + creating them every time */ + priv->store_widget = modest_store_widget_new (proto); +/* if (proto == MODEST_PROTOCOL_STORE_POP || proto == MODEST_PROTOCOL_STORE_IMAP) { */ +/* g_signal_connect (priv->store_widget, */ +/* "data_changed", */ +/* G_CALLBACK (receiving_page_update_completeness), */ +/* self); */ +/* set_current_page_complete (self, FALSE); */ +/* } else */ +/* set_current_page_complete (self, TRUE); */ gtk_container_add (GTK_CONTAINER(priv->store_holder), priv->store_widget); @@ -249,11 +294,12 @@ on_receiving_combo_box_changed (GtkComboBox *combo, ModestAccountAssistant *self } + static void add_receiving_page (ModestAccountAssistant *self) { GtkWidget *page, *box, *combo; - + ModestPairList *protos; ModestAccountAssistantPrivate *priv; priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self); @@ -268,28 +314,33 @@ add_receiving_page (ModestAccountAssistant *self) gtk_label_new(_("Server type")), FALSE,FALSE,6); - combo = modest_widget_factory_get_combo_box (priv->factory, - MODEST_COMBO_BOX_TYPE_STORE_PROTOS); + protos = modest_protocol_info_get_protocol_pair_list (MODEST_PROTOCOL_TYPE_STORE); + combo = modest_combo_box_new (protos, g_str_equal); + modest_pair_list_free (protos); + g_signal_connect (G_OBJECT(combo), "changed", G_CALLBACK(on_receiving_combo_box_changed), self); gtk_box_pack_start (GTK_BOX(box), combo, FALSE,FALSE,6); gtk_box_pack_start (GTK_BOX(page), box, FALSE,FALSE, 6); - + gtk_box_pack_start (GTK_BOX(page), gtk_hseparator_new(), FALSE, FALSE, 0); priv->store_holder = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX(page), priv->store_holder, TRUE, TRUE, 0); + + /* Force the selection */ + on_receiving_combo_box_changed (GTK_COMBO_BOX (combo), self); - gtk_assistant_append_page (GTK_ASSISTANT(self), page); + gtk_notebook_append_page (GTK_NOTEBOOK(self), page, gtk_label_new(_("Receiving mail"))); - gtk_assistant_set_page_title (GTK_ASSISTANT(self), page, - _("Receiving mail")); - gtk_assistant_set_page_type (GTK_ASSISTANT(self), page, - GTK_ASSISTANT_PAGE_INTRO); - gtk_assistant_set_page_complete (GTK_ASSISTANT(self), - page, TRUE); + /* gtk_assistant_set_page_title (GTK_ASSISTANT(self), page, */ +/* _("Receiving mail")); */ +/* gtk_assistant_set_page_type (GTK_ASSISTANT(self), page, */ +/* GTK_ASSISTANT_PAGE_INTRO); */ +/* gtk_assistant_set_page_complete (GTK_ASSISTANT(self), */ +/* page, FALSE); */ gtk_widget_show_all (page); } @@ -309,9 +360,8 @@ on_sending_combo_box_changed (GtkComboBox *combo, ModestAccountAssistant *self) if (priv->transport_widget) gtk_container_remove (GTK_CONTAINER(priv->transport_holder), priv->transport_widget); - - priv->transport_widget = modest_transport_widget_new (priv->factory, - chosen); + priv->transport_widget = + modest_transport_widget_new (modest_protocol_info_get_protocol(chosen)); gtk_container_add (GTK_CONTAINER(priv->transport_holder), priv->transport_widget); @@ -325,7 +375,7 @@ static void add_sending_page (ModestAccountAssistant *self) { GtkWidget *page, *box, *combo; - + ModestPairList *protos; ModestAccountAssistantPrivate *priv; priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self); @@ -339,29 +389,34 @@ add_sending_page (ModestAccountAssistant *self) gtk_box_pack_start (GTK_BOX(box), gtk_label_new(_("Server type")), FALSE,FALSE,0); + + protos = modest_protocol_info_get_protocol_pair_list (MODEST_PROTOCOL_TYPE_TRANSPORT); + combo = modest_combo_box_new (protos, g_str_equal); + modest_pair_list_free (protos); - combo = modest_widget_factory_get_combo_box (priv->factory, - MODEST_COMBO_BOX_TYPE_TRANSPORT_PROTOS); g_signal_connect (G_OBJECT(combo), "changed", G_CALLBACK(on_sending_combo_box_changed), self); gtk_box_pack_start (GTK_BOX(box), combo, FALSE,FALSE,0); gtk_box_pack_start (GTK_BOX(page), box, FALSE,FALSE, 0); - + gtk_box_pack_start (GTK_BOX(page), gtk_hseparator_new(), FALSE, FALSE, 0); priv->transport_holder = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX(page), priv->transport_holder, FALSE, FALSE, 0); + + /* Force the selection */ + on_sending_combo_box_changed (GTK_COMBO_BOX (combo), self); + + gtk_notebook_append_page (GTK_NOTEBOOK(self), page, gtk_label_new (_("Sending mail"))); - gtk_assistant_append_page (GTK_ASSISTANT(self), page); - - gtk_assistant_set_page_title (GTK_ASSISTANT(self), page, - _("Sending mail")); - gtk_assistant_set_page_type (GTK_ASSISTANT(self), page, - GTK_ASSISTANT_PAGE_INTRO); - gtk_assistant_set_page_complete (GTK_ASSISTANT(self), - page, TRUE); +/* gtk_assistant_set_page_title (GTK_ASSISTANT(self), page, */ +/* _("Sending mail")); */ +/* gtk_assistant_set_page_type (GTK_ASSISTANT(self), page, */ +/* GTK_ASSISTANT_PAGE_INTRO); */ +/* gtk_assistant_set_page_complete (GTK_ASSISTANT(self), */ +/* page, TRUE); */ gtk_widget_show_all (page); } @@ -391,30 +446,26 @@ add_final_page (ModestAccountAssistant *self) gtk_box_pack_start (GTK_BOX(page), box, FALSE, FALSE, 6); - gtk_assistant_append_page (GTK_ASSISTANT(self), page); + gtk_notebook_append_page (GTK_NOTEBOOK(self), page, gtk_label_new (_("Account Management"))); - gtk_assistant_set_page_title (GTK_ASSISTANT(self), page, - _("Account Management")); - gtk_assistant_set_page_type (GTK_ASSISTANT(self), page, - GTK_ASSISTANT_PAGE_CONFIRM); +/* gtk_assistant_set_page_title (GTK_ASSISTANT(self), page, */ +/* _("Account Management")); */ +/* gtk_assistant_set_page_type (GTK_ASSISTANT(self), page, */ +/* GTK_ASSISTANT_PAGE_CONFIRM); */ - gtk_assistant_set_page_complete (GTK_ASSISTANT(self), - page, TRUE); +/* gtk_assistant_set_page_complete (GTK_ASSISTANT(self), */ +/* page, TRUE); */ gtk_widget_show_all (page); } - - static void modest_account_assistant_init (ModestAccountAssistant *obj) { - ModestAccountAssistantPrivate *priv; - + ModestAccountAssistantPrivate *priv; priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(obj); - priv->factory = NULL; - priv->account_mgr = NULL; + priv->account_mgr = NULL; priv->store_widget = NULL; priv->transport_widget = NULL; } @@ -425,19 +476,12 @@ modest_account_assistant_finalize (GObject *obj) ModestAccountAssistantPrivate *priv; priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(obj); - - if (priv->factory) { - g_object_unref (G_OBJECT(priv->factory)); - priv->factory = NULL; - } if (priv->account_mgr) { g_object_unref (G_OBJECT(priv->account_mgr)); priv->account_mgr = NULL; } - - G_OBJECT_CLASS(parent_class)->finalize (obj); } @@ -471,13 +515,14 @@ on_cancel (ModestAccountAssistant *self, gpointer user_data) switch (response) { case GTK_RESPONSE_ACCEPT: /* close the assistant */ - gtk_widget_destroy (GTK_WIDGET(self)); + gtk_widget_hide (GTK_WIDGET(self)); break; case GTK_RESPONSE_CANCEL: /* don't do anything */ break; default: g_assert_not_reached (); - + return; + }; } @@ -511,71 +556,139 @@ get_email (ModestAccountAssistant *self) } +static void +on_close (ModestAccountAssistant *self, gpointer user_data) +{ + gtk_widget_hide (GTK_WIDGET (self)); +} + + +/* + * FIXME: hmmmm this a Camel internal thing, should move this + * somewhere else + */ +static gchar* +get_account_uri (ModestProtocol proto, const gchar* path) +{ + CamelURL *url; + gchar *uri; + + switch (proto) { + case MODEST_PROTOCOL_STORE_MBOX: + url = camel_url_new ("mbox:", NULL); break; + case MODEST_PROTOCOL_STORE_MAILDIR: + url = camel_url_new ("maildir:", NULL); break; + default: + g_return_val_if_reached (NULL); + } + camel_url_set_path (url, path); + uri = camel_url_to_string (url, 0); + camel_url_free (url); + + return uri; +} + +static gchar* +get_new_server_account_name (ModestAccountMgr* acc_mgr, ModestProtocol proto, + const gchar* username, const gchar *servername) +{ + gchar *name; + gint i = 0; + + while (TRUE) { + name = g_strdup_printf ("%s:%d", + modest_protocol_info_get_protocol_name(proto), i++); + if (modest_account_mgr_account_exists (acc_mgr, name, TRUE)) + g_free (name); + else + break; + } + return name; +} + static void on_apply (ModestAccountAssistant *self, gpointer user_data) { ModestAccountAssistantPrivate *priv; - gchar *store_name; - const gchar *account_name; + ModestProtocol proto; + gchar *store_name, *transport_name; + const gchar *account_name, *username, *servername, *path; ModestStoreWidget *store; + ModestTransportWidget *transport; priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self); - /* create account */ - /* create server account -> store */ store = MODEST_STORE_WIDGET(priv->store_widget); - store_name = g_strdup_printf ("%s:%s@%s", - modest_store_widget_get_proto (store), - modest_store_widget_get_username (store), - modest_store_widget_get_servername (store)); + proto = modest_store_widget_get_proto (store); + username = modest_store_widget_get_username (store); + servername = modest_store_widget_get_servername (store); + path = modest_store_widget_get_path (store); + store_name = get_new_server_account_name (priv->account_mgr, proto,username, servername); + + if (proto == MODEST_PROTOCOL_STORE_MAILDIR || + proto == MODEST_PROTOCOL_STORE_MBOX) { + gchar *uri = get_account_uri (proto, path); + modest_account_mgr_add_server_account_uri (priv->account_mgr, store_name, proto, uri); + g_free (uri); + } else + modest_account_mgr_add_server_account (priv->account_mgr, store_name, servername, + username, NULL, proto); + + /* create server account -> transport */ + transport = MODEST_TRANSPORT_WIDGET(priv->transport_widget); + proto = modest_transport_widget_get_proto (transport); + username = NULL; + servername = NULL; + if (proto == MODEST_PROTOCOL_TRANSPORT_SMTP) { + servername = modest_transport_widget_get_servername (transport); + if (modest_transport_widget_get_requires_auth (transport)) + username = modest_transport_widget_get_username (transport); + } + transport_name = get_new_server_account_name (priv->account_mgr, proto,username, servername); modest_account_mgr_add_server_account (priv->account_mgr, - store_name, - modest_store_widget_get_servername (store), - modest_store_widget_get_username (store), - NULL, - modest_store_widget_get_proto (store)); + transport_name, servername, + username, NULL, + proto); - /* create server account -> transport */ + /* create account */ account_name = get_account_name (self); modest_account_mgr_add_account (priv->account_mgr, account_name, store_name, - NULL, NULL); + transport_name); modest_account_mgr_set_string (priv->account_mgr, account_name, MODEST_ACCOUNT_FULLNAME, - get_fullname(self), FALSE, NULL); + get_fullname(self), FALSE); modest_account_mgr_set_string (priv->account_mgr, account_name, MODEST_ACCOUNT_EMAIL, - get_email(self), FALSE, NULL); - + get_email(self), FALSE); + + /* Frees */ g_free (store_name); + g_free (transport_name); } GtkWidget* -modest_account_assistant_new (ModestAccountMgr *account_mgr, ModestWidgetFactory *factory) +modest_account_assistant_new (ModestAccountMgr *account_mgr) { GObject *obj; ModestAccountAssistant *self; ModestAccountAssistantPrivate *priv; - - g_return_val_if_fail (factory, NULL); + g_return_val_if_fail (account_mgr, NULL); obj = g_object_new(MODEST_TYPE_ACCOUNT_ASSISTANT, NULL); self = MODEST_ACCOUNT_ASSISTANT(obj); priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(self); - - g_object_ref (factory); - priv->factory = factory; - + g_object_ref (account_mgr); priv->account_mgr = account_mgr; @@ -585,18 +698,13 @@ modest_account_assistant_new (ModestAccountMgr *account_mgr, ModestWidgetFactory add_sending_page (self); add_final_page (self); - gtk_assistant_set_current_page (GTK_ASSISTANT(self), 0); - gtk_window_set_title (GTK_WINDOW(self), - _("Modest Account Wizard")); - gtk_window_set_resizable (GTK_WINDOW(self), TRUE); - gtk_window_set_default_size (GTK_WINDOW(self), 400, 400); - gtk_window_set_modal (GTK_WINDOW(self), TRUE); - - g_signal_connect (G_OBJECT(self), "apply", - G_CALLBACK(on_apply), NULL); + g_signal_connect (G_OBJECT(self), "apply", + G_CALLBACK(on_apply), NULL); g_signal_connect (G_OBJECT(self), "cancel", - G_CALLBACK(on_cancel), NULL); - + G_CALLBACK(on_cancel), NULL); + g_signal_connect (G_OBJECT(self), "close", + G_CALLBACK(on_close), NULL); + return GTK_WIDGET(self); }