~ubuntu-branches/ubuntu/vivid/linphone/vivid

« back to all changes in this revision

Viewing changes to gnome/propertybox.c

  • Committer: Bazaar Package Importer
  • Author(s): Samuel Mimram
  • Date: 2006-11-15 10:34:50 UTC
  • mfrom: (1.2.1 upstream) (2.1.8 feisty)
  • Revision ID: james.westby@ubuntu.com-20061115103450-qgafwcks2lkhctlj
* New upstream release.
* Enable video support.
* Fix mismatched #endif in mscommon.h, closes: #398307.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/***************************************************************************
2
 
                          propertybox.c  -  description
3
 
                             -------------------
4
 
    begin                : Wed Jan 30 2002
5
 
    copyright            : (C) 2002 by Simon Morlat
6
 
    email                : simon.morlat@linphone.org
7
 
 ***************************************************************************/
8
 
 
9
 
/***************************************************************************
10
 
 *                                                                         *
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.                                   *
15
 
 *                                                                         *
16
 
 ***************************************************************************/
17
 
 
18
 
 
19
 
#include "linphone.h"
20
 
 
21
 
enum{
22
 
#ifdef INET6
23
 
        IFACE_INDEX,
24
 
#endif
25
 
        IFACE_NAME,
26
 
        IFACE_ADDR,
27
 
        IFACE_NCOLUMNS
28
 
};
29
 
 
30
 
enum {
31
 
        CODEC_NAME,
32
 
        CODEC_RATE,
33
 
        CODEC_BITRATE,
34
 
        CODEC_STATUS,
35
 
        CODEC_PRIVDATA,
36
 
        CODEC_COLOR,
37
 
        CODEC_NCOLUMNS
38
 
};
39
 
 
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
 
 
44
 
 
45
 
 
46
 
void net_section_init(NetSection *sec, GtkWidget *prop)
47
 
{
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");      
52
 
#endif
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");
56
 
}
57
 
 
58
 
void codec_list_update(GtkTreeView *listview,double bandwidth);
59
 
 
60
 
void on_connection_type_selected(CodecSection *sec, gint type)
61
 
{
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]);
65
 
        sec->type_sel=type;
66
 
        property_box_changed();
67
 
}
68
 
 
69
 
void on_28k_selected(GtkMenuItem *menuitem, gpointer user_data)
70
 
{
71
 
        on_connection_type_selected((CodecSection*)user_data , 0);
72
 
}
73
 
 
74
 
void on_56k_selected(GtkMenuItem *menuitem, gpointer user_data)
75
 
{
76
 
        on_connection_type_selected((CodecSection*)user_data , 1);
77
 
}
78
 
 
79
 
void on_128k_selected(GtkMenuItem *menuitem, gpointer user_data)
80
 
{
81
 
        on_connection_type_selected((CodecSection*)user_data , 2);
82
 
}
83
 
 
84
 
void on_adsl_selected(GtkMenuItem *menuitem, gpointer user_data)
85
 
{
86
 
        on_connection_type_selected((CodecSection*)user_data , 3);
87
 
}
88
 
 
89
 
void on_ethernet_selected(GtkMenuItem *menuitem, gpointer user_data)
90
 
{
91
 
        on_connection_type_selected((CodecSection*)user_data , 4);
92
 
}
93
 
 
94
 
void net_selection_changed_cb(GtkTreeSelection *select, gpointer userdata)
95
 
{
96
 
        property_box_changed();
97
 
}
98
 
 
99
 
void net_section_fill(NetSection *sec,LinphoneCore *lc)
100
 
{
101
 
        gfloat value;
102
 
        
103
 
        GList *item_list,*elem;
104
 
        GtkListStore *store ;
105
 
        GtkTreeIter iter,selected;
106
 
        GtkCellRenderer *renderer;
107
 
        GtkTreeViewColumn *column;
108
 
        GtkTreeSelection *select;
109
 
        gboolean use_nat;
110
 
        gchar *tmp;
111
 
        
112
 
        
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));
119
 
        
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);
124
 
        while(elem!=NULL){
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)){
129
 
                        selected=iter;
130
 
                }
131
 
#ifdef INET6
132
 
                gtk_list_store_set(store,&iter, IFACE_INDEX, iface->index, IFACE_NAME,iface->name,IFACE_ADDR,iface->ipaddr,-1);
133
 
#else
134
 
                gtk_list_store_set(store,&iter,IFACE_NAME,iface->name,IFACE_ADDR,iface->ip4addr,-1);
135
 
#endif
136
 
                elem=g_list_next(elem);
137
 
        }
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 ();
141
 
#ifdef INET6
142
 
        column = gtk_tree_view_column_new_with_attributes (_("Index"),
143
 
                                                   renderer,
144
 
                                                   "text", IFACE_INDEX,
145
 
                                                   NULL);
146
 
        gtk_tree_view_append_column (GTK_TREE_VIEW (sec->interfaces), column);
147
 
#endif
148
 
        column = gtk_tree_view_column_new_with_attributes (_("Name"),
149
 
                                                   renderer,
150
 
                                                   "text", IFACE_NAME,
151
 
                                                   NULL);
152
 
        gtk_tree_view_append_column (GTK_TREE_VIEW (sec->interfaces), column);
153
 
        column = gtk_tree_view_column_new_with_attributes (_("Address"),
154
 
                                                   renderer,
155
 
                                                   "text", IFACE_ADDR,
156
 
                                                   NULL);
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),
164
 
                  NULL);
165
 
        gtk_tree_view_columns_autosize(GTK_TREE_VIEW (sec->interfaces));
166
 
#endif
167
 
        
168
 
        /* nat setup */
169
 
        tmp=linphone_core_get_nat_address(lc,&use_nat);
170
 
        
171
 
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sec->enable_nat),use_nat);
172
 
        if (tmp!=NULL) {
173
 
                gtk_entry_set_text(GTK_ENTRY(sec->nat_address),tmp);
174
 
                g_free(tmp);
175
 
        }
176
 
        
177
 
}
178
 
 
179
 
void
180
 
on_enable_nat_toggled                  (GtkToggleButton *togglebutton,
181
 
                                        gpointer         user_data)
182
 
{
183
 
        LinphonePropertyBox *prop=get_property_box();
184
 
        NetSection *sec=&prop->net;
185
 
        gboolean use_nat;
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();
190
 
        
191
 
}
192
 
 
193
 
 
194
 
 
195
 
void
196
 
on_nat_address_changed                 (GtkEditable     *editable,
197
 
                                        gpointer         user_data)
198
 
{
199
 
        property_box_changed();
200
 
}
201
 
 
202
 
 
203
 
 
204
 
void net_section_apply(NetSection *sec,LinphoneCore *lc)
205
 
{
206
 
        GtkTreeSelection *select;
207
 
        GtkTreeIter iter;
208
 
        GtkTreeModel *model;
209
 
        gboolean use_nat;
210
 
        gchar *name;
211
 
#ifdef LINPHONE_DEPRECATED
212
 
#ifdef INET6
213
 
        gint index;     
214
 
#endif
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))
218
 
        {
219
 
#ifdef INET6
220
 
                gtk_tree_model_get (model, &iter, IFACE_INDEX , &index, -1);
221
 
                linphone_core_select_net_interface(lc,index);
222
 
#else
223
 
                gtk_tree_model_get (model, &iter,IFACE_NAME , &name, -1);
224
 
                linphone_core_select_net_interface(lc,name);
225
 
                g_free(name);
226
 
#endif
227
 
        }
228
 
        linphone_core_set_connection_type(lc,sec->type_sel);
229
 
#endif
230
 
        
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);
234
 
        
235
 
        {
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);
239
 
        /* get  rtp port */
