*/
#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <camel/camel-url.h>
+#include <widgets/modest-combo-box.h>
#include "modest-account-assistant.h"
#include "modest-store-widget.h"
#include "modest-transport-widget.h"
+#include "modest-text-utils.h"
+#include <modest-protocol-info.h>
#include <string.h>
typedef struct _ModestAccountAssistantPrivate ModestAccountAssistantPrivate;
struct _ModestAccountAssistantPrivate {
- ModestWidgetFactory *factory;
ModestAccountMgr *account_mgr;
GtkWidget *account_name;
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);
+ }
}
/* 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);
}
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);
+}
+
+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);
add_receiving_page (ModestAccountAssistant *self)
{
GtkWidget *page, *box, *combo;
-
+ ModestPairList *protos;
ModestAccountAssistantPrivate *priv;
priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(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_assistant_set_page_type (GTK_ASSISTANT(self), page,
GTK_ASSISTANT_PAGE_INTRO);
gtk_assistant_set_page_complete (GTK_ASSISTANT(self),
- page, TRUE);
+ page, FALSE);
gtk_widget_show_all (page);
}
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);
add_sending_page (ModestAccountAssistant *self)
{
GtkWidget *page, *box, *combo;
-
+ ModestPairList *protos;
ModestAccountAssistantPrivate *priv;
priv = MODEST_ACCOUNT_ASSISTANT_GET_PRIVATE(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_assistant_append_page (GTK_ASSISTANT(self), page);
gtk_assistant_set_page_title (GTK_ASSISTANT(self), page,
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->store_widget = NULL;
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);
}
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 */
}
+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, NULL))
+ 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,
+ NULL);
modest_account_mgr_set_string (priv->account_mgr,
account_name,
MODEST_ACCOUNT_FULLNAME,
account_name,
MODEST_ACCOUNT_EMAIL,
get_email(self), FALSE, NULL);
-
- g_free (store_name);
- /* Close the assistant */
- gtk_widget_destroy (GTK_WIDGET(self));
+ /* 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;
G_CALLBACK(on_apply), NULL);
g_signal_connect (G_OBJECT(self), "cancel",
G_CALLBACK(on_cancel), NULL);
+ g_signal_connect (G_OBJECT(self), "close",
+ G_CALLBACK(on_close), NULL);
return GTK_WIDGET(self);
}