2
* Copyright (C) 2007-2008 Guillaume Desmottes
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.
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.
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
18
* Authors: Guillaume Desmottes <gdesmott@gnome.org>
27
#include <glib/gi18n.h>
29
#include <glade/glade.h>
31
#include <libmissioncontrol/mc-account.h>
32
#include <libmissioncontrol/mc-protocol.h>
34
#include <libempathy/empathy-utils.h>
35
#include <libempathy/empathy-debug.h>
36
#include <libempathy/empathy-irc-network-manager.h>
38
#include "empathy-irc-network-dialog.h"
39
#include "empathy-account-widget.h"
40
#include "empathy-account-widget-irc.h"
41
#include "empathy-ui-utils.h"
43
#define DEBUG_DOMAIN "AccountWidgetIRC"
45
#define IRC_NETWORKS_FILENAME "irc-networks.xml"
49
EmpathyIrcNetworkManager *network_manager;
51
GtkWidget *vbox_settings;
53
GtkWidget *combobox_network;
54
GtkWidget *button_add_network;
55
GtkWidget *button_network;
56
GtkWidget *button_remove;
57
} EmpathyAccountWidgetIrc;
65
account_widget_irc_destroy_cb (GtkWidget *widget,
66
EmpathyAccountWidgetIrc *settings)
68
g_object_unref (settings->network_manager);
69
g_object_unref (settings->account);
70
g_slice_free (EmpathyAccountWidgetIrc, settings);
74
unset_server_params (EmpathyAccountWidgetIrc *settings)
76
empathy_debug (DEBUG_DOMAIN, "Unset server, port and use-ssl");
77
mc_account_unset_param (settings->account, "server");
78
mc_account_unset_param (settings->account, "port");
79
mc_account_unset_param (settings->account, "use-ssl");
83
update_server_params (EmpathyAccountWidgetIrc *settings)
87
EmpathyIrcNetwork *network;
91
if (!gtk_combo_box_get_active_iter (
92
GTK_COMBO_BOX (settings->combobox_network), &iter))
94
unset_server_params (settings);
98
model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
99
gtk_tree_model_get (model, &iter, COL_NETWORK_OBJ, &network, -1);
101
g_assert (network != NULL);
103
g_object_get (network, "charset", &charset, NULL);
104
empathy_debug (DEBUG_DOMAIN, "Setting charset to %s", charset);
105
mc_account_set_param_string (settings->account, "charset", charset);
108
servers = empathy_irc_network_get_servers (network);
109
if (g_slist_length (servers) > 0)
111
/* set the first server as CM server */
112
EmpathyIrcServer *server = servers->data;
117
g_object_get (server,
123
empathy_debug (DEBUG_DOMAIN, "Setting server to %s", address);
124
mc_account_set_param_string (settings->account, "server", address);
125
empathy_debug (DEBUG_DOMAIN, "Setting port to %u", port);
126
mc_account_set_param_int (settings->account, "port", port);
127
empathy_debug (DEBUG_DOMAIN, "Setting use-ssl to %s",
128
ssl ? "TRUE": "FALSE" );
129
mc_account_set_param_boolean (settings->account, "use-ssl", ssl);
135
/* No server. Unset values */
136
unset_server_params (settings);
139
g_slist_foreach (servers, (GFunc) g_object_unref, NULL);
140
g_slist_free (servers);
141
g_object_unref (network);
145
irc_network_dialog_destroy_cb (GtkWidget *widget,
146
EmpathyAccountWidgetIrc *settings)
150
EmpathyIrcNetwork *network;
153
/* name could be changed */
154
gtk_combo_box_get_active_iter (GTK_COMBO_BOX (settings->combobox_network),
156
model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
157
gtk_tree_model_get (model, &iter, COL_NETWORK_OBJ, &network, -1);
159
g_object_get (network, "name", &name, NULL);
160
gtk_list_store_set (GTK_LIST_STORE (model), &iter,
161
COL_NETWORK_NAME, name, -1);
163
update_server_params (settings);
165
g_object_unref (network);
170
display_irc_network_dialog (EmpathyAccountWidgetIrc *settings,
171
EmpathyIrcNetwork *network)
176
window = empathy_get_toplevel_window (settings->vbox_settings);
177
dialog = empathy_irc_network_dialog_show (network, GTK_WIDGET (window));
178
g_signal_connect (dialog, "destroy",
179
G_CALLBACK (irc_network_dialog_destroy_cb), settings);
183
account_widget_irc_button_edit_network_clicked_cb (
185
EmpathyAccountWidgetIrc *settings)
189
EmpathyIrcNetwork *network;
191
gtk_combo_box_get_active_iter (GTK_COMBO_BOX (settings->combobox_network),
193
model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
194
gtk_tree_model_get (model, &iter, COL_NETWORK_OBJ, &network, -1);
196
g_assert (network != NULL);
198
display_irc_network_dialog (settings, network);
200
g_object_unref (network);
204
account_widget_irc_button_remove_clicked_cb (GtkWidget *button,
205
EmpathyAccountWidgetIrc *settings)
207
EmpathyIrcNetwork *network;
212
gtk_combo_box_get_active_iter (GTK_COMBO_BOX (settings->combobox_network),
214
model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
215
gtk_tree_model_get (model, &iter, COL_NETWORK_OBJ, &network, -1);
217
g_assert (network != NULL);
219
g_object_get (network, "name", &name, NULL);
220
empathy_debug (DEBUG_DOMAIN, "Remove network %s", name);
222
gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
223
empathy_irc_network_manager_remove (settings->network_manager, network);
225
/* Select the first network */
226
if (gtk_tree_model_get_iter_first (model, &iter))
228
gtk_combo_box_set_active_iter (
229
GTK_COMBO_BOX (settings->combobox_network), &iter);
233
g_object_unref (network);
237
account_widget_irc_button_add_network_clicked_cb (GtkWidget *button,
238
EmpathyAccountWidgetIrc *settings)
240
EmpathyIrcNetwork *network;
246
network = empathy_irc_network_new (_("New Network"));
247
empathy_irc_network_manager_add (settings->network_manager, network);
249
model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
250
store = GTK_LIST_STORE (model);
252
g_object_get (network, "name", &name, NULL);
254
gtk_list_store_insert_with_values (store, &iter, -1,
255
COL_NETWORK_OBJ, network,
256
COL_NETWORK_NAME, name,
259
gtk_combo_box_set_active_iter (GTK_COMBO_BOX (settings->combobox_network),
262
display_irc_network_dialog (settings, network);
265
g_object_unref (network);
269
account_widget_irc_combobox_network_changed_cb (GtkWidget *combobox,
270
EmpathyAccountWidgetIrc *settings)
272
update_server_params (settings);
276
fill_networks_model (EmpathyAccountWidgetIrc *settings,
277
EmpathyIrcNetwork *network_to_select)
279
GSList *networks, *l;
283
networks = empathy_irc_network_manager_get_networks (
284
settings->network_manager);
286
model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
287
store = GTK_LIST_STORE (model);
289
for (l = networks; l != NULL; l = g_slist_next (l))
292
EmpathyIrcNetwork *network = l->data;
295
g_object_get (network, "name", &name, NULL);
297
gtk_list_store_insert_with_values (store, &iter, -1,
298
COL_NETWORK_OBJ, network,
299
COL_NETWORK_NAME, name,
302
if (network == network_to_select)
304
gtk_combo_box_set_active_iter (
305
GTK_COMBO_BOX (settings->combobox_network), &iter);
309
g_object_unref (network);
312
if (network_to_select == NULL)
314
/* Select the first network */
317
if (gtk_tree_model_get_iter_first (model, &iter))
319
gtk_combo_box_set_active_iter (
320
GTK_COMBO_BOX (settings->combobox_network), &iter);
322
update_server_params (settings);
326
g_slist_free (networks);
330
account_widget_irc_setup (EmpathyAccountWidgetIrc *settings)
333
gchar *fullname = NULL;
334
gchar *server = NULL;
337
gboolean ssl = FALSE;
338
EmpathyIrcNetwork *network = NULL;
340
mc_account_get_param_string (settings->account, "account", &nick);
341
mc_account_get_param_string (settings->account, "fullname", &fullname);
342
mc_account_get_param_string (settings->account, "server", &server);
343
mc_account_get_param_string (settings->account, "charset", &charset);
344
mc_account_get_param_int (settings->account, "port", &port);
345
mc_account_get_param_boolean (settings->account, "use-ssl", &ssl);
349
nick = g_strdup (g_get_user_name ());
350
mc_account_set_param_string (settings->account, "account", nick);
355
fullname = g_strdup (g_get_real_name ());
358
fullname = g_strdup (nick);
360
mc_account_set_param_string (settings->account, "fullname", fullname);
367
network = empathy_irc_network_manager_find_network_by_address (
368
settings->network_manager, server);
371
store = GTK_LIST_STORE (gtk_combo_box_get_model (
372
GTK_COMBO_BOX (settings->combobox_network)));
378
g_object_set (network, "charset", charset, NULL);
380
g_object_get (network, "name", &name, NULL);
381
empathy_debug (DEBUG_DOMAIN, "Account use network %s", name);
387
/* We don't have this network. Let's create it */
388
EmpathyIrcServer *srv;
391
empathy_debug (DEBUG_DOMAIN, "Create a network %s", server);
392
network = empathy_irc_network_new (server);
393
srv = empathy_irc_server_new (server, port, ssl);
395
empathy_irc_network_append_server (network, srv);
396
empathy_irc_network_manager_add (settings->network_manager, network);
398
gtk_list_store_insert_with_values (store, &iter, -1,
399
COL_NETWORK_OBJ, network,
400
COL_NETWORK_NAME, server,
403
gtk_combo_box_set_active_iter (
404
GTK_COMBO_BOX (settings->combobox_network), &iter);
406
g_object_unref (srv);
407
g_object_unref (network);
412
fill_networks_model (settings, network);
421
* empathy_account_widget_irc_new:
422
* @account: the #McAccount to configure
424
* Creates a new IRC account widget to configure a given #McAccount
426
* Returns: The toplevel container of the configuration widget
429
empathy_account_widget_irc_new (McAccount *account)
431
EmpathyAccountWidgetIrc *settings;
432
gchar *dir, *user_file_with_path, *global_file_with_path;
435
GtkCellRenderer *renderer;
437
settings = g_slice_new0 (EmpathyAccountWidgetIrc);
438
settings->account = g_object_ref (account);
440
dir = g_build_filename (g_get_home_dir (), ".gnome2", PACKAGE_NAME, NULL);
441
g_mkdir_with_parents (dir, S_IRUSR | S_IWUSR | S_IXUSR);
442
user_file_with_path = g_build_filename (dir, IRC_NETWORKS_FILENAME, NULL);
445
global_file_with_path = g_build_filename (g_getenv ("EMPATHY_SRCDIR"),
446
"libempathy-gtk", IRC_NETWORKS_FILENAME, NULL);
447
if (!g_file_test (global_file_with_path, G_FILE_TEST_EXISTS))
449
g_free (global_file_with_path);
450
global_file_with_path = g_build_filename (DATADIR, "empathy",
451
IRC_NETWORKS_FILENAME, NULL);
454
settings->network_manager = empathy_irc_network_manager_new (
455
global_file_with_path,
456
user_file_with_path);
458
g_free (global_file_with_path);
459
g_free (user_file_with_path);
461
glade = empathy_glade_get_file ("empathy-account-widget-irc.glade",
464
"vbox_irc_settings", &settings->vbox_settings,
465
"combobox_network", &settings->combobox_network,
466
"button_network", &settings->button_network,
467
"button_add_network", &settings->button_add_network,
468
"button_remove", &settings->button_remove,
471
/* Fill the networks combobox */
472
store = gtk_list_store_new (2, G_TYPE_OBJECT, G_TYPE_STRING);
474
gtk_cell_layout_clear (GTK_CELL_LAYOUT (settings->combobox_network));
475
renderer = gtk_cell_renderer_text_new ();
476
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (settings->combobox_network),
478
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (settings->combobox_network),
480
"text", COL_NETWORK_NAME,
483
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store),
487
gtk_combo_box_set_model (GTK_COMBO_BOX (settings->combobox_network),
488
GTK_TREE_MODEL (store));
489
g_object_unref (store);
491
account_widget_irc_setup (settings);
493
empathy_account_widget_handle_params (account, glade,
494
"entry_nick", "account",
495
"entry_fullname", "fullname",
496
"entry_password", "password",
497
"entry_quit_message", "quit-message",
500
empathy_glade_connect (glade, settings,
501
"vbox_irc_settings", "destroy", account_widget_irc_destroy_cb,
502
"button_network", "clicked", account_widget_irc_button_edit_network_clicked_cb,
503
"button_add_network", "clicked", account_widget_irc_button_add_network_clicked_cb,
504
"button_remove", "clicked", account_widget_irc_button_remove_clicked_cb,
505
"combobox_network", "changed", account_widget_irc_combobox_network_changed_cb,
508
g_object_unref (glade);
510
return settings->vbox_settings;