libpurple/message.c

changeset 36075
dfb5988e053b
parent 36074
4f7b1fea3cd3
child 36076
a0e5b68ff4ef
--- 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 @@
  */
 
 #include "internal.h"
+#include "dbus-maybe.h"
 #include "glibcompat.h"
 
 #include "debug.h"
@@ -29,6 +30,7 @@
 	(G_TYPE_INSTANCE_GET_PRIVATE((obj), PURPLE_TYPE_MESSAGE, PurpleMessagePrivate))
 
 typedef struct {
+	guint id;
 	gchar *who;
 	gchar *contents;
 	PurpleMessageFlags flags;
@@ -37,6 +39,7 @@
 enum
 {
 	PROP_0,
+	PROP_ID,
 	PROP_WHO,
 	PROP_CONTENTS,
 	PROP_FLAGS,
@@ -46,6 +49,8 @@
 static GObjectClass *parent_class;
 static GParamSpec *properties[PROP_LAST];
 
+static GHashTable *messages = NULL;
+
 /******************************************************************************
  * API implementation
  ******************************************************************************/
@@ -64,11 +69,42 @@
 		NULL);
 }
 
+guint
+purple_message_get_id(PurpleMessage *msg)
+{
+	PurpleMessagePrivate *priv = PURPLE_MESSAGE_GET_PRIVATE(msg);
+
+	g_return_val_if_fail(priv != NULL, 0);
+
+	return priv->id;
+}
+
+PurpleMessage *
+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));
+}
+
 /******************************************************************************
  * Object stuff
  ******************************************************************************/
 
 static void
+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);
+
+	priv->id = ++max_id;
+	g_hash_table_insert(messages, GINT_TO_POINTER(max_id), msg);
+}
+
+static void
 purple_message_finalize(GObject *obj)
 {
 	PurpleMessage *message = PURPLE_MESSAGE(obj);
@@ -88,6 +124,9 @@
 	PurpleMessagePrivate *priv = PURPLE_MESSAGE_GET_PRIVATE(message);
 
 	switch (par_id) {
+		case PROP_ID:
+			g_value_set_uint(value, priv->id);
+			break;
 		case PROP_WHO:
 			g_value_set_string(value, priv->who);
 			break;
@@ -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 @@
 
 	return type;
 }
+
+void
+_purple_message_init(void)
+{
+	messages = g_hash_table_new_full(g_direct_hash, g_direct_equal,
+		NULL, g_object_unref);
+}
+
+void
+_purple_message_uninit(void)
+{
+	g_hash_table_destroy(messages);
+	messages = NULL;
+}

mercurial