240
 
        adj=gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(sec->au_port));
241
 
        linphone_core_set_audio_port(lc,(gint)adj->value);
242
 
        }
243
 
}
244
 
 
245
 
void sip_section_init(SipSection *sec,GtkWidget *prop)
246
 
{
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");
259
 
}
260
 
 
261
 
void sip_section_enable_registrar(SipSection *sec,LinphoneCore *lc, gboolean state)
262
 
{
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);
270
 
        
271
 
        if (state) {
272
 
                gboolean flag;
273
 
                linphone_core_get_registrar_usage(lc,NULL,&flag,NULL);
274
 
                gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sec->obproxy_button),flag);
275
 
        }
276
 
        else {
277
 
                gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sec->obproxy_button),0);
278
 
        }
279
 
}
280
 
 
281
 
void sip_section_fill(SipSection *sec, LinphoneCore *lc)
282
 
{
283
 
        from_t *contact;
284
 
        gchar *tmp;
285
 
        gboolean  flag;
286
 
        /* set sip port */
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);
295
 
        from_free(contact);
296
 
        sfree(contact);
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);
307
 
        if (flag)
308
 
        {
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*/               
311
 
        }
312
 
}
313
 
 
314
 
void sip_section_apply(SipSection *sec, LinphoneCore *lc)
315
 
{
316
 
        GtkAdjustment *adj;
317
 
        gchar *tmp,*username,*hostname,*passwd;
318
 
        gchar *regaddr,*addr_of_rec;
319
 
        gint state,as_proxy=0,ind,err;
320
 
        
321
 
        /* get sip port*/
322
 
        adj=gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(sec->port));
323
 
        
324
 
        username=gtk_editable_get_chars(GTK_EDITABLE(sec->username),0,-1);
325
 
        if (username!=NULL && strlen(username)!=0)
326
 
        {
327
 
                hostname=gtk_editable_get_chars(GTK_EDITABLE(sec->hostname),0,-1);
328
 
                if (hostname!=NULL && strlen(hostname)!=0)
329
 
                {
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));
333
 
                        g_free(hostname);
334
 
                        g_free(tmp);
335
 
                }
336
 
                g_free(username);
337
 
        }
338
 
        
339
 
        state=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sec->registrar_toggle));
340
 
        if (state){
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);
347
 
                /* get the passwd */
348
 
                passwd=gtk_editable_get_chars(GTK_EDITABLE(sec->password),0,-1);
349
 
                linphone_core_set_registrar_passwd(lc,passwd);
350
 
                g_free(regaddr);
351
 
                g_free(addr_of_rec);
352
 
                g_free(passwd);
353
 
        }
354
 
        linphone_core_set_registrar_usage(lc,state,as_proxy,0);
355
 
}
356
 
 
357
 
void codec_section_init(CodecSection *sec, GtkWidget *prop)
358
 
{
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");
362
 
}
363
 
 
364
 
void codec_selection_changed_cb(GtkTreeSelection *selection, gpointer data)
365
 
{
366
 
        GtkTreeIter iter;
367
 
    GtkTreeModel *model;
368
 
    struct _PayloadType *pt=NULL;
369
 
        LinphonePropertyBox *prop=get_property_box();
370
 
        
371
 
        if (gtk_tree_selection_get_selected (selection, &model, &iter)) 
372
 
        {
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));
377
 
        }
378
 
}
379
 
 
380
 
void codec_list_build(GtkTreeView *listview,GList *codeclist)
381
 
{
382
 
        GList *elem=codeclist;
383
 
        GtkListStore *store = gtk_list_store_new (CODEC_NCOLUMNS, G_TYPE_STRING,
384
 
                                                                                                                                G_TYPE_STRING,
385
 
                                                                                                                                G_TYPE_STRING,
386
 
                                                                                                                                G_TYPE_STRING,
387
 
                                                                                                                                G_TYPE_POINTER,
388
 
                                                                                                                                G_TYPE_STRING);
389
 
        GtkTreeIter iter;
390
 
        GtkCellRenderer *renderer;
391
 
        GtkTreeViewColumn *column;
392
 
        GtkTreeSelection *select=gtk_tree_view_get_selection (listview);
393
 
        while(elem!=NULL){
394
 
                gchar *status;
395
 
                gchar *bitrate,*rate;
396
 
                gchar *color;
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";
401
 
                else color="red";
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),
407
 
                                                                                CODEC_RATE,rate,
408
 
                                                                                CODEC_BITRATE,bitrate,
409
 
                                                                                CODEC_STATUS,status,
410
 
                                                                                CODEC_PRIVDATA,(gpointer)pt,
411
 
                                                                                CODEC_COLOR,(gpointer)color,
412
 
                                                                                -1);
413
 
                g_free(rate);
414
 
                g_free(bitrate);
415
 
                elem=g_list_next(elem);
416
 
        }
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"),
421
 
                                                   renderer,
422
 
                                                   "text", CODEC_NAME,
423
 
                                                                                                   "foreground",CODEC_COLOR,
424
 
                                                   NULL);
425
 
        gtk_tree_view_append_column (listview, column);
426
 
        column = gtk_tree_view_column_new_with_attributes (_("Rate (Hz)"),
427
 
                                                   renderer,
428
 
                                                   "text", CODEC_RATE,
429
 
                                                                                                   "foreground",CODEC_COLOR,
430
 
                                                   NULL);
431
 
        gtk_tree_view_append_column (listview, column);
432
 
        column = gtk_tree_view_column_new_with_attributes (_("Status"),
433
 
                                                   renderer,
434
 
                                                   "text", CODEC_STATUS,
435
 
                                                                                                        "foreground",CODEC_COLOR,
436
 
                                                   NULL);
437
 
        gtk_tree_view_append_column (listview, column);
438
 
        column = gtk_tree_view_column_new_with_attributes (_("Min bitrate (kbit/s)"),
439
 
                                                   renderer,
440
 
                                                   "text", CODEC_BITRATE,
441
 
                                                                                                        "foreground",CODEC_COLOR,
442
 
                                                   NULL);
443
 
        gtk_tree_view_append_column (listview, column);
444
 
        
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),
451
 
                  NULL);
452
 
}
453
 
 
454
 
void codec_section_fill(CodecSection *sec, LinphoneCore *lc)
455
 
{
456
 
        GtkWidget *optionmenu=sec->connection_type;
457
 
        GtkWidget *menu;
458
 
        GtkItem *menu_item;
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;
468
 
        
469
 
        /* 28k menu item*/
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);
473
 
        /* 56k menu item */
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);
477
 
        /* 128k menu item */
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);
481
 
        /* ADSL menu item */
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);
491
 
        
492
 
        
493
 
}
494
 
 
495
 
void codec_section_apply(CodecSection *sec, LinphoneCore *lc)
496
 
{
497
 
        GtkTreeIter iter;
498
 
        struct _PayloadType *pt;
499
 
        GList *codeclist=NULL;
500
 
        gchar *status;
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));
504
 
        do{
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);
512
 
}
513
 
 
514
 
void sound_section_init(SoundSection *sec, GtkWidget *prop)
515
 
{
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");
520
 
}
521
 
 
522
 
void sound_section_fill(SoundSection *sec, LinphoneCore *lc)
523
 
{
524
 
        gchar *dsppath;
525
 
        int devid;
526
 
        SndCardManager *cardmanager;
527
 
        SndCard *card;
528
 
        GList *cardlist=NULL;
529
 
        int i;
530
 
        /* select used sound drivers*/
531
 
 
532
 
        devid=linphone_core_get_sound_device(lc);
533
 
        cardmanager=linphone_core_get_card_manager(lc);
534
 
        
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));
537
 
        }
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));
542
 
        
543
 
        /* select audio source*/
