]> sjero.net Git - linphone/blobdiff - gtk/propertybox.c
Fix UI feedbacks :
[linphone] / gtk / propertybox.c
index 50aa588577e0d68068d8cb925748927cc2ac3b0f..f30b55d05e080e122be42a18f2366f419ff1d7a9 100644 (file)
@@ -18,6 +18,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
 
 #include "linphone.h"
+#include "linphone_tunnel.h"
 
 typedef enum {
        CAP_IGNORE,
@@ -33,7 +34,7 @@ static void linphone_gtk_fill_combo_box(GtkWidget *combo, const char **devices,
        This dummy text needs to be removed first*/
        gtk_combo_box_remove_text(GTK_COMBO_BOX(combo),0);
        for(;*p!=NULL;++p){
-               if ( cap==CAP_IGNORE 
+               if ( cap==CAP_IGNORE
                        || (cap==CAP_CAPTURE && linphone_core_sound_device_can_capture(linphone_gtk_get_core(),*p))
                        || (cap==CAP_PLAYBACK && linphone_core_sound_device_can_playback(linphone_gtk_get_core(),*p)) ){
                        gtk_combo_box_append_text(GTK_COMBO_BOX(combo),*p);
@@ -87,6 +88,56 @@ void linphone_gtk_update_my_contact(GtkWidget *w){
        linphone_gtk_load_identities();
 }
 
+void linphone_gtk_update_my_port(GtkWidget *w){
+    GtkWidget *pb=gtk_widget_get_toplevel(GTK_WIDGET(w));
+       LCSipTransports tr;
+       LinphoneCore *lc=linphone_gtk_get_core();
+    GtkComboBox *combo = GTK_COMBO_BOX(linphone_gtk_get_widget(pb, "proto_combo"));
+
+       gint port = (gint)gtk_spin_button_get_value(GTK_SPIN_BUTTON(w));
+    if (port == 1) { // We use default port if not specified
+        if (strcmp(gtk_combo_box_get_active_text(combo), "SIP (UDP)") == 0) {
+            gtk_spin_button_set_value(GTK_SPIN_BUTTON(w),
+                               5060);
+        }
+        else if (strcmp(gtk_combo_box_get_active_text(combo), "SIP (TCP)") == 0) {
+            gtk_spin_button_set_value(GTK_SPIN_BUTTON(w),
+                               5060);
+        }
+        else if (strcmp(gtk_combo_box_get_active_text(combo), "SIP (TLS)") == 0) {
+            gtk_spin_button_set_value(GTK_SPIN_BUTTON(w),
+                               5061);
+        }
+    }
+
+       linphone_core_get_sip_transports(lc,&tr);
+    gchar *selected = gtk_combo_box_get_active_text(combo);
+       if (strcmp(selected, "SIP (TCP)") == 0) {
+               tr.tcp_port = (gint)gtk_spin_button_get_value(GTK_SPIN_BUTTON(w));
+               tr.udp_port = 0;
+               tr.tls_port = 0;
+       }
+       else if (strcmp(gtk_combo_box_get_active_text(GTK_COMBO_BOX(linphone_gtk_get_widget(pb, "proto_combo"))), "SIP (UDP)") == 0) {
+               tr.udp_port = (gint)gtk_spin_button_get_value(GTK_SPIN_BUTTON(w));
+        tr.tcp_port = 0;
+               tr.tls_port = 0;
+       }
+       else if (strcmp(gtk_combo_box_get_active_text(GTK_COMBO_BOX(linphone_gtk_get_widget(pb, "proto_combo"))), "SIP (TLS)") == 0){
+               tr.udp_port = 0;
+        tr.tcp_port = 0;
+               tr.tls_port = (gint)gtk_spin_button_get_value(GTK_SPIN_BUTTON(w));
+       }
+
+       linphone_core_set_sip_transports(lc,&tr);
+}
+
+void linphone_gtk_set_propety_entry(GtkWidget *w, gboolean stunServer, gboolean ip){
+       GtkWidget *stun_entry=linphone_gtk_get_widget(gtk_widget_get_toplevel(w),"stun_server");
+       GtkWidget *ip_entry=linphone_gtk_get_widget(gtk_widget_get_toplevel(w),"nat_address");
+       gtk_widget_set_sensitive(stun_entry,stunServer);
+       gtk_widget_set_sensitive(ip_entry,ip);
+}
+
 void linphone_gtk_stun_server_changed(GtkWidget *w){
        const gchar *addr=gtk_entry_get_text(GTK_ENTRY(w));
        linphone_core_set_stun_server(linphone_gtk_get_core(),addr);
@@ -102,47 +153,109 @@ void linphone_gtk_ipv6_toggled(GtkWidget *w){
                                gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)));
 }
 
-void linphone_gtk_udp_sip_port_changed(GtkWidget *w){
-       LCSipTransports tr;
-       LinphoneCore *lc=linphone_gtk_get_core();
+void linphone_gtk_min_audio_port_changed(GtkWidget *w){
+       GtkWidget *mw = linphone_gtk_get_main_window();
+       GtkWidget *pb = (GtkWidget *) g_object_get_data(G_OBJECT(mw), "parameters");
+       GtkSpinButton *min_button = GTK_SPIN_BUTTON(w);
+       GtkSpinButton *max_button = GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb, "audio_max_rtp_port"));
+       gboolean fixed = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb, "fixed_audio_port")));
 
