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