544
 
        switch(linphone_core_get_sound_source(lc))
545
 
        {
546
 
                case 'm':
547
 
                        gtk_entry_set_text (GTK_ENTRY (sec->source_entry), _("micro"));
548
 
                        break;
549
 
                case 'l':
550
 
                        gtk_entry_set_text (GTK_ENTRY (sec->source_entry), _("line"));
551
 
                        break;
552
 
                default:
553
 
                        g_warning("Invalid source !");
554
 
  }
555
 
  {
556
 
                gchar *ringfile=linphone_core_get_ring(lc);
557
 
                gnome_file_entry_set_filename(GNOME_FILE_ENTRY(sec->ringfileentry),ringfile);
558
 
                
559
 
  }
560
 
}
561
 
 
562
 
void
563
 
on_card_changed                        (GtkEditable     *editable,
564
 
                                        gpointer         user_data)
565
 
{
566
 
        gchar *tmp;
567
 
        
568
 
        /* get sound device*/
569
 
        tmp=gtk_editable_get_chars(editable,0,-1);
570
 
        linphone_core_set_sound_device_from_name(get_core(),tmp);
571
 
        g_free(tmp);
572
 
}
573
 
 
574
 
 
575
 
void sound_section_apply(SoundSection *sec, LinphoneCore *lc)
576
 
{
577
 
        gchar *tmp;
578
 
        int devid;
579
 
        
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);
583
 
        g_free(tmp);
584
 
        
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');
589
 
        g_free(tmp);
590
 
        
591
 
        /* get ring path */
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);
594
 
        g_free(tmp);
595
 
        
596
 
}
597
 
 
598
 
void ring_finished(LinphoneCore *lc,gpointer user_data)
599
 
{
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);
604
 
}
605
 
 
606
 
void
607
 
on_ringpreview_clicked                 (GtkButton       *button,
608
 
                                        gpointer         user_data)
609
 
{
610
 
  int err;
611
 
  gchar *tmp;
612
 
  LinphonePropertyBox *prop=get_property_box();
613
 
        LinphoneCore *lc=get_core();
614
 
  /* get ring path */
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);
618
 
        g_free(tmp);
619
 
}
620
 
 
621
 
 
622
 
void linphone_property_box_fill(LinphonePropertyBox * box, LinphoneCore *lp)
623
 
{
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"
629
 
        to be sent */
630
 
        gnome_property_box_set_state(GNOME_PROPERTY_BOX(box->prop),0);
631
 
}
632
 
 
633
 
void linphone_property_box_init(LinphonePropertyBox *box)
634
 
{
635
 
        GtkWidget *prop=create_prop1();
636
 
        box->prop=prop;
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());
643
 
}
644
 
 
645
 
 
646
 
 
647
 
 
648
 
void on_propertybox1_apply (GtkButton       *button,
649
 
                                        gint pagenum)
650
 
{       
651
 
        LinphonePropertyBox *prop=get_property_box();
652
 
        LinphoneCore *lc=get_core();
653
 
        switch(pagenum)
654
 
        {
655
 
        case 0:
656
 
                net_section_apply(&prop->net,lc);
657
 
                break;
658
 
        case 1:
659
 
                sound_section_apply(&prop->sound,lc);
660
 
                break;
661
 
        case 2:
662
 
                sip_section_apply(&prop->sip,lc);
663
 
                break;
664
 
        case 3:
665
 
                codec_section_apply(&prop->codec,lc);
666
 
                break;
667
 
        }
668
 
}
669
 
 
670
 
 
671
 
void
672
 
on_audioport_changed                   (GtkEditable     *editable,
673
 
                                        gpointer         user_data)
674
 
{
675
 
        LinphonePropertyBox *prop=get_property_box();
676
 
        gnome_property_box_changed(GNOME_PROPERTY_BOX(prop->prop));
677
 
        return;
678
 
}
679
 
 
680
 
 
681
 
void
682
 
on_sipport_changed                     (GtkEditable     *editable,
683
 
                                        gpointer         user_data)
684
 
{
685
 
        LinphonePropertyBox *prop=get_property_box();
686
 
        gnome_property_box_changed(GNOME_PROPERTY_BOX(prop->prop));
687
 
        return;
688
 
}
689
 
 
690
 
 
691
 
void
692
 
on_source_changed                      (GtkEditable     *editable,
693
 
                                        gpointer         user_data)
694
 
{
695
 
        LinphonePropertyBox *prop=get_property_box();
696
 
        gnome_property_box_changed(GNOME_PROPERTY_BOX(prop->prop));
697
 
}
698
 
 
699
 
enum {
700
 
        CODEC_ACTION_UP,
701
 
        CODEC_ACTION_DOWN
702
 
};
703
 
 
704
 
 
705
 
void codec_row_move(GtkTreeView *listview, int action)
706
 
{
707
 
        GtkTreeIter iter;
708
 
        GtkTreeIter previter,nextiter,newiter;
709
 
    GtkTreeModel *model;
710
 
        GtkTreeSelection *selection;
711
 
        GtkTreePath *treepath;
712
 
    struct _PayloadType *codec=NULL;
713
 
        gchar *name=NULL;
714
 
        gchar *rate=NULL;
715
 
        gchar *bitrate=NULL;
716
 
        gchar *status=NULL;
717
 
        gchar *color=NULL;
718
 
        
719
 
        selection=gtk_tree_view_get_selection(listview);
720
 
        if (gtk_tree_selection_get_selected (selection, &model, &iter)) 
721
 
        {
722
 
                gtk_tree_model_get (model, &iter,       CODEC_NAME,&name,
723
 
                                                                                        CODEC_RATE,&rate,
724
 
                                                                                        CODEC_BITRATE,&bitrate,
725
 
                                                                                        CODEC_STATUS,&status,
726
 
                                                                                        CODEC_PRIVDATA, &codec,
727
 
                                                                                        CODEC_COLOR,&color,
728
 
                                                                                        -1);
729
 
                g_return_if_fail(codec!=NULL);
730
 
                switch(action){
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. */
736
 
                                        return;
737
 
                                }
738
 
                                gtk_tree_model_get_iter(model,&previter,treepath);
739
 
                                gtk_list_store_insert_before(GTK_LIST_STORE(model),&newiter,&previter);
740
 
                        break;
741
 
                        case CODEC_ACTION_DOWN:
742
 
                                /* get an iterator on the next codec */
743
 
                                nextiter=iter;
744
 
                                if (!gtk_tree_model_iter_next(model,&nextiter)){
745
 
                                        /* codec is the last, no match. */
746
 
                                        return;
747
 
                                }
748
 
                                gtk_list_store_insert_after(GTK_LIST_STORE(model),&newiter,&nextiter);
749
 
                                
750
 
                        break;
751
 
                }
752
 
                gtk_list_store_set(GTK_LIST_STORE(model),&newiter,
753
 
                                                                                        CODEC_NAME,name,
754
 
                                                                                        CODEC_RATE,rate,
755
 
                                                                                        CODEC_BITRATE,bitrate,
756
 
                                                                                        CODEC_STATUS,status,
757
 
                                                                                        CODEC_PRIVDATA, codec,
758
 
                                                                                        CODEC_COLOR,color,
759
 
                                                                                        -1);
760
 
                /* remove the selected line */
761
 
                gtk_list_store_remove(GTK_LIST_STORE(model),&iter);
762
 
                gtk_tree_selection_select_iter(selection,&newiter);
763
 
                g_free(name);
764
 
                g_free(bitrate);
765
 
                g_free(rate);
766
 
                g_free(status);
767
 
                g_free(color);
768
 
        }
