]> sjero.net Git - linphone/blob - gtk-glade/propertybox.c
purge out p2pproxy
[linphone] / gtk-glade / propertybox.c
1 /*
2 linphone, gtk-glade interface.
3 Copyright (C) 2008-2009  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
22 typedef enum {
23         CAP_IGNORE,
24         CAP_PLAYBACK,
25         CAP_CAPTURE
26 }DeviceCap;
27
28 static void linphone_gtk_fill_combo_box(GtkWidget *combo, const char **devices, const char *selected, DeviceCap cap){
29         const char **p=devices;
30         int i=0,active=0;
31         /* glade creates a combo box without list model and text renderer,
32         unless we fill it with a dummy text.
33         This dummy text needs to be removed first*/
34         gtk_combo_box_remove_text(GTK_COMBO_BOX(combo),0);
35         for(;*p!=NULL;++p){
36                 if ( cap==CAP_IGNORE 
37                         || (cap==CAP_CAPTURE && linphone_core_sound_device_can_capture(linphone_gtk_get_core(),*p))
38                         || (cap==CAP_PLAYBACK && linphone_core_sound_device_can_playback(linphone_gtk_get_core(),*p)) ){
39                         gtk_combo_box_append_text(GTK_COMBO_BOX(combo),*p);
40                         if (strcmp(selected,*p)==0) active=i;
41                         i++;
42                 }
43         }
44         gtk_combo_box_set_active(GTK_COMBO_BOX(combo),active);
45 }
46
47 void linphone_gtk_fill_video_sizes(GtkWidget *combo){
48         const MSVideoSizeDef *def=linphone_core_get_supported_video_sizes(linphone_gtk_get_core());;
49         int i,active=0;
50         char vsize_def[256];
51         MSVideoSize cur=linphone_core_get_preferred_video_size(linphone_gtk_get_core());
52         /* glade creates a combo box without list model and text renderer,
53         unless we fill it with a dummy text.
54         This dummy text needs to be removed first*/
55         gtk_combo_box_remove_text(GTK_COMBO_BOX(combo),0);
56         for(i=0;def->name!=NULL;++def,++i){
57                 snprintf(vsize_def,sizeof(vsize_def),"%s (%ix%i)",def->name,def->vsize.width,def->vsize.height);
58                 gtk_combo_box_append_text(GTK_COMBO_BOX(combo),vsize_def);
59                 if (cur.width==def->vsize.width && cur.height==def->vsize.height) active=i;
60         }
61         gtk_combo_box_set_active(GTK_COMBO_BOX(combo),active);
62 }
63
64 void linphone_gtk_parameters_closed(GtkWidget *button){
65         GtkWidget *pb=gtk_widget_get_toplevel(button);
66         gtk_widget_destroy(pb);
67 }
68
69 void linphone_gtk_update_my_contact(GtkWidget *w){
70         GtkWidget *pb=gtk_widget_get_toplevel(w);
71         const char *username=gtk_entry_get_text(GTK_ENTRY(linphone_gtk_get_widget(pb,"username")));
72         const char *displayname=gtk_entry_get_text(GTK_ENTRY(linphone_gtk_get_widget(pb,"displayname")));
73         int port=linphone_core_get_sip_port(linphone_gtk_get_core());
74         LinphoneAddress *parsed=linphone_core_get_primary_contact_parsed(linphone_gtk_get_core());
75         char *contact;
76         g_return_if_fail(parsed!=NULL);
77         if (username[0]=='\0') return;
78
79         linphone_address_set_display_name(parsed,displayname);
80         linphone_address_set_username(parsed,username);
81         linphone_address_set_port_int(parsed,port);
82         contact=linphone_address_as_string(parsed);
83         gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(pb,"sip_address")),contact);
84         linphone_core_set_primary_contact(linphone_gtk_get_core(),contact);
85         ms_free(contact);
86         linphone_address_destroy(parsed);
87         linphone_gtk_load_identities();
88 }
89
90 void linphone_gtk_stun_server_changed(GtkWidget *w){
91         const gchar *addr=gtk_entry_get_text(GTK_ENTRY(w));
92         linphone_core_set_stun_server(linphone_gtk_get_core(),addr);
93 }
94
95 void linphone_gtk_nat_address_changed(GtkWidget *w){
96         const gchar *addr=gtk_entry_get_text(GTK_ENTRY(w));
97         linphone_core_set_nat_address(linphone_gtk_get_core(),addr);
98 }
99
100 void linphone_gtk_ipv6_toggled(GtkWidget *w){
101         linphone_core_enable_ipv6(linphone_gtk_get_core(),
102                                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)));
103 }
104
105 void linphone_gtk_sip_port_changed(GtkWidget *w){
106         linphone_core_set_sip_port(linphone_gtk_get_core(),
107                         (gint)gtk_spin_button_get_value(GTK_SPIN_BUTTON(w)));
108 }
109
110 void linphone_gtk_audio_port_changed(GtkWidget *w){
111         linphone_core_set_audio_port(linphone_gtk_get_core(),
112                         (gint)gtk_spin_button_get_value(GTK_SPIN_BUTTON(w)));
113 }
114
115 void linphone_gtk_video_port_changed(GtkWidget *w){
116         linphone_core_set_video_port(linphone_gtk_get_core(),
117                         (gint)gtk_spin_button_get_value(GTK_SPIN_BUTTON(w)));
118 }
119
120 void linphone_gtk_no_firewall_toggled(GtkWidget *w){
121         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)))
122                 linphone_core_set_firewall_policy(linphone_gtk_get_core(),LINPHONE_POLICY_NO_FIREWALL);
123 }
124
125 void linphone_gtk_use_nat_address_toggled(GtkWidget *w){
126         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)))
127                 linphone_core_set_firewall_policy(linphone_gtk_get_core(),LINPHONE_POLICY_USE_NAT_ADDRESS);
128 }
129
130 void linphone_gtk_use_stun_toggled(GtkWidget *w){
131         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)))
132                 linphone_core_set_firewall_policy(linphone_gtk_get_core(),LINPHONE_POLICY_USE_STUN);
133 }
134
135 void linphone_gtk_mtu_changed(GtkWidget *w){
136         if (GTK_WIDGET_SENSITIVE(w))
137                 linphone_core_set_mtu(linphone_gtk_get_core(),gtk_spin_button_get_value(GTK_SPIN_BUTTON(w)));
138 }
139
140 void linphone_gtk_use_sip_info_dtmf_toggled(GtkWidget *w){
141         linphone_core_set_use_info_for_dtmf(linphone_gtk_get_core(),
142                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)));
143 }
144
145 void linphone_gtk_mtu_set(GtkWidget *w){
146         GtkWidget *mtu=linphone_gtk_get_widget(gtk_widget_get_toplevel(w),"mtu");
147         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))){
148                 gtk_widget_set_sensitive(mtu,TRUE);
149                 linphone_gtk_mtu_changed(mtu);
150         }else{
151                 gtk_widget_set_sensitive(mtu,FALSE);
152                 linphone_core_set_mtu(linphone_gtk_get_core(),0);
153         }
154 }
155
156 void linphone_gtk_playback_device_changed(GtkWidget *w){
157         gchar *sel=gtk_combo_box_get_active_text(GTK_COMBO_BOX(w));
158         linphone_core_set_playback_device(linphone_gtk_get_core(),sel);
159         g_free(sel);
160 }
161
162 void linphone_gtk_capture_device_changed(GtkWidget *w){
163         gchar *sel=gtk_combo_box_get_active_text(GTK_COMBO_BOX(w));
164         linphone_core_set_capture_device(linphone_gtk_get_core(),sel);
165         g_free(sel);
166 }
167
168 void linphone_gtk_ring_device_changed(GtkWidget *w){
169         gchar *sel=gtk_combo_box_get_active_text(GTK_COMBO_BOX(w));
170         linphone_core_set_ringer_device(linphone_gtk_get_core(),sel);
171         g_free(sel);
172 }
173
174 void linphone_gtk_alsa_special_device_changed(GtkWidget *w){
175         /*
176         const gchar *dev=gtk_entry_get_text(GTK_ENTRY(w));
177         ...*/
178 }
179
180 void linphone_gtk_cam_changed(GtkWidget *w){
181         gchar *sel=gtk_combo_box_get_active_text(GTK_COMBO_BOX(w));
182         linphone_core_set_video_device(linphone_gtk_get_core(),sel);
183         g_free(sel);
184 }
185
186 void linphone_gtk_video_size_changed(GtkWidget *w){
187         int sel=gtk_combo_box_get_active(GTK_COMBO_BOX(w));
188         const MSVideoSizeDef *defs=linphone_core_get_supported_video_sizes(linphone_gtk_get_core());
189         if (sel<0) return;
190         linphone_core_set_preferred_video_size(linphone_gtk_get_core(),
191                                         defs[sel].vsize);
192 }
193
194 void linphone_gtk_ring_file_set(GtkWidget *w){
195         gchar *file=gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(w));
196         linphone_core_set_ring(linphone_gtk_get_core(),file);
197         g_free(file);
198 }
199
200 static void linphone_gtk_end_of_ring(LinphoneCore *lc, void *user_data){
201         gtk_widget_set_sensitive((GtkWidget*)user_data,TRUE);
202 }
203
204 void linphone_gtk_play_ring_file(GtkWidget *w){
205         if (linphone_core_preview_ring(linphone_gtk_get_core(),
206                                 linphone_core_get_ring(linphone_gtk_get_core()),
207                                 linphone_gtk_end_of_ring,
208                                 w)==0){
209                 gtk_widget_set_sensitive(w,FALSE);
210         }
211 }
212
213 void linphone_gtk_echo_cancelation_toggled(GtkWidget *w){
214         linphone_core_enable_echo_cancellation(linphone_gtk_get_core(),
215                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)));
216 }
217
218 enum {
219         CODEC_NAME,
220         CODEC_RATE,
221         CODEC_BITRATE,
222         CODEC_STATUS,
223         CODEC_PARAMS,
224         CODEC_PRIVDATA,
225         CODEC_COLOR,
226         CODEC_INFO,
227         CODEC_NCOLUMNS
228 };
229
230 static void linphone_gtk_init_codec_list(GtkTreeView *listview){
231         GtkCellRenderer *renderer;
232         GtkTreeViewColumn *column;
233         GtkTreeSelection *select;
234
235         GtkListStore *store = gtk_list_store_new (CODEC_NCOLUMNS, G_TYPE_STRING,G_TYPE_INT,
236                                                         G_TYPE_FLOAT,
237                                                         G_TYPE_STRING,
238                                                         G_TYPE_STRING,
239                                                         G_TYPE_POINTER,
240                                                         G_TYPE_STRING,
241                                                         G_TYPE_STRING);
242
243         gtk_tree_view_set_model(listview,GTK_TREE_MODEL(store));
244         g_object_unref(G_OBJECT(store));
245
246         renderer = gtk_cell_renderer_text_new ();
247         column = gtk_tree_view_column_new_with_attributes (_("Name"),
248                                                    renderer,
249                                                    "text", CODEC_NAME,
250                                                 "foreground",CODEC_COLOR,
251                                                    NULL);
252         gtk_tree_view_append_column (listview, column);
253         column = gtk_tree_view_column_new_with_attributes (_("Rate (Hz)"),
254                                                    renderer,
255                                                    "text", CODEC_RATE,
256                                                 "foreground",CODEC_COLOR,
257                                                    NULL);
258         gtk_tree_view_append_column (listview, column);
259         column = gtk_tree_view_column_new_with_attributes (_("Status"),
260                                                    renderer,
261                                                    "text", CODEC_STATUS,
262                                                 "foreground",CODEC_COLOR,
263                                                    NULL);
264         gtk_tree_view_append_column (listview, column);
265         column = gtk_tree_view_column_new_with_attributes (_("Min bitrate (kbit/s)"),
266                                                    renderer,
267                                                    "text", CODEC_BITRATE,
268                                                 "foreground",CODEC_COLOR,
269                                                    NULL);
270         gtk_tree_view_append_column (listview, column);
271         column = gtk_tree_view_column_new_with_attributes (_("Parameters"),
272                                                    renderer,
273                                                    "text", CODEC_PARAMS,
274                                                 "foreground",CODEC_COLOR,
275                                                    NULL);
276         gtk_tree_view_append_column (listview, column);
277         /* Setup the selection handler */
278         select = gtk_tree_view_get_selection (listview);
279         gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE);
280 }
281
282 static void linphone_gtk_show_codecs(GtkTreeView *listview, const MSList *codeclist)
283 {
284         const MSList *elem;
285         GtkTreeIter iter;
286         GtkListStore *store=GTK_LIST_STORE(gtk_tree_view_get_model(listview));
287         GtkTreeSelection *selection;
288
289         gtk_list_store_clear(store);
290
291         for(elem=codeclist; elem!=NULL; elem=elem->next){
292                 gchar *status;
293                 gint rate;
294                 gfloat bitrate; 
295                 gchar *color;
296                 const char *params="";
297                 struct _PayloadType *pt=(struct _PayloadType *)elem->data;
298                 if (payload_type_enabled(pt)) status=_("Enabled");
299                 else status=_("Disabled");
300                 if (linphone_core_check_payload_type_usability(linphone_gtk_get_core(),pt)) color="blue";
301                 else color="red";
302                 /* get an iterator */
303                 gtk_list_store_append(store,&iter);
304                 bitrate=payload_type_get_bitrate(pt)/1000.0;
305                 rate=payload_type_get_rate(pt);
306                 if (pt->recv_fmtp!=NULL) params=pt->recv_fmtp;
307                 gtk_list_store_set(store,&iter, CODEC_NAME,payload_type_get_mime(pt),
308                                         CODEC_RATE,rate,
309                                         CODEC_BITRATE,bitrate,
310                                         CODEC_STATUS,status,
311                                         CODEC_PARAMS,params,
312                                         CODEC_PRIVDATA,(gpointer)pt,
313                                         CODEC_COLOR,(gpointer)color,
314                                         CODEC_INFO,(gpointer)payload_type_get_description(pt),
315                                         -1);
316         }
317         
318         
319         
320         /* Setup the selection handler */
321         selection = gtk_tree_view_get_selection (listview);
322         gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
323         //gtk_tree_view_columns_autosize(GTK_TREE_VIEW (sec->interfaces));
324 #if GTK_CHECK_VERSION(2,12,0)
325         gtk_tree_view_set_tooltip_column(listview,CODEC_INFO);
326 #endif
327 }
328
329 static void linphone_gtk_check_codec_bandwidth(GtkTreeView *v){
330         GtkTreeIter iter;
331         GtkTreeModel *model;
332         model=gtk_tree_view_get_model(v);
333         g_return_if_fail(gtk_tree_model_get_iter_first(model,&iter));
334         do{
335                 PayloadType *pt=NULL;
336                 const gchar *color;
337                 gfloat bitrate;
338                 gtk_tree_model_get(model,&iter,CODEC_PRIVDATA,&pt,-1);
339                 if (linphone_core_check_payload_type_usability(linphone_gtk_get_core(),pt)) color="blue";
340                 else color="red";
341                 bitrate=payload_type_get_bitrate(pt)/1000.0;
342                 gtk_list_store_set(GTK_LIST_STORE(model),&iter,CODEC_COLOR, (gpointer)color,
343                                         CODEC_BITRATE, bitrate,-1);
344         }while(gtk_tree_model_iter_next(model,&iter));
345 }
346
347 static void linphone_gtk_select_codec(GtkTreeView *v, PayloadType *ref){
348         GtkTreeIter iter;
349         GtkTreeModel *model;
350         GtkTreeSelection *selection;
351         selection=gtk_tree_view_get_selection(v);
352         model=gtk_tree_view_get_model(v);
353         g_return_if_fail(gtk_tree_model_get_iter_first(model,&iter));
354         do{
355                 PayloadType *pt=NULL;
356                 gtk_tree_model_get(model,&iter,CODEC_PRIVDATA,&pt,-1);
357                 if (pt==ref){
358                         gtk_tree_selection_select_iter(selection,&iter);
359                 }
360                 
361         }while(gtk_tree_model_iter_next(model,&iter));
362 }
363
364 static void linphone_gtk_draw_codec_list(GtkTreeView *v, int type){ /* 0=audio, 1=video*/
365         const MSList *list;
366         if (type==0) list=linphone_core_get_audio_codecs(linphone_gtk_get_core());
367         else list=linphone_core_get_video_codecs(linphone_gtk_get_core());
368         linphone_gtk_show_codecs(v,list);
369 }
370
371 void linphone_gtk_codec_view_changed(GtkWidget *w){
372         GtkWidget *listview=linphone_gtk_get_widget(gtk_widget_get_toplevel(w),"codec_list");
373         int active=gtk_combo_box_get_active(GTK_COMBO_BOX(w));
374         linphone_gtk_draw_codec_list(GTK_TREE_VIEW(listview),active);
375 }
376
377 void linphone_gtk_download_bw_changed(GtkWidget *w){
378         GtkTreeView *v=GTK_TREE_VIEW(linphone_gtk_get_widget(gtk_widget_get_toplevel(w),"codec_list"));
379         linphone_core_set_download_bandwidth(linphone_gtk_get_core(),
380                                 (int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(w)));
381         linphone_gtk_check_codec_bandwidth(v);
382 }
383
384 void linphone_gtk_upload_bw_changed(GtkWidget *w){
385         GtkTreeView *v=GTK_TREE_VIEW(linphone_gtk_get_widget(gtk_widget_get_toplevel(w),"codec_list"));
386         linphone_core_set_upload_bandwidth(linphone_gtk_get_core(),
387                                 (int)gtk_spin_button_get_value(GTK_SPIN_BUTTON(w)));
388         linphone_gtk_check_codec_bandwidth(v);
389 }
390
391 static void linphone_gtk_codec_move(GtkWidget *button, int dir){
392         GtkTreeView *v=GTK_TREE_VIEW(linphone_gtk_get_widget(gtk_widget_get_toplevel(button),"codec_list"));
393         GtkTreeSelection *sel=gtk_tree_view_get_selection(v);
394         GtkTreeModel *mod;
395         GtkTreeIter iter;
396         PayloadType *pt=NULL;
397         LinphoneCore *lc=linphone_gtk_get_core();
398         if (gtk_tree_selection_get_selected(sel,&mod,&iter)){
399                 MSList *sel_elem,*before;
400                 MSList *codec_list;
401                 gtk_tree_model_get(mod,&iter,CODEC_PRIVDATA,&pt,-1);
402                 if (pt->type==PAYLOAD_VIDEO)
403                         codec_list=ms_list_copy(linphone_core_get_video_codecs(lc));
404                 else codec_list=ms_list_copy(linphone_core_get_audio_codecs(lc));
405                 sel_elem=ms_list_find(codec_list,pt);
406                 if (dir>0) {
407                         if (sel_elem->prev) before=sel_elem->prev;
408                         else before=sel_elem;
409                         codec_list=ms_list_insert(codec_list,before,pt);
410                 }
411                 else{
412                         if (sel_elem->next) before=sel_elem->next->next;
413                         else before=sel_elem;
414                         codec_list=ms_list_insert(codec_list,before,pt);
415                 }
416                 codec_list=ms_list_remove_link(codec_list,sel_elem);
417                 if (pt->type==PAYLOAD_VIDEO)
418                         linphone_core_set_video_codecs(lc,codec_list);
419                 else linphone_core_set_audio_codecs(lc,codec_list);
420                 linphone_gtk_show_codecs(v,codec_list);
421                 linphone_gtk_select_codec(v,pt);
422         }
423 }
424
425 static void linphone_gtk_codec_set_enable(GtkWidget *button, gboolean enabled){
426         GtkTreeView *v=GTK_TREE_VIEW(linphone_gtk_get_widget(gtk_widget_get_toplevel(button),"codec_list"));
427         GtkTreeSelection *sel=gtk_tree_view_get_selection(v);
428         GtkTreeModel *mod;
429         GtkListStore *store;
430         GtkTreeIter iter;
431         PayloadType *pt=NULL;
432
433         if (gtk_tree_selection_get_selected(sel,&mod,&iter)){
434                 store=GTK_LIST_STORE(mod);
435                 gtk_tree_model_get(mod,&iter,CODEC_PRIVDATA,&pt,-1);
436                 payload_type_set_enable(pt,enabled);
437                 gtk_list_store_set(store,&iter,CODEC_STATUS, enabled ? _("Enabled") : _("Disabled"), -1);
438         }
439 }
440
441 void linphone_gtk_codec_up(GtkWidget *button){
442         linphone_gtk_codec_move(button,+1);
443 }
444
445 void linphone_gtk_codec_down(GtkWidget *button){
446         linphone_gtk_codec_move(button,-1);
447 }
448
449 void linphone_gtk_codec_enable(GtkWidget *button){
450         linphone_gtk_codec_set_enable(button,TRUE);
451 }
452
453 void linphone_gtk_codec_disable(GtkWidget *button){
454         linphone_gtk_codec_set_enable(button,FALSE);
455 }
456
457 void linphone_gtk_clear_passwords(GtkWidget *button){
458         linphone_core_clear_all_auth_info(linphone_gtk_get_core());
459 }
460
461 enum{
462         PROXY_CONFIG_IDENTITY,
463         PROXY_CONFIG_REF,
464         PROXY_CONFIG_NCOL
465 };
466
467 void linphone_gtk_show_sip_accounts(GtkWidget *w){
468         GtkTreeView *v=GTK_TREE_VIEW(linphone_gtk_get_widget(w,"proxy_list"));
469         GtkTreeModel *model=gtk_tree_view_get_model(v);
470         GtkListStore *store;
471         GtkTreeSelection *select;
472         const MSList *elem;
473         if (!model){
474                 GtkCellRenderer *renderer;
475                 GtkTreeViewColumn *column;
476                 /* create the proxy list */
477                 store = gtk_list_store_new (PROXY_CONFIG_NCOL, G_TYPE_STRING, G_TYPE_POINTER);
478                 
479                 gtk_tree_view_set_model(v,GTK_TREE_MODEL(store));
480                 g_object_unref(G_OBJECT(store));
481                 renderer = gtk_cell_renderer_text_new ();
482                 column = gtk_tree_view_column_new_with_attributes (_("Account"),
483                                                         renderer,
484                                                         "text", PROXY_CONFIG_IDENTITY,
485                                                         NULL);
486                 gtk_tree_view_append_column (v, column);
487                 
488                 select = gtk_tree_view_get_selection (v);
489                 gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE);
490                 model=GTK_TREE_MODEL(store);
491         }else {
492                 store=GTK_LIST_STORE(model);
493         }
494         gtk_list_store_clear(store);
495         for(elem=linphone_core_get_proxy_config_list(linphone_gtk_get_core());elem!=NULL;elem=ms_list_next(elem)){
496                 LinphoneProxyConfig *cfg=(LinphoneProxyConfig*)elem->data;
497                 GtkTreeIter iter;
498                 gtk_list_store_append(store,&iter);
499                 gtk_list_store_set(store,&iter,PROXY_CONFIG_IDENTITY,linphone_proxy_config_get_identity(cfg),
500                                         PROXY_CONFIG_REF,cfg,-1);
501         }
502 }
503
504 static void linphone_gtk_proxy_closed(GtkWidget *w){
505         LinphoneProxyConfig *cfg=(LinphoneProxyConfig*)g_object_get_data(G_OBJECT(w),"config");
506         if (cfg){
507                 linphone_proxy_config_done(cfg);
508         }
509 }
510
511 void linphone_gtk_show_proxy_config(GtkWidget *pb, LinphoneProxyConfig *cfg){
512         GtkWidget *w=linphone_gtk_create_window("sip_account");
513         const char *tmp;
514         if (cfg){
515                 linphone_proxy_config_edit(cfg);
516                 gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(w,"identity")),
517                         linphone_proxy_config_get_identity(cfg));
518                 gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(w,"proxy")),
519                         linphone_proxy_config_get_addr(cfg));
520                 tmp=linphone_proxy_config_get_route(cfg);
521                 if (tmp) gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(w,"route")),tmp);
522                 gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(w,"regperiod")),
523                         linphone_proxy_config_get_expires(cfg));
524                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(w,"register")),
525                         linphone_proxy_config_register_enabled(cfg));
526                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(w,"publish")),
527                         linphone_proxy_config_publish_enabled(cfg));
528         }
529         g_object_set_data(G_OBJECT(w),"config",(gpointer)cfg);
530         g_object_set_data(G_OBJECT(w),"parameters",(gpointer)pb);
531         g_object_weak_ref(G_OBJECT(w),(GWeakNotify)linphone_gtk_proxy_closed,w);
532         gtk_widget_show(w);
533 }
534
535 void linphone_gtk_proxy_cancel(GtkButton *button){
536         GtkWidget *w=gtk_widget_get_toplevel(GTK_WIDGET(button));
537         gtk_widget_destroy(w);
538 }
539
540 void linphone_gtk_proxy_ok(GtkButton *button){
541         GtkWidget *w=gtk_widget_get_toplevel(GTK_WIDGET(button));
542         LinphoneProxyConfig *cfg=(LinphoneProxyConfig*)g_object_get_data(G_OBJECT(w),"config");
543         gboolean was_editing=TRUE;
544         if (!cfg){
545                 was_editing=FALSE;
546                 cfg=linphone_proxy_config_new();
547         }
548         linphone_proxy_config_set_identity(cfg,
549                 gtk_entry_get_text(GTK_ENTRY(linphone_gtk_get_widget(w,"identity"))));
550         linphone_proxy_config_set_server_addr(cfg,
551                 gtk_entry_get_text(GTK_ENTRY(linphone_gtk_get_widget(w,"proxy"))));
552         linphone_proxy_config_set_route(cfg,
553                 gtk_entry_get_text(GTK_ENTRY(linphone_gtk_get_widget(w,"route"))));
554         linphone_proxy_config_expires(cfg,
555                 (int)gtk_spin_button_get_value(
556                         GTK_SPIN_BUTTON(linphone_gtk_get_widget(w,"regperiod"))));
557         linphone_proxy_config_enable_publish(cfg,
558                 gtk_toggle_button_get_active(
559                         GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(w,"publish"))));
560         linphone_proxy_config_enable_register(cfg,
561                 gtk_toggle_button_get_active(
562                         GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(w,"register"))));
563         if (was_editing){
564                 if (linphone_proxy_config_done(cfg)==-1)
565                         return;
566         }
567         else {
568                 if (linphone_core_add_proxy_config(linphone_gtk_get_core(),cfg)==-1) return;
569                 linphone_core_set_default_proxy(linphone_gtk_get_core(),cfg);
570         }
571         g_object_set_data(G_OBJECT(w),"config",NULL);
572         linphone_gtk_show_sip_accounts(GTK_WIDGET(g_object_get_data(G_OBJECT(w),"parameters")));
573         gtk_widget_destroy(w);
574         /* also update the main window's list of identities*/
575         linphone_gtk_load_identities();
576 }
577
578 static LinphoneProxyConfig *linphone_gtk_get_selected_proxy_config(GtkWidget* pb){
579         GtkTreeView *v=GTK_TREE_VIEW(linphone_gtk_get_widget(pb,"proxy_list"));
580         GtkTreeSelection *selection=gtk_tree_view_get_selection(v);
581         GtkTreeIter iter;
582         GtkTreeModel *model;
583         if (gtk_tree_selection_get_selected(selection,&model,&iter)){
584                 LinphoneProxyConfig *cfg=NULL;
585                 gtk_tree_model_get(model,&iter,PROXY_CONFIG_REF,&cfg,-1);
586                 return cfg;
587         }
588         return NULL;
589 }
590
591 void linphone_gtk_add_proxy(GtkButton *button){
592         linphone_gtk_show_proxy_config(gtk_widget_get_toplevel(GTK_WIDGET(button)),NULL);
593 }
594
595 void linphone_gtk_remove_proxy(GtkButton *button){
596         LinphoneProxyConfig *cfg=linphone_gtk_get_selected_proxy_config(
597                         gtk_widget_get_toplevel(GTK_WIDGET(button)));
598         if (cfg){
599                 linphone_core_remove_proxy_config(linphone_gtk_get_core(),cfg);
600                 linphone_gtk_show_sip_accounts(gtk_widget_get_toplevel(GTK_WIDGET(button)));
601                 /* also update the main window's list of identities*/
602                 linphone_gtk_load_identities();
603         }
604 }
605
606 void linphone_gtk_edit_proxy(GtkButton *button){
607         GtkWidget *pb=gtk_widget_get_toplevel(GTK_WIDGET(button));
608         LinphoneProxyConfig *cfg=linphone_gtk_get_selected_proxy_config(pb);
609         if (cfg){
610                 linphone_gtk_show_proxy_config(pb,cfg);
611                 /* also update the main window's list of identities*/
612                 linphone_gtk_load_identities();
613         }
614 }
615
616 typedef struct _LangCodes{
617         const char *code;
618         const char *name;
619 }LangCodes;
620
621 static LangCodes supported_langs[]={
622         {       "C"     ,       N_("English")   },
623         {       "fr"    ,       N_("French")    },
624         {       "sv"    ,       N_("Swedish")   },
625         {       "it"    ,       N_("Italian")   },
626         {       "es"    ,       N_("Spanish")   },
627         {       "pt_BR" ,       N_("Brazilian Portugese")       },
628         {       "pl"    ,       N_("Polish")    },
629         {       "de"    ,       N_("German")    },
630         {       "ru"    ,       N_("Russian")   },
631         {       "ja"    ,       N_("Japanese")  },
632         {       "nl"    ,       N_("Dutch")     },
633         {       "hu"    ,       N_("Hungarian") },
634         {       "cs"    ,       N_("Czech")     },
635         {       "zh_CN" ,       N_("Chinese")   },
636         {       NULL    ,       NULL            }
637 };
638
639 static const char *lang_get_name(const char *code){
640         LangCodes *p=supported_langs;
641         while(p->code!=NULL){
642                 if (strcmp(p->code,code)==0) return p->name;
643                 p++;
644         }
645         return NULL;
646 }
647
648 static gboolean lang_equals(const char *l1, const char *l2){
649         return ((strncmp(l1,l2,5)==0 || strncmp(l1,l2,2)==0));
650 }
651
652 static void linphone_gtk_fill_langs(GtkWidget *pb){
653         GtkWidget *combo=linphone_gtk_get_widget(pb,"lang_combo");
654         char code[10];
655         const char *all_langs="C " LINPHONE_ALL_LANGS;
656         const char *name;
657         int i=0,index=0;
658         const char *cur_lang=getenv("LANG");
659         int cur_lang_index=-1;
660         char text[256]={0};
661         if (cur_lang==NULL) cur_lang="C";
662         /* glade creates a combo box without list model and text renderer,
663         unless we fill it with a dummy text.
664         This dummy text needs to be removed first*/
665         gtk_combo_box_remove_text(GTK_COMBO_BOX(combo),0);
666         while(sscanf(all_langs+i,"%s",code)==1){
667                 i+=strlen(code);
668                 while(all_langs[i]==' ') ++i;
669                 name=lang_get_name(code);
670                 snprintf(text,sizeof(text)-1,"%s : %s",code,name!=NULL ? _(name) : code);
671                 gtk_combo_box_append_text(GTK_COMBO_BOX(combo),text);
672                 if (cur_lang_index==-1 && lang_equals(cur_lang,code)) 
673                         cur_lang_index=index;
674                 index++;
675         }
676         gtk_combo_box_set_active(GTK_COMBO_BOX(combo),cur_lang_index);
677 }
678
679 void linphone_gtk_lang_changed(GtkComboBox *combo){
680         const char *selected=gtk_combo_box_get_active_text(combo);
681         char code[10];
682         const char *cur_lang=getenv("LANG");
683         if (selected!=NULL){
684                 sscanf(selected,"%s",code);
685                 if (cur_lang==NULL) cur_lang="C";
686                 if (!lang_equals(cur_lang,code)){
687                         GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(combo))),
688                                 GTK_DIALOG_DESTROY_WITH_PARENT,
689                                 GTK_MESSAGE_INFO,
690                                 GTK_BUTTONS_CLOSE,
691                                 "%s",
692                                 (const gchar*)_("You need to restart linphone for the new language selection to take effect."));
693                                 /* Destroy the dialog when the user responds to it (e.g. clicks a button) */
694                         g_signal_connect_swapped (G_OBJECT (dialog), "response",
695                                         G_CALLBACK (gtk_widget_destroy),
696                                         G_OBJECT (dialog));
697                         gtk_widget_show(dialog);
698                         linphone_gtk_set_lang(code);
699                 }
700         }
701 }
702
703 void linphone_gtk_show_parameters(void){
704         GtkWidget *pb=linphone_gtk_create_window("parameters");
705         LinphoneCore *lc=linphone_gtk_get_core();
706         const char **sound_devices=linphone_core_get_sound_devices(lc);
707         const char *tmp;
708         LinphoneAddress *contact;
709         LinphoneFirewallPolicy pol;
710         GtkWidget *codec_list=linphone_gtk_get_widget(pb,"codec_list");
711         int mtu;
712         /* NETWORK CONFIG */
713         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"ipv6_enabled")),
714                                 linphone_core_ipv6_enabled(lc));
715         gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"sip_port")),
716                                 linphone_core_get_sip_port(lc));
717         gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"audio_rtp_port")),
718                                 linphone_core_get_audio_port(lc));
719         gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"video_rtp_port")),
720                                 linphone_core_get_video_port(lc));
721         tmp=linphone_core_get_nat_address(lc);
722         if (tmp) gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(pb,"nat_address")),tmp);
723         tmp=linphone_core_get_stun_server(lc);
724         if (tmp) gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(pb,"stun_server")),tmp);
725         pol=linphone_core_get_firewall_policy(lc);
726         switch(pol){
727                 case LINPHONE_POLICY_NO_FIREWALL:
728                         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"no_nat")),TRUE);
729                 break;
730                 case LINPHONE_POLICY_USE_NAT_ADDRESS:
731                         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"use_nat_address")),TRUE);
732                 break;
733                 case LINPHONE_POLICY_USE_STUN:
734                         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"use_stun")),TRUE);
735                 break;
736         }
737         mtu=linphone_core_get_mtu(lc);
738         if (mtu<=0){
739                 gtk_widget_set_sensitive(linphone_gtk_get_widget(pb,"mtu"),FALSE);
740                 gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"mtu")),1500);
741                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"mtu_set")),FALSE);
742         }else{
743                 gtk_widget_set_sensitive(linphone_gtk_get_widget(pb,"mtu"),TRUE);
744                 gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"mtu")),mtu);
745                 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"mtu_set")),TRUE);
746         }
747         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"dtmf_sipinfo")),
748                                         linphone_core_get_use_info_for_dtmf(lc));
749         /* MUTIMEDIA CONFIG */
750         linphone_gtk_fill_combo_box(linphone_gtk_get_widget(pb,"playback_device"), sound_devices,
751                                         linphone_core_get_playback_device(lc),CAP_PLAYBACK);
752         linphone_gtk_fill_combo_box(linphone_gtk_get_widget(pb,"ring_device"), sound_devices,
753                                         linphone_core_get_ringer_device(lc),CAP_PLAYBACK);
754         linphone_gtk_fill_combo_box(linphone_gtk_get_widget(pb,"capture_device"), sound_devices,
755                                         linphone_core_get_capture_device(lc), CAP_CAPTURE);
756         linphone_gtk_fill_combo_box(linphone_gtk_get_widget(pb,"webcams"),linphone_core_get_video_devices(lc),
757                                         linphone_core_get_video_device(lc),CAP_IGNORE);
758         linphone_gtk_fill_video_sizes(linphone_gtk_get_widget(pb,"video_size"));
759         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"echo_cancelation")),
760                                         linphone_core_echo_cancellation_enabled(lc));
761
762         gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(linphone_gtk_get_widget(pb,"ring_chooser")),
763                                         linphone_core_get_ring(lc));
764         /* SIP CONFIG */
765         contact=linphone_core_get_primary_contact_parsed(lc);
766         if (contact){
767                 if (linphone_address_get_display_name(contact)) 
768                         gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(pb,"displayname")),linphone_address_get_display_name(contact));
769                 if (linphone_address_get_username(contact))
770                         gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(pb,"username")),linphone_address_get_username(contact));
771         }
772         linphone_address_destroy(contact);
773         linphone_gtk_show_sip_accounts(pb);
774         /* CODECS CONFIG */
775         linphone_gtk_init_codec_list(GTK_TREE_VIEW(codec_list));
776         gtk_combo_box_set_active(GTK_COMBO_BOX(linphone_gtk_get_widget(pb,"codec_view")),0);
777         gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"download_bw")),
778                                 linphone_core_get_download_bandwidth(lc));
779         gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"upload_bw")),
780                                 linphone_core_get_upload_bandwidth(lc));
781
782         linphone_gtk_fill_langs(pb);
783         gtk_widget_show(pb);
784 }