2
* Copyright (C) 2007 Guillaume Desmottes
4
* This program is free software; you can redistribute it and/or
5
* modify it under the terms of the GNU General Public License as
6
* published by the Free Software Foundation; either version 2 of the
7
* License, or (at your option) any later version.
9
* This program 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
* General Public License for more details.
14
* You should have received a copy of the GNU General Public
15
* License along with this program; if not, write to the
16
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17
* Boston, MA 02111-1307, USA.
19
* Authors: Guillaume Desmottes <gdesmott@gnome.org>
26
#include <glib/gi18n.h>
28
#include <telepathy-glib/util.h>
30
#include "empathy-marshal.h"
31
#include "empathy-irc-network.h"
33
G_DEFINE_TYPE (EmpathyIrcNetwork, empathy_irc_network, G_TYPE_OBJECT);
50
static guint signals[LAST_SIGNAL] = {0};
52
typedef struct _EmpathyIrcNetworkPrivate EmpathyIrcNetworkPrivate;
54
struct _EmpathyIrcNetworkPrivate
61
#define EMPATHY_IRC_NETWORK_GET_PRIVATE(obj)\
62
((EmpathyIrcNetworkPrivate *) obj->priv)
65
server_modified_cb (EmpathyIrcServer *server,
66
EmpathyIrcNetwork *self)
68
g_signal_emit (self, signals[MODIFIED], 0);
72
empathy_irc_network_get_property (GObject *object,
77
EmpathyIrcNetwork *self = EMPATHY_IRC_NETWORK (object);
78
EmpathyIrcNetworkPrivate *priv = EMPATHY_IRC_NETWORK_GET_PRIVATE (self);
83
g_value_set_string (value, priv->name);
86
g_value_set_string (value, priv->charset);
89
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
95
empathy_irc_network_set_property (GObject *object,
100
EmpathyIrcNetwork *self = EMPATHY_IRC_NETWORK (object);
101
EmpathyIrcNetworkPrivate *priv = EMPATHY_IRC_NETWORK_GET_PRIVATE (self);
106
if (tp_strdiff (priv->name, g_value_get_string (value)))
109
priv->name = g_value_dup_string (value);
110
g_signal_emit (object, signals[MODIFIED], 0);
114
if (tp_strdiff (priv->charset, g_value_get_string (value)))
116
g_free (priv->charset);
117
priv->charset = g_value_dup_string (value);
118
g_signal_emit (object, signals[MODIFIED], 0);
122
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
128
empathy_irc_network_dispose (GObject *object)
130
EmpathyIrcNetwork *self = EMPATHY_IRC_NETWORK (object);
131
EmpathyIrcNetworkPrivate *priv = EMPATHY_IRC_NETWORK_GET_PRIVATE (self);
134
for (l = priv->servers; l != NULL; l = g_slist_next (l))
136
g_signal_handlers_disconnect_by_func (l->data,
137
G_CALLBACK (server_modified_cb), self);
138
g_object_unref (l->data);
141
G_OBJECT_CLASS (empathy_irc_network_parent_class)->dispose (object);
145
empathy_irc_network_finalize (GObject *object)
147
EmpathyIrcNetwork *self = EMPATHY_IRC_NETWORK (object);
148
EmpathyIrcNetworkPrivate *priv = EMPATHY_IRC_NETWORK_GET_PRIVATE (self);
150
g_slist_free (priv->servers);
152
g_free (priv->charset);
154
G_OBJECT_CLASS (empathy_irc_network_parent_class)->finalize (object);
158
empathy_irc_network_init (EmpathyIrcNetwork *self)
160
EmpathyIrcNetworkPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
161
EMPATHY_TYPE_IRC_NETWORK, EmpathyIrcNetworkPrivate);
165
priv->servers = NULL;
167
self->user_defined = TRUE;
168
self->dropped = FALSE;
172
empathy_irc_network_class_init (EmpathyIrcNetworkClass *klass)
174
GObjectClass *object_class = G_OBJECT_CLASS (klass);
175
GParamSpec *param_spec;
177
object_class->get_property = empathy_irc_network_get_property;
178
object_class->set_property = empathy_irc_network_set_property;
180
g_type_class_add_private (object_class,
181
sizeof (EmpathyIrcNetworkPrivate));
183
object_class->dispose = empathy_irc_network_dispose;
184
object_class->finalize = empathy_irc_network_finalize;
186
param_spec = g_param_spec_string (
189
"The displayed name of this network",
192
G_PARAM_STATIC_NAME |
193
G_PARAM_STATIC_NICK |
194
G_PARAM_STATIC_BLURB);
195
g_object_class_install_property (object_class, PROP_NAME, param_spec);
197
param_spec = g_param_spec_string (
200
"The charset to use on this network",
204
G_PARAM_STATIC_NAME |
205
G_PARAM_STATIC_NICK |
206
G_PARAM_STATIC_BLURB);
207
g_object_class_install_property (object_class, PROP_CHARSET, param_spec);
210
* EmpathyIrcNetwork::modified:
211
* @network: the object that received the signal
213
* Emitted when either a property or a server of the network is modified.
216
signals[MODIFIED] = g_signal_new (
218
G_OBJECT_CLASS_TYPE (object_class),
219
G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
222
g_cclosure_marshal_VOID__VOID,
227
* empathy_irc_network_new:
228
* @name: the name of the network
230
* Creates a new #EmpathyIrcNetwork.
232
* Returns: a new #EmpathyIrcNetwork
235
empathy_irc_network_new (const gchar *name)
237
return g_object_new (EMPATHY_TYPE_IRC_NETWORK,
243
* empathy_irc_network_get_servers:
244
* @network: an #EmpathyIrcNetwork
246
* Get the list of #EmpathyIrcServer that belongs to this network.
247
* These servers are sorted according their priority.
248
* So the first one will be the first used when trying to connect to
251
* Returns: a new #GSList of refed #EmpathyIrcServer.
254
empathy_irc_network_get_servers (EmpathyIrcNetwork *self)
256
EmpathyIrcNetworkPrivate *priv;
257
GSList *servers = NULL, *l;
259
g_return_val_if_fail (EMPATHY_IS_IRC_NETWORK (self), NULL);
260
priv = EMPATHY_IRC_NETWORK_GET_PRIVATE (self);
262
for (l = priv->servers; l != NULL; l = g_slist_next (l))
264
servers = g_slist_prepend (servers, g_object_ref (l->data));
267
return g_slist_reverse (servers);
271
* empathy_irc_network_append_server:
272
* @network: an #EmpathyIrcNetwork
273
* @server: the #EmpathyIrcServer to add
275
* Add an #EmpathyIrcServer to the given #EmpathyIrcNetwork. The server
276
* is added at the last position in network's servers list.
280
empathy_irc_network_append_server (EmpathyIrcNetwork *self,
281
EmpathyIrcServer *server)
283
EmpathyIrcNetworkPrivate *priv;
285
g_return_if_fail (EMPATHY_IS_IRC_NETWORK (self));
286
g_return_if_fail (server != NULL && EMPATHY_IS_IRC_SERVER (server));
288
priv = EMPATHY_IRC_NETWORK_GET_PRIVATE (self);
290
g_return_if_fail (g_slist_find (priv->servers, server) == NULL);
292
priv->servers = g_slist_append (priv->servers, g_object_ref (server));
294
g_signal_connect (server, "modified", G_CALLBACK (server_modified_cb), self);
296
g_signal_emit (self, signals[MODIFIED], 0);
300
* empathy_irc_network_remove_server:
301
* @network: an #EmpathyIrcNetwork
302
* @server: the #EmpathyIrcServer to remove
304
* Remove an #EmpathyIrcServer from the servers list of the
305
* given #EmpathyIrcNetwork.
309
empathy_irc_network_remove_server (EmpathyIrcNetwork *self,
310
EmpathyIrcServer *server)
312
EmpathyIrcNetworkPrivate *priv;
315
g_return_if_fail (EMPATHY_IS_IRC_NETWORK (self));
316
g_return_if_fail (server != NULL && EMPATHY_IS_IRC_SERVER (server));
318
priv = EMPATHY_IRC_NETWORK_GET_PRIVATE (self);
320
l = g_slist_find (priv->servers, server);
324
g_object_unref (l->data);
325
priv->servers = g_slist_delete_link (priv->servers, l);
326
g_signal_handlers_disconnect_by_func (server, G_CALLBACK (server_modified_cb),
329
g_signal_emit (self, signals[MODIFIED], 0);
333
* empathy_irc_network_set_server_position:
334
* @network: an #EmpathyIrcNetwork
335
* @server: the #EmpathyIrcServer to move
336
* @pos: the position to move the server. If this is negative, or is larger than
337
* the number of servers in the list, the server is moved to the end of the
340
* Move an #EmpathyIrcServer in the servers list of the given
341
* #EmpathyIrcNetwork.
345
empathy_irc_network_set_server_position (EmpathyIrcNetwork *self,
346
EmpathyIrcServer *server,
349
EmpathyIrcNetworkPrivate *priv;
352
g_return_if_fail (EMPATHY_IS_IRC_NETWORK (self));
353
g_return_if_fail (server != NULL && EMPATHY_IS_IRC_SERVER (server));
355
priv = EMPATHY_IRC_NETWORK_GET_PRIVATE (self);
357
l = g_slist_find (priv->servers, server);
361
priv->servers = g_slist_delete_link (priv->servers, l);
362
priv->servers = g_slist_insert (priv->servers, server, pos);
364
g_signal_emit (self, signals[MODIFIED], 0);