]> git.0d.be Git - empathy.git/blob - libempathy-gtk/empathy-account-widget-irc.c
Updated Polish translation
[empathy.git] / libempathy-gtk / empathy-account-widget-irc.c
1 /*
2  * Copyright (C) 2007-2008 Guillaume Desmottes
3  *
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.
8  *
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.
13  *
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
17  *
18  * Authors: Guillaume Desmottes <gdesmott@gnome.org>
19  */
20
21 #include "config.h"
22
23 #include <stdlib.h>
24 #include <string.h>
25 #include <sys/stat.h>
26
27 #include <glib/gi18n-lib.h>
28 #include <gtk/gtk.h>
29
30 #include <libempathy/empathy-utils.h>
31 #include <libempathy/empathy-irc-network-manager.h>
32
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"
38
39 #define DEBUG_FLAG EMPATHY_DEBUG_ACCOUNT | EMPATHY_DEBUG_IRC
40 #include <libempathy/empathy-debug.h>
41
42 #define IRC_NETWORKS_FILENAME "irc-networks.xml"
43
44 typedef struct {
45   EmpathyAccountWidget *self;
46   EmpathyIrcNetworkManager *network_manager;
47
48   GtkWidget *vbox_settings;
49
50   GtkWidget *combobox_network;
51 } EmpathyAccountWidgetIrc;
52
53 enum {
54   COL_NETWORK_OBJ,
55   COL_NETWORK_NAME,
56 };
57
58 static void
59 account_widget_irc_destroy_cb (GtkWidget *widget,
60                                EmpathyAccountWidgetIrc *settings)
61 {
62   g_object_unref (settings->network_manager);
63   g_slice_free (EmpathyAccountWidgetIrc, settings);
64 }
65
66 static void
67 unset_server_params (EmpathyAccountWidgetIrc *settings)
68 {
69   EmpathyAccountSettings *ac_settings;
70
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");
76 }
77
78 static void
79 update_server_params (EmpathyAccountWidgetIrc *settings)
80 {
81   GtkTreeIter iter;
82   GtkTreeModel *model;
83   EmpathyIrcNetwork *network;
84   GSList *servers;
85   gchar *charset;
86   EmpathyAccountSettings *ac_settings;
87
88   g_object_get (settings->self, "settings", &ac_settings, NULL);
89
90   if (!gtk_combo_box_get_active_iter (
91         GTK_COMBO_BOX (settings->combobox_network), &iter))
92     {
93       unset_server_params (settings);
94       return;
95     }
96
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);
99
100   g_assert (network != NULL);
101
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);
105   g_free (charset);
106
107   servers = empathy_irc_network_get_servers (network);
108   if (g_slist_length (servers) > 0)
109     {
110       /* set the first server as CM server */
111       EmpathyIrcServer *server = servers->data;
112       gchar *address;
113       guint port;
114       gboolean ssl;
115
116       g_object_get (server,
117           "address", &address,
118           "port", &port,
119           "ssl", &ssl,
120           NULL);
121
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);
128
129       g_free (address);
130     }
131   else
132     {
133       /* No server. Unset values */
134       unset_server_params (settings);
135     }
136
137   g_slist_foreach (servers, (GFunc) g_object_unref, NULL);
138   g_slist_free (servers);
139   g_object_unref (network);
140 }
141
142 static void
143 irc_network_dialog_destroy_cb (GtkWidget *widget,
144                                EmpathyAccountWidgetIrc *settings)
145 {
146   GtkTreeIter iter;
147   GtkTreeModel *model;
148   EmpathyIrcNetwork *network;
149   gchar *name;
150
151   /* name could be changed */
152   gtk_combo_box_get_active_iter (GTK_COMBO_BOX (settings->combobox_network),
153       &iter);
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);
156
157   g_object_get (network, "name", &name, NULL);
158   gtk_list_store_set (GTK_LIST_STORE (model), &iter,
159       COL_NETWORK_NAME, name, -1);
160
161   update_server_params (settings);
162
163   g_object_unref (network);
164   g_free (name);
165 }
166
167 static void
168 display_irc_network_dialog (EmpathyAccountWidgetIrc *settings,
169                             EmpathyIrcNetwork *network)
170 {
171   GtkWindow *window;
172   GtkWidget *dialog;
173
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);
178 }
179
180 static void
181 account_widget_irc_button_edit_network_clicked_cb (
182     GtkWidget *button,
183     EmpathyAccountWidgetIrc *settings)
184 {
185   GtkTreeIter iter;
186   GtkTreeModel *model;
187   EmpathyIrcNetwork *network;
188
189   gtk_combo_box_get_active_iter (GTK_COMBO_BOX (settings->combobox_network),
190       &iter);
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);
193
194   g_assert (network != NULL);
195
196   display_irc_network_dialog (settings, network);
197
198   g_object_unref (network);
199 }
200
201 static void
202 account_widget_irc_button_remove_clicked_cb (GtkWidget *button,
203                                              EmpathyAccountWidgetIrc *settings)
204 {
205   EmpathyIrcNetwork *network;
206   GtkTreeIter iter;
207   GtkTreeModel *model;
208   gchar *name;
209
210   gtk_combo_box_get_active_iter (GTK_COMBO_BOX (settings->combobox_network),
211       &iter);
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);
214
215   g_assert (network != NULL);
216
217   g_object_get (network, "name", &name, NULL);
218   DEBUG ("Remove network %s", name);
219
220   gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
221   empathy_irc_network_manager_remove (settings->network_manager, network);
222
223   /* Select the first network */
224   if (gtk_tree_model_get_iter_first (model, &iter))
225     {
226       gtk_combo_box_set_active_iter (
227           GTK_COMBO_BOX (settings->combobox_network), &iter);
228     }
229
230   g_free (name);
231   g_object_unref (network);
232 }
233
234 static void
235 account_widget_irc_button_add_network_clicked_cb (GtkWidget *button,
236                                                   EmpathyAccountWidgetIrc *settings)
237 {
238   EmpathyIrcNetwork *network;
239   GtkTreeModel *model;
240   GtkListStore *store;
241   gchar *name;
242   GtkTreeIter iter;
243
244   network = empathy_irc_network_new (_("New Network"));
245   empathy_irc_network_manager_add (settings->network_manager, network);
246
247   model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
248   store = GTK_LIST_STORE (model);
249
250   g_object_get (network, "name", &name, NULL);
251
252   gtk_list_store_insert_with_values (store, &iter, -1,
253       COL_NETWORK_OBJ, network,
254       COL_NETWORK_NAME, name,
255       -1);
256
257   gtk_combo_box_set_active_iter (GTK_COMBO_BOX (settings->combobox_network),
258       &iter);
259
260   display_irc_network_dialog (settings, network);
261
262   g_free (name);
263   g_object_unref (network);
264 }
265
266 static void
267 account_widget_irc_combobox_network_changed_cb (GtkWidget *combobox,
268                                                 EmpathyAccountWidgetIrc *settings)
269 {
270   update_server_params (settings);
271   empathy_account_widget_changed (settings->self);
272 }
273
274 static void
275 fill_networks_model (EmpathyAccountWidgetIrc *settings,
276                      EmpathyIrcNetwork *network_to_select)
277 {
278   GSList *networks, *l;
279   GtkTreeModel *model;
280   GtkListStore *store;
281
282   networks = empathy_irc_network_manager_get_networks (
283       settings->network_manager);
284
285   model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
286   store = GTK_LIST_STORE (model);
287
288   for (l = networks; l != NULL; l = g_slist_next (l))
289     {
290       gchar *name;
291       EmpathyIrcNetwork *network = l->data;
292       GtkTreeIter iter;
293
294       g_object_get (network, "name", &name, NULL);
295
296       gtk_list_store_insert_with_values (store, &iter, -1,
297           COL_NETWORK_OBJ, network,
298           COL_NETWORK_NAME, name,
299           -1);
300
301        if (network == network_to_select)
302          {
303            gtk_combo_box_set_active_iter (
304                GTK_COMBO_BOX (settings->combobox_network), &iter);
305          }
306
307       g_free (name);
308       g_object_unref (network);
309     }
310
311   if (network_to_select == NULL)
312     {
313       /* Select the first network */
314       GtkTreeIter iter;
315
316       if (gtk_tree_model_get_iter_first (model, &iter))
317         {
318           gtk_combo_box_set_active_iter (
319               GTK_COMBO_BOX (settings->combobox_network), &iter);
320
321           update_server_params (settings);
322         }
323     }
324
325   g_slist_free (networks);
326 }
327
328 static void
329 account_widget_irc_setup (EmpathyAccountWidgetIrc *settings)
330 {
331   const gchar *nick = NULL;
332   const gchar *fullname = NULL;
333   const gchar *server = NULL;
334   gint port = 6667;
335   const gchar *charset;
336   gboolean ssl = FALSE;
337   EmpathyIrcNetwork *network = NULL;
338   EmpathyAccountSettings *ac_settings;
339
340   g_object_get (settings->self, "settings", &ac_settings, NULL);
341
342   nick = empathy_account_settings_get_string (ac_settings, "account");
343   fullname = empathy_account_settings_get_string (ac_settings,
344       "fullname");
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");
349
350   if (!nick)
351     {
352       nick = g_strdup (g_get_user_name ());
353       empathy_account_settings_set_string (ac_settings,
354         "account", nick);
355     }
356
357   if (!fullname)
358     {
359       fullname = g_strdup (g_get_real_name ());
360       if (!fullname)
361         {
362           fullname = g_strdup (nick);
363         }
364       empathy_account_settings_set_string (ac_settings,
365           "fullname", fullname);
366     }
367
368   if (server != NULL)
369     {
370       GtkListStore *store;
371
372       network = empathy_irc_network_manager_find_network_by_address (
373           settings->network_manager, server);
374
375
376       store = GTK_LIST_STORE (gtk_combo_box_get_model (
377             GTK_COMBO_BOX (settings->combobox_network)));
378
379       if (network != NULL)
380         {
381           gchar *name;
382
383           g_object_set (network, "charset", charset, NULL);
384
385           g_object_get (network, "name", &name, NULL);
386           DEBUG ("Account use network %s", name);
387
388           g_free (name);
389         }
390       else
391         {
392           /* We don't have this network. Let's create it */
393           EmpathyIrcServer *srv;
394           GtkTreeIter iter;
395
396           DEBUG ("Create a network %s", server);
397           network = empathy_irc_network_new (server);
398           srv = empathy_irc_server_new (server, port, ssl);
399
400           empathy_irc_network_append_server (network, srv);
401           empathy_irc_network_manager_add (settings->network_manager, network);
402
403           gtk_list_store_insert_with_values (store, &iter, -1,
404               COL_NETWORK_OBJ, network,
405               COL_NETWORK_NAME, server,
406               -1);
407
408           gtk_combo_box_set_active_iter (
409               GTK_COMBO_BOX (settings->combobox_network), &iter);
410
411           g_object_unref (srv);
412           g_object_unref (network);
413         }
414     }
415
416
417   fill_networks_model (settings, network);
418 }
419
420 void
421 empathy_account_widget_irc_build (EmpathyAccountWidget *self,
422     const char *filename,
423     GtkWidget **table_common_settings)
424 {
425   EmpathyAccountWidgetIrc *settings;
426   gchar *dir, *user_file_with_path, *global_file_with_path;
427   GtkListStore *store;
428   GtkCellRenderer *renderer;
429
430   settings = g_slice_new0 (EmpathyAccountWidgetIrc);
431   settings->self = self;
432
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);
436   g_free (dir);
437
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))
441     {
442       g_free (global_file_with_path);
443       global_file_with_path = g_build_filename (DATADIR, "empathy",
444           IRC_NETWORKS_FILENAME, NULL);
445     }
446
447   settings->network_manager = empathy_irc_network_manager_new (
448       global_file_with_path,
449       user_file_with_path);
450
451   g_free (global_file_with_path);
452   g_free (user_file_with_path);
453
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,
459       NULL);
460
461   /* Fill the networks combobox */
462   store = gtk_list_store_new (2, G_TYPE_OBJECT, G_TYPE_STRING);
463
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),
467       renderer, TRUE);
468   gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (settings->combobox_network),
469       renderer,
470       "text", COL_NETWORK_NAME,
471       NULL);
472
473   gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store),
474       COL_NETWORK_NAME,
475       GTK_SORT_ASCENDING);
476
477   gtk_combo_box_set_model (GTK_COMBO_BOX (settings->combobox_network),
478       GTK_TREE_MODEL (store));
479   g_object_unref (store);
480
481   account_widget_irc_setup (settings);
482
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",
488       NULL);
489
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,
500       NULL);
501
502   self->ui_details->default_focus = g_strdup ("entry_nick");
503 }