-       linphone_core_get_sip_transports(lc,&tr);
-       tr.udp_port = (gint)gtk_spin_button_get_value(GTK_SPIN_BUTTON(w));
-       linphone_core_set_sip_transports(lc,&tr);
+       if (fixed) {
+               linphone_core_set_audio_port(linphone_gtk_get_core(), (gint) gtk_spin_button_get_value(min_button));
+               gtk_spin_button_set_value(max_button, gtk_spin_button_get_value(min_button));
+       } else {
+               gint min_port = gtk_spin_button_get_value(min_button);
+               gint max_port = gtk_spin_button_get_value(max_button);
+               if (min_port > max_port) {
+                       gtk_spin_button_set_value(max_button, min_port);
+                       max_port = min_port;
+               }
+               linphone_core_set_audio_port_range(linphone_gtk_get_core(), min_port, max_port);
+       }
 }
 
-void linphone_gtk_tcp_sip_port_changed(GtkWidget *w){
-       LCSipTransports tr;
-       LinphoneCore *lc=linphone_gtk_get_core();
-
-       linphone_core_get_sip_transports(lc,&tr);
-       tr.tcp_port = (gint)gtk_spin_button_get_value(GTK_SPIN_BUTTON(w));
-       linphone_core_set_sip_transports(lc,&tr);
+void linphone_gtk_max_audio_port_changed(GtkWidget *w){
+       GtkWidget *mw = linphone_gtk_get_main_window();
+       GtkWidget *pb = (GtkWidget *) g_object_get_data(G_OBJECT(mw), "parameters");
+       GtkSpinButton *min_button = GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb, "audio_min_rtp_port"));
+       GtkSpinButton *max_button = GTK_SPIN_BUTTON(w);
+       gint min_port = gtk_spin_button_get_value(min_button);
+       gint max_port = gtk_spin_button_get_value(max_button);
+       if (max_port < min_port) {
+               gtk_spin_button_set_value(min_button, max_port);
+               min_port = max_port;
+       }
+       linphone_core_set_audio_port_range(linphone_gtk_get_core(), min_port, max_port);
 }
 
-void linphone_gtk_audio_port_changed(GtkWidget *w){
-       linphone_core_set_audio_port(linphone_gtk_get_core(),
-                       (gint)gtk_spin_button_get_value(GTK_SPIN_BUTTON(w)));
+void linphone_gtk_min_video_port_changed(GtkWidget *w){
+       GtkWidget *mw = linphone_gtk_get_main_window();
+       GtkWidget *pb = (GtkWidget *) g_object_get_data(G_OBJECT(mw), "parameters");
+       GtkSpinButton *min_button = GTK_SPIN_BUTTON(w);
+       GtkSpinButton *max_button = GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb, "video_max_rtp_port"));
+       gboolean fixed = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb, "fixed_video_port")));
+
+       if (fixed) {
+               linphone_core_set_video_port(linphone_gtk_get_core(), (gint) gtk_spin_button_get_value(min_button));
+               gtk_spin_button_set_value(max_button, gtk_spin_button_get_value(min_button));
+       } else {
+               gint min_port = gtk_spin_button_get_value(min_button);
+               gint max_port = gtk_spin_button_get_value(max_button);
+               if (min_port > max_port) {
+                       gtk_spin_button_set_value(max_button, min_port);
+                       max_port = min_port;
+               }
+               linphone_core_set_video_port_range(linphone_gtk_get_core(), min_port, max_port);
+       }
 }
 
-void linphone_gtk_video_port_changed(GtkWidget *w){
-       linphone_core_set_video_port(linphone_gtk_get_core(),
-                       (gint)gtk_spin_button_get_value(GTK_SPIN_BUTTON(w)));
+void linphone_gtk_max_video_port_changed(GtkWidget *w){
+       GtkWidget *mw = linphone_gtk_get_main_window();
+       GtkWidget *pb = (GtkWidget *) g_object_get_data(G_OBJECT(mw), "parameters");
+       GtkSpinButton *min_button = GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb, "video_min_rtp_port"));
+       GtkSpinButton *max_button = GTK_SPIN_BUTTON(w);
+       gint min_port = gtk_spin_button_get_value(min_button);
+       gint max_port = gtk_spin_button_get_value(max_button);
+       if (max_port < min_port) {
+               gtk_spin_button_set_value(min_button, max_port);
+               min_port = max_port;
+       }
+       linphone_core_set_video_port_range(linphone_gtk_get_core(), min_port, max_port);
 }
 
 void linphone_gtk_no_firewall_toggled(GtkWidget *w){
-       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)))
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))){
+               linphone_gtk_set_propety_entry(w,FALSE,FALSE);
                linphone_core_set_firewall_policy(linphone_gtk_get_core(),LinphonePolicyNoFirewall);
+       }
 }
 
 void linphone_gtk_use_nat_address_toggled(GtkWidget *w){
-       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)))
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))){
+               linphone_gtk_set_propety_entry(w,FALSE,TRUE);
                linphone_core_set_firewall_policy(linphone_gtk_get_core(),LinphonePolicyUseNatAddress);
+       }
 }
 
 void linphone_gtk_use_stun_toggled(GtkWidget *w){
-       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)))
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))){
+               linphone_gtk_set_propety_entry(w,TRUE,FALSE);
                linphone_core_set_firewall_policy(linphone_gtk_get_core(),LinphonePolicyUseStun);
+       }
+}
+
+void linphone_gtk_use_ice_toggled(GtkWidget *w){
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))){
+               linphone_gtk_set_propety_entry(w,TRUE,FALSE);
+               linphone_core_set_firewall_policy(linphone_gtk_get_core(),LinphonePolicyUseIce);
+       }
+}
+
+void linphone_gtk_use_upnp_toggled(GtkWidget *w){
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))){
+               linphone_gtk_set_propety_entry(w,FALSE,FALSE);
+               linphone_core_set_firewall_policy(linphone_gtk_get_core(),LinphonePolicyUseUpnp);
+       }
 }
 
 void linphone_gtk_mtu_changed(GtkWidget *w){
@@ -306,6 +419,17 @@ static void linphone_gtk_init_codec_list(GtkTreeView *listview){
        gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE);
 }
 