769
 
}
770
 
 
771
 
void
772
 
on_aucodec_up_clicked                  (GtkButton       *button,
773
 
                                        gpointer         user_data)
774
 
{
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();
779
 
}
780
 
 
781
 
 
782
 
void
783
 
on_aucodec_down_clicked                (GtkButton       *button,
784
 
                                        gpointer         user_data)
785
 
{
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();
790
 
}
791
 
 
792
 
void codec_set_status(GtkTreeView *listview,gboolean status)
793
 
{
794
 
        GtkTreeModel *model;
795
 
        GtkTreeSelection *selection;
796
 
        GtkTreeIter iter;
797
 
        gchar *statusstring;
798
 
        selection=gtk_tree_view_get_selection(listview);
799
 
        if (gtk_tree_selection_get_selected (selection, &model, &iter)) 
800
 
        {
801
 
                if (status) statusstring=_("Enabled");
802
 
                else statusstring=_("Disabled");
803
 
                gtk_list_store_set(GTK_LIST_STORE(model),&iter,CODEC_STATUS,statusstring,-1);
804
 
        }
805
 
}
806
 
 
807
 
void codec_list_update(GtkTreeView *listview,double bandwidth)
808
 
{
809
 
        GtkTreeModel *model;
810
 
        GtkTreeIter iter;
811
 
        struct _PayloadType *pt;
812
 
        gchar *color;
813
 
        model=gtk_tree_view_get_model(listview);
814
 
        
815
 
        g_return_if_fail(gtk_tree_model_get_iter_first(model,&iter));
816
 
        do{
817
 
                gtk_tree_model_get (model, &iter,       CODEC_PRIVDATA, &pt,-1);
818
 
                if (payload_type_usable(pt)){
819
 
                        color="blue";
820
 
                }else color="red";
821
 
                gtk_list_store_set(GTK_LIST_STORE(model),&iter,CODEC_COLOR,color,-1);
822
 
                
823
 
        }while (gtk_tree_model_iter_next(model,&iter));
824
 
}
825
 
 
826
 
 
827
 
void
828
 
on_aucodec_enable_clicked              (GtkButton       *button,
829
 
                                        gpointer         user_data)
830
 
{
831
 
        codec_set_status(GTK_TREE_VIEW(get_property_box()->codec.au_codec_list),TRUE);
832
 
        property_box_changed();
833
 
}
834
 
 
835
 
 
836
 
void
837
 
on_aucodec_disable_clicked             (GtkButton       *button,
838
 
                                        gpointer         user_data)
839
 
{
840
 
        codec_set_status(GTK_TREE_VIEW(get_property_box()->codec.au_codec_list),FALSE);
841
 
        property_box_changed();
842
 
}
843
 
 
844
 
 
845
 
 
846
 
void
847
 
on_registrar_checked_toggled           (GtkToggleButton *togglebutton,
848
 
                                        gpointer         user_data)
849
 
{
850
 
        gboolean state;
851
 
        
852
 
        state=gtk_toggle_button_get_active(togglebutton);
853
 
        sip_section_enable_registrar(&(get_property_box()->sip),get_core(), state);     
854
 
        property_box_changed();
855
 
}
856
 
 
857
 
 
858
 
void
859
 
on_user_name_changed                   (GtkEditable     *editable,
860
 
                                        gpointer         user_data)
861
 
{
862
 
        GtkWidget *server=get_property_box()->sip.server;
863
 
        gchar *tmp;
864
 
        //on_registrar_addr_changed(GTK_EDITABLE(server),NULL);
865
 
        property_box_changed();
866
 
}
867
 
 
868
 
 
869
 
void
870
 
on_domain_name_changed                 (GtkEditable     *editable,
871
 
                                        gpointer         user_data)
872
 
{
873
 
        property_box_changed();
874
 
}
875
 
 
876
 
 
877
 
void
878
 
on_registrar_addr_changed              (GtkEditable     *editable,
879
 
                                        gpointer         user_data)
880
 
{
881
 
        GtkWidget *address_of_record=get_property_box()->sip.addr_of_rec;
882
 
        GtkWidget *username=get_property_box()->sip.username;
883
 
        url_t *url1,*url2;
884
 
        gchar *hostname,*addrrec,*tmp;
885
 
        gint err=0;
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))
889
 
        {
890
 
                url_init(&url1);
891
 
                err=url_parse(url1,tmp);
892
 
                g_free(tmp);
893
 
                if (err<0) {
894
 
                        url_free(url1);
895
 
                        sfree(url1);
896
 
                        return;
897
 
                }
898
 
        }
899
 
        else return;
900
 
        hostname=url1->host;
901
 
        addrrec=gtk_editable_get_chars(GTK_EDITABLE(address_of_record),0,-1);
902
 
        url_init(&url2);
903
 
 
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;};
908
 
        }
909
 
        if (url2->host!=NULL) sfree(url2->host);
910
 
        if ((hostname!=NULL) && (strlen(hostname)!=0)) url2->host=sgetcopy(hostname);
911
 
        else {
912
 
                tmp=gtk_editable_get_chars(GTK_EDITABLE(get_property_box()->sip.hostname),0,-1);
913
 
                url2->host=sgetcopy(tmp);
914
 
                g_free(tmp);
915
 
        }
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);
920
 
                g_free(tmp);
921
 
        }
922
 
        url_setscheme(url2,sgetcopy("sip"));
923
 
        url_2char(url2,&tmp) ;
924
 
        if (tmp!=NULL){
925
 
                //printf("New address of record is %s\n",tmp);
926
 
                gtk_entry_set_text(GTK_ENTRY(address_of_record),tmp);
927
 
                sfree(tmp);
928
 
        }
929
 
        url_free(url1);
930
 
        sfree(url1);
931
 
    url_free(url2);
932
 
    sfree(url2);
933
 
        property_box_changed();
934
 
}
935
 
 
936
 
void
937
 
on_reg_passwd_changed                  (GtkEditable     *editable,
938
 
                                        gpointer         user_data)
939
 
{
940
 
   property_box_changed();
941
 
}
942
 
 
943
 
 
944
 
void
945
 
on_obproxy_button_toggled               (GtkToggleButton *togglebutton,
946
 
                                        gpointer         user_data)
947
 
{
948
 
   property_box_changed();
949
 
}
950
 
 
951
 
void
952
 
on_address_of_record_changed           (GtkEditable     *editable,
953
 
                                        gpointer         user_data)
954
 
{
955
 
    property_box_changed();
956
 
}
957
 
 
958
 
 
959
 
void
960
 
on_audio_jittcomp_value_changed        (GtkRange        *range,
961
 
                                        gpointer         user_data)
962
 
{
963
 
        property_box_changed();
964
 
}
965
 
 
966
 
void
967
 
on_ringfileentry_changed               (GtkEditable     *editable,
968
 
                                        gpointer         user_data)
969
 
{
970
 
        property_box_changed();
971
 
}
972
 
 
973
 
void linphone_property_box_uninit(LinphonePropertyBox *box)
974
 
{
975
 
  memset(box,0, sizeof(LinphonePropertyBox));
976
 
}
977
 
 
978
 
 
979
 
 
980
 
gboolean
981
 
on_property_box_closed                 (GnomeDialog     *gnomedialog,
982
 
                                        gpointer         user_data)
983
 
{
984
 
  linphone_property_box_uninit(get_property_box());
985
 
  return FALSE;
986
 
}
 
1
/***************************************************************************
 
2
                          propertybox.c  -  description
 
3
                             -------------------
 
4
    begin                : Wed Jan 30 2002
 
5
    copyright            : (C) 2002 by Simon Morlat
 
6
    email                : simon.morlat@linphone.org
 
7
 ***************************************************************************/
 
