/pidgin/main: 4f7b1fea3cd3: Initial implementation for PurpleMes...

Tomasz Wasilczyk twasilczyk at pidgin.im
Thu May 22 13:37:34 EDT 2014


Changeset: 4f7b1fea3cd3397fc9bb694953a6fd572300fc78
Author:	 Tomasz Wasilczyk <twasilczyk at pidgin.im>
Date:	 2014-05-22 13:48 +0200
Branch:	 default
URL: https://hg.pidgin.im/pidgin/main/rev/4f7b1fea3cd3

Description:

Initial implementation for PurpleMessage class

diffstat:

 libpurple/Makefile.am |    2 +
 libpurple/message.c   |  176 ++++++++++++++++++++++++++++++++++++++++++++++++++
 libpurple/message.h   |   91 +++++++++++++++++++++++++
 3 files changed, 269 insertions(+), 0 deletions(-)

diffs (296 lines):

diff --git a/libpurple/Makefile.am b/libpurple/Makefile.am
--- a/libpurple/Makefile.am
+++ b/libpurple/Makefile.am
@@ -83,6 +83,7 @@ purple_coresources = \
 	media.c \
 	mediamanager.c \
 	memorypool.c \
+	message.c \
 	mime.c \
 	nat-pmp.c \
 	network.c \
@@ -163,6 +164,7 @@ purple_coreheaders = \
 	media-gst.h \
 	mediamanager.h \
 	memorypool.h \
+	message.h \
 	mime.h \
 	nat-pmp.h \
 	network.h \