+
+const char *get_codec_color(LinphoneCore *lc, PayloadType *pt){
+       const gchar *color;
+       if (linphone_core_check_payload_type_usability(lc,pt)) color="blue";
+               else color="red";
+       if (!linphone_core_payload_type_enabled(lc,pt)) {
+               color="grey";
+       }
+       return color;
+}
+
 static void linphone_gtk_show_codecs(GtkTreeView *listview, const MSList *codeclist)
 {
        const MSList *elem;
@@ -318,14 +442,17 @@ static void linphone_gtk_show_codecs(GtkTreeView *listview, const MSList *codecl
        for(elem=codeclist; elem!=NULL; elem=elem->next){
                gchar *status;
                gint rate;
-               gfloat bitrate; 
-               gchar *color;
+               gfloat bitrate;
+               const gchar *color;
                const char *params="";
+
                struct _PayloadType *pt=(struct _PayloadType *)elem->data;
+
+               color=get_codec_color(linphone_gtk_get_core(),pt);
                if (linphone_core_payload_type_enabled(linphone_gtk_get_core(),pt)) status=_("Enabled");
-               else status=_("Disabled");
-               if (linphone_core_check_payload_type_usability(linphone_gtk_get_core(),pt)) color="blue";
-               else color="red";
+               else {
+                       status=_("Disabled");
+               }
                /* get an iterator */
                gtk_list_store_append(store,&iter);
                bitrate=payload_type_get_bitrate(pt)/1000.0;
@@ -341,9 +468,9 @@ static void linphone_gtk_show_codecs(GtkTreeView *listview, const MSList *codecl
                                        CODEC_INFO,(gpointer)linphone_core_get_payload_type_description(linphone_gtk_get_core(),pt),
                                        -1);
        }
-       
-       
-       
+
+
+
        /* Setup the selection handler */
        selection = gtk_tree_view_get_selection (listview);
        gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
@@ -360,13 +487,12 @@ static void linphone_gtk_check_codec_bandwidth(GtkTreeView *v){
        g_return_if_fail(gtk_tree_model_get_iter_first(model,&iter));
        do{
                PayloadType *pt=NULL;
-               const gchar *color;
+
                gfloat bitrate;
                gtk_tree_model_get(model,&iter,CODEC_PRIVDATA,&pt,-1);
-               if (linphone_core_check_payload_type_usability(linphone_gtk_get_core(),pt)) color="blue";
-               else color="red";
+
                bitrate=payload_type_get_bitrate(pt)/1000.0;
-               gtk_list_store_set(GTK_LIST_STORE(model),&iter,CODEC_COLOR, (gpointer)color,
+               gtk_list_store_set(GTK_LIST_STORE(model),&iter,CODEC_COLOR, (gpointer)get_codec_color(linphone_gtk_get_core(),pt),
                                        CODEC_BITRATE, bitrate,-1);
        }while(gtk_tree_model_iter_next(model,&iter));
 }
@@ -384,7 +510,7 @@ static void linphone_gtk_select_codec(GtkTreeView *v, PayloadType *ref){
                if (pt==ref){
                        gtk_tree_selection_select_iter(selection,&iter);
                }
-               
+
        }while(gtk_tree_model_iter_next(model,&iter));
 }
 
@@ -415,6 +541,11 @@ void linphone_gtk_upload_bw_changed(GtkWidget *w){
        linphone_gtk_check_codec_bandwidth(v);
 }
 
+void linphone_gtk_adaptive_rate_control_toggled(GtkToggleButton *button){
+       gboolean active=gtk_toggle_button_get_active(button);
+       linphone_core_enable_adaptive_rate_control(linphone_gtk_get_core(),active);
+}
+
 static void linphone_gtk_codec_move(GtkWidget *button, int dir){
        GtkTreeView *v=GTK_TREE_VIEW(linphone_gtk_get_widget(gtk_widget_get_toplevel(button),"codec_list"));
        GtkTreeSelection *sel=gtk_tree_view_get_selection(v);
@@ -461,7 +592,8 @@ static void linphone_gtk_codec_set_enable(GtkWidget *button, gboolean enabled){
                store=GTK_LIST_STORE(mod);
                gtk_tree_model_get(mod,&iter,CODEC_PRIVDATA,&pt,-1);
                linphone_core_enable_payload_type(linphone_gtk_get_core(),pt,enabled);
-               gtk_list_store_set(store,&iter,CODEC_STATUS, enabled ? _("Enabled") : _("Disabled"), -1);
+               gtk_list_store_set(store,&iter,CODEC_STATUS, enabled ? _("Enabled") : _("Disabled"),
+                                  CODEC_COLOR,(gpointer)get_codec_color(linphone_gtk_get_core(),pt), -1);
        }
 }
 
@@ -502,7 +634,7 @@ void linphone_gtk_show_sip_accounts(GtkWidget *w){
                GtkTreeViewColumn *column;
                /* create the proxy list */
                store = gtk_list_store_new (PROXY_CONFIG_NCOL, G_TYPE_STRING, G_TYPE_POINTER);
-               
+
                gtk_tree_view_set_model(v,GTK_TREE_MODEL(store));
                g_object_unref(G_OBJECT(store));
                renderer = gtk_cell_renderer_text_new ();
@@ -511,7 +643,7 @@ void linphone_gtk_show_sip_accounts(GtkWidget *w){
                                                        "text", PROXY_CONFIG_IDENTITY,
                                                        NULL);
                gtk_tree_view_append_column (v, column);
-               
+
                select = gtk_tree_view_get_selection (v);
                gtk_tree_selection_set_mode (select, GTK_SELECTION_SINGLE);
                model=GTK_TREE_MODEL(store);
@@ -660,6 +792,10 @@ static LangCodes supported_langs[]={
        {       "hu"    ,       N_("Hungarian") },
        {       "cs"    ,       N_("Czech")     },
        {       "zh_CN" ,       N_("Chinese")   },
+       {       "zh_TW" ,       N_("Traditional Chinese")       },
+       {       "nb_NO" ,       N_("Norwegian") },
+       {       "he"    ,       N_("Hebrew")    },
+       {       "sr"    ,       N_("Serbian")   },
        {       NULL    ,       NULL            }
 };
 
@@ -682,7 +818,12 @@ static void linphone_gtk_fill_langs(GtkWidget *pb){
        const char *all_langs="C " LINPHONE_ALL_LANGS;
        const char *name;
        int i=0,index=0;
-       const char *cur_lang=getenv("LANG");
+       const char *cur_lang;
+       #if defined(WIN32) || defined(__APPLE__)
+               cur_lang=getenv("LANG");
+       #else
+               cur_lang=getenv("LANGUAGE");
+       #endif
        int cur_lang_index=-1;
        char text[256]={0};
        if (cur_lang==NULL) cur_lang="C";
@@ -696,7 +837,7 @@ static void linphone_gtk_fill_langs(GtkWidget *pb){
                name=lang_get_name(code);
                snprintf(text,sizeof(text)-1,"%s : %s",code,name!=NULL ? _(name) : code);
                gtk_combo_box_append_text(GTK_COMBO_BOX(combo),text);
-               if (cur_lang_index==-1 && lang_equals(cur_lang,code)) 
+               if (cur_lang_index==-1 && lang_equals(cur_lang,code))
                        cur_lang_index=index;
                index++;
        }
@@ -706,7 +847,12 @@ static void linphone_gtk_fill_langs(GtkWidget *pb){
 void linphone_gtk_lang_changed(GtkComboBox *combo){
        const char *selected=gtk_combo_box_get_active_text(combo);
        char code[10];
-       const char *cur_lang=getenv("LANG");
+       const char *cur_lang;
+       #if defined(WIN32) || defined(__APPLE__)
+               cur_lang=getenv("LANG");
+       #else
+               cur_lang=getenv("LANGUAGE");
+       #endif
        if (selected!=NULL){
                sscanf(selected,"%s",code);
                if (cur_lang==NULL) cur_lang="C";
@@ -727,6 +873,14 @@ void linphone_gtk_lang_changed(GtkComboBox *combo){
        }
 }
 
+void linphone_gtk_proto_changed(GtkComboBox *combo){
+    GtkWidget *pb=gtk_widget_get_toplevel(GTK_WIDGET(combo));
+
+    GtkWidget *proto_port = linphone_gtk_get_widget(pb, "proto_port");
+    // When we change the network protocol, we call update_my_port to move the port number from the old protocol to the new one
+    linphone_gtk_update_my_port(proto_port);
+}
+
 static void linphone_gtk_ui_level_adapt(GtkWidget *top) {
        gboolean ui_advanced;
        const char *simple_ui = linphone_gtk_get_ui_config("simple_ui", "parameters.codec_tab parameters.transport_frame parameters.ports_frame");
@@ -749,30 +903,181 @@ void linphone_gtk_ui_level_toggled(GtkWidget *w) {
        linphone_gtk_ui_level_adapt(top);
 }
 
-void linphone_gtk_show_parameters(void){
-       GtkWidget *pb=linphone_gtk_create_window("parameters");
+static void linphone_gtk_set_media_encryption_mandatory_sensitive(GtkWidget *propbox, gboolean val){
+       GtkWidget *w=linphone_gtk_get_widget(propbox,"media_encryption_mandatory");
+       gtk_widget_set_sensitive(w,val);
+}
+
+static void linphone_gtk_media_encryption_changed(GtkWidget *combo){
+       char *selected=gtk_combo_box_get_active_text(GTK_COMBO_BOX(combo));
+       LinphoneCore *lc=linphone_gtk_get_core();
+       GtkWidget *toplevel=gtk_widget_get_toplevel(combo);
+       if (selected!=NULL){
+               if (strcasecmp(selected,"SRTP")==0){
+                       linphone_core_set_media_encryption(lc,LinphoneMediaEncryptionSRTP);
+                       linphone_gtk_set_media_encryption_mandatory_sensitive(toplevel,TRUE);
+               }else if (strcasecmp(selected,"ZRTP")==0){
+                       linphone_core_set_media_encryption(lc,LinphoneMediaEncryptionZRTP);
+                       linphone_gtk_set_media_encryption_mandatory_sensitive(toplevel,FALSE);
+               }
+               else {
+                       linphone_core_set_media_encryption(lc,LinphoneMediaEncryptionNone);
+                       linphone_gtk_set_media_encryption_mandatory_sensitive(toplevel,FALSE);
+               }
+               g_free(selected);
+       }else g_warning("gtk_combo_box_get_active_text() returned NULL");
+}
+
+void linphone_gtk_set_media_encryption_mandatory(GtkWidget *button){
+       linphone_core_set_media_encryption_mandatory(linphone_gtk_get_core(),gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)));
+}
+
+static void linphone_gtk_show_media_encryption(GtkWidget *pb){
+       LinphoneCore *lc=linphone_gtk_get_core();
+       GtkWidget *combo=linphone_gtk_get_widget(pb,"media_encryption_combo");
+       bool_t no_enc=TRUE;
+       int srtp_id=-1,zrtp_id=-1;
+       GtkTreeModel *model;
+       GtkListStore *store;
+       GtkTreeIter iter;
+       GtkCellRenderer *renderer=gtk_cell_renderer_text_new();
+       
+       model=GTK_TREE_MODEL((store=gtk_list_store_new(1,G_TYPE_STRING)));
+       gtk_combo_box_set_model(GTK_COMBO_BOX(combo),model);
+       gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo),renderer,TRUE);
+       gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combo),renderer,"text",0,NULL);
+       
+       gtk_list_store_append(store,&iter);
+       gtk_list_store_set(store,&iter,0,_("None"),-1);
+       
+       if (linphone_core_media_encryption_supported(lc,LinphoneMediaEncryptionSRTP)){
+               gtk_list_store_append(store,&iter);
+               gtk_list_store_set(store,&iter,0,_("SRTP"),-1);
+               srtp_id=1;
+               no_enc=FALSE;
+       }
+       if (linphone_core_media_encryption_supported(lc,LinphoneMediaEncryptionZRTP)){
+               gtk_list_store_append(store,&iter);
+               gtk_list_store_set(store,&iter,0,_("ZRTP"),-1);
+               no_enc=FALSE;
+               if (srtp_id!=-1) zrtp_id=2;
+               else zrtp_id=1;
+       }
+       if (no_enc){
+               /*hide this setting*/
+               gtk_widget_hide(combo);
+               gtk_widget_hide(linphone_gtk_get_widget(pb,"media_encryption_label"));
+               gtk_widget_hide(linphone_gtk_get_widget(pb,"media_encryption_mandatory"));
+       }else{
+               LinphoneMediaEncryption menc=linphone_core_get_media_encryption(lc);
+               switch(menc){
+                       case LinphoneMediaEncryptionNone:
+                               gtk_combo_box_set_active(GTK_COMBO_BOX(combo),0);
+                               linphone_gtk_set_media_encryption_mandatory_sensitive(pb,FALSE);
+                       break;
+                       case LinphoneMediaEncryptionSRTP:
+                               if (srtp_id!=-1) {
+                                       gtk_combo_box_set_active(GTK_COMBO_BOX(combo),srtp_id);
+                                       linphone_gtk_set_media_encryption_mandatory_sensitive(pb,TRUE);
+                               }
+                       break;
+                       case LinphoneMediaEncryptionZRTP:
+                               if (zrtp_id!=-1) {
+                                       gtk_combo_box_set_active(GTK_COMBO_BOX(combo),zrtp_id);
+                                       linphone_gtk_set_media_encryption_mandatory_sensitive(pb,FALSE);
+                               }
+                       break;
+               }
+               g_signal_connect(G_OBJECT(combo),"changed",(GCallback)linphone_gtk_media_encryption_changed,NULL);
+       }
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"media_encryption_mandatory")),
+                                    linphone_core_is_media_encryption_mandatory(lc));
+       g_object_unref(G_OBJECT(model));
+}
+
+void linphone_gtk_parameters_destroyed(GtkWidget *pb){
+       GtkWidget *mw=linphone_gtk_get_main_window();
+       ms_error("linphone_gtk_paramters_destroyed");
+       g_object_set_data(G_OBJECT(mw),"parameters",NULL);
+}
+
+void linphone_gtk_fill_soundcards(GtkWidget *pb){
        LinphoneCore *lc=linphone_gtk_get_core();
        const char **sound_devices=linphone_core_get_sound_devices(lc);
+       linphone_gtk_fill_combo_box(linphone_gtk_get_widget(pb,"playback_device"), sound_devices,
+                                       linphone_core_get_playback_device(lc),CAP_PLAYBACK);
+       linphone_gtk_fill_combo_box(linphone_gtk_get_widget(pb,"ring_device"), sound_devices,
+                                       linphone_core_get_ringer_device(lc),CAP_PLAYBACK);
+       linphone_gtk_fill_combo_box(linphone_gtk_get_widget(pb,"capture_device"), sound_devices,
+                                       linphone_core_get_capture_device(lc), CAP_CAPTURE);
+}
+
+void linphone_gtk_fill_webcams(GtkWidget *pb){
+       LinphoneCore *lc=linphone_gtk_get_core();
+       linphone_gtk_fill_combo_box(linphone_gtk_get_widget(pb,"webcams"),linphone_core_get_video_devices(lc),
+                                       linphone_core_get_video_device(lc),CAP_IGNORE);
+}
+
+void linphone_gtk_show_parameters(void){
+       GtkWidget *mw=linphone_gtk_get_main_window();
+       GtkWidget *pb=(GtkWidget*)g_object_get_data(G_OBJECT(mw),"parameters");
+       LinphoneCore *lc=linphone_gtk_get_core();
        const char *tmp;
        LinphoneAddress *contact;
        LinphoneFirewallPolicy pol;
-       GtkWidget *codec_list=linphone_gtk_get_widget(pb,"codec_list");
+       GtkWidget *codec_list;
        int mtu;
        int ui_advanced;
        LCSipTransports tr;
+       int min_port = 0, max_port = 0;
+
+       if (pb==NULL) {
+               pb=linphone_gtk_create_window("parameters");
+               g_object_set_data(G_OBJECT(mw),"parameters",pb);
+       }else {
+               gtk_widget_show(pb);
+               return;
+       }
+       codec_list=linphone_gtk_get_widget(pb,"codec_list");
 
        /* NETWORK CONFIG */
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"ipv6_enabled")),
                                linphone_core_ipv6_enabled(lc));
        linphone_core_get_sip_transports(lc,&tr);
