3 * Purple is the legal property of its developers, whose names are too numerous
4 * to list here. Please refer to the COPYRIGHT file distributed with this
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
23 #include "dbus-maybe.h"
24 #include "glibcompat.h"
30 #define PURPLE_MESSAGE_GET_PRIVATE(obj) \
31 (G_TYPE_INSTANCE_GET_PRIVATE((obj), PURPLE_TYPE_MESSAGE, PurpleMessagePrivate))
40 PurpleMessageFlags flags
;
41 } PurpleMessagePrivate
;
56 static GObjectClass
*parent_class
;
57 static GParamSpec
*properties
[PROP_LAST
];
59 static GHashTable
*messages
= NULL
;
61 /******************************************************************************
63 ******************************************************************************/
66 purple_message_new_outgoing(const gchar
*who
, const gchar
*contents
,
67 PurpleMessageFlags flags
)
69 g_warn_if_fail(!(flags
& PURPLE_MESSAGE_RECV
));
70 g_warn_if_fail(!(flags
& PURPLE_MESSAGE_SYSTEM
));
72 flags
|= PURPLE_MESSAGE_SEND
;
74 /* who may be NULL for outgoing MUC messages */
75 return g_object_new(PURPLE_TYPE_MESSAGE
,
76 "author-alias", _("Me"),
79 "time", (guint64
)time(NULL
),
85 purple_message_new_incoming(const gchar
*who
, const gchar
*contents
,
86 PurpleMessageFlags flags
, guint64 timestamp
)
88 g_warn_if_fail(!(flags
& PURPLE_MESSAGE_SEND
));
89 g_warn_if_fail(!(flags
& PURPLE_MESSAGE_SYSTEM
));
91 flags
|= PURPLE_MESSAGE_RECV
;
94 timestamp
= time(NULL
);
96 return g_object_new(PURPLE_TYPE_MESSAGE
,
106 purple_message_new_system(const gchar
*contents
, PurpleMessageFlags flags
)
108 g_warn_if_fail(!(flags
& PURPLE_MESSAGE_SEND
));
109 g_warn_if_fail(!(flags
& PURPLE_MESSAGE_RECV
));
111 flags
|= PURPLE_MESSAGE_SYSTEM
;
113 return g_object_new(PURPLE_TYPE_MESSAGE
,
114 "contents", contents
,
115 "time", (guint64
)time(NULL
),
121 purple_message_get_id(const PurpleMessage
*msg
)
123 PurpleMessagePrivate
*priv
= PURPLE_MESSAGE_GET_PRIVATE(msg
);
125 g_return_val_if_fail(priv
!= NULL
, 0);
131 purple_message_find_by_id(guint id
)
133 g_return_val_if_fail(id
> 0, NULL
);
135 return g_hash_table_lookup(messages
, GINT_TO_POINTER(id
));
139 purple_message_get_author(const PurpleMessage
*msg
)
141 PurpleMessagePrivate
*priv
= PURPLE_MESSAGE_GET_PRIVATE(msg
);
143 g_return_val_if_fail(priv
!= NULL
, NULL
);
149 purple_message_get_recipient(const PurpleMessage
*msg
)
151 PurpleMessagePrivate
*priv
= PURPLE_MESSAGE_GET_PRIVATE(msg
);
153 g_return_val_if_fail(priv
!= NULL
, NULL
);
155 return priv
->recipient
;
159 purple_message_set_author_alias(PurpleMessage
*msg
, const gchar
*alias
)
161 g_object_set(msg
, "author-alias", alias
, NULL
);
165 purple_message_get_author_alias(const PurpleMessage
*msg
)
167 PurpleMessagePrivate
*priv
= PURPLE_MESSAGE_GET_PRIVATE(msg
);
169 g_return_val_if_fail(priv
!= NULL
, NULL
);
171 if (priv
->author_alias
== NULL
)
172 return purple_message_get_author(msg
);
174 return priv
->author_alias
;
178 purple_message_set_contents(PurpleMessage
*msg
, const gchar
*cont
)
180 g_object_set(msg
, "contents", cont
, NULL
);
184 purple_message_get_contents(const PurpleMessage
*msg
)
186 PurpleMessagePrivate
*priv
= PURPLE_MESSAGE_GET_PRIVATE(msg
);
188 g_return_val_if_fail(priv
!= NULL
, NULL
);
190 return priv
->contents
;
194 purple_message_is_empty(const PurpleMessage
*msg
)
196 const gchar
*cont
= purple_message_get_contents(msg
);
198 return (cont
== NULL
|| cont
[0] == '\0');
202 purple_message_set_time(PurpleMessage
*msg
, guint64 msgtime
)
204 g_object_set(msg
, "time", msgtime
, NULL
);
208 purple_message_get_time(const PurpleMessage
*msg
)
210 PurpleMessagePrivate
*priv
= PURPLE_MESSAGE_GET_PRIVATE(msg
);
212 g_return_val_if_fail(priv
!= NULL
, 0);
214 return priv
->msgtime
;
218 purple_message_set_flags(PurpleMessage
*msg
, PurpleMessageFlags flags
)
220 g_object_set(msg
, "flags", flags
, NULL
);
224 purple_message_get_flags(const PurpleMessage
*msg
)
226 PurpleMessagePrivate
*priv
= PURPLE_MESSAGE_GET_PRIVATE(msg
);
228 g_return_val_if_fail(priv
!= NULL
, 0);
233 /******************************************************************************
235 ******************************************************************************/
238 purple_message_init(GTypeInstance
*instance
, gpointer klass
)
240 static guint max_id
= 0;
242 PurpleMessage
*msg
= PURPLE_MESSAGE(instance
);
243 PurpleMessagePrivate
*priv
= PURPLE_MESSAGE_GET_PRIVATE(msg
);
244 PURPLE_DBUS_REGISTER_POINTER(msg
, PurpleMessage
);
247 g_hash_table_insert(messages
, GINT_TO_POINTER(max_id
), msg
);
251 purple_message_finalize(GObject
*obj
)
253 PurpleMessage
*message
= PURPLE_MESSAGE(obj
);
254 PurpleMessagePrivate
*priv
= PURPLE_MESSAGE_GET_PRIVATE(message
);
256 g_free(priv
->author
);
257 g_free(priv
->author_alias
);
258 g_free(priv
->recipient
);
259 g_free(priv
->contents
);
261 G_OBJECT_CLASS(parent_class
)->finalize(obj
);
265 purple_message_get_property(GObject
*object
, guint par_id
, GValue
*value
,
268 PurpleMessage
*message
= PURPLE_MESSAGE(object
);
269 PurpleMessagePrivate
*priv
= PURPLE_MESSAGE_GET_PRIVATE(message
);
273 g_value_set_uint(value
, priv
->id
);
276 g_value_set_string(value
, priv
->author
);
278 case PROP_AUTHOR_ALIAS
:
279 g_value_set_string(value
, priv
->author_alias
);
282 g_value_set_string(value
, priv
->recipient
);
285 g_value_set_string(value
, priv
->contents
);
288 g_value_set_uint64(value
, priv
->msgtime
);
291 g_value_set_flags(value
, priv
->flags
);
294 G_OBJECT_WARN_INVALID_PROPERTY_ID(object
, par_id
, pspec
);
300 purple_message_set_property(GObject
*object
, guint par_id
, const GValue
*value
,
303 PurpleMessage
*message
= PURPLE_MESSAGE(object
);
304 PurpleMessagePrivate
*priv
= PURPLE_MESSAGE_GET_PRIVATE(message
);
308 g_free(priv
->author
);
309 priv
->author
= g_strdup(g_value_get_string(value
));
311 case PROP_AUTHOR_ALIAS
:
312 g_free(priv
->author_alias
);
313 priv
->author_alias
= g_strdup(g_value_get_string(value
));
316 g_free(priv
->recipient
);
317 priv
->recipient
= g_strdup(g_value_get_string(value
));
320 g_free(priv
->contents
);
321 priv
->contents
= g_strdup(g_value_get_string(value
));
324 priv
->msgtime
= g_value_get_uint64(value
);
327 priv
->flags
= g_value_get_flags(value
);
330 G_OBJECT_WARN_INVALID_PROPERTY_ID(object
, par_id
, pspec
);
336 purple_message_class_init(PurpleMessageClass
*klass
)
338 GObjectClass
*gobj_class
= G_OBJECT_CLASS(klass
);
340 parent_class
= g_type_class_peek_parent(klass
);
342 g_type_class_add_private(klass
, sizeof(PurpleMessagePrivate
));
344 gobj_class
->finalize
= purple_message_finalize
;
345 gobj_class
->get_property
= purple_message_get_property
;
346 gobj_class
->set_property
= purple_message_set_property
;
348 properties
[PROP_ID
] = g_param_spec_uint("id",
349 "ID", "The session-unique message id",
350 0, G_MAXUINT
, 0, G_PARAM_READABLE
| G_PARAM_STATIC_STRINGS
);
351 properties
[PROP_AUTHOR
] = g_param_spec_string("author",
352 "Author", "The username of the person, who sent the message.",
353 NULL
, G_PARAM_READWRITE
| G_PARAM_STATIC_STRINGS
);
354 properties
[PROP_AUTHOR_ALIAS
] = g_param_spec_string("author-alias",
355 "Author's alias", "The alias of the person, who sent the "
356 "message. For outgoing messages, it's your alias.",
357 NULL
, G_PARAM_READWRITE
| G_PARAM_STATIC_STRINGS
);
358 properties
[PROP_RECIPIENT
] = g_param_spec_string("recipient",
359 "Recipient", "The username of the recipient.",
360 NULL
, G_PARAM_READWRITE
| G_PARAM_STATIC_STRINGS
);
361 properties
[PROP_CONTENTS
] = g_param_spec_string("contents",
362 "Contents", "The message text",
363 NULL
, G_PARAM_READWRITE
| G_PARAM_STATIC_STRINGS
);
364 properties
[PROP_TIME
] = g_param_spec_uint64("time",
365 "Time", "Message timestamp",
366 0, G_MAXUINT64
, 0, G_PARAM_READWRITE
| G_PARAM_STATIC_STRINGS
);
367 properties
[PROP_FLAGS
] = g_param_spec_flags("flags",
368 "Flags", "Bitwise set of #PurpleMessageFlags flags",
369 PURPLE_TYPE_MESSAGE_FLAGS
, 0,
370 G_PARAM_READWRITE
| G_PARAM_STATIC_STRINGS
);
372 g_object_class_install_properties(gobj_class
, PROP_LAST
, properties
);
376 purple_message_get_type(void)
378 static GType type
= 0;
380 if (G_UNLIKELY(type
== 0)) {
381 static const GTypeInfo info
= {
382 .class_size
= sizeof(PurpleMessageClass
),
383 .class_init
= (GClassInitFunc
)purple_message_class_init
,
384 .instance_size
= sizeof(PurpleMessage
),
385 .instance_init
= purple_message_init
,
388 type
= g_type_register_static(G_TYPE_OBJECT
,
389 "PurpleMessage", &info
, 0);
396 _purple_message_init(void)
398 messages
= g_hash_table_new_full(g_direct_hash
, g_direct_equal
,
399 NULL
, g_object_unref
);
403 _purple_message_uninit(void)
405 g_hash_table_destroy(messages
);