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 <libempathy/empathy-utils.h>
31 #include <libempathy/empathy-irc-network-manager.h>
33 #include "empathy-irc-network-dialog.h"
34 #include "empathy-account-widget.h"
35 #include "empathy-account-widget-private.h"
36 #include "empathy-account-widget-irc.h"
37 #include "empathy-ui-utils.h"
39 #define DEBUG_FLAG EMPATHY_DEBUG_ACCOUNT | EMPATHY_DEBUG_IRC
40 #include <libempathy/empathy-debug.h>
42 #define IRC_NETWORKS_FILENAME "irc-networks.xml"
45 EmpathyAccountWidget *self;
46 EmpathyIrcNetworkManager *network_manager;
48 GtkWidget *vbox_settings;
50 GtkWidget *combobox_network;
51 } EmpathyAccountWidgetIrc;
59 account_widget_irc_destroy_cb (GtkWidget *widget,
60 EmpathyAccountWidgetIrc *settings)
62 g_object_unref (settings->network_manager);
63 g_slice_free (EmpathyAccountWidgetIrc, settings);
67 unset_server_params (EmpathyAccountWidgetIrc *settings)
69 EmpathyAccountSettings *ac_settings;
71 g_object_get (settings->self, "settings", &ac_settings, NULL);
72 DEBUG ("Unset server, port and use-ssl");
73 empathy_account_settings_unset (ac_settings, "server");
74 empathy_account_settings_unset (ac_settings, "port");
75 empathy_account_settings_unset (ac_settings, "use-ssl");
79 update_server_params (EmpathyAccountWidgetIrc *settings)
83 EmpathyIrcNetwork *network;
86 EmpathyAccountSettings *ac_settings;
88 g_object_get (settings->self, "settings", &ac_settings, NULL);
90 if (!gtk_combo_box_get_active_iter (
91 GTK_COMBO_BOX (settings->combobox_network), &iter))
93 unset_server_params (settings);
97 model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
98 gtk_tree_model_get (model, &iter, COL_NETWORK_OBJ, &network, -1);
100 g_assert (network != NULL);
102 g_object_get (network, "charset", &charset, NULL);
103 DEBUG ("Setting charset to %s", charset);
104 empathy_account_settings_set_string (ac_settings, "charset", charset);
107 servers = empathy_irc_network_get_servers (network);
108 if (g_slist_length (servers) > 0)
110 /* set the first server as CM server */
111 EmpathyIrcServer *server = servers->data;
116 g_object_get (server,
122 DEBUG ("Setting server to %s", address);
123 empathy_account_settings_set_string (ac_settings, "server", address);
124 DEBUG ("Setting port to %u", port);
125 empathy_account_settings_set_uint32 (ac_settings, "port", port);
126 DEBUG ("Setting use-ssl to %s", ssl ? "TRUE": "FALSE" );
127 empathy_account_settings_set_boolean (ac_settings, "use-ssl", ssl);
133 /* No server. Unset values */
134 unset_server_params (settings);
137 g_slist_foreach (servers, (GFunc) g_object_unref, NULL);
138 g_slist_free (servers);
139 g_object_unref (network);
143 irc_network_dialog_destroy_cb (GtkWidget *widget,
144 EmpathyAccountWidgetIrc *settings)
148 EmpathyIrcNetwork *network;
151 /* name could be changed */
152 gtk_combo_box_get_active_iter (GTK_COMBO_BOX (settings->combobox_network),
154 model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
155 gtk_tree_model_get (model, &iter, COL_NETWORK_OBJ, &network, -1);
157 g_object_get (network, "name", &name, NULL);
158 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
159 COL_NETWORK_NAME, name, -1);
161 update_server_params (settings);
163 g_object_unref (network);
168 display_irc_network_dialog (EmpathyAccountWidgetIrc *settings,
169 EmpathyIrcNetwork *network)
174 window = empathy_get_toplevel_window (settings->vbox_settings);
175 dialog = empathy_irc_network_dialog_show (network, GTK_WIDGET (window));
176 g_signal_connect (dialog, "destroy",
177 G_CALLBACK (irc_network_dialog_destroy_cb), settings);
181 account_widget_irc_button_edit_network_clicked_cb (
183 EmpathyAccountWidgetIrc *settings)
187 EmpathyIrcNetwork *network;
189 gtk_combo_box_get_active_iter (GTK_COMBO_BOX (settings->combobox_network),
191 model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
192 gtk_tree_model_get (model, &iter, COL_NETWORK_OBJ, &network, -1);
194 g_assert (network != NULL);
196 display_irc_network_dialog (settings, network);
198 g_object_unref (network);
202 account_widget_irc_button_remove_clicked_cb (GtkWidget *button,
203 EmpathyAccountWidgetIrc *settings)
205 EmpathyIrcNetwork *network;
210 gtk_combo_box_get_active_iter (GTK_COMBO_BOX (settings->combobox_network),
212 model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
213 gtk_tree_model_get (model, &iter, COL_NETWORK_OBJ, &network, -1);
215 g_assert (network != NULL);
217 g_object_get (network, "name", &name, NULL);
218 DEBUG ("Remove network %s", name);
220 gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
221 empathy_irc_network_manager_remove (settings->network_manager, network);
223 /* Select the first network */
224 if (gtk_tree_model_get_iter_first (model, &iter))
226 gtk_combo_box_set_active_iter (
227 GTK_COMBO_BOX (settings->combobox_network), &iter);
231 g_object_unref (network);
235 account_widget_irc_button_add_network_clicked_cb (GtkWidget *button,
236 EmpathyAccountWidgetIrc *settings)
238 EmpathyIrcNetwork *network;
244 network = empathy_irc_network_new (_("New Network"));
245 empathy_irc_network_manager_add (settings->network_manager, network);
247 model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
248 store = GTK_LIST_STORE (model);
250 g_object_get (network, "name", &name, NULL);
252 gtk_list_store_insert_with_values (store, &iter, -1,
253 COL_NETWORK_OBJ, network,
254 COL_NETWORK_NAME, name,
257 gtk_combo_box_set_active_iter (GTK_COMBO_BOX (settings->combobox_network),
260 display_irc_network_dialog (settings, network);
263 g_object_unref (network);
267 account_widget_irc_combobox_network_changed_cb (GtkWidget *combobox,
268 EmpathyAccountWidgetIrc *settings)
270 update_server_params (settings);
274 fill_networks_model (EmpathyAccountWidgetIrc *settings,
275 EmpathyIrcNetwork *network_to_select)
277 GSList *networks, *l;
281 networks = empathy_irc_network_manager_get_networks (
282 settings->network_manager);
284 model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
285 store = GTK_LIST_STORE (model);
287 for (l = networks; l != NULL; l = g_slist_next (l))
290 EmpathyIrcNetwork *network = l->data;
293 g_object_get (network, "name", &name, NULL);
295 gtk_list_store_insert_with_values (store, &iter, -1,
296 COL_NETWORK_OBJ, network,
297 COL_NETWORK_NAME, name,
300 if (network == network_to_select)
302 gtk_combo_box_set_active_iter (
303 GTK_COMBO_BOX (settings->combobox_network), &iter);
307 g_object_unref (network);
310 if (network_to_select == NULL)
312 /* Select the first network */
315 if (gtk_tree_model_get_iter_first (model, &iter))
317 gtk_combo_box_set_active_iter (
318 GTK_COMBO_BOX (settings->combobox_network), &iter);
320 update_server_params (settings);
324 g_slist_free (networks);
328 account_widget_irc_setup (EmpathyAccountWidgetIrc *settings)
330 const gchar *nick = NULL;
331 const gchar *fullname = NULL;
332 const gchar *server = NULL;
334 const gchar *charset;
335 gboolean ssl = FALSE;
336 EmpathyIrcNetwork *network = NULL;
337 EmpathyAccountSettings *ac_settings;
339 g_object_get (settings->self, "settings", &ac_settings, NULL);
341 nick = empathy_account_settings_get_string (ac_settings, "account");
342 fullname = empathy_account_settings_get_string (ac_settings,
344 server = empathy_account_settings_get_string (ac_settings, "server");
345 charset = empathy_account_settings_get_string (ac_settings, "charset");
346 port = empathy_account_settings_get_uint32 (ac_settings, "port");
347 ssl = empathy_account_settings_get_boolean (ac_settings, "use-ssl");
351 nick = g_strdup (g_get_user_name ());
352 empathy_account_settings_set_string (ac_settings,
358 fullname = g_strdup (g_get_real_name ());
361 fullname = g_strdup (nick);
363 empathy_account_settings_set_string (ac_settings,
364 "fullname", fullname);
371 network = empathy_irc_network_manager_find_network_by_address (
372 settings->network_manager, server);
375 store = GTK_LIST_STORE (gtk_combo_box_get_model (
376 GTK_COMBO_BOX (settings->combobox_network)));
382 g_object_set (network, "charset", charset, NULL);
384 g_object_get (network, "name", &name, NULL);
385 DEBUG ("Account use network %s", name);
391 /* We don't have this network. Let's create it */
392 EmpathyIrcServer *srv;
395 DEBUG ("Create a network %s", server);
396 network = empathy_irc_network_new (server);
397 srv = empathy_irc_server_new (server, port, ssl);
399 empathy_irc_network_append_server (network, srv);
400 empathy_irc_network_manager_add (settings->network_manager, network);
402 gtk_list_store_insert_with_values (store, &iter, -1,
403 COL_NETWORK_OBJ, network,
404 COL_NETWORK_NAME, server,
407 gtk_combo_box_set_active_iter (
408 GTK_COMBO_BOX (settings->combobox_network), &iter);
410 g_object_unref (srv);
411 g_object_unref (network);
416 fill_networks_model (settings, network);
420 empathy_account_widget_irc_build (EmpathyAccountWidget *self,
421 const char *filename)
423 EmpathyAccountWidgetIrc *settings;
424 gchar *dir, *user_file_with_path, *global_file_with_path;
426 GtkCellRenderer *renderer;
428 settings = g_slice_new0 (EmpathyAccountWidgetIrc);
429 settings->self = self;
431 dir = g_build_filename (g_get_user_config_dir (), PACKAGE_NAME, NULL);
432 g_mkdir_with_parents (dir, S_IRUSR | S_IWUSR | S_IXUSR);
433 user_file_with_path = g_build_filename (dir, IRC_NETWORKS_FILENAME, NULL);
436 global_file_with_path = g_build_filename (g_getenv ("EMPATHY_SRCDIR"),
437 "libempathy-gtk", IRC_NETWORKS_FILENAME, NULL);
438 if (!g_file_test (global_file_with_path, G_FILE_TEST_EXISTS))
440 g_free (global_file_with_path);
441 global_file_with_path = g_build_filename (DATADIR, "empathy",
442 IRC_NETWORKS_FILENAME, NULL);
445 settings->network_manager = empathy_irc_network_manager_new (
446 global_file_with_path,
447 user_file_with_path);
449 g_free (global_file_with_path);
450 g_free (user_file_with_path);
452 self->ui_details->gui = empathy_builder_get_file (filename,
453 "vbox_irc", &self->ui_details->widget,
454 "table_irc_settings", &settings->vbox_settings,
455 "combobox_network", &settings->combobox_network,
458 /* Fill the networks combobox */
459 store = gtk_list_store_new (2, G_TYPE_OBJECT, G_TYPE_STRING);
461 gtk_cell_layout_clear (GTK_CELL_LAYOUT (settings->combobox_network));
462 renderer = gtk_cell_renderer_text_new ();
463 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (settings->combobox_network),
465 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (settings->combobox_network),
467 "text", COL_NETWORK_NAME,
470 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store),
474 gtk_combo_box_set_model (GTK_COMBO_BOX (settings->combobox_network),
475 GTK_TREE_MODEL (store));
476 g_object_unref (store);
478 account_widget_irc_setup (settings);
480 empathy_account_widget_handle_params (self,
481 "entry_nick", "account",
482 "entry_fullname", "fullname",
483 "entry_password", "password",
484 "entry_quit_message", "quit-message",
487 empathy_builder_connect (self->ui_details->gui, settings,
488 "table_irc_settings", "destroy", account_widget_irc_destroy_cb,
489 "button_network", "clicked",
490 account_widget_irc_button_edit_network_clicked_cb,
491 "button_add_network", "clicked",
492 account_widget_irc_button_add_network_clicked_cb,
493 "button_remove_network", "clicked",
494 account_widget_irc_button_remove_clicked_cb,
495 "combobox_network", "changed",
496 account_widget_irc_combobox_network_changed_cb,
499 self->ui_details->default_focus = g_strdup ("entry_nick");