]> sjero.net Git - linphone/blobdiff - gtk/propertybox.c
Merge remote-tracking branch 'private/srtp'
[linphone] / gtk / propertybox.c
index 625fd8293a035f94303364e350d7f6922cfe8f87..aece58048600ea0cc3e0cd5cc3ef525df797dae5 100644 (file)
@@ -33,7 +33,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 +87,49 @@ 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_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,24 +145,6 @@ 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();
-
-       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);
-}
-
-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_audio_port_changed(GtkWidget *w){
        linphone_core_set_audio_port(linphone_gtk_get_core(),
                        (gint)gtk_spin_button_get_value(GTK_SPIN_BUTTON(w)));
@@ -329,7 +354,7 @@ 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; 
+               gfloat bitrate;
                const gchar *color;
                const char *params="";
 
@@ -355,9 +380,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);
@@ -374,10 +399,10 @@ 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;
-               
+
                gfloat bitrate;
                gtk_tree_model_get(model,&iter,CODEC_PRIVDATA,&pt,-1);
-               
+
                bitrate=payload_type_get_bitrate(pt)/1000.0;
                gtk_list_store_set(GTK_LIST_STORE(model),&iter,CODEC_COLOR, (gpointer)get_codec_color(linphone_gtk_get_core(),pt),
                                        CODEC_BITRATE, bitrate,-1);
@@ -397,7 +422,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));
 }
 
@@ -428,6 +453,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);
@@ -516,7 +546,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 ();
@@ -525,7 +555,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);
@@ -712,7 +742,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++;
        }
@@ -743,6 +773,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");
@@ -765,6 +803,56 @@ void linphone_gtk_ui_level_toggled(GtkWidget *w) {
        linphone_gtk_ui_level_adapt(top);
 }
 
+static void linphone_gtk_media_encryption_changed(GtkWidget *combo){
+       const char *selected=gtk_combo_box_get_active_text(GTK_COMBO_BOX(combo));
+       LinphoneCore *lc=linphone_gtk_get_core();
+       if (selected!=NULL){
+               if (strcasecmp(selected,"SRTP")==0)
+                       linphone_core_set_media_encryption(lc,LinphoneMediaEncryptionSRTP);
+               else if (strcasecmp(selected,"ZRTP")==0)
+                       linphone_core_set_media_encryption(lc,LinphoneMediaEncryptionZRTP);
+               else linphone_core_set_media_encryption(lc,LinphoneMediaEncryptionNone);
+       }else g_warning("gtk_combo_box_get_active_text() returned NULL");
+}
+
+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;
+
+       if (linphone_core_media_encryption_supported(lc,LinphoneMediaEncryptionSRTP)){
+               gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo),_("SRTP"));
+               srtp_id=1;
+               no_enc=FALSE;
+       }
+       if (linphone_core_media_encryption_supported(lc,LinphoneMediaEncryptionZRTP)){
+               gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo),_("ZRTP"));
+               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"));
+       }else{
+               LinphoneMediaEncryption menc=linphone_core_get_media_encryption(lc);
+               switch(menc){
+                       case LinphoneMediaEncryptionNone:
+                               gtk_combo_box_set_active(GTK_COMBO_BOX(combo),0);
+                       break;
+                       case LinphoneMediaEncryptionSRTP:
+                               if (srtp_id!=-1) gtk_combo_box_set_active(GTK_COMBO_BOX(combo),srtp_id);
+                       break;
+                       case LinphoneMediaEncryptionZRTP:
+                               if (zrtp_id!=-1) gtk_combo_box_set_active(GTK_COMBO_BOX(combo),zrtp_id);
+                       break;
+               }
+               g_signal_connect(G_OBJECT(combo),"changed",(GCallback)linphone_gtk_media_encryption_changed,NULL);
+       }
+}
+
 void linphone_gtk_show_parameters(void){
        GtkWidget *pb=linphone_gtk_create_window("parameters");
        LinphoneCore *lc=linphone_gtk_get_core();
@@ -781,14 +869,30 @@ void linphone_gtk_show_parameters(void){
        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);
+    }
+    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);
+    }
+
        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_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);
@@ -852,7 +956,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);
@@ -862,5 +968,7 @@ 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);
        gtk_widget_show(pb);
 }