diff --git a/libpurple/message.c b/libpurple/message.c
new file mode 100644
--- /dev/null
+++ b/libpurple/message.c
@@ -0,0 +1,176 @@
+/* purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+
+#include "internal.h"
+#include "glibcompat.h"
+
+#include "debug.h"
+#include "message.h"
+
+#define PURPLE_MESSAGE_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE((obj), PURPLE_TYPE_MESSAGE, PurpleMessagePrivate))
+
+typedef struct {
+	gchar *who;
+	gchar *contents;
+	PurpleMessageFlags flags;
+} PurpleMessagePrivate;
+
+enum
+{
+	PROP_0,
+	PROP_WHO,
+	PROP_CONTENTS,
+	PROP_FLAGS,
+	PROP_LAST
+};
+
+static GObjectClass *parent_class;
+static GParamSpec *properties[PROP_LAST];
+
+/******************************************************************************
+ * API implementation
+ ******************************************************************************/
+
+PurpleMessage *
+purple_message_new(const gchar *who, const gchar *contents,
+	PurpleMessageFlags flags)
+{
+	g_return_val_if_fail(who != NULL, NULL);
+	g_return_val_if_fail(contents != NULL, NULL);
+
+	return g_object_new(PURPLE_TYPE_MESSAGE,
+		"who", who,
+		"contents", contents,
+		"flags", flags,
+		NULL);
+}
+
+/******************************************************************************
+ * Object stuff
+ ******************************************************************************/
+
+static void
+purple_message_finalize(GObject *obj)
+{
+	PurpleMessage *message = PURPLE_MESSAGE(obj);
+	PurpleMessagePrivate *priv = PURPLE_MESSAGE_GET_PRIVATE(message);
+
+	g_free(priv->who);
+	g_free(priv->contents);
+
+	G_OBJECT_CLASS(parent_class)->finalize(obj);
+}
+
+static void
+purple_message_get_property(GObject *object, guint par_id, GValue *value,
+	GParamSpec *pspec)
+{
+	PurpleMessage *message = PURPLE_MESSAGE(object);
+	PurpleMessagePrivate *priv = PURPLE_MESSAGE_GET_PRIVATE(message);
+
+	switch (par_id) {
+		case PROP_WHO:
+			g_value_set_string(value, priv->who);
+			break;
+		case PROP_CONTENTS:
+			g_value_set_string(value, priv->contents);
+			break;
+		case PROP_FLAGS:
+			g_value_set_uint(value, priv->flags);
+			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID(object, par_id, pspec);
+			break;
+	}
+}
+
+static void
+purple_message_set_property(GObject *object, guint par_id, const GValue *value,
+	GParamSpec *pspec)
+{
+	PurpleMessage *message = PURPLE_MESSAGE(object);
+	PurpleMessagePrivate *priv = PURPLE_MESSAGE_GET_PRIVATE(message);
+
+	switch (par_id) {
+		case PROP_WHO:
+			g_free(priv->who);
+			priv->who = g_strdup(g_value_get_string(value));
+			break;
+		case PROP_CONTENTS:
+			g_free(priv->contents);
+			priv->contents = g_strdup(g_value_get_string(value));
+			break;
+		case PROP_FLAGS:
+			priv->flags = g_value_get_uint(value);
+			break;
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID(object, par_id, pspec);
+			break;
+	}
+}
+
+static void
+purple_message_class_init(PurpleMessageClass *klass)
+{
+	GObjectClass *gobj_class = G_OBJECT_CLASS(klass);
+
+	parent_class = g_type_class_peek_parent(klass);
+
+	g_type_class_add_private(klass, sizeof(PurpleMessagePrivate));
+
+	gobj_class->finalize = purple_message_finalize;
+	gobj_class->get_property = purple_message_get_property;
+	gobj_class->set_property = purple_message_set_property;
+
+	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);
+	properties[PROP_CONTENTS] = g_param_spec_string("contents",
+		"Contents", "The message text",
+		NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+	/* XXX: it should be spec_enum, but PurpleMessageFlags isn't
+	 * gobjectified (yet) */
+	properties[PROP_FLAGS] = g_param_spec_uint("flags",
+		"Flags", "Bitwise set of #PurpleMessageFlags flags",
+		0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+	g_object_class_install_properties(gobj_class, PROP_LAST, properties);
+}
+
+GType
+purple_message_get_type(void)
+{
+	static GType type = 0;
+
+	if (G_UNLIKELY(type == 0)) {
+		static const GTypeInfo info = {
+			.class_size = sizeof(PurpleMessageClass),
+			.class_init = (GClassInitFunc)purple_message_class_init,
+			.instance_size = sizeof(PurpleMessage)
+		};
+
+		type = g_type_register_static(G_TYPE_OBJECT,
+			"PurpleMessage", &info, 0);
+	}
+
+	return type;
+}
diff --git a/libpurple/message.h b/libpurple/message.h
new file mode 100644
--- /dev/null
+++ b/libpurple/message.h
@@ -0,0 +1,91 @@
+/* purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
+ */
+
+#ifndef _PURPLE_MESSAGE_H_
+#define _PURPLE_MESSAGE_H_
+/**
+ * SECTION:message
+ * @include:message.h
+ * @section_id: libpurple-message
+ * @short_description: serializable messages
+ * @title: Message model
+ *
+ * #PurpleMessage object collects data about a certain (incoming or outgoing) message.
+ * It (TODO: will be) serializable, so it can be stored in log and retrieved
+ * with any metadata.
+ */
+
+#include <glib-object.h>
+
+typedef struct _PurpleMessage PurpleMessage;
+typedef struct _PurpleMessageClass PurpleMessageClass;
+
+#define PURPLE_TYPE_MESSAGE            (purple_message_get_type())
+#define PURPLE_MESSAGE(smiley)         (G_TYPE_CHECK_INSTANCE_CAST((smiley), PURPLE_TYPE_MESSAGE, PurpleMessage))
+#define PURPLE_MESSAGE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), PURPLE_TYPE_MESSAGE, PurpleMessageClass))
+#define PURPLE_IS_MESSAGE(smiley)      (G_TYPE_CHECK_INSTANCE_TYPE((smiley), PURPLE_TYPE_MESSAGE))
+#define PURPLE_IS_MESSAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), PURPLE_TYPE_MESSAGE))
+#define PURPLE_MESSAGE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), PURPLE_TYPE_MESSAGE, PurpleMessageClass))
+
+/**
+ * PurpleMessage:
+ *
+ * An message data container.
+ */
+struct _PurpleMessage
+{
+	/*< private >*/
+	GObject parent;
+};
+
+/**
+ * PurpleMessageClass:
+ *
+ * Base class for #PurpleMessage objects.
+ */
+struct _PurpleMessageClass
+{
+	/*< private >*/
+	GObjectClass parent_class;
+
+	void (*purple_reserved1)(void);
+	void (*purple_reserved2)(void);
+	void (*purple_reserved3)(void);
+	void (*purple_reserved4)(void);
+};
+
+G_BEGIN_DECLS
+
+/**
+ * purple_message_get_type:
+ *
+ * Returns: the #GType for a message.
+ */
+GType
+purple_message_get_type(void);
+
+PurpleMessage *
+purple_message_new(const gchar *who, const gchar *contents,
+	PurpleMessageFlags flags);
+
+G_END_DECLS
+
+#endif /* _PURPLE_MESSAGE_H_ */



More information about the Commits mailing list