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>
27 #include <telepathy-glib/util.h>
29 #include "empathy-chatroom.h"
30 #include "empathy-utils.h"
32 #define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyChatroom)
37 gboolean auto_connect;
39 EmpathyTpChat *tp_chat;
40 } EmpathyChatroomPriv;
43 static void chatroom_finalize (GObject *object);
44 static void chatroom_get_property (GObject *object,
48 static void chatroom_set_property (GObject *object,
63 G_DEFINE_TYPE (EmpathyChatroom, empathy_chatroom, G_TYPE_OBJECT);
66 empathy_chatroom_class_init (EmpathyChatroomClass *klass)
68 GObjectClass *object_class = G_OBJECT_CLASS (klass);
70 object_class->finalize = chatroom_finalize;
71 object_class->get_property = chatroom_get_property;
72 object_class->set_property = chatroom_set_property;
74 g_object_class_install_property (object_class,
76 g_param_spec_object ("account",
78 "The account associated with an chatroom",
82 g_object_class_install_property (object_class,
84 g_param_spec_string ("room",
86 "Chatroom represented as 'room@server'",
90 g_object_class_install_property (object_class,
92 g_param_spec_string ("name",
98 g_object_class_install_property (object_class,
100 g_param_spec_boolean ("auto_connect",
101 "Chatroom Auto Connect",
102 "Connect on startup",
106 g_object_class_install_property (object_class,
108 g_param_spec_boolean ("favorite",
110 "TRUE if the chatroom is in user's favorite list",
114 G_PARAM_STATIC_NAME |
115 G_PARAM_STATIC_NICK |
116 G_PARAM_STATIC_BLURB));
118 g_object_class_install_property (object_class,
120 g_param_spec_object ("tp-chat",
121 "Chatroom channel wrapper",
122 "The wrapper for the chatroom channel if there is one",
123 EMPATHY_TYPE_TP_CHAT,
126 g_type_class_add_private (object_class, sizeof (EmpathyChatroomPriv));
130 empathy_chatroom_init (EmpathyChatroom *chatroom)
132 EmpathyChatroomPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (chatroom,
133 EMPATHY_TYPE_CHATROOM, EmpathyChatroomPriv);
135 chatroom->priv = priv;
139 chatroom_finalize (GObject *object)
141 EmpathyChatroomPriv *priv;
143 priv = GET_PRIV (object);
145 if (priv->tp_chat != NULL)
146 g_object_unref (priv->tp_chat);
148 g_object_unref (priv->account);
152 (G_OBJECT_CLASS (empathy_chatroom_parent_class)->finalize) (object);
156 chatroom_get_property (GObject *object,
161 EmpathyChatroomPriv *priv;
163 priv = GET_PRIV (object);
167 g_value_set_object (value, priv->account);
170 g_value_set_string (value, priv->room);
173 g_value_set_string (value, priv->name);
175 case PROP_AUTO_CONNECT:
176 g_value_set_boolean (value, priv->auto_connect);
179 g_value_set_boolean (value, priv->favorite);
182 g_value_set_object (value, priv->tp_chat);
185 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
191 chatroom_set_property (GObject *object,
196 EmpathyChatroomPriv *priv;
198 priv = GET_PRIV (object);
202 empathy_chatroom_set_account (EMPATHY_CHATROOM (object),
203 g_value_get_object (value));
206 empathy_chatroom_set_room (EMPATHY_CHATROOM (object),
207 g_value_get_string (value));
210 empathy_chatroom_set_name (EMPATHY_CHATROOM (object),
211 g_value_get_string (value));
213 case PROP_AUTO_CONNECT:
214 empathy_chatroom_set_auto_connect (EMPATHY_CHATROOM (object),
215 g_value_get_boolean (value));
218 priv->favorite = g_value_get_boolean (value);
221 empathy_chatroom_set_auto_connect (EMPATHY_CHATROOM (object),
226 GObject *chat = g_value_dup_object (value);
228 if (chat == (GObject *) priv->tp_chat)
231 g_assert (chat == NULL || priv->tp_chat == NULL);
233 if (priv->tp_chat != NULL) {
234 g_object_unref (priv->tp_chat);
235 priv->tp_chat = NULL;
237 priv->tp_chat = EMPATHY_TP_CHAT (chat);
242 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
248 empathy_chatroom_new (McAccount *account)
250 g_return_val_if_fail (MC_IS_ACCOUNT (account), NULL);
252 return g_object_new (EMPATHY_TYPE_CHATROOM,
258 empathy_chatroom_new_full (McAccount *account,
261 gboolean auto_connect)
263 g_return_val_if_fail (MC_IS_ACCOUNT (account), NULL);
264 g_return_val_if_fail (room != NULL, NULL);
266 return g_object_new (EMPATHY_TYPE_CHATROOM,
270 "auto_connect", auto_connect,
275 empathy_chatroom_get_account (EmpathyChatroom *chatroom)
277 EmpathyChatroomPriv *priv;
279 g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), NULL);
281 priv = GET_PRIV (chatroom);
282 return priv->account;
286 empathy_chatroom_set_account (EmpathyChatroom *chatroom,
289 EmpathyChatroomPriv *priv;
291 g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
292 g_return_if_fail (MC_IS_ACCOUNT (account));
294 priv = GET_PRIV (chatroom);
296 if (account == priv->account) {
300 g_object_unref (priv->account);
302 priv->account = g_object_ref (account);
304 g_object_notify (G_OBJECT (chatroom), "account");
308 empathy_chatroom_get_room (EmpathyChatroom *chatroom)
310 EmpathyChatroomPriv *priv;
312 g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), NULL);
314 priv = GET_PRIV (chatroom);
319 empathy_chatroom_set_room (EmpathyChatroom *chatroom,
322 EmpathyChatroomPriv *priv;
324 g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
325 g_return_if_fail (room != NULL);
327 priv = GET_PRIV (chatroom);
330 priv->room = g_strdup (room);
332 g_object_notify (G_OBJECT (chatroom), "room");
336 empathy_chatroom_get_name (EmpathyChatroom *chatroom)
338 EmpathyChatroomPriv *priv;
340 g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), NULL);
342 priv = GET_PRIV (chatroom);
344 if (EMP_STR_EMPTY (priv->name)) {
352 empathy_chatroom_set_name (EmpathyChatroom *chatroom,
355 EmpathyChatroomPriv *priv;
357 g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
359 priv = GET_PRIV (chatroom);
364 priv->name = g_strdup (name);
367 g_object_notify (G_OBJECT (chatroom), "name");
371 empathy_chatroom_get_auto_connect (EmpathyChatroom *chatroom)
373 EmpathyChatroomPriv *priv;
375 g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), FALSE);
377 priv = GET_PRIV (chatroom);
378 return priv->auto_connect;
382 empathy_chatroom_set_auto_connect (EmpathyChatroom *chatroom,
383 gboolean auto_connect)
385 EmpathyChatroomPriv *priv;
387 g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
389 priv = GET_PRIV (chatroom);
391 priv->auto_connect = auto_connect;
393 if (priv->auto_connect)
395 /* auto_connect implies favorite */
396 priv->favorite = TRUE;
397 g_object_notify (G_OBJECT (chatroom), "favorite");
400 g_object_notify (G_OBJECT (chatroom), "auto-connect");
404 empathy_chatroom_equal (gconstpointer v1,
407 McAccount *account_a;
408 McAccount *account_b;
412 g_return_val_if_fail (EMPATHY_IS_CHATROOM (v1), FALSE);
413 g_return_val_if_fail (EMPATHY_IS_CHATROOM (v2), FALSE);
415 account_a = empathy_chatroom_get_account (EMPATHY_CHATROOM (v1));
416 account_b = empathy_chatroom_get_account (EMPATHY_CHATROOM (v2));
418 room_a = empathy_chatroom_get_room (EMPATHY_CHATROOM (v1));
419 room_b = empathy_chatroom_get_room (EMPATHY_CHATROOM (v2));
421 return empathy_account_equal (account_a, account_b) && !tp_strdiff (room_a,
426 empathy_chatroom_get_tp_chat (EmpathyChatroom *chatroom) {
427 EmpathyChatroomPriv *priv;
429 g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), NULL);
431 priv = GET_PRIV (chatroom);
433 return priv->tp_chat;