--- a/libpurple/core.c Thu May 22 13:48:07 2014 +0200
+++ b/libpurple/core.c Thu May 22 14:08:33 2014 +0200
@@ -33,6 +33,7 @@
@@ -191,6 +192,7 @@
purple_savedstatuses_init();
purple_certificate_init();
+ _purple_message_init(); purple_conversations_init();
@@ -301,6 +303,7 @@
+ _purple_message_uninit(); /* Everything after util_uninit cannot try to write things to the
* confdir nor use purple_escape_js
--- a/libpurple/message.c Thu May 22 13:48:07 2014 +0200
+++ b/libpurple/message.c Thu May 22 14:08:33 2014 +0200
@@ -20,6 +20,7 @@
@@ -29,6 +30,7 @@
(G_TYPE_INSTANCE_GET_PRIVATE((obj), PURPLE_TYPE_MESSAGE, PurpleMessagePrivate))
PurpleMessageFlags flags;
@@ -37,6 +39,7 @@
@@ -46,6 +49,8 @@
static GObjectClass *parent_class;
static GParamSpec *properties[PROP_LAST];
+static GHashTable *messages = NULL; /******************************************************************************
******************************************************************************/
@@ -64,11 +69,42 @@
+purple_message_get_id(PurpleMessage *msg) + PurpleMessagePrivate *priv = PURPLE_MESSAGE_GET_PRIVATE(msg); + g_return_val_if_fail(priv != NULL, 0); +purple_message_find_by_id(guint id) + g_return_val_if_fail(id > 0, NULL); + return g_hash_table_lookup(messages, GINT_TO_POINTER(id)); /******************************************************************************
******************************************************************************/
+purple_message_init(GTypeInstance *instance, gpointer klass) + static guint max_id = 0; + PurpleMessage *msg = PURPLE_MESSAGE(instance); + PurpleMessagePrivate *priv = PURPLE_MESSAGE_GET_PRIVATE(msg); + PURPLE_DBUS_REGISTER_POINTER(msg, PurpleMessage); + g_hash_table_insert(messages, GINT_TO_POINTER(max_id), msg); purple_message_finalize(GObject *obj)
PurpleMessage *message = PURPLE_MESSAGE(obj);
@@ -88,6 +124,9 @@
PurpleMessagePrivate *priv = PURPLE_MESSAGE_GET_PRIVATE(message);
+ g_value_set_uint(value, priv->id); g_value_set_string(value, priv->who);
@@ -141,6 +180,9 @@
gobj_class->get_property = purple_message_get_property;
gobj_class->set_property = purple_message_set_property;
+ properties[PROP_ID] = g_param_spec_uint("id", + "ID", "The session-unique message id", + 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); properties[PROP_WHO] = g_param_spec_string("who",
"Author", "The nick of the person, who sent the message",
NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
@@ -165,7 +207,8 @@
static const GTypeInfo info = {
.class_size = sizeof(PurpleMessageClass),
.class_init = (GClassInitFunc)purple_message_class_init,
- .instance_size = sizeof(PurpleMessage)
+ .instance_size = sizeof(PurpleMessage), + .instance_init = purple_message_init, type = g_type_register_static(G_TYPE_OBJECT,
@@ -174,3 +217,17 @@
+_purple_message_init(void) + messages = g_hash_table_new_full(g_direct_hash, g_direct_equal, +_purple_message_uninit(void) + g_hash_table_destroy(messages); --- a/libpurple/message.h Thu May 22 13:48:07 2014 +0200
+++ b/libpurple/message.h Thu May 22 14:08:33 2014 +0200
@@ -86,6 +86,18 @@
purple_message_new(const gchar *who, const gchar *contents,
PurpleMessageFlags flags);
+purple_message_get_id(PurpleMessage *msg); +purple_message_find_by_id(guint id); +_purple_message_init(void); +_purple_message_uninit(void); #endif /* _PURPLE_MESSAGE_H_ */