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;
43 gboolean need_password;
44 } EmpathyChatroomPriv;
47 static void chatroom_finalize (GObject *object);
48 static void chatroom_get_property (GObject *object,
52 static void chatroom_set_property (GObject *object,
71 G_DEFINE_TYPE (EmpathyChatroom, empathy_chatroom, G_TYPE_OBJECT);
74 empathy_chatroom_class_init (EmpathyChatroomClass *klass)
76 GObjectClass *object_class = G_OBJECT_CLASS (klass);
78 object_class->finalize = chatroom_finalize;
79 object_class->get_property = chatroom_get_property;
80 object_class->set_property = chatroom_set_property;
82 g_object_class_install_property (object_class,
84 g_param_spec_object ("account",
86 "The account associated with an chatroom",
90 g_object_class_install_property (object_class,
92 g_param_spec_string ("room",
94 "Chatroom represented as 'room@server'",
98 g_object_class_install_property (object_class,
100 g_param_spec_string ("name",
106 g_object_class_install_property (object_class,
108 g_param_spec_boolean ("auto_connect",
109 "Chatroom Auto Connect",
110 "Connect on startup",
114 g_object_class_install_property (object_class,
116 g_param_spec_boolean ("favorite",
118 "TRUE if the chatroom is in user's favorite list",
123 g_object_class_install_property (object_class,
125 g_param_spec_object ("tp-chat",
126 "Chatroom channel wrapper",
127 "The wrapper for the chatroom channel if there is one",
128 EMPATHY_TYPE_TP_CHAT,
131 g_object_class_install_property (object_class,
133 g_param_spec_string ("subject",
135 "The chatroom's subject",
139 G_PARAM_STATIC_NAME |
140 G_PARAM_STATIC_NICK |
141 G_PARAM_STATIC_BLURB));
143 g_object_class_install_property (object_class,
145 g_param_spec_uint ("members-count",
147 "The chatroom's members count",
153 G_PARAM_STATIC_NAME |
154 G_PARAM_STATIC_NICK |
155 G_PARAM_STATIC_BLURB));
157 g_object_class_install_property (object_class,
159 g_param_spec_boolean ("invite-only",
161 "The chatroom is invite only",
165 G_PARAM_STATIC_NAME |
166 G_PARAM_STATIC_NICK |
167 G_PARAM_STATIC_BLURB));
169 g_object_class_install_property (object_class,
171 g_param_spec_boolean ("need-password",
173 "The chatroom is password protected",
177 G_PARAM_STATIC_NAME |
178 G_PARAM_STATIC_NICK |
179 G_PARAM_STATIC_BLURB));
181 g_type_class_add_private (object_class, sizeof (EmpathyChatroomPriv));
185 empathy_chatroom_init (EmpathyChatroom *chatroom)
187 EmpathyChatroomPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (chatroom,
188 EMPATHY_TYPE_CHATROOM, EmpathyChatroomPriv);
190 chatroom->priv = priv;
194 chatroom_finalize (GObject *object)
196 EmpathyChatroomPriv *priv;
198 priv = GET_PRIV (object);
200 if (priv->tp_chat != NULL)
201 g_object_unref (priv->tp_chat);
203 g_object_unref (priv->account);
207 (G_OBJECT_CLASS (empathy_chatroom_parent_class)->finalize) (object);
211 chatroom_get_property (GObject *object,
216 EmpathyChatroomPriv *priv;
218 priv = GET_PRIV (object);
222 g_value_set_object (value, priv->account);
225 g_value_set_string (value, priv->room);
228 g_value_set_string (value, priv->name);
230 case PROP_AUTO_CONNECT:
231 g_value_set_boolean (value, priv->auto_connect);
234 g_value_set_boolean (value, priv->favorite);
237 g_value_set_object (value, priv->tp_chat);
240 g_value_set_string (value, priv->subject);
242 case PROP_MEMBERS_COUNT:
243 g_value_set_uint (value, priv->members_count);
245 case PROP_INVITE_ONLY:
246 g_value_set_boolean (value, priv->invite_only);
248 case PROP_NEED_PASSWORD:
249 g_value_set_boolean (value, priv->need_password);
252 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
258 chatroom_set_property (GObject *object,
263 EmpathyChatroomPriv *priv;
265 priv = GET_PRIV (object);
269 empathy_chatroom_set_account (EMPATHY_CHATROOM (object),
270 g_value_get_object (value));
273 empathy_chatroom_set_room (EMPATHY_CHATROOM (object),
274 g_value_get_string (value));
277 empathy_chatroom_set_name (EMPATHY_CHATROOM (object),
278 g_value_get_string (value));
280 case PROP_AUTO_CONNECT:
281 empathy_chatroom_set_auto_connect (EMPATHY_CHATROOM (object),
282 g_value_get_boolean (value));
285 empathy_chatroom_set_favorite (EMPATHY_CHATROOM (object),
286 g_value_get_boolean (value));
289 empathy_chatroom_set_tp_chat (EMPATHY_CHATROOM (object),
290 g_value_get_object (value));
293 empathy_chatroom_set_subject (EMPATHY_CHATROOM (object),
294 g_value_get_string (value));
296 case PROP_MEMBERS_COUNT:
297 empathy_chatroom_set_members_count (EMPATHY_CHATROOM (object),
298 g_value_get_uint (value));
300 case PROP_NEED_PASSWORD:
301 empathy_chatroom_set_need_password (EMPATHY_CHATROOM (object),
302 g_value_get_boolean (value));
304 case PROP_INVITE_ONLY:
305 empathy_chatroom_set_invite_only (EMPATHY_CHATROOM (object),
306 g_value_get_boolean (value));
309 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
315 empathy_chatroom_new (TpAccount *account)
317 return g_object_new (EMPATHY_TYPE_CHATROOM,
323 empathy_chatroom_new_full (TpAccount *account,
326 gboolean auto_connect)
328 g_return_val_if_fail (room != NULL, NULL);
330 return g_object_new (EMPATHY_TYPE_CHATROOM,
334 "auto_connect", auto_connect,
339 empathy_chatroom_get_account (EmpathyChatroom *chatroom)
341 EmpathyChatroomPriv *priv;
343 g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), NULL);
345 priv = GET_PRIV (chatroom);
346 return priv->account;
350 empathy_chatroom_set_account (EmpathyChatroom *chatroom,
353 EmpathyChatroomPriv *priv;
355 g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
357 priv = GET_PRIV (chatroom);
359 if (account == priv->account) {
363 g_object_unref (priv->account);
365 priv->account = g_object_ref (account);
367 g_object_notify (G_OBJECT (chatroom), "account");
371 empathy_chatroom_get_room (EmpathyChatroom *chatroom)
373 EmpathyChatroomPriv *priv;
375 g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), NULL);
377 priv = GET_PRIV (chatroom);
382 empathy_chatroom_set_room (EmpathyChatroom *chatroom,
385 EmpathyChatroomPriv *priv;
387 g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
388 g_return_if_fail (room != NULL);
390 priv = GET_PRIV (chatroom);
393 priv->room = g_strdup (room);
395 g_object_notify (G_OBJECT (chatroom), "room");
399 empathy_chatroom_get_name (EmpathyChatroom *chatroom)
401 EmpathyChatroomPriv *priv;
403 g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), NULL);
405 priv = GET_PRIV (chatroom);
407 if (EMP_STR_EMPTY (priv->name)) {
415 empathy_chatroom_set_name (EmpathyChatroom *chatroom,
418 EmpathyChatroomPriv *priv;
420 g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
422 priv = GET_PRIV (chatroom);
427 priv->name = g_strdup (name);
430 g_object_notify (G_OBJECT (chatroom), "name");
434 empathy_chatroom_get_auto_connect (EmpathyChatroom *chatroom)
436 EmpathyChatroomPriv *priv;
438 g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), FALSE);
440 priv = GET_PRIV (chatroom);
441 return priv->auto_connect;
445 empathy_chatroom_set_auto_connect (EmpathyChatroom *chatroom,
446 gboolean auto_connect)
448 EmpathyChatroomPriv *priv;
450 g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
452 priv = GET_PRIV (chatroom);
454 priv->auto_connect = auto_connect;
456 if (priv->auto_connect) {
457 /* auto_connect implies favorite */
458 priv->favorite = TRUE;
459 g_object_notify (G_OBJECT (chatroom), "favorite");
462 g_object_notify (G_OBJECT (chatroom), "auto-connect");
466 empathy_chatroom_equal (gconstpointer v1,
469 TpAccount *account_a;
470 TpAccount *account_b;
474 g_return_val_if_fail (EMPATHY_IS_CHATROOM (v1), FALSE);
475 g_return_val_if_fail (EMPATHY_IS_CHATROOM (v2), FALSE);
477 account_a = empathy_chatroom_get_account (EMPATHY_CHATROOM (v1));
478 account_b = empathy_chatroom_get_account (EMPATHY_CHATROOM (v2));
480 room_a = empathy_chatroom_get_room (EMPATHY_CHATROOM (v1));
481 room_b = empathy_chatroom_get_room (EMPATHY_CHATROOM (v2));
483 return account_a == account_b && !tp_strdiff (room_a, room_b);
487 empathy_chatroom_get_tp_chat (EmpathyChatroom *chatroom)
489 EmpathyChatroomPriv *priv;
491 g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), NULL);
493 priv = GET_PRIV (chatroom);
495 return priv->tp_chat;
499 empathy_chatroom_get_subject (EmpathyChatroom *chatroom)
501 EmpathyChatroomPriv *priv;
503 g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), NULL);
505 priv = GET_PRIV (chatroom);
507 return priv->subject;
511 empathy_chatroom_set_subject (EmpathyChatroom *chatroom,
512 const gchar *subject)
514 EmpathyChatroomPriv *priv;
516 g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
518 priv = GET_PRIV (chatroom);
520 g_free (priv->subject);
521 priv->subject = NULL;
524 priv->subject = g_strdup (subject);
526 g_object_notify (G_OBJECT (chatroom), "subject");
530 empathy_chatroom_get_members_count (EmpathyChatroom *chatroom)
532 EmpathyChatroomPriv *priv;
534 g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), 0);
536 priv = GET_PRIV (chatroom);
538 return priv->members_count;
542 empathy_chatroom_set_members_count (EmpathyChatroom *chatroom,
545 EmpathyChatroomPriv *priv;
547 g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
549 priv = GET_PRIV (chatroom);
551 priv->members_count = count;
553 g_object_notify (G_OBJECT (chatroom), "members-count");
557 empathy_chatroom_get_need_password (EmpathyChatroom *chatroom)
559 EmpathyChatroomPriv *priv;
561 g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), FALSE);
563 priv = GET_PRIV (chatroom);
565 return priv->need_password;
569 empathy_chatroom_set_need_password (EmpathyChatroom *chatroom,
570 gboolean need_password)
572 EmpathyChatroomPriv *priv;
574 g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
576 priv = GET_PRIV (chatroom);
578 priv->need_password = need_password;
580 g_object_notify (G_OBJECT (chatroom), "need-password");
584 empathy_chatroom_get_invite_only (EmpathyChatroom *chatroom)
586 EmpathyChatroomPriv *priv;
588 g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), FALSE);
590 priv = GET_PRIV (chatroom);
592 return priv->invite_only;
596 empathy_chatroom_set_invite_only (EmpathyChatroom *chatroom,
597 gboolean invite_only)
599 EmpathyChatroomPriv *priv;
601 g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
603 priv = GET_PRIV (chatroom);
605 priv->invite_only = invite_only;
607 g_object_notify (G_OBJECT (chatroom), "invite-only");
611 empathy_chatroom_set_tp_chat (EmpathyChatroom *chatroom,
612 EmpathyTpChat *tp_chat)
614 EmpathyChatroomPriv *priv;
616 g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
617 g_return_if_fail (tp_chat == NULL || EMPATHY_IS_TP_CHAT (tp_chat));
619 priv = GET_PRIV (chatroom);
621 if (priv->tp_chat == tp_chat) {
625 if (priv->tp_chat != NULL) {
626 g_object_unref (priv->tp_chat);
629 priv->tp_chat = tp_chat ? g_object_ref (tp_chat) : NULL;
630 g_object_notify (G_OBJECT (chatroom), "tp-chat");
634 empathy_chatroom_is_favorite (EmpathyChatroom *chatroom)
636 EmpathyChatroomPriv *priv;
638 g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), FALSE);
640 priv = GET_PRIV (chatroom);
642 return priv->favorite;
646 empathy_chatroom_set_favorite (EmpathyChatroom *chatroom,
649 EmpathyChatroomPriv *priv;
651 g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
653 priv = GET_PRIV (chatroom);
655 if (priv->favorite == favorite) {
659 priv->favorite = favorite;
660 if (!priv->favorite) {
661 empathy_chatroom_set_auto_connect (chatroom, FALSE);
663 g_object_notify (G_OBJECT (chatroom), "favorite");