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 (McAccount *account)
317 g_return_val_if_fail (MC_IS_ACCOUNT (account), NULL);
319 return g_object_new (EMPATHY_TYPE_CHATROOM,
325 empathy_chatroom_new_full (McAccount *account,
328 gboolean auto_connect)
330 g_return_val_if_fail (MC_IS_ACCOUNT (account), NULL);
331 g_return_val_if_fail (room != NULL, NULL);
333 return g_object_new (EMPATHY_TYPE_CHATROOM,
337 "auto_connect", auto_connect,
342 empathy_chatroom_get_account (EmpathyChatroom *chatroom)
344 EmpathyChatroomPriv *priv;
346 g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), NULL);
348 priv = GET_PRIV (chatroom);
349 return priv->account;
353 empathy_chatroom_set_account (EmpathyChatroom *chatroom,
356 EmpathyChatroomPriv *priv;
358 g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
359 g_return_if_fail (MC_IS_ACCOUNT (account));
361 priv = GET_PRIV (chatroom);
363 if (account == priv->account) {
367 g_object_unref (priv->account);
369 priv->account = g_object_ref (account);
371 g_object_notify (G_OBJECT (chatroom), "account");
375 empathy_chatroom_get_room (EmpathyChatroom *chatroom)
377 EmpathyChatroomPriv *priv;
379 g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), NULL);
381 priv = GET_PRIV (chatroom);
386 empathy_chatroom_set_room (EmpathyChatroom *chatroom,
389 EmpathyChatroomPriv *priv;
391 g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
392 g_return_if_fail (room != NULL);
394 priv = GET_PRIV (chatroom);
397 priv->room = g_strdup (room);
399 g_object_notify (G_OBJECT (chatroom), "room");
403 empathy_chatroom_get_name (EmpathyChatroom *chatroom)
405 EmpathyChatroomPriv *priv;
407 g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), NULL);
409 priv = GET_PRIV (chatroom);
411 if (EMP_STR_EMPTY (priv->name)) {
419 empathy_chatroom_set_name (EmpathyChatroom *chatroom,
422 EmpathyChatroomPriv *priv;
424 g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
426 priv = GET_PRIV (chatroom);
431 priv->name = g_strdup (name);
434 g_object_notify (G_OBJECT (chatroom), "name");
438 empathy_chatroom_get_auto_connect (EmpathyChatroom *chatroom)
440 EmpathyChatroomPriv *priv;
442 g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), FALSE);
444 priv = GET_PRIV (chatroom);
445 return priv->auto_connect;
449 empathy_chatroom_set_auto_connect (EmpathyChatroom *chatroom,
450 gboolean auto_connect)
452 EmpathyChatroomPriv *priv;
454 g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
456 priv = GET_PRIV (chatroom);
458 priv->auto_connect = auto_connect;
460 if (priv->auto_connect) {
461 /* auto_connect implies favorite */
462 priv->favorite = TRUE;
463 g_object_notify (G_OBJECT (chatroom), "favorite");
466 g_object_notify (G_OBJECT (chatroom), "auto-connect");
470 empathy_chatroom_equal (gconstpointer v1,
473 McAccount *account_a;
474 McAccount *account_b;
478 g_return_val_if_fail (EMPATHY_IS_CHATROOM (v1), FALSE);
479 g_return_val_if_fail (EMPATHY_IS_CHATROOM (v2), FALSE);
481 account_a = empathy_chatroom_get_account (EMPATHY_CHATROOM (v1));
482 account_b = empathy_chatroom_get_account (EMPATHY_CHATROOM (v2));
484 room_a = empathy_chatroom_get_room (EMPATHY_CHATROOM (v1));
485 room_b = empathy_chatroom_get_room (EMPATHY_CHATROOM (v2));
487 return empathy_account_equal (account_a, account_b) &&
488 !tp_strdiff (room_a, room_b);
492 empathy_chatroom_get_tp_chat (EmpathyChatroom *chatroom)
494 EmpathyChatroomPriv *priv;
496 g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), NULL);
498 priv = GET_PRIV (chatroom);
500 return priv->tp_chat;
504 empathy_chatroom_get_subject (EmpathyChatroom *chatroom)
506 EmpathyChatroomPriv *priv;
508 g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), NULL);
510 priv = GET_PRIV (chatroom);
512 return priv->subject;
516 empathy_chatroom_set_subject (EmpathyChatroom *chatroom,
517 const gchar *subject)
519 EmpathyChatroomPriv *priv;
521 g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
523 priv = GET_PRIV (chatroom);
525 g_free (priv->subject);
526 priv->subject = NULL;
529 priv->subject = g_strdup (subject);
531 g_object_notify (G_OBJECT (chatroom), "subject");
535 empathy_chatroom_get_members_count (EmpathyChatroom *chatroom)
537 EmpathyChatroomPriv *priv;
539 g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), 0);
541 priv = GET_PRIV (chatroom);
543 return priv->members_count;
547 empathy_chatroom_set_members_count (EmpathyChatroom *chatroom,
550 EmpathyChatroomPriv *priv;
552 g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
554 priv = GET_PRIV (chatroom);
556 priv->members_count = count;
558 g_object_notify (G_OBJECT (chatroom), "members-count");
562 empathy_chatroom_get_need_password (EmpathyChatroom *chatroom)
564 EmpathyChatroomPriv *priv;
566 g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), FALSE);
568 priv = GET_PRIV (chatroom);
570 return priv->need_password;
574 empathy_chatroom_set_need_password (EmpathyChatroom *chatroom,
575 gboolean need_password)
577 EmpathyChatroomPriv *priv;
579 g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
581 priv = GET_PRIV (chatroom);
583 priv->need_password = need_password;
585 g_object_notify (G_OBJECT (chatroom), "need-password");
589 empathy_chatroom_get_invite_only (EmpathyChatroom *chatroom)
591 EmpathyChatroomPriv *priv;
593 g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), FALSE);
595 priv = GET_PRIV (chatroom);
597 return priv->invite_only;
601 empathy_chatroom_set_invite_only (EmpathyChatroom *chatroom,
602 gboolean invite_only)
604 EmpathyChatroomPriv *priv;
606 g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
608 priv = GET_PRIV (chatroom);
610 priv->invite_only = invite_only;
612 g_object_notify (G_OBJECT (chatroom), "invite-only");
616 empathy_chatroom_set_tp_chat (EmpathyChatroom *chatroom,
617 EmpathyTpChat *tp_chat)
619 EmpathyChatroomPriv *priv;
621 g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
622 g_return_if_fail (tp_chat == NULL || EMPATHY_IS_TP_CHAT (tp_chat));
624 priv = GET_PRIV (chatroom);
626 if (priv->tp_chat == tp_chat) {
630 if (priv->tp_chat != NULL) {
631 g_object_unref (priv->tp_chat);
634 priv->tp_chat = tp_chat ? g_object_ref (tp_chat) : NULL;
635 g_object_notify (G_OBJECT (chatroom), "tp-chat");
639 empathy_chatroom_is_favorite (EmpathyChatroom *chatroom)
641 EmpathyChatroomPriv *priv;
643 g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), FALSE);
645 priv = GET_PRIV (chatroom);
647 return priv->favorite;
651 empathy_chatroom_set_favorite (EmpathyChatroom *chatroom,
654 EmpathyChatroomPriv *priv;
656 g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
658 priv = GET_PRIV (chatroom);
660 if (priv->favorite == favorite) {
664 priv->favorite = favorite;
665 if (!priv->favorite) {
666 empathy_chatroom_set_auto_connect (chatroom, FALSE);
668 g_object_notify (G_OBJECT (chatroom), "favorite");