/pidgin/main: dfb5988e053b: PurpleMessage: implement IDs and sto...

Tomasz Wasilczyk <[email protected]>
Newsgroups gmane.comp.gnome.gaim.cvs
Message-ID <[email protected]>
Changeset: dfb5988e053b7e53e0a267cfb086b14f8789f3b4
Author:	 Tomasz Wasilczyk <[email protected]>
Date:	 2014-05-22 14:08 +0200
Branch:	 default
URL: https://hg.pidgin.im/pidgin/main/rev/dfb5988e053b

Description:

PurpleMessage: implement IDs and storage-by-id

diffstat:

 libpurple/core.c    |   3 ++
 libpurple/message.c |  59 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
 libpurple/message.h |  12 ++++++++++
 3 files changed, 73 insertions(+), 1 deletions(-)

diffs (176 lines):

diff --git a/libpurple/core.c b/libpurple/core.c
--- a/libpurple/core.c
+++ b/libpurple/core.c
@@ -33,6 +33,7 @@
 #include "idle.h"
 #include "image-store.h"
 #include "keyring.h"
+#include "message.h"
 #include "network.h"
 #include "notify.h"
 #include "plugin.h"
@@ -191,6 +192,7 @@ purple_core_init(const char *ui)
 	purple_savedstatuses_init();
 	purple_notify_init();
 	purple_certificate_init();
+	_purple_message_init();
 	purple_conversations_init();
 	purple_blist_init();
 	purple_log_init();
@@ -301,6 +303,7 @@ purple_core_quit(void)
 
 	purple_cmds_uninit();
 	purple_log_uninit();
+	_purple_message_uninit();
 	/* Everything after util_uninit cannot try to write things to the
 	 * confdir nor use purple_escape_js
 	 */
diff --git a/libpurple/message.c b/libpurple/message.c
--- a/libpurple/message.c
+++ b/libpurple/message.c
@@ -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 @@ typedef struct {
 enum
 {
 	PROP_0,
+	PROP_ID,
 	PROP_WHO,
 	PROP_CONTENTS,
 	PROP_FLAGS,
@@ -46,6 +49,8 @@ enum
 static GObjectClass *parent_class;
 static GParamSpec *properties[PROP_LAST];
 
+static GHashTable *messages = NULL;
+
 /******************************************************************************
  * API implementation
  ******************************************************************************/
@@ -64,11 +69,42 @@ purple_message_new(const gchar *who, con
 		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 @@ purple_message_get_property(GObject *obj
 	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 @@ purple_message_class_init(PurpleMessageC
 	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 @@ purple_message_get_type(void)
 		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_get_type(void)
 
 	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;
+}
diff --git a/libpurple/message.h b/libpurple/message.h
--- a/libpurple/message.h
+++ b/libpurple/message.h
@@ -86,6 +86,18 @@ PurpleMessage *
 purple_message_new(const gchar *who, const gchar *contents,
 	PurpleMessageFlags flags);
 
+guint
+purple_message_get_id(PurpleMessage *msg);
+
+PurpleMessage *
+purple_message_find_by_id(guint id);
+
+void
+_purple_message_init(void);
+
+void
+_purple_message_uninit(void);
+
 G_END_DECLS
 
 #endif /* _PURPLE_MESSAGE_H_ */
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.