]> sjero.net Git - linphone/blob - gtk/setupwizard.c
e5f8702f28652055ae7746486d34a7a490d10566
[linphone] / gtk / setupwizard.c
1 /*
2 linphone, gtk-glade interface.
3 Copyright (C) 2008  Simon MORLAT (simon.morlat@linphone.org)
4
5 This program is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public License
7 as published by the Free Software Foundation; either version 2
8 of the License, or (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18 */
19
20 #include "linphone.h"
21 LinphoneAccountCreator *linphone_gtk_assistant_get_creator(GtkWidget*w);
22
23 static GtkWidget *create_intro(){
24         GtkWidget *vbox=gtk_vbox_new(FALSE,2);
25         GtkWidget *label=gtk_label_new(_("Welcome !\nThis assistant will help you to use a SIP account for your calls."));
26         gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 2);
27         g_object_set_data(G_OBJECT(vbox),"label",label);
28         gtk_widget_show_all(vbox);
29         return vbox;
30 }
31
32 static GtkWidget *create_setup_signin_choice(){
33         GtkWidget *vbox=gtk_vbox_new(FALSE,2);
34         GtkWidget *t1=gtk_radio_button_new_with_label(NULL,_("Create an account by choosing a username"));
35         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"));
36         gtk_box_pack_start (GTK_BOX (vbox), t1, TRUE, TRUE, 2);
37         gtk_box_pack_start (GTK_BOX (vbox), t2, TRUE, TRUE, 2);
38         gtk_widget_show_all(vbox);
39         g_object_set_data(G_OBJECT(vbox),"create_account",t1);
40         g_object_set_data(G_OBJECT(vbox),"setup_account",t2);
41         return vbox;
42 }
43
44 static void create_username_changed(GtkEntry *entry, GtkWidget *w){
45         GtkWidget *assistant=gtk_widget_get_toplevel(w);
46         gtk_assistant_set_page_complete(GTK_ASSISTANT(assistant),w,
47                 gtk_entry_get_text_length(entry)>=3);
48 }
49
50 static GtkWidget *create_username_chooser(){
51         GtkWidget *vbox=gtk_vbox_new(FALSE,2);
52         GtkWidget *hbox=gtk_hbox_new(FALSE,2);
53         GtkWidget *label=gtk_label_new(_("Please choose a username:"));
54         GtkWidget *label2=gtk_label_new(_("Username:"));
55         GtkWidget *label3=gtk_label_new(NULL);
56         GtkWidget *entry=gtk_entry_new();
57         gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 2);
58         gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 2);
59         gtk_box_pack_start (GTK_BOX (hbox), label2, TRUE, TRUE, 2);
60         gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 2);
61         gtk_box_pack_start (GTK_BOX (vbox), label3, TRUE, TRUE, 2);
62         gtk_widget_show_all(vbox);
63         g_object_set_data(G_OBJECT(vbox),"username",entry);
64         g_object_set_data(G_OBJECT(vbox),"errorstring",label3);
65         g_signal_connect(G_OBJECT(entry),"changed",(GCallback)create_username_changed,vbox);
66         return vbox;
67 }
68
69 static GtkWidget *create_username_checking_page(){
70         GtkWidget *vbox=gtk_vbox_new(FALSE,2);
71         GtkWidget *label=gtk_label_new(NULL);
72         GtkWidget *progress=gtk_progress_bar_new();
73         gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 2);
74         gtk_box_pack_start (GTK_BOX (vbox), progress, TRUE, TRUE, 2);
75         g_object_set_data(G_OBJECT(vbox),"label",label);
76         g_object_set_data(G_OBJECT(vbox),"progress",progress);
77         gtk_widget_show_all(vbox);
78         return vbox;
79 }
80
81 static void *progress_bar_update(LinphoneCore *lc, void *ctx, LinphoneWaitingState ws, const char *purpose, float progress){
82         GtkWidget *pb=(GtkWidget*)ctx;
83         if (ws==LinphoneWaitingProgress) gtk_progress_bar_pulse(GTK_PROGRESS_BAR(pb));
84         else if (ws==LinphoneWaitingFinished) gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pb),1);
85         return ctx;
86 }
87
88 static void check_username(GtkWidget *page){
89         GtkWidget *progress=(GtkWidget*)g_object_get_data(G_OBJECT(page),"progress");
90         GtkWidget *label=(GtkWidget*)g_object_get_data(G_OBJECT(page),"label");
91         LinphoneAccountCreator *creator=linphone_gtk_assistant_get_creator(gtk_widget_get_toplevel(page));
92         gchar *text=g_strdup_printf(_("Checking if '%s' is available..."),linphone_account_creator_get_username(creator));
93         LinphoneAccountCreator *c=linphone_gtk_assistant_get_creator(gtk_widget_get_toplevel(page));
94         int res;
95         gtk_label_set_text(GTK_LABEL(label),text);
96         g_free(text);
97         gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress),_("Please wait..."));
98         linphone_core_set_waiting_callback(linphone_gtk_get_core(),progress_bar_update,progress);
99         res=linphone_account_creator_test_existence(c);
100         if (res==1){
101                 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress),_("Sorry this username already exists. Please try a new one."));
102         }else if (res==0){
103                 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress),_("Ok !"));
104                 gtk_assistant_set_page_complete(GTK_ASSISTANT(gtk_widget_get_toplevel(page)),page,TRUE);
105         }else if (res==-1){
106                 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress),_("Communication problem, please try again later."));
107         }
108         linphone_core_set_waiting_callback(linphone_gtk_get_core(),linphone_gtk_wait,NULL);
109 }
110
111 static GtkWidget *create_confirmation_page(){
112         GtkWidget *vbox=gtk_vbox_new(FALSE,2);
113         GtkWidget *label=gtk_label_new(NULL);
114         gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 2);
115         g_object_set_data(G_OBJECT(vbox),"label",label);
116         gtk_widget_show_all(vbox);
117         return vbox;
118 }
119
120 static GtkWidget *create_creation_page(){
121         GtkWidget *vbox=gtk_vbox_new(FALSE,2);
122         GtkWidget *label=gtk_label_new(NULL);
123         GtkWidget *progress=gtk_progress_bar_new();
124         gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 2);
125         gtk_box_pack_start (GTK_BOX (vbox), progress, TRUE, TRUE, 2);
126         g_object_set_data(G_OBJECT(vbox),"label",label);
127         g_object_set_data(G_OBJECT(vbox),"progress",progress);
128         gtk_widget_show_all(vbox);
129         return vbox;
130 }
131
132 static GtkWidget *create_finish_page(){
133         GtkWidget *vbox=gtk_vbox_new(FALSE,2);
134         GtkWidget *label=gtk_label_new(_("Thank you. Your account is now configured and ready for use."));
135         gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 2);
136         gtk_widget_show_all(vbox);
137         return vbox;
138 }
139
140 static void linphone_gtk_assistant_closed(GtkWidget *w){
141         gtk_widget_destroy(w);
142 }
143
144 static int linphone_gtk_assistant_forward(int curpage, gpointer data){
145         GtkWidget *w=(GtkWidget*)data;
146         GtkWidget *box=gtk_assistant_get_nth_page(GTK_ASSISTANT(w),curpage);
147         if (curpage==1){
148                 GtkWidget *create_button=(GtkWidget*)g_object_get_data(G_OBJECT(box),"create_account");
149                 if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(create_button))){
150                         g_error("Not implemented yet...");
151                 }
152         }else if (curpage==2){
153                 LinphoneAccountCreator *c=linphone_gtk_assistant_get_creator(w);
154                 linphone_account_creator_set_username(c,gtk_entry_get_text(GTK_ENTRY(g_object_get_data(G_OBJECT(box),"username"))));
155         }
156         return curpage+1;
157 }
158
159 static void linphone_gtk_assistant_apply(GtkWidget *w){
160         LinphoneAccountCreator *creator=linphone_gtk_assistant_get_creator(w);
161         GtkWidget *page=gtk_assistant_get_nth_page(GTK_ASSISTANT(w),gtk_assistant_get_current_page(GTK_ASSISTANT(w)));
162         GtkWidget *progress=(GtkWidget*)g_object_get_data(G_OBJECT(page),"progress");
163         LinphoneProxyConfig *res;
164         gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress),_("Please wait..."));
165         linphone_core_set_waiting_callback(linphone_gtk_get_core(),progress_bar_update,progress);
166         res=linphone_account_creator_validate(creator);
167         if (res){
168                 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress),_("Ok !"));
169                 gtk_assistant_set_page_complete(GTK_ASSISTANT(w),page,TRUE);
170         }else{
171                 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progress),_("Communication problem, please try again later."));
172         }
173         linphone_core_set_waiting_callback(linphone_gtk_get_core(),linphone_gtk_wait,NULL);
174         if (res) linphone_core_add_proxy_config(linphone_gtk_get_core(),res);
175         gtk_assistant_set_page_complete(GTK_ASSISTANT(w),page,TRUE);
176 }
177
178 static void linphone_gtk_assistant_prepare(GtkWidget *assistant, GtkWidget *page){
179         int pagenum=gtk_assistant_get_current_page(GTK_ASSISTANT(assistant));
180         if (pagenum==3){
181                 check_username(page);
182         }else if (pagenum==4){
183                 GtkWidget *label=(GtkWidget*)g_object_get_data(G_OBJECT(page),"label");
184                 LinphoneAccountCreator *creator=linphone_gtk_assistant_get_creator(assistant);
185                 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));
186                 gtk_label_set_text(GTK_LABEL(label),text);
187                 g_free(text);
188         }else if (pagenum==5){
189                 GtkWidget *label=(GtkWidget*)g_object_get_data(G_OBJECT(page),"label");
190                 LinphoneAccountCreator *creator=linphone_gtk_assistant_get_creator(assistant);
191                 gchar *text=g_strdup_printf("Account creation in progress for '%s'",linphone_account_creator_get_username(creator));
192                 gtk_label_set_text(GTK_LABEL(label),text);
193                 g_free(text);
194         }
195 }
196
197 static LinphoneAccountCreator * linphone_gtk_assistant_init(GtkWidget *w){
198         const MSList *elem;
199         LinphoneCore *lc=linphone_gtk_get_core();
200         for(elem=linphone_core_get_sip_setups(lc);elem!=NULL;elem=elem->next){
201                 SipSetup *ss=(SipSetup*)elem->data;
202                 if (sip_setup_get_capabilities(ss) & SIP_SETUP_CAP_ACCOUNT_MANAGER){
203                         LinphoneAccountCreator *creator=linphone_account_creator_new(lc,ss->name);
204                         g_object_set_data(G_OBJECT(w),"creator",creator);
205                         return creator;
206                 }
207         }
208         return NULL;
209 }
210
211 LinphoneAccountCreator *linphone_gtk_assistant_get_creator(GtkWidget*w){
212         return (LinphoneAccountCreator*)g_object_get_data(G_OBJECT(w),"creator");
213 }
214
215 GtkWidget * linphone_gtk_create_assistant(void){
216         GtkWidget *w=gtk_assistant_new();
217         GtkWidget *p1=create_intro();
218         GtkWidget *p2=create_setup_signin_choice();
219         GtkWidget *p3=create_username_chooser();
220         GtkWidget *checking=create_username_checking_page();
221         GtkWidget *confirm=create_confirmation_page();
222         GtkWidget *creation=create_creation_page();
223         GtkWidget *end=create_finish_page();
224         
225         linphone_gtk_assistant_init(w);
226         gtk_assistant_append_page(GTK_ASSISTANT(w),p1);
227         gtk_assistant_set_page_type(GTK_ASSISTANT(w),p1,GTK_ASSISTANT_PAGE_INTRO);
228         gtk_assistant_set_page_title(GTK_ASSISTANT(w),p1,_("Welcome to the account setup assistant"));
229         gtk_assistant_set_page_complete(GTK_ASSISTANT(w),p1,TRUE);
230         gtk_assistant_append_page(GTK_ASSISTANT(w),p2);
231         gtk_assistant_set_page_type(GTK_ASSISTANT(w),p2,GTK_ASSISTANT_PAGE_CONTENT);
232         gtk_assistant_set_page_title(GTK_ASSISTANT(w),p2,_("Account setup assistant"));
233         gtk_assistant_set_page_complete(GTK_ASSISTANT(w),p2,TRUE);
234         gtk_assistant_append_page(GTK_ASSISTANT(w),p3);
235         gtk_assistant_set_page_type(GTK_ASSISTANT(w),p3,GTK_ASSISTANT_PAGE_CONTENT);
236         gtk_assistant_set_page_title(GTK_ASSISTANT(w),p3,_("Choosing a username"));
237         
238         gtk_assistant_append_page(GTK_ASSISTANT(w),checking);
239         gtk_assistant_set_page_type(GTK_ASSISTANT(w),checking,GTK_ASSISTANT_PAGE_PROGRESS);
240         gtk_assistant_set_page_title(GTK_ASSISTANT(w),checking,_("Verifying"));
241         
242         gtk_assistant_append_page(GTK_ASSISTANT(w),confirm);
243         gtk_assistant_set_page_type(GTK_ASSISTANT(w),confirm,GTK_ASSISTANT_PAGE_CONFIRM);
244         gtk_assistant_set_page_title(GTK_ASSISTANT(w),confirm,_("Confirmation"));
245         gtk_assistant_set_page_complete(GTK_ASSISTANT(w),confirm,TRUE);
246
247         gtk_assistant_append_page(GTK_ASSISTANT(w),creation);
248         gtk_assistant_set_page_type(GTK_ASSISTANT(w),creation,GTK_ASSISTANT_PAGE_PROGRESS);
249         gtk_assistant_set_page_title(GTK_ASSISTANT(w),creation,_("Creating your account"));
250
251         gtk_assistant_append_page(GTK_ASSISTANT(w),end);
252         gtk_assistant_set_page_type(GTK_ASSISTANT(w),end,GTK_ASSISTANT_PAGE_SUMMARY);
253         gtk_assistant_set_page_title(GTK_ASSISTANT(w),end,_("Now ready !"));
254         
255         gtk_assistant_set_forward_page_func(GTK_ASSISTANT(w),linphone_gtk_assistant_forward,w,NULL);
256         g_signal_connect(G_OBJECT(w),"close",(GCallback)linphone_gtk_assistant_closed,NULL);
257         g_signal_connect(G_OBJECT(w),"cancel",(GCallback)linphone_gtk_assistant_closed,NULL);
258         g_signal_connect(G_OBJECT(w),"apply",(GCallback)linphone_gtk_assistant_apply,NULL);
259         g_signal_connect(G_OBJECT(w),"prepare",(GCallback)linphone_gtk_assistant_prepare,NULL);
260         gtk_widget_show(w);
261         
262         return w;
263 }
264