2 * Copyright (C) 2007-2008 Guillaume Desmottes
3 * Copyright (C) 2010 Collabora Ltd.
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 * Authors: Guillaume Desmottes <gdesmott@gnome.org>
28 #include <glib/gi18n-lib.h>
31 #include <libempathy/empathy-utils.h>
32 #include <libempathy/empathy-irc-network-manager.h>
34 #include "empathy-irc-network-dialog.h"
35 #include "empathy-ui-utils.h"
37 #define DEBUG_FLAG EMPATHY_DEBUG_ACCOUNT | EMPATHY_DEBUG_IRC
38 #include <libempathy/empathy-debug.h>
40 #include "empathy-irc-network-chooser.h"
42 #define DEFAULT_IRC_NETWORK "irc.gimp.org"
44 #define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyIrcNetworkChooser)
51 EmpathyAccountSettings *settings;
53 EmpathyIrcNetworkManager *network_manager;
54 /* Displayed network */
55 EmpathyIrcNetwork *network;
56 } EmpathyIrcNetworkChooserPriv;
58 G_DEFINE_TYPE (EmpathyIrcNetworkChooser, empathy_irc_network_chooser,
62 empathy_irc_network_chooser_set_property (GObject *object,
67 EmpathyIrcNetworkChooserPriv *priv = GET_PRIV (object);
72 priv->settings = g_value_dup_object (value);
75 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
81 empathy_irc_network_chooser_get_property (GObject *object,
86 EmpathyIrcNetworkChooserPriv *priv = GET_PRIV (object);
91 g_value_set_object (value, priv->settings);
94 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
100 unset_server_params (EmpathyIrcNetworkChooser *self)
102 EmpathyIrcNetworkChooserPriv *priv = GET_PRIV (self);
104 DEBUG ("Unset server, port and use-ssl");
105 empathy_account_settings_unset (priv->settings, "server");
106 empathy_account_settings_unset (priv->settings, "port");
107 empathy_account_settings_unset (priv->settings, "use-ssl");
111 update_server_params (EmpathyIrcNetworkChooser *self)
113 EmpathyIrcNetworkChooserPriv *priv = GET_PRIV (self);
117 g_assert (priv->network != NULL);
119 g_object_get (priv->network, "charset", &charset, NULL);
120 DEBUG ("Setting charset to %s", charset);
121 empathy_account_settings_set_string (priv->settings, "charset", charset);
124 servers = empathy_irc_network_get_servers (priv->network);
125 if (g_slist_length (servers) > 0)
127 /* set the first server as CM server */
128 EmpathyIrcServer *server = servers->data;
133 g_object_get (server,
139 DEBUG ("Setting server to %s", address);
140 empathy_account_settings_set_string (priv->settings, "server", address);
141 DEBUG ("Setting port to %u", port);
142 empathy_account_settings_set_uint32 (priv->settings, "port", port);
143 DEBUG ("Setting use-ssl to %s", ssl ? "TRUE": "FALSE" );
144 empathy_account_settings_set_boolean (priv->settings, "use-ssl", ssl);
150 /* No server. Unset values */
151 unset_server_params (self);
154 g_slist_foreach (servers, (GFunc) g_object_unref, NULL);
155 g_slist_free (servers);
159 set_label (EmpathyIrcNetworkChooser *self)
161 EmpathyIrcNetworkChooserPriv *priv = GET_PRIV (self);
164 g_assert (priv->network != NULL);
165 g_object_get (priv->network, "name", &name, NULL);
167 gtk_button_set_label (GTK_BUTTON (self), name);
172 set_label_from_settings (EmpathyIrcNetworkChooser *self)
174 EmpathyIrcNetworkChooserPriv *priv = GET_PRIV (self);
177 tp_clear_object (&priv->network);
179 server = empathy_account_settings_get_string (priv->settings, "server");
183 EmpathyIrcServer *srv;
187 priv->network = empathy_irc_network_manager_find_network_by_address (
188 priv->network_manager, server);
190 if (priv->network != NULL)
192 /* The network is known */
193 g_object_ref (priv->network);
198 /* We don't have this network. Let's create it */
199 port = empathy_account_settings_get_uint32 (priv->settings, "port");
200 ssl = empathy_account_settings_get_boolean (priv->settings,
203 DEBUG ("Create a network %s", server);
204 priv->network = empathy_irc_network_new (server);
205 srv = empathy_irc_server_new (server, port, ssl);
207 empathy_irc_network_append_server (priv->network, srv);
208 empathy_irc_network_manager_add (priv->network_manager, priv->network);
212 g_object_unref (srv);
216 /* Set default network */
217 priv->network = empathy_irc_network_manager_find_network_by_address (
218 priv->network_manager, DEFAULT_IRC_NETWORK);
219 g_assert (priv->network != NULL);
222 update_server_params (self);
223 g_object_ref (priv->network);
227 clicked_cb (GtkButton *button,
230 /* TODO: open edit dialog */
234 empathy_irc_network_chooser_constructed (GObject *object)
236 EmpathyIrcNetworkChooser *self = (EmpathyIrcNetworkChooser *) object;
237 EmpathyIrcNetworkChooserPriv *priv = GET_PRIV (self);
239 g_assert (priv->settings != NULL);
241 set_label_from_settings (self);
243 g_signal_connect (self, "clicked", G_CALLBACK (clicked_cb), self);
247 empathy_irc_network_chooser_dispose (GObject *object)
249 EmpathyIrcNetworkManager *self = (EmpathyIrcNetworkManager *) object;
250 EmpathyIrcNetworkChooserPriv *priv = GET_PRIV (self);
252 tp_clear_object (&priv->settings);
253 tp_clear_object (&priv->network_manager);
254 tp_clear_object (&priv->network);
256 if (G_OBJECT_CLASS (empathy_irc_network_chooser_parent_class)->dispose)
257 G_OBJECT_CLASS (empathy_irc_network_chooser_parent_class)->dispose (object);
261 empathy_irc_network_chooser_class_init (EmpathyIrcNetworkChooserClass *klass)
263 GObjectClass *object_class = G_OBJECT_CLASS (klass);
265 object_class->get_property = empathy_irc_network_chooser_get_property;
266 object_class->set_property = empathy_irc_network_chooser_set_property;
267 object_class->constructed = empathy_irc_network_chooser_constructed;
268 object_class->dispose = empathy_irc_network_chooser_dispose;
270 g_object_class_install_property (object_class, PROP_SETTINGS,
271 g_param_spec_object ("settings",
273 "The EmpathyAccountSettings to show and edit",
274 EMPATHY_TYPE_ACCOUNT_SETTINGS,
275 G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
277 g_type_class_add_private (object_class,
278 sizeof (EmpathyIrcNetworkChooserPriv));
282 empathy_irc_network_chooser_init (EmpathyIrcNetworkChooser *self)
284 EmpathyIrcNetworkChooserPriv *priv;
286 priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
287 EMPATHY_TYPE_IRC_NETWORK_CHOOSER, EmpathyIrcNetworkChooserPriv);
290 priv->network_manager = empathy_irc_network_manager_dup_default ();
294 empathy_irc_network_chooser_new (EmpathyAccountSettings *settings)
296 return g_object_new (EMPATHY_TYPE_IRC_NETWORK_CHOOSER,
297 "settings", settings,