-       gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"udp_sip_port")),
-                               tr.udp_port);
-       gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"tcp_sip_port")),
+
+       if (tr.tcp_port > 0) {
+               gtk_combo_box_set_active(GTK_COMBO_BOX(linphone_gtk_get_widget(pb,"proto_combo")), 1);
+               gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"proto_port")),
                                tr.tcp_port);
-       gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"audio_rtp_port")),
-                               linphone_core_get_audio_port(lc));
-       gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"video_rtp_port")),
-                               linphone_core_get_video_port(lc));
+       }
+       else if (tr.tls_port > 0) {
+               gtk_combo_box_set_active(GTK_COMBO_BOX(linphone_gtk_get_widget(pb,"proto_combo")), 2);
+               gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"proto_port")),
+                               tr.tls_port);
+       }
+       else {
+               gtk_combo_box_set_active(GTK_COMBO_BOX(linphone_gtk_get_widget(pb,"proto_combo")), 0);
+               gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"proto_port")),
+                               tr.udp_port);
+       }
+
+       linphone_core_get_audio_port_range(lc, &min_port, &max_port);
+       gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb, "audio_min_rtp_port")), min_port);
+       gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb, "audio_max_rtp_port")), max_port);
+       if (min_port == max_port) {
+               gtk_widget_set_sensitive(GTK_WIDGET(linphone_gtk_get_widget(pb, "audio_max_rtp_port")), FALSE);
+               gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb, "fixed_audio_port")), TRUE);
+       }
+       linphone_core_get_video_port_range(lc, &min_port, &max_port);
+       gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb, "video_min_rtp_port")), min_port);
+       gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb, "video_max_rtp_port")), max_port);
+       if (min_port == max_port) {
+               gtk_widget_set_sensitive(GTK_WIDGET(linphone_gtk_get_widget(pb, "video_max_rtp_port")), FALSE);
+               gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb, "fixed_video_port")), TRUE);
+       }
+
+       linphone_gtk_show_media_encryption(pb);
+       
        tmp=linphone_core_get_nat_address(lc);
        if (tmp) gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(pb,"nat_address")),tmp);
        tmp=linphone_core_get_stun_server(lc);
