1
/***************************************************************************
2
propertybox.c - description
4
begin : Wed Jan 30 2002
5
copyright : (C) 2002 by Simon Morlat
6
email : simon.morlat@linphone.org
7
***************************************************************************/
9
/***************************************************************************
11
* This program is free software; you can redistribute it and/or modify *
12
* it under the terms of the GNU General Public License as published by *
13
* the Free Software Foundation; either version 2 of the License, or *
14
* (at your option) any later version. *
16
***************************************************************************/
40
#define get_core() (uiobj->core)
41
#define get_property_box() (&uiobj->propbox)
42
#define property_box_changed() gnome_property_box_changed(GNOME_PROPERTY_BOX ( (&uiobj->propbox)->prop))
46
void net_section_init(NetSection *sec, GtkWidget *prop)
48
sec->au_port=lookup_widget(prop,"audioport");
49
sec->audio_jittcomp=lookup_widget(prop,"audio_jittcomp");
50
#ifdef LINPHONE_DEPRECATED
51
sec->interfaces=lookup_widget(prop, "interfaces");
53
sec->enable_nat=lookup_widget(prop,"enable_nat");
54
sec->nat_address=lookup_widget(prop,"nat_address");
55
sec->nat_label=lookup_widget(prop,"nat_label");
58
void codec_list_update(GtkTreeView *listview,double bandwidth);
60
void on_connection_type_selected(CodecSection *sec, gint type)
62
/* we must call linphone_core so that codec usability is checked */
63
linphone_core_set_connection_type(get_core(),type);
64
codec_list_update(GTK_TREE_VIEW(sec->au_codec_list),bandwidths[type]);
66
property_box_changed();
69
void on_28k_selected(GtkMenuItem *menuitem, gpointer user_data)
71
on_connection_type_selected((CodecSection*)user_data , 0);
74
void on_56k_selected(GtkMenuItem *menuitem, gpointer user_data)
76
on_connection_type_selected((CodecSection*)user_data , 1);
79
void on_128k_selected(GtkMenuItem *menuitem, gpointer user_data)
81
on_connection_type_selected((CodecSection*)user_data , 2);
84
void on_adsl_selected(GtkMenuItem *menuitem, gpointer user_data)
86
on_connection_type_selected((CodecSection*)user_data , 3);
89
void on_ethernet_selected(GtkMenuItem *menuitem, gpointer user_data)
91
on_connection_type_selected((CodecSection*)user_data , 4);
94
void net_selection_changed_cb(GtkTreeSelection *select, gpointer userdata)
96
property_box_changed();
99
void net_section_fill(NetSection *sec,LinphoneCore *lc)
103
GList *item_list,*elem;
104
GtkListStore *store ;
105
GtkTreeIter iter,selected;
106
GtkCellRenderer *renderer;
107
GtkTreeViewColumn *column;
108
GtkTreeSelection *select;
113
value=(gfloat)linphone_core_get_audio_jittcomp(lc);
114
/* put the current value of jitt_comp*/
115
gtk_adjustment_set_value (gtk_range_get_adjustment(GTK_RANGE(sec->audio_jittcomp)),value);
116
/* display current rtp port */
117
gtk_spin_button_set_value(GTK_SPIN_BUTTON(sec->au_port),
118
(gfloat)linphone_core_get_audio_port(lc));
120
#ifdef LINPHONE_DEPRECATED
121
store= gtk_list_store_new (IFACE_NCOLUMNS, G_TYPE_INT, G_TYPE_STRING,G_TYPE_STRING);
122
/* draw the list of interface */
123
elem=linphone_core_get_net_interfaces(lc);
125
interface_t *iface=(interface_t *)elem->data;
126
/* get an iterator */
127
gtk_list_store_append(store,&iter);
128
if (iface==linphone_core_get_selected_interface(lc)){
132
gtk_list_store_set(store,&iter, IFACE_INDEX, iface->index, IFACE_NAME,iface->name,IFACE_ADDR,iface->ipaddr,-1);
134
gtk_list_store_set(store,&iter,IFACE_NAME,iface->name,IFACE_ADDR,iface->ip4addr,-1);
136
elem=g_list_next(elem);
138
gtk_tree_view_set_model(GTK_TREE_VIEW(sec->interfaces),GTK_TREE_MODEL(store));
139
g_object_unref(G_OBJECT(store));
140
renderer = gtk_cell_renderer_text_new ();
142
column = gtk_tree_view_column_new_with_attributes (_("Index"),
146
gtk_tree_view_append_column (GTK_TREE_VIEW (sec->interfaces), column);
148
column = gtk_tree_view_column_new_with_attributes (_("Name"),
152
gtk_tree_view_append_column (GTK_TREE_VIEW (sec->interfaces), column);
153
column = gtk_tree_view_column_new_with_attributes (_("Address"),
157
gtk_tree_view_append_column (GTK_TREE_VIEW (sec->interfaces), column);
158
/* Setup the selection handler */
159
select = gtk_tree_view_get_selection (GTK_TREE_VIEW (sec->interfaces));
160
gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE);
161
gtk_tree_selection_select_iter(select,&selected);
162
g_signal_connect (G_OBJECT (select), "changed",
163
G_CALLBACK (net_selection_changed_cb),
165
gtk_tree_view_columns_autosize(GTK_TREE_VIEW (sec->interfaces));
169
tmp=linphone_core_get_nat_address(lc,&use_nat);
171
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sec->enable_nat),use_nat);
173
gtk_entry_set_text(GTK_ENTRY(sec->nat_address),tmp);
180
on_enable_nat_toggled (GtkToggleButton *togglebutton,
183
LinphonePropertyBox *prop=get_property_box();
184
NetSection *sec=&prop->net;
186
use_nat=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sec->enable_nat));
187
gtk_widget_set_sensitive(sec->nat_label,use_nat);
188
gtk_widget_set_sensitive(sec->nat_address,use_nat);
189
property_box_changed();
196
on_nat_address_changed (GtkEditable *editable,
199
property_box_changed();
204
void net_section_apply(NetSection *sec,LinphoneCore *lc)
206
GtkTreeSelection *select;
211
#ifdef LINPHONE_DEPRECATED
215
/* get network interface*/
216
select = gtk_tree_view_get_selection (GTK_TREE_VIEW (sec->interfaces));
217
if (gtk_tree_selection_get_selected (select, &model, &iter))
220
gtk_tree_model_get (model, &iter, IFACE_INDEX , &index, -1);
221
linphone_core_select_net_interface(lc,index);
223
gtk_tree_model_get (model, &iter,IFACE_NAME , &name, -1);
224
linphone_core_select_net_interface(lc,name);
228
linphone_core_set_connection_type(lc,sec->type_sel);
231
use_nat=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sec->enable_nat));
232
name=gtk_editable_get_chars(GTK_EDITABLE(sec->nat_address),0,-1);
233
linphone_core_set_nat_address(lc,name,use_nat);
236
/* get the value of jitt_comp*/
237
GtkAdjustment *adj= gtk_range_get_adjustment(GTK_RANGE(sec->audio_jittcomp));
238
linphone_core_set_audio_jittcomp(lc,(gint)adj->value);
240
adj=gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(sec->au_port));
241
linphone_core_set_audio_port(lc,(gint)adj->value);
245
void sip_section_init(SipSection *sec,GtkWidget *prop)
247
sec->port=lookup_widget(prop,"sip_port");
248
sec->username=lookup_widget(prop, "user_name");
249
sec->hostname=lookup_widget(prop,"domain_name");
250
sec->registrar_checked=lookup_widget(prop, "registrar_checked");
251
sec->server_label=lookup_widget(prop,"server_label");
252
sec->server=lookup_widget(prop,"registrar_addr");
253
sec->password=lookup_widget(prop,"reg_passwd");
254
sec->password_label=lookup_widget(prop,"regpasslabel");
255
sec->addr_of_rec_label=lookup_widget(prop,"addressrec_label");
256
sec->addr_of_rec=lookup_widget(prop,"address_of_record");
257
sec->registrar_toggle=lookup_widget(prop,"registrar_checked");
258
sec->obproxy_button=lookup_widget(prop, "obproxy_button");
261
void sip_section_enable_registrar(SipSection *sec,LinphoneCore *lc, gboolean state)
263
gtk_widget_set_sensitive(sec->server_label,state);
264
gtk_widget_set_sensitive(sec->server,state);
265
gtk_widget_set_sensitive(sec->password_label,state);
266
gtk_widget_set_sensitive(sec->password,state);
267
gtk_widget_set_sensitive(sec->addr_of_rec_label,state);
268
gtk_widget_set_sensitive(sec->addr_of_rec,state);
269
gtk_widget_set_sensitive(sec->obproxy_button,state);
273
linphone_core_get_registrar_usage(lc,NULL,&flag,NULL);
274
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sec->obproxy_button),flag);
277
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sec->obproxy_button),0);
281
void sip_section_fill(SipSection *sec, LinphoneCore *lc)
287
gtk_spin_button_set_value(GTK_SPIN_BUTTON(sec->port),
288
(gfloat)linphone_core_get_sip_port(lc));
289
contact=linphone_core_get_primary_contact_parsed(lc);
290
g_return_if_fail(contact!=NULL);
291
/* set sip username */
292
gtk_entry_set_text(GTK_ENTRY(sec->username),contact->url->username);
293
/* set domain name */
294
gtk_entry_set_text(GTK_ENTRY(sec->hostname),contact->url->host);
297
/* set registrar address*/
298
tmp=linphone_core_get_registrar_addr(lc);
299
if (tmp!=NULL) gtk_entry_set_text(GTK_ENTRY(sec->server),tmp);
300
/* set registrar password */
301
tmp=linphone_core_get_registrar_passwd(lc);
302
if (tmp!=NULL) gtk_entry_set_text(GTK_ENTRY(sec->password),tmp);
303
tmp=linphone_core_get_addr_of_rec(lc);
304
/* set address of record */
305
if (tmp==NULL) gtk_entry_set_text(GTK_ENTRY(sec->addr_of_rec),tmp);
306
linphone_core_get_registrar_usage(lc,&flag,NULL,NULL);
309
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sec->registrar_toggle),1);
310
/* putting this button active will send the signal "toggled", and so the registrar_toggled is called to do all the work*/
314
void sip_section_apply(SipSection *sec, LinphoneCore *lc)
317
gchar *tmp,*username,*hostname,*passwd;
318
gchar *regaddr,*addr_of_rec;
319
gint state,as_proxy=0,ind,err;
322
adj=gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(sec->port));
324
username=gtk_editable_get_chars(GTK_EDITABLE(sec->username),0,-1);
325
if (username!=NULL && strlen(username)!=0)
327
hostname=gtk_editable_get_chars(GTK_EDITABLE(sec->hostname),0,-1);
328
if (hostname!=NULL && strlen(hostname)!=0)
330
tmp=g_strdup_printf("sip:%s@%s",username,hostname);
331
linphone_core_set_primary_contact(lc,tmp);
332
linphone_core_set_sip_port(lc,(int)gtk_adjustment_get_value(adj));
339
state=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sec->registrar_toggle));
341
as_proxy=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sec->obproxy_button));
342
/* get the registrar url */
343
regaddr=gtk_editable_get_chars(GTK_EDITABLE(sec->server),0,-1);
344
/* get the address of record */
345
addr_of_rec=gtk_editable_get_chars(GTK_EDITABLE(sec->addr_of_rec),0,-1);
346
linphone_core_set_registrar_addr(lc,regaddr,addr_of_rec);
348
passwd=gtk_editable_get_chars(GTK_EDITABLE(sec->password),0,-1);
349
linphone_core_set_registrar_passwd(lc,passwd);
354
linphone_core_set_registrar_usage(lc,state,as_proxy,0);
357
void codec_section_init(CodecSection *sec, GtkWidget *prop)
359
sec->au_codec_list=lookup_widget(prop,"au_codec_list");
360
sec->codec_info=lookup_widget(prop,"codec_info");
361
sec->connection_type=lookup_widget(prop,"connection_type");
364
void codec_selection_changed_cb(GtkTreeSelection *selection, gpointer data)
368
struct _PayloadType *pt=NULL;
369
LinphonePropertyBox *prop=get_property_box();
371
if (gtk_tree_selection_get_selected (selection, &model, &iter))
373
gtk_tree_model_get (model, &iter, CODEC_PRIVDATA, &pt, -1);
374
g_return_if_fail(pt!=NULL);
375
/* display the codec information */
376
gtk_label_set_text(GTK_LABEL(prop->codec.codec_info),payload_type_get_description(pt));
380
void codec_list_build(GtkTreeView *listview,GList *codeclist)
382
GList *elem=codeclist;
383
GtkListStore *store = gtk_list_store_new (CODEC_NCOLUMNS, G_TYPE_STRING,
390
GtkCellRenderer *renderer;
391
GtkTreeViewColumn *column;
392
GtkTreeSelection *select=gtk_tree_view_get_selection (listview);
395
gchar *bitrate,*rate;
397
struct _PayloadType *pt=(struct _PayloadType *)elem->data;
398
if (payload_type_enabled(pt)) status=_("Enabled");
399
else status=_("Disabled");
400
if (payload_type_usable(pt)) color="blue";
402
/* get an iterator */
403
gtk_list_store_append(store,&iter);
404
bitrate=g_strdup_printf("%g",((double)payload_type_get_bitrate(pt))/1000.0);
405
rate=g_strdup_printf("%i",payload_type_get_rate(pt));
406
gtk_list_store_set(store,&iter, CODEC_NAME,payload_type_get_mime(pt),
408
CODEC_BITRATE,bitrate,
410
CODEC_PRIVDATA,(gpointer)pt,
411
CODEC_COLOR,(gpointer)color,
415
elem=g_list_next(elem);
417
gtk_tree_view_set_model(listview,GTK_TREE_MODEL(store));
418
g_object_unref(G_OBJECT(store));
419
renderer = gtk_cell_renderer_text_new ();
420
column = gtk_tree_view_column_new_with_attributes (_("Name"),
423
"foreground",CODEC_COLOR,
425
gtk_tree_view_append_column (listview, column);
426
column = gtk_tree_view_column_new_with_attributes (_("Rate (Hz)"),
429
"foreground",CODEC_COLOR,
431
gtk_tree_view_append_column (listview, column);
432
column = gtk_tree_view_column_new_with_attributes (_("Status"),
434
"text", CODEC_STATUS,
435
"foreground",CODEC_COLOR,
437
gtk_tree_view_append_column (listview, column);
438
column = gtk_tree_view_column_new_with_attributes (_("Min bitrate (kbit/s)"),
440
"text", CODEC_BITRATE,
441
"foreground",CODEC_COLOR,
443
gtk_tree_view_append_column (listview, column);
445
/* Setup the selection handler */
446
select = gtk_tree_view_get_selection (listview);
447
gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE);
448
//gtk_tree_view_columns_autosize(GTK_TREE_VIEW (sec->interfaces));
449
g_signal_connect (G_OBJECT (select), "changed",
450
G_CALLBACK (codec_selection_changed_cb),
454
void codec_section_fill(CodecSection *sec, LinphoneCore *lc)
456
GtkWidget *optionmenu=sec->connection_type;
459
GtkMenuShell *menushell;
460
GList *item_list,*elem;
461
/* display prefered codecs*/
462
GList *audio_codecs=linphone_core_get_audio_codecs(lc);
463
codec_list_build(GTK_TREE_VIEW(sec->au_codec_list),audio_codecs);
464
g_list_free(audio_codecs);
465
menu=gtk_option_menu_get_menu(GTK_OPTION_MENU(optionmenu));
466
menushell=GTK_MENU_SHELL(menu);
467
elem=item_list=menushell->children;
470
menu_item=(GtkItem*)(elem->data);
471
gtk_signal_connect(GTK_OBJECT(menu_item),"activate",(GtkSignalFunc)on_28k_selected,(gpointer)sec);
472
elem=g_list_next(elem);
474
menu_item=(GtkItem*)(elem->data);
475
gtk_signal_connect(GTK_OBJECT(menu_item),"activate",(GtkSignalFunc)on_56k_selected,(gpointer)sec);
476
elem=g_list_next(elem);
478
menu_item=(GtkItem*)(elem->data);
479
gtk_signal_connect(GTK_OBJECT(menu_item),"activate",(GtkSignalFunc)on_128k_selected,(gpointer)sec);
480
elem=g_list_next(elem);
482
menu_item=(GtkItem*)(elem->data);
483
gtk_signal_connect(GTK_OBJECT(menu_item),"activate",(GtkSignalFunc)on_adsl_selected,(gpointer)sec);
484
elem=g_list_next(elem);
485
/* Ethernet menu item */
486
menu_item=(GtkItem*)(elem->data);
487
gtk_signal_connect(GTK_OBJECT(menu_item),"activate",(GtkSignalFunc)on_ethernet_selected,(gpointer)sec);
488
elem=g_list_next(elem);
489
sec->type_sel=linphone_core_get_connection_type(lc);
490
gtk_option_menu_set_history(GTK_OPTION_MENU(optionmenu),sec->type_sel);
495
void codec_section_apply(CodecSection *sec, LinphoneCore *lc)
498
struct _PayloadType *pt;
499
GList *codeclist=NULL;
501
GtkTreeModel *model=gtk_tree_view_get_model(GTK_TREE_VIEW(sec->au_codec_list));
502
/* retrieve the codec list */
503
g_return_if_fail(gtk_tree_model_get_iter_first(model,&iter));
505
gtk_tree_model_get (model, &iter, CODEC_STATUS,&status,CODEC_PRIVDATA, &pt,-1);
506
g_return_if_fail(pt!=NULL);
507
if (strcmp(status,_("Enabled"))==0) payload_type_set_enable(pt,1);
508
else payload_type_set_enable(pt,0);
509
codeclist=g_list_append(codeclist,(gpointer)pt);
510
}while (gtk_tree_model_iter_next(model,&iter));
511
linphone_core_set_audio_codecs(lc,codeclist);
514
void sound_section_init(SoundSection *sec, GtkWidget *prop)
516
sec->card_entry=lookup_widget(prop,"card_entry");
517
sec->card_combo=lookup_widget(prop,"card_combo");
518
sec->source_entry=lookup_widget(prop,"rec_source");
519
sec->ringfileentry=lookup_widget(prop,"ringfileentry");
522
void sound_section_fill(SoundSection *sec, LinphoneCore *lc)
526
SndCardManager *cardmanager;
528
GList *cardlist=NULL;
530
/* select used sound drivers*/
532
devid=linphone_core_get_sound_device(lc);
533
cardmanager=linphone_core_get_card_manager(lc);
535
for (i=0;(card=snd_card_manager_get_card(cardmanager,i))!=0;i++){
536
cardlist=g_list_append(cardlist,snd_card_get_identifier(card));
538
gtk_combo_set_popdown_strings(GTK_COMBO(sec->card_combo),cardlist);
539
card=snd_card_manager_get_card(cardmanager,devid);
540
g_return_if_fail(card!=NULL);
541
gtk_entry_set_text (GTK_ENTRY (sec->card_entry),snd_card_get_identifier(card));
543
/* select audio source*/
544
switch(linphone_core_get_sound_source(lc))
547
gtk_entry_set_text (GTK_ENTRY (sec->source_entry), _("micro"));
550
gtk_entry_set_text (GTK_ENTRY (sec->source_entry), _("line"));
553
g_warning("Invalid source !");
556
gchar *ringfile=linphone_core_get_ring(lc);
557
gnome_file_entry_set_filename(GNOME_FILE_ENTRY(sec->ringfileentry),ringfile);
563
on_card_changed (GtkEditable *editable,
568
/* get sound device*/
569
tmp=gtk_editable_get_chars(editable,0,-1);
570
linphone_core_set_sound_device_from_name(get_core(),tmp);
575
void sound_section_apply(SoundSection *sec, LinphoneCore *lc)
580
/* get sound device*/
581
tmp=gtk_editable_get_chars(GTK_EDITABLE(sec->card_entry),0,-1);
582
linphone_core_set_sound_device_from_name(lc,tmp);
585
/* get audio source*/
586
tmp=gtk_editable_get_chars(GTK_EDITABLE(sec->source_entry),0,-1);
587
if (strcmp(tmp,_("micro"))==0) linphone_core_set_sound_source(lc,'m');
588
else if (strcmp(tmp,_("line"))==0) linphone_core_set_sound_source(lc,'l');
592
tmp=gtk_editable_get_chars(GTK_EDITABLE(gnome_file_entry_gtk_entry(GNOME_FILE_ENTRY(sec->ringfileentry))),0,-1);
593
linphone_core_set_ring(lc,tmp);
598
void ring_finished(LinphoneCore *lc,gpointer user_data)
600
GtkWidget *button=(GtkWidget*)user_data;
601
LinphonePropertyBox *prop=get_property_box();
602
if (prop->prop==NULL) return; /* the box has been closed before the end of the preview */
603
gtk_widget_set_sensitive(button,1);
607
on_ringpreview_clicked (GtkButton *button,
612
LinphonePropertyBox *prop=get_property_box();
613
LinphoneCore *lc=get_core();
615
tmp=gtk_editable_get_chars(GTK_EDITABLE(gnome_file_entry_gtk_entry(GNOME_FILE_ENTRY(prop->sound.ringfileentry))),0,-1);
616
err=linphone_core_preview_ring(lc,tmp,ring_finished,(gpointer)button);
617
if (err==0) gtk_widget_set_sensitive(GTK_WIDGET(button),0);
622
void linphone_property_box_fill(LinphonePropertyBox * box, LinphoneCore *lp)
624
net_section_fill(&box->net,lp);
625
sip_section_fill(&box->sip,lp);
626
codec_section_fill(&box->codec,lp);
627
sound_section_fill(&box->sound,lp);
628
/* set uchanged state to the prop1 box, because gtk_entry_set_text() causes signal "changed"
630
gnome_property_box_set_state(GNOME_PROPERTY_BOX(box->prop),0);
633
void linphone_property_box_init(LinphonePropertyBox *box)
635
GtkWidget *prop=create_prop1();
637
net_section_init(&box->net,prop);
638
sip_section_init(&box->sip,prop);
639
codec_section_init(&box->codec,prop);
640
sound_section_init(&box->sound,prop);
641
gtk_widget_show(prop);
642
linphone_property_box_fill(box,get_core());
648
void on_propertybox1_apply (GtkButton *button,
651
LinphonePropertyBox *prop=get_property_box();
652
LinphoneCore *lc=get_core();
656
net_section_apply(&prop->net,lc);
659
sound_section_apply(&prop->sound,lc);
662
sip_section_apply(&prop->sip,lc);
665
codec_section_apply(&prop->codec,lc);
672
on_audioport_changed (GtkEditable *editable,
675
LinphonePropertyBox *prop=get_property_box();
676
gnome_property_box_changed(GNOME_PROPERTY_BOX(prop->prop));
682
on_sipport_changed (GtkEditable *editable,
685
LinphonePropertyBox *prop=get_property_box();
686
gnome_property_box_changed(GNOME_PROPERTY_BOX(prop->prop));
692
on_source_changed (GtkEditable *editable,
695
LinphonePropertyBox *prop=get_property_box();
696
gnome_property_box_changed(GNOME_PROPERTY_BOX(prop->prop));
705
void codec_row_move(GtkTreeView *listview, int action)
708
GtkTreeIter previter,nextiter,newiter;
710
GtkTreeSelection *selection;
711
GtkTreePath *treepath;
712
struct _PayloadType *codec=NULL;
719
selection=gtk_tree_view_get_selection(listview);
720
if (gtk_tree_selection_get_selected (selection, &model, &iter))
722
gtk_tree_model_get (model, &iter, CODEC_NAME,&name,
724
CODEC_BITRATE,&bitrate,
725
CODEC_STATUS,&status,
726
CODEC_PRIVDATA, &codec,
729
g_return_if_fail(codec!=NULL);
731
case CODEC_ACTION_UP:
732
/* get an iterator on the prev codec */
733
treepath=gtk_tree_model_get_path(model,&iter);
734
if (!gtk_tree_path_prev(treepath)){
735
/* codec is the first, no match. */
738
gtk_tree_model_get_iter(model,&previter,treepath);
739
gtk_list_store_insert_before(GTK_LIST_STORE(model),&newiter,&previter);
741
case CODEC_ACTION_DOWN:
742
/* get an iterator on the next codec */
744
if (!gtk_tree_model_iter_next(model,&nextiter)){
745
/* codec is the last, no match. */
748
gtk_list_store_insert_after(GTK_LIST_STORE(model),&newiter,&nextiter);
752
gtk_list_store_set(GTK_LIST_STORE(model),&newiter,
755
CODEC_BITRATE,bitrate,
757
CODEC_PRIVDATA, codec,
760
/* remove the selected line */
761
gtk_list_store_remove(GTK_LIST_STORE(model),&iter);
762
gtk_tree_selection_select_iter(selection,&newiter);
772
on_aucodec_up_clicked (GtkButton *button,
775
LinphonePropertyBox *prop=get_property_box();
776
GtkTreeView *listview=GTK_TREE_VIEW(prop->codec.au_codec_list);
777
codec_row_move(listview,CODEC_ACTION_UP);
778
property_box_changed();
783
on_aucodec_down_clicked (GtkButton *button,
786
LinphonePropertyBox *prop=get_property_box();
787
GtkTreeView *listview=GTK_TREE_VIEW(prop->codec.au_codec_list);
788
codec_row_move(listview,CODEC_ACTION_DOWN);
789
property_box_changed();
792
void codec_set_status(GtkTreeView *listview,gboolean status)
795
GtkTreeSelection *selection;
798
selection=gtk_tree_view_get_selection(listview);
799
if (gtk_tree_selection_get_selected (selection, &model, &iter))
801
if (status) statusstring=_("Enabled");
802
else statusstring=_("Disabled");
803
gtk_list_store_set(GTK_LIST_STORE(model),&iter,CODEC_STATUS,statusstring,-1);
807
void codec_list_update(GtkTreeView *listview,double bandwidth)
811
struct _PayloadType *pt;
813
model=gtk_tree_view_get_model(listview);
815
g_return_if_fail(gtk_tree_model_get_iter_first(model,&iter));
817
gtk_tree_model_get (model, &iter, CODEC_PRIVDATA, &pt,-1);
818
if (payload_type_usable(pt)){
821
gtk_list_store_set(GTK_LIST_STORE(model),&iter,CODEC_COLOR,color,-1);
823
}while (gtk_tree_model_iter_next(model,&iter));
828
on_aucodec_enable_clicked (GtkButton *button,
831
codec_set_status(GTK_TREE_VIEW(get_property_box()->codec.au_codec_list),TRUE);
832
property_box_changed();
837
on_aucodec_disable_clicked (GtkButton *button,
840
codec_set_status(GTK_TREE_VIEW(get_property_box()->codec.au_codec_list),FALSE);
841
property_box_changed();
847
on_registrar_checked_toggled (GtkToggleButton *togglebutton,
852
state=gtk_toggle_button_get_active(togglebutton);
853
sip_section_enable_registrar(&(get_property_box()->sip),get_core(), state);
854
property_box_changed();
859
on_user_name_changed (GtkEditable *editable,
862
GtkWidget *server=get_property_box()->sip.server;
864
//on_registrar_addr_changed(GTK_EDITABLE(server),NULL);
865
property_box_changed();
870
on_domain_name_changed (GtkEditable *editable,
873
property_box_changed();
878
on_registrar_addr_changed (GtkEditable *editable,
881
GtkWidget *address_of_record=get_property_box()->sip.addr_of_rec;
882
GtkWidget *username=get_property_box()->sip.username;
884
gchar *hostname,*addrrec,*tmp;
886
/* address of record domain host part should usually be also the name of the registrar when it is used*/
887
tmp=gtk_editable_get_chars(editable,0,-1);
888
if ((tmp!=NULL) && (strlen(tmp)!=0))
891
err=url_parse(url1,tmp);
901
addrrec=gtk_editable_get_chars(GTK_EDITABLE(address_of_record),0,-1);
904
if ((addrrec!=NULL) && (strlen(addrrec)!=0)){
905
err=url_parse(url2,addrrec);
906
//printf("address of record parsed with err=%i\n",err);
907
if (err<0) {url2->host=NULL;url2->username=NULL;};
909
if (url2->host!=NULL) sfree(url2->host);
910
if ((hostname!=NULL) && (strlen(hostname)!=0)) url2->host=sgetcopy(hostname);
912
tmp=gtk_editable_get_chars(GTK_EDITABLE(get_property_box()->sip.hostname),0,-1);
913
url2->host=sgetcopy(tmp);
916
//printf ("url2->host=%s\n",url2->host);
917
if (url2->username==NULL){
918
tmp=gtk_editable_get_chars(GTK_EDITABLE(username),0,-1);
919
url2->username=sgetcopy(tmp);
922
url_setscheme(url2,sgetcopy("sip"));
923
url_2char(url2,&tmp) ;
925
//printf("New address of record is %s\n",tmp);
926
gtk_entry_set_text(GTK_ENTRY(address_of_record),tmp);
933
property_box_changed();
937
on_reg_passwd_changed (GtkEditable *editable,
940
property_box_changed();
945
on_obproxy_button_toggled (GtkToggleButton *togglebutton,
948
property_box_changed();
952
on_address_of_record_changed (GtkEditable *editable,
955
property_box_changed();
960
on_audio_jittcomp_value_changed (GtkRange *range,
963
property_box_changed();
967
on_ringfileentry_changed (GtkEditable *editable,
970
property_box_changed();
973
void linphone_property_box_uninit(LinphonePropertyBox *box)
975
memset(box,0, sizeof(LinphonePropertyBox));
981
on_property_box_closed (GnomeDialog *gnomedialog,
984
linphone_property_box_uninit(get_property_box());
1
/***************************************************************************
2
propertybox.c - description
4
begin : Wed Jan 30 2002
5
copyright : (C) 2002 by Simon Morlat
6
email : simon.morlat@linphone.org
7
***************************************************************************/
9
/***************************************************************************
11
* This program is free software; you can redistribute it and/or modify *
12
* it under the terms of the GNU General Public License as published by *
13
* the Free Software Foundation; either version 2 of the License, or *
14
* (at your option) any later version. *
16
***************************************************************************/
40
#define get_core() (uiobj->core)
41
#define get_property_box() (&uiobj->propbox)
42
#define property_box_changed() gnome_property_box_changed(GNOME_PROPERTY_BOX ( (&uiobj->propbox)->prop))
43
#define get_main_window() (&uiobj->main_window)
45
#if !GTK_CHECK_VERSION(2,6,0)
46
static gchar * _lp_combo_box_get_active_text (GtkComboBox *combobox)
51
model = gtk_combo_box_get_model (combobox);
52
if (gtk_combo_box_get_active_iter (combobox, &iter) && model)
53
gtk_tree_model_get (model, &iter, 0, &text, -1);
56
#endif /* GTK+ < 2.6.0 */
58
void net_section_init(NetSection *sec, GtkWidget *prop)
60
sec->au_port=lookup_widget(prop,"audioport");
61
sec->audio_jittcomp=lookup_widget(prop,"audio_jittcomp");
62
#ifdef LINPHONE_DEPRECATED
63
sec->interfaces=lookup_widget(prop, "interfaces");
65
sec->nat_address=lookup_widget(prop,"nat_address");
66
sec->use_sipinfo=lookup_widget(prop,"use_sipinfo");
67
sec->enable_ipv6=lookup_widget(prop,"enable_ipv6");
70
void codec_list_update(GtkTreeView *listview);
73
void net_selection_changed_cb(GtkTreeSelection *select, gpointer userdata)
75
property_box_changed();
78
void net_section_fill(NetSection *sec,LinphoneCore *lc)
81
const gchar *nat_address,*stun_server;
83
value=(gfloat)linphone_core_get_audio_jittcomp(lc);
84
/* put the current value of jitt_comp*/
85
gtk_adjustment_set_value (gtk_range_get_adjustment(GTK_RANGE(sec->audio_jittcomp)),value);
86
/* display current rtp port */
87
gtk_spin_button_set_value(GTK_SPIN_BUTTON(sec->au_port),
88
(gfloat)linphone_core_get_audio_port(lc));
92
nat_address=linphone_core_get_nat_address(lc);
94
if (linphone_core_get_firewall_policy(lc)==LINPHONE_POLICY_USE_NAT_ADDRESS)
95
gtk_toggle_button_set_active(
96
GTK_TOGGLE_BUTTON(lookup_widget(get_property_box()->prop,"static_nat"))
99
if (nat_address!=NULL) {
100
gtk_entry_set_text(GTK_ENTRY(sec->nat_address),nat_address);
102
stun_server=linphone_core_get_stun_server(lc);
103
if (stun_server!=NULL)
105
GTK_ENTRY(lookup_widget(get_property_box()->prop,"stun_server")),
107
if (linphone_core_get_firewall_policy(lc)==LINPHONE_POLICY_USE_STUN)
108
gtk_toggle_button_set_active(
109
GTK_TOGGLE_BUTTON(lookup_widget(get_property_box()->prop,"use_stun")),TRUE);
112
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sec->use_sipinfo),
113
linphone_core_get_use_info_for_dtmf(lc));
114
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sec->enable_ipv6),
115
linphone_core_ipv6_enabled(lc));
119
on_enable_nat_toggled (GtkToggleButton *togglebutton,
122
property_box_changed();
129
on_nat_address_changed (GtkEditable *editable,
132
property_box_changed();
136
on_enable_ipv6_toggled (GtkToggleButton *togglebutton,
139
property_box_changed();
143
void net_section_apply(NetSection *sec,LinphoneCore *lc)
145
gboolean use_nat,use_stun;
148
use_nat=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
149
lookup_widget(get_property_box()->prop,"static_nat")));
150
name=gtk_editable_get_chars(GTK_EDITABLE(sec->nat_address),0,-1);
151
linphone_core_set_nat_address(lc,name);
154
use_stun=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
155
lookup_widget(get_property_box()->prop,"use_stun") ));
156
name=gtk_editable_get_chars(GTK_EDITABLE(
157
lookup_widget(get_property_box()->prop,"stun_server") ),0,-1);
158
linphone_core_set_stun_server(lc,name);
160
if (use_stun) linphone_core_set_firewall_policy(lc,
161
LINPHONE_POLICY_USE_STUN);
162
else if (use_nat) linphone_core_set_firewall_policy(lc,
163
LINPHONE_POLICY_USE_NAT_ADDRESS);
164
else linphone_core_set_firewall_policy(lc,
165
LINPHONE_POLICY_NO_FIREWALL);
168
/* get the value of jitt_comp*/
169
GtkAdjustment *adj= gtk_range_get_adjustment(GTK_RANGE(sec->audio_jittcomp));
170
linphone_core_set_audio_jittcomp(lc,(gint)adj->value);
172
adj=gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(sec->au_port));
173
linphone_core_set_audio_port(lc,(gint)adj->value);
175
linphone_core_enable_ipv6(lc,gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sec->enable_ipv6)));
180
PROXY_CONFIG_IDENTITY,
185
void sip_section_init(SipSection *sec,GtkWidget *prop)
189
GtkCellRenderer *renderer;
190
GtkTreeViewColumn *column;
191
GtkTreeSelection *select;
192
sec->port=lookup_widget(prop,"sip_port");
193
sec->username=lookup_widget(prop, "user_name");
194
sec->hostname=lookup_widget(prop,"domain_name");
195
sec->proxy_list=lookup_widget(prop,"proxy_list");
196
sec->guess_hostname=lookup_widget(prop,"guess_hostname");
197
/* create the proxy list */
198
store = gtk_list_store_new (PROXY_CONFIG_NCOL, G_TYPE_STRING, G_TYPE_POINTER);
200
gtk_tree_view_set_model(GTK_TREE_VIEW(sec->proxy_list),GTK_TREE_MODEL(store));
201
g_object_unref(G_OBJECT(store));
202
renderer = gtk_cell_renderer_text_new ();
203
column = gtk_tree_view_column_new_with_attributes (_("Account"),
205
"text", PROXY_CONFIG_IDENTITY,
207
gtk_tree_view_append_column (GTK_TREE_VIEW (sec->proxy_list), column);
209
select = gtk_tree_view_get_selection (GTK_TREE_VIEW (sec->proxy_list));
210
gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE);
214
void proxy_list_fill(GtkTreeModel *model, LinphoneCore *lc){
217
/* fill the proxy list */
218
gtk_list_store_clear(GTK_LIST_STORE(model));
219
elem=linphone_core_get_proxy_config_list(lc);
220
for(;elem!=NULL;elem=ms_list_next(elem)){
221
LinphoneProxyConfig *pcfg=(LinphoneProxyConfig*)elem->data;
222
gtk_list_store_append(GTK_LIST_STORE(model),&iter);
223
gtk_list_store_set(GTK_LIST_STORE(model),&iter,PROXY_CONFIG_IDENTITY,pcfg->reg_identity,
224
PROXY_CONFIG_REF,pcfg,-1);
228
void sip_section_fill(SipSection *sec, LinphoneCore *lc)
230
osip_from_t *contact;
231
GtkTreeModel *model=gtk_tree_view_get_model(GTK_TREE_VIEW(sec->proxy_list));
234
gtk_spin_button_set_value(GTK_SPIN_BUTTON(sec->port),
235
(gfloat)linphone_core_get_sip_port(lc));
236
contact=linphone_core_get_primary_contact_parsed(lc);
237
g_return_if_fail(contact!=NULL);
238
/* set sip username */
239
gtk_entry_set_text(GTK_ENTRY(sec->username),contact->url->username);
240
/* set domain name */
241
gtk_entry_set_text(GTK_ENTRY(sec->hostname),contact->url->host);
242
osip_from_free(contact);
243
proxy_list_fill(model,lc);
244
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sec->guess_hostname),
245
linphone_core_get_guess_hostname(lc));
248
void sip_section_apply(SipSection *sec, LinphoneCore *lc)
252
gchar *username,*hostname;
254
adj=gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(sec->port));
256
username=gtk_editable_get_chars(GTK_EDITABLE(sec->username),0,-1);
257
if (username!=NULL && strlen(username)!=0)
259
hostname=gtk_editable_get_chars(GTK_EDITABLE(sec->hostname),0,-1);
260
if (hostname!=NULL && strlen(hostname)!=0)
262
tmp=g_strdup_printf("sip:%s@%s",username,hostname);
263
linphone_core_set_primary_contact(lc,tmp);
264
linphone_core_set_sip_port(lc,(int)gtk_adjustment_get_value(adj));
274
on_addproxy_button_clicked (GtkButton *button,
277
GtkWidget *w=create_proxy_config_box();
283
on_editproxy_button_clicked (GtkButton *button,
287
GtkTreeSelection *select;
290
LinphoneProxyConfig * cfg;
291
select = gtk_tree_view_get_selection (GTK_TREE_VIEW (get_property_box()->sip.proxy_list));
292
if (gtk_tree_selection_get_selected (select, &model, &iter))
294
gtk_tree_model_get (model, &iter,PROXY_CONFIG_REF , &cfg, -1);
295
gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
296
linphone_proxy_config_edit(cfg);
298
w=create_proxy_config_box();
300
if (cfg->reg_proxy!=NULL) gtk_entry_set_text(GTK_ENTRY(lookup_widget(w,"reg_proxy")),cfg->reg_proxy);
301
if (cfg->reg_route!=NULL) gtk_entry_set_text(GTK_ENTRY(lookup_widget(w,"reg_route")),cfg->reg_route);
302
if (cfg->reg_identity!=NULL) gtk_entry_set_text(GTK_ENTRY(lookup_widget(w,"reg_identity")),cfg->reg_identity);
303
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lookup_widget(w,"reg_sendregister")),cfg->reg_sendregister);
304
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lookup_widget(w,"publish")),cfg->publish);
305
gtk_spin_button_set_value(GTK_SPIN_BUTTON(lookup_widget(w,"reg_expires")),cfg->expires);
306
g_object_set_data(G_OBJECT(w),"edited_config",(gpointer)cfg);
311
on_removeproxy_button_clicked (GtkButton *button,
314
GtkTreeSelection *select;
317
LinphoneProxyConfig * cfg;
318
select = gtk_tree_view_get_selection (GTK_TREE_VIEW (get_property_box()->sip.proxy_list));
319
if (gtk_tree_selection_get_selected (select, &model, &iter))
321
gtk_tree_model_get (model, &iter,PROXY_CONFIG_REF , &cfg, -1);
322
gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
323
linphone_core_remove_proxy_config(get_core(),cfg);
324
linphone_refresh_proxy_combo_box(get_main_window()->window);
328
void get_proxy_config_box_data(GtkWidget *dialog)
331
gboolean editing=FALSE;
332
LinphoneProxyConfig *cfg;
333
tmp=gtk_editable_get_chars(GTK_EDITABLE(lookup_widget(dialog,"reg_proxy")),0,-1);
334
cfg=(LinphoneProxyConfig*)g_object_get_data(G_OBJECT(dialog),"edited_config");
336
cfg=linphone_proxy_config_new(tmp);
339
/* set an error message here */
343
linphone_proxy_config_set_server_addr(cfg,tmp);
347
tmp=gtk_editable_get_chars(GTK_EDITABLE(lookup_widget(dialog,"reg_route")),0,-1);
348
linphone_proxy_config_set_route(cfg,tmp);
350
tmp=gtk_editable_get_chars(GTK_EDITABLE(lookup_widget(dialog,"reg_identity")),0,-1);
351
linphone_proxy_config_set_identity(cfg,tmp);
353
tmp=gtk_editable_get_chars(GTK_EDITABLE(lookup_widget(dialog,"reg_expires")),0,-1);
360
exp = 200; /* minimum */
362
exp = 7200; /* maximum */
363
linphone_proxy_config_expires(cfg,exp);
367
linphone_proxy_config_enableregister(cfg,gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog,"reg_sendregister"))));
368
linphone_proxy_config_enable_publish(cfg,gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog,"publish"))));
369
if (editing) linphone_proxy_config_done(cfg);
370
else linphone_core_add_proxy_config(get_core(),cfg);
371
/* set the last entered/changed proxy as the default one */
372
linphone_core_set_default_proxy(get_core(),cfg);
373
proxy_list_fill(gtk_tree_view_get_model(GTK_TREE_VIEW(get_property_box()->sip.proxy_list)),get_core());
374
linphone_refresh_proxy_combo_box(get_main_window()->window);
378
on_proxy_config_box_response (GtkDialog *dialog,
383
case GTK_RESPONSE_OK:
384
get_proxy_config_box_data(GTK_WIDGET(dialog));
385
gtk_widget_destroy(GTK_WIDGET(dialog));
392
void codec_section_init(CodecSection *sec, GtkWidget *prop)
394
sec->au_codec_list=lookup_widget(prop,"au_codec_list");
395
sec->vi_codec_list=lookup_widget(prop,"vid_codec_list");
396
sec->codec_info=lookup_widget(prop,"codec_info");
399
void codec_selection_changed_cb(GtkTreeSelection *selection, gpointer data)
403
struct _PayloadType *pt=NULL;
404
LinphonePropertyBox *prop=get_property_box();
406
if (gtk_tree_selection_get_selected (selection, &model, &iter))
408
gtk_tree_model_get (model, &iter, CODEC_PRIVDATA, &pt, -1);
409
g_return_if_fail(pt!=NULL);
410
/* display the codec information */
411
gtk_label_set_text(GTK_LABEL(prop->codec.codec_info),payload_type_get_description(pt));
415
void codec_list_build(GtkTreeView *listview,const MSList *codeclist)
418
GtkListStore *store = gtk_list_store_new (CODEC_NCOLUMNS, G_TYPE_STRING,
425
GtkCellRenderer *renderer;
426
GtkTreeViewColumn *column;
427
GtkTreeSelection *select=gtk_tree_view_get_selection (listview);
428
for(elem=codeclist; elem!=NULL; elem=elem->next){
433
struct _PayloadType *pt=(struct _PayloadType *)elem->data;
434
if (payload_type_enabled(pt)) status=_("Enabled");
435
else status=_("Disabled");
436
if (linphone_core_check_payload_type_usability(get_core(),pt)) color="blue";
438
/* get an iterator */
439
gtk_list_store_append(store,&iter);
440
bitrate=payload_type_get_bitrate(pt)/1000.0;
441
rate=payload_type_get_rate(pt);
442
gtk_list_store_set(store,&iter, CODEC_NAME,payload_type_get_mime(pt),
444
CODEC_BITRATE,bitrate,
446
CODEC_PRIVDATA,(gpointer)pt,
447
CODEC_COLOR,(gpointer)color,
450
gtk_tree_view_set_model(listview,GTK_TREE_MODEL(store));
451
g_object_unref(G_OBJECT(store));
452
renderer = gtk_cell_renderer_text_new ();
453
column = gtk_tree_view_column_new_with_attributes (_("Name"),
456
"foreground",CODEC_COLOR,
458
gtk_tree_view_append_column (listview, column);
459
column = gtk_tree_view_column_new_with_attributes (_("Rate (Hz)"),
462
"foreground",CODEC_COLOR,
464
gtk_tree_view_append_column (listview, column);
465
column = gtk_tree_view_column_new_with_attributes (_("Status"),
467
"text", CODEC_STATUS,
468
"foreground",CODEC_COLOR,
470
gtk_tree_view_append_column (listview, column);
471
column = gtk_tree_view_column_new_with_attributes (_("Min bitrate (kbit/s)"),
473
"text", CODEC_BITRATE,
474
"foreground",CODEC_COLOR,
476
gtk_tree_view_append_column (listview, column);
478
/* Setup the selection handler */
479
select = gtk_tree_view_get_selection (listview);
480
gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE);
481
//gtk_tree_view_columns_autosize(GTK_TREE_VIEW (sec->interfaces));
482
g_signal_connect (G_OBJECT (select), "changed",
483
G_CALLBACK (codec_selection_changed_cb),
487
void codec_section_fill(CodecSection *sec, LinphoneCore *lc, GtkWidget *propbox)
489
/* display prefered codecs*/
491
const MSList *audio_codecs=linphone_core_get_audio_codecs(lc);
492
const MSList *video_codecs=linphone_core_get_video_codecs(lc);
493
codec_list_build(GTK_TREE_VIEW(sec->au_codec_list),audio_codecs);
494
codec_list_build(GTK_TREE_VIEW(lookup_widget(propbox,"vid_codec_list")),video_codecs);
495
value=linphone_core_get_download_bandwidth(lc);
497
gtk_spin_button_set_value(GTK_SPIN_BUTTON(lookup_widget(propbox,"download_bw")),value);
499
gtk_entry_set_text(GTK_ENTRY(lookup_widget(propbox,"download_bw")),_("Unlimited"));
500
value=linphone_core_get_upload_bandwidth(lc);
502
gtk_spin_button_set_value(GTK_SPIN_BUTTON(lookup_widget(propbox,"upload_bw")),value);
504
gtk_entry_set_text(GTK_ENTRY(lookup_widget(propbox,"upload_bw")),_("Unlimited"));
507
void codec_section_apply(CodecSection *sec, LinphoneCore *lc)
510
struct _PayloadType *pt;
511
MSList *codeclist=NULL;
513
GtkTreeModel *model=gtk_tree_view_get_model(GTK_TREE_VIEW(sec->au_codec_list));
514
/* retrieve the codec list */
515
g_return_if_fail(gtk_tree_model_get_iter_first(model,&iter));
517
gtk_tree_model_get (model, &iter, CODEC_STATUS,&status,CODEC_PRIVDATA, &pt,-1);
518
g_return_if_fail(pt!=NULL);
519
if (strcmp(status,_("Enabled"))==0) payload_type_set_enable(pt,1);
520
else payload_type_set_enable(pt,0);
521
codeclist=ms_list_append(codeclist,pt);
522
}while (gtk_tree_model_iter_next(model,&iter));
523
linphone_core_set_audio_codecs(lc,codeclist);
524
model=gtk_tree_view_get_model(GTK_TREE_VIEW(sec->vi_codec_list));
525
/* retrieve the codec list */
527
g_return_if_fail(gtk_tree_model_get_iter_first(model,&iter));
529
gtk_tree_model_get (model, &iter, CODEC_STATUS,&status,CODEC_PRIVDATA, &pt,-1);
530
g_return_if_fail(pt!=NULL);
531
if (strcmp(status,_("Enabled"))==0) payload_type_set_enable(pt,1);
532
else payload_type_set_enable(pt,0);
533
codeclist=ms_list_append(codeclist,pt);
534
}while (gtk_tree_model_iter_next(model,&iter));
535
linphone_core_set_video_codecs(lc,codeclist);
538
void sound_section_init(SoundSection *sec, GtkWidget *prop)
540
sec->source_entry=lookup_widget(prop,"rec_source");
541
sec->ringfileentry=lookup_widget(prop,"ringfileentry");
546
on_play_card_changed (GtkComboBox *combobox,
549
#if GTK_CHECK_VERSION(2,6,0)
550
char *dev=gtk_combo_box_get_active_text(combobox);
551
#else /* GTK < 2.6.0 */
552
char *dev=_lp_combo_box_get_active_text(combobox);
553
#endif /* GTK < 2.6.0 */
554
linphone_core_set_playback_device(get_core(),dev);
555
property_box_changed();
561
on_capt_card_changed (GtkComboBox *combobox,
564
#if GTK_CHECK_VERSION(2,6,0)
565
char * dev=gtk_combo_box_get_active_text(combobox);
566
#else /* GTK < 2.6.0 */
567
char * dev=_lp_combo_box_get_active_text(combobox);
568
#endif /* GTK < 2.6.0 */
569
linphone_core_set_capture_device(get_core(),dev);
570
property_box_changed();
575
on_ring_card_changed (GtkComboBox *combobox,
578
#if GTK_CHECK_VERSION(2,6,0)
579
char * dev=gtk_combo_box_get_active_text(combobox);
580
#else /* GTK < 2.6.0 */
581
char * dev=_lp_combo_box_get_active_text(combobox);
582
#endif /* GTK < 2.6.0 */
583
linphone_core_set_ringer_device(get_core(),dev);
584
property_box_changed();
588
static int get_dev_index(const char **devnames, const char *dev){
590
for (i=0;devnames[i]!=NULL;i++){
591
if (strcmp(devnames[i],dev)==0)
594
g_warning("could not find %s in device list.",dev);
598
void sound_section_fill(SoundSection *sec, LinphoneCore *lc)
600
GtkComboBox *play_card=GTK_COMBO_BOX(lookup_widget(get_property_box()->prop,"play_card"));
601
GtkComboBox *capt_card=GTK_COMBO_BOX(lookup_widget(get_property_box()->prop,"capt_card"));
602
GtkComboBox *ring_card=GTK_COMBO_BOX(lookup_widget(get_property_box()->prop,"ring_card"));
604
const char **devnames=linphone_core_get_sound_devices(lc);
605
/* select used sound drivers*/
607
for (i=0;devnames[i]!=NULL;i++){
608
const char *carddesc=devnames[i];
609
gtk_combo_box_append_text(play_card,carddesc);
610
gtk_combo_box_append_text(capt_card,carddesc);
611
gtk_combo_box_append_text(ring_card,carddesc);
613
/*select used cards */
614
gtk_combo_box_set_active(play_card,get_dev_index(devnames,linphone_core_get_playback_device(lc)));
615
gtk_combo_box_set_active(capt_card,get_dev_index(devnames,linphone_core_get_capture_device(lc)));
616
gtk_combo_box_set_active(ring_card,get_dev_index(devnames,linphone_core_get_ringer_device(lc)));
617
/* select audio source*/
618
switch(linphone_core_get_sound_source(lc))
621
gtk_entry_set_text (GTK_ENTRY (sec->source_entry), _("micro"));
624
gtk_entry_set_text (GTK_ENTRY (sec->source_entry), _("line"));
627
g_warning("Invalid source !");
630
gchar *ringfile=linphone_core_get_ring(lc);
631
gnome_file_entry_set_filename(GNOME_FILE_ENTRY(sec->ringfileentry),ringfile);
634
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lookup_widget(get_property_box()->prop,"echocancelation")),linphone_core_echo_cancelation_enabled(lc));
640
void sound_section_apply(SoundSection *sec, LinphoneCore *lc)
644
/* get audio source*/
645
tmp=gtk_editable_get_chars(GTK_EDITABLE(sec->source_entry),0,-1);
646
if (strcmp(tmp,_("micro"))==0) linphone_core_set_sound_source(lc,'m');
647
else if (strcmp(tmp,_("line"))==0) linphone_core_set_sound_source(lc,'l');
651
tmp=gtk_editable_get_chars(GTK_EDITABLE(gnome_file_entry_gtk_entry(GNOME_FILE_ENTRY(sec->ringfileentry))),0,-1);
652
linphone_core_set_ring(lc,tmp);
657
void ring_finished(LinphoneCore *lc,gpointer user_data)
659
GtkWidget *button=(GtkWidget*)user_data;
660
LinphonePropertyBox *prop=get_property_box();
661
if (prop->prop==NULL) return; /* the box has been closed before the end of the preview */
662
gtk_widget_set_sensitive(button,1);
666
on_ringpreview_clicked (GtkButton *button,
671
LinphonePropertyBox *prop=get_property_box();
672
LinphoneCore *lc=get_core();
674
tmp=gtk_editable_get_chars(GTK_EDITABLE(gnome_file_entry_gtk_entry(GNOME_FILE_ENTRY(prop->sound.ringfileentry))),0,-1);
675
err=linphone_core_preview_ring(lc,tmp,ring_finished,(gpointer)button);
676
if (err==0) gtk_widget_set_sensitive(GTK_WIDGET(button),0);
681
void linphone_property_box_fill(LinphonePropertyBox * box, LinphoneCore *lp)
683
net_section_fill(&box->net,lp);
684
sip_section_fill(&box->sip,lp);
685
codec_section_fill(&box->codec,lp,box->prop);
686
sound_section_fill(&box->sound,lp);
687
/* set uchanged state to the prop1 box, because gtk_entry_set_text() causes signal "changed"
689
gnome_property_box_set_state(GNOME_PROPERTY_BOX(box->prop),0);
692
void linphone_property_box_init(LinphonePropertyBox *box)
694
GtkWidget *prop=create_prop1();
696
net_section_init(&box->net,prop);
697
sip_section_init(&box->sip,prop);
698
codec_section_init(&box->codec,prop);
699
sound_section_init(&box->sound,prop);
700
gtk_widget_show(prop);
701
linphone_property_box_fill(box,get_core());
707
void on_propertybox1_apply (GtkButton *button,
710
LinphonePropertyBox *prop=get_property_box();
711
LinphoneCore *lc=get_core();
715
net_section_apply(&prop->net,lc);
718
sound_section_apply(&prop->sound,lc);
721
sip_section_apply(&prop->sip,lc);
724
codec_section_apply(&prop->codec,lc);
731
on_audioport_changed (GtkEditable *editable,
734
LinphonePropertyBox *prop=get_property_box();
735
gnome_property_box_changed(GNOME_PROPERTY_BOX(prop->prop));
741
on_sipport_changed (GtkEditable *editable,
744
LinphonePropertyBox *prop=get_property_box();
745
gnome_property_box_changed(GNOME_PROPERTY_BOX(prop->prop));
751
on_source_changed (GtkEditable *editable,
754
LinphonePropertyBox *prop=get_property_box();
755
gnome_property_box_changed(GNOME_PROPERTY_BOX(prop->prop));
764
void codec_row_move(GtkTreeView *listview, int action)
767
GtkTreeIter previter,nextiter,newiter;
769
GtkTreeSelection *selection;
770
GtkTreePath *treepath;
771
struct _PayloadType *codec=NULL;
778
selection=gtk_tree_view_get_selection(listview);
779
if (gtk_tree_selection_get_selected (selection, &model, &iter))
781
gtk_tree_model_get (model, &iter, CODEC_NAME,&name,
783
CODEC_BITRATE,&bitrate,
784
CODEC_STATUS,&status,
785
CODEC_PRIVDATA, &codec,
788
g_return_if_fail(codec!=NULL);
790
case CODEC_ACTION_UP:
791
/* get an iterator on the prev codec */
792
treepath=gtk_tree_model_get_path(model,&iter);
793
if (!gtk_tree_path_prev(treepath)){
794
/* codec is the first, no match. */
797
gtk_tree_model_get_iter(model,&previter,treepath);
798
gtk_list_store_insert_before(GTK_LIST_STORE(model),&newiter,&previter);
800
case CODEC_ACTION_DOWN:
801
/* get an iterator on the next codec */
803
if (!gtk_tree_model_iter_next(model,&nextiter)){
804
/* codec is the last, no match. */
807
gtk_list_store_insert_after(GTK_LIST_STORE(model),&newiter,&nextiter);
811
gtk_list_store_set(GTK_LIST_STORE(model),&newiter,
814
CODEC_BITRATE,bitrate,
816
CODEC_PRIVDATA, codec,
819
/* remove the selected line */
820
gtk_list_store_remove(GTK_LIST_STORE(model),&iter);
821
gtk_tree_selection_select_iter(selection,&newiter);
828
static void codec_move(int action){
829
GtkTreeView *listview;
830
int page=gtk_notebook_get_current_page(GTK_NOTEBOOK(
831
lookup_widget(get_property_box()->prop,"codec_notebook")));
833
listview=GTK_TREE_VIEW(get_property_box()->codec.au_codec_list);
835
listview=GTK_TREE_VIEW(lookup_widget(get_property_box()->prop,"vid_codec_list"));
836
codec_row_move(listview,action);
837
property_box_changed();
841
on_aucodec_up_clicked (GtkButton *button,
844
codec_move(CODEC_ACTION_UP);
849
on_aucodec_down_clicked (GtkButton *button,
852
codec_move(CODEC_ACTION_DOWN);
855
void codec_set_status(GtkTreeView *listview,gboolean status)
858
GtkTreeSelection *selection;
861
selection=gtk_tree_view_get_selection(listview);
862
if (gtk_tree_selection_get_selected (selection, &model, &iter))
864
if (status) statusstring=_("Enabled");
865
else statusstring=_("Disabled");
866
gtk_list_store_set(GTK_LIST_STORE(model),&iter,CODEC_STATUS,statusstring,-1);
870
void codec_list_update(GtkTreeView *listview)
877
model=gtk_tree_view_get_model(listview);
879
g_return_if_fail(gtk_tree_model_get_iter_first(model,&iter));
881
gtk_tree_model_get (model, &iter, CODEC_PRIVDATA, &pt,-1);
882
if (linphone_core_check_payload_type_usability(get_core(),pt)){
885
bitrate=payload_type_get_bitrate(pt)/1000.0;
886
gtk_list_store_set(GTK_LIST_STORE(model),&iter,CODEC_COLOR,color,CODEC_BITRATE,bitrate,-1);
887
}while (gtk_tree_model_iter_next(model,&iter));
890
static void codec_enable(gboolean val){
891
GtkTreeView *listview;
892
int page=gtk_notebook_get_current_page(GTK_NOTEBOOK(
893
lookup_widget(get_property_box()->prop,"codec_notebook")));
895
listview=GTK_TREE_VIEW(get_property_box()->codec.au_codec_list);
897
listview=GTK_TREE_VIEW(lookup_widget(get_property_box()->prop,"vid_codec_list"));
898
codec_set_status(listview,val);
899
property_box_changed();
903
on_aucodec_enable_clicked (GtkButton *button,
911
on_aucodec_disable_clicked (GtkButton *button,
919
on_user_name_changed (GtkEditable *editable,
922
property_box_changed();
927
on_domain_name_changed (GtkEditable *editable,
930
property_box_changed();
936
on_reg_passwd_changed (GtkEditable *editable,
939
property_box_changed();
944
on_obproxy_button_toggled (GtkToggleButton *togglebutton,
947
property_box_changed();
951
on_address_of_record_changed (GtkEditable *editable,
954
property_box_changed();
959
on_audio_jittcomp_value_changed (GtkRange *range,
962
property_box_changed();
966
on_ringfileentry_changed (GtkEditable *editable,
969
property_box_changed();
972
void linphone_property_box_uninit(LinphonePropertyBox *box)
974
memset(box,0, sizeof(LinphonePropertyBox));
979
on_property_box_closed (GnomeDialog *gnomedialog,
982
linphone_property_box_uninit(get_property_box());
987
on_use_sipinfo_toggled (GtkToggleButton *togglebutton,
990
linphone_core_set_use_info_for_dtmf(get_core(),gtk_toggle_button_get_active(togglebutton));
995
on_guess_hostname_toggled (GtkToggleButton *togglebutton,
1000
gboolean val=gtk_toggle_button_get_active(togglebutton);
1001
linphone_core_set_guess_hostname(get_core(),val);
1002
hostname=get_property_box()->sip.hostname;
1003
from=linphone_core_get_primary_contact_parsed(get_core());
1004
gtk_entry_set_text(GTK_ENTRY(hostname),from->url->host);
1005
gtk_widget_set_sensitive(hostname,!val);
1006
osip_from_free(from);
1010
on_download_bw_value_changed (GtkSpinButton *spinbutton,
1013
gdouble val=gtk_spin_button_get_value(spinbutton);
1014
if (val==0) gtk_entry_set_text(GTK_ENTRY(spinbutton),_("Unlimited"));
1015
linphone_core_set_download_bandwidth(get_core(),(int)val);
1016
codec_list_update(GTK_TREE_VIEW(lookup_widget(gtk_widget_get_toplevel(GTK_WIDGET(spinbutton)),"au_codec_list")));
1017
codec_list_update(GTK_TREE_VIEW(lookup_widget(gtk_widget_get_toplevel(GTK_WIDGET(spinbutton)),"vid_codec_list")));
1021
on_upload_bw_value_changed (GtkSpinButton *spinbutton,
1024
gdouble val=gtk_spin_button_get_value(spinbutton);
1025
if (val==0) gtk_entry_set_text(GTK_ENTRY(spinbutton),_("Unlimited"));
1026
linphone_core_set_upload_bandwidth(get_core(),(int)val);
1027
codec_list_update(GTK_TREE_VIEW(lookup_widget(gtk_widget_get_toplevel(GTK_WIDGET(spinbutton)),"au_codec_list")));
1028
codec_list_update(GTK_TREE_VIEW(lookup_widget(gtk_widget_get_toplevel(GTK_WIDGET(spinbutton)),"vid_codec_list")));
1032
on_no_nat_toggled (GtkToggleButton *togglebutton,
1035
property_box_changed();
1040
on_use_stun_toggled (GtkToggleButton *togglebutton,
1043
property_box_changed();
1048
on_static_nat_toggled (GtkToggleButton *togglebutton,
1051
property_box_changed();
1055
on_stun_server_changed (GtkEditable *editable,
1058
property_box_changed();