]> git.0d.be Git - empathy.git/blob - libempathy-gtk/empathy-account-widget-sip.c
b76078d5cb4b3b42073bb9b160e70dad70450f57
[empathy.git] / libempathy-gtk / empathy-account-widget-sip.c
1 /*
2  * Copyright (C) 2007-2008 Guillaume Desmottes
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17  *
18  * Authors: Guillaume Desmottes <gdesmott@gnome.org>
19  *          Frederic Peters <fpeters@0d.be>
20  */
21
22 #include "config.h"
23 #include "empathy-account-widget-sip.h"
24
25 #include <glib/gi18n-lib.h>
26
27 #include "empathy-account-widget-private.h"
28 #include "empathy-ui-utils.h"
29
30 typedef struct {
31   EmpathyAccountWidget *self;
32   GtkWidget *vbox_settings;
33
34   GtkWidget *label_stun_server;
35   GtkWidget *entry_stun_server;
36   GtkWidget *label_stun_port;
37   GtkWidget *spinbutton_stun_port;
38   GtkWidget *checkbutton_discover_stun;
39   GtkWidget *combobox_transport;
40   GtkWidget *combobox_keep_alive_mechanism;
41   GtkWidget *spinbutton_keepalive_interval;
42 } EmpathyAccountWidgetSip;
43
44 static void
45 account_widget_sip_destroy_cb (GtkWidget *widget,
46                                EmpathyAccountWidgetSip *settings)
47 {
48   g_slice_free (EmpathyAccountWidgetSip, settings);
49 }
50
51 static void
52 account_widget_sip_discover_stun_toggled_cb (
53     GtkWidget *checkbox,
54     EmpathyAccountWidgetSip *settings)
55 {
56   gboolean active;
57
58   active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbox));
59   gtk_widget_set_sensitive (settings->label_stun_server, !active);
60   gtk_widget_set_sensitive (settings->entry_stun_server, !active);
61   gtk_widget_set_sensitive (settings->label_stun_port, !active);
62   gtk_widget_set_sensitive (settings->spinbutton_stun_port, !active);
63 }
64
65 static void
66 keep_alive_mechanism_combobox_change_cb (GtkWidget *widget,
67     EmpathyAccountWidgetSip *self)
68 {
69   GtkTreeIter iter;
70   GtkTreeModel *model;
71   gchar *mechanism;
72   gboolean enabled;
73
74   /* Unsensitive the keep-alive spin button if keep-alive is disabled */
75   if (!gtk_combo_box_get_active_iter (GTK_COMBO_BOX (widget), &iter))
76     return;
77
78   model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget));
79   gtk_tree_model_get (model, &iter, 0, &mechanism, -1);
80
81   enabled = tp_strdiff (mechanism, "none");
82
83   gtk_widget_set_sensitive (self->spinbutton_keepalive_interval, enabled);
84   g_free (mechanism);
85 }
86
87 static void
88 checkbutton_tel_toggled (
89     GtkWidget *checkbox,
90     EmpathyAccountWidgetSip *sip_settings)
91 {
92   EmpathyAccountSettings *settings;
93
94   settings = empathy_account_widget_get_settings (sip_settings->self);
95
96   empathy_account_settings_set_uri_scheme_tel (settings,
97       gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbox)));
98
99   empathy_account_widget_changed (sip_settings->self);
100 }
101
102 GtkWidget *
103 empathy_account_widget_sip_build (EmpathyAccountWidget *self,
104     const char *filename,
105     GtkWidget **grid_common_settings)
106 {
107   EmpathyAccountWidgetSip *settings;
108   GtkWidget *vbox_settings;
109   gboolean is_simple;
110   GtkWidget *grid_advanced;
111
112   g_object_get (self, "simple", &is_simple, NULL);
113
114   if (is_simple)
115     {
116       self->ui_details->gui = empathy_builder_get_resource (filename,
117           "vbox_sip_simple", &vbox_settings,
118           NULL);
119
120       empathy_account_widget_handle_params (self,
121           "entry_userid_simple", "account",
122           "entry_password_simple", "password",
123           NULL);
124
125       self->ui_details->default_focus = g_strdup ("entry_userid_simple");
126     }
127   else
128     {
129       GtkListStore *store;
130       GtkCellRenderer *renderer;
131       GtkToggleButton *checkbutton_tel;
132
133       settings = g_slice_new0 (EmpathyAccountWidgetSip);
134       settings->self = self;
135
136       self->ui_details->gui = empathy_builder_get_resource (filename,
137           "grid_common_settings", grid_common_settings,
138           "grid_advanced_sip_settings", &grid_advanced,
139           "vbox_sip_settings", &vbox_settings,
140           "label_stun-server", &settings->label_stun_server,
141           "entry_stun-server", &settings->entry_stun_server,
142           "label_stun-port", &settings->label_stun_port,
143           "spinbutton_stun-port", &settings->spinbutton_stun_port,
144           "checkbutton_discover-stun", &settings->checkbutton_discover_stun,
145           "spinbutton_keepalive-interval",
146             &settings->spinbutton_keepalive_interval,
147           "checkbutton_tel", &checkbutton_tel,
148           NULL);
149       settings->vbox_settings = vbox_settings;
150
151       gtk_toggle_button_set_active (checkbutton_tel,
152           empathy_account_settings_has_uri_scheme_tel (
153             empathy_account_widget_get_settings (self)));
154
155       empathy_account_widget_handle_params (self,
156           "entry_userid", "account",
157           "entry_password", "password",
158           "checkbutton_discover-stun", "discover-stun",
159           "entry_stun-server", "stun-server",
160           "spinbutton_stun-port", "stun-port",
161           "entry_auth-user", "auth-user",
162           "entry_proxy-host", "proxy-host",
163           "spinbutton_port", "port",
164           "checkbutton_loose-routing", "loose-routing",
165           "checkbutton_discover-binding", "discover-binding",
166           "spinbutton_keepalive-interval", "keepalive-interval",
167           "checkbutton_ignore-tls-errors", "ignore-tls-errors",
168           "entry_local-ip-address", "local-ip-address",
169           "spinbutton_local-port", "local-port",
170           NULL);
171
172       account_widget_sip_discover_stun_toggled_cb (
173           settings->checkbutton_discover_stun,
174           settings);
175
176       empathy_builder_connect (self->ui_details->gui, settings,
177           "vbox_sip_settings", "destroy", account_widget_sip_destroy_cb,
178           "checkbutton_discover-stun", "toggled",
179           account_widget_sip_discover_stun_toggled_cb,
180           "checkbutton_tel", "toggled", checkbutton_tel_toggled,
181           NULL);
182
183       self->ui_details->default_focus = g_strdup ("entry_userid");
184
185       /* Create the 'transport' combo box. The first column has to contain the
186        * value of the param. */
187       store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
188       settings->combobox_transport = gtk_combo_box_new_with_model (
189           GTK_TREE_MODEL (store));
190
191       renderer = gtk_cell_renderer_text_new ();
192       gtk_cell_layout_pack_start (
193           GTK_CELL_LAYOUT (settings->combobox_transport), renderer, TRUE);
194       gtk_cell_layout_add_attribute (
195           GTK_CELL_LAYOUT (settings->combobox_transport), renderer, "text", 1);
196
197       gtk_list_store_insert_with_values (store, NULL, -1,
198           0, "auto", 1, _("Auto"), -1);
199
200       gtk_list_store_insert_with_values (store, NULL, -1,
201           0, "udp", 1, _("UDP"), -1);
202
203       gtk_list_store_insert_with_values (store, NULL, -1,
204           0, "tcp", 1, _("TCP"), -1);
205
206       gtk_list_store_insert_with_values (store, NULL, -1,
207           0, "tls", 1, _("TLS"), -1);
208
209       empathy_account_widget_setup_widget (self, settings->combobox_transport,
210           "transport");
211
212       gtk_grid_attach (GTK_GRID (grid_advanced), settings->combobox_transport,
213           1, 11, 3, 1);
214
215       gtk_widget_show (settings->combobox_transport);
216
217       /* Create the 'keep-alive mechanism' combo box */
218       store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
219       settings->combobox_keep_alive_mechanism = gtk_combo_box_new_with_model (
220           GTK_TREE_MODEL (store));
221
222       renderer = gtk_cell_renderer_text_new ();
223       gtk_cell_layout_pack_start (
224           GTK_CELL_LAYOUT (settings->combobox_keep_alive_mechanism), renderer,
225           TRUE);
226       gtk_cell_layout_add_attribute (
227           GTK_CELL_LAYOUT (settings->combobox_keep_alive_mechanism), renderer,
228           "text", 1);
229
230       gtk_list_store_insert_with_values (store, NULL, -1,
231           0, "auto", 1, _("Auto"), -1);
232
233       /* translators: this string is very specific to SIP's internal; maybe
234        * best to keep the English version. */
235       gtk_list_store_insert_with_values (store, NULL, -1,
236           0, "register", 1, _("Register"), -1);
237
238       /* translators: this string is very specific to SIP's internal; maybe
239        * best to keep the English version. */
240       gtk_list_store_insert_with_values (store, NULL, -1,
241           0, "options", 1, _("Options"), -1);
242
243       gtk_list_store_insert_with_values (store, NULL, -1,
244           0, "none", 1, _("None"), -1);
245
246       g_signal_connect (settings->combobox_keep_alive_mechanism, "changed",
247           G_CALLBACK (keep_alive_mechanism_combobox_change_cb), settings);
248
249       empathy_account_widget_setup_widget (self,
250           settings->combobox_keep_alive_mechanism, "keepalive-mechanism");
251
252       gtk_grid_attach (GTK_GRID (grid_advanced),
253           settings->combobox_keep_alive_mechanism,
254           1, 7, 3, 1);
255
256       gtk_widget_show (settings->combobox_keep_alive_mechanism);
257     }
258
259   return vbox_settings;
260 }