blob: 59970aa42c326d160b0d6dbcc9a946a60b998628 [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;
Stepan Salenikovichbd029582015-03-24 11:00:56 -040053
54 QMetaObject::Connection account_updated;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -040055};
56
57G_DEFINE_TYPE_WITH_PRIVATE(AccountGeneralTab, account_general_tab, GTK_TYPE_BOX);
58
59#define ACCOUNT_GENERAL_TAB_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), ACCOUNT_GENERAL_TAB_TYPE, AccountGeneralTabPrivate))
60
61static void
62account_general_tab_dispose(GObject *object)
63{
Stepan Salenikovichbd029582015-03-24 11:00:56 -040064 AccountGeneralTab *view = ACCOUNT_GENERAL_TAB(object);
65 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
66
67 QObject::disconnect(priv->account_updated);
68
Stepan Salenikovich61cbab02015-03-16 18:35:10 -040069 G_OBJECT_CLASS(account_general_tab_parent_class)->dispose(object);
70}
71
72static void
73account_general_tab_init(AccountGeneralTab *view)
74{
75 gtk_widget_init_template(GTK_WIDGET(view));
76}
77
78static void
79account_general_tab_class_init(AccountGeneralTabClass *klass)
80{
81 G_OBJECT_CLASS(klass)->dispose = account_general_tab_dispose;
82
83 gtk_widget_class_set_template_from_resource(GTK_WIDGET_CLASS (klass),
84 "/cx/ring/RingGnome/accountgeneraltab.ui");
85
86 gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), AccountGeneralTab, grid_account);
87 gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), AccountGeneralTab, grid_parameters);
88}
89
90static void
91account_alias_changed(GtkEditable *entry, AccountGeneralTab *view)
92{
93 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
94 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
95 priv->account->setAlias(QString(gtk_editable_get_chars(entry, 0, -1)));
96}
97
98static void
99account_hostname_changed(GtkEditable *entry, AccountGeneralTab *view)
100{
101 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
102 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
103 priv->account->setHostname(QString(gtk_editable_get_chars(entry, 0, -1)));
104}
105
106static void
107account_username_changed(GtkEditable *entry, AccountGeneralTab *view)
108{
109 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
110 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
111 priv->account->setUsername(QString(gtk_editable_get_chars(entry, 0, -1)));
112}
113
114static void
115account_password_changed(GtkEditable *entry, AccountGeneralTab *view)
116{
117 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
118 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
119 priv->account->setPassword(QString(gtk_editable_get_chars(entry, 0, -1)));
120}
121
122static void
123show_password(GtkToggleButton *checkbutton, GtkEntry *entry)
124{
125 gtk_entry_set_visibility(GTK_ENTRY(entry), gtk_toggle_button_get_active(checkbutton));
126}
127
128static void
129account_proxy_changed(GtkEditable *entry, AccountGeneralTab *view)
130{
131 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
132 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
133 priv->account->setProxy(QString(gtk_editable_get_chars(entry, 0, -1)));
134}
135
136static void
137account_mailbox_changed(GtkEditable *entry, AccountGeneralTab *view)
138{
139 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
140 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
141 priv->account->setMailbox(QString(gtk_editable_get_chars(entry, 0, -1)));
142}
143
144static void
145auto_answer(GtkToggleButton *checkbutton, AccountGeneralTab *view)
146{
147 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
148 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
149 priv->account->setAutoAnswer(gtk_toggle_button_get_active(checkbutton));
150}
151
152static void
153upnp_enabled(GtkToggleButton *checkbutton, AccountGeneralTab *view)
154{
155 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
156 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
157 priv->account->setUpnpEnabled(gtk_toggle_button_get_active(checkbutton));
158}
159
160
161static void
162build_tab_view(AccountGeneralTab *view)
163{
164 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
165 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
166
167 int grid_row = 0;
168 GtkWidget *label = NULL;
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400169
170 /* separate pointers for each so that we reference them in the account changed callback */
171 GtkWidget *entry_alias = NULL;
172 GtkWidget *entry_username = NULL;
173 GtkWidget *entry_hostname = NULL;
174 GtkWidget *entry_password = NULL;
175 GtkWidget *entry_proxy = NULL;
176 GtkWidget *entry_voicemail = NULL;
177 GtkWidget *checkbutton_autoanswer = NULL;
178 GtkWidget *checkbutton_upnp = NULL;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400179
180 /* build account grid */
181
182 /* check if its ip2ip account */
183 const QByteArray& alias = priv->account->alias().toLocal8Bit();
184
185 if (strcmp(alias.constData(), "IP2IP") == 0) {
186 label = gtk_label_new("IP2IP");
187 gtk_widget_set_halign(label, GTK_ALIGN_START);
188 gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1);
189 ++grid_row;
190 } else {
191 /* account alias */
192 label = gtk_label_new("Alias");
193 gtk_widget_set_halign(label, GTK_ALIGN_START);
194 gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1);
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400195 entry_alias = gtk_entry_new();
196 gtk_entry_set_text(GTK_ENTRY(entry_alias), alias.constData());
197 gtk_widget_set_halign(entry_alias, GTK_ALIGN_START);
198 g_signal_connect(entry_alias, "changed", G_CALLBACK(account_alias_changed), view);
199 gtk_grid_attach(GTK_GRID(priv->grid_account), entry_alias, 1, grid_row, 1, 1);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400200 ++grid_row;
201
202 /* account type */
203 label = gtk_label_new("Type");
204 gtk_widget_set_halign(label, GTK_ALIGN_START);
205 gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1);
206
207 label = gtk_label_new("");
208 gtk_widget_set_halign(label, GTK_ALIGN_START);
209 switch (priv->account->protocol()) {
210 case Account::Protocol::SIP:
211 gtk_label_set_text(GTK_LABEL(label), "SIP");
212 break;
213 case Account::Protocol::IAX:
214 gtk_label_set_text(GTK_LABEL(label), "IAX");
215 break;
216 case Account::Protocol::RING:
217 gtk_label_set_text(GTK_LABEL(label), "RING");
218 break;
219 case Account::Protocol::COUNT__:
220 break;
221 }
222
223 gtk_grid_attach(GTK_GRID(priv->grid_account), label, 1, grid_row, 1, 1);
224 ++grid_row;
225 }
226
227 if (priv->account->protocol() == Account::Protocol::RING) {
228 label = gtk_label_new("Hash");
229 gtk_widget_set_halign(label, GTK_ALIGN_START);
230 gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1);
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400231 entry_username = gtk_entry_new();
232 gtk_entry_set_placeholder_text(GTK_ENTRY(entry_username), "auto-generating...");
233 gtk_entry_set_text(GTK_ENTRY(entry_username), priv->account->username().toLocal8Bit().constData());
234 g_object_set(G_OBJECT(entry_username), "editable", FALSE, NULL);
235 g_object_set(G_OBJECT(entry_username), "max-width-chars", 50, NULL);
236 gtk_widget_override_font(entry_username, pango_font_description_from_string("monospace"));
237 gtk_entry_set_alignment(GTK_ENTRY(entry_username), 0.5);
238 gtk_grid_attach(GTK_GRID(priv->grid_account), entry_username, 1, grid_row, 1, 1);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400239 ++grid_row;
240 }
241
242 gtk_widget_show_all(priv->grid_account);
243
244 /* build parameters grid */
245 grid_row = 0;
246 if (strcmp(alias.constData(), "IP2IP") != 0) {
247 if (priv->account->protocol() != Account::Protocol::RING) {
248 /* SIP and IAX have the same params */
249
250 /* host name */
251 label = gtk_label_new("Host name");
252 gtk_widget_set_halign(label, GTK_ALIGN_START);
253 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400254 entry_hostname = gtk_entry_new();
255 gtk_entry_set_text(GTK_ENTRY(entry_hostname), priv->account->hostname().toLocal8Bit().constData());
256 g_signal_connect(entry_hostname, "changed", G_CALLBACK(account_hostname_changed), view);
257 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_hostname, 1, grid_row, 1, 1);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400258 ++grid_row;
259
260 /* user name */
261 label = gtk_label_new("User name");
262 gtk_widget_set_halign(label, GTK_ALIGN_START);
263 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400264 entry_username = gtk_entry_new();
265 gtk_entry_set_text(GTK_ENTRY(entry_username), priv->account->username().toLocal8Bit().constData());
266 g_signal_connect(entry_username, "changed", G_CALLBACK(account_username_changed), view);
267 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_username, 1, grid_row, 1, 1);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400268 ++grid_row;
269
270 /* password */
271 label = gtk_label_new("Password");
272 gtk_widget_set_halign(label, GTK_ALIGN_START);
273 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400274 entry_password = gtk_entry_new();
275 gtk_entry_set_input_purpose(GTK_ENTRY(entry_password), GTK_INPUT_PURPOSE_PASSWORD);
276 gtk_entry_set_icon_from_icon_name(GTK_ENTRY(entry_password), GTK_ENTRY_ICON_PRIMARY, "dialog-password");
277 gtk_entry_set_visibility(GTK_ENTRY(entry_password), FALSE);
278 gtk_entry_set_text(GTK_ENTRY(entry_password), priv->account->password().toLocal8Bit().constData());
279 g_signal_connect(entry_password, "changed", G_CALLBACK(account_password_changed), view);
280 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_password, 1, grid_row, 1, 1);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400281 ++grid_row;
282
283 /* show password */
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400284 GtkWidget *checkbutton = gtk_check_button_new_with_label("Show password");
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400285 gtk_grid_attach(GTK_GRID(priv->grid_parameters), checkbutton, 1, grid_row, 1, 1);
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400286 g_signal_connect(checkbutton, "toggled", G_CALLBACK(show_password), entry_password);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400287 ++grid_row;
288
289 /* proxy */
290 label = gtk_label_new("Proxy");
291 gtk_widget_set_halign(label, GTK_ALIGN_START);
292 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400293 entry_proxy = gtk_entry_new();
294 gtk_entry_set_text(GTK_ENTRY(entry_proxy), priv->account->proxy().toLocal8Bit().constData());
295 g_signal_connect(entry_proxy, "changed", G_CALLBACK(account_proxy_changed), view);
296 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_proxy, 1, grid_row, 1, 1);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400297 ++grid_row;
298
299 /* voicemail number */
300 label = gtk_label_new("Voicemail number");
301 gtk_widget_set_halign(label, GTK_ALIGN_START);
302 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400303 entry_voicemail = gtk_entry_new();
304 gtk_entry_set_text(GTK_ENTRY(entry_voicemail), priv->account->mailbox().toLocal8Bit().constData());
305 g_signal_connect(entry_voicemail, "changed", G_CALLBACK(account_mailbox_changed), view);
306 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_voicemail, 1, grid_row, 1, 1);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400307 ++grid_row;
308 } else {
309 /* RING accoutn */
310
311 /* bootstrap */
312 label = gtk_label_new("Bootstrap");
313 gtk_widget_set_halign(label, GTK_ALIGN_START);
314 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400315 entry_hostname = gtk_entry_new();
316 gtk_entry_set_text(GTK_ENTRY(entry_hostname), priv->account->hostname().toLocal8Bit().constData());
317 g_signal_connect(entry_hostname, "changed", G_CALLBACK(account_hostname_changed), view);
318 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_hostname, 1, grid_row, 1, 1);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400319 ++grid_row;
320 }
321 }
322
323 /* auto answer */
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400324 checkbutton_autoanswer = gtk_check_button_new_with_label("Auto-answer calls");
325 gtk_widget_set_halign(checkbutton_autoanswer, GTK_ALIGN_START);
326 gtk_grid_attach(GTK_GRID(priv->grid_parameters), checkbutton_autoanswer, 0, grid_row, 1, 1);
327 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_autoanswer), priv->account->isAutoAnswer());
328 g_signal_connect(checkbutton_autoanswer, "toggled", G_CALLBACK(auto_answer), view);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400329 ++grid_row;
330
331 /* upnp */
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400332 checkbutton_upnp = gtk_check_button_new_with_label("UPnP enabled");
333 gtk_widget_set_halign(checkbutton_upnp, GTK_ALIGN_START);
334 gtk_grid_attach(GTK_GRID(priv->grid_parameters), checkbutton_upnp, 0, grid_row, 1, 1);
335 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_upnp), priv->account->isUpnpEnabled());
336 g_signal_connect(checkbutton_upnp, "toggled", G_CALLBACK(upnp_enabled), view);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400337 ++grid_row;
338
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400339 /* update account parameters if model is updated */
340 priv->account_updated = QObject::connect(
341 priv->account,
342 &Account::changed,
343 [=] () {
344 if (strcmp(alias.constData(), "IP2IP") != 0) {
345 gtk_entry_set_text(GTK_ENTRY(entry_alias), priv->account->alias().toLocal8Bit().constData());
346 gtk_entry_set_text(GTK_ENTRY(entry_username), priv->account->username().toLocal8Bit().constData());
347 gtk_entry_set_text(GTK_ENTRY(entry_hostname), priv->account->hostname().toLocal8Bit().constData());
348
349 if (priv->account->protocol() != Account::Protocol::RING) {
350 gtk_entry_set_text(GTK_ENTRY(entry_password), priv->account->password().toLocal8Bit().constData());
351 gtk_entry_set_text(GTK_ENTRY(entry_proxy), priv->account->proxy().toLocal8Bit().constData());
352 gtk_entry_set_text(GTK_ENTRY(entry_voicemail), priv->account->mailbox().toLocal8Bit().constData());
353 }
354 }
355
356 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_autoanswer), priv->account->isAutoAnswer());
357 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_upnp), priv->account->isUpnpEnabled());
358 }
359 );
360
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400361 gtk_widget_show_all(priv->grid_parameters);
362
363}
364
365GtkWidget *
366account_general_tab_new(Account *account)
367{
368 g_return_val_if_fail(account != NULL, NULL);
369
370 gpointer view = g_object_new(ACCOUNT_GENERAL_TAB_TYPE, NULL);
371
372 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
373 priv->account = account;
374
375 build_tab_view(ACCOUNT_GENERAL_TAB(view));
376
377 return (GtkWidget *)view;
378}