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>
23 #include "tpaw-irc-network-chooser.h"
25 #include "tpaw-irc-network-chooser-dialog.h"
26 #include "tpaw-irc-network-manager.h"
27 #include "tpaw-utils.h"
28 #include "empathy-ui-utils.h"
29 #include "empathy-utils.h"
31 #define DEBUG_FLAG EMPATHY_DEBUG_ACCOUNT | EMPATHY_DEBUG_IRC
32 #include "empathy-debug.h"
34 #define DEFAULT_IRC_NETWORK "irc.gimp.org"
35 #define DEFAULT_IRC_PORT 6667
36 #define DEFAULT_IRC_SSL FALSE
47 static guint signals[LAST_SIGNAL] = { 0 };
49 struct _TpawIrcNetworkChooserPriv {
50 TpawAccountSettings *settings;
52 TpawIrcNetworkManager *network_manager;
54 /* Displayed network */
55 TpawIrcNetwork *network;
58 G_DEFINE_TYPE (TpawIrcNetworkChooser, tpaw_irc_network_chooser,
62 tpaw_irc_network_chooser_set_property (GObject *object,
67 TpawIrcNetworkChooser *self = TPAW_IRC_NETWORK_CHOOSER (object);
72 self->priv->settings = g_value_dup_object (value);
75 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
81 tpaw_irc_network_chooser_get_property (GObject *object,
86 TpawIrcNetworkChooser *self = TPAW_IRC_NETWORK_CHOOSER (object);
91 g_value_set_object (value, self->priv->settings);
94 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
100 unset_server_params (TpawIrcNetworkChooser *self)
102 DEBUG ("Unset server, port and use-ssl");
103 tpaw_account_settings_unset (self->priv->settings, "server");
104 tpaw_account_settings_unset (self->priv->settings, "port");
105 tpaw_account_settings_unset (self->priv->settings, "use-ssl");
109 dup_network_service (TpawIrcNetwork *network)
111 /* Account.Service has to be a lower case alphanumeric string which may
112 * also contain '-' but not start with it. */
113 #define VALID G_CSET_a_2_z G_CSET_DIGITS "-"
114 gchar *service, *tmp;
116 service = g_strdup (tpaw_irc_network_get_name (network));
117 service = g_strstrip (service);
119 if (tp_str_empty (service))
126 service = g_ascii_strdown (service, -1);
129 service = g_strcanon (service, VALID, '-');
131 if (service[0] == '-')
134 service = g_strdup (service + 1);
143 update_server_params (TpawIrcNetworkChooser *self)
146 const gchar *charset;
148 g_assert (self->priv->network != NULL);
150 charset = tpaw_irc_network_get_charset (self->priv->network);
151 DEBUG ("Setting charset to %s", charset);
152 tpaw_account_settings_set (self->priv->settings, "charset",
153 g_variant_new_string (charset));
155 servers = tpaw_irc_network_get_servers (self->priv->network);
156 if (g_slist_length (servers) > 0)
158 /* set the first server as CM server */
159 TpawIrcServer *server = servers->data;
165 g_object_get (server,
171 DEBUG ("Setting server to %s", address);
172 tpaw_account_settings_set (self->priv->settings, "server",
173 g_variant_new_string (address));
174 DEBUG ("Setting port to %u", port);
175 tpaw_account_settings_set (self->priv->settings, "port",
176 g_variant_new_uint32 (port));
177 DEBUG ("Setting use-ssl to %s", ssl ? "TRUE": "FALSE" );
178 tpaw_account_settings_set (self->priv->settings, "use-ssl",
179 g_variant_new_boolean (ssl));
181 /* Set Account.Service */
182 service = dup_network_service (self->priv->network);
183 DEBUG ("Setting Service to %s", service);
184 tpaw_account_settings_set_service (self->priv->settings, service);
191 /* No server. Unset values */
192 unset_server_params (self);
195 g_slist_foreach (servers, (GFunc) g_object_unref, NULL);
196 g_slist_free (servers);
200 set_label (TpawIrcNetworkChooser *self)
202 g_assert (self->priv->network != NULL);
204 gtk_button_set_label (GTK_BUTTON (self),
205 tpaw_irc_network_get_name (self->priv->network));
209 set_label_from_settings (TpawIrcNetworkChooser *self)
213 tp_clear_object (&self->priv->network);
215 server = tpaw_account_settings_dup_string (self->priv->settings, "server");
223 self->priv->network =
224 tpaw_irc_network_manager_find_network_by_address (
225 self->priv->network_manager, server);
227 if (self->priv->network != NULL)
229 /* The network is known */
230 g_object_ref (self->priv->network);
235 /* We don't have this network. Let's create it */
236 port = tpaw_account_settings_get_uint32 (self->priv->settings, "port");
237 ssl = tpaw_account_settings_get_boolean (self->priv->settings,
240 DEBUG ("Create a network %s", server);
241 self->priv->network = tpaw_irc_network_new (server);
242 srv = tpaw_irc_server_new (server, port, ssl);
244 tpaw_irc_network_append_server (self->priv->network, srv);
245 tpaw_irc_network_manager_add (self->priv->network_manager,
246 self->priv->network);
250 g_object_unref (srv);
255 /* Set default network */
256 self->priv->network = tpaw_irc_network_manager_find_network_by_address (
257 self->priv->network_manager, DEFAULT_IRC_NETWORK);
259 if (self->priv->network == NULL)
261 /* Default network is not known, recreate it */
264 self->priv->network = tpaw_irc_network_new (DEFAULT_IRC_NETWORK);
266 srv = tpaw_irc_server_new (DEFAULT_IRC_NETWORK, DEFAULT_IRC_PORT,
269 tpaw_irc_network_append_server (self->priv->network, srv);
270 tpaw_irc_network_manager_add (self->priv->network_manager,
271 self->priv->network);
273 g_object_unref (srv);
277 update_server_params (self);
278 g_object_ref (self->priv->network);
282 dialog_response_cb (GtkDialog *dialog,
284 TpawIrcNetworkChooser *self)
286 TpawIrcNetworkChooserDialog *chooser =
287 TPAW_IRC_NETWORK_CHOOSER_DIALOG (self->priv->dialog);
289 if (response != GTK_RESPONSE_CLOSE &&
290 response != GTK_RESPONSE_DELETE_EVENT)
293 if (tpaw_irc_network_chooser_dialog_get_changed (chooser))
295 tp_clear_object (&self->priv->network);
297 self->priv->network = g_object_ref (
298 tpaw_irc_network_chooser_dialog_get_network (chooser));
300 update_server_params (self);
303 g_signal_emit (self, signals[SIG_CHANGED], 0);
306 gtk_widget_destroy (self->priv->dialog);
307 self->priv->dialog = NULL;
311 clicked_cb (GtkButton *button,
314 TpawIrcNetworkChooser *self = TPAW_IRC_NETWORK_CHOOSER (button);
317 if (self->priv->dialog != NULL)
320 window = tpaw_get_toplevel_window (GTK_WIDGET (button));
322 self->priv->dialog = tpaw_irc_network_chooser_dialog_new (
323 self->priv->settings, self->priv->network, window);
324 gtk_widget_show_all (self->priv->dialog);
326 tp_g_signal_connect_object (self->priv->dialog, "response",
327 G_CALLBACK (dialog_response_cb), button, 0);
330 tpaw_window_present (GTK_WINDOW (self->priv->dialog));
334 tpaw_irc_network_chooser_constructed (GObject *object)
336 TpawIrcNetworkChooser *self = (TpawIrcNetworkChooser *) object;
338 g_assert (self->priv->settings != NULL);
340 set_label_from_settings (self);
342 g_signal_connect (self, "clicked", G_CALLBACK (clicked_cb), self);
346 tpaw_irc_network_chooser_dispose (GObject *object)
348 TpawIrcNetworkChooser *self = (TpawIrcNetworkChooser *) object;
350 tp_clear_object (&self->priv->settings);
351 tp_clear_object (&self->priv->network_manager);
352 tp_clear_object (&self->priv->network);
354 if (G_OBJECT_CLASS (tpaw_irc_network_chooser_parent_class)->dispose)
355 G_OBJECT_CLASS (tpaw_irc_network_chooser_parent_class)->dispose (object);
359 tpaw_irc_network_chooser_class_init (TpawIrcNetworkChooserClass *klass)
361 GObjectClass *object_class = G_OBJECT_CLASS (klass);
363 object_class->get_property = tpaw_irc_network_chooser_get_property;
364 object_class->set_property = tpaw_irc_network_chooser_set_property;
365 object_class->constructed = tpaw_irc_network_chooser_constructed;
366 object_class->dispose = tpaw_irc_network_chooser_dispose;
368 g_object_class_install_property (object_class, PROP_SETTINGS,
369 g_param_spec_object ("settings",
371 "The TpawAccountSettings to show and edit",
372 TPAW_TYPE_ACCOUNT_SETTINGS,
373 G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
375 signals[SIG_CHANGED] = g_signal_new ("changed",
376 G_OBJECT_CLASS_TYPE (object_class),
380 g_cclosure_marshal_generic,
384 g_type_class_add_private (object_class,
385 sizeof (TpawIrcNetworkChooserPriv));
389 tpaw_irc_network_chooser_init (TpawIrcNetworkChooser *self)
391 self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
392 TPAW_TYPE_IRC_NETWORK_CHOOSER, TpawIrcNetworkChooserPriv);
394 self->priv->network_manager = tpaw_irc_network_manager_dup_default ();
398 tpaw_irc_network_chooser_new (TpawAccountSettings *settings)
400 return g_object_new (TPAW_TYPE_IRC_NETWORK_CHOOSER,
401 "settings", settings,
406 tpaw_irc_network_chooser_get_network (TpawIrcNetworkChooser *self)
408 return self->priv->network;