8
 
 
9
/***************************************************************************
 
10
 *                                                                         *
 
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.                                   *
 
15
 *                                                                         *
 
16
 ***************************************************************************/
 
17
 
 
18
 
 
19
#include "linphone.h"
 
20
 
 
21
enum{
 
22
#ifdef INET6
 
23
        IFACE_INDEX,
 
24
#endif
 
25
        IFACE_NAME,
 
26
        IFACE_ADDR,
 
27
        IFACE_NCOLUMNS
 
28
};
 
29
 
 
30
enum {
 
31
        CODEC_NAME,
 
32
        CODEC_RATE,
 
33
        CODEC_BITRATE,
 
34
        CODEC_STATUS,
 
35
        CODEC_PRIVDATA,
 
36
        CODEC_COLOR,
 
37
        CODEC_NCOLUMNS
 
38
};
 
39
 
 
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)
 
44
 
 
45
#if !GTK_CHECK_VERSION(2,6,0)
 
46
static gchar * _lp_combo_box_get_active_text (GtkComboBox *combobox)
 
47
{
 
48
        GtkTreeIter iter;
 
49
        GtkTreeModel *model;
 
50
        gchar *text = NULL;
 
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);
 
54
        return text;
 
55
}
 
56
#endif /* GTK+ < 2.6.0 */
 
57
 
 
58
void net_section_init(NetSection *sec, GtkWidget *prop)
 
59
{
 
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");      
 
64
#endif
 
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");
 
68
}
 
69
 
 
70
void codec_list_update(GtkTreeView *listview);
 
71
 
 
72
 
 
73
void net_selection_changed_cb(GtkTreeSelection *select, gpointer userdata)
 
74
{
 
75
        property_box_changed();
 
76
}
 
77
 
 
78
void net_section_fill(NetSection *sec,LinphoneCore *lc)
 
79
{
 
80
        gfloat value;
 
81
        const gchar *nat_address,*stun_server;
 
82
        
 
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));
 
89
 
 
90
        
 
91
        /* nat setup */
 
92
        nat_address=linphone_core_get_nat_address(lc);
 
93
        
 
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"))
 
97
                                ,TRUE);
 
98
        
 
99
        if (nat_address!=NULL) {
 
100
                gtk_entry_set_text(GTK_ENTRY(sec->nat_address),nat_address);
 
101
        }
 
102
        stun_server=linphone_core_get_stun_server(lc);
 
103
        if (stun_server!=NULL)
 
104
                gtk_entry_set_text(
 
105
                GTK_ENTRY(lookup_widget(get_property_box()->prop,"stun_server")),
 
106
                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);
 
110
        
 
111
 
 
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));
 
116
}
 
117
 
 
118
void
 
119
on_enable_nat_toggled                  (GtkToggleButton *togglebutton,
 
120
                                        gpointer         user_data)
 
121
{
 
122
        property_box_changed();
 
123
        
 
124
}
 
125
 
 
126
 
 
127
 
 
128
void
 
129
on_nat_address_changed                 (GtkEditable     *editable,
 
130
                                        gpointer         user_data)
 
131
{
 
132
        property_box_changed();
 
133
}
 
134
 
 
135
void
 
136
on_enable_ipv6_toggled                 (GtkToggleButton *togglebutton,
 
137
                                        gpointer         user_data)
 
138
{
 
139
        property_box_changed();
 
140
}
 
141
 
 
142
 
 
143
void net_section_apply(NetSection *sec,LinphoneCore *lc)
 
144
{
 
145
        gboolean use_nat,use_stun;
 
146
        gchar *name;
 
147
        
 
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);
 
152
        g_free(name);
 
153
 
 
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);
 
159
        g_free(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);
 
166
        
 
167
        {
 
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);
 
171
        /* get  rtp port */
 
172
        adj=gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(sec->au_port));
 
173
        linphone_core_set_audio_port(lc,(gint)adj->value);
 
174
        }
 
175
        linphone_core_enable_ipv6(lc,gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sec->enable_ipv6)));
 
176
}
 
177
 
 
178
 
 
179
enum{
 
180
        PROXY_CONFIG_IDENTITY,
 
181
        PROXY_CONFIG_REF,
 
182
        PROXY_CONFIG_NCOL
 
183
};
 
184
 
 
185
void sip_section_init(SipSection *sec,GtkWidget *prop)
 
186
{
 
187
        
 
188
        GtkListStore *store;
 
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);
 
199
        
 
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"),
 
204
                                                   renderer,
 
205
                                                   "text", PROXY_CONFIG_IDENTITY,
 
206
                                                   NULL);
 
207
        gtk_tree_view_append_column (GTK_TREE_VIEW (sec->proxy_list), column);
 
208
        
 
209
        select = gtk_tree_view_get_selection (GTK_TREE_VIEW (sec->proxy_list));
 
210
        gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE);
 
211
}
 
212
 
 
213
 
 
214
void proxy_list_fill(GtkTreeModel *model, LinphoneCore *lc){
 
215
        const MSList *elem;
 
216
        GtkTreeIter iter;
 
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);
 
225
        }
 
226
}
 
227
 
 
228
void sip_section_fill(SipSection *sec, LinphoneCore *lc)
 
229
{
 
230
        osip_from_t *contact;
 
231
        GtkTreeModel *model=gtk_tree_view_get_model(GTK_TREE_VIEW(sec->proxy_list));
 
232
        
 
233
        /* set sip port */
 
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));
 
246
}
 
247
 
 
248
void sip_section_apply(SipSection *sec, LinphoneCore *lc)
 
249
{
 
250
        GtkAdjustment *adj;
 
251
        gchar *tmp;
 
252
        gchar *username,*hostname;
 
253
        /* get sip port*/
 
254
        adj=gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(sec->port));
 
255
        
 
256
        username=gtk_editable_get_chars(GTK_EDITABLE(sec->username),0,-1);
 
257
        if (username!=NULL && strlen(username)!=0)
 
258
        {
 
259
                hostname=gtk_editable_get_chars(GTK_EDITABLE(sec->hostname),0,-1);
 
260
                if (hostname!=NULL && strlen(hostname)!=0)
 
261
                {
 
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));
 
265
                        g_free(hostname);
 
266
                        g_free(tmp);
 
267
                }
 
268
                g_free(username);
 
269
        }
 
270
}
 
271
 
 
272
 
 
273
void
 
274
on_addproxy_button_clicked           (GtkButton       *button,
 
275
                                        gpointer         user_data)
 
276
{
 
277
        GtkWidget *w=create_proxy_config_box();
 
278
        gtk_widget_show(w);
 
279
}
 
280
 
 
281
 
 
282
void
 
283
on_editproxy_button_clicked          (GtkButton       *button,
 
284
                                        gpointer         user_data)
 
285
{
 
286
        GtkWidget *w;
 
287
        GtkTreeSelection *select;
 
288
        GtkTreeIter iter;
 
289
        GtkTreeModel *model;
 
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))
 
293
        {
 
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);
 
297
        }else return;
 
298
        w=create_proxy_config_box();
 
299
        gtk_widget_show(w);
 
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);
 
307
}
 
308
 
 
309
 
 
310
void
 
311
on_removeproxy_button_clicked          (GtkButton       *button,
 
312
                                        gpointer         user_data)
 
313
{
 
314
        GtkTreeSelection *select;
 
315
        GtkTreeIter iter;
 
316
        GtkTreeModel *model;
 
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))
 
320
        {
 
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);
 
325
        }
 
326
}
 
327
 
 
328
void get_proxy_config_box_data(GtkWidget *dialog)
 
