]> git.0d.be Git - empathy.git/blob - libempathy/empathy-chatroom.c
add myself to AUTHORS
[empathy.git] / libempathy / empathy-chatroom.c
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 /*
3  * Copyright (C) 2007-2008 Collabora Ltd.
4  *
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.
9  *
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.
14  *
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
18  *
19  * Authors: Xavier Claessens <xclaesse@gmail.com>
20  */
21
22 #include "config.h"
23
24 #include <string.h>
25
26 #include <glib.h>
27 #include <telepathy-glib/util.h>
28
29 #include "empathy-chatroom.h"
30 #include "empathy-utils.h"
31
32 #define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyChatroom)
33 typedef struct {
34         TpAccount *account;
35         gchar     *room;
36         gchar     *name;
37         gboolean   auto_connect;
38         gboolean favorite;
39         EmpathyTpChat *tp_chat;
40         gchar *subject;
41         guint members_count;
42         gboolean invite_only;
43         gboolean need_password;
44 } EmpathyChatroomPriv;
45
46
47 static void chatroom_finalize          (GObject             *object);
48 static void chatroom_get_property      (GObject             *object,
49                                         guint                param_id,
50                                         GValue              *value,
51                                         GParamSpec          *pspec);
52 static void chatroom_set_property      (GObject             *object,
53                                         guint                param_id,
54                                         const GValue        *value,
55                                         GParamSpec          *pspec);
56
57 enum {
58         PROP_0,
59         PROP_ACCOUNT,
60         PROP_ROOM,
61         PROP_NAME,
62         PROP_AUTO_CONNECT,
63         PROP_FAVORITE,
64         PROP_TP_CHAT,
65         PROP_SUBJECT,
66         PROP_MEMBERS_COUNT,
67         PROP_NEED_PASSWORD,
68         PROP_INVITE_ONLY
69 };
70
71 G_DEFINE_TYPE (EmpathyChatroom, empathy_chatroom, G_TYPE_OBJECT);
72
73 static void
74 empathy_chatroom_class_init (EmpathyChatroomClass *klass)
75 {
76         GObjectClass *object_class = G_OBJECT_CLASS (klass);
77
78         object_class->finalize     = chatroom_finalize;
79         object_class->get_property = chatroom_get_property;
80         object_class->set_property = chatroom_set_property;
81
82         g_object_class_install_property (object_class,
83                                          PROP_ACCOUNT,
84                                          g_param_spec_object ("account",
85                                                               "Chatroom Account",
86                                                               "The account associated with an chatroom",
87                                                               TP_TYPE_ACCOUNT,
88                                                               G_PARAM_READWRITE));
89
90         g_object_class_install_property (object_class,
91                                          PROP_ROOM,
92                                          g_param_spec_string ("room",
93                                                               "Chatroom Room",
94                                                               "Chatroom represented as 'room@server'",
95                                                               NULL,
96                                                               G_PARAM_READWRITE));
97
98         g_object_class_install_property (object_class,
99                                          PROP_NAME,
100                                          g_param_spec_string ("name",
101                                                               "Chatroom Name",
102                                                               "Chatroom name",
103                                                               NULL,
104                                                               G_PARAM_READWRITE));
105
106         g_object_class_install_property (object_class,
107                                          PROP_AUTO_CONNECT,
108                                          g_param_spec_boolean ("auto_connect",
109                                                                "Chatroom Auto Connect",
110                                                                "Connect on startup",
111                                                                FALSE,
112                                                                G_PARAM_READWRITE));
113
114         g_object_class_install_property (object_class,
115                                          PROP_FAVORITE,
116                                          g_param_spec_boolean ("favorite",
117                                                                "Favorite",
118                                                                "TRUE if the chatroom is in user's favorite list",
119                                                                FALSE,
120                                                                G_PARAM_READWRITE |
121                                                                G_PARAM_CONSTRUCT));
122
123         g_object_class_install_property (object_class,
124                                          PROP_TP_CHAT,
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,
129                                                               G_PARAM_READWRITE));
130
131   g_object_class_install_property (object_class,
132       PROP_SUBJECT,
133       g_param_spec_string ("subject",
134         "Subject",
135         "The chatroom's subject",
136         "",
137         G_PARAM_READWRITE |
138         G_PARAM_CONSTRUCT |
139         G_PARAM_STATIC_NAME |
140         G_PARAM_STATIC_NICK |
141         G_PARAM_STATIC_BLURB));
142
143   g_object_class_install_property (object_class,
144       PROP_MEMBERS_COUNT,
145       g_param_spec_uint ("members-count",
146         "Members count",
147         "The chatroom's members count",
148         0,
149         G_MAXUINT,
150         0,
151         G_PARAM_READWRITE |
152         G_PARAM_CONSTRUCT |
153         G_PARAM_STATIC_NAME |
154         G_PARAM_STATIC_NICK |
155         G_PARAM_STATIC_BLURB));
156
157   g_object_class_install_property (object_class,
158       PROP_INVITE_ONLY,
159       g_param_spec_boolean ("invite-only",
160         "Invite Only",
161         "The chatroom is invite only",
162         FALSE,
163         G_PARAM_READWRITE |
164         G_PARAM_CONSTRUCT |
165         G_PARAM_STATIC_NAME |
166         G_PARAM_STATIC_NICK |
167         G_PARAM_STATIC_BLURB));
168
169   g_object_class_install_property (object_class,
170       PROP_NEED_PASSWORD,
171       g_param_spec_boolean ("need-password",
172         "Password Needed",
173         "The chatroom is password protected",
174         FALSE,
175         G_PARAM_READWRITE |
176         G_PARAM_CONSTRUCT |
177         G_PARAM_STATIC_NAME |
178         G_PARAM_STATIC_NICK |
179         G_PARAM_STATIC_BLURB));
180
181         g_type_class_add_private (object_class, sizeof (EmpathyChatroomPriv));
182 }
183
184 static void
185 empathy_chatroom_init (EmpathyChatroom *chatroom)
186 {
187         EmpathyChatroomPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (chatroom,
188                 EMPATHY_TYPE_CHATROOM, EmpathyChatroomPriv);
189
190         chatroom->priv = priv;
191 }
192
193 static void
194 chatroom_finalize (GObject *object)
195 {
196         EmpathyChatroomPriv *priv;
197
198         priv = GET_PRIV (object);
199
200         if (priv->tp_chat != NULL)
201                 g_object_unref (priv->tp_chat);
202
203         g_object_unref (priv->account);
204         g_free (priv->room);
205         g_free (priv->name);
206
207         (G_OBJECT_CLASS (empathy_chatroom_parent_class)->finalize) (object);
208 }
209
210 static void
211 chatroom_get_property (GObject    *object,
212                        guint       param_id,
213                        GValue     *value,
214                        GParamSpec *pspec)
215 {
216         EmpathyChatroomPriv *priv;
217
218         priv = GET_PRIV (object);
219
220         switch (param_id) {
221         case PROP_ACCOUNT:
222                 g_value_set_object (value, priv->account);
223                 break;
224         case PROP_ROOM:
225                 g_value_set_string (value, priv->room);
226                 break;
227         case PROP_NAME:
228                 g_value_set_string (value, priv->name);
229                 break;
230         case PROP_AUTO_CONNECT:
231                 g_value_set_boolean (value, priv->auto_connect);
232                 break;
233         case PROP_FAVORITE:
234                 g_value_set_boolean (value, priv->favorite);
235                 break;
236         case PROP_TP_CHAT:
237                 g_value_set_object (value, priv->tp_chat);
238                 break;
239   case PROP_SUBJECT:
240     g_value_set_string (value, priv->subject);
241     break;
242   case PROP_MEMBERS_COUNT:
243     g_value_set_uint (value, priv->members_count);
244     break;
245   case PROP_INVITE_ONLY:
246     g_value_set_boolean (value, priv->invite_only);
247     break;
248   case PROP_NEED_PASSWORD:
249     g_value_set_boolean (value, priv->need_password);
250     break;
251         default:
252                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
253                 break;
254         };
255 }
256
257 static void
258 chatroom_set_property (GObject      *object,
259                        guint         param_id,
260                        const GValue *value,
261                        GParamSpec   *pspec)
262 {
263         EmpathyChatroomPriv *priv;
264
265         priv = GET_PRIV (object);
266
267         switch (param_id) {
268         case PROP_ACCOUNT:
269                 empathy_chatroom_set_account (EMPATHY_CHATROOM (object),
270                                              g_value_get_object (value));
271                 break;
272         case PROP_ROOM:
273                 empathy_chatroom_set_room (EMPATHY_CHATROOM (object),
274                                           g_value_get_string (value));
275                 break;
276         case PROP_NAME:
277                 empathy_chatroom_set_name (EMPATHY_CHATROOM (object),
278                                           g_value_get_string (value));
279                 break;
280         case PROP_AUTO_CONNECT:
281                 empathy_chatroom_set_auto_connect (EMPATHY_CHATROOM (object),
282                                                   g_value_get_boolean (value));
283                 break;
284         case PROP_FAVORITE:
285                 empathy_chatroom_set_favorite (EMPATHY_CHATROOM (object),
286                                                g_value_get_boolean (value));
287                 break;
288         case PROP_TP_CHAT:
289                 empathy_chatroom_set_tp_chat (EMPATHY_CHATROOM (object),
290                                               g_value_get_object (value));
291                 break;
292   case PROP_SUBJECT:
293     empathy_chatroom_set_subject (EMPATHY_CHATROOM (object),
294         g_value_get_string (value));
295     break;
296   case PROP_MEMBERS_COUNT:
297     empathy_chatroom_set_members_count (EMPATHY_CHATROOM (object),
298         g_value_get_uint (value));
299     break;
300   case PROP_NEED_PASSWORD:
301     empathy_chatroom_set_need_password (EMPATHY_CHATROOM (object),
302         g_value_get_boolean (value));
303     break;
304   case PROP_INVITE_ONLY:
305     empathy_chatroom_set_invite_only (EMPATHY_CHATROOM (object),
306         g_value_get_boolean (value));
307     break;
308         default:
309                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
310                 break;
311         };
312 }
313
314 EmpathyChatroom *
315 empathy_chatroom_new (TpAccount *account)
316 {
317         return g_object_new (EMPATHY_TYPE_CHATROOM,
318                              "account", account,
319                              NULL);
320 }
321
322 EmpathyChatroom *
323 empathy_chatroom_new_full (TpAccount *account,
324                           const gchar *room,
325                           const gchar *name,
326                           gboolean     auto_connect)
327 {
328         g_return_val_if_fail (room != NULL, NULL);
329
330         return g_object_new (EMPATHY_TYPE_CHATROOM,
331                              "account", account,
332                              "room", room,
333                              "name", name,
334                              "auto_connect", auto_connect,
335                              NULL);
336 }
337
338 TpAccount *
339 empathy_chatroom_get_account (EmpathyChatroom *chatroom)
340 {
341         EmpathyChatroomPriv *priv;
342
343         g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), NULL);
344
345         priv = GET_PRIV (chatroom);
346         return priv->account;
347 }
348
349 void
350 empathy_chatroom_set_account (EmpathyChatroom *chatroom,
351                              TpAccount *account)
352 {
353         EmpathyChatroomPriv *priv;
354
355         g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
356
357         priv = GET_PRIV (chatroom);
358
359         if (account == priv->account) {
360                 return;
361         }
362         if (priv->account) {
363                 g_object_unref (priv->account);
364         }
365         priv->account = g_object_ref (account);
366
367         g_object_notify (G_OBJECT (chatroom), "account");
368 }
369
370 const gchar *
371 empathy_chatroom_get_room (EmpathyChatroom *chatroom)
372 {
373         EmpathyChatroomPriv *priv;
374
375         g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), NULL);
376
377         priv = GET_PRIV (chatroom);
378         return priv->room;
379 }
380
381 void
382 empathy_chatroom_set_room (EmpathyChatroom *chatroom,
383                           const gchar    *room)
384 {
385         EmpathyChatroomPriv *priv;
386
387         g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
388         g_return_if_fail (room != NULL);
389
390         priv = GET_PRIV (chatroom);
391
392         g_free (priv->room);
393         priv->room = g_strdup (room);
394
395         g_object_notify (G_OBJECT (chatroom), "room");
396 }
397
398 const gchar *
399 empathy_chatroom_get_name (EmpathyChatroom *chatroom)
400 {
401         EmpathyChatroomPriv *priv;
402
403         g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), NULL);
404
405         priv = GET_PRIV (chatroom);
406
407         if (EMP_STR_EMPTY (priv->name)) {
408                 return priv->room;
409         }
410
411         return priv->name;
412 }
413
414 void
415 empathy_chatroom_set_name (EmpathyChatroom *chatroom,
416                           const gchar    *name)
417 {
418         EmpathyChatroomPriv *priv;
419
420         g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
421
422         priv = GET_PRIV (chatroom);
423
424         g_free (priv->name);
425         priv->name = NULL;
426         if (name) {
427                 priv->name = g_strdup (name);
428         }
429
430         g_object_notify (G_OBJECT (chatroom), "name");
431 }
432
433 gboolean
434 empathy_chatroom_get_auto_connect (EmpathyChatroom *chatroom)
435 {
436         EmpathyChatroomPriv *priv;
437
438         g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), FALSE);
439
440         priv = GET_PRIV (chatroom);
441         return priv->auto_connect;
442 }
443
444 void
445 empathy_chatroom_set_auto_connect (EmpathyChatroom *chatroom,
446                                   gboolean        auto_connect)
447 {
448         EmpathyChatroomPriv *priv;
449
450         g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
451
452         priv = GET_PRIV (chatroom);
453
454         priv->auto_connect = auto_connect;
455
456         if (priv->auto_connect) {
457                 /* auto_connect implies favorite */
458                 priv->favorite = TRUE;
459                 g_object_notify (G_OBJECT (chatroom), "favorite");
460         }
461
462         g_object_notify (G_OBJECT (chatroom), "auto-connect");
463 }
464
465 gboolean
466 empathy_chatroom_equal (gconstpointer v1,
467                        gconstpointer v2)
468 {
469         TpAccount *account_a;
470         TpAccount *account_b;
471         const gchar *room_a;
472         const gchar *room_b;
473
474         g_return_val_if_fail (EMPATHY_IS_CHATROOM (v1), FALSE);
475         g_return_val_if_fail (EMPATHY_IS_CHATROOM (v2), FALSE);
476
477         account_a = empathy_chatroom_get_account (EMPATHY_CHATROOM (v1));
478         account_b = empathy_chatroom_get_account (EMPATHY_CHATROOM (v2));
479
480         room_a = empathy_chatroom_get_room (EMPATHY_CHATROOM (v1));
481         room_b = empathy_chatroom_get_room (EMPATHY_CHATROOM (v2));
482
483         return account_a == account_b && !tp_strdiff (room_a, room_b);
484 }
485
486 EmpathyTpChat *
487 empathy_chatroom_get_tp_chat (EmpathyChatroom *chatroom)
488 {
489         EmpathyChatroomPriv *priv;
490
491         g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), NULL);
492
493         priv = GET_PRIV (chatroom);
494
495         return priv->tp_chat;
496 }
497
498 const gchar *
499 empathy_chatroom_get_subject (EmpathyChatroom *chatroom)
500 {
501   EmpathyChatroomPriv *priv;
502
503   g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), NULL);
504
505   priv = GET_PRIV (chatroom);
506
507   return priv->subject;
508 }
509
510 void
511 empathy_chatroom_set_subject (EmpathyChatroom *chatroom,
512                               const gchar *subject)
513 {
514   EmpathyChatroomPriv *priv;
515
516   g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
517
518   priv = GET_PRIV (chatroom);
519
520   g_free (priv->subject);
521   priv->subject = NULL;
522
523   if (subject)
524     priv->subject = g_strdup (subject);
525
526   g_object_notify (G_OBJECT (chatroom), "subject");
527 }
528
529 guint
530 empathy_chatroom_get_members_count (EmpathyChatroom *chatroom)
531 {
532   EmpathyChatroomPriv *priv;
533
534   g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), 0);
535
536   priv = GET_PRIV (chatroom);
537
538   return priv->members_count;
539 }
540
541 void
542 empathy_chatroom_set_members_count (EmpathyChatroom *chatroom,
543                                     guint count)
544 {
545   EmpathyChatroomPriv *priv;
546
547   g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
548
549   priv = GET_PRIV (chatroom);
550
551   priv->members_count = count;
552
553   g_object_notify (G_OBJECT (chatroom), "members-count");
554 }
555
556 gboolean
557 empathy_chatroom_get_need_password (EmpathyChatroom *chatroom)
558 {
559   EmpathyChatroomPriv *priv;
560
561   g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), FALSE);
562
563   priv = GET_PRIV (chatroom);
564
565   return priv->need_password;
566 }
567
568 void
569 empathy_chatroom_set_need_password (EmpathyChatroom *chatroom,
570                                     gboolean need_password)
571 {
572   EmpathyChatroomPriv *priv;
573
574   g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
575
576   priv = GET_PRIV (chatroom);
577
578   priv->need_password = need_password;
579
580   g_object_notify (G_OBJECT (chatroom), "need-password");
581 }
582
583 gboolean
584 empathy_chatroom_get_invite_only (EmpathyChatroom *chatroom)
585 {
586   EmpathyChatroomPriv *priv;
587
588   g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), FALSE);
589
590   priv = GET_PRIV (chatroom);
591
592   return priv->invite_only;
593 }
594
595 void
596 empathy_chatroom_set_invite_only (EmpathyChatroom *chatroom,
597                                   gboolean invite_only)
598 {
599   EmpathyChatroomPriv *priv;
600
601   g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
602
603   priv = GET_PRIV (chatroom);
604
605   priv->invite_only = invite_only;
606
607   g_object_notify (G_OBJECT (chatroom), "invite-only");
608 }
609
610 void
611 empathy_chatroom_set_tp_chat (EmpathyChatroom *chatroom,
612                               EmpathyTpChat   *tp_chat)
613 {
614         EmpathyChatroomPriv *priv;
615
616         g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
617         g_return_if_fail (tp_chat == NULL || EMPATHY_IS_TP_CHAT (tp_chat));
618
619         priv = GET_PRIV (chatroom);
620
621         if (priv->tp_chat == tp_chat) {
622                 return;
623         }
624
625         if (priv->tp_chat != NULL) {
626                 g_object_unref (priv->tp_chat);
627         }
628
629         priv->tp_chat = tp_chat ? g_object_ref (tp_chat) : NULL;
630         g_object_notify (G_OBJECT (chatroom), "tp-chat");
631 }
632
633 gboolean
634 empathy_chatroom_is_favorite (EmpathyChatroom *chatroom)
635 {
636         EmpathyChatroomPriv *priv;
637
638         g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), FALSE);
639
640         priv = GET_PRIV (chatroom);
641
642         return priv->favorite;
643 }
644
645 void
646 empathy_chatroom_set_favorite (EmpathyChatroom *chatroom,
647                                gboolean         favorite)
648 {
649         EmpathyChatroomPriv *priv;
650
651         g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
652
653         priv = GET_PRIV (chatroom);
654
655         if (priv->favorite == favorite) {
656                 return;
657         }
658
659         priv->favorite = favorite;
660         if (!priv->favorite) {
661                 empathy_chatroom_set_auto_connect (chatroom, FALSE);
662         }
663         g_object_notify (G_OBJECT (chatroom), "favorite");
664 }
665