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-lib.h>
30 #include <libmissioncontrol/mc-account.h>
31 #include <libmissioncontrol/mc-protocol.h>
33 #include <libempathy/empathy-utils.h>
34 #include <libempathy/empathy-irc-network-manager.h>
36 #include "empathy-irc-network-dialog.h"
37 #include "empathy-account-widget.h"
38 #include "empathy-account-widget-irc.h"
39 #include "empathy-ui-utils.h"
41 #define DEBUG_FLAG EMPATHY_DEBUG_ACCOUNT | EMPATHY_DEBUG_IRC
42 #include <libempathy/empathy-debug.h>
44 #define IRC_NETWORKS_FILENAME "irc-networks.xml"
48 EmpathyIrcNetworkManager *network_manager;
50 GtkWidget *vbox_settings;
52 GtkWidget *combobox_network;
53 } EmpathyAccountWidgetIrc;
61 account_widget_irc_destroy_cb (GtkWidget *widget,
62 EmpathyAccountWidgetIrc *settings)
64 g_object_unref (settings->network_manager);
65 g_object_unref (settings->account);
66 g_slice_free (EmpathyAccountWidgetIrc, settings);
70 unset_server_params (EmpathyAccountWidgetIrc *settings)
72 DEBUG ("Unset server, port and use-ssl");
73 mc_account_unset_param (settings->account, "server");
74 mc_account_unset_param (settings->account, "port");
75 mc_account_unset_param (settings->account, "use-ssl");
79 update_server_params (EmpathyAccountWidgetIrc *settings)
83 EmpathyIrcNetwork *network;
87 if (!gtk_combo_box_get_active_iter (
88 GTK_COMBO_BOX (settings->combobox_network), &iter))
90 unset_server_params (settings);
94 model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
95 gtk_tree_model_get (model, &iter, COL_NETWORK_OBJ, &network, -1);
97 g_assert (network != NULL);
99 g_object_get (network, "charset", &charset, NULL);
100 DEBUG ("Setting charset to %s", charset);
101 mc_account_set_param_string (settings->account, "charset", charset);
104 servers = empathy_irc_network_get_servers (network);
105 if (g_slist_length (servers) > 0)
107 /* set the first server as CM server */
108 EmpathyIrcServer *server = servers->data;
113 g_object_get (server,
119 DEBUG ("Setting server to %s", address);
120 mc_account_set_param_string (settings->account, "server", address);
121 DEBUG ("Setting port to %u", port);
122 mc_account_set_param_int (settings->account, "port", port);
123 DEBUG ("Setting use-ssl to %s", ssl ? "TRUE": "FALSE" );
124 mc_account_set_param_boolean (settings->account, "use-ssl", ssl);
130 /* No server. Unset values */
131 unset_server_params (settings);
134 g_slist_foreach (servers, (GFunc) g_object_unref, NULL);
135 g_slist_free (servers);
136 g_object_unref (network);
140 irc_network_dialog_destroy_cb (GtkWidget *widget,
141 EmpathyAccountWidgetIrc *settings)
145 EmpathyIrcNetwork *network;
148 /* name could be changed */
149 gtk_combo_box_get_active_iter (GTK_COMBO_BOX (settings->combobox_network),
151 model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
152 gtk_tree_model_get (model, &iter, COL_NETWORK_OBJ, &network, -1);
154 g_object_get (network, "name", &name, NULL);
155 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
156 COL_NETWORK_NAME, name, -1);
158 update_server_params (settings);
160 g_object_unref (network);
165 display_irc_network_dialog (EmpathyAccountWidgetIrc *settings,
166 EmpathyIrcNetwork *network)
171 window = empathy_get_toplevel_window (settings->vbox_settings);
172 dialog = empathy_irc_network_dialog_show (network, GTK_WIDGET (window));
173 g_signal_connect (dialog, "destroy",
174 G_CALLBACK (irc_network_dialog_destroy_cb), settings);
178 account_widget_irc_button_edit_network_clicked_cb (
180 EmpathyAccountWidgetIrc *settings)
184 EmpathyIrcNetwork *network;
186 gtk_combo_box_get_active_iter (GTK_COMBO_BOX (settings->combobox_network),
188 model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
189 gtk_tree_model_get (model, &iter, COL_NETWORK_OBJ, &network, -1);
191 g_assert (network != NULL);
193 display_irc_network_dialog (settings, network);
195 g_object_unref (network);
199 account_widget_irc_button_remove_clicked_cb (GtkWidget *button,
200 EmpathyAccountWidgetIrc *settings)
202 EmpathyIrcNetwork *network;
207 gtk_combo_box_get_active_iter (GTK_COMBO_BOX (settings->combobox_network),
209 model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
210 gtk_tree_model_get (model, &iter, COL_NETWORK_OBJ, &network, -1);
212 g_assert (network != NULL);
214 g_object_get (network, "name", &name, NULL);
215 DEBUG ("Remove network %s", name);
217 gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
218 empathy_irc_network_manager_remove (settings->network_manager, network);
220 /* Select the first network */
221 if (gtk_tree_model_get_iter_first (model, &iter))
223 gtk_combo_box_set_active_iter (
224 GTK_COMBO_BOX (settings->combobox_network), &iter);
228 g_object_unref (network);
232 account_widget_irc_button_add_network_clicked_cb (GtkWidget *button,
233 EmpathyAccountWidgetIrc *settings)
235 EmpathyIrcNetwork *network;
241 network = empathy_irc_network_new (_("New Network"));
242 empathy_irc_network_manager_add (settings->network_manager, network);
244 model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
245 store = GTK_LIST_STORE (model);
247 g_object_get (network, "name", &name, NULL);
249 gtk_list_store_insert_with_values (store, &iter, -1,
250 COL_NETWORK_OBJ, network,
251 COL_NETWORK_NAME, name,
254 gtk_combo_box_set_active_iter (GTK_COMBO_BOX (settings->combobox_network),
257 display_irc_network_dialog (settings, network);
260 g_object_unref (network);
264 account_widget_irc_combobox_network_changed_cb (GtkWidget *combobox,
265 EmpathyAccountWidgetIrc *settings)
267 update_server_params (settings);
271 fill_networks_model (EmpathyAccountWidgetIrc *settings,
272 EmpathyIrcNetwork *network_to_select)
274 GSList *networks, *l;
278 networks = empathy_irc_network_manager_get_networks (
279 settings->network_manager);
281 model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
282 store = GTK_LIST_STORE (model);
284 for (l = networks; l != NULL; l = g_slist_next (l))
287 EmpathyIrcNetwork *network = l->data;
290 g_object_get (network, "name", &name, NULL);
292 gtk_list_store_insert_with_values (store, &iter, -1,
293 COL_NETWORK_OBJ, network,
294 COL_NETWORK_NAME, name,
297 if (network == network_to_select)
299 gtk_combo_box_set_active_iter (
300 GTK_COMBO_BOX (settings->combobox_network), &iter);
304 g_object_unref (network);
307 if (network_to_select == NULL)
309 /* Select the first network */
312 if (gtk_tree_model_get_iter_first (model, &iter))
314 gtk_combo_box_set_active_iter (
315 GTK_COMBO_BOX (settings->combobox_network), &iter);
317 update_server_params (settings);
321 g_slist_free (networks);
325 account_widget_irc_setup (EmpathyAccountWidgetIrc *settings)
328 gchar *fullname = NULL;
329 gchar *server = NULL;
332 gboolean ssl = FALSE;
333 EmpathyIrcNetwork *network = NULL;
335 mc_account_get_param_string (settings->account, "account", &nick);
336 mc_account_get_param_string (settings->account, "fullname", &fullname);
337 mc_account_get_param_string (settings->account, "server", &server);
338 mc_account_get_param_string (settings->account, "charset", &charset);
339 mc_account_get_param_int (settings->account, "port", &port);
340 mc_account_get_param_boolean (settings->account, "use-ssl", &ssl);
344 nick = g_strdup (g_get_user_name ());
345 mc_account_set_param_string (settings->account, "account", nick);
350 fullname = g_strdup (g_get_real_name ());
353 fullname = g_strdup (nick);
355 mc_account_set_param_string (settings->account, "fullname", fullname);
362 network = empathy_irc_network_manager_find_network_by_address (
363 settings->network_manager, server);
366 store = GTK_LIST_STORE (gtk_combo_box_get_model (
367 GTK_COMBO_BOX (settings->combobox_network)));
373 g_object_set (network, "charset", charset, NULL);
375 g_object_get (network, "name", &name, NULL);
376 DEBUG ("Account use network %s", name);
382 /* We don't have this network. Let's create it */
383 EmpathyIrcServer *srv;
386 DEBUG ("Create a network %s", server);
387 network = empathy_irc_network_new (server);
388 srv = empathy_irc_server_new (server, port, ssl);
390 empathy_irc_network_append_server (network, srv);
391 empathy_irc_network_manager_add (settings->network_manager, network);
393 gtk_list_store_insert_with_values (store, &iter, -1,
394 COL_NETWORK_OBJ, network,
395 COL_NETWORK_NAME, server,
398 gtk_combo_box_set_active_iter (
399 GTK_COMBO_BOX (settings->combobox_network), &iter);
401 g_object_unref (srv);
402 g_object_unref (network);
407 fill_networks_model (settings, network);
416 * empathy_account_widget_irc_new:
417 * @account: the #McAccount to configure
419 * Creates a new IRC account widget to configure a given #McAccount
421 * Returns: The toplevel container of the configuration widget
424 empathy_account_widget_irc_new (McAccount *account)
426 EmpathyAccountWidgetIrc *settings;
427 gchar *dir, *user_file_with_path, *global_file_with_path;
430 GtkCellRenderer *renderer;
433 settings = g_slice_new0 (EmpathyAccountWidgetIrc);
434 settings->account = g_object_ref (account);
436 dir = g_build_filename (g_get_home_dir (), ".gnome2", PACKAGE_NAME, NULL);
437 g_mkdir_with_parents (dir, S_IRUSR | S_IWUSR | S_IXUSR);
438 user_file_with_path = g_build_filename (dir, IRC_NETWORKS_FILENAME, NULL);
441 global_file_with_path = g_build_filename (g_getenv ("EMPATHY_SRCDIR"),
442 "libempathy-gtk", IRC_NETWORKS_FILENAME, NULL);
443 if (!g_file_test (global_file_with_path, G_FILE_TEST_EXISTS))
445 g_free (global_file_with_path);
446 global_file_with_path = g_build_filename (DATADIR, "empathy",
447 IRC_NETWORKS_FILENAME, NULL);
450 settings->network_manager = empathy_irc_network_manager_new (
451 global_file_with_path,
452 user_file_with_path);
454 g_free (global_file_with_path);
455 g_free (user_file_with_path);
457 filename = empathy_file_lookup ("empathy-account-widget-irc.ui",
459 gui = empathy_builder_get_file (filename,
460 "vbox_irc_settings", &settings->vbox_settings,
461 "combobox_network", &settings->combobox_network,
465 /* Fill the networks combobox */
466 store = gtk_list_store_new (2, G_TYPE_OBJECT, G_TYPE_STRING);
468 gtk_cell_layout_clear (GTK_CELL_LAYOUT (settings->combobox_network));
469 renderer = gtk_cell_renderer_text_new ();
470 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (settings->combobox_network),
472 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (settings->combobox_network),
474 "text", COL_NETWORK_NAME,
477 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store),
481 gtk_combo_box_set_model (GTK_COMBO_BOX (settings->combobox_network),
482 GTK_TREE_MODEL (store));
483 g_object_unref (store);
485 account_widget_irc_setup (settings);
487 empathy_account_widget_handle_params (account, gui,
488 "entry_nick", "account",
489 "entry_fullname", "fullname",
490 "entry_password", "password",
491 "entry_quit_message", "quit-message",
494 empathy_builder_connect (gui, settings,
495 "vbox_irc_settings", "destroy", account_widget_irc_destroy_cb,
496 "button_network", "clicked", account_widget_irc_button_edit_network_clicked_cb,
497 "button_add_network", "clicked", account_widget_irc_button_add_network_clicked_cb,
498 "button_remove_network", "clicked", account_widget_irc_button_remove_clicked_cb,
499 "combobox_network", "changed", account_widget_irc_combobox_network_changed_cb,
502 return empathy_builder_unref_and_keep_widget (gui, settings->vbox_settings);