1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3 * Copyright (C) 2007-2008 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: Xavier Claessens <xclaesse@gmail.com>
28 #include "empathy-chatroom.h"
29 #include "empathy-utils.h"
31 #define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyChatroom)
36 gboolean auto_connect;
38 /* FIXME: This is crack. We should store EmapthyTpChat but can't
39 * as it's not created in the dispatcher. At some point it should be
40 * automatically created by tp-glib */
41 TpChannel *tp_channel;
42 } EmpathyChatroomPriv;
45 static void chatroom_finalize (GObject *object);
46 static void chatroom_get_property (GObject *object,
50 static void chatroom_set_property (GObject *object,
65 G_DEFINE_TYPE (EmpathyChatroom, empathy_chatroom, G_TYPE_OBJECT);
68 empathy_chatroom_class_init (EmpathyChatroomClass *klass)
70 GObjectClass *object_class = G_OBJECT_CLASS (klass);
72 object_class->finalize = chatroom_finalize;
73 object_class->get_property = chatroom_get_property;
74 object_class->set_property = chatroom_set_property;
76 g_object_class_install_property (object_class,
78 g_param_spec_object ("account",
80 "The account associated with an chatroom",
84 g_object_class_install_property (object_class,
86 g_param_spec_string ("room",
88 "Chatroom represented as 'room@server'",
92 g_object_class_install_property (object_class,
94 g_param_spec_string ("name",
100 g_object_class_install_property (object_class,
102 g_param_spec_boolean ("auto_connect",
103 "Chatroom Auto Connect",
104 "Connect on startup",
108 g_object_class_install_property (object_class,
110 g_param_spec_boolean ("favorite",
112 "TRUE if the chatroom is in user's favorite list",
116 G_PARAM_STATIC_NAME |
117 G_PARAM_STATIC_NICK |
118 G_PARAM_STATIC_BLURB));
120 g_object_class_install_property (object_class,
122 g_param_spec_object ("tp-channel",
124 "The TpChannel associated with this chatroom if we are in the"
125 " room. NULL otherwise.",
129 G_PARAM_STATIC_NAME |
130 G_PARAM_STATIC_NICK |
131 G_PARAM_STATIC_BLURB));
133 g_type_class_add_private (object_class, sizeof (EmpathyChatroomPriv));
137 empathy_chatroom_init (EmpathyChatroom *chatroom)
139 EmpathyChatroomPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (chatroom,
140 EMPATHY_TYPE_CHATROOM, EmpathyChatroomPriv);
142 chatroom->priv = priv;
146 chatroom_finalize (GObject *object)
148 EmpathyChatroomPriv *priv;
150 priv = GET_PRIV (object);
152 if (priv->tp_channel != NULL)
154 g_object_unref (priv->tp_channel);
155 priv->tp_channel = NULL;
158 g_object_unref (priv->account);
162 (G_OBJECT_CLASS (empathy_chatroom_parent_class)->finalize) (object);
166 chatroom_get_property (GObject *object,
171 EmpathyChatroomPriv *priv;
173 priv = GET_PRIV (object);
177 g_value_set_object (value, priv->account);
180 g_value_set_string (value, priv->room);
183 g_value_set_string (value, priv->name);
185 case PROP_AUTO_CONNECT:
186 g_value_set_boolean (value, priv->auto_connect);
189 g_value_set_boolean (value, priv->favorite);
191 case PROP_TP_CHANNEL:
192 g_value_set_object (value, priv->tp_channel);
195 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
201 chatroom_set_property (GObject *object,
206 EmpathyChatroomPriv *priv;
208 priv = GET_PRIV (object);
212 empathy_chatroom_set_account (EMPATHY_CHATROOM (object),
213 g_value_get_object (value));
216 empathy_chatroom_set_room (EMPATHY_CHATROOM (object),
217 g_value_get_string (value));
220 empathy_chatroom_set_name (EMPATHY_CHATROOM (object),
221 g_value_get_string (value));
223 case PROP_AUTO_CONNECT:
224 empathy_chatroom_set_auto_connect (EMPATHY_CHATROOM (object),
225 g_value_get_boolean (value));
228 priv->favorite = g_value_get_boolean (value);
231 empathy_chatroom_set_auto_connect (EMPATHY_CHATROOM (object),
235 case PROP_TP_CHANNEL:
236 if (priv->tp_channel != NULL)
238 g_object_unref (priv->tp_channel);
241 priv->tp_channel = g_value_dup_object (value);
244 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
250 empathy_chatroom_new (McAccount *account)
252 g_return_val_if_fail (MC_IS_ACCOUNT (account), NULL);
254 return g_object_new (EMPATHY_TYPE_CHATROOM,
260 empathy_chatroom_new_full (McAccount *account,
263 gboolean auto_connect)
265 g_return_val_if_fail (MC_IS_ACCOUNT (account), NULL);
266 g_return_val_if_fail (room != NULL, NULL);
268 return g_object_new (EMPATHY_TYPE_CHATROOM,
272 "auto_connect", auto_connect,
277 empathy_chatroom_get_account (EmpathyChatroom *chatroom)
279 EmpathyChatroomPriv *priv;
281 g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), NULL);
283 priv = GET_PRIV (chatroom);
284 return priv->account;
288 empathy_chatroom_set_account (EmpathyChatroom *chatroom,
291 EmpathyChatroomPriv *priv;
293 g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
294 g_return_if_fail (MC_IS_ACCOUNT (account));
296 priv = GET_PRIV (chatroom);
298 if (account == priv->account) {
302 g_object_unref (priv->account);
304 priv->account = g_object_ref (account);
306 g_object_notify (G_OBJECT (chatroom), "account");
310 empathy_chatroom_get_room (EmpathyChatroom *chatroom)
312 EmpathyChatroomPriv *priv;
314 g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), NULL);
316 priv = GET_PRIV (chatroom);
321 empathy_chatroom_set_room (EmpathyChatroom *chatroom,
324 EmpathyChatroomPriv *priv;
326 g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
327 g_return_if_fail (room != NULL);
329 priv = GET_PRIV (chatroom);
332 priv->room = g_strdup (room);
334 g_object_notify (G_OBJECT (chatroom), "room");
338 empathy_chatroom_get_name (EmpathyChatroom *chatroom)
340 EmpathyChatroomPriv *priv;
342 g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), NULL);
344 priv = GET_PRIV (chatroom);
346 if (G_STR_EMPTY (priv->name)) {
354 empathy_chatroom_set_name (EmpathyChatroom *chatroom,
357 EmpathyChatroomPriv *priv;
359 g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
361 priv = GET_PRIV (chatroom);
366 priv->name = g_strdup (name);
369 g_object_notify (G_OBJECT (chatroom), "name");
373 empathy_chatroom_get_auto_connect (EmpathyChatroom *chatroom)
375 EmpathyChatroomPriv *priv;
377 g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), FALSE);
379 priv = GET_PRIV (chatroom);
380 return priv->auto_connect;
384 empathy_chatroom_set_auto_connect (EmpathyChatroom *chatroom,
385 gboolean auto_connect)
387 EmpathyChatroomPriv *priv;
389 g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
391 priv = GET_PRIV (chatroom);
393 priv->auto_connect = auto_connect;
395 if (priv->auto_connect)
397 /* auto_connect implies favorite */
398 priv->favorite = TRUE;
399 g_object_notify (G_OBJECT (chatroom), "favorite");
402 g_object_notify (G_OBJECT (chatroom), "auto-connect");
406 empathy_chatroom_equal (gconstpointer v1,
409 McAccount *account_a;
410 McAccount *account_b;
414 g_return_val_if_fail (EMPATHY_IS_CHATROOM (v1), FALSE);
415 g_return_val_if_fail (EMPATHY_IS_CHATROOM (v2), FALSE);
417 account_a = empathy_chatroom_get_account (EMPATHY_CHATROOM (v1));
418 account_b = empathy_chatroom_get_account (EMPATHY_CHATROOM (v2));
420 room_a = empathy_chatroom_get_room (EMPATHY_CHATROOM (v1));
421 room_b = empathy_chatroom_get_room (EMPATHY_CHATROOM (v2));
423 return empathy_account_equal (account_a, account_b) && g_str_equal (room_a, room_b);