]> git.0d.be Git - empathy.git/blob - libempathy-gtk/empathy-account-widget-irc.c
Updated Oriya 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 <libmissioncontrol/mc-protocol.h>
31
32 #include <libempathy/empathy-utils.h>
33 #include <libempathy/empathy-irc-network-manager.h>
34
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"
39
40 #define DEBUG_FLAG EMPATHY_DEBUG_ACCOUNT | EMPATHY_DEBUG_IRC
41 #include <libempathy/empathy-debug.h>
42
43 #define IRC_NETWORKS_FILENAME "irc-networks.xml"
44
45 typedef struct {
46   EmpathyAccount *account;
47   EmpathyIrcNetworkManager *network_manager;
48
49   GtkWidget *vbox_settings;
50
51   GtkWidget *combobox_network;
52 } EmpathyAccountWidgetIrc;
53
54 enum {
55   COL_NETWORK_OBJ,
56   COL_NETWORK_NAME,
57 };
58
59 static void
60 account_widget_irc_destroy_cb (GtkWidget *widget,
61                                EmpathyAccountWidgetIrc *settings)
62 {
63   g_object_unref (settings->network_manager);
64   g_object_unref (settings->account);
65   g_slice_free (EmpathyAccountWidgetIrc, settings);
66 }
67
68 static void
69 unset_server_params (EmpathyAccountWidgetIrc *settings)
70 {
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");
75 }
76
77 static void
78 update_server_params (EmpathyAccountWidgetIrc *settings)
79 {
80   GtkTreeIter iter;
81   GtkTreeModel *model;
82   EmpathyIrcNetwork *network;
83   GSList *servers;
84   gchar *charset;
85
86   if (!gtk_combo_box_get_active_iter (
87         GTK_COMBO_BOX (settings->combobox_network), &iter))
88     {
89       unset_server_params (settings);
90       return;
91     }
92
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);
95
96   g_assert (network != NULL);
97
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);
101   g_free (charset);
102
103   servers = empathy_irc_network_get_servers (network);
104   if (g_slist_length (servers) > 0)
105     {
106       /* set the first server as CM server */
107       EmpathyIrcServer *server = servers->data;
108       gchar *address;
109       guint port;
110       gboolean ssl;
111
112       g_object_get (server,
113           "address", &address,
114           "port", &port,
115           "ssl", &ssl,
116           NULL);
117
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);
124
125       g_free (address);
126     }
127   else
128     {
129       /* No server. Unset values */
130       unset_server_params (settings);
131     }
132
133   g_slist_foreach (servers, (GFunc) g_object_unref, NULL);
134   g_slist_free (servers);
135   g_object_unref (network);
136 }
137
138 static void
139 irc_network_dialog_destroy_cb (GtkWidget *widget,
140                                EmpathyAccountWidgetIrc *settings)
141 {
142   GtkTreeIter iter;
143   GtkTreeModel *model;
144   EmpathyIrcNetwork *network;
145   gchar *name;
146
147   /* name could be changed */
148   gtk_combo_box_get_active_iter (GTK_COMBO_BOX (settings->combobox_network),
149       &iter);
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);
152
153   g_object_get (network, "name", &name, NULL);
154   gtk_list_store_set (GTK_LIST_STORE (model), &iter,
155       COL_NETWORK_NAME, name, -1);
156
157   update_server_params (settings);
158
159   g_object_unref (network);
160   g_free (name);
161 }
162
163 static void
164 display_irc_network_dialog (EmpathyAccountWidgetIrc *settings,
165                             EmpathyIrcNetwork *network)
166 {
167   GtkWindow *window;
168   GtkWidget *dialog;
169
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);
174 }
175
176 static void
177 account_widget_irc_button_edit_network_clicked_cb (
178     GtkWidget *button,
179     EmpathyAccountWidgetIrc *settings)
180 {
181   GtkTreeIter iter;
182   GtkTreeModel *model;
183   EmpathyIrcNetwork *network;
184
185   gtk_combo_box_get_active_iter (GTK_COMBO_BOX (settings->combobox_network),
186       &iter);
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);
189
190   g_assert (network != NULL);
191
192   display_irc_network_dialog (settings, network);
193
194   g_object_unref (network);
195 }
196
197 static void
198 account_widget_irc_button_remove_clicked_cb (GtkWidget *button,
199                                              EmpathyAccountWidgetIrc *settings)
200 {
201   EmpathyIrcNetwork *network;
202   GtkTreeIter iter;
203   GtkTreeModel *model;
204   gchar *name;
205
206   gtk_combo_box_get_active_iter (GTK_COMBO_BOX (settings->combobox_network),
207       &iter);
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);
210
211   g_assert (network != NULL);
212
213   g_object_get (network, "name", &name, NULL);
214   DEBUG ("Remove network %s", name);
215
216   gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
217   empathy_irc_network_manager_remove (settings->network_manager, network);
218
219   /* Select the first network */
220   if (gtk_tree_model_get_iter_first (model, &iter))
221     {
222       gtk_combo_box_set_active_iter (
223           GTK_COMBO_BOX (settings->combobox_network), &iter);
224     }
225
226   g_free (name);
227   g_object_unref (network);
228 }
229
230 static void
231 account_widget_irc_button_add_network_clicked_cb (GtkWidget *button,
232                                                   EmpathyAccountWidgetIrc *settings)
233 {
234   EmpathyIrcNetwork *network;
235   GtkTreeModel *model;
236   GtkListStore *store;
237   gchar *name;
238   GtkTreeIter iter;
239
240   network = empathy_irc_network_new (_("New Network"));
241   empathy_irc_network_manager_add (settings->network_manager, network);
242
243   model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
244   store = GTK_LIST_STORE (model);
245
246   g_object_get (network, "name", &name, NULL);
247
248   gtk_list_store_insert_with_values (store, &iter, -1,
249       COL_NETWORK_OBJ, network,
250       COL_NETWORK_NAME, name,
251       -1);
252
253   gtk_combo_box_set_active_iter (GTK_COMBO_BOX (settings->combobox_network),
254       &iter);
255
256   display_irc_network_dialog (settings, network);
257
258   g_free (name);
259   g_object_unref (network);
260 }
261
262 static void
263 account_widget_irc_combobox_network_changed_cb (GtkWidget *combobox,
264                                                 EmpathyAccountWidgetIrc *settings)
265 {
266   update_server_params (settings);
267 }
268
269 static void
270 fill_networks_model (EmpathyAccountWidgetIrc *settings,
271                      EmpathyIrcNetwork *network_to_select)
272 {
273   GSList *networks, *l;
274   GtkTreeModel *model;
275   GtkListStore *store;
276
277   networks = empathy_irc_network_manager_get_networks (
278       settings->network_manager);
279
280   model = gtk_combo_box_get_model (GTK_COMBO_BOX (settings->combobox_network));
281   store = GTK_LIST_STORE (model);
282
283   for (l = networks; l != NULL; l = g_slist_next (l))
284     {
285       gchar *name;
286       EmpathyIrcNetwork *network = l->data;
287       GtkTreeIter iter;
288
289       g_object_get (network, "name", &name, NULL);
290
291       gtk_list_store_insert_with_values (store, &iter, -1,
292           COL_NETWORK_OBJ, network,
293           COL_NETWORK_NAME, name,
294           -1);
295
296        if (network == network_to_select)
297          {
298            gtk_combo_box_set_active_iter (
299                GTK_COMBO_BOX (settings->combobox_network), &iter);
300          }
301
302       g_free (name);
303       g_object_unref (network);
304     }
305
306   if (network_to_select == NULL)
307     {
308       /* Select the first network */
309       GtkTreeIter iter;
310
311       if (gtk_tree_model_get_iter_first (model, &iter))
312         {
313           gtk_combo_box_set_active_iter (
314               GTK_COMBO_BOX (settings->combobox_network), &iter);
315
316           update_server_params (settings);
317         }
318     }
319
320   g_slist_free (networks);
321 }
322
323 static void
324 account_widget_irc_setup (EmpathyAccountWidgetIrc *settings)
325 {
326   gchar *nick = NULL;
327   gchar *fullname = NULL;
328   gchar *server = NULL;
329   gint port = 6667;
330   gchar *charset;
331   gboolean ssl = FALSE;
332   EmpathyIrcNetwork *network = NULL;
333
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");
340
341   if (!nick)
342     {
343       nick = g_strdup (g_get_user_name ());
344       empathy_account_set_param_string (settings->account, "account", nick);
345     }
346
347   if (!fullname)
348     {
349       fullname = g_strdup (g_get_real_name ());
350       if (!fullname)
351         {
352           fullname = g_strdup (nick);
353         }
354       empathy_account_set_param_string (settings->account, "fullname", fullname);
355     }
356
357   if (server != NULL)
358     {
359       GtkListStore *store;
360
361       network = empathy_irc_network_manager_find_network_by_address (
362           settings->network_manager, server);
363
364
365       store = GTK_LIST_STORE (gtk_combo_box_get_model (
366             GTK_COMBO_BOX (settings->combobox_network)));
367
368       if (network != NULL)
369         {
370           gchar *name;
371
372           g_object_set (network, "charset", charset, NULL);
373
374           g_object_get (network, "name", &name, NULL);
375           DEBUG ("Account use network %s", name);
376
377           g_free (name);
378         }
379       else
380         {
381           /* We don't have this network. Let's create it */
382           EmpathyIrcServer *srv;
383           GtkTreeIter iter;
384
385           DEBUG ("Create a network %s", server);
386           network = empathy_irc_network_new (server);
387           srv = empathy_irc_server_new (server, port, ssl);
388
389           empathy_irc_network_append_server (network, srv);
390           empathy_irc_network_manager_add (settings->network_manager, network);
391
392           gtk_list_store_insert_with_values (store, &iter, -1,
393               COL_NETWORK_OBJ, network,
394               COL_NETWORK_NAME, server,
395               -1);
396
397           gtk_combo_box_set_active_iter (
398               GTK_COMBO_BOX (settings->combobox_network), &iter);
399
400           g_object_unref (srv);
401           g_object_unref (network);
402         }
403     }
404
405
406   fill_networks_model (settings, network);
407
408   g_free (nick);
409   g_free (fullname);
410   g_free (server);
411   g_free (charset);
412 }
413
414 /**
415  * empathy_account_widget_irc_new:
416  * @account: the #EmpathyAccount to configure
417  *
418  * Creates a new IRC account widget to configure a given #EmpathyAccount
419  *
420  * Returns: The toplevel container of the configuration widget
421  */
422 GtkWidget *
423 empathy_account_widget_irc_new (EmpathyAccount *account)
424 {
425   EmpathyAccountWidgetIrc *settings;
426   gchar *dir, *user_file_with_path, *global_file_with_path;
427   GtkBuilder *gui;
428   GtkListStore *store;
429   GtkCellRenderer *renderer;
430   gchar *filename;
431
432   settings = g_slice_new0 (EmpathyAccountWidgetIrc);
433   settings->account = g_object_ref (account);
434
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);
438   g_free (dir);
439
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))
443     {
444       g_free (global_file_with_path);
445       global_file_with_path = g_build_filename (DATADIR, "empathy",
446           IRC_NETWORKS_FILENAME, NULL);
447     }
448
449   settings->network_manager = empathy_irc_network_manager_new (
450       global_file_with_path,
451       user_file_with_path);
452
453   g_free (global_file_with_path);
454   g_free (user_file_with_path);
455
456   filename = empathy_file_lookup ("empathy-account-widget-irc.ui",
457       "libempathy-gtk");
458   gui = empathy_builder_get_file (filename,
459       "vbox_irc_settings", &settings->vbox_settings,
460       "combobox_network", &settings->combobox_network,
461       NULL);
462   g_free (filename);
463
464   /* Fill the networks combobox */
465   store = gtk_list_store_new (2, G_TYPE_OBJECT, G_TYPE_STRING);
466
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),
470       renderer, TRUE);
471   gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (settings->combobox_network),
472       renderer,
473       "text", COL_NETWORK_NAME,
474       NULL);
475
476   gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store),
477       COL_NETWORK_NAME,
478       GTK_SORT_ASCENDING);
479
480   gtk_combo_box_set_model (GTK_COMBO_BOX (settings->combobox_network),
481       GTK_TREE_MODEL (store));
482   g_object_unref (store);
483
484   account_widget_irc_setup (settings);
485
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",
491       NULL);
492
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,
499       NULL);
500
501   empathy_account_widget_set_default_focus (gui, "entry_nick");
502
503   return empathy_builder_unref_and_keep_widget (gui, settings->vbox_settings);
504 }