329
{
 
330
        gchar *tmp;
 
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");
 
335
        if (cfg==NULL){
 
336
                cfg=linphone_proxy_config_new(tmp);
 
337
                g_free(tmp);
 
338
                if (cfg==NULL) {
 
339
                        /* set an error message here */
 
340
                        return;
 
341
                }
 
342
        }else{
 
343
                linphone_proxy_config_set_server_addr(cfg,tmp);
 
344
                g_free(tmp);
 
345
                editing=TRUE;
 
346
        }
 
347
        tmp=gtk_editable_get_chars(GTK_EDITABLE(lookup_widget(dialog,"reg_route")),0,-1);
 
348
        linphone_proxy_config_set_route(cfg,tmp);
 
349
        g_free(tmp);
 
350
        tmp=gtk_editable_get_chars(GTK_EDITABLE(lookup_widget(dialog,"reg_identity")),0,-1);
 
351
        linphone_proxy_config_set_identity(cfg,tmp);
 
352
        g_free(tmp);
 
353
        tmp=gtk_editable_get_chars(GTK_EDITABLE(lookup_widget(dialog,"reg_expires")),0,-1);
 
354
        {
 
355
          int exp;
 
356
          if (tmp!=NULL)
 
357
            {
 
358
              exp = atoi(tmp);
 
359
              if (exp<=0)
 
360
                exp = 200; /* minimum */
 
361
              if (exp>7200)
 
362
                exp = 7200; /* maximum */
 
363
              linphone_proxy_config_expires(cfg,exp);
 
364
            }
 
365
        }
 
366
        g_free(tmp);
 
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);
 
375
}
 
376
 
 
377
void
 
378
on_proxy_config_box_response           (GtkDialog       *dialog,
 
379
                                        gint             response_id,
 
380
                                        gpointer         user_data)
 
381
{
 
382
        switch(response_id){
 
383
                case GTK_RESPONSE_OK:
 
384
                        get_proxy_config_box_data(GTK_WIDGET(dialog));
 
385
                        gtk_widget_destroy(GTK_WIDGET(dialog));
 
386
                        
 
387
                break;
 
388
        }
 
389
}
 
390
 
 
391
 
 
392
void codec_section_init(CodecSection *sec, GtkWidget *prop)
 
393
{
 
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");
 
397
}
 
398
 
 
399
void codec_selection_changed_cb(GtkTreeSelection *selection, gpointer data)
 
400
{
 
401
        GtkTreeIter iter;
 
402
        GtkTreeModel *model;
 
403
        struct _PayloadType *pt=NULL;
 
404
        LinphonePropertyBox *prop=get_property_box();
 
405
        
 
406
        if (gtk_tree_selection_get_selected (selection, &model, &iter)) 
 
407
        {
 
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));
 
412
        }
 
413
}
 
414
 
 
415
void codec_list_build(GtkTreeView *listview,const MSList *codeclist)
 
416
{
 
417
        const MSList *elem;
 
418
        GtkListStore *store = gtk_list_store_new (CODEC_NCOLUMNS, G_TYPE_STRING,
 
419
                                                                                                                                G_TYPE_INT,
 
420
                                                                                                                                G_TYPE_FLOAT,
 
421
                                                                                                                                G_TYPE_STRING,
 
422
                                                                                                                                G_TYPE_POINTER,
 
423
                                                                                                                                G_TYPE_STRING);
 
424
        GtkTreeIter iter;
 
425
        GtkCellRenderer *renderer;
 
426
        GtkTreeViewColumn *column;
 
427
        GtkTreeSelection *select=gtk_tree_view_get_selection (listview);
 
428
        for(elem=codeclist; elem!=NULL; elem=elem->next){
 
429
                gchar *status;
 
430
                gint rate;
 
431
                gfloat bitrate; 
 
432
                gchar *color;
 
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";
 
437
                else color="red";
 
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),
 
443
                                                                                CODEC_RATE,rate,
 
444
                                                                                CODEC_BITRATE,bitrate,
 
445
                                                                                CODEC_STATUS,status,
 
446
                                                                                CODEC_PRIVDATA,(gpointer)pt,
 
447
                                                                                CODEC_COLOR,(gpointer)color,
 
448
                                                                                -1);
 
449
        }
 
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"),
 
454
                                                   renderer,
 
455
                                                   "text", CODEC_NAME,
 
456
                                                                                                   "foreground",CODEC_COLOR,
 
457
                                                   NULL);
 
458
        gtk_tree_view_append_column (listview, column);
 
459
        column = gtk_tree_view_column_new_with_attributes (_("Rate (Hz)"),
 
460
                                                   renderer,
 
461
                                                   "text", CODEC_RATE,
 
462
                                                                                                   "foreground",CODEC_COLOR,
 
463
                                                   NULL);
 
464
        gtk_tree_view_append_column (listview, column);
 
465
        column = gtk_tree_view_column_new_with_attributes (_("Status"),
 
466
                                                   renderer,
 
467
                                                   "text", CODEC_STATUS,
 
468
                                                                                                        "foreground",CODEC_COLOR,
 
469
                                                   NULL);
 
470
        gtk_tree_view_append_column (listview, column);
 
471
        column = gtk_tree_view_column_new_with_attributes (_("Min bitrate (kbit/s)"),
 
472
                                                   renderer,
 
473
                                                   "text", CODEC_BITRATE,
 
474
                                                                                                        "foreground",CODEC_COLOR,
 
475
                                                   NULL);
 
476
        gtk_tree_view_append_column (listview, column);
 
477
        
 
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),
 
484
                  NULL);
 
485
}
 
486
 
 
487
void codec_section_fill(CodecSection *sec, LinphoneCore *lc, GtkWidget *propbox)
 
488
{
 
489
        /* display prefered codecs*/
 
490
        int value;
 
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);
 
496
        if (value!=0)
 
497
                gtk_spin_button_set_value(GTK_SPIN_BUTTON(lookup_widget(propbox,"download_bw")),value);
 
498
        else 
 
499
                gtk_entry_set_text(GTK_ENTRY(lookup_widget(propbox,"download_bw")),_("Unlimited"));
 
500
        value=linphone_core_get_upload_bandwidth(lc);
 
501
        if (value!=0)
 
502
                gtk_spin_button_set_value(GTK_SPIN_BUTTON(lookup_widget(propbox,"upload_bw")),value);
 
503
        else 
 
504
                gtk_entry_set_text(GTK_ENTRY(lookup_widget(propbox,"upload_bw")),_("Unlimited"));
 
505
}
 
506
 
 
507
void codec_section_apply(CodecSection *sec, LinphoneCore *lc)
 
508
{
 
509
        GtkTreeIter iter;
 
510
        struct _PayloadType *pt;
 
511
        MSList *codeclist=NULL;
 
512
        gchar *status;
 
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));
 
516
        do{
 
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 */
 
526
        codeclist=NULL;
 
527
        g_return_if_fail(gtk_tree_model_get_iter_first(model,&iter));
 
528
        do{
 
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);
 
536
}
 
537
 
 
538
void sound_section_init(SoundSection *sec, GtkWidget *prop)
 
539
{
 
540
        sec->source_entry=lookup_widget(prop,"rec_source");
 
541
        sec->ringfileentry=lookup_widget(prop,"ringfileentry");
 
542
}
 
543
 
 
544
 
 
545
void
 
546
on_play_card_changed                   (GtkComboBox     *combobox,
 
547
                                        gpointer         user_data)
 
548
{
 
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();
 
556
        g_free(dev);
 
557
}
 
558
 
 
559
 
 
560
void
 
561
on_capt_card_changed                   (GtkComboBox     *combobox,
 
562
                                        gpointer         user_data)
 
