blob: f24c23350ebe758cb85d929ce02bd68d2009c427 [file] [log] [blame]
Stepan Salenikovich61cbab02015-03-16 18:35:10 -04001/*
2 * Copyright (C) 2015 Savoir-Faire Linux Inc.
3 * Author: Stepan Salenikovich <stepan.salenikovich@savoirfairelinux.com>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Additional permission under GNU GPL version 3 section 7:
20 *
21 * If you modify this program, or any covered work, by linking or
22 * combining it with the OpenSSL project's OpenSSL library (or a
23 * modified version of that library), containing parts covered by the
24 * terms of the OpenSSL or SSLeay licenses, Savoir-Faire Linux Inc.
25 * grants you additional permission to convey the resulting work.
26 * Corresponding Source for a non-source form of such a combination
27 * shall include the source code for the parts of OpenSSL used as well
28 * as that of the covered work.
29 */
30
31#include "accountgeneraltab.h"
32
33#include <gtk/gtk.h>
34#include <account.h>
35
36struct _AccountGeneralTab
37{
38 GtkBox parent;
39};
40
41struct _AccountGeneralTabClass
42{
43 GtkBoxClass parent_class;
44};
45
46typedef struct _AccountGeneralTabPrivate AccountGeneralTabPrivate;
47
48struct _AccountGeneralTabPrivate
49{
50 Account *account;
51 GtkWidget *grid_account;
52 GtkWidget *grid_parameters;
53};
54
55G_DEFINE_TYPE_WITH_PRIVATE(AccountGeneralTab, account_general_tab, GTK_TYPE_BOX);
56
57#define ACCOUNT_GENERAL_TAB_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), ACCOUNT_GENERAL_TAB_TYPE, AccountGeneralTabPrivate))
58
59static void
60account_general_tab_dispose(GObject *object)
61{
62 G_OBJECT_CLASS(account_general_tab_parent_class)->dispose(object);
63}
64
65static void
66account_general_tab_init(AccountGeneralTab *view)
67{
68 gtk_widget_init_template(GTK_WIDGET(view));
69}
70
71static void
72account_general_tab_class_init(AccountGeneralTabClass *klass)
73{
74 G_OBJECT_CLASS(klass)->dispose = account_general_tab_dispose;
75
76 gtk_widget_class_set_template_from_resource(GTK_WIDGET_CLASS (klass),
77 "/cx/ring/RingGnome/accountgeneraltab.ui");
78
79 gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), AccountGeneralTab, grid_account);
80 gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), AccountGeneralTab, grid_parameters);
81}
82
83static void
84account_alias_changed(GtkEditable *entry, AccountGeneralTab *view)
85{
86 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
87 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
88 priv->account->setAlias(QString(gtk_editable_get_chars(entry, 0, -1)));
89}
90
91static void
92account_hostname_changed(GtkEditable *entry, AccountGeneralTab *view)
93{
94 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
95 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
96 priv->account->setHostname(QString(gtk_editable_get_chars(entry, 0, -1)));
97}
98
99static void
100account_username_changed(GtkEditable *entry, AccountGeneralTab *view)
101{
102 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
103 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
104 priv->account->setUsername(QString(gtk_editable_get_chars(entry, 0, -1)));
105}
106
107static void
108account_password_changed(GtkEditable *entry, AccountGeneralTab *view)
109{
110 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
111 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
112 priv->account->setPassword(QString(gtk_editable_get_chars(entry, 0, -1)));
113}
114
115static void
116show_password(GtkToggleButton *checkbutton, GtkEntry *entry)
117{
118 gtk_entry_set_visibility(GTK_ENTRY(entry), gtk_toggle_button_get_active(checkbutton));
119}
120
121static void
122account_proxy_changed(GtkEditable *entry, AccountGeneralTab *view)
123{
124 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
125 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
126 priv->account->setProxy(QString(gtk_editable_get_chars(entry, 0, -1)));
127}
128
129static void
130account_mailbox_changed(GtkEditable *entry, AccountGeneralTab *view)
131{
132 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
133 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
134 priv->account->setMailbox(QString(gtk_editable_get_chars(entry, 0, -1)));
135}
136
137static void
138auto_answer(GtkToggleButton *checkbutton, AccountGeneralTab *view)
139{
140 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
141 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
142 priv->account->setAutoAnswer(gtk_toggle_button_get_active(checkbutton));
143}
144
145static void
146upnp_enabled(GtkToggleButton *checkbutton, AccountGeneralTab *view)
147{
148 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
149 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
150 priv->account->setUpnpEnabled(gtk_toggle_button_get_active(checkbutton));
151}
152
153
154static void
155build_tab_view(AccountGeneralTab *view)
156{
157 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
158 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
159
160 int grid_row = 0;
161 GtkWidget *label = NULL;
162 GtkWidget *entry = NULL;
163 GtkWidget *checkbutton = NULL;
164
165 /* build account grid */
166
167 /* check if its ip2ip account */
168 const QByteArray& alias = priv->account->alias().toLocal8Bit();
169
170 if (strcmp(alias.constData(), "IP2IP") == 0) {
171 label = gtk_label_new("IP2IP");
172 gtk_widget_set_halign(label, GTK_ALIGN_START);
173 gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1);
174 ++grid_row;
175 } else {
176 /* account alias */
177 label = gtk_label_new("Alias");
178 gtk_widget_set_halign(label, GTK_ALIGN_START);
179 gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1);
180 entry = gtk_entry_new();
181 gtk_entry_set_text(GTK_ENTRY(entry), alias.constData());
182 gtk_widget_set_halign(entry, GTK_ALIGN_START);
183 g_signal_connect(entry, "changed", G_CALLBACK(account_alias_changed), view);
184 gtk_grid_attach(GTK_GRID(priv->grid_account), entry, 1, grid_row, 1, 1);
185 ++grid_row;
186
187 /* account type */
188 label = gtk_label_new("Type");
189 gtk_widget_set_halign(label, GTK_ALIGN_START);
190 gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1);
191
192 label = gtk_label_new("");
193 gtk_widget_set_halign(label, GTK_ALIGN_START);
194 switch (priv->account->protocol()) {
195 case Account::Protocol::SIP:
196 gtk_label_set_text(GTK_LABEL(label), "SIP");
197 break;
198 case Account::Protocol::IAX:
199 gtk_label_set_text(GTK_LABEL(label), "IAX");
200 break;
201 case Account::Protocol::RING:
202 gtk_label_set_text(GTK_LABEL(label), "RING");
203 break;
204 case Account::Protocol::COUNT__:
205 break;
206 }
207
208 gtk_grid_attach(GTK_GRID(priv->grid_account), label, 1, grid_row, 1, 1);
209 ++grid_row;
210 }
211
212 if (priv->account->protocol() == Account::Protocol::RING) {
213 label = gtk_label_new("Hash");
214 gtk_widget_set_halign(label, GTK_ALIGN_START);
215 gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1);
216 entry = gtk_entry_new();
217 gtk_entry_set_text(GTK_ENTRY(entry), priv->account->username().toLocal8Bit().constData());
218 g_object_set(G_OBJECT(entry), "editable", FALSE, NULL);
219 g_object_set(G_OBJECT(entry), "max-width-chars", 50, NULL);
220 gtk_widget_override_font(entry, pango_font_description_from_string("monospace"));
221 gtk_entry_set_alignment(GTK_ENTRY(entry), 0.5);
222 gtk_grid_attach(GTK_GRID(priv->grid_account), entry, 1, grid_row, 1, 1);
223 ++grid_row;
224 }
225
226 gtk_widget_show_all(priv->grid_account);
227
228 /* build parameters grid */
229 grid_row = 0;
230 if (strcmp(alias.constData(), "IP2IP") != 0) {
231 if (priv->account->protocol() != Account::Protocol::RING) {
232 /* SIP and IAX have the same params */
233
234 /* host name */
235 label = gtk_label_new("Host name");
236 gtk_widget_set_halign(label, GTK_ALIGN_START);
237 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
238 entry = gtk_entry_new();
239 gtk_entry_set_text(GTK_ENTRY(entry), priv->account->hostname().toLocal8Bit().constData());
240 g_signal_connect(entry, "changed", G_CALLBACK(account_hostname_changed), view);
241 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry, 1, grid_row, 1, 1);
242 ++grid_row;
243
244 /* user name */
245 label = gtk_label_new("User name");
246 gtk_widget_set_halign(label, GTK_ALIGN_START);
247 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
248 entry = gtk_entry_new();
249 gtk_entry_set_text(GTK_ENTRY(entry), priv->account->username().toLocal8Bit().constData());
250 g_signal_connect(entry, "changed", G_CALLBACK(account_username_changed), view);
251 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry, 1, grid_row, 1, 1);
252 ++grid_row;
253
254 /* password */
255 label = gtk_label_new("Password");
256 gtk_widget_set_halign(label, GTK_ALIGN_START);
257 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
258 entry = gtk_entry_new();
259 gtk_entry_set_input_purpose(GTK_ENTRY(entry), GTK_INPUT_PURPOSE_PASSWORD);
260 gtk_entry_set_icon_from_icon_name(GTK_ENTRY(entry), GTK_ENTRY_ICON_PRIMARY, "dialog-password");
261 gtk_entry_set_visibility(GTK_ENTRY(entry), FALSE);
262 gtk_entry_set_text(GTK_ENTRY(entry), priv->account->username().toLocal8Bit().constData());
263 g_signal_connect(entry, "changed", G_CALLBACK(account_password_changed), view);
264 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry, 1, grid_row, 1, 1);
265 ++grid_row;
266
267 /* show password */
268 checkbutton = gtk_check_button_new_with_label("Show password");
269 gtk_grid_attach(GTK_GRID(priv->grid_parameters), checkbutton, 1, grid_row, 1, 1);
270 g_signal_connect(checkbutton, "toggled", G_CALLBACK(show_password), entry);
271 ++grid_row;
272
273 /* proxy */
274 label = gtk_label_new("Proxy");
275 gtk_widget_set_halign(label, GTK_ALIGN_START);
276 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
277 entry = gtk_entry_new();
278 gtk_entry_set_text(GTK_ENTRY(entry), priv->account->proxy().toLocal8Bit().constData());
279 g_signal_connect(entry, "changed", G_CALLBACK(account_proxy_changed), view);
280 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry, 1, grid_row, 1, 1);
281 ++grid_row;
282
283 /* voicemail number */
284 label = gtk_label_new("Voicemail number");
285 gtk_widget_set_halign(label, GTK_ALIGN_START);
286 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
287 entry = gtk_entry_new();
288 gtk_entry_set_text(GTK_ENTRY(entry), priv->account->mailbox().toLocal8Bit().constData());
289 g_signal_connect(entry, "changed", G_CALLBACK(account_mailbox_changed), view);
290 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry, 1, grid_row, 1, 1);
291 ++grid_row;
292 } else {
293 /* RING accoutn */
294
295 /* bootstrap */
296 label = gtk_label_new("Bootstrap");
297 gtk_widget_set_halign(label, GTK_ALIGN_START);
298 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
299 entry = gtk_entry_new();
300 gtk_entry_set_text(GTK_ENTRY(entry), priv->account->hostname().toLocal8Bit().constData());
301 g_signal_connect(entry, "changed", G_CALLBACK(account_hostname_changed), view);
302 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry, 1, grid_row, 1, 1);
303 ++grid_row;
304 }
305 }
306
307 /* auto answer */
308 checkbutton = gtk_check_button_new_with_label("Auto-answer calls");
309 gtk_widget_set_halign(checkbutton, GTK_ALIGN_START);
310 gtk_grid_attach(GTK_GRID(priv->grid_parameters), checkbutton, 0, grid_row, 1, 1);
311 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), priv->account->isAutoAnswer());
312 g_signal_connect(checkbutton, "toggled", G_CALLBACK(auto_answer), view);
313 ++grid_row;
314
315 /* upnp */
316 checkbutton = gtk_check_button_new_with_label("UPnP enabled");
317 gtk_widget_set_halign(checkbutton, GTK_ALIGN_START);
318 gtk_grid_attach(GTK_GRID(priv->grid_parameters), checkbutton, 0, grid_row, 1, 1);
319 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton), priv->account->isUpnpEnabled());
320 g_signal_connect(checkbutton, "toggled", G_CALLBACK(upnp_enabled), view);
321 ++grid_row;
322
323 gtk_widget_show_all(priv->grid_parameters);
324
325}
326
327GtkWidget *
328account_general_tab_new(Account *account)
329{
330 g_return_val_if_fail(account != NULL, NULL);
331
332 gpointer view = g_object_new(ACCOUNT_GENERAL_TAB_TYPE, NULL);
333
334 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
335 priv->account = account;
336
337 build_tab_view(ACCOUNT_GENERAL_TAB(view));
338
339 return (GtkWidget *)view;
340}