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-protocol.h>
32 #include <libempathy/empathy-utils.h>
33 #include <libempathy/empathy-irc-network-manager.h>
35 #include "empathy-irc-network-dialog.h"
36 #include "empathy-account-widget.h"
37 #include "empathy-account-widget-irc.h"
38 #include "empathy-ui-utils.h"
40 #define DEBUG_FLAG EMPATHY_DEBUG_ACCOUNT | EMPATHY_DEBUG_IRC
41 #include <libempathy/empathy-debug.h>
43 #define IRC_NETWORKS_FILENAME "irc-networks.xml"
46 EmpathyAccount *account;
47 EmpathyIrcNetworkManager *network_manager;
49 GtkWidget *vbox_settings;
51 GtkWidget *combobox_network;
52 } EmpathyAccountWidgetIrc;
60 account_widget_irc_destroy_cb (GtkWidget *widget,
61 EmpathyAccountWidgetIrc *settings)
63 g_object_unref (settings->network_manager);
64 g_object_unref (settings->account);
65 g_slice_free (EmpathyAccountWidgetIrc, settings);
69 unset_server_params (EmpathyAccountWidgetIrc *settings)
71 DEBUG ("Unset server, port and use-ssl");
72 empathy_account_unset_param (settings->account, "server");
73 empathy_account_unset_param (settings->account, "port");
74 empathy_account_unset_param (settings->account, "use-ssl");
78 update_server_params (EmpathyAccountWidgetIrc *settings)
82 EmpathyIrcNetwork *network;
86 if (!gtk_combo_box_get_active_iter (
87 GTK_COMBO_BOX (settings->combobox_network), &iter))
89 unset_server_params (settings);
93 model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
94 gtk_tree_model_get (model, &iter, COL_NETWORK_OBJ, &network, -1);
96 g_assert (network != NULL);
98 g_object_get (network, "charset", &charset, NULL);
99 DEBUG ("Setting charset to %s", charset);
100 empathy_account_set_param_string (settings->account, "charset", charset);
103 servers = empathy_irc_network_get_servers (network);
104 if (g_slist_length (servers) > 0)
106 /* set the first server as CM server */
107 EmpathyIrcServer *server = servers->data;
112 g_object_get (server,
118 DEBUG ("Setting server to %s", address);
119 empathy_account_set_param_string (settings->account, "server", address);
120 DEBUG ("Setting port to %u", port);
121 empathy_account_set_param_int (settings->account, "port", port);
122 DEBUG ("Setting use-ssl to %s", ssl ? "TRUE": "FALSE" );
123 empathy_account_set_param_boolean (settings->account, "use-ssl", ssl);
129 /* No server. Unset values */
130 unset_server_params (settings);
133 g_slist_foreach (servers, (GFunc) g_object_unref, NULL);
134 g_slist_free (servers);
135 g_object_unref (network);
139 irc_network_dialog_destroy_cb (GtkWidget *widget,
140 EmpathyAccountWidgetIrc *settings)
144 EmpathyIrcNetwork *network;
147 /* name could be changed */
148 gtk_combo_box_get_active_iter (GTK_COMBO_BOX (settings->combobox_network),
150 model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
151 gtk_tree_model_get (model, &iter, COL_NETWORK_OBJ, &network, -1);
153 g_object_get (network, "name", &name, NULL);
154 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
155 COL_NETWORK_NAME, name, -1);
157 update_server_params (settings);
159 g_object_unref (network);
164 display_irc_network_dialog (EmpathyAccountWidgetIrc *settings,
165 EmpathyIrcNetwork *network)
170 window = empathy_get_toplevel_window (settings->vbox_settings);
171 dialog = empathy_irc_network_dialog_show (network, GTK_WIDGET (window));
172 g_signal_connect (dialog, "destroy",
173 G_CALLBACK (irc_network_dialog_destroy_cb), settings);
177 account_widget_irc_button_edit_network_clicked_cb (
179 EmpathyAccountWidgetIrc *settings)
183 EmpathyIrcNetwork *network;
185 gtk_combo_box_get_active_iter (GTK_COMBO_BOX (settings->combobox_network),
187 model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
188 gtk_tree_model_get (model, &iter, COL_NETWORK_OBJ, &network, -1);
190 g_assert (network != NULL);
192 display_irc_network_dialog (settings, network);
194 g_object_unref (network);
198 account_widget_irc_button_remove_clicked_cb (GtkWidget *button,
199 EmpathyAccountWidgetIrc *settings)
201 EmpathyIrcNetwork *network;
206 gtk_combo_box_get_active_iter (GTK_COMBO_BOX (settings->combobox_network),
208 model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
209 gtk_tree_model_get (model, &iter, COL_NETWORK_OBJ, &network, -1);
211 g_assert (network != NULL);
213 g_object_get (network, "name", &name, NULL);
214 DEBUG ("Remove network %s", name);
216 gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
217 empathy_irc_network_manager_remove (settings->network_manager, network);
219 /* Select the first network */
220 if (gtk_tree_model_get_iter_first (model, &iter))
222 gtk_combo_box_set_active_iter (
223 GTK_COMBO_BOX (settings->combobox_network), &iter);
227 g_object_unref (network);
231 account_widget_irc_button_add_network_clicked_cb (GtkWidget *button,
232 EmpathyAccountWidgetIrc *settings)
234 EmpathyIrcNetwork *network;
240 network = empathy_irc_network_new (_("New Network"));
241 empathy_irc_network_manager_add (settings->network_manager, network);
243 model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
244 store = GTK_LIST_STORE (model);
246 g_object_get (network, "name", &name, NULL);
248 gtk_list_store_insert_with_values (store, &iter, -1,
249 COL_NETWORK_OBJ, network,
250 COL_NETWORK_NAME, name,
253 gtk_combo_box_set_active_iter (GTK_COMBO_BOX (settings->combobox_network),
256 display_irc_network_dialog (settings, network);
259 g_object_unref (network);
263 account_widget_irc_combobox_network_changed_cb (GtkWidget *combobox,
264 EmpathyAccountWidgetIrc *settings)
266 update_server_params (settings);
270 fill_networks_model (EmpathyAccountWidgetIrc *settings,
271 EmpathyIrcNetwork *network_to_select)
273 GSList *networks, *l;
277 networks = empathy_irc_network_manager_get_networks (
278 settings->network_manager);
280 model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
281 store = GTK_LIST_STORE (model);
283 for (l = networks; l != NULL; l = g_slist_next (l))
286 EmpathyIrcNetwork *network = l->data;
289 g_object_get (network, "name", &name, NULL);
291 gtk_list_store_insert_with_values (store, &iter, -1,
292 COL_NETWORK_OBJ, network,
293 COL_NETWORK_NAME, name,
296 if (network == network_to_select)
298 gtk_combo_box_set_active_iter (
299 GTK_COMBO_BOX (settings->combobox_network), &iter);
303 g_object_unref (network);
306 if (network_to_select == NULL)
308 /* Select the first network */
311 if (gtk_tree_model_get_iter_first (model, &iter))
313 gtk_combo_box_set_active_iter (
314 GTK_COMBO_BOX (settings->combobox_network), &iter);
316 update_server_params (settings);
320 g_slist_free (networks);
324 account_widget_irc_setup (EmpathyAccountWidgetIrc *settings)
327 gchar *fullname = NULL;
328 gchar *server = NULL;
331 gboolean ssl = FALSE;
332 EmpathyIrcNetwork *network = NULL;
334 nick = empathy_account_get_param_string (settings->account, "account");
335 fullname = empathy_account_get_param_string (settings->account, "fullname");
336 server = empathy_account_get_param_string (settings->account, "server");
337 charset = empathy_account_get_param_string (settings->account, "charset");
338 port = empathy_account_get_param_int (settings->account, "port");
339 ssl = empathy_account_get_param_boolean (settings->account, "use-ssl");
343 nick = g_strdup (g_get_user_name ());
344 empathy_account_set_param_string (settings->account, "account", nick);
349 fullname = g_strdup (g_get_real_name ());
352 fullname = g_strdup (nick);
354 empathy_account_set_param_string (settings->account, "fullname", fullname);
361 network = empathy_irc_network_manager_find_network_by_address (
362 settings->network_manager, server);
365 store = GTK_LIST_STORE (gtk_combo_box_get_model (
366 GTK_COMBO_BOX (settings->combobox_network)));
372 g_object_set (network, "charset", charset, NULL);
374 g_object_get (network, "name", &name, NULL);
375 DEBUG ("Account use network %s", name);
381 /* We don't have this network. Let's create it */
382 EmpathyIrcServer *srv;
385 DEBUG ("Create a network %s", server);
386 network = empathy_irc_network_new (server);
387 srv = empathy_irc_server_new (server, port, ssl);
389 empathy_irc_network_append_server (network, srv);
390 empathy_irc_network_manager_add (settings->network_manager, network);
392 gtk_list_store_insert_with_values (store, &iter, -1,
393 COL_NETWORK_OBJ, network,
394 COL_NETWORK_NAME, server,
397 gtk_combo_box_set_active_iter (
398 GTK_COMBO_BOX (settings->combobox_network), &iter);
400 g_object_unref (srv);
401 g_object_unref (network);
406 fill_networks_model (settings, network);
415 * empathy_account_widget_irc_new:
416 * @account: the #EmpathyAccount to configure
418 * Creates a new IRC account widget to configure a given #EmpathyAccount
420 * Returns: The toplevel container of the configuration widget
423 empathy_account_widget_irc_new (EmpathyAccount *account)
425 EmpathyAccountWidgetIrc *settings;
426 gchar *dir, *user_file_with_path, *global_file_with_path;
429 GtkCellRenderer *renderer;
432 settings = g_slice_new0 (EmpathyAccountWidgetIrc);
433 settings->account = g_object_ref (account);
435 dir = g_build_filename (g_get_user_config_dir (), PACKAGE_NAME, NULL);
436 g_mkdir_with_parents (dir, S_IRUSR | S_IWUSR | S_IXUSR);
437 user_file_with_path = g_build_filename (dir, IRC_NETWORKS_FILENAME, NULL);
440 global_file_with_path = g_build_filename (g_getenv ("EMPATHY_SRCDIR"),
441 "libempathy-gtk", IRC_NETWORKS_FILENAME, NULL);
442 if (!g_file_test (global_file_with_path, G_FILE_TEST_EXISTS))
444 g_free (global_file_with_path);
445 global_file_with_path = g_build_filename (DATADIR, "empathy",
446 IRC_NETWORKS_FILENAME, NULL);
449 settings->network_manager = empathy_irc_network_manager_new (
450 global_file_with_path,
451 user_file_with_path);
453 g_free (global_file_with_path);
454 g_free (user_file_with_path);
456 filename = empathy_file_lookup ("empathy-account-widget-irc.ui",
458 gui = empathy_builder_get_file (filename,
459 "vbox_irc_settings", &settings->vbox_settings,
460 "combobox_network", &settings->combobox_network,
464 /* Fill the networks combobox */
465 store = gtk_list_store_new (2, G_TYPE_OBJECT, G_TYPE_STRING);
467 gtk_cell_layout_clear (GTK_CELL_LAYOUT (settings->combobox_network));
468 renderer = gtk_cell_renderer_text_new ();
469 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (settings->combobox_network),
471 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (settings->combobox_network),
473 "text", COL_NETWORK_NAME,
476 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store),
480 gtk_combo_box_set_model (GTK_COMBO_BOX (settings->combobox_network),
481 GTK_TREE_MODEL (store));
482 g_object_unref (store);
484 account_widget_irc_setup (settings);
486 empathy_account_widget_handle_params (account, gui,
487 "entry_nick", "account",
488 "entry_fullname", "fullname",
489 "entry_password", "password",
490 "entry_quit_message", "quit-message",
493 empathy_builder_connect (gui, settings,
494 "vbox_irc_settings", "destroy", account_widget_irc_destroy_cb,
495 "button_network", "clicked", account_widget_irc_button_edit_network_clicked_cb,
496 "button_add_network", "clicked", account_widget_irc_button_add_network_clicked_cb,
497 "button_remove_network", "clicked", account_widget_irc_button_remove_clicked_cb,
498 "combobox_network", "changed", account_widget_irc_combobox_network_changed_cb,
501 empathy_account_widget_set_default_focus (gui, "entry_nick");
503 return empathy_builder_unref_and_keep_widget (gui, settings->vbox_settings);