]> sjero.net Git - linphone/blobdiff - gtk/propertybox.c
Fix UI feedbacks :
[linphone] / gtk / propertybox.c
index 0e69550cd2d09e8fc272e745bd52ab19acfb83f1..f30b55d05e080e122be42a18f2366f419ff1d7a9 100644 (file)
@@ -18,7 +18,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
 
 #include "linphone.h"
-#include "linphone_tunnel_manager.h"
+#include "linphone_tunnel.h"
 
 typedef enum {
        CAP_IGNORE,
@@ -119,18 +119,25 @@ void linphone_gtk_update_my_port(GtkWidget *w){
        }
        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.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.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);
@@ -146,29 +153,109 @@ void linphone_gtk_ipv6_toggled(GtkWidget *w){
                                gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)));
 }
 
-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_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")));
+
+       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_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_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){
@@ -707,6 +794,8 @@ static LangCodes supported_langs[]={
        {       "zh_CN" ,       N_("Chinese")   },
        {       "zh_TW" ,       N_("Traditional Chinese")       },
        {       "nb_NO" ,       N_("Norwegian") },
+       {       "he"    ,       N_("Hebrew")    },
+       {       "sr"    ,       N_("Serbian")   },
        {       NULL    ,       NULL            }
 };
 
@@ -729,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";
@@ -753,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";
@@ -804,19 +903,35 @@ void linphone_gtk_ui_level_toggled(GtkWidget *w) {
        linphone_gtk_ui_level_adapt(top);
 }
 
+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)
+               if (strcasecmp(selected,"SRTP")==0){
                        linphone_core_set_media_encryption(lc,LinphoneMediaEncryptionSRTP);
-               else if (strcasecmp(selected,"ZRTP")==0)
+                       linphone_gtk_set_media_encryption_mandatory_sensitive(toplevel,TRUE);
+               }else if (strcasecmp(selected,"ZRTP")==0){
                        linphone_core_set_media_encryption(lc,LinphoneMediaEncryptionZRTP);
-               else linphone_core_set_media_encryption(lc,LinphoneMediaEncryptionNone);
+                       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");
@@ -852,61 +967,114 @@ static void linphone_gtk_show_media_encryption(GtkWidget *pb){
                /*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);
+                               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);
+                               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_show_parameters(void){
-       GtkWidget *pb=linphone_gtk_create_window("parameters");
+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);
 
-    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")),
+       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);
-    }
-    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")),
+       }
+       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")),
+       }
+       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);
-    }
+       }
 
-       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));
+       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);
        
@@ -925,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);
@@ -939,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));
@@ -989,7 +1162,7 @@ void linphone_gtk_show_parameters(void){
        g_signal_connect(G_OBJECT(linphone_gtk_get_widget(pb,"proto_combo")),"changed",(GCallback)linphone_gtk_proto_changed,NULL);
 
 
-       if (linphone_core_tunnel_available(lc)){
+       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);
        }
@@ -998,77 +1171,164 @@ void linphone_gtk_show_parameters(void){
 }
 
 
+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);
 }
 
-#ifdef TUNNEL_ENABLED
-static void tunnel_get_server_host_and_port(LinphoneTunnel *tunnel, char *host, int size, int *port){
-       char *colon;
-        char *addresses=(char*)ms_strdup(linphone_tunnel_get_server_addresses(tunnel));
-       char *str1=addresses;
-        char *address=strtok(str1," "); // Not thread safe
-        if (!address) return;
-        colon=strchr(address, ':');
-        if (!colon) return;
-        *colon++='\0';
-       *port=atoi(colon);
-       memcpy(host,address,size);
-        ms_free(addresses);
-}
-#endif
-
 void linphone_gtk_edit_tunnel(GtkButton *button){
-#ifdef TUNNEL_ENABLED
-       LinphoneCore *lc=linphone_gtk_get_core();
        GtkWidget *w=linphone_gtk_create_window("tunnel_config");
-       LinphoneTunnel *tunnel=linphone_tunnel_get(lc);
-       char host[50]={'\0'};
+       LinphoneCore *lc=linphone_gtk_get_core();
+       LinphoneTunnel *tunnel=linphone_core_get_tunnel(lc);
+       const MSList *configs;
+       const char *host = NULL;
        int port=0;
-       tunnel_get_server_host_and_port(tunnel, host, sizeof(host), &port);
-       LinphoneTunnelState state=linphone_tunnel_get_state(tunnel);
+       
+       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 (state == LinphoneTunnelEnabled){
+       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);
-#endif
+       gtk_widget_show(w);
 }
 
 void linphone_gtk_tunnel_ok(GtkButton *button){
-#ifdef TUNNEL_ENABLED
-       // Save information to config file
-       LinphoneCore *lc=linphone_gtk_get_core();
        GtkWidget *w=gtk_widget_get_toplevel(GTK_WIDGET(button));
-       char address[50]={'\0'};
-       LinphoneTunnel *tunnel=linphone_tunnel_get(lc);
+       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")));
-
-       snprintf(address, sizeof address, "%s:%i", host, port);
-       linphone_tunnel_set_server_addresses(tunnel, address);
-       if (enabled){
-               linphone_tunnel_set_state(tunnel, LinphoneTunnelEnabled);
-       } else{
-               linphone_tunnel_set_state(tunnel,LinphoneTunnelDisabled);
-       }
-       linphone_core_update_tunnel(lc);
+       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);
-#endif
 }
 
 
 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);
+}