From be4e74d208330df33187d81a20ee419ad559a8d3 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 25 Nov 2011 16:57:16 +0100 Subject: [PATCH 1/7] Wizard --- configure.ac | 5 + coreapi/Makefile.am | 7 +- coreapi/linphonecore.h | 7 + coreapi/proxy.c | 20 +- coreapi/sipsetup.c | 12 +- coreapi/sipsetup.h | 6 +- coreapi/sipwizard.c | 313 +++++++++++++++++++++++ gtk/linphone.h | 1 + gtk/main.c | 17 +- gtk/main.ui | 15 ++ gtk/parameters.ui | 80 +++++- gtk/setupwizard.c | 569 +++++++++++++++++++++++++++++++---------- pixmaps/Makefile.am | 4 +- pixmaps/notok.png | Bin 0 -> 2023 bytes pixmaps/ok.png | Bin 0 -> 1373 bytes 15 files changed, 905 insertions(+), 151 deletions(-) create mode 100644 coreapi/sipwizard.c create mode 100644 pixmaps/notok.png create mode 100644 pixmaps/ok.png diff --git a/configure.ac b/configure.ac index ff2f4c729..d01e698e3 100644 --- a/configure.ac +++ b/configure.ac @@ -401,6 +401,11 @@ if test "$has_sighandler_t" = "yes" ; then AC_DEFINE( HAVE_SIGHANDLER_T, 1, [Define if sighandler_t available] ) fi +dnl check libsoup (needed for wizard) +PKG_CHECK_MODULES(LIBSOUP, [libsoup-2.4 >= 2.26]) +AC_SUBST(LIBSOUP_CFLAGS) +AC_SUBST(LIBSOUP_LIBS) + ################################################## # Stricter build options (after external packages) ################################################## diff --git a/coreapi/Makefile.am b/coreapi/Makefile.am index e9cfe715b..ced68abab 100644 --- a/coreapi/Makefile.am +++ b/coreapi/Makefile.am @@ -35,6 +35,7 @@ liblinphone_la_SOURCES=\ linphonecall.c \ sipsetup.c sipsetup.h \ siplogin.c \ + sipwizard.c \ lsd.c linphonecore_utils.h \ ec-calibrator.c \ conference.c @@ -45,7 +46,8 @@ liblinphone_la_LDFLAGS= -version-info $(LIBLINPHONE_SO_VERSION) -no-undefined liblinphone_la_LIBADD= \ $(EXOSIP_LIBS) \ $(MEDIASTREAMER_LIBS) \ - $(ORTP_LIBS) $(OPENSSL_LIBS) + $(ORTP_LIBS) $(OPENSSL_LIBS) \ + $(LIBSOUP_LIBS) if BUILD_WIN32 liblinphone_la_LIBADD+=$(top_builddir)/oRTP/src/libortp.la @@ -69,8 +71,9 @@ AM_CFLAGS=$(STRICT_OPTIONS) -DIN_LINPHONE \ $(OSIP_CFLAGS) \ $(MEDIASTREAMER_CFLAGS) \ $(EXOSIP_CFLAGS) \ + $(LIBSOUP_CFLAGS) \ -DENABLE_TRACE \ -DLOG_DOMAIN=\"LinphoneCore\" \ $(IPV6_CFLAGS) \ -DORTP_INET6 \ - $(VIDEO_CFLAGS) + $(VIDEO_CFLAGS) diff --git a/coreapi/linphonecore.h b/coreapi/linphonecore.h index 245bd899b..0a22c5c5a 100644 --- a/coreapi/linphonecore.h +++ b/coreapi/linphonecore.h @@ -404,6 +404,9 @@ typedef struct _LinphoneAccountCreator{ char *username; char *password; char *domain; + char *route; + char *email; + int suscribe; bool_t succeeded; }LinphoneAccountCreator; @@ -411,9 +414,13 @@ LinphoneAccountCreator *linphone_account_creator_new(struct _LinphoneCore *core, void linphone_account_creator_set_username(LinphoneAccountCreator *obj, const char *username); void linphone_account_creator_set_password(LinphoneAccountCreator *obj, const char *password); void linphone_account_creator_set_domain(LinphoneAccountCreator *obj, const char *domain); +void linphone_account_creator_set_route(LinphoneAccountCreator *obj, const char *route); +void linphone_account_creator_set_email(LinphoneAccountCreator *obj, const char *email); +void linphone_account_creator_set_suscribe(LinphoneAccountCreator *obj, int suscribre); const char * linphone_account_creator_get_username(LinphoneAccountCreator *obj); const char * linphone_account_creator_get_domain(LinphoneAccountCreator *obj); int linphone_account_creator_test_existence(LinphoneAccountCreator *obj); +int linphone_account_creator_test_validation(LinphoneAccountCreator *obj); LinphoneProxyConfig * linphone_account_creator_validate(LinphoneAccountCreator *obj); void linphone_account_creator_destroy(LinphoneAccountCreator *obj); diff --git a/coreapi/proxy.c b/coreapi/proxy.c index 011be6706..5a8786587 100644 --- a/coreapi/proxy.c +++ b/coreapi/proxy.c @@ -780,6 +780,18 @@ void linphone_account_creator_set_domain(LinphoneAccountCreator *obj, const char set_string(&obj->domain,domain); } +void linphone_account_creator_set_route(LinphoneAccountCreator *obj, const char *route) { + set_string(&obj->route,route); +} + +void linphone_account_creator_set_email(LinphoneAccountCreator *obj, const char *email) { + set_string(&obj->email,email); +} + +void linphone_account_creator_set_suscribe(LinphoneAccountCreator *obj, int suscribe) { + obj->suscribe = suscribe; +} + const char * linphone_account_creator_get_username(LinphoneAccountCreator *obj){ return obj->username; } @@ -796,10 +808,16 @@ int linphone_account_creator_test_existence(LinphoneAccountCreator *obj){ return err; } +int linphone_account_creator_test_validation(LinphoneAccountCreator *obj) { + SipSetupContext *ssctx=obj->ssctx; + int err=sip_setup_context_account_validated(ssctx,obj->username); + return err; +} + LinphoneProxyConfig * linphone_account_creator_validate(LinphoneAccountCreator *obj){ SipSetupContext *ssctx=obj->ssctx; char *uri=ms_strdup_printf("%s@%s",obj->username,obj->domain); - int err=sip_setup_context_create_account(ssctx,uri,obj->password); + int err=sip_setup_context_create_account(ssctx, uri, obj->password, obj->email, obj->suscribe); ms_free(uri); if (err==0) { obj->succeeded=TRUE; diff --git a/coreapi/sipsetup.c b/coreapi/sipsetup.c index 270737df1..a1eaa5789 100644 --- a/coreapi/sipsetup.c +++ b/coreapi/sipsetup.c @@ -24,9 +24,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "linphonecore.h" extern SipSetup linphone_sip_login; +extern SipSetup linphone_sip_wizard; static SipSetup *all_sip_setups[]={ &linphone_sip_login, + &linphone_sip_wizard, NULL }; @@ -123,9 +125,9 @@ int sip_setup_context_get_capabilities(SipSetupContext *ctx){ return ctx->funcs->capabilities; } -int sip_setup_context_create_account(SipSetupContext * ctx, const char *uri, const char *passwd){ +int sip_setup_context_create_account(SipSetupContext * ctx, const char *uri, const char *passwd, const char *email, int suscribe){ if (ctx->funcs->create_account) - return ctx->funcs->create_account(ctx,uri, passwd); + return ctx->funcs->create_account(ctx, uri, passwd, email, suscribe); else return -1; } @@ -135,6 +137,12 @@ int sip_setup_context_account_exists(SipSetupContext *ctx, const char *uri){ return -1; } +int sip_setup_context_account_validated(SipSetupContext *ctx, const char *uri){ + if (ctx->funcs->account_validated) + return ctx->funcs->account_validated(ctx,uri); + return -1; +} + int sip_setup_context_login_account(SipSetupContext * ctx, const char *uri, const char *passwd){ LinphoneAddress *from=linphone_address_new(uri); if (from==NULL) { diff --git a/coreapi/sipsetup.h b/coreapi/sipsetup.h index 6776367c9..2aefbee5c 100644 --- a/coreapi/sipsetup.h +++ b/coreapi/sipsetup.h @@ -97,7 +97,7 @@ struct _SipSetup{ void (*init_instance)(SipSetupContext *ctx); void (*uninit_instance)(SipSetupContext *ctx); int (*account_exists)(SipSetupContext *ctx, const char *uri); - int (*create_account)(SipSetupContext *ctx, const char *uri, const char *passwd); + int (*create_account)(SipSetupContext *ctx, const char *uri, const char *passwd, const char *email, int suscribe); int (*login_account)(SipSetupContext *ctx, const char *uri, const char *passwd); int (*get_proxy)(SipSetupContext *ctx, const char *domain, char *proxy, size_t sz); int (*get_stun_servers)(SipSetupContext *ctx, char *stun1, char *stun2, size_t size); @@ -106,6 +106,7 @@ struct _SipSetup{ const char ** (*get_domains)(SipSetupContext *ctx); int (*logout_account)(SipSetupContext *ctx); BuddyLookupFuncs *buddy_lookup_funcs; + int (*account_validated)(SipSetupContext *ctx, const char *uri); }; typedef struct _SipSetup SipSetup; @@ -131,7 +132,8 @@ unsigned int sip_setup_get_capabilities(SipSetup *s); SipSetupContext * sip_setup_context_new(SipSetup *s, struct _LinphoneProxyConfig *cfg); int sip_setup_context_account_exists(SipSetupContext *ctx, const char *uri); -int sip_setup_context_create_account(SipSetupContext *ctx, const char *uri, const char *passwd); +int sip_setup_context_account_validated(SipSetupContext *ctx, const char *uri); +int sip_setup_context_create_account(SipSetupContext *ctx, const char *uri, const char *passwd, const char *email, int suscribe); int sip_setup_context_get_capabilities(SipSetupContext *ctx); int sip_setup_context_login_account(SipSetupContext * ctx, const char *uri, const char *passwd); int sip_setup_context_get_proxy(SipSetupContext *ctx, const char *domain, char *proxy, size_t sz); diff --git a/coreapi/sipwizard.c b/coreapi/sipwizard.c new file mode 100644 index 000000000..0bd654471 --- /dev/null +++ b/coreapi/sipwizard.c @@ -0,0 +1,313 @@ +/* +linphone +Copyright (C) 2011 Simon MORLAT (simon.morlat@linphone.org) + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include "linphonecore.h" +#include "private.h" +#include +#include + +typedef struct _BLReq{ + int status; + int result; + SoupMessage *msg; + SoupSession *session; + ortp_thread_t th; +}BLReq; + +const int XMLRPC_FAILED = -1; +const int XMLRPC_OK = 0; +const char *XMLRPC_URL = "https://www.linphone.org/wizard.php"; + +static void sip_wizard_init_instance(SipSetupContext *ctx){ + LinphoneProxyConfig *cfg=sip_setup_context_get_proxy_config(ctx); + /*disable registration until the user logs in*/ + linphone_proxy_config_enable_register(cfg,FALSE); +} + +const char ** sip_wizard_get_domains(SipSetupContext *ctx) { + LinphoneProxyConfig *cfg=sip_setup_context_get_proxy_config(ctx); + const char **domains = (const char**) &cfg->reg_proxy; + return domains; +} + +static SoupMessage * build_xmlrpc_check_account_request(const char *identity){ + SoupMessage * msg; + + msg=soup_xmlrpc_request_new(XMLRPC_URL, + "check_account", + G_TYPE_STRING, identity, + G_TYPE_INVALID); + if (!msg){ + ms_error("Fail to create SoupMessage !"); + }else{ + SoupBuffer *sb=soup_message_body_flatten(msg->request_body); + ms_message("This is the XML-RPC request we are going to send:\n%s\n",sb->data); + soup_buffer_free(sb); + } + return msg; +} + +static SoupMessage * build_xmlrpc_check_account_validated(const char *identity){ + SoupMessage * msg; + + msg=soup_xmlrpc_request_new(XMLRPC_URL, + "check_account_validated", + G_TYPE_STRING, identity, + G_TYPE_INVALID); + if (!msg){ + ms_error("Fail to create SoupMessage !"); + }else{ + SoupBuffer *sb=soup_message_body_flatten(msg->request_body); + ms_message("This is the XML-RPC request we are going to send:\n%s\n",sb->data); + soup_buffer_free(sb); + } + return msg; +} + +static SoupMessage * build_xmlrpc_create_account_request(const char *identity, const char *passwd, const char *email, int suscribe){ + SoupMessage * msg; + + msg=soup_xmlrpc_request_new(XMLRPC_URL, + "create_account", + G_TYPE_STRING, identity, + G_TYPE_STRING, passwd, + G_TYPE_STRING, email, + G_TYPE_INT, suscribe, + G_TYPE_INVALID); + if (!msg){ + ms_error("Fail to create SoupMessage !"); + }else{ + SoupBuffer *sb=soup_message_body_flatten(msg->request_body); + ms_message("This is the XML-RPC request we are going to send:\n%s\n",sb->data); + soup_buffer_free(sb); + } + return msg; +} + +static int xml_rpc_parse_response(BLReq *blreq, SoupMessage *sm){ + SoupBuffer *sb; + GValue retval; + GError *error=NULL; + sb=soup_message_body_flatten(sm->response_body); + ms_message("This the xml-rpc response:\n%s\n",sb->data); + if (soup_xmlrpc_parse_method_response(sb->data,sb->length,&retval,&error)==FALSE){ + if (error!=NULL){ + ms_error("xmlrpc fault: %s",error->message); + g_error_free(error); + }else{ + ms_error("Could not parse xml-rpc response !"); + } + blreq->status=XMLRPC_FAILED; + }else{ + ms_message("Extracting values from return type..."); + blreq->result = g_value_get_int(&retval); + g_value_unset(&retval); + blreq->status=XMLRPC_OK; + } + soup_buffer_free(sb); + return blreq->status; +} + +static void got_headers(BLReq *blreq, SoupMessage*msg){ + ms_message("Got headers !"); + blreq->status=XMLRPC_OK; +} + +#if SERIALIZE_HTTPS +/*on windows libsoup support for threads with gnutls is not yet functionnal (only in git) +This will come in next release of libsoup, probably. +In the meantime, we are forced to serialize all soup https processing with a big +ugly global mutex...*/ + +static GStaticMutex big_mutex = G_STATIC_MUTEX_INIT; +#endif + +static void * process_xml_rpc_request(void *up){ + BLReq *blreq=(BLReq*)up; + SoupMessage *sm=blreq->msg; + int code; + g_signal_connect_swapped(G_OBJECT(sm),"got-headers",(GCallback)got_headers,blreq); + blreq->status=XMLRPC_OK; +#if SERIALIZE_HTTPS + g_static_mutex_lock(&big_mutex); +#endif + code=soup_session_send_message(blreq->session,sm); + if (code==200){ + ms_message("Got a response from server, yeah !"); + xml_rpc_parse_response(blreq,sm); + }else{ + ms_error("request failed, error-code=%i (%s)",code,soup_status_get_phrase(code)); + blreq->status=XMLRPC_FAILED; + } +#if SERIALIZE_HTTPS + g_static_mutex_unlock(&big_mutex); +#endif + return NULL; +} + +int sip_wizard_account_exists(SipSetupContext *ctx, const char *uri) { + /* + * Return 1 if account already exists + * 0 if account doesn't exists + * -1 if information isn't available + */ + SoupMessage *sm; + BLReq *req=ms_new0(BLReq, 1); + req->session=soup_session_sync_new(); + sm=build_xmlrpc_check_account_request(uri); + req->msg=sm; + process_xml_rpc_request(req); + + if (req->status == XMLRPC_OK) { + return req->result; + } else { + return -1; + } +} + +int sip_wizard_account_validated(SipSetupContext *ctx, const char *uri) { + /* + * Return 1 if account already exists + * 0 if account doesn't exists + * -1 if information isn't available + */ + SoupMessage *sm; + BLReq *req=ms_new0(BLReq, 1); + req->session=soup_session_sync_new(); + sm=build_xmlrpc_check_account_validated(uri); + req->msg=sm; + process_xml_rpc_request(req); + + if (req->status == XMLRPC_OK) { + return req->result; + } else { + return -1; + } +} + +int sip_wizard_create_account(SipSetupContext *ctx, const char *uri, const char *passwd, const char *email, int suscribe) { + /* + * Return 0 if account successfully created + * Else return -1 + */ + SoupMessage *sm; + BLReq *req=ms_new0(BLReq, 1); + req->session=soup_session_sync_new(); + sm=build_xmlrpc_create_account_request(uri, passwd, email, suscribe); + req->msg=sm; + process_xml_rpc_request(req); + + if (req->status == XMLRPC_OK) { + return req->result; + } else { + return -1; + } +} + +static void guess_display_name(LinphoneAddress *from){ + char *dn=(char*)ms_malloc(strlen(linphone_address_get_username(from))+3); + const char *it; + char *wptr=dn; + bool_t begin=TRUE; + bool_t surname=0; + for(it=linphone_address_get_username(from);*it!='\0';++it){ + if (begin){ + *wptr=toupper(*it); + begin=FALSE; + }else if (*it=='.'){ + if (surname) break; + *wptr=' '; + begin=TRUE; + surname=TRUE; + }else *wptr=*it; + wptr++; + } + linphone_address_set_display_name(from,dn); + ms_free(dn); +} + +static int sip_wizard_do_login(SipSetupContext * ctx, const char *uri, const char *passwd){ + LinphoneProxyConfig *cfg=sip_setup_context_get_proxy_config(ctx); + LinphoneCore *lc=linphone_proxy_config_get_core(cfg); + LinphoneAuthInfo *auth; + LinphoneAddress *parsed_uri; + char *tmp; + + parsed_uri=linphone_address_new(uri); + if (parsed_uri==NULL){ + return -1; + } + if (linphone_address_get_display_name(parsed_uri)!=NULL){ + guess_display_name(parsed_uri); + } + tmp=linphone_address_as_string(parsed_uri); + linphone_proxy_config_set_identity(cfg,tmp); + if (passwd) { + auth=linphone_auth_info_new(linphone_address_get_username(parsed_uri),NULL,passwd,NULL,NULL); + linphone_core_add_auth_info(lc,auth); + } + linphone_proxy_config_enable_register(cfg,TRUE); + linphone_proxy_config_done(cfg); + ms_free(tmp); + linphone_address_destroy(parsed_uri); + return 0; +} + +/* a simple SipSetup built-in plugin to allow creating accounts at runtime*/ + +#ifndef _MSC_VER + +SipSetup linphone_sip_wizard={ + .name="SipWizard", + .capabilities=SIP_SETUP_CAP_ACCOUNT_MANAGER, + .init_instance=sip_wizard_init_instance, + .account_exists=sip_wizard_account_exists, + .create_account=sip_wizard_create_account, + .login_account=sip_wizard_do_login, + .get_domains=sip_wizard_get_domains, + .account_validated=sip_wizard_account_validated +}; + +#else +SipSetup linphone_sip_wizard={ + "SipWizard", + SIP_SETUP_CAP_ACCOUNT_MANAGER, + 0, + NULL, + NULL, + sip_wizard_init_instance, + NULL, + sip_wizard_account_exists, + sip_wizard_create_account, + sip_wizard_do_login, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + sip_wizard_get_domains, + NULL, + NULL, + sip_wizard_account_validated +}; + + + +#endif diff --git a/gtk/linphone.h b/gtk/linphone.h index 63564c72f..c941e8c77 100644 --- a/gtk/linphone.h +++ b/gtk/linphone.h @@ -56,6 +56,7 @@ GdkPixbuf *_gdk_pixbuf_new_from_memory_at_scale(const void *data, gint len, gint GtkWidget *linphone_gtk_create_window(const char *window_name); GtkWidget *linphone_gtk_get_widget(GtkWidget *window, const char *name); GtkWidget *linphone_gtk_create_widget(const char *filename, const char *widget_name); +GtkWidget * linphone_gtk_create_assistant(void); LinphoneCore *linphone_gtk_get_core(void); GtkWidget *linphone_gtk_get_main_window(); diff --git a/gtk/main.c b/gtk/main.c index 1eec9173a..3f61a3df4 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -50,6 +50,7 @@ const char *this_program_ident_string="linphone_ident_string=" LINPHONE_VERSION; static LinphoneCore *the_core=NULL; static GtkWidget *the_ui=NULL; +GtkWidget *the_wizard=NULL; static void linphone_gtk_registration_state_changed(LinphoneCore *lc, LinphoneProxyConfig *cfg, LinphoneRegistrationState rs, const char *msg); static void linphone_gtk_notify_recv(LinphoneCore *lc, LinphoneFriend * fid); @@ -1416,8 +1417,9 @@ static void linphone_gtk_configure_main_window(){ g_object_unref(G_OBJECT(pbuf)); } } - if (linphone_gtk_can_manage_accounts()) + if (linphone_gtk_can_manage_accounts()) { gtk_widget_show(linphone_gtk_get_widget(w,"assistant_item")); + } if (update_check_menu){ gtk_widget_show(linphone_gtk_get_widget(w,"versioncheck_item")); } @@ -1561,6 +1563,13 @@ static void linphone_gtk_check_soundcards(){ } } +// Display the account wizard +void linphone_gtk_display_wizard() { + if (the_wizard == NULL || !gtk_widget_get_visible(the_wizard)) { // Only one instance of the wizard at the same time + the_wizard = linphone_gtk_create_assistant(); + } +} + static void linphone_gtk_quit(void){ linphone_gtk_uninit_instance(); linphone_gtk_destroy_log_window(); @@ -1699,6 +1708,12 @@ int main(int argc, char *argv[]){ gtk_timeout_add(30,(GtkFunction)linphone_gtk_iterate,(gpointer)linphone_gtk_get_core()); gtk_timeout_add(30,(GtkFunction)linphone_gtk_check_logs,(gpointer)NULL); linphone_gtk_init_main_window(); + + // Veryfing if at least one sip account is configured. If not, show wizard + if (linphone_core_get_proxy_config_list(linphone_gtk_get_core()) == NULL) { + linphone_gtk_display_wizard(); + } + #ifndef HAVE_GTK_OSX linphone_gtk_init_status_icon(); #endif diff --git a/gtk/main.ui b/gtk/main.ui index 9c393b54c..2fe36aa5d 100644 --- a/gtk/main.ui +++ b/gtk/main.ui @@ -333,6 +333,11 @@ False gtk-clear + + True + False + gtk-connect + True False @@ -504,6 +509,16 @@ + + + Account assistant + False + False + image12 + False + + + diff --git a/gtk/parameters.ui b/gtk/parameters.ui index 3bec2e63e..004e49edd 100644 --- a/gtk/parameters.ui +++ b/gtk/parameters.ui @@ -1,6 +1,7 @@ + 500 3001 @@ -213,6 +214,8 @@ True False False + True + True adjustment1 @@ -330,6 +333,8 @@ True False False + True + True adjustment7 @@ -346,6 +351,8 @@ True False False + True + True adjustment2 @@ -365,6 +372,8 @@ True False False + True + True adjustment3 @@ -504,6 +513,8 @@ GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False + True + True @@ -574,6 +585,8 @@ GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False + True + True @@ -741,6 +754,8 @@ GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False + True + True @@ -1091,6 +1106,8 @@ GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False + True + True @@ -1129,6 +1146,8 @@ GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False + True + True @@ -1146,6 +1165,8 @@ False False False + True + True 1 @@ -1216,6 +1237,53 @@ True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + True + True + False + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + gtk-add + + + True + True + 0 + + + + + True + False + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Wizard + + + True + True + 1 + + + + + + + False + False + 0 + + True @@ -1261,7 +1329,7 @@ False False - 0 + 1 @@ -1309,7 +1377,7 @@ False False - 1 + 2 @@ -1357,7 +1425,7 @@ False False - 2 + 3 @@ -1401,7 +1469,7 @@ virtual network ! False False - 3 + 4 @@ -1826,6 +1894,8 @@ virtual network ! 0 stands for "unlimited" False False + True + True adjustment5 @@ -1846,6 +1916,8 @@ virtual network ! 0 stands for "unlimited" False False + True + True adjustment6 diff --git a/gtk/setupwizard.c b/gtk/setupwizard.c index e5f8702f2..7f22af388 100644 --- a/gtk/setupwizard.c +++ b/gtk/setupwizard.c @@ -18,8 +18,19 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "linphone.h" +#include +#include LinphoneAccountCreator *linphone_gtk_assistant_get_creator(GtkWidget*w); +const int PASSWORD_MIN_SIZE = 6; +const int LOGIN_MIN_SIZE = 4; +int is_username_available = 0; +int is_email_correct = 0; +int is_password_correct = 0; + +GdkPixbuf *ok; +GdkPixbuf *notok; + static GtkWidget *create_intro(){ GtkWidget *vbox=gtk_vbox_new(FALSE,2); GtkWidget *label=gtk_label_new(_("Welcome !\nThis assistant will help you to use a SIP account for your calls.")); @@ -31,83 +42,277 @@ static GtkWidget *create_intro(){ static GtkWidget *create_setup_signin_choice(){ GtkWidget *vbox=gtk_vbox_new(FALSE,2); - GtkWidget *t1=gtk_radio_button_new_with_label(NULL,_("Create an account by choosing a username")); - GtkWidget *t2=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(t1),_("I have already an account and just want to use it")); + GtkWidget *t1=gtk_radio_button_new_with_label(NULL,_("Create an account on linphone.org")); + GtkWidget *t2=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(t1),_("I have already a linphone.org account and I just want to use it")); + GtkWidget *t3=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(t1),_("I have already a sip account and I just want to use it")); gtk_box_pack_start (GTK_BOX (vbox), t1, TRUE, TRUE, 2); gtk_box_pack_start (GTK_BOX (vbox), t2, TRUE, TRUE, 2); + gtk_box_pack_start (GTK_BOX (vbox), t3, TRUE, TRUE, 2); gtk_widget_show_all(vbox); g_object_set_data(G_OBJECT(vbox),"create_account",t1); - g_object_set_data(G_OBJECT(vbox),"setup_account",t2); + g_object_set_data(G_OBJECT(vbox),"setup_linphone_account",t2); + g_object_set_data(G_OBJECT(vbox),"setup_account",t3); return vbox; } -static void create_username_changed(GtkEntry *entry, GtkWidget *w){ - GtkWidget *assistant=gtk_widget_get_toplevel(w); - gtk_assistant_set_page_complete(GTK_ASSISTANT(assistant),w, - gtk_entry_get_text_length(entry)>=3); -} +static int all_account_information_entered(GtkWidget *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")); -static GtkWidget *create_username_chooser(){ - GtkWidget *vbox=gtk_vbox_new(FALSE,2); - GtkWidget *hbox=gtk_hbox_new(FALSE,2); - GtkWidget *label=gtk_label_new(_("Please choose a username:")); - GtkWidget *label2=gtk_label_new(_("Username:")); - GtkWidget *label3=gtk_label_new(NULL); - GtkWidget *entry=gtk_entry_new(); - gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 2); - gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 2); - gtk_box_pack_start (GTK_BOX (hbox), label2, TRUE, TRUE, 2); - gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 2); - gtk_box_pack_start (GTK_BOX (vbox), label3, TRUE, TRUE, 2); - gtk_widget_show_all(vbox); - g_object_set_data(G_OBJECT(vbox),"username",entry); - g_object_set_data(G_OBJECT(vbox),"errorstring",label3); - g_signal_connect(G_OBJECT(entry),"changed",(GCallback)create_username_changed,vbox); - return vbox; -} - -static GtkWidget *create_username_checking_page(){ - GtkWidget *vbox=gtk_vbox_new(FALSE,2); - GtkWidget *label=gtk_label_new(NULL); - GtkWidget *progress=gtk_progress_bar_new(); - gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 2); - gtk_box_pack_start (GTK_BOX (vbox), progress, TRUE, TRUE, 2); - g_object_set_data(G_OBJECT(vbox),"label",label); - g_object_set_data(G_OBJECT(vbox),"progress",progress); - gtk_widget_show_all(vbox); - return vbox; -} - -static void *progress_bar_update(LinphoneCore *lc, void *ctx, LinphoneWaitingState ws, const char *purpose, float progress){ - GtkWidget *pb=(GtkWidget*)ctx; - if (ws==LinphoneWaitingProgress) gtk_progress_bar_pulse(GTK_PROGRESS_BAR(pb)); - else if (ws==LinphoneWaitingFinished) gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pb),1); - return ctx; -} - -static void check_username(GtkWidget *page){ - GtkWidget *progress=(GtkWidget*)g_object_get_data(G_OBJECT(page),"progress"); - GtkWidget *label=(GtkWidget*)g_object_get_data(G_OBJECT(page),"label"); - LinphoneAccountCreator *creator=linphone_gtk_assistant_get_creator(gtk_widget_get_toplevel(page)); - gchar *text=g_strdup_printf(_("Checking if '%s' is available..."),linphone_account_creator_get_username(creator)); - LinphoneAccountCreator *c=linphone_gtk_assistant_get_creator(gtk_widget_get_toplevel(page)); - int res; - gtk_label_set_text(GTK_LABEL(label),text); - g_free(text); - gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress),_("Please wait...")); - linphone_core_set_waiting_callback(linphone_gtk_get_core(),progress_bar_update,progress); - res=linphone_account_creator_test_existence(c); - if (res==1){ - gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress),_("Sorry this username already exists. Please try a new one.")); - }else if (res==0){ - gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress),_("Ok !")); - gtk_assistant_set_page_complete(GTK_ASSISTANT(gtk_widget_get_toplevel(page)),page,TRUE); - }else if (res==-1){ - gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress),_("Communication problem, please try again later.")); + 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("^(sip:)?([a-z0-9]+([\\.-][a-z0-9]+)*)+\\.[a-z]{2,}$", gtk_entry_get_text(domain), 0, 0)) { + return 1; } - linphone_core_set_waiting_callback(linphone_gtk_get_core(),linphone_gtk_wait,NULL); + return 0; } +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), "@")+1); + } + + gtk_assistant_set_page_complete(GTK_ASSISTANT(assistant),w, + all_account_information_entered(w)>0); +} + +static void linphone_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")); + + gtk_assistant_set_page_complete(GTK_ASSISTANT(assistant),w, + gtk_entry_get_text_length(username) >= LOGIN_MIN_SIZE); +} + +static GtkWidget *create_linphone_account_informations_page() { + GtkWidget *vbox=gtk_table_new(3, 2, TRUE); + GtkWidget *label=gtk_label_new(_("Enter your linphone.org's username")); + + GdkColor color; + gdk_color_parse ("red", &color); + GtkWidget *labelEmpty=gtk_label_new(NULL); + gtk_widget_modify_fg(labelEmpty, GTK_STATE_NORMAL, &color); + + GtkWidget *labelUsername=gtk_label_new(_("Username:")); + GtkWidget *entryUsername=gtk_entry_new(); + GtkWidget *labelPassword=gtk_label_new(_("Password:")); + GtkWidget *entryPassword=gtk_entry_new(); + gtk_entry_set_visibility(GTK_ENTRY(entryPassword), FALSE); + + 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), 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_widget_show_all(vbox); + 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),"errorstring",labelEmpty); + g_signal_connect(G_OBJECT(entryUsername),"changed",(GCallback)linphone_account_informations_changed,vbox); + return vbox; +} + +static GtkWidget *create_account_informations_page() { + GtkWidget *vbox=gtk_table_new(6, 2, FALSE); + GtkWidget *label=gtk_label_new(_("Enter your account informations")); + + GdkColor color; + gdk_color_parse ("red", &color); + 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(_("exemple: user@sip.linphone.org")); + 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(_("exemple: sip.linphone.org")); + GtkWidget *labelRoute=gtk_label_new(_("Route (optional):")); + 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), 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), entryRoute, 1, 2, 4, 5); + gtk_table_attach_defaults(GTK_TABLE(vbox), labelEmpty, 0, 2, 5, 6); + gtk_widget_show_all(vbox); + + 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),"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); + g_signal_connect(G_OBJECT(entryRoute),"changed",(GCallback)account_informations_changed,vbox); + + return vbox; +} + +static int create_account(GtkWidget *page) { + LinphoneAccountCreator *creator=linphone_gtk_assistant_get_creator(gtk_widget_get_toplevel(page)); + LinphoneProxyConfig *res=linphone_account_creator_validate(creator); + if (res) { + if (!g_regex_match_simple("^sip:[a-zA-Z]+[a-zA-Z0-9.\\-_]{2,}@sip.linphone.org$",creator->username, 0, 0)) { + gchar identity[128]; + g_sprintf(identity, "sip:%s@sip.linphone.org", creator->username); + linphone_account_creator_set_username(creator, identity); + linphone_account_creator_set_domain(creator, "sip:sip.linphone.org"); + } + return 1; + } + return 0; +} + +static int is_account_information_correct(GtkWidget *w) { + if (is_username_available == 1 && is_email_correct == 1 && is_password_correct == 1) { + return 1; + } + return 0; +} + +static void account_email_changed(GtkEntry *entry, GtkWidget *w) { + // Verifying if email entered is correct, and if form is correctly filled, let the user go next page + + GtkEntry* email = GTK_ENTRY(g_object_get_data(G_OBJECT(w),"email")); + GtkImage* isEmailOk = GTK_IMAGE(g_object_get_data(G_OBJECT(w),"emailOk")); + 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; + gtk_image_set_from_pixbuf(isEmailOk, ok); + } + else { + is_email_correct = 0; + gtk_image_set_from_pixbuf(isEmailOk, notok); + } + gtk_assistant_set_page_complete(GTK_ASSISTANT(assistant),w, + is_account_information_correct(w)>0); +} + +static void account_password_changed(GtkEntry *entry, GtkWidget *w) { + // Verifying if passwords entered match, and if form is correctly filled, let the user go next page + + GtkEntry* password = GTK_ENTRY(g_object_get_data(G_OBJECT(w),"password")); + 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); + + 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; + gtk_image_set_from_pixbuf(isPasswordOk, ok); + } + else { + is_password_correct = 0; + gtk_image_set_from_pixbuf(isPasswordOk, notok); + } + gtk_assistant_set_page_complete(GTK_ASSISTANT(assistant),w, + is_account_information_correct(w)>0); +} + +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); + GtkEntry* username = GTK_ENTRY(g_object_get_data(G_OBJECT(w),"username")); + GtkImage* isUsernameOk = GTK_IMAGE(g_object_get_data(G_OBJECT(w),"usernameOk")); + + 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); + } + else { + is_username_available = 0; + gtk_image_set_from_pixbuf(isUsernameOk, notok); + } + + gtk_assistant_set_page_complete(GTK_ASSISTANT(assistant),w, + is_account_information_correct(w)>0); +} + +static GtkWidget *create_account_information_page() { + GtkWidget *vbox=gtk_table_new(7, 3, FALSE); + + GtkWidget *label=gtk_label_new(_("(*) Required fields")); + GtkWidget *labelUsername=gtk_label_new(_("Username: (*)")); + GtkWidget *isUsernameOk=gtk_image_new_from_pixbuf(notok); + GtkWidget *labelPassword=gtk_label_new(_("Password: (*)")); + GtkWidget *isPasswordOk=gtk_image_new_from_pixbuf(notok); + GtkWidget *labelEmail=gtk_label_new(_("Email: (*)")); + GtkWidget *isEmailOk=gtk_image_new_from_pixbuf(notok); + GtkWidget *labelPassword2=gtk_label_new(_("Confirm your password: (*)")); + GtkWidget *entryUsername=gtk_entry_new(); + GtkWidget *entryPassword=gtk_entry_new(); + gtk_entry_set_visibility(GTK_ENTRY(entryPassword), FALSE); + GtkWidget *entryEmail=gtk_entry_new(); + GtkWidget *entryPassword2=gtk_entry_new(); + gtk_entry_set_visibility(GTK_ENTRY(entryPassword2), FALSE); + GtkWidget *checkNewsletter=gtk_check_button_new_with_label("Keep me informed with linphone updates"); + + 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); + gtk_box_pack_start (GTK_BOX (passwordVbox1), labelPassword2, TRUE, FALSE, 2); + gtk_box_pack_start (GTK_BOX (passwordVbox2), entryPassword, TRUE, FALSE, 2); + gtk_box_pack_start (GTK_BOX (passwordVbox2), entryPassword2, TRUE, FALSE, 2); + + gtk_table_attach_defaults(GTK_TABLE(vbox), label, 0, 3, 0, 1); + gtk_table_attach_defaults(GTK_TABLE(vbox), labelEmail, 0, 1, 1, 2); + gtk_table_attach_defaults(GTK_TABLE(vbox), entryEmail, 1, 2, 1, 2); + gtk_table_attach_defaults(GTK_TABLE(vbox), isEmailOk, 2, 3, 1, 2); + gtk_table_attach_defaults(GTK_TABLE(vbox), labelUsername, 0, 1, 2, 3); + gtk_table_attach_defaults(GTK_TABLE(vbox), entryUsername, 1, 2, 2, 3); + gtk_table_attach_defaults(GTK_TABLE(vbox), isUsernameOk, 2, 3, 2, 3); + 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_widget_show_all(vbox); + 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),"email",entryEmail); + g_object_set_data(G_OBJECT(vbox),"usernameOk",isUsernameOk); + g_object_set_data(G_OBJECT(vbox),"passwordOk",isPasswordOk); + 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_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); + g_signal_connect(G_OBJECT(entryPassword2),"changed",(GCallback)account_password_changed,vbox); + return vbox; +} + +/* static GtkWidget *create_confirmation_page(){ GtkWidget *vbox=gtk_vbox_new(FALSE,2); GtkWidget *label=gtk_label_new(NULL); @@ -116,15 +321,15 @@ static GtkWidget *create_confirmation_page(){ gtk_widget_show_all(vbox); return vbox; } +*/ + +static GtkWidget *create_error_page(){ + GtkWidget *vbox=gtk_table_new(2, 1, FALSE); + GtkWidget *label=gtk_label_new(_("Error, account not validated, username already used or server unreachable.\nPlease go back and try again.")); + + gtk_table_attach(GTK_TABLE(vbox), label, 0, 1, 0, 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND, 0, 100); -static GtkWidget *create_creation_page(){ - GtkWidget *vbox=gtk_vbox_new(FALSE,2); - GtkWidget *label=gtk_label_new(NULL); - GtkWidget *progress=gtk_progress_bar_new(); - gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 2); - gtk_box_pack_start (GTK_BOX (vbox), progress, TRUE, TRUE, 2); g_object_set_data(G_OBJECT(vbox),"label",label); - g_object_set_data(G_OBJECT(vbox),"progress",progress); gtk_widget_show_all(vbox); return vbox; } @@ -137,61 +342,130 @@ static GtkWidget *create_finish_page(){ return vbox; } +static GtkWidget *wait_for_activation() { + GtkWidget *vbox=gtk_table_new(2, 1, FALSE); + GtkWidget *label=gtk_label_new(_("Please validate your account by clicking on the link we just sent you by email.\n" + "Then come back here and press Next button.")); + + gtk_table_attach(GTK_TABLE(vbox), label, 0, 1, 0, 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND, 0, 100); + + g_object_set_data(G_OBJECT(vbox),"label",label); + gtk_widget_show_all(vbox); + return vbox; +} + +int is_account_validated(GtkWidget *page) { + LinphoneAccountCreator *creator=linphone_gtk_assistant_get_creator(gtk_widget_get_toplevel(page)); + return linphone_account_creator_test_validation(creator); +} + static void linphone_gtk_assistant_closed(GtkWidget *w){ gtk_widget_destroy(w); } +static void linphone_gtk_assistant_prepare(GtkWidget *assistant, GtkWidget *page){ + int pagenum=gtk_assistant_get_current_page(GTK_ASSISTANT(assistant)); + + if (pagenum == 5) { + gtk_assistant_commit(GTK_ASSISTANT(assistant)); + } else if (pagenum == gtk_assistant_get_n_pages(GTK_ASSISTANT(assistant)) - 1) { + // Saving the account and making it default + LinphoneAccountCreator *creator=linphone_gtk_assistant_get_creator(assistant); + LinphoneProxyConfig *cfg=linphone_proxy_config_new(); + linphone_proxy_config_set_identity(cfg, creator->username); + linphone_proxy_config_set_server_addr(cfg, creator->domain); + linphone_proxy_config_set_route(cfg, creator->route); + linphone_proxy_config_expires(cfg, 3600); + linphone_proxy_config_enable_publish(cfg, FALSE); + linphone_proxy_config_enable_register(cfg, TRUE); + + gchar *username = creator->username + 4; + const gchar *needle = "@"; + username = g_strndup(username, (g_strrstr(username, needle) - username)); + gchar domain[128]; + g_sprintf(domain, "\"%s\"", creator->domain + 4); + LinphoneAuthInfo *info=linphone_auth_info_new(username, username, creator->password, NULL, domain); + linphone_core_add_auth_info(linphone_gtk_get_core(),info); + + if (linphone_core_add_proxy_config(linphone_gtk_get_core(),cfg)==-1) + return; + + linphone_core_set_default_proxy(linphone_gtk_get_core(),cfg); + linphone_gtk_load_identities(); + } +} + static int linphone_gtk_assistant_forward(int curpage, gpointer data){ GtkWidget *w=(GtkWidget*)data; GtkWidget *box=gtk_assistant_get_nth_page(GTK_ASSISTANT(w),curpage); if (curpage==1){ GtkWidget *create_button=(GtkWidget*)g_object_get_data(G_OBJECT(box),"create_account"); - if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(create_button))){ - g_error("Not implemented yet..."); + GtkWidget *setup_linphone_account=(GtkWidget*)g_object_get_data(G_OBJECT(box),"setup_linphone_account"); + GtkWidget *setup_account=(GtkWidget*)g_object_get_data(G_OBJECT(box),"setup_account"); + + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(create_button))) { + curpage += 3; // Going to P33 } - }else if (curpage==2){ + else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(setup_linphone_account))) { + curpage += 2; // Going to P32 + } + else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(setup_account))) { + curpage += 1; // Going to P31 + } + } + else if (curpage == 2) { // Account's informations entered LinphoneAccountCreator *c=linphone_gtk_assistant_get_creator(w); - linphone_account_creator_set_username(c,gtk_entry_get_text(GTK_ENTRY(g_object_get_data(G_OBJECT(box),"username")))); - } - return curpage+1; -} + 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_sprintf(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")))); + } -static void linphone_gtk_assistant_apply(GtkWidget *w){ - LinphoneAccountCreator *creator=linphone_gtk_assistant_get_creator(w); - GtkWidget *page=gtk_assistant_get_nth_page(GTK_ASSISTANT(w),gtk_assistant_get_current_page(GTK_ASSISTANT(w))); - GtkWidget *progress=(GtkWidget*)g_object_get_data(G_OBJECT(page),"progress"); - LinphoneProxyConfig *res; - gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress),_("Please wait...")); - linphone_core_set_waiting_callback(linphone_gtk_get_core(),progress_bar_update,progress); - res=linphone_account_creator_validate(creator); - if (res){ - gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress),_("Ok !")); - gtk_assistant_set_page_complete(GTK_ASSISTANT(w),page,TRUE); - }else{ - gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress),_("Communication problem, please try again later.")); + 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_sprintf(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")))); + 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 } - linphone_core_set_waiting_callback(linphone_gtk_get_core(),linphone_gtk_wait,NULL); - if (res) linphone_core_add_proxy_config(linphone_gtk_get_core(),res); - gtk_assistant_set_page_complete(GTK_ASSISTANT(w),page,TRUE); -} - -static void linphone_gtk_assistant_prepare(GtkWidget *assistant, GtkWidget *page){ - int pagenum=gtk_assistant_get_current_page(GTK_ASSISTANT(assistant)); - if (pagenum==3){ - check_username(page); - }else if (pagenum==4){ - GtkWidget *label=(GtkWidget*)g_object_get_data(G_OBJECT(page),"label"); - LinphoneAccountCreator *creator=linphone_gtk_assistant_get_creator(assistant); - gchar *text=g_strdup_printf("You have choosen '%s' as username.\nDo you confirm the creation of the account ?",linphone_account_creator_get_username(creator)); - gtk_label_set_text(GTK_LABEL(label),text); - g_free(text); - }else if (pagenum==5){ - GtkWidget *label=(GtkWidget*)g_object_get_data(G_OBJECT(page),"label"); - LinphoneAccountCreator *creator=linphone_gtk_assistant_get_creator(assistant); - gchar *text=g_strdup_printf("Account creation in progress for '%s'",linphone_account_creator_get_username(creator)); - gtk_label_set_text(GTK_LABEL(label),text); - g_free(text); + else if (curpage == 3) { // Linphone Account's informations entered + LinphoneAccountCreator *c=linphone_gtk_assistant_get_creator(w); + gchar identity[128]; + g_sprintf(identity, "sip:%s@sip.linphone.org", gtk_entry_get_text(GTK_ENTRY(g_object_get_data(G_OBJECT(box),"username")))); + linphone_account_creator_set_username(c, identity); + linphone_account_creator_set_domain(c, "sip:sip.linphone.org"); + 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 } + else if (curpage == 4) { // Password & Email entered + LinphoneAccountCreator *c=linphone_gtk_assistant_get_creator(w); + linphone_account_creator_set_username(c, gtk_entry_get_text(GTK_ENTRY(g_object_get_data(G_OBJECT(box),"username")))); + linphone_account_creator_set_password(c,gtk_entry_get_text(GTK_ENTRY(g_object_get_data(G_OBJECT(box),"password")))); + linphone_account_creator_set_email(c,gtk_entry_get_text(GTK_ENTRY(g_object_get_data(G_OBJECT(box),"email")))); + linphone_account_creator_set_suscribe(c,gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g_object_get_data(G_OBJECT(box),"newsletter")))); + if (create_account(w) == 1) { + curpage += 1; + } else { // Error when attempting to create the account + curpage += 2; + } + } + else if (curpage == 5) { // Waiting for account validation + if (is_account_validated(w) == 1) { + curpage += 2; // Going to the last page + } else { + curpage += 1; + } + } + else { + curpage += 1; + } + return curpage; } static LinphoneAccountCreator * linphone_gtk_assistant_init(GtkWidget *w){ @@ -214,12 +488,19 @@ LinphoneAccountCreator *linphone_gtk_assistant_get_creator(GtkWidget*w){ GtkWidget * linphone_gtk_create_assistant(void){ GtkWidget *w=gtk_assistant_new(); + gtk_window_set_resizable (GTK_WINDOW(w), FALSE); + + ok = create_pixbuf(linphone_gtk_get_ui_config("ok","ok.png")); + notok = create_pixbuf(linphone_gtk_get_ui_config("notok","notok.png")); + GtkWidget *p1=create_intro(); GtkWidget *p2=create_setup_signin_choice(); - GtkWidget *p3=create_username_chooser(); - GtkWidget *checking=create_username_checking_page(); - GtkWidget *confirm=create_confirmation_page(); - GtkWidget *creation=create_creation_page(); + GtkWidget *p31=create_account_informations_page(); + GtkWidget *p32=create_linphone_account_informations_page(); + GtkWidget *p33=create_account_information_page(); + //GtkWidget *confirm=create_confirmation_page(); + GtkWidget *validate=wait_for_activation(); + GtkWidget *error=create_error_page(); GtkWidget *end=create_finish_page(); linphone_gtk_assistant_init(w); @@ -227,38 +508,50 @@ GtkWidget * linphone_gtk_create_assistant(void){ gtk_assistant_set_page_type(GTK_ASSISTANT(w),p1,GTK_ASSISTANT_PAGE_INTRO); gtk_assistant_set_page_title(GTK_ASSISTANT(w),p1,_("Welcome to the account setup assistant")); gtk_assistant_set_page_complete(GTK_ASSISTANT(w),p1,TRUE); + gtk_assistant_append_page(GTK_ASSISTANT(w),p2); gtk_assistant_set_page_type(GTK_ASSISTANT(w),p2,GTK_ASSISTANT_PAGE_CONTENT); gtk_assistant_set_page_title(GTK_ASSISTANT(w),p2,_("Account setup assistant")); gtk_assistant_set_page_complete(GTK_ASSISTANT(w),p2,TRUE); - gtk_assistant_append_page(GTK_ASSISTANT(w),p3); - gtk_assistant_set_page_type(GTK_ASSISTANT(w),p3,GTK_ASSISTANT_PAGE_CONTENT); - gtk_assistant_set_page_title(GTK_ASSISTANT(w),p3,_("Choosing a username")); - - gtk_assistant_append_page(GTK_ASSISTANT(w),checking); - gtk_assistant_set_page_type(GTK_ASSISTANT(w),checking,GTK_ASSISTANT_PAGE_PROGRESS); - gtk_assistant_set_page_title(GTK_ASSISTANT(w),checking,_("Verifying")); - - gtk_assistant_append_page(GTK_ASSISTANT(w),confirm); - gtk_assistant_set_page_type(GTK_ASSISTANT(w),confirm,GTK_ASSISTANT_PAGE_CONFIRM); - gtk_assistant_set_page_title(GTK_ASSISTANT(w),confirm,_("Confirmation")); - gtk_assistant_set_page_complete(GTK_ASSISTANT(w),confirm,TRUE); - gtk_assistant_append_page(GTK_ASSISTANT(w),creation); - gtk_assistant_set_page_type(GTK_ASSISTANT(w),creation,GTK_ASSISTANT_PAGE_PROGRESS); - gtk_assistant_set_page_title(GTK_ASSISTANT(w),creation,_("Creating your account")); + gtk_assistant_append_page(GTK_ASSISTANT(w),p31); + gtk_assistant_set_page_type(GTK_ASSISTANT(w),p31,GTK_ASSISTANT_PAGE_CONFIRM); + gtk_assistant_set_page_complete(GTK_ASSISTANT(w),p31,FALSE); + gtk_assistant_set_page_title(GTK_ASSISTANT(w),p31,_("Configure your account (step 1/1)")); + + gtk_assistant_append_page(GTK_ASSISTANT(w),p32); + gtk_assistant_set_page_type(GTK_ASSISTANT(w),p32,GTK_ASSISTANT_PAGE_CONFIRM); + gtk_assistant_set_page_complete(GTK_ASSISTANT(w),p32,FALSE); + gtk_assistant_set_page_title(GTK_ASSISTANT(w),p32,_("Enter your sip username (step 1/1)")); + + gtk_assistant_append_page(GTK_ASSISTANT(w),p33); + gtk_assistant_set_page_type(GTK_ASSISTANT(w),p33,GTK_ASSISTANT_PAGE_CONFIRM); + gtk_assistant_set_page_title(GTK_ASSISTANT(w),p33,_("Enter account information (step 1/2)")); + + /*gtk_assistant_append_page(GTK_ASSISTANT(w),confirm); + gtk_assistant_set_page_type(GTK_ASSISTANT(w),confirm,GTK_ASSISTANT_PAGE_CONFIRM); + gtk_assistant_set_page_title(GTK_ASSISTANT(w),confirm,_("Confirmation (step 2/2)")); + gtk_assistant_set_page_complete(GTK_ASSISTANT(w),confirm,TRUE);*/ + + gtk_assistant_append_page(GTK_ASSISTANT(w),validate); + gtk_assistant_set_page_type(GTK_ASSISTANT(w),validate,GTK_ASSISTANT_PAGE_CONTENT); + gtk_assistant_set_page_title(GTK_ASSISTANT(w),validate,_("Validation (step 2/2)")); + gtk_assistant_set_page_complete(GTK_ASSISTANT(w),validate,TRUE); + + gtk_assistant_append_page(GTK_ASSISTANT(w),error); + gtk_assistant_set_page_type(GTK_ASSISTANT(w),error,GTK_ASSISTANT_PAGE_CONTENT); + gtk_assistant_set_page_title(GTK_ASSISTANT(w),error,_("Error")); gtk_assistant_append_page(GTK_ASSISTANT(w),end); gtk_assistant_set_page_type(GTK_ASSISTANT(w),end,GTK_ASSISTANT_PAGE_SUMMARY); - gtk_assistant_set_page_title(GTK_ASSISTANT(w),end,_("Now ready !")); - + gtk_assistant_set_page_title(GTK_ASSISTANT(w),end,_("Terminating")); + gtk_assistant_set_forward_page_func(GTK_ASSISTANT(w),linphone_gtk_assistant_forward,w,NULL); g_signal_connect(G_OBJECT(w),"close",(GCallback)linphone_gtk_assistant_closed,NULL); g_signal_connect(G_OBJECT(w),"cancel",(GCallback)linphone_gtk_assistant_closed,NULL); - g_signal_connect(G_OBJECT(w),"apply",(GCallback)linphone_gtk_assistant_apply,NULL); g_signal_connect(G_OBJECT(w),"prepare",(GCallback)linphone_gtk_assistant_prepare,NULL); + gtk_widget_show(w); - + return w; } - diff --git a/pixmaps/Makefile.am b/pixmaps/Makefile.am index 60194fcd8..4e7c56ed6 100644 --- a/pixmaps/Makefile.am +++ b/pixmaps/Makefile.am @@ -14,6 +14,8 @@ status-offline.png \ contact-orange.png dialer-orange.png history-orange.png\ startcall-green.png stopcall-red.png addcall-green.png linphone.icns \ contact_starred.png contact_unstarred.png \ -speaker.png +speaker.png \ +ok.png \ +notok.png EXTRA_DIST=$(pixmap_DATA) diff --git a/pixmaps/notok.png b/pixmaps/notok.png new file mode 100644 index 0000000000000000000000000000000000000000..84813bc2d7452bdc7d4875a9489b8c71cb4c5913 GIT binary patch literal 2023 zcmVi-m!k{Ltv5$!% z){c)Ut@ucap|D62t?!^%Oh=>g5CkH`2g@RKVcq4mFW_GG?wyjGc#$ra)nJN zPg0+h#9hF_J%I1G0nffLZyxPmf6b9*EGlBYR@?a(V8s)d$LA=O&A0aNCrJ*H^pJFR zbg(!rjqd|_y8+cx!S%pzFT};sWi-mDmrqc7b2UBf^0TqHn0Z>Q^)Qe&>~jE!&rv8^ z>W07_-Bubm{fMR``zexiSuE72rt){d;az}wRPaxLjpt)y>AZWFBykNWF_9z(RI(Oe27?PfFcQd0OH z@Xn|K90RVm7JnjxmmQ~+6ijgz*gqe1Oa<+07Emy?kRC8p_JJQ=@4ZiTPM#C{(IQT}%uBz769#xZ zfHwe;Dr?~0ycV8=CotpHS0M>PxL~&z_t? zh8wM?lZLfvtQ!y3O#y4d!K!fZnii~>8%@)VtCUDqfAkS|`1t%|tnN=N^z(aYEGm*a z+0st?kCWLIE`yt6K~pUFAQWs{nLtN-8y!vu4eM7tN_$N>STz~E<_}iPiJ_^gf)dH5 z(o%j99NhnFAbrd!$OqE$wOXsOxR@jDZd}g# zfXA6%*MSwYBWb!>PKl)9@@4LtIMKBo*!WC)AP-oPr`2{EhBDD_dO-841h$0A;7!xO zd(*&%iQrcuVEqvDn?uaYpO2!c{JIP-GZ)?kUVkR=VLJ>gJ*-w+?iUuy9o}kS+e`C# zKLorR1vW;4Uqy^adpLMa2UffgNmErh-6WeXU1D}fi1V45f71>Diw^Voi;k#3T=3JSPgt+u>9hJY!b^fDKS_b8Pomh9UX9lv!e zT=rgAfBp(w7s`MDnY9OiGyu3ofWCm&3s4R887#0>UWexUixItSIYOpQ)7`mvF+Ew5 z>dS%Vrv`8Ui1#QICx5Va@3i?@S#b4q!kV!GeHY7sKpEIWV9*YzVq>9or< zswt4Xw0k!<10|zQfse0mTJ+kra0BRkCj+kIrLwRLb^D+VP)0@};^QJrTKFO!oIQ&> zdObpC&BpY?W6&nVL3GKb@OS}*8nD*Zqb_4JdV6{>bMHI11!B{<@-US>w zmYPbZ#X^y!A$KpUQj#A@>XU@!Z6NKJety=QMMbhtbq$XvC-d)by+x}a(B^RR$hvjh z1e|&k2pDq#?FUrv19^pMX>^#)6iC|oTq7m*iNdlCSh3CDzq7KSfC5Q#XD7P_fi}CH zN7k?BCg99wVBAypKq=r&2TCk0Et5<)ZX^arMM3HD;NF=tIGd5-boKQ7?Dv5Fn|?Qd z=7o}UtMUB#l`4%!7Zer-yU~b~nVGnG=FBO7;Ppemf7E}}ACujHS^%~ve0?{l0s|-Y zb#*l=fPLA(g|RZ22_%ca4sCGo0%X8O-xS>N=;0u1OP9b1=Ow#sZ9U?002ovPDHLk FV1nEOu(JRF literal 0 HcmV?d00001 diff --git a/pixmaps/ok.png b/pixmaps/ok.png new file mode 100644 index 0000000000000000000000000000000000000000..769986fb79c67b15f7f58082ad0f170fc97c0275 GIT binary patch literal 1373 zcmV-j1)}L_t(o!|j!8Y*bYc$NzKA*}IQ! z%WjLbgi=rftr`*y#TdaL_zEH^!9+9>Lolf&8Za^F7foye8cYm+0VRZIK?^Dn(?EnG zP#{7|RUkwIDUY_iO6ha=?%uukobf|jBc(4NEnl4E1Yx)R4?k5w@yTcB!u%SOH4TMJ6R% zby<6ZA>-luVFf5Tb6=KY>x!!)szyfEB0bh(^0^Q+u5$N;CuE906&GRT~~_ zzCPptD^JZ8zuh{rHh$B*mS|xp3kZ&+%R$Qc^sjzHGKiKPnyhX*7dNIlc%jqA0DwS* z;7^zHzk0r7_mBcC+MDOM_3d)k=6PPCQ(P#(KSJ!=IXC`7PyahwuwYl_xPK%5>YnJx zSn~Eh*XDV~1%x69MNmO%6~p0fN^od82)_T_Ov$#EBxcdjWlmtTCq0zs1O(@RHvv=01;p`cJF#QUe;H9 zPk@usM+D+8=WY(IpT8xV)t`9L=8XK+Rd4-3ir4vqE~mCOoEqSIPKhGT-q*3>2++_yr zCZpLCvnt+*R}C5f0A_y?+?z2*&6WXx*}zLO+&G{ehS9J|BB=aCRv3^0>XD2fNFdha z!D+>Z`x)q(9oNjSWAjHvjdYOo#bBkI?%hydi7XL7P^P1`tqt}qxANia zsUPn{zs2`{0s!#b>d^FXIJ`gqk?}zYMncDs@Y;~nF&LO02?!A@2Vs?ocDohlf4)+$ zC@^L3($-r8s-vGl^z^Dw(Wp^5-%g%Vprq<_V`jJ}12PRuKO zV9Z1c2P5#y5d1QPtJmvMxxey6Mlfr^g@YaXKL-GS+C#Q`r7E@8n%GqJ%bA)-!IXXf z=zM6`VB0qvZ|D@BIau1%@^{7iY{8l}YpA-qnrdrnMO#}NB@zj897njWODgL4vS->0 z)1#qf>EZP84YfDtUfGp)oQPNm0V$>`&Qc71TCBh;-1+b4`n=HaunGf00000NkvXXu0mjfgvWbY literal 0 HcmV?d00001 From 28ad8e0e04521c38afa2fefd268cff75d51dbabe Mon Sep 17 00:00:00 2001 From: Guillaume Beraudo Date: Tue, 29 Nov 2011 17:10:05 +0100 Subject: [PATCH 2/7] Factoring, visibility and security checks in wizard. --- coreapi/sipwizard.c | 181 +++++++++++++++++--------------------------- gtk/setupwizard.c | 39 +++++----- 2 files changed, 88 insertions(+), 132 deletions(-) diff --git a/coreapi/sipwizard.c b/coreapi/sipwizard.c index 0bd654471..ee268e50c 100644 --- a/coreapi/sipwizard.c +++ b/coreapi/sipwizard.c @@ -1,6 +1,6 @@ /* -linphone -Copyright (C) 2011 Simon MORLAT (simon.morlat@linphone.org) +sipwizard.c +Copyright (C) 2011 Belledonne Communication, Grenoble, France This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -30,9 +30,9 @@ typedef struct _BLReq{ ortp_thread_t th; }BLReq; -const int XMLRPC_FAILED = -1; -const int XMLRPC_OK = 0; -const char *XMLRPC_URL = "https://www.linphone.org/wizard.php"; +static const int XMLRPC_FAILED = -1; +static const int XMLRPC_OK = 0; +static const char *XMLRPC_URL = "https://www.linphone.org/wizard.php"; static void sip_wizard_init_instance(SipSetupContext *ctx){ LinphoneProxyConfig *cfg=sip_setup_context_get_proxy_config(ctx); @@ -40,65 +40,12 @@ static void sip_wizard_init_instance(SipSetupContext *ctx){ linphone_proxy_config_enable_register(cfg,FALSE); } -const char ** sip_wizard_get_domains(SipSetupContext *ctx) { +static const char ** sip_wizard_get_domains(SipSetupContext *ctx) { LinphoneProxyConfig *cfg=sip_setup_context_get_proxy_config(ctx); const char **domains = (const char**) &cfg->reg_proxy; return domains; } -static SoupMessage * build_xmlrpc_check_account_request(const char *identity){ - SoupMessage * msg; - - msg=soup_xmlrpc_request_new(XMLRPC_URL, - "check_account", - G_TYPE_STRING, identity, - G_TYPE_INVALID); - if (!msg){ - ms_error("Fail to create SoupMessage !"); - }else{ - SoupBuffer *sb=soup_message_body_flatten(msg->request_body); - ms_message("This is the XML-RPC request we are going to send:\n%s\n",sb->data); - soup_buffer_free(sb); - } - return msg; -} - -static SoupMessage * build_xmlrpc_check_account_validated(const char *identity){ - SoupMessage * msg; - - msg=soup_xmlrpc_request_new(XMLRPC_URL, - "check_account_validated", - G_TYPE_STRING, identity, - G_TYPE_INVALID); - if (!msg){ - ms_error("Fail to create SoupMessage !"); - }else{ - SoupBuffer *sb=soup_message_body_flatten(msg->request_body); - ms_message("This is the XML-RPC request we are going to send:\n%s\n",sb->data); - soup_buffer_free(sb); - } - return msg; -} - -static SoupMessage * build_xmlrpc_create_account_request(const char *identity, const char *passwd, const char *email, int suscribe){ - SoupMessage * msg; - - msg=soup_xmlrpc_request_new(XMLRPC_URL, - "create_account", - G_TYPE_STRING, identity, - G_TYPE_STRING, passwd, - G_TYPE_STRING, email, - G_TYPE_INT, suscribe, - G_TYPE_INVALID); - if (!msg){ - ms_error("Fail to create SoupMessage !"); - }else{ - SoupBuffer *sb=soup_message_body_flatten(msg->request_body); - ms_message("This is the XML-RPC request we are going to send:\n%s\n",sb->data); - soup_buffer_free(sb); - } - return msg; -} static int xml_rpc_parse_response(BLReq *blreq, SoupMessage *sm){ SoupBuffer *sb; @@ -149,7 +96,6 @@ static void * process_xml_rpc_request(void *up){ #endif code=soup_session_send_message(blreq->session,sm); if (code==200){ - ms_message("Got a response from server, yeah !"); xml_rpc_parse_response(blreq,sm); }else{ ms_error("request failed, error-code=%i (%s)",code,soup_status_get_phrase(code)); @@ -161,72 +107,78 @@ static void * process_xml_rpc_request(void *up){ return NULL; } -int sip_wizard_account_exists(SipSetupContext *ctx, const char *uri) { - /* - * Return 1 if account already exists - * 0 if account doesn't exists - * -1 if information isn't available - */ - SoupMessage *sm; - BLReq *req=ms_new0(BLReq, 1); - req->session=soup_session_sync_new(); - sm=build_xmlrpc_check_account_request(uri); - req->msg=sm; - process_xml_rpc_request(req); - if (req->status == XMLRPC_OK) { - return req->result; - } else { +static int do_simple_xmlrpc_request(SoupMessage *msg) { + int ret=-1; + BLReq *req; + + if (!msg){ + ms_error("Fail to create SoupMessage !"); return -1; + }else{ + SoupBuffer *sb=soup_message_body_flatten(msg->request_body); + ms_message("This is the XML-RPC request we are going to send:\n%s\n",sb->data); + soup_buffer_free(sb); } + + req=ms_new0(BLReq, 1); + req->session=soup_session_sync_new(); + req->msg=msg; + + process_xml_rpc_request(req); + + if (req->status == XMLRPC_OK) { + ret=req->result; + } + + // Freeing allocated structures lead to a crash (why?) + //g_free(req->session); + //g_free(msg); + ms_free(req); + + return ret; } -int sip_wizard_account_validated(SipSetupContext *ctx, const char *uri) { - /* - * Return 1 if account already exists - * 0 if account doesn't exists - * -1 if information isn't available - */ - SoupMessage *sm; - BLReq *req=ms_new0(BLReq, 1); - req->session=soup_session_sync_new(); - sm=build_xmlrpc_check_account_validated(uri); - req->msg=sm; - process_xml_rpc_request(req); - - if (req->status == XMLRPC_OK) { - return req->result; - } else { - return -1; - } +/* + * Return 1 if account already exists + * 0 if account doesn't exists + * -1 if information isn't available + */ +static int sip_wizard_account_exists(SipSetupContext *ctx, const char *identity) { + SoupMessage *msg=soup_xmlrpc_request_new(XMLRPC_URL, + "check_account", + G_TYPE_STRING, identity, + G_TYPE_INVALID); + return do_simple_xmlrpc_request(msg); } -int sip_wizard_create_account(SipSetupContext *ctx, const char *uri, const char *passwd, const char *email, int suscribe) { - /* - * Return 0 if account successfully created - * Else return -1 - */ - SoupMessage *sm; - BLReq *req=ms_new0(BLReq, 1); - req->session=soup_session_sync_new(); - sm=build_xmlrpc_create_account_request(uri, passwd, email, suscribe); - req->msg=sm; - process_xml_rpc_request(req); +static int sip_wizard_account_validated(SipSetupContext *ctx, const char *identity) { + SoupMessage *msg=soup_xmlrpc_request_new(XMLRPC_URL, + "check_account_validated", + G_TYPE_STRING, identity, + G_TYPE_INVALID); + return do_simple_xmlrpc_request(msg); +} - if (req->status == XMLRPC_OK) { - return req->result; - } else { - return -1; - } +static int sip_wizard_create_account(SipSetupContext *ctx, const char *identity, const char *passwd, const char *email, int suscribe) { + SoupMessage *msg=soup_xmlrpc_request_new(XMLRPC_URL, + "create_account", + G_TYPE_STRING, identity, + G_TYPE_STRING, passwd, + G_TYPE_STRING, email, + G_TYPE_INT, suscribe, + G_TYPE_INVALID); + return do_simple_xmlrpc_request(msg); } static void guess_display_name(LinphoneAddress *from){ - char *dn=(char*)ms_malloc(strlen(linphone_address_get_username(from))+3); + const char *username=linphone_address_get_username(from); + char *dn=(char*)ms_malloc(strlen(username)+1); const char *it; char *wptr=dn; bool_t begin=TRUE; - bool_t surname=0; - for(it=linphone_address_get_username(from);*it!='\0';++it){ + bool_t surname=FALSE; + for(it=username;*it!='\0';++it){ if (begin){ *wptr=toupper(*it); begin=FALSE; @@ -235,9 +187,12 @@ static void guess_display_name(LinphoneAddress *from){ *wptr=' '; begin=TRUE; surname=TRUE; - }else *wptr=*it; + }else { + *wptr=*it; + } wptr++; } + *wptr='\0'; linphone_address_set_display_name(from,dn); ms_free(dn); } diff --git a/gtk/setupwizard.c b/gtk/setupwizard.c index 7f22af388..b03b1be2d 100644 --- a/gtk/setupwizard.c +++ b/gtk/setupwizard.c @@ -20,16 +20,16 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "linphone.h" #include #include -LinphoneAccountCreator *linphone_gtk_assistant_get_creator(GtkWidget*w); +static LinphoneAccountCreator *linphone_gtk_assistant_get_creator(GtkWidget*w); -const int PASSWORD_MIN_SIZE = 6; -const int LOGIN_MIN_SIZE = 4; -int is_username_available = 0; -int is_email_correct = 0; -int is_password_correct = 0; +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; -GdkPixbuf *ok; -GdkPixbuf *notok; +static GdkPixbuf *ok; +static GdkPixbuf *notok; static GtkWidget *create_intro(){ GtkWidget *vbox=gtk_vbox_new(FALSE,2); @@ -75,7 +75,7 @@ static void account_informations_changed(GtkEntry *entry, GtkWidget *w) { 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), "@")+1); + gtk_entry_set_text(domain, g_strrstr(gtk_entry_get_text(username), needle)+1); } gtk_assistant_set_page_complete(GTK_ASSISTANT(assistant),w, @@ -92,7 +92,7 @@ static void linphone_account_informations_changed(GtkEntry *entry, GtkWidget *w) static GtkWidget *create_linphone_account_informations_page() { GtkWidget *vbox=gtk_table_new(3, 2, TRUE); - GtkWidget *label=gtk_label_new(_("Enter your linphone.org's username")); + GtkWidget *label=gtk_label_new(_("Enter your linphone.org username")); GdkColor color; gdk_color_parse ("red", &color); @@ -129,12 +129,12 @@ static GtkWidget *create_account_informations_page() { gtk_widget_modify_fg(labelEmpty, GTK_STATE_NORMAL, &color); GtkWidget *labelUsername=gtk_label_new(_("Identity:")); - GtkWidget *labelUsernameExemple=gtk_label_new(_("exemple: user@sip.linphone.org")); + GtkWidget *labelUsernameExemple=gtk_label_new(_("example: user@sip.linphone.org")); 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(_("exemple: sip.linphone.org")); + GtkWidget *labelDomainExemple=gtk_label_new(_("example: sip.linphone.org")); GtkWidget *labelRoute=gtk_label_new(_("Route (optional):")); GtkWidget *entryUsername=gtk_entry_new(); GtkWidget *entryDomain=gtk_entry_new(); @@ -179,7 +179,7 @@ static int create_account(GtkWidget *page) { if (res) { if (!g_regex_match_simple("^sip:[a-zA-Z]+[a-zA-Z0-9.\\-_]{2,}@sip.linphone.org$",creator->username, 0, 0)) { gchar identity[128]; - g_sprintf(identity, "sip:%s@sip.linphone.org", creator->username); + g_snprintf(identity, sizeof(identity), "sip:%s@sip.linphone.org", creator->username); linphone_account_creator_set_username(creator, identity); linphone_account_creator_set_domain(creator, "sip:sip.linphone.org"); } @@ -354,7 +354,7 @@ static GtkWidget *wait_for_activation() { return vbox; } -int is_account_validated(GtkWidget *page) { +static int is_account_validated(GtkWidget *page) { LinphoneAccountCreator *creator=linphone_gtk_assistant_get_creator(gtk_widget_get_toplevel(page)); return linphone_account_creator_test_validation(creator); } @@ -383,8 +383,9 @@ static void linphone_gtk_assistant_prepare(GtkWidget *assistant, GtkWidget *page const gchar *needle = "@"; username = g_strndup(username, (g_strrstr(username, needle) - username)); gchar domain[128]; - g_sprintf(domain, "\"%s\"", creator->domain + 4); + 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) @@ -417,7 +418,7 @@ static int linphone_gtk_assistant_forward(int curpage, gpointer data){ 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_sprintf(identity, "sip:%s", gtk_entry_get_text(GTK_ENTRY(g_object_get_data(G_OBJECT(box),"username")))); + 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")))); @@ -425,7 +426,7 @@ static int linphone_gtk_assistant_forward(int curpage, gpointer data){ 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_sprintf(proxy, "sip:%s", gtk_entry_get_text(GTK_ENTRY(g_object_get_data(G_OBJECT(box),"domain")))); + 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")))); @@ -437,7 +438,7 @@ static int linphone_gtk_assistant_forward(int curpage, gpointer data){ else if (curpage == 3) { // Linphone Account's informations entered LinphoneAccountCreator *c=linphone_gtk_assistant_get_creator(w); gchar identity[128]; - g_sprintf(identity, "sip:%s@sip.linphone.org", gtk_entry_get_text(GTK_ENTRY(g_object_get_data(G_OBJECT(box),"username")))); + g_snprintf(identity, sizeof(identity), "sip:%s@sip.linphone.org", gtk_entry_get_text(GTK_ENTRY(g_object_get_data(G_OBJECT(box),"username")))); linphone_account_creator_set_username(c, identity); linphone_account_creator_set_domain(c, "sip:sip.linphone.org"); linphone_account_creator_set_password(c,gtk_entry_get_text(GTK_ENTRY(g_object_get_data(G_OBJECT(box),"password")))); @@ -482,7 +483,7 @@ static LinphoneAccountCreator * linphone_gtk_assistant_init(GtkWidget *w){ return NULL; } -LinphoneAccountCreator *linphone_gtk_assistant_get_creator(GtkWidget*w){ +static LinphoneAccountCreator *linphone_gtk_assistant_get_creator(GtkWidget*w){ return (LinphoneAccountCreator*)g_object_get_data(G_OBJECT(w),"creator"); } From 26afd3a95ac32b363a126673fc9d45fa9b920d11 Mon Sep 17 00:00:00 2001 From: Guillaume Beraudo Date: Fri, 2 Dec 2011 14:50:53 +0100 Subject: [PATCH 3/7] Depend on GTK 2.22 for wizard commit method. --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index d01e698e3..8486fa356 100644 --- a/configure.ac +++ b/configure.ac @@ -136,7 +136,7 @@ AC_ARG_ENABLE(gtk_ui, esac],[gtk_ui=true]) if test "$gtk_ui" = "true" ; then - PKG_CHECK_MODULES(LIBGTK, gtk+-2.0 >= 2.4.0 gthread-2.0) + PKG_CHECK_MODULES(LIBGTK, gtk+-2.0 >= 2.22.0 gthread-2.0) if test "$enable_x11" = "false" ; then PKG_CHECK_MODULES(LIBGTKMAC,[ige-mac-integration >= 0.9.7 ]) AC_DEFINE([HAVE_GTK_OSX],[1],[Defined when gtk osx is used]) From d892fea8629d69234e3ad2e6cc157ab390ff6210 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 9 Dec 2011 16:58:16 +0100 Subject: [PATCH 4/7] Error message added in wizard --- gtk/setupwizard.c | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/gtk/setupwizard.c b/gtk/setupwizard.c index b03b1be2d..c972a56b8 100644 --- a/gtk/setupwizard.c +++ b/gtk/setupwizard.c @@ -221,13 +221,21 @@ 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; gtk_image_set_from_pixbuf(isPasswordOk, ok); + gtk_label_set_text(passwordError, ""); } else { + if (gtk_entry_get_text_length(password) < PASSWORD_MIN_SIZE) { + gtk_label_set_text(passwordError, "Password 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 !"); + } is_password_correct = 0; gtk_image_set_from_pixbuf(isPasswordOk, notok); } @@ -241,15 +249,27 @@ static void account_username_changed(GtkEntry *entry, GtkWidget *w) { GtkWidget *assistant=gtk_widget_get_toplevel(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) { + int account_existing = linphone_account_creator_test_existence(creator); + if (g_regex_match_simple("^[a-zA-Z]+[a-zA-Z0-9.\\-_]{4,}$", gtk_entry_get_text(username), 0, 0) + && account_existing == 0) { is_username_available = 1; gtk_image_set_from_pixbuf(isUsernameOk, ok); + gtk_label_set_text(usernameError, ""); } else { + if (account_existing == 1) { + gtk_label_set_text(usernameError, "Username already in use !"); + } + else if (gtk_entry_get_text_length(username) < LOGIN_MIN_SIZE) { + gtk_label_set_text(usernameError, "Username too short"); + } + else if (!g_regex_match_simple("^[a-zA-Z]+[a-zA-Z0-9.\\-_]{4,}$", gtk_entry_get_text(username), 0, 0)) { + gtk_label_set_text(usernameError, "Unauthorized username"); + } is_username_available = 0; gtk_image_set_from_pixbuf(isUsernameOk, notok); } @@ -277,6 +297,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 +319,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, 2, 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 +331,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); From 303d1d648cc2949f3681512e24d5784c77bf3d38 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 9 Dec 2011 17:11:43 +0100 Subject: [PATCH 5/7] Optimisation of xmlrpc calls --- gtk/setupwizard.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/gtk/setupwizard.c b/gtk/setupwizard.c index c972a56b8..b34be8aef 100644 --- a/gtk/setupwizard.c +++ b/gtk/setupwizard.c @@ -231,7 +231,7 @@ static void account_password_changed(GtkEntry *entry, GtkWidget *w) { } else { if (gtk_entry_get_text_length(password) < PASSWORD_MIN_SIZE) { - gtk_label_set_text(passwordError, "Password too short !"); + 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 !"); @@ -253,21 +253,25 @@ static void account_username_changed(GtkEntry *entry, GtkWidget *w) { LinphoneAccountCreator *creator=linphone_gtk_assistant_get_creator(assistant); linphone_account_creator_set_username(creator, gtk_entry_get_text(username)); - int account_existing = linphone_account_creator_test_existence(creator); - if (g_regex_match_simple("^[a-zA-Z]+[a-zA-Z0-9.\\-_]{4,}$", gtk_entry_get_text(username), 0, 0) - && account_existing == 0) { - is_username_available = 1; - gtk_image_set_from_pixbuf(isUsernameOk, ok); - gtk_label_set_text(usernameError, ""); + + if (g_regex_match_simple("^[a-zA-Z]+[a-zA-Z0-9.\\-_]{3,}$", gtk_entry_get_text(username), 0, 0)) { + int account_existing = linphone_account_creator_test_existence(creator); + if (account_existing == 0) { + is_username_available = 1; + gtk_image_set_from_pixbuf(isUsernameOk, ok); + gtk_label_set_text(usernameError, ""); + } + else { + gtk_label_set_text(usernameError, "Username is already in use !"); + is_username_available = 0; + gtk_image_set_from_pixbuf(isUsernameOk, notok); + } } else { - if (account_existing == 1) { - gtk_label_set_text(usernameError, "Username already in use !"); + if (gtk_entry_get_text_length(username) < LOGIN_MIN_SIZE) { + gtk_label_set_text(usernameError, "Username is too short"); } - else if (gtk_entry_get_text_length(username) < LOGIN_MIN_SIZE) { - gtk_label_set_text(usernameError, "Username too short"); - } - else if (!g_regex_match_simple("^[a-zA-Z]+[a-zA-Z0-9.\\-_]{4,}$", gtk_entry_get_text(username), 0, 0)) { + 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"); } is_username_available = 0; From dd37611f4e52856d24babdc724908fdbcb44f169 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 19 Dec 2011 11:04:44 +0100 Subject: [PATCH 6/7] Async call to xmlrpc service --- gtk/setupwizard.c | 77 ++++++++++++++++++----------------------------- 1 file changed, 29 insertions(+), 48 deletions(-) diff --git a/gtk/setupwizard.c b/gtk/setupwizard.c index b34be8aef..25cc78ffc 100644 --- a/gtk/setupwizard.c +++ b/gtk/setupwizard.c @@ -20,6 +20,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "linphone.h" #include #include +#include static LinphoneAccountCreator *linphone_gtk_assistant_get_creator(GtkWidget*w); static const int PASSWORD_MIN_SIZE = 6; @@ -61,7 +62,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 +71,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 +121,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 +146,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); @@ -243,10 +225,8 @@ static void account_password_changed(GtkEntry *entry, GtkWidget *w) { is_account_information_correct(w)>0); } -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); +void* check_username_availability(void* 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")); @@ -280,6 +260,14 @@ static void account_username_changed(GtkEntry *entry, GtkWidget *w) { gtk_assistant_set_page_complete(GTK_ASSISTANT(assistant),w, is_account_information_correct(w)>0); + + 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 + pthread_t thread; + pthread_create(&thread, NULL, check_username_availability, (void*)w); } static GtkWidget *create_account_information_page() { @@ -323,7 +311,7 @@ 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), labelError, 1, 2, 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); @@ -447,22 +435,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 } From aeeb9bfb274f41fa5ae09d3882622af36f3a7e7e Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 23 Dec 2011 15:00:53 +0100 Subject: [PATCH 7/7] Setting TLS as default if using sip.linphone.org --- gtk/calllogs.c | 8 ++++---- gtk/main.ui | 14 +------------- gtk/propertybox.c | 4 ++-- gtk/setupwizard.c | 13 ++++++++++++- 4 files changed, 19 insertions(+), 20 deletions(-) diff --git a/gtk/calllogs.c b/gtk/calllogs.c index 1700077ed..748fbfee2 100644 --- a/gtk/calllogs.c +++ b/gtk/calllogs.c @@ -44,8 +44,8 @@ void linphone_gtk_call_log_update(GtkWidget *w){ gtk_tree_view_set_model(v,GTK_TREE_MODEL(store)); g_object_unref(G_OBJECT(store)); fill_renderers(GTK_TREE_VIEW(linphone_gtk_get_widget(w,"logs_view"))); - gtk_button_set_image(GTK_BUTTON(linphone_gtk_get_widget(w,"call_back_button")), - create_pixmap (linphone_gtk_get_ui_config("callback_button","status-green.png"))); +// gtk_button_set_image(GTK_BUTTON(linphone_gtk_get_widget(w,"call_back_button")), +// create_pixmap (linphone_gtk_get_ui_config("callback_button","status-green.png"))); } gtk_list_store_clear (store); @@ -143,8 +143,8 @@ GtkWidget * linphone_gtk_show_call_logs(void){ GtkWidget *w=(GtkWidget*)g_object_get_data(G_OBJECT(linphone_gtk_get_main_window()),"call_logs"); if (w==NULL){ w=linphone_gtk_create_window("call_logs"); - gtk_button_set_image(GTK_BUTTON(linphone_gtk_get_widget(w,"call_back_button")), - create_pixmap (linphone_gtk_get_ui_config("callback_button","status-green.png"))); +// gtk_button_set_image(GTK_BUTTON(linphone_gtk_get_widget(w,"call_back_button")), +// create_pixmap (linphone_gtk_get_ui_config("callback_button","status-green.png"))); g_object_set_data(G_OBJECT(mw),"call_logs",w); g_signal_connect(G_OBJECT(w),"response",(GCallback)linphone_gtk_call_log_response,NULL); gtk_widget_show(w); diff --git a/gtk/main.ui b/gtk/main.ui index 2fe36aa5d..d4f3eb6fd 100644 --- a/gtk/main.ui +++ b/gtk/main.ui @@ -960,19 +960,7 @@ - - Call back - True - True - True - False - - - - False - False - 1 - + diff --git a/gtk/propertybox.c b/gtk/propertybox.c index c7c3d7cd7..6db589df6 100644 --- a/gtk/propertybox.c +++ b/gtk/propertybox.c @@ -118,12 +118,12 @@ void linphone_gtk_update_my_port(GtkWidget *w){ } else if (strcmp(gtk_combo_box_get_active_text(GTK_COMBO_BOX(linphone_gtk_get_widget(pb, "proto_combo"))), "SIP (UDP)") == 0) { tr.udp_port = (gint)gtk_spin_button_get_value(GTK_SPIN_BUTTON(w)); - tr.tcp_port = 0; + tr.tcp_port = 0; tr.tls_port = 0; } else if (strcmp(gtk_combo_box_get_active_text(GTK_COMBO_BOX(linphone_gtk_get_widget(pb, "proto_combo"))), "SIP (TLS)") == 0){ tr.udp_port = 0; - tr.tcp_port = 0; + tr.tcp_port = 0; tr.tls_port = (gint)gtk_spin_button_get_value(GTK_SPIN_BUTTON(w)); } diff --git a/gtk/setupwizard.c b/gtk/setupwizard.c index 25cc78ffc..ee7e13413 100644 --- a/gtk/setupwizard.c +++ b/gtk/setupwizard.c @@ -404,7 +404,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) @@ -412,6 +411,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); + } } }