]> sjero.net Git - linphone/blobdiff - gtk/setupwizard.c
Aac-eld add missing header according to RFC3640 3.3.6
[linphone] / gtk / setupwizard.c
index b03b1be2d28cb6b75c0ff844aee55ec865ac920f..f4374c539a377c7dfea70ddee820c7dbffede6f3 100644 (file)
@@ -24,10 +24,8 @@ static LinphoneAccountCreator *linphone_gtk_assistant_get_creator(GtkWidget*w);
 
 static const int PASSWORD_MIN_SIZE = 6;
 static const int LOGIN_MIN_SIZE = 4;
-static int is_username_available = 0;
-static int is_email_correct = 0;
-static int is_password_correct = 0;
 
+static GtkWidget *the_assistant=NULL;
 static GdkPixbuf *ok;
 static GdkPixbuf *notok;
 
@@ -61,7 +59,7 @@ static int all_account_information_entered(GtkWidget *w) {
 
        if (gtk_entry_get_text_length(username) > 0 &&
        gtk_entry_get_text_length(domain) > 0 &&
-       g_regex_match_simple("^(sip:)?[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([\\.-][a-z0-9]+)*)+\\.[a-z]{2,}$", gtk_entry_get_text(username), 0, 0) &&
+       g_regex_match_simple("^[a-zA-Z]+[a-zA-Z0-9.\\-_]{2,}$", gtk_entry_get_text(username), 0, 0) &&
        g_regex_match_simple("^(sip:)?([a-z0-9]+([\\.-][a-z0-9]+)*)+\\.[a-z]{2,}$", gtk_entry_get_text(domain), 0, 0)) {
                return 1;
        }
@@ -70,14 +68,6 @@ static int all_account_information_entered(GtkWidget *w) {
 
 static void account_informations_changed(GtkEntry *entry, GtkWidget *w) {
        GtkWidget *assistant=gtk_widget_get_toplevel(w);
-       GtkEntry* username = GTK_ENTRY(g_object_get_data(G_OBJECT(w),"username"));
-       GtkEntry* domain = GTK_ENTRY(g_object_get_data(G_OBJECT(w),"domain"));
-
-       const gchar *needle = "@";
-       if (entry == username && g_strrstr(gtk_entry_get_text(username), needle) != NULL) {
-               gtk_entry_set_text(domain, g_strrstr(gtk_entry_get_text(username), needle)+1);
-       }
-
        gtk_assistant_set_page_complete(GTK_ASSISTANT(assistant),w,
                all_account_information_entered(w)>0);
 }
@@ -128,35 +118,24 @@ static GtkWidget *create_account_informations_page() {
        GtkWidget *labelEmpty=gtk_label_new(NULL);
        gtk_widget_modify_fg(labelEmpty, GTK_STATE_NORMAL, &color);
 
-       GtkWidget *labelUsername=gtk_label_new(_("Identity:"));
-       GtkWidget *labelUsernameExemple=gtk_label_new(_("example: user@sip.linphone.org"));
-       GtkWidget *labelPassword=gtk_label_new(_("Password:"));
+       GtkWidget *labelUsername=gtk_label_new(_("Username*"));
+       GtkWidget *labelPassword=gtk_label_new(_("Password*"));
        GtkWidget *entryPassword=gtk_entry_new();
        gtk_entry_set_visibility(GTK_ENTRY(entryPassword), FALSE);
-       GtkWidget *labelDomain=gtk_label_new(_("Proxy:"));
-       GtkWidget *labelDomainExemple=gtk_label_new(_("example: sip.linphone.org"));
-       GtkWidget *labelRoute=gtk_label_new(_("Route (optional):"));
+       GtkWidget *labelDomain=gtk_label_new(_("Domain*"));
+       GtkWidget *labelProxy=gtk_label_new(_("Proxy"));
        GtkWidget *entryUsername=gtk_entry_new();
        GtkWidget *entryDomain=gtk_entry_new();
        GtkWidget *entryRoute=gtk_entry_new();
 
-       GtkWidget *vbox1=gtk_vbox_new(FALSE, 1);
-       gtk_box_pack_start (GTK_BOX (vbox1), entryUsername, TRUE, TRUE, 1);
-       gtk_box_pack_start (GTK_BOX (vbox1), labelUsernameExemple, TRUE, TRUE, 1);
-       GtkWidget *vbox2=gtk_vbox_new(FALSE, 1);
-       gtk_box_pack_start (GTK_BOX (vbox2), entryDomain, TRUE, TRUE, 1);
-       gtk_box_pack_start (GTK_BOX (vbox2), labelDomainExemple, TRUE, TRUE, 1);
-       gtk_table_set_row_spacing(GTK_TABLE(vbox), 1, 10);
-       gtk_table_set_row_spacing(GTK_TABLE(vbox), 3, 5);
-
        gtk_table_attach_defaults(GTK_TABLE(vbox), label, 0, 2, 0, 1);
        gtk_table_attach_defaults(GTK_TABLE(vbox), labelUsername, 0, 1, 1, 2);
-       gtk_table_attach_defaults(GTK_TABLE(vbox), vbox1, 1, 2, 1, 2);
+       gtk_table_attach_defaults(GTK_TABLE(vbox), entryUsername, 1, 2, 1, 2);
        gtk_table_attach_defaults(GTK_TABLE(vbox), labelPassword, 0, 1, 2, 3);
        gtk_table_attach_defaults(GTK_TABLE(vbox), entryPassword, 1, 2, 2, 3);
        gtk_table_attach_defaults(GTK_TABLE(vbox), labelDomain, 0, 1, 3, 4);
-       gtk_table_attach_defaults(GTK_TABLE(vbox), vbox2, 1, 2, 3, 4);
-       gtk_table_attach_defaults(GTK_TABLE(vbox), labelRoute, 0, 1, 4, 5);
+       gtk_table_attach_defaults(GTK_TABLE(vbox), entryDomain, 1, 2, 3, 4);
+       gtk_table_attach_defaults(GTK_TABLE(vbox), labelProxy, 0, 1, 4, 5);
        gtk_table_attach_defaults(GTK_TABLE(vbox), entryRoute, 1, 2, 4, 5);
        gtk_table_attach_defaults(GTK_TABLE(vbox), labelEmpty, 0, 2, 5, 6);
        gtk_widget_show_all(vbox);
@@ -164,7 +143,7 @@ static GtkWidget *create_account_informations_page() {
        g_object_set_data(G_OBJECT(vbox),"username",entryUsername);
        g_object_set_data(G_OBJECT(vbox),"password",entryPassword);
        g_object_set_data(G_OBJECT(vbox),"domain",entryDomain);
-       g_object_set_data(G_OBJECT(vbox),"route",entryRoute);
+       g_object_set_data(G_OBJECT(vbox),"proxy",entryRoute);
        g_object_set_data(G_OBJECT(vbox),"errorstring",labelEmpty);
        g_signal_connect(G_OBJECT(entryUsername),"changed",(GCallback)account_informations_changed,vbox);
        g_signal_connect(G_OBJECT(entryDomain),"changed",(GCallback)account_informations_changed,vbox);
@@ -189,6 +168,10 @@ static int create_account(GtkWidget *page) {
 }
 
 static int is_account_information_correct(GtkWidget *w) {
+       int is_username_available = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w),"is_username_available"));
+       int is_email_correct = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w),"is_email_correct"));
+       int is_password_correct = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w),"is_password_correct"));
+
        if (is_username_available == 1 && is_email_correct == 1 && is_password_correct == 1) {
                return 1;
        }