@@ -788,7 +1093,17 @@ void linphone_gtk_show_parameters(void){
                case LinphonePolicyUseStun:
                        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"use_stun")),TRUE);
                break;
+               case LinphonePolicyUseIce:
+                       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"use_ice")),TRUE);
+               break;
+               case LinphonePolicyUseUpnp:
+                       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"use_upnp")),TRUE);
+               break;
+       }
+       if(!linphone_core_upnp_available(lc)) {
+               gtk_widget_hide(linphone_gtk_get_widget(pb,"use_upnp"));
        }
+
        mtu=linphone_core_get_mtu(lc);
        if (mtu<=0){
                gtk_widget_set_sensitive(linphone_gtk_get_widget(pb,"mtu"),FALSE);
@@ -802,14 +1117,9 @@ void linphone_gtk_show_parameters(void){
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"dtmf_sipinfo")),
                                        linphone_core_get_use_info_for_dtmf(lc));
        /* MUTIMEDIA CONFIG */
-       linphone_gtk_fill_combo_box(linphone_gtk_get_widget(pb,"playback_device"), sound_devices,
-                                       linphone_core_get_playback_device(lc),CAP_PLAYBACK);
-       linphone_gtk_fill_combo_box(linphone_gtk_get_widget(pb,"ring_device"), sound_devices,
-                                       linphone_core_get_ringer_device(lc),CAP_PLAYBACK);
-       linphone_gtk_fill_combo_box(linphone_gtk_get_widget(pb,"capture_device"), sound_devices,
-                                       linphone_core_get_capture_device(lc), CAP_CAPTURE);
-       linphone_gtk_fill_combo_box(linphone_gtk_get_widget(pb,"webcams"),linphone_core_get_video_devices(lc),
-                                       linphone_core_get_video_device(lc),CAP_IGNORE);
+       linphone_gtk_fill_soundcards(pb);
+       linphone_gtk_fill_webcams(pb);
+
        linphone_gtk_fill_video_sizes(linphone_gtk_get_widget(pb,"video_size"));
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"echo_cancelation")),
                                        linphone_core_echo_cancellation_enabled(lc));
