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);
271 empathy_account_widget_changed (settings->self);
275 fill_networks_model (EmpathyAccountWidgetIrc *settings,
276 EmpathyIrcNetwork *network_to_select)
278 GSList *networks, *l;
282 networks = empathy_irc_network_manager_get_networks (
283 settings->network_manager);
285 model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
286 store = GTK_LIST_STORE (model);
288 for (l = networks; l != NULL; l = g_slist_next (l))
291 EmpathyIrcNetwork *network = l->data;
294 g_object_get (network, "name", &name, NULL);
296 gtk_list_store_insert_with_values (store, &iter, -1,
297 COL_NETWORK_OBJ, network,
298 COL_NETWORK_NAME, name,
301 if (network == network_to_select)
303 gtk_combo_box_set_active_iter (
304 GTK_COMBO_BOX (settings->combobox_network), &iter);
308 g_object_unref (network);
311 if (network_to_select == NULL)
313 /* Select the first network */
316 if (gtk_tree_model_get_iter_first (model, &iter))
318 gtk_combo_box_set_active_iter (
319 GTK_COMBO_BOX (settings->combobox_network), &iter);
321 update_server_params (settings);
325 g_slist_free (networks);
329 account_widget_irc_setup (EmpathyAccountWidgetIrc *settings)
331 const gchar *nick = NULL;
332 const gchar *fullname = NULL;
333 const gchar *server = NULL;
335 const gchar *charset;
336 gboolean ssl = FALSE;
337 EmpathyIrcNetwork *network = NULL;
338 EmpathyAccountSettings *ac_settings;
340 g_object_get (settings->self, "settings", &ac_settings, NULL);
342 nick = empathy_account_settings_get_string (ac_settings, "account");
343 fullname = empathy_account_settings_get_string (ac_settings,
345 server = empathy_account_settings_get_string (ac_settings, "server");
346 charset = empathy_account_settings_get_string (ac_settings, "charset");
347 port = empathy_account_settings_get_uint32 (ac_settings, "port");
348 ssl = empathy_account_settings_get_boolean (ac_settings, "use-ssl");
352 nick = g_strdup (g_get_user_name ());
353 empathy_account_settings_set_string (ac_settings,
359 fullname = g_strdup (g_get_real_name ());
362 fullname = g_strdup (nick);
364 empathy_account_settings_set_string (ac_settings,
365 "fullname", fullname);
372 network = empathy_irc_network_manager_find_network_by_address (
373 settings->network_manager, server);
376 store = GTK_LIST_STORE (gtk_combo_box_get_model (
377 GTK_COMBO_BOX (settings->combobox_network)));
383 g_object_set (network, "charset", charset, NULL);
385 g_object_get (network, "name", &name, NULL);
386 DEBUG ("Account use network %s", name);
392 /* We don't have this network. Let's create it */
393 EmpathyIrcServer *srv;
396 DEBUG ("Create a network %s", server);
397 network = empathy_irc_network_new (server);
398 srv = empathy_irc_server_new (server, port, ssl);
400 empathy_irc_network_append_server (network, srv);
401 empathy_irc_network_manager_add (settings->network_manager, network);
403 gtk_list_store_insert_with_values (store, &iter, -1,
404 COL_NETWORK_OBJ, network,
405 COL_NETWORK_NAME, server,
408 gtk_combo_box_set_active_iter (
409 GTK_COMBO_BOX (settings->combobox_network), &iter);
411 g_object_unref (srv);
412 g_object_unref (network);
417 fill_networks_model (settings, network);
421 empathy_account_widget_irc_build (EmpathyAccountWidget *self,
422 const char *filename,
423 GtkWidget **table_common_settings)
425 EmpathyAccountWidgetIrc *settings;
426 gchar *dir, *user_file_with_path, *global_file_with_path;
428 GtkCellRenderer *renderer;
430 settings = g_slice_new0 (EmpathyAccountWidgetIrc);
431 settings->self = self;
433 dir = g_build_filename (g_get_user_config_dir (), PACKAGE_NAME, NULL);
434 g_mkdir_with_parents (dir, S_IRUSR | S_IWUSR | S_IXUSR);
435 user_file_with_path = g_build_filename (dir, IRC_NETWORKS_FILENAME, NULL);
438 global_file_with_path = g_build_filename (g_getenv ("EMPATHY_SRCDIR"),
439 "libempathy-gtk", IRC_NETWORKS_FILENAME, NULL);
440 if (!g_file_test (global_file_with_path, G_FILE_TEST_EXISTS))
442 g_free (global_file_with_path);
443 global_file_with_path = g_build_filename (DATADIR, "empathy",
444 IRC_NETWORKS_FILENAME, NULL);
447 settings->network_manager = empathy_irc_network_manager_new (
448 global_file_with_path,
449 user_file_with_path);
451 g_free (global_file_with_path);
452 g_free (user_file_with_path);
454 self->ui_details->gui = empathy_builder_get_file (filename,
455 "table_irc_settings", table_common_settings,
456 "vbox_irc", &self->ui_details->widget,
457 "table_irc_settings", &settings->vbox_settings,
458 "combobox_network", &settings->combobox_network,
461 /* Fill the networks combobox */
462 store = gtk_list_store_new (2, G_TYPE_OBJECT, G_TYPE_STRING);
464 gtk_cell_layout_clear (GTK_CELL_LAYOUT (settings->combobox_network));
465 renderer = gtk_cell_renderer_text_new ();
466 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (settings->combobox_network),
468 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (settings->combobox_network),
470 "text", COL_NETWORK_NAME,
473 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store),
477 gtk_combo_box_set_model (GTK_COMBO_BOX (settings->combobox_network),
478 GTK_TREE_MODEL (store));
479 g_object_unref (store);
481 account_widget_irc_setup (settings);
483 empathy_account_widget_handle_params (self,
484 "entry_nick", "account",
485 "entry_fullname", "fullname",
486 "entry_password", "password",
487 "entry_quit_message", "quit-message",
490 empathy_builder_connect (self->ui_details->gui, settings,
491 "table_irc_settings", "destroy", account_widget_irc_destroy_cb,
492 "button_network", "clicked",
493 account_widget_irc_button_edit_network_clicked_cb,
494 "button_add_network", "clicked",
495 account_widget_irc_button_add_network_clicked_cb,
496 "button_remove_network", "clicked",
497 account_widget_irc_button_remove_clicked_cb,
498 "combobox_network", "changed",
499 account_widget_irc_combobox_network_changed_cb,
502 self->ui_details->default_focus = g_strdup ("entry_nick");