*/
#include "linphone.h"
+#include "linphone_tunnel.h"
typedef enum {
CAP_IGNORE,
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);
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);
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){
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;
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;
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);
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));
}
if (pt==ref){
gtk_tree_selection_select_iter(selection,&iter);
}
-
+
}while(gtk_tree_model_iter_next(model,&iter));
}
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);
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);
}
}
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 ();
"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);
{ "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 }
};
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";
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++;
}
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";
}
}
+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");
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);
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);
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));
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);
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);
+}