@@ -203,11 +186,11 @@ static void account_email_changed(GtkEntry *entry, GtkWidget *w) {
        GtkWidget *assistant=gtk_widget_get_toplevel(w);
 
        if (g_regex_match_simple("^[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([\\.-][a-z0-9]+)*)+\\.[a-z]{2,}$", gtk_entry_get_text(email), 0, 0)) {
-               is_email_correct = 1;
+               g_object_set_data(G_OBJECT(w),"is_email_correct",GINT_TO_POINTER(1));
                gtk_image_set_from_pixbuf(isEmailOk, ok);
        }
        else {
-               is_email_correct = 0;
+               g_object_set_data(G_OBJECT(w),"is_email_correct",GINT_TO_POINTER(0));
                gtk_image_set_from_pixbuf(isEmailOk, notok);
        }
        gtk_assistant_set_page_complete(GTK_ASSISTANT(assistant),w,
@@ -221,41 +204,92 @@ static void account_password_changed(GtkEntry *entry, GtkWidget *w) {
        GtkImage* isPasswordOk = GTK_IMAGE(g_object_get_data(G_OBJECT(w),"passwordOk"));
        GtkEntry* password_confirm = GTK_ENTRY(g_object_get_data(G_OBJECT(w),"password_confirm"));
        GtkWidget *assistant=gtk_widget_get_toplevel(w);
+       GtkLabel* passwordError = GTK_LABEL(g_object_get_data(G_OBJECT(w),"error"));
 
        if (gtk_entry_get_text_length(password) >= PASSWORD_MIN_SIZE &&
        g_ascii_strcasecmp(gtk_entry_get_text(password), gtk_entry_get_text(password_confirm)) == 0) {
-               is_password_correct = 1;
+               g_object_set_data(G_OBJECT(w),"is_password_correct",GINT_TO_POINTER(1));
                gtk_image_set_from_pixbuf(isPasswordOk, ok);
+               gtk_label_set_text(passwordError, "");
        }
        else {
-               is_password_correct = 0;
+               if (gtk_entry_get_text_length(password) < PASSWORD_MIN_SIZE) {
+                       gtk_label_set_text(passwordError, "Password is too short !");
+               }
+               else if (!g_ascii_strcasecmp(gtk_entry_get_text(password), gtk_entry_get_text(password_confirm)) == 0) {
+                       gtk_label_set_text(passwordError, "Passwords don't match !");
+               }
+               g_object_set_data(G_OBJECT(w),"is_password_correct",GINT_TO_POINTER(0));
                gtk_image_set_from_pixbuf(isPasswordOk, notok);
        }
        gtk_assistant_set_page_complete(GTK_ASSISTANT(assistant),w,
                        is_account_information_correct(w)>0);
 }
 
+gboolean update_interface_with_username_availability(gpointer *w) {
+       GtkWidget *assistant = gtk_widget_get_toplevel(GTK_WIDGET(w));
+       GtkImage* isUsernameOk = GTK_IMAGE(g_object_get_data(G_OBJECT(w),"usernameOk"));
+       GtkLabel* usernameError = GTK_LABEL(g_object_get_data(G_OBJECT(w),"error"));
+       int account_existing = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w),"is_username_used"));
+
+       if (account_existing == 0) {
+               g_object_set_data(G_OBJECT(w),"is_username_available",GINT_TO_POINTER(1));
+               gtk_image_set_from_pixbuf(isUsernameOk, ok);
+               gtk_label_set_text(usernameError, "");
+       }
+       else {
+               gtk_label_set_text(usernameError, "Username is already in use !");
+               g_object_set_data(G_OBJECT(w),"is_username_available",GINT_TO_POINTER(0));
+               gtk_image_set_from_pixbuf(isUsernameOk, notok);
+       }
+
+       gtk_assistant_set_page_complete(GTK_ASSISTANT(assistant),GTK_WIDGET(w),
+                               is_account_information_correct(GTK_WIDGET(w))>0);
+
+       return FALSE;
+}
+
+void* check_username_availability(void* w) {
+       LinphoneAccountCreator *creator=linphone_gtk_assistant_get_creator(gtk_widget_get_toplevel(GTK_WIDGET(w)));
+
+       int account_existing = linphone_account_creator_test_existence(creator);
+
+       g_object_set_data(G_OBJECT(w),"is_username_used",GINT_TO_POINTER(account_existing));
+       gdk_threads_add_idle((GSourceFunc)update_interface_with_username_availability, (void*)w);
+
+       return NULL;
+}
+
 static void account_username_changed(GtkEntry *entry, GtkWidget *w) {
        // Verifying if username choosed is available, and if form is correctly filled, let the user go next page
-
-       GtkWidget *assistant=gtk_widget_get_toplevel(w);
+       GtkWidget *assistant = gtk_widget_get_toplevel(GTK_WIDGET(w));
        GtkEntry* username = GTK_ENTRY(g_object_get_data(G_OBJECT(w),"username"));
        GtkImage* isUsernameOk = GTK_IMAGE(g_object_get_data(G_OBJECT(w),"usernameOk"));
+       GtkLabel* usernameError = GTK_LABEL(g_object_get_data(G_OBJECT(w),"error"));
 
        LinphoneAccountCreator *creator=linphone_gtk_assistant_get_creator(assistant);
        linphone_account_creator_set_username(creator, gtk_entry_get_text(username));
-       if (g_regex_match_simple("^[a-zA-Z]+[a-zA-Z0-9.\\-_]{2,}$", gtk_entry_get_text(username), 0, 0)
-       && linphone_account_creator_test_existence(creator) == 0) {
-               is_username_available = 1;
-               gtk_image_set_from_pixbuf(isUsernameOk, ok);
+
+       if (g_regex_match_simple("^[a-zA-Z]+[a-zA-Z0-9.\\-_]{3,}$", gtk_entry_get_text(username), 0, 0)) {
+#if !GLIB_CHECK_VERSION(2, 31, 0)
+               g_thread_create(check_username_availability, (void*)w, FALSE, NULL);
+#else
+               g_thread_new(NULL, check_username_availability, w);
+#endif
        }
        else {
-               is_username_available = 0;
+               if (gtk_entry_get_text_length(username) < LOGIN_MIN_SIZE) {
+                       gtk_label_set_text(usernameError, "Username is too short");
+               }
+               else if (!g_regex_match_simple("^[a-zA-Z]+[a-zA-Z0-9.\\-_]{3,}$", gtk_entry_get_text(username), 0, 0)) {
+                       gtk_label_set_text(usernameError, "Unauthorized username");
+               }
+               g_object_set_data(G_OBJECT(w),"is_username_available",GINT_TO_POINTER(0));
                gtk_image_set_from_pixbuf(isUsernameOk, notok);
-       }
 
-       gtk_assistant_set_page_complete(GTK_ASSISTANT(assistant),w,
-                       is_account_information_correct(w)>0);
+               gtk_assistant_set_page_complete(GTK_ASSISTANT(assistant),w,
+                               is_account_information_correct(w)>0);
+       }
 }
 
 static GtkWidget *create_account_information_page() {
@@ -277,6 +311,11 @@ static GtkWidget *create_account_information_page() {
        gtk_entry_set_visibility(GTK_ENTRY(entryPassword2), FALSE);
        GtkWidget *checkNewsletter=gtk_check_button_new_with_label("Keep me informed with linphone updates");
 
+       GdkColor color;
+       gdk_color_parse ("red", &color);
+       GtkWidget *labelError=gtk_label_new(NULL);
+       gtk_widget_modify_fg(labelError, GTK_STATE_NORMAL, &color);
+
        GtkWidget *passwordVbox1=gtk_vbox_new(FALSE,2);
        GtkWidget *passwordVbox2=gtk_vbox_new(FALSE,2);
        gtk_box_pack_start (GTK_BOX (passwordVbox1), labelPassword, TRUE, FALSE, 2);
@@ -294,7 +333,8 @@ static GtkWidget *create_account_information_page() {
        gtk_table_attach_defaults(GTK_TABLE(vbox), passwordVbox1, 0, 1, 3, 4);
        gtk_table_attach_defaults(GTK_TABLE(vbox), passwordVbox2, 1, 2, 3, 4);
        gtk_table_attach_defaults(GTK_TABLE(vbox), isPasswordOk, 2, 3, 3, 4);
-       gtk_table_attach_defaults(GTK_TABLE(vbox), checkNewsletter, 0, 3, 5, 6);
+       gtk_table_attach_defaults(GTK_TABLE(vbox), labelError, 1, 4, 5, 6);
+       gtk_table_attach_defaults(GTK_TABLE(vbox), checkNewsletter, 0, 3, 6, 7);
 
        gtk_widget_show_all(vbox);
        g_object_set_data(G_OBJECT(vbox),"username",entryUsername);
@@ -305,6 +345,7 @@ static GtkWidget *create_account_information_page() {
        g_object_set_data(G_OBJECT(vbox),"emailOk",isEmailOk);
        g_object_set_data(G_OBJECT(vbox),"password_confirm",entryPassword2);
        g_object_set_data(G_OBJECT(vbox),"newsletter",checkNewsletter);
+       g_object_set_data(G_OBJECT(vbox),"error",labelError);
        g_signal_connect(G_OBJECT(entryUsername),"changed",(GCallback)account_username_changed,vbox);
        g_signal_connect(G_OBJECT(entryPassword),"changed",(GCallback)account_password_changed,vbox);
        g_signal_connect(G_OBJECT(entryEmail),"changed",(GCallback)account_email_changed,vbox);
@@ -360,7 +401,7 @@ static int is_account_validated(GtkWidget *page) {
 }
 
 static void linphone_gtk_assistant_closed(GtkWidget *w){
-       gtk_widget_destroy(w);
+       linphone_gtk_close_assistant();
 }
 
 static void linphone_gtk_assistant_prepare(GtkWidget *assistant, GtkWidget *page){
@@ -385,7 +426,6 @@ static void linphone_gtk_assistant_prepare(GtkWidget *assistant, GtkWidget *page
                gchar domain[128];
                g_snprintf(domain, sizeof(domain), "\"%s\"", creator->domain + 4);
                LinphoneAuthInfo *info=linphone_auth_info_new(username, username, creator->password, NULL, domain);
-               g_free(username);
                linphone_core_add_auth_info(linphone_gtk_get_core(),info);
 
                if (linphone_core_add_proxy_config(linphone_gtk_get_core(),cfg)==-1)
@@ -393,6 +433,18 @@ static void linphone_gtk_assistant_prepare(GtkWidget *assistant, GtkWidget *page
 
                linphone_core_set_default_proxy(linphone_gtk_get_core(),cfg);
                linphone_gtk_load_identities();
+
+               // If account created on sip.linphone.org, we configure linphone to use TLS by default
+               g_warning("Domain : %s", creator->domain);
+               if (strcmp(creator->domain, "sip:sip.linphone.org") == 0) {
+                       LCSipTransports tr;
+                       LinphoneCore* lc = linphone_gtk_get_core();
+                       linphone_core_get_sip_transports(lc,&tr);
+                       tr.tls_port = tr.udp_port + tr.tcp_port + tr.tls_port;
+                       tr.udp_port = 0;
+                       tr.tcp_port = 0;
+                       linphone_core_set_sip_transports(lc,&tr);
+               }
        }
 }
 
@@ -416,22 +468,15 @@ static int linphone_gtk_assistant_forward(int curpage, gpointer data){
        }
        else if (curpage == 2) { // Account's informations entered
                LinphoneAccountCreator *c=linphone_gtk_assistant_get_creator(w);
-               if (!g_regex_match_simple("^sip:[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([\\.-][a-z0-9]+)*)+\\.[a-z]{2,}$", gtk_entry_get_text(GTK_ENTRY(g_object_get_data(G_OBJECT(box),"username"))), 0, 0)) {
-                       gchar identity[128];
-                       g_snprintf(identity, sizeof(identity), "sip:%s", gtk_entry_get_text(GTK_ENTRY(g_object_get_data(G_OBJECT(box),"username"))));
-                       linphone_account_creator_set_username(c, identity);
-               } else {
-                       linphone_account_creator_set_username(c, gtk_entry_get_text(GTK_ENTRY(g_object_get_data(G_OBJECT(box),"username"))));
-               }
+               gchar identity[128];
+               g_snprintf(identity, sizeof(identity), "sip:%s@%s", gtk_entry_get_text(GTK_ENTRY(g_object_get_data(G_OBJECT(box),"username"))), gtk_entry_get_text(GTK_ENTRY(g_object_get_data(G_OBJECT(box),"domain"))));
 
-               if (!g_regex_match_simple("^sip:([a-z0-9]+([\\.-][a-z0-9]+)*)+\\.[a-z]{2,}$", gtk_entry_get_text(GTK_ENTRY(g_object_get_data(G_OBJECT(box),"domain"))), 0, 0)) {
-                       gchar proxy[128];
-                       g_snprintf(proxy, sizeof(proxy), "sip:%s", gtk_entry_get_text(GTK_ENTRY(g_object_get_data(G_OBJECT(box),"domain"))));
-                       linphone_account_creator_set_domain(c, proxy);
-               } else {
-                       linphone_account_creator_set_domain(c, gtk_entry_get_text(GTK_ENTRY(g_object_get_data(G_OBJECT(box),"domain"))));
-               }
-               linphone_account_creator_set_route(c, gtk_entry_get_text(GTK_ENTRY(g_object_get_data(G_OBJECT(box),"route"))));
+               gchar proxy[128];
+               g_snprintf(proxy, sizeof(proxy), "sip:%s", gtk_entry_get_text(GTK_ENTRY(g_object_get_data(G_OBJECT(box),"domain"))));
+
+               linphone_account_creator_set_username(c, identity);
+               linphone_account_creator_set_domain(c, proxy);
+               linphone_account_creator_set_route(c, gtk_entry_get_text(GTK_ENTRY(g_object_get_data(G_OBJECT(box),"proxy"))));
                linphone_account_creator_set_password(c,gtk_entry_get_text(GTK_ENTRY(g_object_get_data(G_OBJECT(box),"password"))));
                curpage = gtk_assistant_get_n_pages(GTK_ASSISTANT(w)) - 1; // Going to the last page
        }
@@ -487,8 +532,17 @@ static LinphoneAccountCreator *linphone_gtk_assistant_get_creator(GtkWidget*w){
        return (LinphoneAccountCreator*)g_object_get_data(G_OBJECT(w),"creator");
 }
 
-GtkWidget * linphone_gtk_create_assistant(void){
-       GtkWidget *w=gtk_assistant_new();
+void linphone_gtk_close_assistant(void){
+       if(the_assistant==NULL)
+               return;
+       gtk_widget_destroy(the_assistant);      
+       the_assistant = NULL;
+}
+
+void linphone_gtk_show_assistant(void){
+       if(the_assistant!=NULL)
+               return;
+       GtkWidget *w=the_assistant=gtk_assistant_new();
        gtk_window_set_resizable (GTK_WINDOW(w), FALSE);
 
        ok = create_pixbuf(linphone_gtk_get_ui_config("ok","ok.png"));
@@ -553,6 +607,5 @@ GtkWidget * linphone_gtk_create_assistant(void){
        g_signal_connect(G_OBJECT(w),"prepare",(GCallback)linphone_gtk_assistant_prepare,NULL);
 
        gtk_widget_show(w);
-
-       return w;
 }
+