563
{
 
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();
 
571
        g_free(dev);
 
572
}
 
573
 
 
574
void
 
575
on_ring_card_changed                   (GtkComboBox     *combobox,
 
576
                                        gpointer         user_data)
 
577
{
 
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();
 
585
        g_free(dev);
 
586
}
 
587
 
 
588
static int get_dev_index(const char **devnames, const char *dev){
 
589
        int i;
 
590
        for (i=0;devnames[i]!=NULL;i++){
 
591
                if (strcmp(devnames[i],dev)==0)
 
592
                        return i;
 
593
        }
 
594
        g_warning("could not find %s in device list.",dev);
 
595
        return 0;
 
596
}
 
597
 
 
598
void sound_section_fill(SoundSection *sec, LinphoneCore *lc)
 
599
{
 
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"));
 
603
        int i;
 
604
        const char **devnames=linphone_core_get_sound_devices(lc);
 
605
        /* select used sound drivers*/
 
606
        
 
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);
 
612
        }
 
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))
 
619
        {
 
620
                case 'm':
 
621
                        gtk_entry_set_text (GTK_ENTRY (sec->source_entry), _("micro"));
 
622
                        break;
 
623
                case 'l':
 
624
                        gtk_entry_set_text (GTK_ENTRY (sec->source_entry), _("line"));
 
625
                        break;
 
626
                default:
 
627
                        g_warning("Invalid source !");
 
628
        }
 
629
        {
 
630
                        gchar *ringfile=linphone_core_get_ring(lc);
 
631
                        gnome_file_entry_set_filename(GNOME_FILE_ENTRY(sec->ringfileentry),ringfile);
 
632
                        
 
633
        }
 
634
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lookup_widget(get_property_box()->prop,"echocancelation")),linphone_core_echo_cancelation_enabled(lc));
 
635
}
 
636
 
 
637
 
 
638
 
 
639
 
 
640
void sound_section_apply(SoundSection *sec, LinphoneCore *lc)
 
641
{
 
642
        gchar *tmp;
 
643
        
 
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');
 
648
        g_free(tmp);
 
649
        
 
650
        /* get ring path */
 
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);
 
653
        g_free(tmp);
 
654
        
 
655
}
 
656
 
 
657
void ring_finished(LinphoneCore *lc,gpointer user_data)
 
658
{
 
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);
 
663
}
 
664
 
 
665
void
 
666
on_ringpreview_clicked                 (GtkButton       *button,
 
667
                                        gpointer         user_data)
 
668
{
 
669
        int err;
 
670
        gchar *tmp;
 
671
        LinphonePropertyBox *prop=get_property_box();
 
672
        LinphoneCore *lc=get_core();
 
673
        /* get ring path */
 
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);
 
677
        g_free(tmp);
 
678
}
 
679
 
 
680
 
 
681
void linphone_property_box_fill(LinphonePropertyBox * box, LinphoneCore *lp)
 
682
{
 
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"
 
688
        to be sent */
 
689
        gnome_property_box_set_state(GNOME_PROPERTY_BOX(box->prop),0);
 
690
}
 
691
 
 
692
void linphone_property_box_init(LinphonePropertyBox *box)
 
693
{
 
694
        GtkWidget *prop=create_prop1();
 
695
        box->prop=prop;
 
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());
 
702
}
 
703
 
 
704
 
 
705
 
 
706
 
 
707
void on_propertybox1_apply (GtkButton       *button,
 
708
                                        gint pagenum)
 
709
{       
 
710
        LinphonePropertyBox *prop=get_property_box();
 
711
        LinphoneCore *lc=get_core();
 
712
        switch(pagenum)
 
713
        {
 
714
        case 0:
 
715
                net_section_apply(&prop->net,lc);
 
716
                break;
 
717
        case 1:
 
718
                sound_section_apply(&prop->sound,lc);
 
719
                break;
 
720
        case 2:
 
721
                sip_section_apply(&prop->sip,lc);
 
722
                break;
 
723
        case 3:
 
724
                codec_section_apply(&prop->codec,lc);
 
725
                break;
 
726
        }
 
727
}
 
728
 
 
729
 
 
730
void
 
731
on_audioport_changed                   (GtkEditable     *editable,
 
732
                                        gpointer         user_data)
 
733
{
 
734
        LinphonePropertyBox *prop=get_property_box();
 
735
        gnome_property_box_changed(GNOME_PROPERTY_BOX(prop->prop));
 
736
        return;
 
737
}
 
738
 
 
739
 
 
740
void
 
741
on_sipport_changed                     (GtkEditable     *editable,
 
742
                                        gpointer         user_data)
 
743
{
 
744
        LinphonePropertyBox *prop=get_property_box();
 
745
        gnome_property_box_changed(GNOME_PROPERTY_BOX(prop->prop));
 
746
        return;
 
747
}
 
748
 
 
749
 
 
750
void
 
751
on_source_changed                      (GtkEditable     *editable,
 
752
                                        gpointer         user_data)
 
753
{
 
754
        LinphonePropertyBox *prop=get_property_box();
 
755
        gnome_property_box_changed(GNOME_PROPERTY_BOX(prop->prop));
 
756
}
 
757
 
 
758
enum {
 
759
        CODEC_ACTION_UP,
 
760
        CODEC_ACTION_DOWN
 
761
};
 
762
 
 
763
 
 
764
void codec_row_move(GtkTreeView *listview, int action)
 
765
{
 
766
        GtkTreeIter iter;
 
767
        GtkTreeIter previter,nextiter,newiter;
 
768
    GtkTreeModel *model;
 
769
        GtkTreeSelection *selection;
 
770
        GtkTreePath *treepath;
 
771
    struct _PayloadType *codec=NULL;
 
772
        gchar *name=NULL;
 
773
        gint rate;
 
774
        gfloat bitrate;
 
775
        gchar *status=NULL;
 
776
        gchar *color=NULL;
 
777
        
 
778
        selection=gtk_tree_view_get_selection(listview);
 
779
        if (gtk_tree_selection_get_selected (selection, &model, &iter)) 
 
780
        {
 
781
                gtk_tree_model_get (model, &iter,       CODEC_NAME,&name,
 
782
                                                                                        CODEC_RATE,&rate,
 
783
                                                                                        CODEC_BITRATE,&bitrate,
 
784
                                                                                        CODEC_STATUS,&status,
 
785
                                                                                        CODEC_PRIVDATA, &codec,
 
786
                                                                                        CODEC_COLOR,&color,
 
787
                                                                                        -1);
 
788
                g_return_if_fail(codec!=NULL);
 
789
                switch(action){
 
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. */
 
795
                                        return;
 
796
                                }
 
797
                                gtk_tree_model_get_iter(model,&previter,treepath);
 
798
                                gtk_list_store_insert_before(GTK_LIST_STORE(model),&newiter,&previter);
 
799
                        break;
 
800
                        case CODEC_ACTION_DOWN:
 
801
                                /* get an iterator on the next codec */
 
802
                                nextiter=iter;
 
803
                                if (!gtk_tree_model_iter_next(model,&nextiter)){
 
804
                                        /* codec is the last, no match. */
 
805
                                        return;
 
806
                                }
 
807
                                gtk_list_store_insert_after(GTK_LIST_STORE(model),&newiter,&nextiter);
 
808
                                
 
809
                        break;
 
810
                }
 
811
                gtk_list_store_set(GTK_LIST_STORE(model),&newiter,
 
812
                                                                                        CODEC_NAME,name,
 
813
                                                                                        CODEC_RATE,rate,
 
814
                                                                                        CODEC_BITRATE,bitrate,
 
815
                                                                                        CODEC_STATUS,status,
 
816
                                                                                        CODEC_PRIVDATA, codec,
 
817
                                                                                        CODEC_COLOR,color,
 
818
                                                                                        -1);
 
819
                /* remove the selected line */
 
820
                gtk_list_store_remove(GTK_LIST_STORE(model),&iter);
 
821
                gtk_tree_selection_select_iter(selection,&newiter);
 
822
                g_free(name);
 
823
                g_free(status);
 
824
                g_free(color);
 
825
        }
 
