1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3 * Copyright (C) 2004-2007 Imendio AB
4 * Copyright (C) 2007 Collabora Ltd.
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 2 of the
9 * License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public
17 * License along with this program; if not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
21 * Authors: Mikael Hallendal <micke@imendio.com>
22 * Xavier Claessens <xclaesse@gmail.com>
29 #include "empathy-message.h"
30 #include "empathy-enum-types.h"
32 #define GET_PRIV(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EMPATHY_TYPE_MESSAGE, EmpathyMessagePriv))
34 typedef struct _EmpathyMessagePriv EmpathyMessagePriv;
36 struct _EmpathyMessagePriv {
37 EmpathyMessageType type;
38 EmpathyContact *sender;
39 EmpathyContact *receiver;
44 static void empathy_message_class_init (EmpathyMessageClass *class);
45 static void empathy_message_init (EmpathyMessage *message);
46 static void empathy_message_finalize (GObject *object);
47 static void message_get_property (GObject *object,
51 static void message_set_property (GObject *object,
65 static gpointer parent_class = NULL;
68 empathy_message_get_gtype (void)
70 static GType type = 0;
73 static const GTypeInfo info = {
74 sizeof (EmpathyMessageClass),
76 NULL, /* base_finalize */
77 (GClassInitFunc) empathy_message_class_init,
78 NULL, /* class_finalize */
79 NULL, /* class_data */
80 sizeof (EmpathyMessage),
82 (GInstanceInitFunc) empathy_message_init
85 type = g_type_register_static (G_TYPE_OBJECT,
94 empathy_message_class_init (EmpathyMessageClass *class)
96 GObjectClass *object_class;
98 object_class = G_OBJECT_CLASS (class);
99 parent_class = g_type_class_peek_parent (class);
101 object_class->finalize = empathy_message_finalize;
102 object_class->get_property = message_get_property;
103 object_class->set_property = message_set_property;
105 g_object_class_install_property (object_class,
107 g_param_spec_enum ("type",
109 "The type of message",
110 EMPATHY_TYPE_MESSAGE_TYPE,
111 EMPATHY_MESSAGE_TYPE_NORMAL,
113 g_object_class_install_property (object_class,
115 g_param_spec_object ("sender",
117 "The sender of the message",
118 EMPATHY_TYPE_CONTACT,
120 g_object_class_install_property (object_class,
122 g_param_spec_object ("receiver",
124 "The receiver of the message",
125 EMPATHY_TYPE_CONTACT,
127 g_object_class_install_property (object_class,
129 g_param_spec_string ("body",
131 "The content of the message",
134 g_object_class_install_property (object_class,
136 g_param_spec_long ("timestamp",
145 g_type_class_add_private (object_class, sizeof (EmpathyMessagePriv));
150 empathy_message_init (EmpathyMessage *message)
152 EmpathyMessagePriv *priv;
154 priv = GET_PRIV (message);
156 priv->timestamp = empathy_time_get_current ();
160 empathy_message_finalize (GObject *object)
162 EmpathyMessagePriv *priv;
164 priv = GET_PRIV (object);
167 g_object_unref (priv->sender);
169 if (priv->receiver) {
170 g_object_unref (priv->receiver);
175 (G_OBJECT_CLASS (parent_class)->finalize) (object);
179 message_get_property (GObject *object,
184 EmpathyMessagePriv *priv;
186 priv = GET_PRIV (object);
190 g_value_set_enum (value, priv->type);
193 g_value_set_object (value, priv->sender);
196 g_value_set_object (value, priv->receiver);
199 g_value_set_string (value, priv->body);
202 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
208 message_set_property (GObject *object,
213 EmpathyMessagePriv *priv;
215 priv = GET_PRIV (object);
219 empathy_message_set_type (EMPATHY_MESSAGE (object),
220 g_value_get_enum (value));
223 empathy_message_set_sender (EMPATHY_MESSAGE (object),
224 EMPATHY_CONTACT (g_value_get_object (value)));
227 empathy_message_set_receiver (EMPATHY_MESSAGE (object),
228 EMPATHY_CONTACT (g_value_get_object (value)));
231 empathy_message_set_body (EMPATHY_MESSAGE (object),
232 g_value_get_string (value));
235 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
241 empathy_message_new (const gchar *body)
243 return g_object_new (EMPATHY_TYPE_MESSAGE,
249 empathy_message_get_type (EmpathyMessage *message)
251 EmpathyMessagePriv *priv;
253 g_return_val_if_fail (EMPATHY_IS_MESSAGE (message),
254 EMPATHY_MESSAGE_TYPE_NORMAL);
256 priv = GET_PRIV (message);
262 empathy_message_set_type (EmpathyMessage *message,
263 EmpathyMessageType type)
265 EmpathyMessagePriv *priv;
267 g_return_if_fail (EMPATHY_IS_MESSAGE (message));
269 priv = GET_PRIV (message);
273 g_object_notify (G_OBJECT (message), "type");
277 empathy_message_get_sender (EmpathyMessage *message)
279 EmpathyMessagePriv *priv;
281 g_return_val_if_fail (EMPATHY_IS_MESSAGE (message), NULL);
283 priv = GET_PRIV (message);
289 empathy_message_set_sender (EmpathyMessage *message, EmpathyContact *contact)
291 EmpathyMessagePriv *priv;
292 EmpathyContact *old_sender;
294 g_return_if_fail (EMPATHY_IS_MESSAGE (message));
295 g_return_if_fail (EMPATHY_IS_CONTACT (contact));
297 priv = GET_PRIV (message);
299 old_sender = priv->sender;
300 priv->sender = g_object_ref (contact);
303 g_object_unref (old_sender);
306 g_object_notify (G_OBJECT (message), "sender");
310 empathy_message_get_receiver (EmpathyMessage *message)
312 EmpathyMessagePriv *priv;
314 g_return_val_if_fail (EMPATHY_IS_MESSAGE (message), NULL);
316 priv = GET_PRIV (message);
318 return priv->receiver;
322 empathy_message_set_receiver (EmpathyMessage *message, EmpathyContact *contact)
324 EmpathyMessagePriv *priv;
325 EmpathyContact *old_receiver;
327 g_return_if_fail (EMPATHY_IS_MESSAGE (message));
328 g_return_if_fail (EMPATHY_IS_CONTACT (contact));
330 priv = GET_PRIV (message);
332 old_receiver = priv->receiver;
333 priv->receiver = g_object_ref (contact);
336 g_object_unref (old_receiver);
339 g_object_notify (G_OBJECT (message), "receiver");
343 empathy_message_get_body (EmpathyMessage *message)
345 EmpathyMessagePriv *priv;
347 g_return_val_if_fail (EMPATHY_IS_MESSAGE (message), NULL);
349 priv = GET_PRIV (message);
355 empathy_message_set_body (EmpathyMessage *message,
358 EmpathyMessagePriv *priv;
359 EmpathyMessageType type;
361 g_return_if_fail (EMPATHY_IS_MESSAGE (message));
363 priv = GET_PRIV (message);
368 type = EMPATHY_MESSAGE_TYPE_NORMAL;
369 if (g_str_has_prefix (body, "/me")) {
370 type = EMPATHY_MESSAGE_TYPE_ACTION;
373 else if (g_str_has_prefix (body, "/say")) {
378 priv->body = g_strdup (body);
381 if (type != priv->type) {
382 empathy_message_set_type (message, type);
385 g_object_notify (G_OBJECT (message), "body");
389 empathy_message_get_timestamp (EmpathyMessage *message)
391 EmpathyMessagePriv *priv;
393 g_return_val_if_fail (EMPATHY_IS_MESSAGE (message), -1);
395 priv = GET_PRIV (message);
397 return priv->timestamp;
401 empathy_message_set_timestamp (EmpathyMessage *message,
404 EmpathyMessagePriv *priv;
406 g_return_if_fail (EMPATHY_IS_MESSAGE (message));
407 g_return_if_fail (timestamp >= -1);
409 priv = GET_PRIV (message);
411 if (timestamp <= 0) {
412 priv->timestamp = empathy_time_get_current ();
414 priv->timestamp = timestamp;
417 g_object_notify (G_OBJECT (message), "timestamp");
421 empathy_message_type_from_str (const gchar *type_str)
423 if (strcmp (type_str, "normal") == 0) {
424 return EMPATHY_MESSAGE_TYPE_NORMAL;
426 if (strcmp (type_str, "action") == 0) {
427 return EMPATHY_MESSAGE_TYPE_ACTION;
429 else if (strcmp (type_str, "notice") == 0) {
430 return EMPATHY_MESSAGE_TYPE_NOTICE;
432 else if (strcmp (type_str, "auto-reply") == 0) {
433 return EMPATHY_MESSAGE_TYPE_AUTO_REPLY;
436 return EMPATHY_MESSAGE_TYPE_NORMAL;
440 empathy_message_type_to_str (EmpathyMessageType type)
443 case EMPATHY_MESSAGE_TYPE_ACTION:
445 case EMPATHY_MESSAGE_TYPE_NOTICE:
447 case EMPATHY_MESSAGE_TYPE_AUTO_REPLY: