diff options
author | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2010-10-08 14:46:20 +0100 |
---|---|---|
committer | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2010-10-08 14:46:20 +0100 |
commit | 0febecdd02df4f4b73f2825159a6f6aa36e7b506 (patch) | |
tree | 9341f10c72f20ecc2b9be7276b733f7d8e25199c /lib | |
parent | 3aad39ef4ea2aaf37a210800ef72570dcc197fd4 (diff) | |
download | telepathy-salut-0febecdd02df4f4b73f2825159a6f6aa36e7b506.tar.gz |
Replace GibberXmppWriter with WockyXmppWriter and some inlines
Diffstat (limited to 'lib')
-rw-r--r-- | lib/gibber/gibber-xmpp-writer.c | 326 | ||||
-rw-r--r-- | lib/gibber/gibber-xmpp-writer.h | 69 |
2 files changed, 30 insertions, 365 deletions
diff --git a/lib/gibber/gibber-xmpp-writer.c b/lib/gibber/gibber-xmpp-writer.c index 075e0287..3053583c 100644 --- a/lib/gibber/gibber-xmpp-writer.c +++ b/lib/gibber/gibber-xmpp-writer.c @@ -1,325 +1 @@ -/* - * gibber-xmpp-writer.c - Source for GibberXmppWriter - * Copyright (C) 2006 Collabora Ltd. - * @author Sjoerd Simons <sjoerd@luon.net> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include <libxml/xmlwriter.h> - -#include "gibber-xmpp-writer.h" - -G_DEFINE_TYPE (GibberXmppWriter, gibber_xmpp_writer, G_TYPE_OBJECT) - -#define DEBUG_FLAG DEBUG_XMPP_WRITER -#include "gibber-debug.h" - -/* private structure */ -typedef struct _GibberXmppWriterPrivate GibberXmppWriterPrivate; - -struct _GibberXmppWriterPrivate -{ - gboolean dispose_has_run; - xmlTextWriterPtr xmlwriter; - GQuark current_ns; - GQuark stream_ns; - gboolean stream_mode; - xmlBufferPtr buffer; -}; - -#define GIBBER_XMPP_WRITER_GET_PRIVATE(o) \ - (G_TYPE_INSTANCE_GET_PRIVATE ((o), GIBBER_TYPE_XMPP_WRITER, \ - GibberXmppWriterPrivate)) - -static void -gibber_xmpp_writer_init (GibberXmppWriter *obj) -{ - GibberXmppWriterPrivate *priv = GIBBER_XMPP_WRITER_GET_PRIVATE (obj); - - /* allocate any data required by the object here */ - priv->current_ns = 0; - priv->stream_ns = 0; - priv->buffer = xmlBufferCreate (); - priv->xmlwriter = xmlNewTextWriterMemory (priv->buffer, 0); - priv->stream_mode = TRUE; - /* xmlTextWriterSetIndent (priv->xmlwriter, 1); */ -} - -static void gibber_xmpp_writer_dispose (GObject *object); -static void gibber_xmpp_writer_finalize (GObject *object); - -static void -gibber_xmpp_writer_class_init (GibberXmppWriterClass *gibber_xmpp_writer_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (gibber_xmpp_writer_class); - - g_type_class_add_private (gibber_xmpp_writer_class, - sizeof (GibberXmppWriterPrivate)); - - object_class->dispose = gibber_xmpp_writer_dispose; - object_class->finalize = gibber_xmpp_writer_finalize; -} - -void -gibber_xmpp_writer_dispose (GObject *object) -{ - GibberXmppWriter *self = GIBBER_XMPP_WRITER (object); - GibberXmppWriterPrivate *priv = GIBBER_XMPP_WRITER_GET_PRIVATE (self); - - if (priv->dispose_has_run) - return; - - priv->dispose_has_run = TRUE; - - /* release any references held by the object here */ - - if (G_OBJECT_CLASS (gibber_xmpp_writer_parent_class)->dispose) - G_OBJECT_CLASS (gibber_xmpp_writer_parent_class)->dispose (object); -} - -void -gibber_xmpp_writer_finalize (GObject *object) -{ - GibberXmppWriter *self = GIBBER_XMPP_WRITER (object); - GibberXmppWriterPrivate *priv = GIBBER_XMPP_WRITER_GET_PRIVATE (self); - - /* free any data held directly by the object here */ - xmlFreeTextWriter (priv->xmlwriter); - xmlBufferFree (priv->buffer); - - G_OBJECT_CLASS (gibber_xmpp_writer_parent_class)->finalize (object); -} - -GibberXmppWriter * -gibber_xmpp_writer_new (void) -{ - return g_object_new (GIBBER_TYPE_XMPP_WRITER, NULL); -} - -GibberXmppWriter * -gibber_xmpp_writer_new_no_stream (void) -{ - GibberXmppWriter *result = g_object_new (GIBBER_TYPE_XMPP_WRITER, NULL); - GibberXmppWriterPrivate *priv = GIBBER_XMPP_WRITER_GET_PRIVATE (result); - - priv->stream_mode = FALSE; - - return result; -} - -void -gibber_xmpp_writer_stream_open (GibberXmppWriter *writer, - const gchar *to, const gchar *from, const gchar *version, - const guint8 **data, gsize *length) -{ - GibberXmppWriterPrivate *priv = GIBBER_XMPP_WRITER_GET_PRIVATE (writer); - - xmlBufferEmpty (priv->buffer); - xmlTextWriterWriteString (priv->xmlwriter, (xmlChar *) - "<?xml version='1.0' encoding='UTF-8'?>\n" \ - "<stream:stream\n" \ - " xmlns='jabber:client'\n" \ - " xmlns:stream='http://etherx.jabber.org/streams'"); - - if (to != NULL) - { - xmlTextWriterWriteString (priv->xmlwriter, (xmlChar *)"\n to=\""); - xmlTextWriterFlush (priv->xmlwriter); - xmlAttrSerializeTxtContent (priv->buffer, NULL, NULL, (xmlChar *) to); - xmlTextWriterWriteString (priv->xmlwriter, (xmlChar *)"\""); - } - - if (from != NULL) - { - xmlTextWriterWriteString (priv->xmlwriter, (xmlChar *)"\n from=\""); - xmlTextWriterFlush (priv->xmlwriter); - xmlAttrSerializeTxtContent (priv->buffer, NULL, NULL, (xmlChar *) from); - xmlTextWriterWriteString (priv->xmlwriter, (xmlChar *)"\""); - } - - if (version != NULL) - { - xmlTextWriterWriteString (priv->xmlwriter, (xmlChar *)"\n version=\""); - xmlTextWriterFlush (priv->xmlwriter); - xmlAttrSerializeTxtContent (priv->buffer, NULL, - NULL, (xmlChar *) version); - xmlTextWriterWriteString (priv->xmlwriter, (xmlChar *)"\""); - } - - xmlTextWriterWriteString (priv->xmlwriter, (xmlChar *) ">\n"); - xmlTextWriterFlush (priv->xmlwriter); - - *data = (const guint8 *)priv->buffer->content; - *length = priv->buffer->use; - - /* Set the magic known namespaces */ - priv->current_ns = g_quark_from_string ("jabber:client"); - priv->stream_ns = g_quark_from_string ("http://etherx.jabber.org/streams"); - - DEBUG ("Writing xml: %.*s", (int)*length, *data); -} - -void -gibber_xmpp_writer_stream_close (GibberXmppWriter *writer, - const guint8 **data, gsize *length) -{ - static const guint8 *close = (const guint8 *)"</stream:stream>\n"; - - *data = close; - *length = strlen ((gchar *) close); - - DEBUG ("Writing xml: %.*s", (int)*length, *data); -} - -static void -_xml_write_node (GibberXmppWriter *writer, GibberXmppNode *node); - -static gboolean -_write_attr (const gchar *key, const gchar *value, const gchar *pref, - const gchar *ns, gpointer user_data) -{ - GibberXmppWriter *self = GIBBER_XMPP_WRITER (user_data); - GibberXmppWriterPrivate *priv = GIBBER_XMPP_WRITER_GET_PRIVATE (self); - GQuark attrns = 0; - - if (ns != NULL) - { - attrns = g_quark_from_string (ns); - } - - if (attrns == 0 || attrns == priv->current_ns) - { - xmlTextWriterWriteAttribute (priv->xmlwriter, - (const xmlChar *)key, - (const xmlChar *)value); - } - else if (attrns == priv->stream_ns) - { - xmlTextWriterWriteAttributeNS (priv->xmlwriter, - (const xmlChar *)"stream", (const xmlChar *)key, - (const xmlChar *)NULL, (const xmlChar *)value); - } - else - { - xmlTextWriterWriteAttributeNS (priv->xmlwriter, - (const xmlChar *)key, (const xmlChar *)key, (const xmlChar *)ns, - (const xmlChar *)value); - } - return TRUE; -} - -static gboolean -_write_child (GibberXmppNode *node, gpointer user_data) -{ - _xml_write_node (GIBBER_XMPP_WRITER (user_data), node); - return TRUE; -} - - -static void -_xml_write_node (GibberXmppWriter *writer, GibberXmppNode *node) -{ - const gchar *l; - GQuark oldns; - GibberXmppWriterPrivate *priv = GIBBER_XMPP_WRITER_GET_PRIVATE (writer); - - oldns = priv->current_ns; - - if (node->ns == 0 || oldns == node->ns) - { - /* Another element in the current namespace */ - xmlTextWriterStartElement (priv->xmlwriter, (const xmlChar*) node->name); - } - else if (node->ns == priv->stream_ns) - { - xmlTextWriterStartElementNS(priv->xmlwriter, - (const xmlChar *) "stream", (const xmlChar *) node->name, NULL); - - } - else - { - priv->current_ns = node->ns; - xmlTextWriterStartElementNS (priv->xmlwriter, - NULL, (const xmlChar *) node->name, - (const xmlChar *) gibber_xmpp_node_get_ns (node)); - } - - wocky_node_each_attribute (node, _write_attr, writer); - - l = gibber_xmpp_node_get_language (node); - - if (l != NULL) - { - xmlTextWriterWriteAttributeNS(priv->xmlwriter, - (const xmlChar *)"xml", (const xmlChar *)"lang", NULL, - (const xmlChar *)l); - } - - gibber_xmpp_node_each_child (node, _write_child, writer); - - if (node->content) - { - xmlTextWriterWriteString (priv->xmlwriter, - (const xmlChar*)node->content); - } - - xmlTextWriterEndElement (priv->xmlwriter); - priv->current_ns = oldns; -} - -gboolean -gibber_xmpp_writer_write_stanza (GibberXmppWriter *writer, - GibberXmppStanza *stanza, const guint8 **data, gsize *length, - GError **error) -{ - GibberXmppWriterPrivate *priv = GIBBER_XMPP_WRITER_GET_PRIVATE (writer); - - xmlBufferEmpty (priv->buffer); - - if (!priv->stream_mode) - { - xmlTextWriterStartDocument (priv->xmlwriter, "1.0", "utf-8", NULL); - } - - _xml_write_node (writer, wocky_stanza_get_top_node (stanza)); - - if (!priv->stream_mode) - { - xmlTextWriterEndDocument (priv->xmlwriter); - } - xmlTextWriterFlush (priv->xmlwriter); - - *data = (const guint8 *)priv->buffer->content; - *length = priv->buffer->use; - - DEBUG ("Writing xml: %.*s.", (int)*length, *data); - - return TRUE; -} - -void -gibber_xmpp_writer_flush (GibberXmppWriter *writer) -{ - GibberXmppWriterPrivate *priv = GIBBER_XMPP_WRITER_GET_PRIVATE (writer); - - xmlBufferFree (priv->buffer); - priv->buffer = xmlBufferCreate (); -} +/* nothing here */ diff --git a/lib/gibber/gibber-xmpp-writer.h b/lib/gibber/gibber-xmpp-writer.h index 7ac01dcb..ac6d529b 100644 --- a/lib/gibber/gibber-xmpp-writer.h +++ b/lib/gibber/gibber-xmpp-writer.h @@ -23,56 +23,45 @@ #include <glib-object.h> -#include "gibber-xmpp-stanza.h" +#include <wocky/wocky-xmpp-writer.h> G_BEGIN_DECLS -typedef struct _GibberXmppWriter GibberXmppWriter; -typedef struct _GibberXmppWriterClass GibberXmppWriterClass; +typedef WockyXmppWriter GibberXmppWriter; +typedef WockyXmppWriterClass GibberXmppWriterClass; -struct _GibberXmppWriterClass { - GObjectClass parent_class; -}; +#define GIBBER_TYPE_XMPP_WRITER (WOCKY_TYPE_XMPP_WRITER) +#define GIBBER_XMPP_WRITER(o) (WOCKY_XMPP_WRITER (o)) +#define GIBBER_XMPP_WRITER_CLASS(c) (WOCKY_XMPP_WRITER_CLASS (c)) +#define GIBBER_IS_XMPP_WRITER(o) (WOCKY_IS_XMPP_WRITER (o)) +#define GIBBER_IS_XMPP_WRITER_CLASS(c) (WOCKY_IS_XMPP_WRITER_CLASS (c)) +#define GIBBER_XMPP_WRITER_GET_CLASS(o) (WOCKY_XMPP_WRITER_GET_CLASS (o)) -struct _GibberXmppWriter { - GObject parent; -}; +#define gibber_xmpp_writer_new wocky_xmpp_writer_new +#define gibber_xmpp_writer_new_no_stream wocky_xmpp_writer_new_no_stream +#define gibber_xmpp_writer_stream_close wocky_xmpp_writer_stream_close +#define gibber_xmpp_writer_flush wocky_xmpp_writer_flush -GType gibber_xmpp_writer_get_type (void); - -/* TYPE MACROS */ -#define GIBBER_TYPE_XMPP_WRITER \ - (gibber_xmpp_writer_get_type ()) -#define GIBBER_XMPP_WRITER(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj), GIBBER_TYPE_XMPP_WRITER, \ - GibberXmppWriter)) -#define GIBBER_XMPP_WRITER_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass), GIBBER_TYPE_XMPP_WRITER, \ - GibberXmppWriterClass)) -#define GIBBER_IS_XMPP_WRITER(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj), GIBBER_TYPE_XMPP_WRITER)) -#define GIBBER_IS_XMPP_WRITER_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE((klass), GIBBER_TYPE_XMPP_WRITER)) -#define GIBBER_XMPP_WRITER_GET_CLASS(obj) \ - (G_TYPE_INSTANCE_GET_CLASS ((obj), GIBBER_TYPE_XMPP_WRITER, \ - GibberXmppWriterClass)) - - -GibberXmppWriter *gibber_xmpp_writer_new (void); -GibberXmppWriter *gibber_xmpp_writer_new_no_stream (void); - -void gibber_xmpp_writer_stream_open (GibberXmppWriter *writer, +static inline void +gibber_xmpp_writer_stream_open (GibberXmppWriter *writer, const gchar *to, const gchar *from, const gchar *version, - const guint8 **data, gsize *length); + const guint8 **data, gsize *length) +{ + /* set dummy language and ID */ + wocky_xmpp_writer_stream_open (writer, to, from, version, NULL, NULL, data, + length); +} -void gibber_xmpp_writer_stream_close (GibberXmppWriter *writer, - const guint8 **data, gsize *length); -gboolean gibber_xmpp_writer_write_stanza (GibberXmppWriter *writer, +static inline gboolean +gibber_xmpp_writer_write_stanza (GibberXmppWriter *writer, GibberXmppStanza *stanza, const guint8 **data, gsize *length, - GError **error); - -void gibber_xmpp_writer_flush (GibberXmppWriter *writer); + GError **error) +{ + /* can't fail */ + wocky_xmpp_writer_write_stanza (writer, stanza, data, length); + return TRUE; +} G_END_DECLS |