Thu, 22 May 2014 13:48:07 +0200
Initial implementation for PurpleMessage class
| libpurple/Makefile.am | file | annotate | diff | comparison | revisions | |
| libpurple/message.c | file | annotate | diff | comparison | revisions | |
| libpurple/message.h | file | annotate | diff | comparison | revisions |
--- a/libpurple/Makefile.am Thu May 22 13:44:50 2014 +0200 +++ b/libpurple/Makefile.am Thu May 22 13:48:07 2014 +0200 @@ -83,6 +83,7 @@ media.c \ mediamanager.c \ memorypool.c \ + message.c \ mime.c \ nat-pmp.c \ network.c \ @@ -163,6 +164,7 @@ media-gst.h \ mediamanager.h \ memorypool.h \ + message.h \ mime.h \ nat-pmp.h \ network.h \
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/message.c Thu May 22 13:48:07 2014 +0200 @@ -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; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libpurple/message.h Thu May 22 13:48:07 2014 +0200 @@ -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_ */