@@ -836,7 +1146,9 @@ void linphone_gtk_show_parameters(void){
                                linphone_core_get_download_bandwidth(lc));
        gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb,"upload_bw")),
                                linphone_core_get_upload_bandwidth(lc));
-       
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb,"adaptive_rate_control")),
+                                linphone_core_adaptive_rate_control_enabled(lc));
+
 
        /* UI CONFIG */
        linphone_gtk_fill_langs(pb);
@@ -846,5 +1158,177 @@ void linphone_gtk_show_parameters(void){
                                ui_advanced);
        linphone_gtk_ui_level_adapt(pb);
 
+       g_signal_connect(G_OBJECT(linphone_gtk_get_widget(pb,"proto_port")),"value-changed",(GCallback)linphone_gtk_update_my_port,NULL);
+       g_signal_connect(G_OBJECT(linphone_gtk_get_widget(pb,"proto_combo")),"changed",(GCallback)linphone_gtk_proto_changed,NULL);
+
+
+       if (linphone_core_tunnel_available()){
+               gtk_widget_set_visible(GTK_WIDGET(linphone_gtk_get_widget(pb,"tunnel_edit_button")), TRUE);
+               gtk_widget_set_visible(GTK_WIDGET(linphone_gtk_get_widget(pb,"tunnel_label")), TRUE);
+       }
+
        gtk_widget_show(pb);
 }
