]> git.0d.be Git - empathy.git/blob - libempathy/empathy-chatroom.c
Move contact_set_ready_flag() in _set_name() and _set_handle().
[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
28 #include "empathy-chatroom.h"
29 #include "empathy-utils.h"
30
31 #define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyChatroom)
32 typedef struct {
33         McAccount *account;
34         gchar     *room;
35         gchar     *name;
36         gboolean   auto_connect;
37 } EmpathyChatroomPriv;
38
39
40 static void chatroom_finalize          (GObject             *object);
41 static void chatroom_get_property      (GObject             *object,
42                                         guint                param_id,
43                                         GValue              *value,
44                                         GParamSpec          *pspec);
45 static void chatroom_set_property      (GObject             *object,
46                                         guint                param_id,
47                                         const GValue        *value,
48                                         GParamSpec          *pspec);
49
50 enum {
51         PROP_0,
52         PROP_ACCOUNT,
53         PROP_ROOM,
54         PROP_NAME,
55         PROP_AUTO_CONNECT,
56 };
57
58 G_DEFINE_TYPE (EmpathyChatroom, empathy_chatroom, G_TYPE_OBJECT);
59
60 static void
61 empathy_chatroom_class_init (EmpathyChatroomClass *klass)
62 {
63         GObjectClass *object_class = G_OBJECT_CLASS (klass);
64
65         object_class->finalize     = chatroom_finalize;
66         object_class->get_property = chatroom_get_property;
67         object_class->set_property = chatroom_set_property;
68
69         g_object_class_install_property (object_class,
70                                          PROP_ACCOUNT,
71                                          g_param_spec_object ("account",
72                                                               "Chatroom Account",
73                                                               "The account associated with an chatroom",
74                                                               MC_TYPE_ACCOUNT,
75                                                               G_PARAM_READWRITE));
76
77         g_object_class_install_property (object_class,
78                                          PROP_ROOM,
79                                          g_param_spec_string ("room",
80                                                               "Chatroom Room",
81                                                               "Chatroom represented as 'room@server'",
82                                                               NULL,
83                                                               G_PARAM_READWRITE));
84
85         g_object_class_install_property (object_class,
86                                          PROP_NAME,
87                                          g_param_spec_string ("name",
88                                                               "Chatroom Name",
89                                                               "Chatroom name",
90                                                               NULL,
91                                                               G_PARAM_READWRITE));
92
93         g_object_class_install_property (object_class,
94                                          PROP_AUTO_CONNECT,
95                                          g_param_spec_boolean ("auto_connect",
96                                                                "Chatroom Auto Connect",
97                                                                "Connect on startup",
98                                                                FALSE,
99                                                                G_PARAM_READWRITE));
100
101
102         g_type_class_add_private (object_class, sizeof (EmpathyChatroomPriv));
103 }
104
105 static void
106 empathy_chatroom_init (EmpathyChatroom *chatroom)
107 {
108         EmpathyChatroomPriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (chatroom,
109                 EMPATHY_TYPE_CHATROOM, EmpathyChatroomPriv);
110
111         chatroom->priv = priv;
112 }
113
114 static void
115 chatroom_finalize (GObject *object)
116 {
117         EmpathyChatroomPriv *priv;
118
119         priv = GET_PRIV (object);
120
121         g_object_unref (priv->account);
122         g_free (priv->room);
123         g_free (priv->name);
124
125         (G_OBJECT_CLASS (empathy_chatroom_parent_class)->finalize) (object);
126 }
127
128 static void
129 chatroom_get_property (GObject    *object,
130                        guint       param_id,
131                        GValue     *value,
132                        GParamSpec *pspec)
133 {
134         EmpathyChatroomPriv *priv;
135
136         priv = GET_PRIV (object);
137
138         switch (param_id) {
139         case PROP_ACCOUNT:
140                 g_value_set_object (value, priv->account);
141                 break;
142         case PROP_ROOM:
143                 g_value_set_string (value, priv->room);
144                 break;
145         case PROP_NAME:
146                 g_value_set_string (value, priv->name);
147                 break;
148         case PROP_AUTO_CONNECT:
149                 g_value_set_boolean (value, priv->auto_connect);
150                 break;
151         default:
152                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
153                 break;
154         };
155 }
156
157 static void
158 chatroom_set_property (GObject      *object,
159                        guint         param_id,
160                        const GValue *value,
161                        GParamSpec   *pspec)
162 {
163         EmpathyChatroomPriv *priv;
164
165         priv = GET_PRIV (object);
166
167         switch (param_id) {
168         case PROP_ACCOUNT:
169                 empathy_chatroom_set_account (EMPATHY_CHATROOM (object),
170                                              g_value_get_object (value));
171                 break;
172         case PROP_ROOM:
173                 empathy_chatroom_set_room (EMPATHY_CHATROOM (object),
174                                           g_value_get_string (value));
175                 break;
176         case PROP_NAME:
177                 empathy_chatroom_set_name (EMPATHY_CHATROOM (object),
178                                           g_value_get_string (value));
179                 break;
180         case PROP_AUTO_CONNECT:
181                 empathy_chatroom_set_auto_connect (EMPATHY_CHATROOM (object),
182                                                   g_value_get_boolean (value));
183                 break;
184         default:
185                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
186                 break;
187         };
188 }
189
190 EmpathyChatroom *
191 empathy_chatroom_new (McAccount   *account,
192                      const gchar *room)
193 {
194         g_return_val_if_fail (MC_IS_ACCOUNT (account), NULL);
195         g_return_val_if_fail (room != NULL, NULL);
196
197         return g_object_new (EMPATHY_TYPE_CHATROOM,
198                              "account", account,
199                              "room", room,
200                              NULL);
201 }
202
203 EmpathyChatroom *
204 empathy_chatroom_new_full (McAccount   *account,
205                           const gchar *room,
206                           const gchar *name,
207                           gboolean     auto_connect)
208 {
209         g_return_val_if_fail (MC_IS_ACCOUNT (account), NULL);
210         g_return_val_if_fail (room != NULL, NULL);
211
212         return g_object_new (EMPATHY_TYPE_CHATROOM,
213                              "account", account,
214                              "room", room,
215                              "name", name,
216                              "auto_connect", auto_connect,
217                              NULL);
218 }
219
220 McAccount *
221 empathy_chatroom_get_account (EmpathyChatroom *chatroom)
222 {
223         EmpathyChatroomPriv *priv;
224
225         g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), NULL);
226
227         priv = GET_PRIV (chatroom);
228         return priv->account;
229 }
230
231 void
232 empathy_chatroom_set_account (EmpathyChatroom *chatroom,
233                              McAccount      *account)
234 {
235         EmpathyChatroomPriv *priv;
236
237         g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
238         g_return_if_fail (MC_IS_ACCOUNT (account));
239
240         priv = GET_PRIV (chatroom);
241
242         if (account == priv->account) {
243                 return;
244         }
245         if (priv->account) {
246                 g_object_unref (priv->account);
247         }
248         priv->account = g_object_ref (account);
249
250         g_object_notify (G_OBJECT (chatroom), "account");
251 }
252
253 const gchar *
254 empathy_chatroom_get_room (EmpathyChatroom *chatroom)
255 {
256         EmpathyChatroomPriv *priv;
257
258         g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), NULL);
259
260         priv = GET_PRIV (chatroom);
261         return priv->room;
262 }
263
264 void
265 empathy_chatroom_set_room (EmpathyChatroom *chatroom,
266                           const gchar    *room)
267 {
268         EmpathyChatroomPriv *priv;
269
270         g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
271         g_return_if_fail (room != NULL);
272
273         priv = GET_PRIV (chatroom);
274
275         g_free (priv->room);
276         priv->room = g_strdup (room);
277
278         g_object_notify (G_OBJECT (chatroom), "room");
279 }
280
281 const gchar *
282 empathy_chatroom_get_name (EmpathyChatroom *chatroom)
283 {
284         EmpathyChatroomPriv *priv;
285
286         g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), NULL);
287
288         priv = GET_PRIV (chatroom);
289         
290         if (G_STR_EMPTY (priv->name)) {
291                 return priv->room;
292         }
293         
294         return priv->name;
295 }
296
297 void
298 empathy_chatroom_set_name (EmpathyChatroom *chatroom,
299                           const gchar    *name)
300 {
301         EmpathyChatroomPriv *priv;
302
303         g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
304
305         priv = GET_PRIV (chatroom);
306
307         g_free (priv->name);
308         priv->name = NULL;
309         if (name) {
310                 priv->name = g_strdup (name);
311         }
312
313         g_object_notify (G_OBJECT (chatroom), "name");
314 }
315
316 gboolean
317 empathy_chatroom_get_auto_connect (EmpathyChatroom *chatroom)
318 {
319         EmpathyChatroomPriv *priv;
320
321         g_return_val_if_fail (EMPATHY_IS_CHATROOM (chatroom), FALSE);
322
323         priv = GET_PRIV (chatroom);
324         return priv->auto_connect;
325 }
326
327 void
328 empathy_chatroom_set_auto_connect (EmpathyChatroom *chatroom,
329                                   gboolean        auto_connect)
330 {
331         EmpathyChatroomPriv *priv;
332
333         g_return_if_fail (EMPATHY_IS_CHATROOM (chatroom));
334
335         priv = GET_PRIV (chatroom);
336
337         priv->auto_connect = auto_connect;
338
339         g_object_notify (G_OBJECT (chatroom), "auto-connect");
340 }
341
342 gboolean
343 empathy_chatroom_equal (gconstpointer v1,
344                        gconstpointer v2)
345 {
346         McAccount   *account_a;
347         McAccount   *account_b;
348         const gchar *room_a;
349         const gchar *room_b;
350
351         g_return_val_if_fail (EMPATHY_IS_CHATROOM (v1), FALSE);
352         g_return_val_if_fail (EMPATHY_IS_CHATROOM (v2), FALSE);
353
354         account_a = empathy_chatroom_get_account (EMPATHY_CHATROOM (v1));
355         account_b = empathy_chatroom_get_account (EMPATHY_CHATROOM (v2));
356
357         room_a = empathy_chatroom_get_room (EMPATHY_CHATROOM (v1));
358         room_b = empathy_chatroom_get_room (EMPATHY_CHATROOM (v2));
359
360         return empathy_account_equal (account_a, account_b) && g_str_equal (room_a, room_b);
361 }
362
363