826
}
 
827
 
 
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")));
 
832
        if (page==0)
 
833
                listview=GTK_TREE_VIEW(get_property_box()->codec.au_codec_list);
 
834
        else 
 
835
                listview=GTK_TREE_VIEW(lookup_widget(get_property_box()->prop,"vid_codec_list"));
 
836
        codec_row_move(listview,action);
 
837
        property_box_changed();
 
838
}
 
839
 
 
840
void
 
841
on_aucodec_up_clicked                  (GtkButton       *button,
 
842
                                        gpointer         user_data)
 
843
{
 
844
        codec_move(CODEC_ACTION_UP);
 
845
}
 
846
 
 
847
 
 
848
void
 
849
on_aucodec_down_clicked                (GtkButton       *button,
 
850
                                        gpointer         user_data)
 
851
{
 
852
        codec_move(CODEC_ACTION_DOWN);
 
853
}
 
854
 
 
855
void codec_set_status(GtkTreeView *listview,gboolean status)
 
856
{
 
857
        GtkTreeModel *model;
 
858
        GtkTreeSelection *selection;
 
859
        GtkTreeIter iter;
 
860
        gchar *statusstring;
 
861
        selection=gtk_tree_view_get_selection(listview);
 
862
        if (gtk_tree_selection_get_selected (selection, &model, &iter)) 
 
863
        {
 
864
                if (status) statusstring=_("Enabled");
 
865
                else statusstring=_("Disabled");
 
866
                gtk_list_store_set(GTK_LIST_STORE(model),&iter,CODEC_STATUS,statusstring,-1);
 
867
        }
 
868
}
 
869
 
 
870
void codec_list_update(GtkTreeView *listview)
 
871
{
 
872
        GtkTreeModel *model;
 
873
        GtkTreeIter iter;
 
874
        PayloadType *pt;
 
875
        gchar *color;
 
876
        gfloat bitrate;
 
877
        model=gtk_tree_view_get_model(listview);
 
878
        
 
879
        g_return_if_fail(gtk_tree_model_get_iter_first(model,&iter));
 
880
        do{
 
881
                gtk_tree_model_get (model, &iter,       CODEC_PRIVDATA, &pt,-1);
 
882
                if (linphone_core_check_payload_type_usability(get_core(),pt)){
 
883
                        color="blue";
 
884
                }else color="red";
 
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));
 
888
}
 
889
 
 
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")));
 
894
        if (page==0)
 
895
                listview=GTK_TREE_VIEW(get_property_box()->codec.au_codec_list);
 
896
        else 
 
897
                listview=GTK_TREE_VIEW(lookup_widget(get_property_box()->prop,"vid_codec_list"));
 
898
        codec_set_status(listview,val);
 
899
        property_box_changed();
 
900
}
 
901
 
 
902
void
 
903
on_aucodec_enable_clicked              (GtkButton       *button,
 
904
                                        gpointer         user_data)
 
905
{
 
906
        codec_enable(TRUE);
 
907
}
 
908
 
 
909
 
 
910
void
 
911
on_aucodec_disable_clicked             (GtkButton       *button,
 
912
                                        gpointer         user_data)
 
913
{
 
914
        codec_enable(FALSE);
 
915
}
 
916
 
 
917
 
 
918
void
 
919
on_user_name_changed                   (GtkEditable     *editable,
 
920
                                        gpointer         user_data)
 
921
{
 
922
        property_box_changed();
 
923
}
 
924
 
 
925
 
 
926
void
 
927
on_domain_name_changed                 (GtkEditable     *editable,
 
928
                                        gpointer         user_data)
 
929
{
 
930
        property_box_changed();
 
931
}
 
932
 
 
933
 
 
934
 
 
935
void
 
936
on_reg_passwd_changed                  (GtkEditable     *editable,
 
937
                                        gpointer         user_data)
 
938
{
 
939
   property_box_changed();
 
940
}
 
941
 
 
942
 
 
943
void
 
944
on_obproxy_button_toggled               (GtkToggleButton *togglebutton,
 
945
                                        gpointer         user_data)
 
946
{
 
947
   property_box_changed();
 
948
}
 
949
 
 
950
void
 
951
on_address_of_record_changed           (GtkEditable     *editable,
 
952
                                        gpointer         user_data)
 
953
{
 
954
    property_box_changed();
 
955
}
 
956
 
 
957
 
 
958
void
 
959
on_audio_jittcomp_value_changed        (GtkRange        *range,
 
960
                                        gpointer         user_data)
 
961
{
 
962
        property_box_changed();
 
963
}
 
964
 
 
965
void
 
966
on_ringfileentry_changed               (GtkEditable     *editable,
 
967
                                        gpointer         user_data)
 
968
{
 
969
        property_box_changed();
 
970
}
 
971
 
 
972
void linphone_property_box_uninit(LinphonePropertyBox *box)
 
973
{
 
974
        memset(box,0, sizeof(LinphonePropertyBox));
 
975
}
 
976
 
 
977
 
 
978
gboolean
 
979
on_property_box_closed                 (GnomeDialog     *gnomedialog,
 
980
                                        gpointer         user_data)
 
981
{
 
982
  linphone_property_box_uninit(get_property_box());
 
983
  return FALSE;
 
984
}
 
985
 
 
986
void
 
987
on_use_sipinfo_toggled                 (GtkToggleButton *togglebutton,
 
988
                                        gpointer         user_data)
 
989
{
 
990
        linphone_core_set_use_info_for_dtmf(get_core(),gtk_toggle_button_get_active(togglebutton));
 
991
}
 
992
 
 
993
 
 
994
void
 
995
on_guess_hostname_toggled              (GtkToggleButton *togglebutton,
 
996
                                        gpointer         user_data)
 
997
{
 
998
        GtkWidget *hostname;
 
999
        osip_from_t *from;
 
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);
 
1007
}
 
1008
 
 
1009
void
 
1010
on_download_bw_value_changed           (GtkSpinButton   *spinbutton,
 
1011
                                        gpointer         user_data)
 
1012
{
 
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")));
 
1018
}
 
1019
 
 
1020
void
 
1021
on_upload_bw_value_changed             (GtkSpinButton   *spinbutton,
 
1022
                                        gpointer         user_data)
 
1023
{
 
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")));
 
1029
}
 
1030
 
 
1031
void
 
1032
on_no_nat_toggled                      (GtkToggleButton *togglebutton,
 
1033
                                        gpointer         user_data)
 
1034
{
 
1035
        property_box_changed();
 
1036
}
 
1037
 
 
1038
 
 
1039
void
 
1040
on_use_stun_toggled                    (GtkToggleButton *togglebutton,
 
1041
                                        gpointer         user_data)
 
1042
{
 
1043
        property_box_changed();
 
1044
}
 
1045
 
 
1046
 
 
1047
void
 
1048
on_static_nat_toggled                  (GtkToggleButton *togglebutton,
 
1049
                                        gpointer         user_data)
 
1050
{
 
1051
        property_box_changed();
 
1052
}
 
1053
 
 
1054
void
 
1055
on_stun_server_changed                 (GtkEditable     *editable,
 
1056
                                        gpointer         user_data)
 
1057
{
 
1058
        property_box_changed();
 
1059
}
 
1060