+
+
+void linphone_gtk_fixed_audio_port_toggle(void) {
+       GtkWidget *mw = linphone_gtk_get_main_window();
+       GtkWidget *pb = (GtkWidget *) g_object_get_data(G_OBJECT(mw), "parameters");
+       gboolean fixed = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb, "fixed_audio_port")));
+       gint min_port = gtk_spin_button_get_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb, "audio_min_rtp_port")));
+       gint max_port = gtk_spin_button_get_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb, "audio_max_rtp_port")));
+       gtk_widget_set_sensitive(GTK_WIDGET(linphone_gtk_get_widget(pb, "audio_max_rtp_port")), !fixed);
+       if (fixed) {
+               linphone_core_set_audio_port(linphone_gtk_get_core(), min_port);
+       } else {
+               linphone_core_set_audio_port_range(linphone_gtk_get_core(), min_port, max_port);
+       }
+}
+
+
+void linphone_gtk_fixed_video_port_toggle(void) {
+       GtkWidget *mw = linphone_gtk_get_main_window();
+       GtkWidget *pb = (GtkWidget *) g_object_get_data(G_OBJECT(mw), "parameters");
+       gboolean fixed = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(pb, "fixed_video_port")));
+       gint min_port = gtk_spin_button_get_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb, "video_min_rtp_port")));
+       gint max_port = gtk_spin_button_get_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(pb, "video_max_rtp_port")));
+       gtk_widget_set_sensitive(GTK_WIDGET(linphone_gtk_get_widget(pb, "video_max_rtp_port")), !fixed);
+       if (fixed) {
+               linphone_core_set_video_port(linphone_gtk_get_core(), min_port);
+       } else {
+               linphone_core_set_video_port_range(linphone_gtk_get_core(), min_port, max_port);
+       }
+}
+
+
+void linphone_gtk_edit_tunnel_closed(GtkWidget *button){
+        GtkWidget *pb=gtk_widget_get_toplevel(button);
+        gtk_widget_destroy(pb);
+}
+
+void linphone_gtk_edit_tunnel(GtkButton *button){
+       GtkWidget *w=linphone_gtk_create_window("tunnel_config");
+       LinphoneCore *lc=linphone_gtk_get_core();
+       LinphoneTunnel *tunnel=linphone_core_get_tunnel(lc);
+       const MSList *configs;
+       const char *host = NULL;
+       int port=0;
+       
+       if (!tunnel) return;
+       
+       configs = linphone_tunnel_get_servers(tunnel);
+       if(configs != NULL) {
+               LinphoneTunnelConfig *ltc = (LinphoneTunnelConfig *)configs->data;
+               host = linphone_tunnel_config_get_host(ltc);
+               port = linphone_tunnel_config_get_port(ltc);
+       }
+
+       gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(w,"host")),host);
+       if (port==0) port=443;
+       gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(w,"port")), port);
+
+       if (linphone_tunnel_enabled(tunnel)){
+               gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(w,"radio_enable")),1);
+       } else{
+               gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(w,"radio_disable")),1);
+       }
+       {
+               const char *proxy=NULL,*username=NULL,*password=NULL;
+               port=0;
+               linphone_tunnel_get_http_proxy(tunnel,&proxy,&port,&username,&password);
+               if (proxy)
+                       gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(w,"http_host")),proxy);
+               if (port>0)
+                       gtk_spin_button_set_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(w,"http_port")), port);
+               if (username)
+                       gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(w,"username")),username);
+               if (password)
+                       gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(w,"password")),password);
+       }
+
+       g_object_weak_ref(G_OBJECT(w),(GWeakNotify)linphone_gtk_edit_tunnel_closed,w);
+       gtk_widget_show(w);
+}
+
+void linphone_gtk_tunnel_ok(GtkButton *button){
+       GtkWidget *w=gtk_widget_get_toplevel(GTK_WIDGET(button));
+       LinphoneCore *lc=linphone_gtk_get_core();
+       LinphoneTunnel *tunnel=linphone_core_get_tunnel(lc);
+       LinphoneTunnelConfig *config=linphone_tunnel_config_new();
+
+       gint port = (gint)gtk_spin_button_get_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(w,"port")));
+       gboolean enabled=gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(linphone_gtk_get_widget(w,"radio_enable")));
+       const char *host=gtk_entry_get_text(GTK_ENTRY(linphone_gtk_get_widget(w,"host")));
+       const char *http_host=gtk_entry_get_text(GTK_ENTRY(linphone_gtk_get_widget(w,"http_host")));
+       gint http_port = (gint)gtk_spin_button_get_value(GTK_SPIN_BUTTON(linphone_gtk_get_widget(w,"http_port")));
+       const char *username=gtk_entry_get_text(GTK_ENTRY(linphone_gtk_get_widget(w,"username")));
+       const char *password=gtk_entry_get_text(GTK_ENTRY(linphone_gtk_get_widget(w,"password")));
+       
+       if (tunnel==NULL) return;
+       if (host && *host=='\0') host=NULL;
+       if (http_port==0) http_port=8080;
+       linphone_tunnel_clean_servers(tunnel);
+       linphone_tunnel_config_set_host(config, host);
+       linphone_tunnel_config_set_port(config, port);
+       linphone_tunnel_add_server(tunnel, config);
+       linphone_tunnel_enable(tunnel,enabled);
+       linphone_tunnel_set_http_proxy(tunnel,http_host,http_port,username,password);
+       
+       gtk_widget_destroy(w);
+}
+
+
+void linphone_gtk_tunnel_cancel(GtkButton *button){
+
+}
+
+static void show_dscp(GtkWidget *entry, int val){
+       char tmp[20];
+       snprintf(tmp,sizeof(tmp),"0x%x",val);
+       gtk_entry_set_text(GTK_ENTRY(entry),tmp);
+       
+}
+
+static int read_dscp(GtkWidget *entry){
+       const char *val=gtk_entry_get_text(GTK_ENTRY(entry));
+       const char *begin;
+       int ret=0;
+       if (val==NULL || val[0]=='\0') return 0;
+       /*skip potential 0x*/
+       begin=strstr(val,"0x");
+       if (begin) begin+=2;
+       else begin=val;
+       if (sscanf(begin,"%x",&ret)==1)
+               return ret;
+       return -1;
+}
+
+void linphone_gtk_dscp_edit(){
+       LinphoneCore *lc=linphone_gtk_get_core();
+       GtkWidget *widget=linphone_gtk_create_window("dscp_settings");
+       show_dscp(linphone_gtk_get_widget(widget,"sip_dscp"),
+                 linphone_core_get_sip_dscp(lc));
+       show_dscp(linphone_gtk_get_widget(widget,"audio_dscp"),
+                 linphone_core_get_audio_dscp(lc));
+       show_dscp(linphone_gtk_get_widget(widget,"video_dscp"),
+                 linphone_core_get_video_dscp(lc));
+       gtk_widget_show(widget);
+}
+
+void linphone_gtk_dscp_edit_response(GtkWidget *dialog, guint response_id){
+       LinphoneCore *lc=linphone_gtk_get_core();
+       switch(response_id){
+               case GTK_RESPONSE_OK:
+                       linphone_core_set_sip_dscp(lc,
+                               read_dscp(linphone_gtk_get_widget(dialog,"sip_dscp")));
+                       linphone_core_set_audio_dscp(lc,
+                               read_dscp(linphone_gtk_get_widget(dialog,"audio_dscp")));
+                       linphone_core_set_video_dscp(lc,
+                               read_dscp(linphone_gtk_get_widget(dialog,"video_dscp")));
+                       
+               break;
+               default:
+               break;
+       }
+       gtk_widget_destroy(dialog);
+}