diff options
Diffstat (limited to 'lib')
49 files changed, 1178 insertions, 3686 deletions
diff --git a/lib/ext/wocky b/lib/ext/wocky -Subproject b3812fad955afdbf21602039035ae9c377e99d5 +Subproject 3d8bd1bd1e3857f1a14dbba92a8fe6bf7f79005 diff --git a/lib/gibber/Makefile.am b/lib/gibber/Makefile.am index c2cd533b..5206df16 100644 --- a/lib/gibber/Makefile.am +++ b/lib/gibber/Makefile.am @@ -10,8 +10,6 @@ BUILT_SOURCES = \ gibber-signals-marshal.c HANDWRITTEN_SOURCES = \ - gibber-xmpp-connection.c \ - gibber-xmpp-connection.h \ gibber-muc-connection.c \ gibber-muc-connection.h \ gibber-bytestream-ibb.h \ @@ -26,12 +24,8 @@ HANDWRITTEN_SOURCES = \ gibber-bytestream-direct.c \ gibber-debug.c \ gibber-debug.h \ - gibber-xmpp-node.c \ - gibber-xmpp-node.h \ gibber-xmpp-reader.c \ gibber-xmpp-reader.h \ - gibber-xmpp-stanza.c \ - gibber-xmpp-stanza.h \ gibber-xmpp-writer.c \ gibber-xmpp-writer.h \ gibber-transport.c \ @@ -56,16 +50,12 @@ HANDWRITTEN_SOURCES = \ gibber-linklocal-transport.c \ gibber-linklocal-transport.h \ gibber-namespaces.h \ - gibber-iq-helper.c \ - gibber-iq-helper.h \ gibber-file-transfer.c \ gibber-file-transfer.h \ gibber-oob-file-transfer.c \ gibber-oob-file-transfer.h \ gibber-listener.c \ gibber-listener.h \ - gibber-xmpp-connection-listener.c \ - gibber-xmpp-connection-listener.h \ gibber-xmpp-error.h \ gibber-xmpp-error.c \ gibber-sockets.c \ diff --git a/lib/gibber/gibber-bytestream-direct.c b/lib/gibber/gibber-bytestream-direct.c index adb90417..81c6ba6e 100644 --- a/lib/gibber/gibber-bytestream-direct.c +++ b/lib/gibber/gibber-bytestream-direct.c @@ -26,7 +26,6 @@ #include <glib.h> #include "gibber-sockets.h" -#include "gibber-xmpp-connection.h" #include "gibber-linklocal-transport.h" #include "gibber-util.h" #include "gibber-xmpp-error.h" diff --git a/lib/gibber/gibber-bytestream-ibb.c b/lib/gibber/gibber-bytestream-ibb.c index a50e4702..d2116c3c 100644 --- a/lib/gibber/gibber-bytestream-ibb.c +++ b/lib/gibber/gibber-bytestream-ibb.c @@ -25,10 +25,10 @@ #include <glib.h> #include <wocky/wocky-namespaces.h> +#include <wocky/wocky-stanza.h> +#include <wocky/wocky-porter.h> -#include "gibber-xmpp-connection.h" #include "gibber-muc-connection.h" -#include "gibber-xmpp-stanza.h" #include "gibber-namespaces.h" #include "gibber-xmpp-error.h" @@ -53,7 +53,8 @@ G_DEFINE_TYPE_WITH_CODE (GibberBytestreamIBB, gibber_bytestream_ibb, /* properties */ enum { - PROP_XMPP_CONNECTION = 1, + PROP_PORTER = 1, + PROP_CONTACT, PROP_SELF_ID, PROP_PEER_ID, PROP_STREAM_ID, @@ -66,11 +67,13 @@ enum typedef struct _GibberBytestreamIBBPrivate GibberBytestreamIBBPrivate; struct _GibberBytestreamIBBPrivate { - GibberXmppConnection *xmpp_connection; + WockyPorter *porter; + WockyContact *contact; gchar *self_id; gchar *peer_id; gchar *stream_id; gchar *stream_init_id; + guint stanza_received_id; GibberBytestreamState state; guint16 seq; @@ -91,15 +94,15 @@ gibber_bytestream_ibb_init (GibberBytestreamIBB *self) self->priv = priv; } -static void -xmpp_connection_received_stanza_cb (GibberXmppConnection *conn, - GibberXmppStanza *stanza, - gpointer user_data) +static gboolean +received_stanza_cb (WockyPorter *porter, + WockyStanza *stanza, + gpointer user_data) { GibberBytestreamIBB *self = (GibberBytestreamIBB *) user_data; GibberBytestreamIBBPrivate *priv = GIBBER_BYTESTREAM_IBB_GET_PRIVATE (self); WockyNode *node = wocky_stanza_get_top_node (stanza); - GibberXmppNode *data; + WockyNode *data; GString *str; guchar *decoded; gsize len; @@ -108,28 +111,28 @@ xmpp_connection_received_stanza_cb (GibberXmppConnection *conn, data = wocky_node_get_child_ns (node, "data", WOCKY_XMPP_NS_IBB); if (data == NULL) { - return; + return FALSE; } stream_id = wocky_node_get_attribute (data, "sid"); if (stream_id == NULL || strcmp (stream_id, priv->stream_id) != 0) { DEBUG ("bad stream id"); - return; + return FALSE; } if (priv->state != GIBBER_BYTESTREAM_STATE_OPEN) { DEBUG ("can't receive data through a not open bytestream (state: %d)", priv->state); - return; + return FALSE; } - from = gibber_xmpp_node_get_attribute (node, "from"); + from = wocky_node_get_attribute (node, "from"); if (from == NULL) { DEBUG ("got a message without a from field, ignoring"); - return; + return FALSE; } // XXX check sequence number ? @@ -140,6 +143,8 @@ xmpp_connection_received_stanza_cb (GibberXmppConnection *conn, g_string_free (str, TRUE); g_free (decoded); + + return TRUE; } static void @@ -185,8 +190,11 @@ gibber_bytestream_ibb_get_property (GObject *object, switch (property_id) { - case PROP_XMPP_CONNECTION: - g_value_set_object (value, priv->xmpp_connection); + case PROP_PORTER: + g_value_set_object (value, priv->porter); + break; + case PROP_CONTACT: + g_value_set_object (value, priv->contact); break; case PROP_SELF_ID: g_value_set_string (value, priv->self_id); @@ -213,6 +221,21 @@ gibber_bytestream_ibb_get_property (GObject *object, } static void +make_porter_connections (GibberBytestreamIBB *self) +{ + GibberBytestreamIBBPrivate *priv = GIBBER_BYTESTREAM_IBB_GET_PRIVATE (self); + gchar *jid; + + jid = wocky_contact_dup_jid (priv->contact); + + priv->stanza_received_id = wocky_porter_register_handler_from (priv->porter, + WOCKY_STANZA_TYPE_IQ, WOCKY_STANZA_TYPE_NONE, jid, + WOCKY_PORTER_HANDLER_PRIORITY_NORMAL, received_stanza_cb, self, NULL); + + g_free (jid); +} + +static void gibber_bytestream_ibb_set_property (GObject *object, guint property_id, const GValue *value, @@ -223,11 +246,11 @@ gibber_bytestream_ibb_set_property (GObject *object, switch (property_id) { - case PROP_XMPP_CONNECTION: - priv->xmpp_connection = g_value_get_object (value); - if (priv->xmpp_connection != NULL) - g_signal_connect (priv->xmpp_connection, "received-stanza", - G_CALLBACK (xmpp_connection_received_stanza_cb), self); + case PROP_PORTER: + priv->porter = g_value_dup_object (value); + break; + case PROP_CONTACT: + priv->contact = g_value_dup_object (value); break; case PROP_SELF_ID: g_free (priv->self_id); @@ -271,7 +294,8 @@ gibber_bytestream_ibb_constructor (GType type, priv = GIBBER_BYTESTREAM_IBB_GET_PRIVATE (GIBBER_BYTESTREAM_IBB (obj)); - g_assert (priv->xmpp_connection != NULL); + g_assert (priv->porter != NULL); + g_assert (priv->contact != NULL); g_assert (priv->stream_init_id != NULL); g_assert (priv->self_id != NULL); g_assert (priv->peer_id != NULL); @@ -280,6 +304,19 @@ gibber_bytestream_ibb_constructor (GType type, } static void +gibber_bytestream_ibb_constructed (GObject *obj) +{ + GibberBytestreamIBB *self = GIBBER_BYTESTREAM_IBB (obj); + GibberBytestreamIBBPrivate *priv = GIBBER_BYTESTREAM_IBB_GET_PRIVATE (self); + + if (G_OBJECT_CLASS (gibber_bytestream_ibb_parent_class)->constructed != NULL) + G_OBJECT_CLASS (gibber_bytestream_ibb_parent_class)->constructed (obj); + + if (priv->porter != NULL && priv->contact != NULL) + make_porter_connections (self); +} + +static void gibber_bytestream_ibb_class_init ( GibberBytestreamIBBClass *gibber_bytestream_ibb_class) { @@ -295,6 +332,7 @@ gibber_bytestream_ibb_class_init ( object_class->get_property = gibber_bytestream_ibb_get_property; object_class->set_property = gibber_bytestream_ibb_set_property; object_class->constructor = gibber_bytestream_ibb_constructor; + object_class->constructed = gibber_bytestream_ibb_constructed; g_object_class_override_property (object_class, PROP_SELF_ID, "self-id"); @@ -308,14 +346,25 @@ gibber_bytestream_ibb_class_init ( "protocol"); param_spec = g_param_spec_object ( - "xmpp-connection", - "GibberXmppConnection object", - "Gibber XMPP connection object used for communication by this " + "porter", + "WockyPorter object", + "Wocky porter object used for communication by this " + "bytestream if it's a private one", + WOCKY_TYPE_PORTER, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_PORTER, + param_spec); + + param_spec = g_param_spec_object ( + "contact", + "WockyContact object", + "Contact object used for communication by this " "bytestream if it's a private one", - GIBBER_TYPE_XMPP_CONNECTION, + WOCKY_TYPE_CONTACT, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); - g_object_class_install_property (object_class, PROP_XMPP_CONNECTION, + g_object_class_install_property (object_class, PROP_CONTACT, param_spec); param_spec = g_param_spec_string ( @@ -341,9 +390,8 @@ gibber_bytestream_ibb_send (GibberBytestreamIface *bytestream, { GibberBytestreamIBB *self = GIBBER_BYTESTREAM_IBB (bytestream); GibberBytestreamIBBPrivate *priv = GIBBER_BYTESTREAM_IBB_GET_PRIVATE (self); - GibberXmppStanza *stanza; + WockyStanza *stanza; gchar *seq, *encoded; - gboolean ret; if (priv->state != GIBBER_BYTESTREAM_STATE_OPEN) { @@ -356,65 +404,65 @@ gibber_bytestream_ibb_send (GibberBytestreamIface *bytestream, encoded = g_base64_encode ((const guchar *) str, len); - stanza = gibber_xmpp_stanza_build (GIBBER_STANZA_TYPE_MESSAGE, - GIBBER_STANZA_SUB_TYPE_NONE, - priv->self_id, priv->peer_id, - GIBBER_NODE, "data", - GIBBER_NODE_XMLNS, GIBBER_XMPP_NS_IBB, - GIBBER_NODE_ATTRIBUTE, "sid", priv->stream_id, - GIBBER_NODE_ATTRIBUTE, "seq", seq, - GIBBER_NODE_TEXT, encoded, - GIBBER_NODE_END, - GIBBER_NODE, "amp", - GIBBER_NODE_XMLNS, GIBBER_XMPP_NS_AMP, - GIBBER_NODE, "rule", - GIBBER_NODE_ATTRIBUTE, "condition", "deliver-at", - GIBBER_NODE_ATTRIBUTE, "value", "stored", - GIBBER_NODE_ATTRIBUTE, "action", "error", - GIBBER_NODE_END, - GIBBER_NODE, "rule", - GIBBER_NODE_ATTRIBUTE, "condition", "match-resource", - GIBBER_NODE_ATTRIBUTE, "value", "exact", - GIBBER_NODE_ATTRIBUTE, "action", "error", - GIBBER_NODE_END, - GIBBER_NODE_END, - GIBBER_STANZA_END); + stanza = wocky_stanza_build_to_contact (WOCKY_STANZA_TYPE_MESSAGE, + WOCKY_STANZA_SUB_TYPE_NONE, + priv->self_id, priv->contact, + '(', "data", + ':', GIBBER_XMPP_NS_IBB, + '@', "sid", priv->stream_id, + '@', "seq", seq, + '$', encoded, + ')', + '(', "amp", + ':', GIBBER_XMPP_NS_AMP, + '(', "rule", + '@', "condition", "deliver-at", + '@', "value", "stored", + '@', "action", "error", + ')', + '(', "rule", + '@', "condition", "match-resource", + '@', "value", "exact", + '@', "action", "error", + ')', + ')', + NULL); DEBUG ("send %d bytes", len); - ret = gibber_xmpp_connection_send (priv->xmpp_connection, stanza, NULL); + wocky_porter_send (priv->porter, stanza); g_object_unref (stanza); g_free (encoded); g_free (seq); - return ret; + return TRUE; } -static GibberXmppStanza * +static WockyStanza * create_si_accept_iq (GibberBytestreamIBB *self) { GibberBytestreamIBBPrivate *priv = GIBBER_BYTESTREAM_IBB_GET_PRIVATE (self); - return gibber_xmpp_stanza_build ( - GIBBER_STANZA_TYPE_IQ, GIBBER_STANZA_SUB_TYPE_RESULT, - priv->self_id, priv->peer_id, - GIBBER_NODE_ATTRIBUTE, "id", priv->stream_init_id, - GIBBER_NODE, "si", - GIBBER_NODE_XMLNS, GIBBER_XMPP_NS_SI, - GIBBER_NODE, "feature", - GIBBER_NODE_XMLNS, GIBBER_XMPP_NS_FEATURENEG, - GIBBER_NODE, "x", - GIBBER_NODE_XMLNS, GIBBER_XMPP_NS_DATA, - GIBBER_NODE_ATTRIBUTE, "type", "submit", - GIBBER_NODE, "field", - GIBBER_NODE_ATTRIBUTE, "var", "stream-method", - GIBBER_NODE, "value", - GIBBER_NODE_TEXT, GIBBER_XMPP_NS_IBB, - GIBBER_NODE_END, - GIBBER_NODE_END, - GIBBER_NODE_END, - GIBBER_NODE_END, - GIBBER_NODE_END, GIBBER_STANZA_END); + return wocky_stanza_build_to_contact ( + WOCKY_STANZA_TYPE_IQ, WOCKY_STANZA_SUB_TYPE_RESULT, + priv->self_id, priv->contact, + '@', "id", priv->stream_init_id, + '(', "si", + ':', GIBBER_XMPP_NS_SI, + '(', "feature", + ':', GIBBER_XMPP_NS_FEATURENEG, + '(', "x", + ':', GIBBER_XMPP_NS_DATA, + '@', "type", "submit", + '(', "field", + '@', "var", "stream-method", + '(', "value", + '$', GIBBER_XMPP_NS_IBB, + ')', + ')', + ')', + ')', + ')', NULL); } /* @@ -429,9 +477,9 @@ gibber_bytestream_ibb_accept (GibberBytestreamIface *bytestream, { GibberBytestreamIBB *self = GIBBER_BYTESTREAM_IBB (bytestream); GibberBytestreamIBBPrivate *priv = GIBBER_BYTESTREAM_IBB_GET_PRIVATE (self); - GibberXmppStanza *stanza; + WockyStanza *stanza; WockyNode *node; - GibberXmppNode *si; + WockyNode *si; if (priv->state != GIBBER_BYTESTREAM_STATE_LOCAL_PENDING) { @@ -442,7 +490,7 @@ gibber_bytestream_ibb_accept (GibberBytestreamIface *bytestream, stanza = create_si_accept_iq (self); node = wocky_stanza_get_top_node (stanza); - si = gibber_xmpp_node_get_child_ns (node, "si", GIBBER_XMPP_NS_SI); + si = wocky_node_get_child_ns (node, "si", GIBBER_XMPP_NS_SI); g_assert (si != NULL); if (func != NULL) @@ -451,7 +499,9 @@ gibber_bytestream_ibb_accept (GibberBytestreamIface *bytestream, func (si, user_data); } - gibber_xmpp_connection_send (priv->xmpp_connection, stanza, NULL); + wocky_porter_send (priv->porter, stanza); + + g_object_unref (stanza); DEBUG ("stream is now accepted"); g_object_set (self, "state", GIBBER_BYTESTREAM_STATE_ACCEPTED, NULL); @@ -462,16 +512,16 @@ gibber_bytestream_ibb_decline (GibberBytestreamIBB *self, GError *error) { GibberBytestreamIBBPrivate *priv = GIBBER_BYTESTREAM_IBB_GET_PRIVATE (self); - GibberXmppStanza *stanza; + WockyStanza *stanza; WockyNode *node; g_return_if_fail (priv->state == GIBBER_BYTESTREAM_STATE_LOCAL_PENDING); - stanza = gibber_xmpp_stanza_build ( - GIBBER_STANZA_TYPE_IQ, GIBBER_STANZA_SUB_TYPE_ERROR, - priv->self_id, priv->peer_id, - GIBBER_NODE_ATTRIBUTE, "id", priv->stream_init_id, - GIBBER_STANZA_END); + stanza = wocky_stanza_build_to_contact ( + WOCKY_STANZA_TYPE_IQ, WOCKY_STANZA_SUB_TYPE_ERROR, + priv->self_id, priv->contact, + '@', "id", priv->stream_init_id, + NULL); node = wocky_stanza_get_top_node (stanza); if (error != NULL && error->domain == GIBBER_XMPP_ERROR) @@ -484,7 +534,7 @@ gibber_bytestream_ibb_decline (GibberBytestreamIBB *self, "Offer Declined"); } - gibber_xmpp_connection_send (priv->xmpp_connection, stanza, NULL); + wocky_porter_send (priv->porter, stanza); g_object_unref (stanza); } @@ -512,22 +562,21 @@ gibber_bytestream_ibb_close (GibberBytestreamIface *bytestream, /* Stream was created using SI so we decline the request */ gibber_bytestream_ibb_decline (self, error); } - - else if (priv->xmpp_connection != NULL) + else { - GibberXmppStanza *stanza; + WockyStanza *stanza; DEBUG ("send IBB close stanza"); - stanza = gibber_xmpp_stanza_build (GIBBER_STANZA_TYPE_IQ, - GIBBER_STANZA_SUB_TYPE_SET, - priv->self_id, priv->peer_id, - GIBBER_NODE, "close", - GIBBER_NODE_XMLNS, GIBBER_XMPP_NS_IBB, - GIBBER_NODE_ATTRIBUTE, "sid", priv->stream_id, - GIBBER_NODE_END, GIBBER_STANZA_END); + stanza = wocky_stanza_build_to_contact (WOCKY_STANZA_TYPE_IQ, + WOCKY_STANZA_SUB_TYPE_SET, + priv->self_id, priv->contact, + '(', "close", + ':', GIBBER_XMPP_NS_IBB, + '@', "sid", priv->stream_id, + ')', NULL); - gibber_xmpp_connection_send (priv->xmpp_connection, stanza, NULL); + wocky_porter_send (priv->porter, stanza); g_object_unref (stanza); } @@ -571,8 +620,7 @@ gibber_bytestream_ibb_initiate (GibberBytestreamIface *bytestream) { GibberBytestreamIBB *self = GIBBER_BYTESTREAM_IBB (bytestream); GibberBytestreamIBBPrivate *priv = GIBBER_BYTESTREAM_IBB_GET_PRIVATE (self); - GibberXmppStanza *msg; - GError *error = NULL; + WockyStanza *msg; if (priv->state != GIBBER_BYTESTREAM_STATE_INITIATING) { @@ -581,36 +629,23 @@ gibber_bytestream_ibb_initiate (GibberBytestreamIface *bytestream) return FALSE; } - if (priv->xmpp_connection == NULL) - { - DEBUG ("Can only initiate a private bytestream"); - return FALSE; - } - if (priv->stream_id == NULL) { DEBUG ("stream doesn't have an ID"); return FALSE; } - msg = gibber_xmpp_stanza_build ( - GIBBER_STANZA_TYPE_IQ, GIBBER_STANZA_SUB_TYPE_SET, - priv->self_id, priv->peer_id, - GIBBER_NODE, "open", - GIBBER_NODE_XMLNS, GIBBER_XMPP_NS_IBB, - GIBBER_NODE_ATTRIBUTE, "sid", priv->stream_id, - GIBBER_NODE_ATTRIBUTE, "block-size", "4096", - GIBBER_NODE_END, GIBBER_STANZA_END); + msg = wocky_stanza_build_to_contact ( + WOCKY_STANZA_TYPE_IQ, WOCKY_STANZA_SUB_TYPE_SET, + priv->self_id, priv->contact, + '(', "open", + ':', GIBBER_XMPP_NS_IBB, + '@', "sid", priv->stream_id, + '@', "block-size", "4096", + ')', NULL); /* XXX should send using _with_reply (ibb_init_reply_cb) */ - if (!gibber_xmpp_connection_send (priv->xmpp_connection, msg, &error)) - { - DEBUG ("Error when sending IBB init stanza: %s", error->message); - - g_error_free (error); - g_object_unref (msg); - return FALSE; - } + wocky_porter_send (priv->porter, msg); g_object_unref (msg); diff --git a/lib/gibber/gibber-bytestream-ibb.h b/lib/gibber/gibber-bytestream-ibb.h index f8c75559..507562c1 100644 --- a/lib/gibber/gibber-bytestream-ibb.h +++ b/lib/gibber/gibber-bytestream-ibb.h @@ -22,7 +22,7 @@ #include <glib-object.h> #include "gibber-bytestream-iface.h" -#include "gibber-xmpp-stanza.h" +#include <wocky/wocky-stanza.h> G_BEGIN_DECLS diff --git a/lib/gibber/gibber-bytestream-iface.h b/lib/gibber/gibber-bytestream-iface.h index 88a66df2..5f17ba70 100644 --- a/lib/gibber/gibber-bytestream-iface.h +++ b/lib/gibber/gibber-bytestream-iface.h @@ -22,7 +22,7 @@ #include <glib-object.h> -#include "gibber-xmpp-stanza.h" +#include <wocky/wocky-stanza.h> G_BEGIN_DECLS @@ -44,7 +44,7 @@ typedef enum } GibberBytestreamState; typedef void (* GibberBytestreamAugmentSiAcceptReply) ( - GibberXmppNode *si, gpointer user_data); + WockyNode *si, gpointer user_data); typedef struct _GibberBytestreamIface GibberBytestreamIface; typedef struct _GibberBytestreamIfaceClass GibberBytestreamIfaceClass; diff --git a/lib/gibber/gibber-bytestream-oob.c b/lib/gibber/gibber-bytestream-oob.c index ccd50bd8..805f397a 100644 --- a/lib/gibber/gibber-bytestream-oob.c +++ b/lib/gibber/gibber-bytestream-oob.c @@ -28,14 +28,15 @@ #include <glib.h> +#include <wocky/wocky-stanza.h> +#include <wocky/wocky-porter.h> +#include <wocky/wocky-meta-porter.h> + #include "gibber-sockets.h" #include "gibber-bytestream-iface.h" -#include "gibber-xmpp-connection.h" -#include "gibber-xmpp-stanza.h" #include "gibber-namespaces.h" #include "gibber-linklocal-transport.h" #include "gibber-xmpp-error.h" -#include "gibber-iq-helper.h" #include "gibber-util.h" #include "gibber-transport.h" #include "gibber-fd-transport.h" @@ -57,7 +58,8 @@ G_DEFINE_TYPE_WITH_CODE (GibberBytestreamOOB, gibber_bytestream_oob, /* properties */ enum { - PROP_XMPP_CONNECTION = 1, + PROP_PORTER = 1, + PROP_CONTACT, PROP_SELF_ID, PROP_PEER_ID, PROP_STREAM_ID, @@ -71,7 +73,8 @@ enum typedef struct _GibberBytestreamIBBPrivate GibberBytestreamOOBPrivate; struct _GibberBytestreamIBBPrivate { - GibberXmppConnection *xmpp_connection; + WockyPorter *porter; + WockyContact *contact; gchar *self_id; gchar *peer_id; gchar *stream_id; @@ -79,8 +82,10 @@ struct _GibberBytestreamIBBPrivate /* ID of the OOB opening stanza. We'll reply to * it when we the bytestream is closed */ gchar *stream_open_id; + guint stanza_received_id; GibberBytestreamState state; gchar *host; + gchar *url; /* Are we the recipient of this bytestream? * If not we are the sender */ @@ -113,16 +118,16 @@ gibber_bytestream_oob_init (GibberBytestreamOOB *self) priv->dispose_has_run = FALSE; } -static GibberXmppStanza * +static WockyStanza * make_iq_oob_sucess_response (const gchar *from, const gchar *to, const gchar *id) { - return gibber_xmpp_stanza_build ( - GIBBER_STANZA_TYPE_IQ, GIBBER_STANZA_SUB_TYPE_RESULT, + return wocky_stanza_build ( + WOCKY_STANZA_TYPE_IQ, WOCKY_STANZA_SUB_TYPE_RESULT, from, to, - GIBBER_NODE_ATTRIBUTE, "id", id, - GIBBER_STANZA_END); + WOCKY_NODE_ATTRIBUTE, "id", id, + NULL); } static void @@ -235,53 +240,29 @@ set_transport (GibberBytestreamOOB *self, } static void -connect_to_url (GibberBytestreamOOB *self, - const gchar *url) +connect_to_url (GibberBytestreamOOB *self) { GibberBytestreamOOBPrivate *priv = GIBBER_BYTESTREAM_OOB_GET_PRIVATE (self); GibberLLTransport *ll_transport; + GSocketConnection *conn; + GSocketAddress *socket_address = NULL; gchar **tokens; union { struct sockaddr_storage storage; struct sockaddr_in in; } addr; - socklen_t len; - const gchar *host, *port; + const gchar *port; gint portnum = 0; - - if (!g_str_has_prefix (url, "x-tcp://")) - { - GError e = { GIBBER_XMPP_ERROR, XMPP_ERROR_ITEM_NOT_FOUND, - "URL is not a TCP URL" }; - - DEBUG ("URL is not a TCP URL: %s. Close the bytestream", url); - gibber_bytestream_iface_close (GIBBER_BYTESTREAM_IFACE (self), &e); - return; - } + const gchar *url; + GError *error = NULL; /* TODO: if we want to support IPv6 literals, we have to remove * [] around the address */ - url += strlen ("x-tcp://"); + url = priv->url + strlen ("x-tcp://"); tokens = g_strsplit (url, ":", 2); - host = tokens[0]; port = tokens[1]; - /* FIXME, this is very specific to salut and won't work with a normal xmpp - * client */ - if (!gibber_transport_get_peeraddr ( - GIBBER_TRANSPORT (priv->xmpp_connection->transport), - &addr.storage, &len)) - { - /* I'm too lazy to create more specific errors for this as it should - * never happen while using salut anyway.. */ - GError e = { GIBBER_XMPP_ERROR, XMPP_ERROR_ITEM_NOT_FOUND, - "Unsable get socket address for the control connection" }; - DEBUG ("Could not get socket address for the control connection" ); - gibber_bytestream_iface_close (GIBBER_BYTESTREAM_IFACE (self), &e); - goto out; - } - if (port != NULL) portnum = atoi (port); @@ -296,6 +277,38 @@ connect_to_url (GibberBytestreamOOB *self, goto out; } + conn = wocky_meta_porter_borrow_connection (WOCKY_META_PORTER (priv->porter), + WOCKY_LL_CONTACT (priv->contact)); + + if (conn != NULL) + socket_address = g_socket_connection_get_remote_address (conn, NULL); + + if (conn == NULL || socket_address == NULL) + { + /* I'm too lazy to create more specific errors for this as it should + * never happen while using salut anyway.. */ + GError e = { GIBBER_XMPP_ERROR, XMPP_ERROR_ITEM_NOT_FOUND, + "Unsable get socket address for the control connection" }; + DEBUG ("Could not get socket address for the control connection" ); + gibber_bytestream_iface_close (GIBBER_BYTESTREAM_IFACE (self), &e); + goto out; + } + + if (!g_socket_address_to_native (G_SOCKET_ADDRESS (socket_address), &(addr.storage), + sizeof (addr.storage), &error)) + { + GError e = { GIBBER_XMPP_ERROR, XMPP_ERROR_ITEM_NOT_FOUND, + "Failed to turn socket address into bytes" }; + DEBUG ("Failed to get native socket address: %s", error->message); + gibber_bytestream_iface_close (GIBBER_BYTESTREAM_IFACE (self), &e); + g_clear_error (&error); + goto out; + } + + /* FIXME: this is a hack until we get the normalization of v6-in-v4 + * addresses in GLib. See bgo#646082 */ + gibber_normalize_address (&(addr.storage)); + addr.in.sin_port = g_htons ((guint16) portnum); ll_transport = gibber_ll_transport_new (); @@ -304,56 +317,97 @@ connect_to_url (GibberBytestreamOOB *self, g_object_unref (ll_transport); out: + if (socket_address != NULL) + g_object_unref (socket_address); + g_strfreev (tokens); } +static void +opened_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + WockyMetaPorter *porter = WOCKY_META_PORTER (source_object); + GibberBytestreamOOB *self = user_data; + GibberBytestreamOOBPrivate *priv = GIBBER_BYTESTREAM_OOB_GET_PRIVATE (self); + GError *error = NULL; + + if (!wocky_meta_porter_open_finish (porter, result, &error)) + { + DEBUG ("failed to open connection to contact"); + g_clear_error (&error); + } + else + { + connect_to_url (self); + } + + g_free (priv->url); + + wocky_meta_porter_unhold (porter, priv->contact); +} + static gboolean parse_oob_init_iq (GibberBytestreamOOB *self, - GibberXmppStanza *stanza) + WockyStanza *stanza) { GibberBytestreamOOBPrivate *priv = GIBBER_BYTESTREAM_OOB_GET_PRIVATE (self); - GibberXmppNode *query_node, *url_node; - GibberStanzaType type; - GibberStanzaSubType sub_type; + WockyNode *query_node, *url_node; + WockyStanzaType type; + WockyStanzaSubType sub_type; const gchar *stream_id, *url; WockyNode *node = wocky_stanza_get_top_node (stanza); - gibber_xmpp_stanza_get_type_info (stanza, &type, &sub_type); + wocky_stanza_get_type_info (stanza, &type, &sub_type); - if (type != GIBBER_STANZA_TYPE_IQ || - sub_type != GIBBER_STANZA_SUB_TYPE_SET) + if (type != WOCKY_STANZA_TYPE_IQ || + sub_type != WOCKY_STANZA_SUB_TYPE_SET) return FALSE; - query_node = gibber_xmpp_node_get_child_ns (node, "query", + query_node = wocky_node_get_child_ns (node, "query", GIBBER_XMPP_NS_IQ_OOB); if (query_node == NULL) return FALSE; - stream_id = gibber_xmpp_node_get_attribute (query_node, "sid"); + stream_id = wocky_node_get_attribute (query_node, "sid"); if (stream_id == NULL || strcmp (stream_id, priv->stream_id) != 0) return FALSE; - url_node = gibber_xmpp_node_get_child (query_node, "url"); + url_node = wocky_node_get_child (query_node, "url"); if (url_node == NULL) return FALSE; url = url_node->content; priv->recipient = TRUE; - priv->stream_open_id = g_strdup (gibber_xmpp_node_get_attribute ( + priv->stream_open_id = g_strdup (wocky_node_get_attribute ( node, "id")); - connect_to_url (self, url); + if (!g_str_has_prefix (url, "x-tcp://")) + { + GError e = { GIBBER_XMPP_ERROR, XMPP_ERROR_ITEM_NOT_FOUND, + "URL is not a TCP URL" }; + + DEBUG ("URL is not a TCP URL: %s. Close the bytestream", priv->url); + gibber_bytestream_iface_close (GIBBER_BYTESTREAM_IFACE (self), &e); + return TRUE; + } + + priv->url = g_strdup (url); + + wocky_meta_porter_open_async (WOCKY_META_PORTER (priv->porter), + WOCKY_LL_CONTACT (priv->contact), NULL, opened_cb, self); return TRUE; } static gboolean parse_oob_iq_result (GibberBytestreamOOB *self, - GibberXmppStanza *stanza) + WockyStanza *stanza) { GibberBytestreamOOBPrivate *priv = GIBBER_BYTESTREAM_OOB_GET_PRIVATE (self); - GibberStanzaType type; - GibberStanzaSubType sub_type; + WockyStanzaType type; + WockyStanzaSubType sub_type; const gchar *id; WockyNode *node = wocky_stanza_get_top_node (stanza); @@ -361,14 +415,14 @@ parse_oob_iq_result (GibberBytestreamOOB *self, /* Only the sender have to wait for the IQ reply */ return FALSE; - gibber_xmpp_stanza_get_type_info (stanza, &type, &sub_type); + wocky_stanza_get_type_info (stanza, &type, &sub_type); - if (type != GIBBER_STANZA_TYPE_IQ || - sub_type != GIBBER_STANZA_SUB_TYPE_RESULT) + if (type != WOCKY_STANZA_TYPE_IQ || + sub_type != WOCKY_STANZA_SUB_TYPE_RESULT) return FALSE; /* FIXME: we should check if it's the right sender */ - id = gibber_xmpp_node_get_attribute (node, "id"); + id = wocky_node_get_attribute (node, "id"); if (id == NULL || strcmp (id, priv->stream_open_id) != 0) return FALSE; @@ -378,58 +432,30 @@ parse_oob_iq_result (GibberBytestreamOOB *self, return TRUE; } -static void -xmpp_connection_received_stanza_cb (GibberXmppConnection *conn, - GibberXmppStanza *stanza, - gpointer user_data) +static gboolean +received_stanza_cb (WockyPorter *porter, + WockyStanza *stanza, + gpointer user_data) { GibberBytestreamOOB *self = (GibberBytestreamOOB *) user_data; WockyNode *node = wocky_stanza_get_top_node (stanza); const gchar *from; /* discard invalid stanza */ - from = gibber_xmpp_node_get_attribute (node, "from"); + from = wocky_node_get_attribute (node, "from"); if (from == NULL) { DEBUG ("got a message without a from field"); - return; + return FALSE; } if (parse_oob_init_iq (self, stanza)) - return; + return TRUE; if (parse_oob_iq_result (self, stanza)) - return; -} + return TRUE; -static void -xmpp_connection_stream_closed_cb (GibberXmppConnection *connection, - gpointer userdata) -{ - GibberBytestreamOOB *self = GIBBER_BYTESTREAM_OOB (userdata); - DEBUG ("XMPP connection: stream closed. Close the OOB bytestream"); - g_object_set (self, "state", GIBBER_BYTESTREAM_STATE_CLOSING, NULL); - bytestream_closed (self); -} - -static void -xmpp_connection_transport_disconnected_cb (GibberLLTransport *transport, - gpointer userdata) -{ - GibberBytestreamOOB *self = GIBBER_BYTESTREAM_OOB (userdata); - DEBUG ("XMPP connection transport closed. Close the OOB bytestream"); - g_object_set (self, "state", GIBBER_BYTESTREAM_STATE_CLOSING, NULL); - bytestream_closed (self); -} - -static void -xmpp_connection_parse_error_cb (GibberXmppConnection *connection, - gpointer userdata) -{ - GibberBytestreamOOB *self = GIBBER_BYTESTREAM_OOB (userdata); - DEBUG ("XMPP connection: parse error. Close the OOB bytestream"); - g_object_set (self, "state", GIBBER_BYTESTREAM_STATE_CLOSING, NULL); - bytestream_closed (self); + return FALSE; } static void @@ -461,13 +487,18 @@ gibber_bytestream_oob_dispose (GObject *object) priv->listener = NULL; } - if (priv->xmpp_connection != NULL) + if (priv->porter != NULL) { - g_signal_handlers_disconnect_matched (priv->xmpp_connection->transport, - G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, self); - g_signal_handlers_disconnect_matched (priv->xmpp_connection, - G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, self); - g_object_unref (priv->xmpp_connection); + wocky_porter_unregister_handler (priv->porter, priv->stanza_received_id); + priv->stanza_received_id = 0; + g_object_unref (priv->porter); + priv->porter = NULL; + } + + if (priv->contact != NULL) + { + g_object_unref (priv->contact); + priv->contact = NULL; } G_OBJECT_CLASS (gibber_bytestream_oob_parent_class)->dispose (object); @@ -500,8 +531,11 @@ gibber_bytestream_oob_get_property (GObject *object, switch (property_id) { - case PROP_XMPP_CONNECTION: - g_value_set_object (value, priv->xmpp_connection); + case PROP_PORTER: + g_value_set_object (value, priv->porter); + break; + case PROP_CONTACT: + g_value_set_object (value, priv->contact); break; case PROP_SELF_ID: g_value_set_string (value, priv->self_id); @@ -531,6 +565,21 @@ gibber_bytestream_oob_get_property (GObject *object, } static void +make_porter_connections (GibberBytestreamOOB *self) +{ + GibberBytestreamOOBPrivate *priv = GIBBER_BYTESTREAM_OOB_GET_PRIVATE (self); + gchar *jid; + + jid = wocky_contact_dup_jid (priv->contact); + + priv->stanza_received_id = wocky_porter_register_handler_from (priv->porter, + WOCKY_STANZA_TYPE_IQ, WOCKY_STANZA_TYPE_NONE, jid, + WOCKY_PORTER_HANDLER_PRIORITY_NORMAL, received_stanza_cb, self, NULL); + + g_free (jid); +} + +static void gibber_bytestream_oob_set_property (GObject *object, guint property_id, const GValue *value, @@ -541,17 +590,11 @@ gibber_bytestream_oob_set_property (GObject *object, switch (property_id) { - case PROP_XMPP_CONNECTION: - priv->xmpp_connection = g_value_get_object (value); - g_signal_connect (priv->xmpp_connection, "received-stanza", - G_CALLBACK (xmpp_connection_received_stanza_cb), self); - g_signal_connect (priv->xmpp_connection, "stream-closed", - G_CALLBACK (xmpp_connection_stream_closed_cb), self); - g_signal_connect (priv->xmpp_connection->transport, "disconnected", - G_CALLBACK (xmpp_connection_transport_disconnected_cb), self); - g_signal_connect (priv->xmpp_connection, "parse-error", - G_CALLBACK (xmpp_connection_parse_error_cb), self); - g_object_ref (priv->xmpp_connection); + case PROP_PORTER: + priv->porter = g_value_dup_object (value); + break; + case PROP_CONTACT: + priv->contact = g_value_dup_object (value); break; case PROP_SELF_ID: g_free (priv->self_id); @@ -602,12 +645,27 @@ gibber_bytestream_oob_constructor (GType type, g_assert (priv->self_id != NULL); g_assert (priv->peer_id != NULL); g_assert (priv->stream_id != NULL); - g_assert (priv->xmpp_connection != NULL); + g_assert (priv->porter != NULL); + g_assert (priv->contact != NULL); return obj; } static void +gibber_bytestream_oob_constructed (GObject *obj) +{ + GibberBytestreamOOB *self = GIBBER_BYTESTREAM_OOB (obj); + GibberBytestreamOOBPrivate *priv = GIBBER_BYTESTREAM_OOB_GET_PRIVATE (self); + + if (G_OBJECT_CLASS (gibber_bytestream_oob_parent_class)->constructed != NULL) + G_OBJECT_CLASS (gibber_bytestream_oob_parent_class)->constructed (obj); + + if (priv->porter != NULL && priv->contact != NULL) + make_porter_connections (self); +} + + +static void gibber_bytestream_oob_class_init ( GibberBytestreamOOBClass *gibber_bytestream_oob_class) { @@ -623,6 +681,7 @@ gibber_bytestream_oob_class_init ( object_class->get_property = gibber_bytestream_oob_get_property; object_class->set_property = gibber_bytestream_oob_set_property; object_class->constructor = gibber_bytestream_oob_constructor; + object_class->constructed = gibber_bytestream_oob_constructed; g_object_class_override_property (object_class, PROP_SELF_ID, "self-id"); @@ -636,14 +695,25 @@ gibber_bytestream_oob_class_init ( "protocol"); param_spec = g_param_spec_object ( - "xmpp-connection", - "GibberXmppConnection object", - "Gibber XMPP connection object used for communication by this " + "porter", + "WockyPorter object", + "Wocky porter object used for communication by this " "bytestream if it's a private one", - GIBBER_TYPE_XMPP_CONNECTION, + WOCKY_TYPE_PORTER, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); - g_object_class_install_property (object_class, PROP_XMPP_CONNECTION, + g_object_class_install_property (object_class, PROP_PORTER, + param_spec); + + param_spec = g_param_spec_object ( + "contact", + "WockyContact object", + "Contact object used for communication by this " + "bytestream if it's a private one", + WOCKY_TYPE_CONTACT, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + g_object_class_install_property (object_class, PROP_CONTACT, param_spec); param_spec = g_param_spec_string ( @@ -714,31 +784,31 @@ gibber_bytestream_oob_send (GibberBytestreamIface *bytestream, return TRUE; } -static GibberXmppStanza * +static WockyStanza * create_si_accept_iq (GibberBytestreamOOB *self) { GibberBytestreamOOBPrivate *priv = GIBBER_BYTESTREAM_OOB_GET_PRIVATE (self); - return gibber_xmpp_stanza_build ( - GIBBER_STANZA_TYPE_IQ, GIBBER_STANZA_SUB_TYPE_RESULT, - priv->self_id, priv->peer_id, - GIBBER_NODE_ATTRIBUTE, "id", priv->stream_init_id, - GIBBER_NODE, "si", - GIBBER_NODE_XMLNS, GIBBER_XMPP_NS_SI, - GIBBER_NODE, "feature", - GIBBER_NODE_XMLNS, GIBBER_XMPP_NS_FEATURENEG, - GIBBER_NODE, "x", - GIBBER_NODE_XMLNS, GIBBER_XMPP_NS_DATA, - GIBBER_NODE_ATTRIBUTE, "type", "submit", - GIBBER_NODE, "field", - GIBBER_NODE_ATTRIBUTE, "var", "stream-method", - GIBBER_NODE, "value", - GIBBER_NODE_TEXT, GIBBER_XMPP_NS_IQ_OOB, - GIBBER_NODE_END, - GIBBER_NODE_END, - GIBBER_NODE_END, - GIBBER_NODE_END, - GIBBER_NODE_END, GIBBER_STANZA_END); + return wocky_stanza_build_to_contact ( + WOCKY_STANZA_TYPE_IQ, WOCKY_STANZA_SUB_TYPE_RESULT, + priv->self_id, priv->contact, + '@', "id", priv->stream_init_id, + '(', "si", + ':', GIBBER_XMPP_NS_SI, + '(', "feature", + ':', GIBBER_XMPP_NS_FEATURENEG, + '(', "x", + ':', GIBBER_XMPP_NS_DATA, + '@', "type", "submit", + '(', "field", + '@', "var", "stream-method", + '(', "value", + '$', GIBBER_XMPP_NS_IQ_OOB, + ')', + ')', + ')', + ')', + ')', NULL); } /* @@ -753,9 +823,9 @@ gibber_bytestream_oob_accept (GibberBytestreamIface *bytestream, { GibberBytestreamOOB *self = GIBBER_BYTESTREAM_OOB (bytestream); GibberBytestreamOOBPrivate *priv = GIBBER_BYTESTREAM_OOB_GET_PRIVATE (self); - GibberXmppStanza *stanza; + WockyStanza *stanza; WockyNode *node; - GibberXmppNode *si; + WockyNode *si; if (priv->state != GIBBER_BYTESTREAM_STATE_LOCAL_PENDING) { @@ -766,7 +836,7 @@ gibber_bytestream_oob_accept (GibberBytestreamIface *bytestream, stanza = create_si_accept_iq (self); node = wocky_stanza_get_top_node (stanza); - si = gibber_xmpp_node_get_child_ns (node, "si", GIBBER_XMPP_NS_SI); + si = wocky_node_get_child_ns (node, "si", GIBBER_XMPP_NS_SI); g_assert (si != NULL); if (func != NULL) @@ -775,7 +845,7 @@ gibber_bytestream_oob_accept (GibberBytestreamIface *bytestream, func (si, user_data); } - gibber_xmpp_connection_send (priv->xmpp_connection, stanza, NULL); + wocky_porter_send (priv->porter, stanza); DEBUG ("stream is now accepted"); g_object_set (self, "state", GIBBER_BYTESTREAM_STATE_ACCEPTED, NULL); @@ -789,27 +859,18 @@ bytestream_closed (GibberBytestreamOOB *self) if (priv->recipient) { - /* We are the recipient and so have to send the reply - * to the OOB opening IQ */ - if (priv->xmpp_connection->stream_flags == - GIBBER_XMPP_CONNECTION_STREAM_FULLY_OPEN) - { - GibberXmppStanza *stanza; + WockyStanza *stanza; - /* As described in the XEP, we send result IQ when we have - * finished to use the OOB */ - stanza = make_iq_oob_sucess_response (priv->self_id, - priv->peer_id, priv->stream_open_id); + /* As described in the XEP, we send result IQ when we have + * finished to use the OOB */ + stanza = make_iq_oob_sucess_response (priv->self_id, + priv->peer_id, priv->stream_open_id); + wocky_stanza_set_to_contact (stanza, priv->contact); - DEBUG ("send OOB close stanza"); + DEBUG ("send OOB close stanza"); - gibber_xmpp_connection_send (priv->xmpp_connection, stanza, NULL); - g_object_unref (stanza); - } - else - { - DEBUG ("XMPP connection is closed. Don't send OOB close stanza"); - } + wocky_porter_send (priv->porter, stanza); + g_object_unref (stanza); } else { @@ -833,16 +894,16 @@ gibber_bytestream_oob_decline (GibberBytestreamOOB *self, GError *error) { GibberBytestreamOOBPrivate *priv = GIBBER_BYTESTREAM_OOB_GET_PRIVATE (self); - GibberXmppStanza *stanza; + WockyStanza *stanza; WockyNode *node; g_return_if_fail (priv->state == GIBBER_BYTESTREAM_STATE_LOCAL_PENDING); - stanza = gibber_xmpp_stanza_build ( - GIBBER_STANZA_TYPE_IQ, GIBBER_STANZA_SUB_TYPE_ERROR, - priv->self_id, priv->peer_id, - GIBBER_NODE_ATTRIBUTE, "id", priv->stream_init_id, - GIBBER_STANZA_END); + stanza = wocky_stanza_build_to_contact ( + WOCKY_STANZA_TYPE_IQ, WOCKY_STANZA_SUB_TYPE_ERROR, + priv->self_id, priv->contact, + '@', "id", priv->stream_init_id, + NULL); node = wocky_stanza_get_top_node (stanza); if (error != NULL && error->domain == GIBBER_XMPP_ERROR) @@ -855,7 +916,7 @@ gibber_bytestream_oob_decline (GibberBytestreamOOB *self, "Offer Declined"); } - gibber_xmpp_connection_send (priv->xmpp_connection, stanza, NULL); + wocky_porter_send (priv->porter, stanza); g_object_unref (stanza); } @@ -903,22 +964,22 @@ gibber_bytestream_oob_close (GibberBytestreamIface *bytestream, TRUE); } -static GibberXmppStanza * +static WockyStanza * make_oob_init_iq (const gchar *from, const gchar *to, const gchar *stream_id, const gchar *url) { - return gibber_xmpp_stanza_build ( - GIBBER_STANZA_TYPE_IQ, GIBBER_STANZA_SUB_TYPE_SET, + return wocky_stanza_build ( + WOCKY_STANZA_TYPE_IQ, WOCKY_STANZA_SUB_TYPE_SET, from, to, - GIBBER_NODE, "query", - GIBBER_NODE_XMLNS, GIBBER_XMPP_NS_IQ_OOB, - GIBBER_NODE_ATTRIBUTE, "sid", stream_id, - GIBBER_NODE, "url", - GIBBER_NODE_TEXT, url, - GIBBER_NODE_END, - GIBBER_NODE_END, GIBBER_STANZA_END); + '(', "query", + ':', GIBBER_XMPP_NS_IQ_OOB, + '@', "sid", stream_id, + '(', "url", + '$', url, + ')', + ')', NULL); } static void @@ -953,9 +1014,8 @@ gibber_bytestream_oob_initiate (GibberBytestreamIface *bytestream) { GibberBytestreamOOB *self = GIBBER_BYTESTREAM_OOB (bytestream); GibberBytestreamOOBPrivate *priv = GIBBER_BYTESTREAM_OOB_GET_PRIVATE (self); - GibberXmppStanza *stanza; + WockyStanza *stanza; WockyNode *node; - GError *error = NULL; const gchar *id; int port; gchar *url; @@ -988,25 +1048,25 @@ gibber_bytestream_oob_initiate (GibberBytestreamIface *bytestream) stanza = make_oob_init_iq (priv->self_id, priv->peer_id, priv->stream_id, url); g_free (url); + wocky_stanza_set_to_contact (stanza, priv->contact); node = wocky_stanza_get_top_node (stanza); - id = gibber_xmpp_node_get_attribute (node, "id"); + id = wocky_node_get_attribute (node, "id"); if (id == NULL) { - priv->stream_open_id = gibber_xmpp_connection_new_id ( - priv->xmpp_connection); - gibber_xmpp_node_set_attribute (node, "id", - priv->stream_open_id); + /* let the porter generate the IQ id for us */ + wocky_porter_send_iq_async (priv->porter, stanza, + NULL, NULL, NULL); + + priv->stream_open_id = g_strdup ( + wocky_node_get_attribute (node, "id")); } else { + /* save the stream open ID */ priv->stream_open_id = g_strdup (id); - } - if (!gibber_xmpp_connection_send (priv->xmpp_connection, stanza, &error)) - { - DEBUG ("can't send OOB init stanza: %s", error->message); - return FALSE; + wocky_porter_send (priv->porter, stanza); } g_object_unref (stanza); diff --git a/lib/gibber/gibber-debug.c b/lib/gibber/gibber-debug.c index e7ce58cd..47cc8742 100644 --- a/lib/gibber/gibber-debug.c +++ b/lib/gibber/gibber-debug.c @@ -70,7 +70,7 @@ void gibber_debug (DebugFlags flag, void gibber_debug_stanza (DebugFlags flag, - GibberXmppStanza *stanza, + WockyStanza *stanza, const gchar *format, ...) { @@ -87,7 +87,7 @@ gibber_debug_stanza (DebugFlags flag, msg = g_strdup_vprintf (format, args); va_end (args); - node_str = gibber_xmpp_node_to_string (node); + node_str = wocky_node_to_string (node); g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "%s\n%s", msg, node_str); diff --git a/lib/gibber/gibber-debug.h b/lib/gibber/gibber-debug.h index 9cd9f1be..aeef49af 100644 --- a/lib/gibber/gibber-debug.h +++ b/lib/gibber/gibber-debug.h @@ -6,7 +6,7 @@ #include <glib.h> -#include "gibber-xmpp-stanza.h" +#include <wocky/wocky-stanza.h> G_BEGIN_DECLS @@ -34,7 +34,7 @@ void gibber_debug_set_flags (DebugFlags flags); gboolean gibber_debug_flag_is_set (DebugFlags flag); void gibber_debug (DebugFlags flag, const gchar *format, ...) G_GNUC_PRINTF (2, 3); -void gibber_debug_stanza (DebugFlags flag, GibberXmppStanza *stanza, +void gibber_debug_stanza (DebugFlags flag, WockyStanza *stanza, const gchar *format, ...) G_GNUC_PRINTF (3, 4); diff --git a/lib/gibber/gibber-file-transfer.c b/lib/gibber/gibber-file-transfer.c index 5fd49a57..8036df6f 100644 --- a/lib/gibber/gibber-file-transfer.c +++ b/lib/gibber/gibber-file-transfer.c @@ -55,7 +55,8 @@ enum PROP_PEER_ID, PROP_FILENAME, PROP_DIRECTION, - PROP_CONNECTION, + PROP_PORTER, + PROP_CONTACT, PROP_DESCRIPTION, PROP_CONTENT_TYPE, LAST_PROPERTY @@ -64,7 +65,10 @@ enum /* private structure */ struct _GibberFileTransferPrivate { - GibberXmppConnection *connection; + WockyPorter *porter; + WockyContact *contact; + + guint stanza_id; guint64 size; }; @@ -114,8 +118,11 @@ gibber_file_transfer_get_property (GObject *object, case PROP_DIRECTION: g_value_set_enum (value, self->direction); break; - case PROP_CONNECTION: - g_value_set_object (value, self->priv->connection); + case PROP_PORTER: + g_value_set_object (value, self->priv->porter); + break; + case PROP_CONTACT: + g_value_set_object (value, self->priv->contact); break; case PROP_DESCRIPTION: g_value_set_string (value, self->description); @@ -137,8 +144,8 @@ generate_id (void) return g_strdup_printf ("gibber-file-transfer-%d", id_num++); } -static void received_stanza_cb (GibberXmppConnection *conn, - GibberXmppStanza *stanza, gpointer user_data); +static gboolean received_stanza_cb (WockyPorter *porter, + WockyStanza *stanza, gpointer user_data); static void gibber_file_transfer_set_property (GObject *object, @@ -171,11 +178,19 @@ gibber_file_transfer_set_property (GObject *object, case PROP_DIRECTION: self->direction = g_value_get_enum (value); break; - case PROP_CONNECTION: - self->priv->connection = g_value_dup_object (value); - if (self->priv->connection != NULL) - g_signal_connect (self->priv->connection, "received-stanza", - G_CALLBACK (received_stanza_cb), self); + case PROP_PORTER: + { + self->priv->porter = g_value_dup_object (value); + + self->priv->stanza_id = + wocky_porter_register_handler_from_anyone (self->priv->porter, + WOCKY_STANZA_TYPE_IQ, WOCKY_STANZA_SUB_TYPE_NONE, + WOCKY_PORTER_HANDLER_PRIORITY_NORMAL, received_stanza_cb, + self, NULL); + } + break; + case PROP_CONTACT: + self->priv->contact = g_value_dup_object (value); break; case PROP_DESCRIPTION: self->description = g_value_dup_string (value); @@ -241,12 +256,19 @@ gibber_file_transfer_class_init (GibberFileTransferClass *gibber_file_transfer_c G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB); g_object_class_install_property (object_class, PROP_DIRECTION, param_spec); - param_spec = g_param_spec_object ("connection", - "GibberXmppConnection object", "Gibber Connection used to send stanzas", - GIBBER_TYPE_XMPP_CONNECTION, + param_spec = g_param_spec_object ("porter", + "WockyPorter object", "Wocky porter used to send stanzas", + WOCKY_TYPE_PORTER, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | + G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB); + g_object_class_install_property (object_class, PROP_PORTER, param_spec); + + param_spec = g_param_spec_object ("contact", + "WockyContact object", "Wocky Contact", + WOCKY_TYPE_CONTACT, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB); - g_object_class_install_property (object_class, PROP_CONNECTION, param_spec); + g_object_class_install_property (object_class, PROP_CONTACT, param_spec); param_spec = g_param_spec_string ("description", "Description", @@ -303,12 +325,18 @@ gibber_file_transfer_dispose (GObject *object) { GibberFileTransfer *self = GIBBER_FILE_TRANSFER (object); - if (self->priv->connection != NULL) + if (self->priv->porter != NULL) + { + wocky_porter_unregister_handler (self->priv->porter, + self->priv->stanza_id); + g_object_unref (self->priv->porter); + self->priv->porter = NULL; + } + + if (self->priv->contact != NULL) { - g_signal_handlers_disconnect_matched (self->priv->connection, - G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, self); - g_object_unref (self->priv->connection); - self->priv->connection = NULL; + g_object_unref (self->priv->contact); + self->priv->contact = NULL; } G_OBJECT_CLASS (gibber_file_transfer_parent_class)->dispose (object); @@ -329,22 +357,27 @@ gibber_file_transfer_finalize (GObject *object) G_OBJECT_CLASS (gibber_file_transfer_parent_class)->finalize (object); } -static void -received_stanza_cb (GibberXmppConnection *conn, - GibberXmppStanza *stanza, +static gboolean +received_stanza_cb (WockyPorter *porter, + WockyStanza *stanza, gpointer user_data) { GibberFileTransfer *self = user_data; const gchar *id; - id = gibber_xmpp_node_get_attribute (wocky_stanza_get_top_node (stanza), + id = wocky_node_get_attribute (wocky_stanza_get_top_node (stanza), "id"); if (id != NULL && strcmp (id, self->id) == 0) - GIBBER_FILE_TRANSFER_GET_CLASS (self)->received_stanza (self, stanza); + { + GIBBER_FILE_TRANSFER_GET_CLASS (self)->received_stanza (self, stanza); + return TRUE; + } + + return FALSE; } gboolean -gibber_file_transfer_is_file_offer (GibberXmppStanza *stanza) +gibber_file_transfer_is_file_offer (WockyStanza *stanza) { /* FIXME put the known backends in a list and stop when the first one * can handle the stanza */ @@ -353,8 +386,9 @@ gibber_file_transfer_is_file_offer (GibberXmppStanza *stanza) GibberFileTransfer * gibber_file_transfer_new_from_stanza_with_from ( - GibberXmppStanza *stanza, - GibberXmppConnection *connection, + WockyStanza *stanza, + WockyPorter *porter, + WockyContact *contact, const gchar *from, GError **error) { @@ -362,8 +396,8 @@ gibber_file_transfer_new_from_stanza_with_from ( * can handle the stanza */ GibberFileTransfer *ft; - ft = gibber_oob_file_transfer_new_from_stanza_with_from (stanza, connection, - from, error); + ft = gibber_oob_file_transfer_new_from_stanza_with_from (stanza, porter, + contact, from, error); /* it's not possible to have an outgoing transfer created from * a stanza */ g_assert (ft == NULL || @@ -373,16 +407,17 @@ gibber_file_transfer_new_from_stanza_with_from ( } GibberFileTransfer * -gibber_file_transfer_new_from_stanza (GibberXmppStanza *stanza, - GibberXmppConnection *connection, +gibber_file_transfer_new_from_stanza (WockyStanza *stanza, + WockyPorter *porter, + WockyContact *contact, GError **error) { const gchar *from; from = wocky_node_get_attribute (wocky_stanza_get_top_node (stanza), "from"); - return gibber_file_transfer_new_from_stanza_with_from (stanza, connection, - from, error); + return gibber_file_transfer_new_from_stanza_with_from (stanza, porter, + contact, from, error); } void @@ -455,17 +490,13 @@ gibber_file_transfer_get_size (GibberFileTransfer *self) gboolean gibber_file_transfer_send_stanza (GibberFileTransfer *self, - GibberXmppStanza *stanza, + WockyStanza *stanza, GError **error) { - if (self->priv->connection->transport == NULL || - self->priv->connection->transport->state != GIBBER_TRANSPORT_CONNECTED) - { - g_set_error (error, GIBBER_FILE_TRANSFER_ERROR, - GIBBER_FILE_TRANSFER_ERROR_NOT_CONNECTED, - "XMPP connection not connected"); - return FALSE; - } + if (wocky_stanza_get_to_contact (stanza) == NULL) + wocky_stanza_set_to_contact (stanza, self->priv->contact); + + wocky_porter_send (self->priv->porter, stanza); - return gibber_xmpp_connection_send (self->priv->connection, stanza, error); + return TRUE; } diff --git a/lib/gibber/gibber-file-transfer.h b/lib/gibber/gibber-file-transfer.h index 65d985b9..e86d4cba 100644 --- a/lib/gibber/gibber-file-transfer.h +++ b/lib/gibber/gibber-file-transfer.h @@ -22,8 +22,8 @@ #include <glib.h> #include <glib-object.h> -#include "gibber-xmpp-stanza.h" -#include "gibber-xmpp-connection.h" +#include <wocky/wocky-stanza.h> +#include <wocky/wocky-porter.h> G_BEGIN_DECLS @@ -59,7 +59,7 @@ struct _GibberFileTransferClass void (*cancel) (GibberFileTransfer *ft, guint error_code); void (*received_stanza) (GibberFileTransfer *ft, - GibberXmppStanza *stanza); + WockyStanza *stanza); }; typedef struct _GibberFileTransferPrivate GibberFileTransferPrivate; @@ -103,13 +103,13 @@ GType gibber_file_transfer_get_type (void); GibberFileTransferClass)) -gboolean gibber_file_transfer_is_file_offer (GibberXmppStanza *stanza); +gboolean gibber_file_transfer_is_file_offer (WockyStanza *stanza); GibberFileTransfer *gibber_file_transfer_new_from_stanza ( - GibberXmppStanza *stanza, GibberXmppConnection *connection, + WockyStanza *stanza, WockyPorter *porter, WockyContact *contact, GError **error); GibberFileTransfer *gibber_file_transfer_new_from_stanza_with_from ( - GibberXmppStanza *stanza, GibberXmppConnection *connection, + WockyStanza *stanza, WockyPorter *porter, WockyContact *contact, const gchar *from, GError **error); void gibber_file_transfer_offer (GibberFileTransfer *self); @@ -121,7 +121,7 @@ void gibber_file_transfer_cancel (GibberFileTransfer *self, guint error_code); /* FIXME move to a private header if gibber becomes a public library */ gboolean gibber_file_transfer_send_stanza (GibberFileTransfer *self, - GibberXmppStanza *stanza, GError **error); + WockyStanza *stanza, GError **error); void gibber_file_transfer_emit_error (GibberFileTransfer *self, GError *error); diff --git a/lib/gibber/gibber-iq-helper.c b/lib/gibber/gibber-iq-helper.c deleted file mode 100644 index f96c74f8..00000000 --- a/lib/gibber/gibber-iq-helper.c +++ /dev/null @@ -1,403 +0,0 @@ -/* - * gibber-iq-helper.c - Source for GibberIqHelper - * Copyright (C) 2007 Collabora Ltd. - * - * 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 <unistd.h> -#include <stdlib.h> -#include <string.h> - -#include "gibber-iq-helper.h" - -#include "gibber-xmpp-reader.h" -#include "gibber-xmpp-writer.h" -#include "gibber-transport.h" -#include "gibber-xmpp-stanza.h" - -G_DEFINE_TYPE (GibberIqHelper, gibber_iq_helper, G_TYPE_OBJECT); - -enum -{ - PROP_XMPP_CONNECTION = 1, -}; - -typedef struct _GibberIqHelperPrivate GibberIqHelperPrivate; - -struct _GibberIqHelperPrivate -{ - GibberXmppConnection *xmpp_connection; - GHashTable *id_handlers; - - gboolean dispose_has_run; -}; - -#define GIBBER_IQ_HELPER_GET_PRIVATE(obj) \ - ((GibberIqHelperPrivate *) ((GibberIqHelper *) obj)->priv) - -static void -reply_handler_object_destroy_notify_cb (gpointer _data, GObject *object); - -typedef struct -{ - GibberIqHelper *self; - gchar *id; - GibberIqHelperStanzaReplyFunc reply_func; - GibberXmppStanza *sent_stanza; - GObject *object; - gpointer user_data; -} ReplyHandlerData; - -static void -free_reply_handler_data (ReplyHandlerData *data) -{ - g_object_unref (data->sent_stanza); - g_free (data->id); - - if (data->object != NULL) - { - g_object_weak_unref (data->object, - reply_handler_object_destroy_notify_cb, data); - } - - g_slice_free (ReplyHandlerData, data); -} - -static void -gibber_iq_helper_init (GibberIqHelper *self) -{ - GibberIqHelperPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE (self, - GIBBER_TYPE_IQ_HELPER, GibberIqHelperPrivate); - - self->priv = priv; - - priv->id_handlers = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, - (GDestroyNotify) free_reply_handler_data); - - priv->dispose_has_run = FALSE; -} - -static void -xmpp_connection_received_stanza_cb (GibberXmppConnection *conn, - GibberXmppStanza *stanza, - gpointer user_data) -{ - WockyNode *node = wocky_stanza_get_top_node (stanza); - GibberIqHelper *self = GIBBER_IQ_HELPER (user_data); - GibberIqHelperPrivate *priv = GIBBER_IQ_HELPER_GET_PRIVATE (self); - const gchar *id; - ReplyHandlerData *data; - - id = gibber_xmpp_node_get_attribute (node, "id"); - if (id == NULL) - return; - - data = g_hash_table_lookup (priv->id_handlers, id); - if (data == NULL) - return; - - /* Reply have to be an iq stanza */ - if (strcmp (node->name, "iq")) - return; - - /* Its subtype have to be "result" or "error" */ - if (strcmp (gibber_xmpp_node_get_attribute (node, "type"), "result") - != 0 && - strcmp (gibber_xmpp_node_get_attribute (node, "type"), "error") - != 0) - return; - - /* the user callback may want to free the GibberIqHelper object. Delay this. - */ - g_object_ref (self); - - data->reply_func (self, data->sent_stanza, - stanza, data->object, data->user_data); - - g_hash_table_remove (priv->id_handlers, id); - - g_object_unref (self); -} - -static GObject * -gibber_iq_helper_constructor (GType type, - guint n_props, - GObjectConstructParam *props) -{ - GObject *obj; - GibberIqHelper *self; - GibberIqHelperPrivate *priv; - - obj = G_OBJECT_CLASS(gibber_iq_helper_parent_class)-> - constructor (type, n_props, props); - - self = GIBBER_IQ_HELPER (obj); - priv = GIBBER_IQ_HELPER_GET_PRIVATE (self); - - g_assert (priv->xmpp_connection != NULL); - - g_signal_connect (priv->xmpp_connection, "received-stanza", - G_CALLBACK (xmpp_connection_received_stanza_cb), obj); - - return obj; -} - -static void -gibber_iq_helper_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec) -{ - GibberIqHelper *self = GIBBER_IQ_HELPER (object); - GibberIqHelperPrivate *priv = GIBBER_IQ_HELPER_GET_PRIVATE (self); - - switch (property_id) - { - case PROP_XMPP_CONNECTION: - g_value_set_object (value, priv->xmpp_connection); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} - -static void -gibber_iq_helper_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec) -{ - GibberIqHelper *self = GIBBER_IQ_HELPER (object); - GibberIqHelperPrivate *priv = GIBBER_IQ_HELPER_GET_PRIVATE (self); - - switch (property_id) - { - case PROP_XMPP_CONNECTION: - priv->xmpp_connection = g_value_get_object (value); - g_object_ref (priv->xmpp_connection); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} - -static void gibber_iq_helper_dispose (GObject *object); -static void gibber_iq_helper_finalize (GObject *object); - -static void -gibber_iq_helper_class_init (GibberIqHelperClass *gibber_iq_helper_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (gibber_iq_helper_class); - GParamSpec *param_spec; - - g_type_class_add_private (gibber_iq_helper_class, - sizeof (GibberIqHelperPrivate)); - - object_class->constructor = gibber_iq_helper_constructor; - - object_class->dispose = gibber_iq_helper_dispose; - object_class->finalize = gibber_iq_helper_finalize; - - object_class->get_property = gibber_iq_helper_get_property; - object_class->set_property = gibber_iq_helper_set_property; - - param_spec = g_param_spec_object ( - "xmpp-connection", - "GibberXmppConnection object", - "Gibber XMPP Connection associated with this GibberIqHelper object", - GIBBER_TYPE_XMPP_CONNECTION, - G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); - g_object_class_install_property (object_class, PROP_XMPP_CONNECTION, - param_spec); -} - -void -gibber_iq_helper_dispose (GObject *object) -{ - GibberIqHelper *self = GIBBER_IQ_HELPER (object); - GibberIqHelperPrivate *priv = GIBBER_IQ_HELPER_GET_PRIVATE (self); - - if (priv->dispose_has_run) - return; - - priv->dispose_has_run = TRUE; - - g_assert (priv->xmpp_connection != NULL); - g_signal_handlers_disconnect_by_func (priv->xmpp_connection, - xmpp_connection_received_stanza_cb, self); - g_object_unref (priv->xmpp_connection); - priv->xmpp_connection = NULL; - - if (G_OBJECT_CLASS (gibber_iq_helper_parent_class)->dispose) - G_OBJECT_CLASS (gibber_iq_helper_parent_class)->dispose (object); -} - -void -gibber_iq_helper_finalize (GObject *object) -{ - GibberIqHelper *self = GIBBER_IQ_HELPER (object); - GibberIqHelperPrivate *priv = GIBBER_IQ_HELPER_GET_PRIVATE (self); - - g_hash_table_destroy (priv->id_handlers); - priv->id_handlers = NULL; - - G_OBJECT_CLASS (gibber_iq_helper_parent_class)->finalize (object); -} - -GibberIqHelper * -gibber_iq_helper_new (GibberXmppConnection *xmpp_connection) -{ - g_return_val_if_fail (xmpp_connection != NULL, NULL); - - return g_object_new (GIBBER_TYPE_IQ_HELPER, - "xmpp-connection", xmpp_connection, - NULL); -} - -static void -reply_handler_object_destroy_notify_cb (gpointer _data, - GObject *object) -{ - /* The object was destroyed so we don't care about the - * reply anymore */ - ReplyHandlerData *data = _data; - GibberIqHelperPrivate *priv = GIBBER_IQ_HELPER_GET_PRIVATE (data->self); - - data->object = NULL; - g_hash_table_remove (priv->id_handlers, data->id); -} - -/* - * gibber_iq_send_with_reply - * - * Send a GibberXmppStanza and call reply_func when we receive - * its reply. - * - * If object is non-NULL the handler will follow the lifetime of that object, - * which means that if the object is destroyed the callback will not be invoked - */ -gboolean -gibber_iq_helper_send_with_reply (GibberIqHelper *self, - GibberXmppStanza *iq, - GibberIqHelperStanzaReplyFunc reply_func, - GObject *object, - gpointer user_data, - GError **error) -{ - WockyNode *node = wocky_stanza_get_top_node (iq); - GibberIqHelperPrivate *priv; - const gchar *tmp; - gchar *id; - ReplyHandlerData *data; - - g_return_val_if_fail (self != NULL, FALSE); - g_return_val_if_fail (iq != NULL, FALSE); - g_return_val_if_fail (reply_func != NULL, FALSE); - g_return_val_if_fail (strcmp (node->name, "iq") == 0, FALSE); - - priv = GIBBER_IQ_HELPER_GET_PRIVATE (self); - - tmp = gibber_xmpp_node_get_attribute (node, "id"); - if (tmp == NULL) - { - id = gibber_xmpp_connection_new_id (priv->xmpp_connection); - gibber_xmpp_node_set_attribute (node, "id", id); - } - else - { - id = g_strdup (tmp); - } - - if (!gibber_xmpp_connection_send (priv->xmpp_connection, iq, error)) - { - g_free (id); - return FALSE; - } - - data = g_slice_new (ReplyHandlerData); - data->reply_func = reply_func; - data->sent_stanza = g_object_ref (iq); - data->user_data = user_data; - data->object = object; - data->id = id; - data->self = self; - - if (object != NULL) - { - g_object_weak_ref (object, reply_handler_object_destroy_notify_cb, - data); - } - - /* XXX set a timout if we don't receive the reply ? */ - g_hash_table_insert (priv->id_handlers, id, data); - - return TRUE; -} - -static GibberXmppStanza * -new_reply (GibberXmppStanza *iq, - GibberStanzaSubType sub_type) -{ - GibberXmppStanza *reply; - WockyNode *node = wocky_stanza_get_top_node (iq); - const gchar *id; - const gchar *iq_from, *iq_to; - - g_return_val_if_fail (sub_type == GIBBER_STANZA_SUB_TYPE_RESULT || - sub_type == GIBBER_STANZA_SUB_TYPE_ERROR, NULL); - g_return_val_if_fail (strcmp (node->name, "iq") == 0, NULL); - - id = gibber_xmpp_node_get_attribute (node, "id"); - g_return_val_if_fail (id != NULL, NULL); - - iq_from = gibber_xmpp_node_get_attribute (node, "from"); - iq_to = gibber_xmpp_node_get_attribute (node, "to"); - - reply = gibber_xmpp_stanza_build (GIBBER_STANZA_TYPE_IQ, - sub_type, - iq_to, iq_from, - GIBBER_NODE_ATTRIBUTE, "id", id, - GIBBER_STANZA_END); - - return reply; -} - -GibberXmppStanza * -gibber_iq_helper_new_result_reply (GibberXmppStanza *iq) -{ - return new_reply (iq, GIBBER_STANZA_SUB_TYPE_RESULT); -} - -GibberXmppStanza * -gibber_iq_helper_new_error_reply (GibberXmppStanza *iq, - GibberXmppError error, - const gchar *errmsg) -{ - GibberXmppStanza *stanza; - WockyNode *node; - - stanza = new_reply (iq, GIBBER_STANZA_SUB_TYPE_ERROR); - node = wocky_stanza_get_top_node (stanza); - gibber_xmpp_error_to_node (error, node, errmsg); - - /* TODO: Would be cool to copy <iq> children as in Gabble */ - - return stanza; -} diff --git a/lib/gibber/gibber-iq-helper.h b/lib/gibber/gibber-iq-helper.h deleted file mode 100644 index dc3648c1..00000000 --- a/lib/gibber/gibber-iq-helper.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * gibber-iq-helper.h - Header for GibberIqHelper - * Copyright (C) 2007 Collabora Ltd. - * - * 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 - */ - -#ifndef __GIBBER_IQ_HELPER_H__ -#define __GIBBER_IQ_HELPER_H__ - -#include <glib-object.h> - -#include "gibber-xmpp-stanza.h" -#include "gibber-xmpp-connection.h" -#include "gibber-xmpp-error.h" - -G_BEGIN_DECLS - -typedef struct _GibberIqHelper GibberIqHelper; -typedef struct _GibberIqHelperClass GibberIqHelperClass; - -struct _GibberIqHelperClass -{ - GObjectClass parent_class; -}; - -struct _GibberIqHelper -{ - GObject parent; - - gpointer priv; -}; - -GType gibber_iq_helper_get_type (void); - -/* TYPE MACROS */ -#define GIBBER_TYPE_IQ_HELPER \ - (gibber_iq_helper_get_type ()) -#define GIBBER_IQ_HELPER(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj), GIBBER_TYPE_IQ_HELPER, GibberIqHelper)) -#define GIBBER_IQ_HELPER_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass), GIBBER_TYPE_IQ_HELPER, \ - GibberIqHelperClass)) -#define GIBBER_IS_IQ_HELPER(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj), GIBBER_TYPE_IQ_HELPER)) -#define GIBBER_IS_IQ_HELPER_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE((klass), GIBBER_TYPE_IQ_HELPER)) -#define GIBBER_IQ_HELPER_GET_CLASS(obj) \ - (G_TYPE_INSTANCE_GET_CLASS ((obj), GIBBER_TYPE_IQ_HELPER, \ - GibberIqHelperClass)) - -typedef void (*GibberIqHelperStanzaReplyFunc) (GibberIqHelper *helper, - GibberXmppStanza *sent_stanza, - GibberXmppStanza *reply_stanza, - GObject *object, - gpointer user_data); - -GibberIqHelper * -gibber_iq_helper_new (GibberXmppConnection *xmpp_connection); - -gboolean -gibber_iq_helper_send_with_reply (GibberIqHelper *helper, - GibberXmppStanza *iq, GibberIqHelperStanzaReplyFunc reply_func, - GObject *object, gpointer user_data, GError **error); - -GibberXmppStanza * -gibber_iq_helper_new_result_reply (GibberXmppStanza *iq); - -GibberXmppStanza * -gibber_iq_helper_new_error_reply (GibberXmppStanza *iq, GibberXmppError error, - const gchar *errmsg); - -G_END_DECLS - -#endif /* #ifndef __GIBBER_IQ_HELPER_H__*/ diff --git a/lib/gibber/gibber-muc-connection.c b/lib/gibber/gibber-muc-connection.c index 7b7efdf9..94ba8c3d 100644 --- a/lib/gibber/gibber-muc-connection.c +++ b/lib/gibber/gibber-muc-connection.c @@ -43,7 +43,7 @@ #include "gibber-debug.h" static void _reader_received_stanza_cb (GibberXmppReader *reader, - GibberXmppStanza *stanza, gpointer user_data); + WockyStanza *stanza, gpointer user_data); static void _connection_received_data (GibberTransport *transport, GibberBuffer *buffer, gpointer user_data); @@ -147,7 +147,7 @@ gibber_muc_connection_class_init ( 0, NULL, NULL, _gibber_signals_marshal_VOID__STRING_OBJECT, - G_TYPE_NONE, 2, G_TYPE_STRING, GIBBER_TYPE_XMPP_STANZA); + G_TYPE_NONE, 2, G_TYPE_STRING, WOCKY_TYPE_STANZA); /* UINT: 16 bit stream id * POINTER: guint8 * data buffer * ULONG: data buffer size @@ -631,7 +631,7 @@ gibber_muc_connection_get_parameters (GibberMucConnection *connection) } static void -_reader_received_stanza_cb (GibberXmppReader *reader, GibberXmppStanza *stanza, +_reader_received_stanza_cb (GibberXmppReader *reader, WockyStanza *stanza, gpointer user_data) { GibberMucConnection *self = GIBBER_MUC_CONNECTION (user_data); @@ -680,7 +680,7 @@ _connection_received_data (GibberTransport *transport, GibberBuffer *buffer, gboolean gibber_muc_connection_send (GibberMucConnection *connection, - GibberXmppStanza *stanza, GError **error) + WockyStanza *stanza, GError **error) { GibberMucConnectionPrivate *priv = GIBBER_MUC_CONNECTION_GET_PRIVATE (connection); diff --git a/lib/gibber/gibber-muc-connection.h b/lib/gibber/gibber-muc-connection.h index 981efa18..0f724c84 100644 --- a/lib/gibber/gibber-muc-connection.h +++ b/lib/gibber/gibber-muc-connection.h @@ -24,7 +24,7 @@ #include <glib-object.h> #include "gibber-r-multicast-transport.h" -#include "gibber-xmpp-stanza.h" +#include <wocky/wocky-stanza.h> G_BEGIN_DECLS @@ -101,7 +101,7 @@ const GHashTable * gibber_muc_connection_get_parameters ( GType gibber_muc_connection_get_type (void); gboolean gibber_muc_connection_send (GibberMucConnection *connection, - GibberXmppStanza *stanza, GError **error); + WockyStanza *stanza, GError **error); gboolean gibber_muc_connection_send_raw (GibberMucConnection *connection, diff --git a/lib/gibber/gibber-oob-file-transfer.c b/lib/gibber/gibber-oob-file-transfer.c index 0dba39ec..217db7e8 100644 --- a/lib/gibber/gibber-oob-file-transfer.c +++ b/lib/gibber/gibber-oob-file-transfer.c @@ -26,7 +26,8 @@ #include <libsoup/soup-server.h> #include <libsoup/soup-message.h> -#include "gibber-xmpp-stanza.h" +#include <wocky/wocky-stanza.h> +#include <wocky/wocky-meta-porter.h> #include "gibber-oob-file-transfer.h" #include "gibber-fd-transport.h" #include "gibber-namespaces.h" @@ -86,7 +87,7 @@ static void gibber_oob_file_transfer_receive (GibberFileTransfer *ft, static void gibber_oob_file_transfer_cancel (GibberFileTransfer *ft, guint error_code); static void gibber_oob_file_transfer_received_stanza (GibberFileTransfer *ft, - GibberXmppStanza *stanza); + WockyStanza *stanza); static void gibber_oob_file_transfer_class_init ( @@ -135,27 +136,27 @@ gibber_oob_file_transfer_finalize (GObject *object) } gboolean -gibber_oob_file_transfer_is_file_offer (GibberXmppStanza *stanza) +gibber_oob_file_transfer_is_file_offer (WockyStanza *stanza) { - GibberStanzaType type; - GibberStanzaSubType sub_type; - GibberXmppNode *query; - GibberXmppNode *url; + WockyStanzaType type; + WockyStanzaSubType sub_type; + WockyNode *query; + WockyNode *url; const gchar *url_content; - gibber_xmpp_stanza_get_type_info (stanza, &type, &sub_type); - if (type != GIBBER_STANZA_TYPE_IQ || - sub_type != GIBBER_STANZA_SUB_TYPE_SET) + wocky_stanza_get_type_info (stanza, &type, &sub_type); + if (type != WOCKY_STANZA_TYPE_IQ || + sub_type != WOCKY_STANZA_SUB_TYPE_SET) { return FALSE; } - query = gibber_xmpp_node_get_child (wocky_stanza_get_top_node (stanza), + query = wocky_node_get_child (wocky_stanza_get_top_node (stanza), "query"); if (query == NULL) return FALSE; - url = gibber_xmpp_node_get_child (query, "url"); + url = wocky_node_get_child (query, "url"); if (url == NULL) return FALSE; @@ -176,16 +177,17 @@ gibber_oob_file_transfer_is_file_offer (GibberXmppStanza *stanza) GibberFileTransfer * gibber_oob_file_transfer_new_from_stanza_with_from ( - GibberXmppStanza *stanza, - GibberXmppConnection *connection, + WockyStanza *stanza, + WockyPorter *porter, + WockyContact *contact, const gchar *peer_id, GError **error) { WockyNode *node = wocky_stanza_get_top_node (stanza); GibberOobFileTransfer *self; - GibberXmppNode *query; - GibberXmppNode *url_node; - GibberXmppNode *desc_node; + WockyNode *query; + WockyNode *url_node; + WockyNode *desc_node; const gchar *self_id; const gchar *type; const gchar *id; @@ -196,6 +198,8 @@ gibber_oob_file_transfer_new_from_stanza_with_from ( gchar *url; gchar *filename; + g_return_val_if_fail (WOCKY_IS_PORTER (porter), NULL); + if (strcmp (node->name, "iq") != 0) { g_set_error (error, WOCKY_XMPP_ERROR, WOCKY_XMPP_ERROR_BAD_REQUEST, @@ -203,7 +207,7 @@ gibber_oob_file_transfer_new_from_stanza_with_from ( return NULL; } - self_id = gibber_xmpp_node_get_attribute (node, "to"); + self_id = wocky_node_get_attribute (node, "to"); if (peer_id == NULL) { @@ -219,7 +223,7 @@ gibber_oob_file_transfer_new_from_stanza_with_from ( return NULL; } - type = gibber_xmpp_node_get_attribute (node, "type"); + type = wocky_node_get_attribute (node, "type"); if (type == NULL || strcmp (type, "set") != 0) { @@ -228,7 +232,7 @@ gibber_oob_file_transfer_new_from_stanza_with_from ( return NULL; } - id = gibber_xmpp_node_get_attribute (node, "id"); + id = wocky_node_get_attribute (node, "id"); if (id == NULL) { @@ -237,7 +241,7 @@ gibber_oob_file_transfer_new_from_stanza_with_from ( return NULL; } - query = gibber_xmpp_node_get_child (node, "query"); + query = wocky_node_get_child (node, "query"); if (query == NULL) { @@ -246,7 +250,7 @@ gibber_oob_file_transfer_new_from_stanza_with_from ( return NULL; } - url_node = gibber_xmpp_node_get_child (query, "url"); + url_node = wocky_node_get_child (query, "url"); if (url_node == NULL) { @@ -262,7 +266,7 @@ gibber_oob_file_transfer_new_from_stanza_with_from ( return NULL; } - ft_type = gibber_xmpp_node_get_attribute (url_node, "type"); + ft_type = wocky_node_get_attribute (url_node, "type"); if (ft_type != NULL && gibber_strdiff (ft_type, "file")) { @@ -286,13 +290,13 @@ gibber_oob_file_transfer_new_from_stanza_with_from ( filename++; /* move after the last "/" */ filename = g_uri_unescape_string (filename, NULL); - desc_node = gibber_xmpp_node_get_child (query, "desc"); + desc_node = wocky_node_get_child (query, "desc"); if (desc_node != NULL) { description = desc_node->content; } - content_type = gibber_xmpp_node_get_attribute (url_node, "mimeType"); + content_type = wocky_node_get_attribute (url_node, "mimeType"); if (content_type == NULL) { content_type = "application/octet-stream"; @@ -303,13 +307,14 @@ gibber_oob_file_transfer_new_from_stanza_with_from ( "self-id", self_id, "peer-id", peer_id, "filename", filename, - "connection", connection, + "porter", porter, + "contact", contact, "direction", GIBBER_FILE_TRANSFER_DIRECTION_INCOMING, "description", description, "content-type", content_type, NULL); - size = gibber_xmpp_node_get_attribute (url_node, "size"); + size = wocky_node_get_attribute (url_node, "size"); if (size != NULL) gibber_file_transfer_set_size (GIBBER_FILE_TRANSFER (self), g_ascii_strtoull (size, NULL, 0)); @@ -369,7 +374,7 @@ http_client_finished_chunks_cb (SoupSession *session, gpointer user_data) { GibberOobFileTransfer *self = user_data; - GibberXmppStanza *stanza; + WockyStanza *stanza; GError *error = NULL; guint64 size; @@ -413,12 +418,12 @@ http_client_finished_chunks_cb (SoupSession *session, return; } - stanza = gibber_xmpp_stanza_build (GIBBER_STANZA_TYPE_IQ, - GIBBER_STANZA_SUB_TYPE_RESULT, + stanza = wocky_stanza_build (WOCKY_STANZA_TYPE_IQ, + WOCKY_STANZA_SUB_TYPE_RESULT, GIBBER_FILE_TRANSFER (self)->self_id, GIBBER_FILE_TRANSFER (self)->peer_id, - GIBBER_NODE_ATTRIBUTE, "id", GIBBER_FILE_TRANSFER (self)->id, - GIBBER_STANZA_END); + WOCKY_NODE_ATTRIBUTE, "id", GIBBER_FILE_TRANSFER (self)->id, + NULL); if (!gibber_file_transfer_send_stanza (GIBBER_FILE_TRANSFER (self), stanza, &error)) @@ -466,23 +471,26 @@ gibber_oob_file_transfer_receive (GibberFileTransfer *ft, http_client_finished_chunks_cb, self); } -static GibberXmppStanza * +static WockyStanza * create_transfer_offer (GibberOobFileTransfer *self, GError **error) { - GibberXmppConnection *connection; + WockyMetaPorter *porter; + WockyContact *contact; + GSocketConnection *conn; + GSocketAddress *address; + GInetAddress *addr; + GSocketFamily family; /* local host name */ - gchar host_name[NI_MAXHOST]; - struct sockaddr_storage name_addr; - socklen_t name_addr_len = sizeof (name_addr); + gchar *host_name; gchar *host_escaped; - GibberXmppStanza *stanza; + WockyStanza *stanza; WockyNode *node; - GibberXmppNode *query_node; - GibberXmppNode *url_node; - GibberXmppNode *desc_node; + WockyNode *query_node; + WockyNode *url_node; + WockyNode *desc_node; gchar *filename_escaped; gchar *url; @@ -490,21 +498,33 @@ create_transfer_offer (GibberOobFileTransfer *self, guint64 size; - g_object_get (GIBBER_FILE_TRANSFER (self), "connection", &connection, NULL); - if (connection->transport == NULL) + g_object_get (GIBBER_FILE_TRANSFER (self), + "porter", &porter, + "contact", &contact, + NULL); + + conn = wocky_meta_porter_borrow_connection (porter, WOCKY_LL_CONTACT (contact)); + + g_object_unref (porter); + g_object_unref (contact); + + if (conn == NULL) { g_set_error (error, GIBBER_FILE_TRANSFER_ERROR, GIBBER_FILE_TRANSFER_ERROR_NOT_CONNECTED, "Null transport"); return NULL; } - gibber_transport_get_sockaddr (connection->transport, &name_addr, - &name_addr_len); - g_object_unref (connection); - getnameinfo ((struct sockaddr *) &name_addr, name_addr_len, host_name, - sizeof (host_name), NULL, 0, NI_NUMERICHOST); + address = g_socket_connection_get_local_address (conn, NULL); + address = gibber_normalize_socket_address (address); + addr = g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (address)); + family = g_socket_address_get_family (address); + + host_name = g_inet_address_to_string (addr); - if (name_addr.ss_family == AF_INET6) + g_object_unref (address); + + if (family == G_SOCKET_FAMILY_IPV6) { /* put brackets around the IP6 */ host_escaped = g_strdup_printf ("[%s]", host_name); @@ -515,6 +535,8 @@ create_transfer_offer (GibberOobFileTransfer *self, host_escaped = g_strdup (host_name); } + g_free (host_name); + filename_escaped = g_uri_escape_string (GIBBER_FILE_TRANSFER (self)->filename, NULL, FALSE); url = g_strdup_printf ("http://%s:%d/%s/%s", host_escaped, @@ -525,23 +547,23 @@ create_transfer_offer (GibberOobFileTransfer *self, served_name = g_strdup_printf ("/%s/%s", GIBBER_FILE_TRANSFER (self)->id, GIBBER_FILE_TRANSFER (self)->filename); - stanza = gibber_xmpp_stanza_build (GIBBER_STANZA_TYPE_IQ, - GIBBER_STANZA_SUB_TYPE_SET, + stanza = wocky_stanza_build (WOCKY_STANZA_TYPE_IQ, + WOCKY_STANZA_SUB_TYPE_SET, GIBBER_FILE_TRANSFER (self)->self_id, GIBBER_FILE_TRANSFER (self)->peer_id, - GIBBER_NODE_ATTRIBUTE, "id", GIBBER_FILE_TRANSFER (self)->id, - GIBBER_STANZA_END); + WOCKY_NODE_ATTRIBUTE, "id", GIBBER_FILE_TRANSFER (self)->id, + NULL); node = wocky_stanza_get_top_node (stanza); - query_node = gibber_xmpp_node_add_child_ns (node, "query", + query_node = wocky_node_add_child_ns (node, "query", GIBBER_XMPP_NS_IQ_OOB); - url_node = gibber_xmpp_node_add_child_with_content (query_node, "url", url); - gibber_xmpp_node_set_attribute (url_node, "type", "file"); - gibber_xmpp_node_set_attribute (url_node, "mimeType", + url_node = wocky_node_add_child_with_content (query_node, "url", url); + wocky_node_set_attribute (url_node, "type", "file"); + wocky_node_set_attribute (url_node, "mimeType", GIBBER_FILE_TRANSFER (self)->content_type); - desc_node = gibber_xmpp_node_add_child_with_content (query_node, "desc", + desc_node = wocky_node_add_child_with_content (query_node, "desc", GIBBER_FILE_TRANSFER (self)->description); size = gibber_file_transfer_get_size (GIBBER_FILE_TRANSFER (self)); @@ -551,7 +573,7 @@ create_transfer_offer (GibberOobFileTransfer *self, { gchar *size_str = g_strdup_printf ("%" G_GUINT64_FORMAT, size); - gibber_xmpp_node_set_attribute (url_node, "size", size_str); + wocky_node_set_attribute (url_node, "size", size_str); g_free (size_str); } @@ -718,58 +740,10 @@ http_server_cb (SoupServer *server, } static void -gibber_oob_file_transfer_offer (GibberFileTransfer *ft) +create_and_send_transfer_offer (GibberOobFileTransfer *self) { - GibberOobFileTransfer *self = GIBBER_OOB_FILE_TRANSFER (ft); - GibberXmppStanza *stanza; GError *error = NULL; - - /* start the server if not running */ - /* FIXME we should have only a single server */ - if (self->priv->server == NULL) - { - /* FIXME: libsoup can't listen on IPv4 and IPv6 interfaces at the same - * time. http://bugzilla.gnome.org/show_bug.cgi?id=522519 - * We have to check which IP will be send when creating the stanza. */ - GibberXmppConnection *connection; - struct sockaddr_storage name_addr; - socklen_t name_addr_len = sizeof (name_addr); - - g_object_get (GIBBER_FILE_TRANSFER (self), "connection", &connection, - NULL); - if (connection->transport == NULL) - { - g_set_error (&error, GIBBER_FILE_TRANSFER_ERROR, - GIBBER_FILE_TRANSFER_ERROR_NOT_CONNECTED, "Null transport"); - gibber_file_transfer_emit_error (GIBBER_FILE_TRANSFER (self), - error); - g_error_free (error); - return; - } - - gibber_transport_get_peeraddr (connection->transport, &name_addr, - &name_addr_len); - g_object_unref (connection); - - if (name_addr.ss_family == AF_INET6) - { - /* IPv6 server */ - SoupAddress *addr; - - addr = soup_address_new_any (SOUP_ADDRESS_FAMILY_IPV6, 0); - self->priv->server = soup_server_new (SOUP_SERVER_INTERFACE, - addr, NULL); - - g_object_unref (addr); - } - else - { - /* IPv4 server */ - self->priv->server = soup_server_new (NULL, NULL); - } - - soup_server_run_async (self->priv->server); - } + WockyStanza *stanza; stanza = create_transfer_offer (self, &error); if (stanza == NULL) @@ -791,6 +765,115 @@ gibber_oob_file_transfer_offer (GibberFileTransfer *ft) } static void +porter_open_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + WockyMetaPorter *porter = WOCKY_META_PORTER (source_object); + GibberOobFileTransfer *self = GIBBER_OOB_FILE_TRANSFER (user_data); + GError *error = NULL; + + WockyContact *contact; + + GSocketConnection *conn; + GSocketAddress *address; + GSocketFamily family; + + if (!wocky_meta_porter_open_finish (porter, result, &error)) + { + DEBUG ("Failed to open connection: %s", error->message); + g_clear_error (&error); + + g_set_error (&error, GIBBER_FILE_TRANSFER_ERROR, + GIBBER_FILE_TRANSFER_ERROR_NOT_CONNECTED, "Couldn't open connection"); + gibber_file_transfer_emit_error (GIBBER_FILE_TRANSFER (self), + error); + g_error_free (error); + return; + } + + g_object_get (GIBBER_FILE_TRANSFER (self), + "contact", &contact, + NULL); + + /* FIXME we should have only a single server */ + + /* FIXME: libsoup can't listen on IPv4 and IPv6 interfaces at the same + * time. http://bugzilla.gnome.org/show_bug.cgi?id=522519 + * We have to check which IP will be send when creating the stanza. */ + + conn = wocky_meta_porter_borrow_connection (porter, + WOCKY_LL_CONTACT (contact)); + + if (conn == NULL) + { + g_set_error (&error, GIBBER_FILE_TRANSFER_ERROR, + GIBBER_FILE_TRANSFER_ERROR_NOT_CONNECTED, "Null transport"); + gibber_file_transfer_emit_error (GIBBER_FILE_TRANSFER (self), + error); + g_error_free (error); + goto out; + } + + address = g_socket_connection_get_remote_address (conn, NULL); + family = g_socket_address_get_family (address); + g_object_unref (address); + + if (family == G_SOCKET_FAMILY_IPV6) + { + /* IPv6 server */ + SoupAddress *addr; + + addr = soup_address_new_any (SOUP_ADDRESS_FAMILY_IPV6, 0); + self->priv->server = soup_server_new (SOUP_SERVER_INTERFACE, + addr, NULL); + + g_object_unref (addr); + } + else + { + /* IPv4 server */ + self->priv->server = soup_server_new (NULL, NULL); + } + + soup_server_run_async (self->priv->server); + + create_and_send_transfer_offer (self); + +out: + /* this was reffed when calling open_async */ + wocky_meta_porter_unhold (porter, contact); + g_object_unref (contact); +} + +static void +gibber_oob_file_transfer_offer (GibberFileTransfer *ft) +{ + GibberOobFileTransfer *self = GIBBER_OOB_FILE_TRANSFER (ft); + WockyMetaPorter *porter; + WockyContact *contact; + + if (self->priv->server != NULL) + { + create_and_send_transfer_offer (self); + return; + } + + /* we need to create the soup server */ + + g_object_get (ft, + "porter", &porter, + "contact", &contact, + NULL); + + wocky_meta_porter_open_async (porter, WOCKY_LL_CONTACT (contact), + NULL, porter_open_cb, ft); + + g_object_unref (contact); + g_object_unref (porter); +} + +static void http_server_wrote_chunk_cb (SoupMessage *msg, gpointer user_data) { @@ -827,11 +910,11 @@ gibber_oob_file_transfer_cancel (GibberFileTransfer *ft, guint error_code) { GibberOobFileTransfer *self = GIBBER_OOB_FILE_TRANSFER (ft); - GibberXmppStanza *stanza; + WockyStanza *stanza; WockyNode *node; - GibberXmppNode *query; - GibberXmppNode *error_node; - GibberXmppNode *error_desc; + WockyNode *query; + WockyNode *error_node; + WockyNode *error_desc; gchar *code_string; if (self->priv->cancelled) @@ -843,33 +926,33 @@ gibber_oob_file_transfer_cancel (GibberFileTransfer *ft, * sender cancelled the transfer. */ return; - stanza = gibber_xmpp_stanza_build (GIBBER_STANZA_TYPE_IQ, - GIBBER_STANZA_SUB_TYPE_ERROR, + stanza = wocky_stanza_build (WOCKY_STANZA_TYPE_IQ, + WOCKY_STANZA_SUB_TYPE_ERROR, GIBBER_FILE_TRANSFER (self)->self_id, GIBBER_FILE_TRANSFER (self)->peer_id, - GIBBER_NODE_ATTRIBUTE, "id", GIBBER_FILE_TRANSFER (self)->id, - GIBBER_STANZA_END); + WOCKY_NODE_ATTRIBUTE, "id", GIBBER_FILE_TRANSFER (self)->id, + NULL); node = wocky_stanza_get_top_node (stanza); - query = gibber_xmpp_node_add_child_ns (node, "query", + query = wocky_node_add_child_ns (node, "query", GIBBER_XMPP_NS_IQ_OOB); - gibber_xmpp_node_add_child_with_content (query, "url", self->priv->url); + wocky_node_add_child_with_content (query, "url", self->priv->url); - error_node = gibber_xmpp_node_add_child (node, "error"); + error_node = wocky_node_add_child (node, "error"); code_string = g_strdup_printf ("%d", error_code); switch (error_code) { case HTTP_STATUS_CODE_NOT_FOUND: - gibber_xmpp_node_set_attribute (error_node, "code", code_string); - gibber_xmpp_node_set_attribute (error_node, "type", "cancel"); - error_desc = gibber_xmpp_node_add_child_ns (error_node, + wocky_node_set_attribute (error_node, "code", code_string); + wocky_node_set_attribute (error_node, "type", "cancel"); + error_desc = wocky_node_add_child_ns (error_node, "item-not-found", GIBBER_XMPP_NS_STANZAS); break; case HTTP_STATUS_CODE_NOT_ACCEPTABLE: - gibber_xmpp_node_set_attribute (error_node, "code", code_string); - gibber_xmpp_node_set_attribute (error_node, "type", "modify"); - error_desc = gibber_xmpp_node_add_child_ns (error_node, + wocky_node_set_attribute (error_node, "code", code_string); + wocky_node_set_attribute (error_node, "type", "modify"); + error_desc = wocky_node_add_child_ns (error_node, "not-acceptable", GIBBER_XMPP_NS_STANZAS); break; default: @@ -885,17 +968,17 @@ gibber_oob_file_transfer_cancel (GibberFileTransfer *ft, static void gibber_oob_file_transfer_received_stanza (GibberFileTransfer *ft, - GibberXmppStanza *stanza) + WockyStanza *stanza) { GibberOobFileTransfer *self = GIBBER_OOB_FILE_TRANSFER (ft); WockyNode *node = wocky_stanza_get_top_node (stanza); const gchar *type; - GibberXmppNode *error_node; + WockyNode *error_node; if (strcmp (node->name, "iq") != 0) return; - type = gibber_xmpp_node_get_attribute (node, "type"); + type = wocky_node_get_attribute (node, "type"); if (type == NULL) return; @@ -905,7 +988,7 @@ gibber_oob_file_transfer_received_stanza (GibberFileTransfer *ft, return; } - error_node = gibber_xmpp_node_get_child (node, "error"); + error_node = wocky_node_get_child (node, "error"); if (error_node != NULL) { GError *error = NULL; @@ -914,10 +997,10 @@ gibber_oob_file_transfer_received_stanza (GibberFileTransfer *ft, self->priv->cancelled = TRUE; /* FIXME copy the error handling code from gabble */ - error_code_str = gibber_xmpp_node_get_attribute (error_node, "code"); + error_code_str = wocky_node_get_attribute (error_node, "code"); if (error_code_str == NULL) /* iChat uses the 'type' attribute to transmit the error code */ - error_code_str = gibber_xmpp_node_get_attribute (error_node, "type"); + error_code_str = wocky_node_get_attribute (error_node, "type"); if (error_code_str != NULL && g_ascii_strtoll (error_code_str, NULL, 10) == HTTP_STATUS_CODE_NOT_ACCEPTABLE) diff --git a/lib/gibber/gibber-oob-file-transfer.h b/lib/gibber/gibber-oob-file-transfer.h index b8ec34ad..ea29b9bf 100644 --- a/lib/gibber/gibber-oob-file-transfer.h +++ b/lib/gibber/gibber-oob-file-transfer.h @@ -22,7 +22,6 @@ #include <glib.h> #include <glib-object.h> -#include "gibber-xmpp-connection.h" #include "gibber-file-transfer.h" G_BEGIN_DECLS @@ -60,10 +59,10 @@ GType gibber_oob_file_transfer_get_type (void); (G_TYPE_INSTANCE_GET_CLASS ((obj), GIBBER_TYPE_OOB_FILE_TRANSFER, GibberOobFileTransferClass)) -gboolean gibber_oob_file_transfer_is_file_offer (GibberXmppStanza *stanza); +gboolean gibber_oob_file_transfer_is_file_offer (WockyStanza *stanza); GibberFileTransfer *gibber_oob_file_transfer_new_from_stanza_with_from ( - GibberXmppStanza *stanza, GibberXmppConnection *connection, + WockyStanza *stanza, WockyPorter *porter, WockyContact *contact, const gchar *from, GError **error); G_END_DECLS diff --git a/lib/gibber/gibber-util.c b/lib/gibber/gibber-util.c index 6f5c5722..b1cf93aa 100644 --- a/lib/gibber/gibber-util.c +++ b/lib/gibber/gibber-util.c @@ -50,6 +50,26 @@ gibber_normalize_address (struct sockaddr_storage *addr) } } +/* FIXME: this is a hack until we get the normalization of v6-in-v4 + * addresses in GLib. See bgo#646082 */ +GSocketAddress * +gibber_normalize_socket_address (GSocketAddress *addr) +{ + struct sockaddr_storage ss; + + if (g_socket_address_get_family (addr) != G_SOCKET_FAMILY_IPV6) + return addr; + + if (!g_socket_address_to_native (addr, &ss, sizeof (ss), NULL)) + return addr; + + g_object_unref (addr); + + gibber_normalize_address (&ss); + + return g_socket_address_new_from_native (&ss, sizeof (ss)); +} + /** * gibber_strdiff: * @left: The first string to compare (may be NULL) diff --git a/lib/gibber/gibber-util.h b/lib/gibber/gibber-util.h index d159e39e..bbd9032a 100644 --- a/lib/gibber/gibber-util.h +++ b/lib/gibber/gibber-util.h @@ -23,10 +23,12 @@ #include "gibber-sockets.h" #include <glib.h> +#include <gio/gio.h> G_BEGIN_DECLS void gibber_normalize_address (struct sockaddr_storage *addr); +GSocketAddress * gibber_normalize_socket_address (GSocketAddress *addr); gboolean gibber_strdiff (const gchar *left, const gchar *right); G_END_DECLS diff --git a/lib/gibber/gibber-xmpp-connection-listener.c b/lib/gibber/gibber-xmpp-connection-listener.c deleted file mode 100644 index 729efde1..00000000 --- a/lib/gibber/gibber-xmpp-connection-listener.c +++ /dev/null @@ -1,194 +0,0 @@ -/* - * gibber-xmpp-connection-listener.c - Source for GibberXmppConnectionListener - * Copyright (C) 2007 Ltd. - * - * 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 "gibber-xmpp-connection-listener.h" - -#include <stdlib.h> -#include <string.h> -#include <time.h> -#include <sys/types.h> -#include <unistd.h> -#include <errno.h> - -#include <glib.h> - -#include "gibber-sockets.h" -#include "gibber-xmpp-connection.h" -#include "gibber-linklocal-transport.h" -#include "gibber-util.h" -#include "gibber-listener.h" - -#define DEBUG_FLAG DEBUG_NET -#include "gibber-debug.h" - -#include "gibber-signals-marshal.h" - -G_DEFINE_TYPE (GibberXmppConnectionListener, gibber_xmpp_connection_listener, \ - G_TYPE_OBJECT); - -/* signals */ -enum -{ - NEW_CONNECTION, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = {0}; - -typedef struct _GibberXmppConnectionListenerPrivate \ - GibberXmppConnectionListenerPrivate; -struct _GibberXmppConnectionListenerPrivate -{ - GibberListener *listener; - - gboolean dispose_has_run; -}; - -#define GIBBER_XMPP_CONNECTION_LISTENER_GET_PRIVATE(obj) \ - ((GibberXmppConnectionListenerPrivate *) obj->priv) - -GQuark -gibber_xmpp_connection_listener_error_quark (void) -{ - static GQuark quark = 0; - - if (!quark) - quark = g_quark_from_static_string ( - "gibber_xmpp_connection_listener_error"); - - return quark; -} - -static void -gibber_xmpp_connection_listener_init (GibberXmppConnectionListener *self) -{ - GibberXmppConnectionListenerPrivate *priv = - G_TYPE_INSTANCE_GET_PRIVATE (self, GIBBER_TYPE_XMPP_CONNECTION_LISTENER, - GibberXmppConnectionListenerPrivate); - - self->priv = priv; - - priv->listener = NULL; - - priv->dispose_has_run = FALSE; -} - -static void -gibber_xmpp_connection_listener_dispose (GObject *object) -{ - GibberXmppConnectionListener *self = - GIBBER_XMPP_CONNECTION_LISTENER (object); - GibberXmppConnectionListenerPrivate *priv = - GIBBER_XMPP_CONNECTION_LISTENER_GET_PRIVATE (self); - - if (priv->listener != NULL) - { - g_object_unref (priv->listener); - priv->listener = NULL; - } - - G_OBJECT_CLASS (gibber_xmpp_connection_listener_parent_class)->dispose ( - object); -} - -static void -gibber_xmpp_connection_listener_class_init ( - GibberXmppConnectionListenerClass *gibber_xmpp_connection_listener_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS ( - gibber_xmpp_connection_listener_class); - - g_type_class_add_private (gibber_xmpp_connection_listener_class, - sizeof (GibberXmppConnectionListenerPrivate)); - - object_class->dispose = gibber_xmpp_connection_listener_dispose; - - signals[NEW_CONNECTION] = - g_signal_new ( - "new-connection", - G_OBJECT_CLASS_TYPE (gibber_xmpp_connection_listener_class), - G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, - 0, - NULL, NULL, - _gibber_signals_marshal_VOID__OBJECT_POINTER_UINT, - G_TYPE_NONE, 3, GIBBER_TYPE_XMPP_CONNECTION, G_TYPE_POINTER, - G_TYPE_UINT); -} - -GibberXmppConnectionListener * -gibber_xmpp_connection_listener_new (void) -{ - return g_object_new (GIBBER_TYPE_XMPP_CONNECTION_LISTENER, - NULL); -} - -static gboolean -new_connection_cb (GibberListener *listener, - GibberTransport *transport, - struct sockaddr *address, - socklen_t addrlen, - gpointer user_data) -{ - GibberXmppConnectionListener *self = - GIBBER_XMPP_CONNECTION_LISTENER (user_data); - GibberXmppConnection *connection; - connection = gibber_xmpp_connection_new (transport); - - g_signal_emit (self, signals[NEW_CONNECTION], 0, connection, - address, addrlen); - - g_object_unref (connection); - return TRUE; -} - -/** - * port: the port, or 0 to choose a random port - */ -gboolean -gibber_xmpp_connection_listener_listen (GibberXmppConnectionListener *self, - int port, - GError **error) -{ - GibberXmppConnectionListenerPrivate *priv = - GIBBER_XMPP_CONNECTION_LISTENER_GET_PRIVATE (self); - int ret; - - if (priv->listener == NULL) - { - priv->listener = gibber_listener_new (); - g_signal_connect (priv->listener, "new-connection", - G_CALLBACK (new_connection_cb), self); - } - - ret = gibber_listener_listen_tcp (priv->listener, port, error); - - return ret; -} - -int -gibber_xmpp_connection_listener_get_port ( - GibberXmppConnectionListener *self) -{ - GibberXmppConnectionListenerPrivate *priv = - GIBBER_XMPP_CONNECTION_LISTENER_GET_PRIVATE (self); - - g_return_val_if_fail (priv->listener != NULL, 0); - - return gibber_listener_get_port (priv->listener); -} diff --git a/lib/gibber/gibber-xmpp-connection-listener.h b/lib/gibber/gibber-xmpp-connection-listener.h deleted file mode 100644 index 1f542547..00000000 --- a/lib/gibber/gibber-xmpp-connection-listener.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * gibber-xmpp-connection-listener.h - Header for GibberXmppConnectionListener - * Copyright (C) 2007 Collabora Ltd. - * - * 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 - */ - -#ifndef __GIBBER_XMPP_CONNECTION_LISTENER_H__ -#define __GIBBER_XMPP_CONNECTION_LISTENER_H__ - -#include <glib-object.h> - -G_BEGIN_DECLS - -typedef struct _GibberXmppConnectionListener GibberXmppConnectionListener; -typedef struct _GibberXmppConnectionListenerClass - GibberXmppConnectionListenerClass; - -struct _GibberXmppConnectionListenerClass { - GObjectClass parent_class; -}; - -struct _GibberXmppConnectionListener { - GObject parent; - - gpointer priv; -}; - -GType gibber_xmpp_connection_listener_get_type (void); - -/* TYPE MACROS */ -#define GIBBER_TYPE_XMPP_CONNECTION_LISTENER \ - (gibber_xmpp_connection_listener_get_type ()) -#define GIBBER_XMPP_CONNECTION_LISTENER(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj), GIBBER_TYPE_XMPP_CONNECTION_LISTENER,\ - GibberXmppConnectionListener)) -#define GIBBER_XMPP_CONNECTION_LISTENER_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass), GIBBER_TYPE_XMPP_CONNECTION_LISTENER,\ - GibberXmppConnectionListenerClass)) -#define GIBBER_IS_XMPP_CONNECTION_LISTENER(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj), GIBBER_TYPE_XMPP_CONNECTION_LISTENER)) -#define GIBBER_IS_XMPP_CONNECTION_LISTENER_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE((klass), GIBBER_TYPE_XMPP_CONNECTION_LISTENER)) -#define GIBBER_XMPP_CONNECTION_LISTENER_GET_CLASS(obj) \ - (G_TYPE_INSTANCE_GET_CLASS ((obj), GIBBER_TYPE_XMPP_CONNECTION_LISTENER,\ - GibberXmppConnectionListenerClass)) - -GQuark gibber_xmpp_connection_listener_error_quark (void); - -GibberXmppConnectionListener * -gibber_xmpp_connection_listener_new (void); - -gboolean gibber_xmpp_connection_listener_listen ( - GibberXmppConnectionListener *listener, int port, GError **error); - -int gibber_xmpp_connection_listener_get_port ( - GibberXmppConnectionListener *listener); - - -G_END_DECLS - -#endif /* #ifndef __GIBBER_XMPP_CONNECTION_LISTENER_H__ */ diff --git a/lib/gibber/gibber-xmpp-connection.c b/lib/gibber/gibber-xmpp-connection.c deleted file mode 100644 index 50733f6b..00000000 --- a/lib/gibber/gibber-xmpp-connection.c +++ /dev/null @@ -1,391 +0,0 @@ -/* - * gibber-xmpp-connection.c - Source for GibberXmppConnection - * 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 <unistd.h> -#include <stdlib.h> -#include <string.h> - -#include "gibber-xmpp-connection.h" -#include "gibber-signals-marshal.h" - -#include "gibber-xmpp-reader.h" -#include "gibber-xmpp-writer.h" -#include "gibber-transport.h" -#include "gibber-xmpp-stanza.h" - -#define XMPP_STREAM_NAMESPACE "http://etherx.jabber.org/streams" - -static void _xmpp_connection_received_data (GibberTransport *transport, - GibberBuffer *buffer, gpointer user_data); - -G_DEFINE_TYPE(GibberXmppConnection, gibber_xmpp_connection, G_TYPE_OBJECT) - -/* signal enum */ -enum -{ - STREAM_OPENED, - STREAM_CLOSED, - PARSE_ERROR, - RECEIVED_STANZA, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = {0}; - -static void _reader_stream_opened_cb (GibberXmppReader *reader, - const gchar *to, const gchar *from, const gchar *version, - gpointer user_data); - -static void _reader_stream_closed_cb (GibberXmppReader *reader, - gpointer user_data); - -static void _reader_received_stanza_cb (GibberXmppReader *reader, - GibberXmppStanza *stanza, gpointer user_data); - -/* private structure */ -typedef struct _GibberXmppConnectionPrivate GibberXmppConnectionPrivate; - -struct _GibberXmppConnectionPrivate -{ - GibberXmppReader *reader; - GibberXmppWriter *writer; - gboolean dispose_has_run; - guint last_id; -}; - -#define GIBBER_XMPP_CONNECTION_GET_PRIVATE(o) \ - (G_TYPE_INSTANCE_GET_PRIVATE ((o), GIBBER_TYPE_XMPP_CONNECTION, \ - GibberXmppConnectionPrivate)) - -static GObject * -gibber_xmpp_connection_constructor (GType type, - guint n_props, GObjectConstructParam *props) -{ - GObject *obj; - GibberXmppConnectionPrivate *priv; - - obj = G_OBJECT_CLASS (gibber_xmpp_connection_parent_class)-> - constructor (type, n_props, props); - - priv = GIBBER_XMPP_CONNECTION_GET_PRIVATE (obj); - - priv->writer = gibber_xmpp_writer_new (); - priv->reader = gibber_xmpp_reader_new (); - - g_signal_connect (priv->reader, "stream-opened", - G_CALLBACK (_reader_stream_opened_cb), obj); - g_signal_connect (priv->reader, "stream-closed", - G_CALLBACK (_reader_stream_closed_cb), obj); - g_signal_connect (priv->reader, "received-stanza", - G_CALLBACK (_reader_received_stanza_cb), obj); - - return obj; -} - -static void -gibber_xmpp_connection_init (GibberXmppConnection *obj) -{ - GibberXmppConnectionPrivate *priv = GIBBER_XMPP_CONNECTION_GET_PRIVATE (obj); - obj->transport = NULL; - priv->last_id = 0; -} - -static void gibber_xmpp_connection_dispose (GObject *object); -static void gibber_xmpp_connection_finalize (GObject *object); - -static void -gibber_xmpp_connection_class_init ( - GibberXmppConnectionClass *gibber_xmpp_connection_class) -{ - GObjectClass *object_class = G_OBJECT_CLASS (gibber_xmpp_connection_class); - - g_type_class_add_private (gibber_xmpp_connection_class, - sizeof (GibberXmppConnectionPrivate)); - - object_class->dispose = gibber_xmpp_connection_dispose; - object_class->finalize = gibber_xmpp_connection_finalize; - - object_class->constructor = gibber_xmpp_connection_constructor; - - signals[STREAM_OPENED] = g_signal_new ("stream-opened", - G_OBJECT_CLASS_TYPE (gibber_xmpp_connection_class), - G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, - 0, - NULL, NULL, - _gibber_signals_marshal_VOID__STRING_STRING_STRING, - G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); - - signals[STREAM_CLOSED] = g_signal_new ("stream-closed", - G_OBJECT_CLASS_TYPE (gibber_xmpp_connection_class), - G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, - 0, - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - signals[RECEIVED_STANZA] = g_signal_new ("received-stanza", - G_OBJECT_CLASS_TYPE (gibber_xmpp_connection_class), - G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, - 0, - NULL, NULL, - g_cclosure_marshal_VOID__OBJECT, - G_TYPE_NONE, 1, GIBBER_TYPE_XMPP_STANZA); - - signals[PARSE_ERROR] = g_signal_new ("parse-error", - G_OBJECT_CLASS_TYPE(gibber_xmpp_connection_class), - G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, - 0, - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); -} - -void -gibber_xmpp_connection_dispose (GObject *object) -{ - GibberXmppConnection *self = GIBBER_XMPP_CONNECTION (object); - GibberXmppConnectionPrivate *priv = - GIBBER_XMPP_CONNECTION_GET_PRIVATE (self); - - if (priv->dispose_has_run) - return; - - priv->dispose_has_run = TRUE; - if (self->transport != NULL) - { - g_object_unref (self->transport); - self->transport = NULL; - } - - if (priv->reader != NULL) - { - g_object_unref (priv->reader); - priv->reader = NULL; - } - - if (priv->writer != NULL) - { - g_object_unref (priv->writer); - priv->writer = NULL; - } - - /* release any references held by the object here */ - - if (G_OBJECT_CLASS (gibber_xmpp_connection_parent_class)->dispose) - G_OBJECT_CLASS (gibber_xmpp_connection_parent_class)->dispose (object); -} - -void -gibber_xmpp_connection_finalize (GObject *object) -{ - G_OBJECT_CLASS (gibber_xmpp_connection_parent_class)->finalize (object); -} - - - -static GibberXmppConnection * -new_connection (GibberTransport *transport, gboolean stream) -{ - GibberXmppConnection * result; - - result = g_object_new (GIBBER_TYPE_XMPP_CONNECTION, NULL); - - if (transport != NULL) - { - gibber_xmpp_connection_engage (result, transport); - } - - return result; -} - -GibberXmppConnection * -gibber_xmpp_connection_new (GibberTransport *transport) -{ - return new_connection (transport, TRUE); -} - -GibberXmppConnection * -gibber_xmpp_connection_new_no_stream (GibberTransport *transport) -{ - return new_connection (transport, FALSE); -} - -void -gibber_xmpp_connection_open (GibberXmppConnection *connection, - const gchar *to, const gchar *from, const gchar *version) -{ - GibberXmppConnectionPrivate *priv = - GIBBER_XMPP_CONNECTION_GET_PRIVATE (connection); - const guint8 *data; - gsize length; - - g_assert ((connection->stream_flags & GIBBER_XMPP_CONNECTION_STREAM_SENT) - == 0); - - gibber_xmpp_writer_stream_open (priv->writer, to, from, version, &data, - &length); - connection->stream_flags |= GIBBER_XMPP_CONNECTION_STREAM_SENT; - gibber_transport_send (connection->transport, data, length, NULL); -} - -void -gibber_xmpp_connection_restart (GibberXmppConnection *connection) -{ - GibberXmppConnectionPrivate *priv = - GIBBER_XMPP_CONNECTION_GET_PRIVATE (connection); - - g_assert (connection->stream_flags - & GIBBER_XMPP_CONNECTION_STREAM_FULLY_OPEN); - gibber_xmpp_reader_reset (priv->reader); - connection->stream_flags = 0; -} - -void -gibber_xmpp_connection_close (GibberXmppConnection *connection) -{ - GibberXmppConnectionPrivate *priv = - GIBBER_XMPP_CONNECTION_GET_PRIVATE (connection); - const guint8 *data; - gsize length; - - connection->stream_flags |= GIBBER_XMPP_CONNECTION_CLOSE_SENT; - - gibber_xmpp_writer_stream_close (priv->writer, &data, &length); - gibber_transport_send (connection->transport, data, length, NULL); -} - -void -gibber_xmpp_connection_engage (GibberXmppConnection *connection, - GibberTransport *transport) -{ - g_assert (connection->transport == NULL); - - connection->transport = g_object_ref (transport); - gibber_transport_set_handler (transport, _xmpp_connection_received_data, - connection); -} - -void -gibber_xmpp_connection_disengage (GibberXmppConnection *connection) -{ - g_assert (connection->transport != NULL); - - gibber_transport_set_handler (connection->transport, NULL, NULL); - - g_object_unref (connection->transport); - connection->transport = NULL; -} - -gboolean -gibber_xmpp_connection_send (GibberXmppConnection *connection, - GibberXmppStanza *stanza, GError **error) -{ - GibberXmppConnectionPrivate *priv = - GIBBER_XMPP_CONNECTION_GET_PRIVATE (connection); - WockyNode *node = wocky_stanza_get_top_node (stanza); - const guint8 *data; - gsize length; - const gchar *id; - - id = wocky_node_get_attribute (node, "id"); - if (id == NULL) - { - gchar *tmp = gibber_xmpp_connection_new_id (connection); - wocky_node_set_attribute (node, "id", tmp); - g_free (tmp); - } - - if (!gibber_xmpp_writer_write_stanza (priv->writer, stanza, - &data, &length, error)) - { - return FALSE; - } - - return gibber_transport_send (connection->transport, data, length, error); -} - -static void -_xmpp_connection_received_data (GibberTransport *transport, - GibberBuffer *buffer, gpointer user_data) -{ - GibberXmppConnection *self = GIBBER_XMPP_CONNECTION (user_data); - GibberXmppConnectionPrivate *priv = - GIBBER_XMPP_CONNECTION_GET_PRIVATE (self); - gboolean ret; - GError *error = NULL; - - g_assert (buffer->length > 0); - - /* Ensure we're not disposed inside while running the reader is busy */ - g_object_ref (self); - ret = gibber_xmpp_reader_push (priv->reader, buffer->data, buffer->length, - &error); - - if (!ret) - { - g_signal_emit (self, signals[PARSE_ERROR], 0); - } - g_object_unref (self); -} - -static void -_reader_stream_opened_cb (GibberXmppReader *reader, const gchar *to, - const gchar *from, const gchar *version, gpointer user_data) -{ - GibberXmppConnection *self = GIBBER_XMPP_CONNECTION (user_data); - - self->stream_flags |= GIBBER_XMPP_CONNECTION_STREAM_RECEIVED; - - g_signal_emit (self, signals[STREAM_OPENED], 0, to, from, version); -} - -static void -_reader_stream_closed_cb (GibberXmppReader *reader, gpointer user_data) -{ - GibberXmppConnection *self = GIBBER_XMPP_CONNECTION (user_data); - - self->stream_flags |= GIBBER_XMPP_CONNECTION_CLOSE_RECEIVED; - - g_signal_emit (self, signals[STREAM_CLOSED], 0); -} - -static void -_reader_received_stanza_cb (GibberXmppReader *reader, GibberXmppStanza *stanza, - gpointer user_data) -{ - GibberXmppConnection *self = GIBBER_XMPP_CONNECTION (user_data); - g_signal_emit (self, signals[RECEIVED_STANZA], 0, stanza); -} - -gchar * -gibber_xmpp_connection_new_id (GibberXmppConnection *self) -{ - GibberXmppConnectionPrivate *priv = - GIBBER_XMPP_CONNECTION_GET_PRIVATE (self); - GTimeVal tv; - glong val; - - g_get_current_time (&tv); - val = (tv.tv_sec & tv.tv_usec) + priv->last_id++; - - return g_strdup_printf ("%ld%ld", val, tv.tv_usec); -} diff --git a/lib/gibber/gibber-xmpp-connection.h b/lib/gibber/gibber-xmpp-connection.h deleted file mode 100644 index 6239b19d..00000000 --- a/lib/gibber/gibber-xmpp-connection.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - * gibber-xmpp-connection.h - Header for GibberXmppConnection - * 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 - */ - -#ifndef __GIBBER_XMPP_CONNECTION_H__ -#define __GIBBER_XMPP_CONNECTION_H__ - -#include <glib-object.h> - -#include "gibber-transport.h" -#include "gibber-xmpp-stanza.h" - -G_BEGIN_DECLS - -typedef struct _GibberXmppConnection GibberXmppConnection; -typedef struct _GibberXmppConnectionClass GibberXmppConnectionClass; - -typedef enum -{ - GIBBER_XMPP_CONNECTION_STREAM_SENT = 1 << 0, - GIBBER_XMPP_CONNECTION_STREAM_RECEIVED = 1 << 1, - GIBBER_XMPP_CONNECTION_STREAM_FULLY_OPEN = - GIBBER_XMPP_CONNECTION_STREAM_SENT|GIBBER_XMPP_CONNECTION_STREAM_RECEIVED, - GIBBER_XMPP_CONNECTION_CLOSE_SENT = 1 << 2, - GIBBER_XMPP_CONNECTION_CLOSE_RECEIVED = 1 << 3, - GIBBER_XMPP_CONNECTION_CLOSE_FULLY_CLOSED = - GIBBER_XMPP_CONNECTION_STREAM_FULLY_OPEN| - GIBBER_XMPP_CONNECTION_CLOSE_SENT|GIBBER_XMPP_CONNECTION_CLOSE_RECEIVED, -} GibberXmppConnectionFlags; - -struct _GibberXmppConnectionClass { - GObjectClass parent_class; -}; - -struct _GibberXmppConnection { - GObject parent; - GibberTransport *transport; - guint8 stream_flags; -}; - -GType gibber_xmpp_connection_get_type (void); - -/* TYPE MACROS */ -#define GIBBER_TYPE_XMPP_CONNECTION \ - (gibber_xmpp_connection_get_type ()) -#define GIBBER_XMPP_CONNECTION(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj), GIBBER_TYPE_XMPP_CONNECTION, \ - GibberXmppConnection)) -#define GIBBER_XMPP_CONNECTION_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass), GIBBER_TYPE_XMPP_CONNECTION, \ - GibberXmppConnectionClass)) -#define GIBBER_IS_XMPP_CONNECTION(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj), GIBBER_TYPE_XMPP_CONNECTION)) -#define GIBBER_IS_XMPP_CONNECTION_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE((klass), GIBBER_TYPE_XMPP_CONNECTION)) -#define GIBBER_XMPP_CONNECTION_GET_CLASS(obj) \ - (G_TYPE_INSTANCE_GET_CLASS ((obj), GIBBER_TYPE_XMPP_CONNECTION, \ - GibberXmppConnectionClass)) - -GibberXmppConnection *gibber_xmpp_connection_new (GibberTransport *transport); - -void gibber_xmpp_connection_open (GibberXmppConnection *connection, - const gchar *to, const gchar *from, const gchar *version); - -/* Prepare the connection for a reopen from the other side, for example after - * successfull SASL authentication */ -void gibber_xmpp_connection_restart (GibberXmppConnection *connection); - -void gibber_xmpp_connection_close (GibberXmppConnection *connection); - -void gibber_xmpp_connection_engage (GibberXmppConnection *connection, - GibberTransport *transport); - -void gibber_xmpp_connection_disengage (GibberXmppConnection *connection); - -gboolean gibber_xmpp_connection_send (GibberXmppConnection *connection, - GibberXmppStanza *stanza, GError **error); - -gchar * gibber_xmpp_connection_new_id (GibberXmppConnection *connection); - -GibberXmppConnection * gibber_xmpp_connection_new_no_stream ( - GibberTransport *transport); - -G_END_DECLS - -#endif /* #ifndef __GIBBER_XMPP_CONNECTION_H__*/ diff --git a/lib/gibber/gibber-xmpp-error.c b/lib/gibber/gibber-xmpp-error.c index a42df987..1d03238d 100644 --- a/lib/gibber/gibber-xmpp-error.c +++ b/lib/gibber/gibber-xmpp-error.c @@ -317,7 +317,7 @@ gibber_xmpp_error_quark (void) } GibberXmppError -gibber_xmpp_error_from_node (GibberXmppNode *error_node) +gibber_xmpp_error_from_node (WockyNode *error_node) { gint i, j; const gchar *error_code_str; @@ -331,7 +331,7 @@ gibber_xmpp_error_from_node (GibberXmppNode *error_node) * numbers; the >= 0 test is OK because i is signed */ for (i = NUM_XMPP_ERRORS - 1; i >= 0; i--) { - if (gibber_xmpp_node_get_child_ns (error_node, xmpp_errors[i].name, + if (wocky_node_get_child_ns (error_node, xmpp_errors[i].name, xmpp_errors[i].namespace)) { return i; @@ -340,7 +340,7 @@ gibber_xmpp_error_from_node (GibberXmppNode *error_node) } /* Ok, do it the legacy way */ - error_code_str = gibber_xmpp_node_get_attribute (error_node, "code"); + error_code_str = wocky_node_get_attribute (error_node, "code"); if (error_code_str) { gint error_code; @@ -382,13 +382,13 @@ gibber_xmpp_error_to_g_error (GibberXmppError error) /* * See RFC 3920: 4.7 Stream Errors, 9.3 Stanza Errors. */ -GibberXmppNode * +WockyNode * gibber_xmpp_error_to_node (GibberXmppError error, - GibberXmppNode *parent_node, + WockyNode *parent_node, const gchar *errmsg) { const XmppErrorSpec *spec, *extra; - GibberXmppNode *error_node, *node; + WockyNode *error_node, *node; gchar str[6]; g_return_val_if_fail (error != XMPP_ERROR_UNDEFINED_CONDITION && @@ -405,29 +405,29 @@ gibber_xmpp_error_to_node (GibberXmppError error, spec = &xmpp_errors[error]; } - error_node = gibber_xmpp_node_add_child (parent_node, "error"); + error_node = wocky_node_add_child (parent_node, "error"); sprintf (str, "%d", spec->legacy_errors[0]); - gibber_xmpp_node_set_attribute (error_node, "code", str); + wocky_node_set_attribute (error_node, "code", str); if (spec->type) { - gibber_xmpp_node_set_attribute (error_node, "type", spec->type); + wocky_node_set_attribute (error_node, "type", spec->type); } - node = gibber_xmpp_node_add_child_ns (error_node, spec->name, + node = wocky_node_add_child_ns (error_node, spec->name, GIBBER_XMPP_NS_STANZAS); if (extra != NULL) { - node = gibber_xmpp_node_add_child_ns (error_node, extra->name, + node = wocky_node_add_child_ns (error_node, extra->name, extra->namespace); } if (NULL != errmsg) { - node = gibber_xmpp_node_add_child (error_node, "text"); - gibber_xmpp_node_set_content (node, errmsg); + node = wocky_node_add_child (error_node, "text"); + wocky_node_set_content (node, errmsg); } return error_node; @@ -452,16 +452,16 @@ gibber_xmpp_error_description (GibberXmppError error) } GError * -gibber_message_get_xmpp_error (GibberXmppStanza *msg) +gibber_message_get_xmpp_error (WockyStanza *msg) { - GibberStanzaSubType sub_type; + WockyStanzaSubType sub_type; g_return_val_if_fail (msg != NULL, NULL); - gibber_xmpp_stanza_get_type_info (msg, NULL, &sub_type); + wocky_stanza_get_type_info (msg, NULL, &sub_type); - if (sub_type == GIBBER_STANZA_SUB_TYPE_ERROR) + if (sub_type == WOCKY_STANZA_SUB_TYPE_ERROR) { - GibberXmppNode *error_node = gibber_xmpp_node_get_child ( + WockyNode *error_node = wocky_node_get_child ( wocky_stanza_get_top_node (msg), "error"); if (error_node != NULL) diff --git a/lib/gibber/gibber-xmpp-error.h b/lib/gibber/gibber-xmpp-error.h index 605300e3..8e7a540a 100644 --- a/lib/gibber/gibber-xmpp-error.h +++ b/lib/gibber/gibber-xmpp-error.h @@ -22,7 +22,7 @@ #define __GIBBER_XMPP_ERROR_H__ #include <glib.h> -#include "gibber-xmpp-stanza.h" +#include <wocky/wocky-stanza.h> typedef enum { XMPP_ERROR_UNDEFINED_CONDITION = 0, /* 500 */ @@ -76,11 +76,11 @@ typedef enum { GQuark gibber_xmpp_error_quark (void); #define GIBBER_XMPP_ERROR (gibber_xmpp_error_quark ()) -GibberXmppError gibber_xmpp_error_from_node (GibberXmppNode *error_node); -GibberXmppNode *gibber_xmpp_error_to_node (GibberXmppError error, - GibberXmppNode *parent_node, const gchar *errmsg); +GibberXmppError gibber_xmpp_error_from_node (WockyNode *error_node); +WockyNode *gibber_xmpp_error_to_node (GibberXmppError error, + WockyNode *parent_node, const gchar *errmsg); const gchar *gibber_xmpp_error_string (GibberXmppError error); const gchar *gibber_xmpp_error_description (GibberXmppError error); -GError *gibber_message_get_xmpp_error (GibberXmppStanza *msg); +GError *gibber_message_get_xmpp_error (WockyStanza *msg); #endif /* __GIBBER_XMPP_ERROR_H__ */ diff --git a/lib/gibber/gibber-xmpp-node.c b/lib/gibber/gibber-xmpp-node.c deleted file mode 100644 index 852e8a30..00000000 --- a/lib/gibber/gibber-xmpp-node.c +++ /dev/null @@ -1,24 +0,0 @@ -/* - * gibber-xmpp-node.c - Code for Gibber xmpp nodes - * 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 <glib.h> -#include <string.h> - -#include "gibber-xmpp-node.h" diff --git a/lib/gibber/gibber-xmpp-node.h b/lib/gibber/gibber-xmpp-node.h deleted file mode 100644 index 7d2a9f91..00000000 --- a/lib/gibber/gibber-xmpp-node.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * gibber-xmpp-node.h - Header for Gibber xmpp nodes - * 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 - */ - -#ifndef __GIBBER_XMPP_NODE_H__ -#define __GIBBER_XMPP_NODE_H__ - -#include <glib.h> -#include <wocky/wocky-node.h> - -G_BEGIN_DECLS - -typedef WockyNode GibberXmppNode; - -#define gibber_xmpp_node_each_child wocky_node_each_child -#define gibber_xmpp_node_get_attribute wocky_node_get_attribute -#define gibber_xmpp_node_get_attribute_ns wocky_node_get_attribute_ns -#define gibber_xmpp_node_set_attribute wocky_node_set_attribute -#define gibber_xmpp_node_set_attribute_ns wocky_node_set_attribute_ns -#define gibber_xmpp_node_set_attribute_n wocky_node_set_attribute_n -#define gibber_xmpp_node_set_attribute_n_ns wocky_node_set_attribute_n_ns -#define gibber_xmpp_node_get_child wocky_node_get_child -#define gibber_xmpp_node_get_child_ns wocky_node_get_child_ns -#define gibber_xmpp_node_add_child wocky_node_add_child -#define gibber_xmpp_node_add_child_ns wocky_node_add_child_ns -#define gibber_xmpp_node_add_child_with_content wocky_node_add_child_with_content -#define gibber_xmpp_node_add_child_with_content_ns wocky_node_add_child_with_content_ns - -#define gibber_xmpp_node_get_ns wocky_node_get_ns -#define gibber_xmpp_node_get_language wocky_node_get_language -#define gibber_xmpp_node_set_language wocky_node_set_language -#define gibber_xmpp_node_set_language_n wocky_node_set_language_n -#define gibber_xmpp_node_set_content wocky_node_set_content -#define gibber_xmpp_node_append_content wocky_node_append_content -#define gibber_xmpp_node_append_content_n wocky_node_append_content_n -#define gibber_xmpp_node_to_string wocky_node_to_string - -#define gibber_xmpp_node_new_ns wocky_node_new -#define gibber_xmpp_node_free wocky_node_free - -G_END_DECLS - -#endif /* #ifndef __GIBBER_XMPP_NODE_H__*/ diff --git a/lib/gibber/gibber-xmpp-reader.c b/lib/gibber/gibber-xmpp-reader.c index a21dd017..7b265136 100644 --- a/lib/gibber/gibber-xmpp-reader.c +++ b/lib/gibber/gibber-xmpp-reader.c @@ -22,7 +22,7 @@ #include "gibber-signals-marshal.h" -#include "gibber-xmpp-stanza.h" +#include <wocky/wocky-stanza.h> #define XMPP_STREAM_NAMESPACE "http://etherx.jabber.org/streams" @@ -75,7 +75,7 @@ gibber_xmpp_reader_class_init (GibberXmppReaderClass *gibber_xmpp_reader_class) 0, NULL, NULL, g_cclosure_marshal_VOID__OBJECT, - G_TYPE_NONE, 1, GIBBER_TYPE_XMPP_STANZA); + G_TYPE_NONE, 1, WOCKY_TYPE_STANZA); signals[STREAM_OPENED] = g_signal_new ("stream-opened", G_OBJECT_CLASS_TYPE(gibber_xmpp_reader_class), diff --git a/lib/gibber/gibber-xmpp-stanza.c b/lib/gibber/gibber-xmpp-stanza.c deleted file mode 100644 index 0cbf02aa..00000000 --- a/lib/gibber/gibber-xmpp-stanza.c +++ /dev/null @@ -1,26 +0,0 @@ -/* - * gibber-xmpp-stanza.c - Source for GibberXmppStanza - * 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 "gibber-xmpp-stanza.h" diff --git a/lib/gibber/gibber-xmpp-stanza.h b/lib/gibber/gibber-xmpp-stanza.h deleted file mode 100644 index 65cb9cd6..00000000 --- a/lib/gibber/gibber-xmpp-stanza.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * gibber-xmpp-stanza.h - Header for GibberXmppStanza - * 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 - */ - -#ifndef __GIBBER_XMPP_STANZA_H__ -#define __GIBBER_XMPP_STANZA_H__ - -#include <glib-object.h> -#include "gibber-xmpp-node.h" -#include <wocky/wocky-stanza.h> - -G_BEGIN_DECLS - -typedef WockyStanza GibberXmppStanza; -typedef WockyStanzaClass GibberXmppStanzaClass; - -#define GIBBER_TYPE_XMPP_STANZA WOCKY_TYPE_STANZA -#define GIBBER_XMPP_STANZA(obj) (WOCKY_STANZA (obj)) -#define GIBBER_XMPP_STANZA_CLASS(klass) (WOCKY_STANZA_CLASS (klass)) -#define GIBBER_IS_XMPP_STANZA(obj) (WOCKY_IS_STANZA (obj)) -#define GIBBER_IS_XMPP_STANZA_CLASS(klass) (WOCKY_IS_STANZA_CLASS (klass)) -#define GIBBER_XMPP_STANZA_GET_CLASS(obj) (WOCKY_STANZA_GET_CLASS (obj)) - -#define GIBBER_STANZA_TYPE_NONE WOCKY_STANZA_TYPE_NONE -#define GIBBER_STANZA_TYPE_MESSAGE WOCKY_STANZA_TYPE_MESSAGE -#define GIBBER_STANZA_TYPE_PRESENCE WOCKY_STANZA_TYPE_PRESENCE -#define GIBBER_STANZA_TYPE_IQ WOCKY_STANZA_TYPE_IQ -#define GIBBER_STANZA_TYPE_STREAM WOCKY_STANZA_TYPE_STREAM -#define GIBBER_STANZA_TYPE_STREAM_FEATURES WOCKY_STANZA_TYPE_STREAM_FEATURES -#define GIBBER_STANZA_TYPE_AUTH WOCKY_STANZA_TYPE_AUTH -#define GIBBER_STANZA_TYPE_CHALLENGE WOCKY_STANZA_TYPE_CHALLENGE -#define GIBBER_STANZA_TYPE_RESPONSE WOCKY_STANZA_TYPE_RESPONSE -#define GIBBER_STANZA_TYPE_SUCCESS WOCKY_STANZA_TYPE_SUCCESS -#define GIBBER_STANZA_TYPE_FAILURE WOCKY_STANZA_TYPE_FAILURE -#define GIBBER_STANZA_TYPE_STREAM_ERROR WOCKY_STANZA_TYPE_STREAM_ERROR -#define GIBBER_STANZA_TYPE_UNKNOWN WOCKY_STANZA_TYPE_UNKNOWN -#define NUM_GIBBER_STANZA_TYPE NUM_WOCKY_STANZA_TYPE -typedef WockyStanzaType GibberStanzaType; - -#define GIBBER_STANZA_SUB_TYPE_NONE WOCKY_STANZA_SUB_TYPE_NONE -#define GIBBER_STANZA_SUB_TYPE_AVAILABLE WOCKY_STANZA_SUB_TYPE_AVAILABLE -#define GIBBER_STANZA_SUB_TYPE_NORMAL WOCKY_STANZA_SUB_TYPE_NORMAL -#define GIBBER_STANZA_SUB_TYPE_CHAT WOCKY_STANZA_SUB_TYPE_CHAT -#define GIBBER_STANZA_SUB_TYPE_GROUPCHAT WOCKY_STANZA_SUB_TYPE_GROUPCHAT -#define GIBBER_STANZA_SUB_TYPE_HEADLINE WOCKY_STANZA_SUB_TYPE_HEADLINE -#define GIBBER_STANZA_SUB_TYPE_UNAVAILABLE WOCKY_STANZA_SUB_TYPE_UNAVAILABLE -#define GIBBER_STANZA_SUB_TYPE_PROBE WOCKY_STANZA_SUB_TYPE_PROBE -#define GIBBER_STANZA_SUB_TYPE_SUBSCRIBE WOCKY_STANZA_SUB_TYPE_SUBSCRIBE -#define GIBBER_STANZA_SUB_TYPE_UNSUBSCRIBE WOCKY_STANZA_SUB_TYPE_UNSUBSCRIBE -#define GIBBER_STANZA_SUB_TYPE_SUBSCRIBED WOCKY_STANZA_SUB_TYPE_SUBSCRIBED -#define GIBBER_STANZA_SUB_TYPE_UNSUBSCRIBED WOCKY_STANZA_SUB_TYPE_UNSUBSCRIBED -#define GIBBER_STANZA_SUB_TYPE_GET WOCKY_STANZA_SUB_TYPE_GET -#define GIBBER_STANZA_SUB_TYPE_SET WOCKY_STANZA_SUB_TYPE_SET -#define GIBBER_STANZA_SUB_TYPE_RESULT WOCKY_STANZA_SUB_TYPE_RESULT -#define GIBBER_STANZA_SUB_TYPE_ERROR WOCKY_STANZA_SUB_TYPE_ERROR -#define GIBBER_STANZA_SUB_TYPE_UNKNOWN WOCKY_STANZA_SUB_TYPE_UNKNOWN -#define NUM_GIBBER_STANZA_SUB_TYPE NUM_WOCKY_STANZA_SUB_TYPE -typedef WockyStanzaSubType GibberStanzaSubType; - -#define GIBBER_NODE WOCKY_NODE_START -#define GIBBER_NODE_TEXT WOCKY_NODE_TEXT -#define GIBBER_NODE_END WOCKY_NODE_END -#define GIBBER_NODE_ATTRIBUTE WOCKY_NODE_ATTRIBUTE -#define GIBBER_NODE_XMLNS WOCKY_NODE_XMLNS -#define GIBBER_NODE_ASSIGN_TO WOCKY_NODE_ASSIGN_TO -#define GIBBER_STANZA_END NULL - -#define gibber_xmpp_stanza_new_ns wocky_stanza_new -#define gibber_xmpp_stanza_build wocky_stanza_build -#define gibber_xmpp_stanza_get_type_info wocky_stanza_get_type_info - -G_END_DECLS - -#endif /* #ifndef __GIBBER_XMPP_STANZA_H__*/ diff --git a/lib/gibber/gibber-xmpp-writer.h b/lib/gibber/gibber-xmpp-writer.h index ac6d529b..5a0247b4 100644 --- a/lib/gibber/gibber-xmpp-writer.h +++ b/lib/gibber/gibber-xmpp-writer.h @@ -55,7 +55,7 @@ gibber_xmpp_writer_stream_open (GibberXmppWriter *writer, static inline gboolean gibber_xmpp_writer_write_stanza (GibberXmppWriter *writer, - GibberXmppStanza *stanza, const guint8 **data, gsize *length, + WockyStanza *stanza, const guint8 **data, gsize *length, GError **error) { /* can't fail */ diff --git a/lib/gibber/tests/Makefile.am b/lib/gibber/tests/Makefile.am index 97d7a3e3..03e3f6eb 100644 --- a/lib/gibber/tests/Makefile.am +++ b/lib/gibber/tests/Makefile.am @@ -4,34 +4,46 @@ include $(top_srcdir)/rules/check.mak SUPPRESSIONS=valgrind.supp dlopen.supp +AM_CFLAGS = $(ERROR_CFLAGS) @GLIB_CFLAGS@ @LIBXML2_CFLAGS@ @WOCKY_CFLAGS@ \ + @DBUS_CFLAGS@ \ + -I $(top_srcdir) -I $(top_builddir) \ + -I $(top_srcdir)/lib -I $(top_builddir)/lib + +AM_LDFLAGS = @GLIB_LIBS@ \ + $(top_builddir)/lib/gibber/libgibber.la + +clean-local: + -rm -rf outputs + +SUBDIRS = inputs + +EXTRA_DIST = \ + test-transport.h \ + test-transport.c + +$(check_SCRIPTS): always-run + chmod +x $(srcdir)/$@ + +.PHONY: always-run + +# ------------------------------------------------------------------------------ +# Test programs + # Teach it how to make libgibber.la $(top_builddir)/lib/gibber/libgibber.la: ${MAKE} -C $(top_builddir)/lib/gibber libgibber.la .PHONY: $(top_builddir)/lib/gibber/libgibber.la -TESTS = \ - run-xmpp-connection-test.sh +TESTS = -check_PROGRAMS = \ - test-xmpp-connection \ +noinst_PROGRAMS = \ test-r-multicast-transport-io -check_SCRIPTS = run-xmpp-connection-test.sh - -EXTRA_DIST = simplemeshtest.py mesh.py $(check_SCRIPTS) +check_SCRIPTS = -test_xmpp_connection_SOURCES = \ - test-xmpp-connection.c \ - test-transport.c \ - test-transport.h - -test_xmpp_connection_LDADD = \ - $(top_builddir)/lib/gibber/libgibber.la \ - $(AM_LDFLAGS) - -test_xmpp_connection_CFLAGS = \ - $(AM_CFLAGS) +EXTRA_DIST += \ + simplemeshtest.py mesh.py $(check_SCRIPTS) test_r_multicast_transport_io_SOURCES = \ test-r-multicast-transport-io.c \ @@ -45,66 +57,28 @@ test_r_multicast_transport_io_LDADD = \ test_r_multicast_transport_io_CFLAGS = \ $(AM_CFLAGS) +# ------------------------------------------------------------------------------ +# Checks -if HAVE_CHECK -check_PROGRAMS += check-main -TESTS += check-main -check_main_SOURCES = \ - check-main.c \ - check-helpers.c \ - check-helpers.h \ - check-gibber.h \ - check-gibber-xmpp-node.c \ - check-gibber-xmpp-reader.c \ - check-gibber-r-multicast-causal-transport.c \ - test-transport.c \ - test-transport.h \ - check-gibber-xmpp-connection.c \ - check-gibber-r-multicast-packet.c \ - check-gibber-r-multicast-sender.c \ - check-gibber-xmpp-stanza.c \ - check-gibber-iq-helper.c \ - check-gibber-listener.c \ - check-gibber-xmpp-connection-listener.c \ - check-gibber-xmpp-error.c \ - check-gibber-unix-transport.c - -check_main_LDADD = \ - @CHECK_LIBS@ \ - $(top_builddir)/lib/gibber/libgibber.la \ - $(AM_LDFLAGS) - -check_main_CFLAGS = \ - @CHECK_CFLAGS@ \ - $(AM_CFLAGS) +check_PROGRAMS = \ + check-gibber-xmpp-reader \ + check-gibber-r-multicast-causal-transport \ + check-gibber-r-multicast-packet \ + check-gibber-r-multicast-sender \ + check-gibber-listener \ + check-gibber-xmpp-error \ + check-gibber-unix-transport -endif +test: ${TEST_PROGS} + gtester -k --verbose $(check_PROGRAMS) -AM_CFLAGS = $(ERROR_CFLAGS) @GLIB_CFLAGS@ @LIBXML2_CFLAGS@ @WOCKY_CFLAGS@ \ - @DBUS_CFLAGS@ \ - -I $(top_srcdir) -I $(top_builddir) \ - -I $(top_srcdir)/lib -I $(top_builddir)/lib - -AM_LDFLAGS = @GLIB_LIBS@ +# ------------------------------------------------------------------------------ +# Code Style # Coding style checks check_c_sources = \ - $(test_xmpp_connection_SOURCES) \ $(test_r_multicast_transport_io_SOURCES) -if HAVE_CHECK - check_c_sources += $(check_main_SOURCES) -endif - include $(top_srcdir)/tools/check-coding-style.mk -check-local: check-coding-style - -clean-local: - -rm -rf outputs -SUBDIRS = inputs - -$(check_SCRIPTS): always-run - chmod +x $(srcdir)/$@ - -.PHONY: always-run +check-local: check-coding-style test diff --git a/lib/gibber/tests/check-gibber-iq-helper.c b/lib/gibber/tests/check-gibber-iq-helper.c deleted file mode 100644 index 345f1d28..00000000 --- a/lib/gibber/tests/check-gibber-iq-helper.c +++ /dev/null @@ -1,437 +0,0 @@ -/* - * check-gibber-iq-helper.c - Test for GibberIqHelper - * Copyright (C) 2007 Collabora Ltd. - * @author Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - * - * 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 <dbus/dbus-glib.h> - -#include <gibber/gibber-xmpp-stanza.h> -#include <gibber/gibber-iq-helper.h> -#include <gibber/gibber-xmpp-error.h> -#include <gibber/gibber-namespaces.h> - -#include <check.h> -#include "check-helpers.h" -#include "check-gibber.h" - -#include "test-transport.h" - -gboolean received_reply = FALSE; - -static gboolean -send_hook (GibberTransport *transport, - const guint8 *data, - gsize length, - GError **error, - gpointer user_data) -{ - test_transport_write (TEST_TRANSPORT (transport), data, length); - return TRUE; -} - -static GibberXmppConnection * -create_xmpp_connection (void) -{ - GibberXmppConnection *xmpp_connection; - TestTransport *transport; - - transport = test_transport_new (send_hook, NULL); - xmpp_connection = gibber_xmpp_connection_new (GIBBER_TRANSPORT (transport)); - gibber_xmpp_connection_open (xmpp_connection, "to", "from", "1.0"); - - g_object_unref (transport); - - return xmpp_connection; -} - -START_TEST (test_iq_helper_new) -{ - GibberXmppConnection *xmpp_connection = create_xmpp_connection (); - GibberIqHelper *iq_helper = gibber_iq_helper_new (xmpp_connection); - fail_unless (iq_helper != NULL); - g_object_unref (xmpp_connection); - g_object_unref (iq_helper); -} -END_TEST - -static void -reply_func (GibberIqHelper *helper, - GibberXmppStanza *sent_stanza, - GibberXmppStanza *reply_stanza, - GObject *object, - gpointer user_data) -{ - received_reply = TRUE; -} - -static void -send_stanza_and_reply (GibberXmppConnection *xmpp_connection, - GibberIqHelper *iq_helper, - GibberXmppStanza *stanza, - GibberXmppStanza *reply) -{ - gboolean result; - - if (stanza != NULL) - { - result = gibber_iq_helper_send_with_reply (iq_helper, stanza, reply_func, - NULL, NULL, NULL); - fail_unless (result); - } - - if (reply != NULL) - { - result = gibber_xmpp_connection_send (xmpp_connection, reply, NULL); - fail_unless (result); - } - - while (g_main_context_iteration (NULL, FALSE)) - ; - -} - -START_TEST (test_send_with_reply) -{ - GibberXmppConnection *xmpp_connection = create_xmpp_connection (); - GibberIqHelper *iq_helper = gibber_iq_helper_new (xmpp_connection); - GibberXmppStanza *stanza, *reply; - - received_reply = FALSE; - - stanza = gibber_xmpp_stanza_build (GIBBER_STANZA_TYPE_IQ, - GIBBER_STANZA_SUB_TYPE_SET, - "from", "to", - GIBBER_NODE_ATTRIBUTE, "id", "69", - GIBBER_STANZA_END); - - /* Reply of the stanza */ - reply = gibber_xmpp_stanza_build (GIBBER_STANZA_TYPE_IQ, - GIBBER_STANZA_SUB_TYPE_RESULT, - "to", "from", - GIBBER_NODE_ATTRIBUTE, "id", "69", - GIBBER_STANZA_END); - - send_stanza_and_reply (xmpp_connection, iq_helper, stanza, reply); - fail_unless (received_reply); - - g_object_unref (stanza); - g_object_unref (reply); - g_object_unref (xmpp_connection); - g_object_unref (iq_helper); -} -END_TEST - -START_TEST (test_send_without_reply) -{ - GibberXmppConnection *xmpp_connection = create_xmpp_connection (); - GibberIqHelper *iq_helper = gibber_iq_helper_new (xmpp_connection); - GibberXmppStanza *stanza; - - received_reply = FALSE; - - stanza = gibber_xmpp_stanza_build (GIBBER_STANZA_TYPE_IQ, - GIBBER_STANZA_SUB_TYPE_SET, - "from", "to", - GIBBER_NODE_ATTRIBUTE, "id", "69", - GIBBER_STANZA_END); - - send_stanza_and_reply (xmpp_connection, iq_helper, stanza, NULL); - fail_unless (!received_reply); - - g_object_unref (stanza); - g_object_unref (xmpp_connection); - g_object_unref (iq_helper); -} -END_TEST - -START_TEST (test_send_with_bad_reply_type) -{ - GibberXmppConnection *xmpp_connection = create_xmpp_connection (); - GibberIqHelper *iq_helper = gibber_iq_helper_new (xmpp_connection); - GibberXmppStanza *stanza, *reply; - - received_reply = FALSE; - - stanza = gibber_xmpp_stanza_build (GIBBER_STANZA_TYPE_IQ, - GIBBER_STANZA_SUB_TYPE_SET, - "from", "to", - GIBBER_NODE_ATTRIBUTE, "id", "69", - GIBBER_STANZA_END); - - /* Reply can't be of sub type "get" */ - reply = gibber_xmpp_stanza_build (GIBBER_STANZA_TYPE_IQ, - GIBBER_STANZA_SUB_TYPE_GET, - "to", "from", - GIBBER_NODE_ATTRIBUTE, "id", "69", - GIBBER_STANZA_END); - - send_stanza_and_reply (xmpp_connection, iq_helper, stanza, reply); - fail_unless (!received_reply); - - g_object_unref (stanza); - g_object_unref (reply); - g_object_unref (xmpp_connection); - g_object_unref (iq_helper); -} -END_TEST - -START_TEST (test_send_without_id) -{ - GibberXmppConnection *xmpp_connection = create_xmpp_connection (); - GibberIqHelper *iq_helper = gibber_iq_helper_new (xmpp_connection); - GibberXmppStanza *stanza, *reply; - gboolean result; - const gchar *id; - - received_reply = FALSE; - - stanza = gibber_xmpp_stanza_build (GIBBER_STANZA_TYPE_IQ, - GIBBER_STANZA_SUB_TYPE_SET, - "from", "to", - GIBBER_STANZA_END); - - result = gibber_iq_helper_send_with_reply (iq_helper, stanza, reply_func, - NULL, NULL, NULL); - fail_unless (result); - - /* gibber_iq_helper_send_with_reply generated an id */ - id = gibber_xmpp_node_get_attribute (wocky_stanza_get_top_node (stanza), - "id"); - - reply = gibber_xmpp_stanza_build (GIBBER_STANZA_TYPE_IQ, - GIBBER_STANZA_SUB_TYPE_RESULT, - "to", "from", - GIBBER_NODE_ATTRIBUTE, "id", id, - GIBBER_STANZA_END); - - result = gibber_xmpp_connection_send (xmpp_connection, reply, NULL); - fail_unless (result); - - while (g_main_context_iteration (NULL, FALSE)) - ; - - fail_unless (received_reply); - - g_object_unref (stanza); - g_object_unref (reply); - g_object_unref (xmpp_connection); - g_object_unref (iq_helper); -} -END_TEST - -START_TEST (test_new_result_reply) -{ - GibberXmppConnection *xmpp_connection = create_xmpp_connection (); - GibberIqHelper *iq_helper = gibber_iq_helper_new (xmpp_connection); - GibberXmppStanza *stanza, *reply; - gboolean result; - - received_reply = FALSE; - - stanza = gibber_xmpp_stanza_build (GIBBER_STANZA_TYPE_IQ, - GIBBER_STANZA_SUB_TYPE_SET, - "from", "to", - GIBBER_STANZA_END); - - result = gibber_iq_helper_send_with_reply (iq_helper, stanza, reply_func, - NULL, NULL, NULL); - fail_unless (result); - - reply = gibber_iq_helper_new_result_reply (stanza); - fail_unless (reply != NULL); - fail_unless (strcmp (wocky_stanza_get_top_node (reply)->name, "iq") == 0); - fail_unless (strcmp ( - gibber_xmpp_node_get_attribute (wocky_stanza_get_top_node (reply), - "type"), - "result") == 0); - result = gibber_xmpp_connection_send (xmpp_connection, reply, NULL); - fail_unless (result); - - while (g_main_context_iteration (NULL, FALSE)) - ; - - fail_unless (received_reply); - - g_object_unref (stanza); - g_object_unref (reply); - g_object_unref (xmpp_connection); - g_object_unref (iq_helper); -} -END_TEST - -START_TEST (test_new_error_reply) -{ - GibberXmppConnection *xmpp_connection = create_xmpp_connection (); - GibberIqHelper *iq_helper = gibber_iq_helper_new (xmpp_connection); - GibberXmppStanza *stanza, *reply; - GibberXmppNode *error_node, *node; - gboolean result; - - received_reply = FALSE; - - stanza = gibber_xmpp_stanza_build (GIBBER_STANZA_TYPE_IQ, - GIBBER_STANZA_SUB_TYPE_SET, - "from", "to", - GIBBER_STANZA_END); - - result = gibber_iq_helper_send_with_reply (iq_helper, stanza, reply_func, - NULL, NULL, NULL); - fail_unless (result); - - reply = gibber_iq_helper_new_error_reply (stanza, - XMPP_ERROR_BAD_REQUEST, "test"); - fail_unless (reply != NULL); - fail_unless (strcmp (wocky_stanza_get_top_node (reply)->name, "iq") == 0); - fail_unless (strcmp (gibber_xmpp_node_get_attribute ( - wocky_stanza_get_top_node (reply), "type"), - "error") == 0); - - error_node = gibber_xmpp_node_get_child (wocky_stanza_get_top_node (reply), - "error"); - fail_if (error_node == NULL); - fail_if (strcmp (gibber_xmpp_node_get_attribute (error_node, "code"), - "400") != 0); - fail_if (strcmp (gibber_xmpp_node_get_attribute (error_node, "type"), - "modify") != 0); - - node = gibber_xmpp_node_get_child_ns (error_node, "bad-request", - GIBBER_XMPP_NS_STANZAS); - fail_if (node == NULL); - - node = gibber_xmpp_node_get_child (error_node, "text"); - fail_if (node == NULL); - fail_if (strcmp (node->content, "test") != 0); - - result = gibber_xmpp_connection_send (xmpp_connection, reply, NULL); - fail_unless (result); - - while (g_main_context_iteration (NULL, FALSE)) - ; - - fail_unless (received_reply); - - g_object_unref (stanza); - g_object_unref (reply); - g_object_unref (xmpp_connection); - g_object_unref (iq_helper); -} -END_TEST - -START_TEST (test_send_with_object_living) -{ - GibberXmppConnection *xmpp_connection = create_xmpp_connection (); - GibberIqHelper *iq_helper = gibber_iq_helper_new (xmpp_connection); - GibberXmppStanza *stanza, *reply; - gboolean result; - GObject *object; - - received_reply = FALSE; - - /* We don't care about the TestTransport, we just need a GObject */ - object = g_object_new (TEST_TYPE_TRANSPORT, NULL); - - stanza = gibber_xmpp_stanza_build (GIBBER_STANZA_TYPE_IQ, - GIBBER_STANZA_SUB_TYPE_SET, - "from", "to", - GIBBER_STANZA_END); - - result = gibber_iq_helper_send_with_reply (iq_helper, stanza, reply_func, - object, NULL, NULL); - fail_unless (result); - - reply = gibber_iq_helper_new_result_reply (stanza); - fail_unless (reply != NULL); - result = gibber_xmpp_connection_send (xmpp_connection, reply, NULL); - fail_unless (result); - - while (g_main_context_iteration (NULL, FALSE)) - ; - - fail_unless (received_reply); - - g_object_unref (stanza); - g_object_unref (reply); - g_object_unref (object); - g_object_unref (xmpp_connection); - g_object_unref (iq_helper); -} -END_TEST - -START_TEST (test_send_with_object_destroyed) -{ - GibberXmppConnection *xmpp_connection = create_xmpp_connection (); - GibberIqHelper *iq_helper = gibber_iq_helper_new (xmpp_connection); - GibberXmppStanza *stanza, *reply; - gboolean result; - GObject *object; - - received_reply = FALSE; - - /* We don't care about the TestTransport, we just need a GObject */ - object = g_object_new (TEST_TYPE_TRANSPORT, NULL); - - stanza = gibber_xmpp_stanza_build (GIBBER_STANZA_TYPE_IQ, - GIBBER_STANZA_SUB_TYPE_SET, - "from", "to", - GIBBER_STANZA_END); - - result = gibber_iq_helper_send_with_reply (iq_helper, stanza, reply_func, - object, NULL, NULL); - fail_unless (result); - - g_object_unref (object); - - reply = gibber_iq_helper_new_result_reply (stanza); - fail_unless (reply != NULL); - result = gibber_xmpp_connection_send (xmpp_connection, reply, NULL); - fail_unless (result); - - while (g_main_context_iteration (NULL, FALSE)) - ; - - /* Object was destroyed before we send the reply so we don't receive - * the reply */ - fail_unless (!received_reply); - - g_object_unref (stanza); - g_object_unref (reply); - g_object_unref (xmpp_connection); - g_object_unref (iq_helper); -} -END_TEST - -TCase * -make_gibber_iq_helper_tcase (void) -{ - TCase *tc = tcase_create ("IQ helper"); - tcase_add_test (tc, test_iq_helper_new); - tcase_add_test (tc, test_send_with_reply); - tcase_add_test (tc, test_send_without_reply); - tcase_add_test (tc, test_send_with_bad_reply_type); - tcase_add_test (tc, test_send_without_id); - tcase_add_test (tc, test_new_result_reply); - tcase_add_test (tc, test_new_error_reply); - tcase_add_test (tc, test_send_with_object_living); - tcase_add_test (tc, test_send_with_object_destroyed); - - return tc; -} diff --git a/lib/gibber/tests/check-gibber-listener.c b/lib/gibber/tests/check-gibber-listener.c index 4a1bce06..3ca01407 100644 --- a/lib/gibber/tests/check-gibber-listener.c +++ b/lib/gibber/tests/check-gibber-listener.c @@ -34,9 +34,6 @@ #include <gibber/gibber-unix-transport.h> #include <gibber/gibber-listener.h> -#include <check.h> -#include "check-gibber.h" - gboolean got_connection; gboolean signalled; @@ -77,7 +74,8 @@ connect_to_port (int port, GMainLoop *loop) return GIBBER_TRANSPORT (transport); } -START_TEST (test_unix_listen) +static void +test_unix_listen (void) { GibberListener *listener_unix; GibberUnixTransport *unix_transport; @@ -87,34 +85,34 @@ START_TEST (test_unix_listen) gchar *path = "/tmp/check-gibber-listener-socket"; ret = unlink (path); - fail_if (ret == -1 && errno != ENOENT); + g_assert (!(ret == -1 && errno != ENOENT)); mainloop = g_main_loop_new (NULL, FALSE); listener_unix = gibber_listener_new (); - fail_if (listener_unix == NULL); + g_assert (listener_unix != NULL); g_signal_connect (listener_unix, "new-connection", G_CALLBACK (new_connection_cb), mainloop); ret = gibber_listener_listen_socket (listener_unix, path, FALSE, &error); - fail_if (ret != TRUE); + g_assert (ret == TRUE); unix_transport = gibber_unix_transport_new (); ret = gibber_unix_transport_connect (unix_transport, path, &error); - fail_if (ret != TRUE); + g_assert (ret == TRUE); - if (!signalled) - g_main_loop_run (mainloop); + g_main_loop_run (mainloop); - fail_if (!got_connection, "Failed to connect"); + g_assert (got_connection && "Failed to connect"); g_object_unref (listener_unix); g_object_unref (unix_transport); g_main_loop_unref (mainloop); -} END_TEST +} -START_TEST (test_tcp_listen) +static void +test_tcp_listen (void) { GibberListener *listener; GibberListener *listener_without_port; @@ -128,13 +126,13 @@ START_TEST (test_tcp_listen) /* tcp socket tests without a specified port */ listener_without_port = gibber_listener_new (); - fail_if (listener_without_port == NULL); + g_assert (listener_without_port != NULL); g_signal_connect (listener_without_port, "new-connection", G_CALLBACK (new_connection_cb), mainloop); ret = gibber_listener_listen_tcp (listener_without_port, 0, &error); - fail_if (ret != TRUE); + g_assert (ret == TRUE); port = gibber_listener_get_port (listener_without_port); signalled = FALSE; @@ -142,14 +140,14 @@ START_TEST (test_tcp_listen) if (!signalled) g_main_loop_run (mainloop); - fail_if (!got_connection, "Failed to connect"); + g_assert (got_connection); g_object_unref (listener_without_port); g_object_unref (transport); /* tcp socket tests with a specified port */ listener = gibber_listener_new (); - fail_if (listener == NULL); + g_assert (listener != NULL); g_signal_connect (listener, "new-connection", G_CALLBACK (new_connection_cb), mainloop); @@ -159,20 +157,20 @@ START_TEST (test_tcp_listen) if (gibber_listener_listen_tcp (listener, port, &error)) break; - fail_if (!g_error_matches (error, GIBBER_LISTENER_ERROR, - GIBBER_LISTENER_ERROR_ADDRESS_IN_USE)); + g_assert_error (error, GIBBER_LISTENER_ERROR, + GIBBER_LISTENER_ERROR_ADDRESS_IN_USE); g_error_free (error); error = NULL; } - fail_if (port >= 5400); - fail_if (port != gibber_listener_get_port (listener)); + g_assert (port < 5400); + g_assert (port == gibber_listener_get_port (listener)); /* try a second listener on the same port */ listener2 = gibber_listener_new (); - fail_if (listener2 == NULL); - fail_if (gibber_listener_listen_tcp (listener2, port, &error)); - fail_if (!g_error_matches (error, GIBBER_LISTENER_ERROR, - GIBBER_LISTENER_ERROR_ADDRESS_IN_USE)); + g_assert (listener2 != NULL); + g_assert (!gibber_listener_listen_tcp (listener2, port, &error)); + g_assert_error (error, GIBBER_LISTENER_ERROR, + GIBBER_LISTENER_ERROR_ADDRESS_IN_USE); g_object_unref (listener2); g_error_free (error); error = NULL; @@ -182,7 +180,7 @@ START_TEST (test_tcp_listen) if (!signalled) g_main_loop_run (mainloop); - fail_if (!got_connection, "Failed to connect"); + g_assert (got_connection); g_object_unref (listener); g_object_unref (transport); @@ -194,18 +192,23 @@ START_TEST (test_tcp_listen) if (!signalled) g_main_loop_run (mainloop); - fail_if (got_connection, "Connected while listening should have stopped"); + /* Connected while listening should have stopped */ + g_assert (!got_connection); g_object_unref (transport); g_main_loop_unref (mainloop); -} END_TEST +} -TCase * -make_gibber_listener_tcase (void) +int +main (int argc, + char **argv) { - TCase *tc = tcase_create ("GibberListener"); - tcase_add_test (tc, test_tcp_listen); - tcase_add_test (tc, test_unix_listen); - return tc; + g_test_init (&argc, &argv, NULL); + g_type_init (); + + g_test_add_func ("/gibber/listener/tcp-listen", test_tcp_listen); + g_test_add_func ("/gibber/listener/unix-listen", test_unix_listen); + + return g_test_run (); } diff --git a/lib/gibber/tests/check-gibber-r-multicast-causal-transport.c b/lib/gibber/tests/check-gibber-r-multicast-causal-transport.c index 8dc92782..0d9f7427 100644 --- a/lib/gibber/tests/check-gibber-r-multicast-causal-transport.c +++ b/lib/gibber/tests/check-gibber-r-multicast-causal-transport.c @@ -24,9 +24,6 @@ #include <gibber/gibber-r-multicast-causal-transport.h> #include <gibber/gibber-r-multicast-packet.h> #include "test-transport.h" -#include "check-gibber.h" - -#include <check.h> /* Numer of polls we expect the id generation to do */ #define ID_GENERATION_EXPECTED_POLLS 3 @@ -45,7 +42,7 @@ create_rmulticast_transport (TestTransport **testtransport, GibberRMulticastCausalTransport *rmctransport; t = test_transport_new (test_send_hook, user_data); - fail_unless (t != NULL); + g_assert (t != NULL); GIBBER_TRANSPORT (t)->max_packet_size = 150; rmctransport = gibber_r_multicast_causal_transport_new @@ -66,9 +63,9 @@ static void rmulticast_connect (GibberRMulticastCausalTransport *transport) { - fail_unless (transport != NULL); + g_assert (transport != NULL); - fail_unless (gibber_r_multicast_causal_transport_connect (transport, + g_assert (gibber_r_multicast_causal_transport_connect (transport, FALSE, NULL)); } @@ -99,7 +96,7 @@ depends_send_hook (GibberTransport *transport, guint i, n; packet = gibber_r_multicast_packet_parse (data, length, NULL); - fail_unless (packet != NULL); + g_assert (packet != NULL); if (packet->type == PACKET_TYPE_WHOIS_REQUEST) { @@ -121,7 +118,7 @@ depends_send_hook (GibberTransport *transport, goto out; } - fail_unless (senders[i].name != NULL); + g_assert (senders[i].name != NULL); reply = gibber_r_multicast_packet_new (PACKET_TYPE_WHOIS_REPLY, senders[i].sender_id, transport->max_packet_size); @@ -139,7 +136,7 @@ depends_send_hook (GibberTransport *transport, goto out; } - fail_unless (packet->depends->len > 0); + g_assert (packet->depends->len > 0); for (n = 0; n < packet->depends->len; n++) { @@ -150,18 +147,18 @@ depends_send_hook (GibberTransport *transport, GibberRMulticastPacketSenderInfo *, n); if (senders[i].sender_id == sender_info->sender_id) { - fail_unless (senders[i].seen == FALSE); - fail_unless (senders[i].packet_id + 1 == sender_info->packet_id); + g_assert (senders[i].seen == FALSE); + g_assert (senders[i].packet_id + 1 == sender_info->packet_id); senders[i].seen = TRUE; break; } } - fail_unless (senders[i].name != NULL); + g_assert (senders[i].name != NULL); } for (i = 0; senders[i].name != NULL ; i++) { - fail_unless (senders[i].seen, "Not all senders in depends"); + g_assert (senders[i].seen && "Not all senders in depends"); } g_main_loop_quit (loop); @@ -177,7 +174,7 @@ depends_send_test_data (gpointer data) GIBBER_R_MULTICAST_CAUSAL_TRANSPORT (data); guint8 testdata[] = { 1, 2, 3 }; - fail_unless (gibber_transport_send (GIBBER_TRANSPORT (t), testdata, + g_assert (gibber_transport_send (GIBBER_TRANSPORT (t), testdata, 3, NULL)); return FALSE; @@ -221,7 +218,8 @@ depends_connected (GibberTransport *transport, g_timeout_add (300, depends_send_test_data, rmctransport); } -START_TEST (test_depends) +static void +test_depends (void) { GibberRMulticastCausalTransport *rmctransport; TestTransport *testtransport; @@ -242,12 +240,11 @@ START_TEST (test_depends) for (i = 0 ; senders[i].name != NULL; i++) { - fail_unless (senders[i].seen); + g_assert (senders[i].seen); } g_object_unref (rmctransport); } -END_TEST /* test fragmentation testing */ @@ -266,7 +263,7 @@ fragmentation_send_hook (GibberTransport *transport, guint8 *payload; packet = gibber_r_multicast_packet_parse (data, length, NULL); - fail_unless (packet != NULL); + g_assert (packet != NULL); if (packet->type != PACKET_TYPE_DATA) { @@ -276,24 +273,24 @@ fragmentation_send_hook (GibberTransport *transport, payload = gibber_r_multicast_packet_get_payload (packet, &size); if (bytes == 0) - fail_unless + g_assert (packet->data.data.flags == GIBBER_R_MULTICAST_DATA_PACKET_START); else if (bytes + size < TEST_DATA_SIZE) - fail_unless (packet->data.data.flags == 0); + g_assert (packet->data.data.flags == 0); bytes += size; - fail_unless (bytes <= TEST_DATA_SIZE); + g_assert (bytes <= TEST_DATA_SIZE); /* check our bytes */ for (i = 0; i < size; i++) { - fail_unless (payload[i] == next_byte); + g_assert (payload[i] == next_byte); next_byte++; } if (bytes == TEST_DATA_SIZE) { - fail_unless + g_assert (packet->data.data.flags == GIBBER_R_MULTICAST_DATA_PACKET_END); g_object_unref (packet); g_main_loop_quit (loop); @@ -319,11 +316,12 @@ fragmentation_connected (GibberTransport *transport, testdata[i] = (guint8) (i & 0xff); } - fail_unless (gibber_transport_send (GIBBER_TRANSPORT (rmctransport), + g_assert (gibber_transport_send (GIBBER_TRANSPORT (rmctransport), (guint8 *) testdata, TEST_DATA_SIZE, NULL)); } -START_TEST (test_fragmentation) +static void +test_fragmentation (void) { GibberRMulticastCausalTransport *rmctransport; @@ -342,7 +340,6 @@ START_TEST (test_fragmentation) g_object_unref (rmctransport); } -END_TEST /* test unique id */ @@ -358,7 +355,7 @@ unique_id_send_hook (GibberTransport *transport, packet = gibber_r_multicast_packet_parse (data, length, NULL); - fail_unless (packet != NULL); + g_assert (packet != NULL); if (*test_id == 0) { @@ -368,9 +365,9 @@ unique_id_send_hook (GibberTransport *transport, gsize psize; /* First packet must be a whois request to see if the id is taken */ - fail_unless (packet->type == PACKET_TYPE_WHOIS_REQUEST); + g_assert (packet->type == PACKET_TYPE_WHOIS_REQUEST); /* Sender must be 0 as it couldn't choose a id just yet */ - fail_unless (packet->sender == 0); + g_assert (packet->sender == 0); *test_id = packet->data.whois_request.sender_id; @@ -385,11 +382,11 @@ unique_id_send_hook (GibberTransport *transport, } else { - fail_unless (*test_id != packet->sender); + g_assert (*test_id != packet->sender); switch (packet->type) { case PACKET_TYPE_WHOIS_REQUEST: - fail_unless (*test_id != packet->data.whois_request.sender_id); + g_assert (*test_id != packet->data.whois_request.sender_id); break; case PACKET_TYPE_WHOIS_REPLY: /* transport sends a unsolicited whois reply after choosing a @@ -397,7 +394,9 @@ unique_id_send_hook (GibberTransport *transport, g_main_loop_quit (loop); break; default: - fail ("Unexpected packet type: %x", packet->type); + g_warning ("Unexpected packet type: %x", packet->type); + g_assert_not_reached (); + break; } } @@ -405,7 +404,8 @@ unique_id_send_hook (GibberTransport *transport, return TRUE; } -START_TEST (test_unique_id) +static void +test_unique_id (void) { /* Test if the multicast transport correctly handles the case that it gets a * WHOIS_REPLY on one of it's WHOIS_REQUESTS when it's determining a unique @@ -426,7 +426,6 @@ START_TEST (test_unique_id) g_object_unref (rmctransport); } -END_TEST /* test id generation conflict */ typedef struct { @@ -446,14 +445,14 @@ id_generation_conflict_send_hook (GibberTransport *transport, unique_id_conflict_test_t *test = (unique_id_conflict_test_t *) user_data; packet = gibber_r_multicast_packet_parse (data, length, NULL); - fail_unless (packet != NULL); + g_assert (packet != NULL); if (test->id == 0) { /* First packet must be a whois request to see if the id is taken */ - fail_unless (packet->type == PACKET_TYPE_WHOIS_REQUEST); + g_assert (packet->type == PACKET_TYPE_WHOIS_REQUEST); /* Sender must be 0 as it couldn't choose a id just yet */ - fail_unless (packet->sender == 0); + g_assert (packet->sender == 0); test->id = packet->data.whois_request.sender_id; } @@ -465,7 +464,7 @@ id_generation_conflict_send_hook (GibberTransport *transport, if (test->count < test->wait) { - fail_unless (test->id == packet->data.whois_request.sender_id); + g_assert (test->id == packet->data.whois_request.sender_id); } else if (test->count == test->wait) { @@ -474,7 +473,7 @@ id_generation_conflict_send_hook (GibberTransport *transport, guint8 *pdata; gsize psize; - fail_unless (test->id == packet->data.whois_request.sender_id); + g_assert (test->id == packet->data.whois_request.sender_id); reply = gibber_r_multicast_packet_new (PACKET_TYPE_WHOIS_REQUEST, 0, transport->max_packet_size); @@ -487,7 +486,7 @@ id_generation_conflict_send_hook (GibberTransport *transport, } else if (test->count > test->wait) { - fail_unless (test->id != packet->data.whois_request.sender_id); + g_assert (test->id != packet->data.whois_request.sender_id); } break; @@ -495,21 +494,24 @@ id_generation_conflict_send_hook (GibberTransport *transport, case PACKET_TYPE_WHOIS_REPLY: /* transport sends a unsolicited whois reply after choosing a * identifier */ - fail_unless (packet->sender != test->id); - fail_unless (test->count == + g_assert (packet->sender != test->id); + g_assert_cmpuint (test->count, ==, ID_GENERATION_EXPECTED_POLLS + test->wait); g_main_loop_quit (loop); break; default: - fail ("Unexpected packet type: %x", packet->type); + g_warning ("Unexpected packet type: %x", packet->type); + g_assert_not_reached (); + break; } g_object_unref (packet); return TRUE; } -START_TEST (test_id_generation_conflict) +static void +test_id_generation_conflict (gint _i) { /* Test if the multicast transport correctly handles the case that it sees * another WHOIS_REQUEST on one of its WHOIS_REQUESTS when it's determining @@ -533,18 +535,33 @@ START_TEST (test_id_generation_conflict) g_object_unref (rmtransport); } -END_TEST +static void +test_id_generation_conflict_loop (void) +{ + gint i; + for (i = 0; i < ID_GENERATION_EXPECTED_POLLS; ++i) + test_id_generation_conflict (i); +} -TCase * -make_gibber_r_multicast_causal_transport_tcase (void) +int +main (int argc, + char **argv) { - TCase *tc = tcase_create ("Gibber R Multicast Causal transport"); - tcase_add_test (tc, test_unique_id); - tcase_add_loop_test (tc, test_id_generation_conflict, 0, - ID_GENERATION_EXPECTED_POLLS); - tcase_add_test (tc, test_fragmentation); - tcase_add_test (tc, test_depends); - - return tc; + g_test_init (&argc, &argv, NULL); + g_type_init (); + + g_test_add_func ("/gibber/r-multicast-casual-transport/unique-id", + test_unique_id); + g_test_add_func ( + "/gibber/r-multicast-casual-transport/id-generation-conflict", + test_id_generation_conflict_loop); + g_test_add_func ("/gibber/r-multicast-casual-transport/fragmentation", + test_fragmentation); + g_test_add_func ("/gibber/r-multicast-casual-transport/depends", + test_depends); + + return g_test_run (); } + +#include "test-transport.c" diff --git a/lib/gibber/tests/check-gibber-r-multicast-packet.c b/lib/gibber/tests/check-gibber-r-multicast-packet.c index 52bfef41..5d5fcfd8 100644 --- a/lib/gibber/tests/check-gibber-r-multicast-packet.c +++ b/lib/gibber/tests/check-gibber-r-multicast-packet.c @@ -3,11 +3,8 @@ #include <gibber/gibber-r-multicast-packet.h> -#include <check.h> -#include "check-gibber.h" - #define COMPARE(x) G_STMT_START { \ - fail_unless (a->x == b->x); \ + g_assert (a->x == b->x); \ } G_STMT_END typedef struct { @@ -24,7 +21,8 @@ typedef struct { #define NUMBER_OF_DIFF_TESTS 15 -START_TEST (test_r_multicast_packet_diff) +static void +test_r_multicast_packet_diff (gint _i) { diff_testcase cases[NUMBER_OF_DIFF_TESTS] = { { 0, 0, 0 }, @@ -47,11 +45,19 @@ START_TEST (test_r_multicast_packet_diff) diff_testcase *c = cases + _i; gint32 result = gibber_r_multicast_packet_diff (c->a, c->b); - fail_unless (c->result == result); + g_assert (c->result == result); +} + +static void +test_r_multicast_packet_diff_loop (void) +{ + gint i; + for (i = 0; i < NUMBER_OF_DIFF_TESTS; ++i) + test_r_multicast_packet_diff (i); } -END_TEST -START_TEST (test_data_packet) +static void +test_data_packet (void) { GibberRMulticastPacket *a; GibberRMulticastPacket *b; @@ -87,7 +93,7 @@ START_TEST (test_data_packet) data = gibber_r_multicast_packet_get_raw_data (a, &len); b = gibber_r_multicast_packet_parse (data, len, NULL); - fail_unless (b != NULL); + g_assert (b != NULL); COMPARE (type); COMPARE (version); @@ -96,7 +102,7 @@ START_TEST (test_data_packet) COMPARE (packet_id); COMPARE (data.data.stream_id); - fail_unless (a->sender == b->sender); + g_assert (a->sender == b->sender); for (n = 0 ; n < b->depends->len; n++) { @@ -106,32 +112,33 @@ START_TEST (test_data_packet) GibberRMulticastPacketSenderInfo *, n); if (senders[i].sender_id == s->sender_id) { - fail_unless (senders[i].packet_id == s->packet_id); - fail_unless (senders[i].seen == FALSE); + g_assert (senders[i].packet_id == s->packet_id); + g_assert (senders[i].seen == FALSE); senders[i].seen = TRUE; break; } } - fail_unless (senders[i].sender_id != 0); + g_assert (senders[i].sender_id != 0); } for (i = 0; senders[i].sender_id != 0 ; i++) { - fail_unless (senders[i].seen == TRUE); + g_assert (senders[i].seen == TRUE); } pdata = gibber_r_multicast_packet_get_payload (b, &plen); - fail_unless (plen == strlen (payload)); + g_assert (plen == strlen (payload)); - fail_unless (memcmp (payload, pdata, plen) == 0); + g_assert (memcmp (payload, pdata, plen) == 0); g_object_unref (a); g_object_unref (b); -} END_TEST +} -START_TEST (test_attempt_join_packet) +static void +test_attempt_join_packet (void) { GibberRMulticastPacket *a; GibberRMulticastPacket *b; @@ -166,14 +173,14 @@ START_TEST (test_attempt_join_packet) b = gibber_r_multicast_packet_parse (data, len, NULL); - fail_unless (b != NULL); + g_assert (b != NULL); COMPARE (type); COMPARE (version); COMPARE (packet_id); COMPARE (data.attempt_join.senders->len); - fail_unless (a->sender == b->sender); + g_assert (a->sender == b->sender); for (n = 0; n < b->depends->len; n++) { @@ -183,24 +190,24 @@ START_TEST (test_attempt_join_packet) GibberRMulticastPacketSenderInfo *, n); if (senders[i].sender_id == s->sender_id) { - fail_unless (senders[i].packet_id == s->packet_id); - fail_unless (senders[i].seen == FALSE); + g_assert (senders[i].packet_id == s->packet_id); + g_assert (senders[i].seen == FALSE); senders[i].seen = TRUE; break; } } - fail_unless (senders[i].sender_id != 0); + g_assert (senders[i].sender_id != 0); } for (i = 0; senders[i].sender_id != 0; i++) { - fail_unless (senders[i].seen == TRUE); + g_assert (senders[i].seen == TRUE); } for (i = 0; new_senders[i].sender_id != 0; i++) { - fail_unless (new_senders[i].sender_id == + g_assert (new_senders[i].sender_id == g_array_index (b->data.attempt_join.senders, guint32, i)); new_senders[i].seen = TRUE; break; @@ -208,21 +215,25 @@ START_TEST (test_attempt_join_packet) for (i = 0; new_senders[i].sender_id != 0; i++) { - fail_unless (senders[i].seen == TRUE); + g_assert (senders[i].seen == TRUE); } g_object_unref (a); g_object_unref (b); } -END_TEST -TCase * -make_gibber_r_multicast_packet_tcase (void) +int +main (int argc, + char **argv) { - TCase *tc = tcase_create ("RMulticast Packet"); - tcase_add_test (tc, test_data_packet); - tcase_add_test (tc, test_attempt_join_packet); - tcase_add_loop_test (tc, test_r_multicast_packet_diff, 0, - NUMBER_OF_DIFF_TESTS); - return tc; + g_test_init (&argc, &argv, NULL); + g_type_init (); + + g_test_add_func ("/gibber/r-multicast-packet/data-packet", test_data_packet); + g_test_add_func ("/gibber/r-multicast-packet/attempt-join-packet", + test_attempt_join_packet); + g_test_add_func ("/gibber/r-multicast-packet/diff", + test_r_multicast_packet_diff_loop); + + return g_test_run (); } diff --git a/lib/gibber/tests/check-gibber-r-multicast-sender.c b/lib/gibber/tests/check-gibber-r-multicast-sender.c index b0a4c903..7eb41943 100644 --- a/lib/gibber/tests/check-gibber-r-multicast-sender.c +++ b/lib/gibber/tests/check-gibber-r-multicast-sender.c @@ -1,12 +1,29 @@ +/* + * check-gibber-r-multicast-sender.c + * Copyright (C) 2007 Collabora Ltd. + * + * 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 <unistd.h> #include <gibber/gibber-r-multicast-sender.h> -#include <check.h> -#include "check-gibber.h" - #define SENDER 4321 #define SENDER_NAME "testsender" @@ -98,13 +115,13 @@ data_received_cb (GibberRMulticastSender *sender, guint8 stream_id, for (i = 0 ; lines[i] != NULL && *lines[i] != '\0'; i++) { guint32 v = atoi (lines[i]); - fail_unless (v == expected); - fail_unless ((v % G_MAXUINT8) - i == stream_id); + g_assert (v == expected); + g_assert ((v % G_MAXUINT8) - i == stream_id); expected++; } /* serial % 3 is send out in a single packet the other two together. * So expected can't be % 3 == 2 here */ - fail_if (expected % 3 == 2); + g_assert_cmpuint (expected % 3, !=, 2); if (expected == serial_offset + NR_PACKETS || expected == serial_offset + NR_PACKETS + EXTRA_SEEN) { @@ -121,7 +138,7 @@ repair_request_cb (GibberRMulticastSender *sender, guint id, gpointer data) { GibberRMulticastPacket *p; - fail_unless (gibber_r_multicast_packet_diff (serial_offset, id) >= 0 + g_assert (gibber_r_multicast_packet_diff (serial_offset, id) >= 0 || gibber_r_multicast_packet_diff (id, serial_offset + NR_PACKETS + EXTRA_SEEN) < 0); @@ -135,8 +152,8 @@ repair_message_cb (GibberRMulticastSender *sender, GibberRMulticastPacket *packet, gpointer user_data) { - fail_unless (packet->type == PACKET_TYPE_DATA); - fail_unless (packet->packet_id == REPAIR_PACKET + serial_offset); + g_assert (packet->type == PACKET_TYPE_DATA); + g_assert (packet->packet_id == REPAIR_PACKET + serial_offset); g_main_loop_quit ((GMainLoop *) user_data); } @@ -168,7 +185,8 @@ add_packet (gpointer data) #define NUMBER_OF_TESTS 3 -START_TEST (test_sender) +static void +test_sender (gint _i) { GibberRMulticastSender *s; GibberRMulticastSenderGroup *group; @@ -227,7 +245,15 @@ START_TEST (test_sender) g_main_loop_run (loop); gibber_r_multicast_sender_group_free (group); -} END_TEST +} + +static void +test_sender_loop (void) +{ + gint i; + for (i = 0; i < NUMBER_OF_TESTS; ++i) + test_sender (i); +} /* Holding test */ guint32 idle_timer = 0; @@ -297,12 +323,12 @@ h_idle_next_step (gpointer user_data) case START_DATA: case FAIL: case EXPECT: - fail ("Should not be reached"); + g_assert_not_reached (); break; case HOLD: s = g_hash_table_find (d->group->senders, h_find_sender, e->expected_node); - fail_unless (s != NULL); + g_assert (s != NULL); d->test_step++; gibber_r_multicast_sender_hold_data (s, e->hold_id); h_next_test_step (d); @@ -310,7 +336,7 @@ h_idle_next_step (gpointer user_data) case UNHOLD: s = g_hash_table_find (d->group->senders, h_find_sender, e->expected_node); - fail_unless (s != NULL); + g_assert (s != NULL); d->test_step++; gibber_r_multicast_sender_release_data (s); h_next_test_step (d); @@ -336,7 +362,7 @@ h_next_test_step (h_data_t *d) case UNHOLD_IMMEDIATE: s = g_hash_table_find (d->group->senders, h_find_sender, e->expected_node); - fail_unless (s != NULL); + g_assert (s != NULL); d->test_step++; gibber_r_multicast_sender_release_data (s); h_next_test_step (d); @@ -344,7 +370,7 @@ h_next_test_step (h_data_t *d) case START_DATA: s = g_hash_table_find (d->group->senders, h_find_sender, e->expected_node); - fail_unless (s != NULL); + g_assert (s != NULL); d->test_step++; gibber_r_multicast_sender_set_data_start (s, e->hold_id); h_next_test_step (d); @@ -352,7 +378,7 @@ h_next_test_step (h_data_t *d) case FAIL: s = g_hash_table_find (d->group->senders, h_find_sender, e->expected_node); - fail_unless (s != NULL); + g_assert (s != NULL); d->test_step++; gibber_r_multicast_sender_set_failed (s); h_next_test_step (d); @@ -373,11 +399,11 @@ h_received_data_cb (GibberRMulticastSender *sender, guint16 stream_id, { h_data_t *d = (h_data_t *) user_data; - fail_unless (d->expectation[d->test_step].type == EXPECT); - fail_unless (d->expectation[d->test_step].packet_type == PACKET_TYPE_DATA); - fail_unless ( - strcmp (d->expectation[d->test_step].expected_node, sender->name) == 0); - fail_unless (d->expectation[d->test_step].data_stream_id == stream_id); + g_assert (d->expectation[d->test_step].type == EXPECT); + g_assert (d->expectation[d->test_step].packet_type == PACKET_TYPE_DATA); + g_assert_cmpstr (d->expectation[d->test_step].expected_node, ==, + sender->name); + g_assert (d->expectation[d->test_step].data_stream_id == stream_id); d->test_step++; h_next_test_step (d); @@ -389,10 +415,10 @@ h_received_control_packet_cb (GibberRMulticastSender *sender, { h_data_t *d = (h_data_t *) user_data; - fail_unless (d->expectation[d->test_step].type == EXPECT); - fail_unless (d->expectation[d->test_step].packet_type == packet->type); - fail_unless ( - strcmp (d->expectation[d->test_step].expected_node, sender->name) == 0); + g_assert (d->expectation[d->test_step].type == EXPECT); + g_assert (d->expectation[d->test_step].packet_type == packet->type); + g_assert_cmpstr (d->expectation[d->test_step].expected_node, ==, + sender->name); d->test_step++; h_next_test_step (d); @@ -565,7 +591,9 @@ add_h_sender (guint32 sender, gchar *name, GibberRMulticastSenderGroup *group, G_CALLBACK (h_received_control_packet_cb), data); } -START_TEST (test_holding) { +static void +test_holding (gint _i) +{ GibberRMulticastSenderGroup *group; guint32 sender_offset = 0xf00; /* control packets aren't hold back, thus we get them interleaved at first @@ -599,7 +627,7 @@ START_TEST (test_holding) { s0 = g_hash_table_find (group->senders, h_find_sender, test->setup[i].name); - fail_unless (s0 != NULL); + g_assert (s0 != NULL); p = gibber_r_multicast_packet_new (test->setup[i].packet_type, s0->id, 1500); @@ -609,13 +637,13 @@ START_TEST (test_holding) { { s1 = g_hash_table_find (group->senders, h_find_sender, test->setup[i].depend_node); - fail_unless (s1 != NULL); - fail_unless (gibber_r_multicast_packet_add_sender_info (p, s1->id, + g_assert (s1 != NULL); + g_assert (gibber_r_multicast_packet_add_sender_info (p, s1->id, test->setup[i].depend_packet_id, NULL)); } if (test->setup[i].packet_type == PACKET_TYPE_DATA) { - fail_unless (test->setup[i].data != NULL); + g_assert (test->setup[i].data != NULL); gibber_r_multicast_packet_set_data_info (p, test->setup[i].data_stream_id, @@ -637,16 +665,29 @@ START_TEST (test_holding) { } while (data.expectation[data.test_step].type != DONE); - fail_unless (idle_timer == 0); + g_assert (idle_timer == 0); +} -} END_TEST +static void +test_holding_loop (void) +{ + gint i; + for (i = 0; i < NUMBER_OF_H_TESTS; ++i) + test_holding (i); +} -TCase * -make_gibber_r_multicast_sender_tcase (void) +int +main (int argc, + char **argv) { - TCase *tc = tcase_create ("RMulticast Sender"); - tcase_set_timeout (tc, 20); - tcase_add_loop_test (tc, test_sender, 0, NUMBER_OF_TESTS); - tcase_add_loop_test (tc, test_holding, 0, NUMBER_OF_H_TESTS ); - return tc; + g_test_init (&argc, &argv, NULL); + g_type_init (); + + /* Kill this process after 20 seconds */ + alarm (20); + + g_test_add_func ("/gibber/r-multicast-sender/sender", test_sender_loop); + g_test_add_func ("/gibber/r-multicast-sender/holding", test_holding_loop); + + return g_test_run (); } diff --git a/lib/gibber/tests/check-gibber-unix-transport.c b/lib/gibber/tests/check-gibber-unix-transport.c index 6a048fef..c3cfbed8 100644 --- a/lib/gibber/tests/check-gibber-unix-transport.c +++ b/lib/gibber/tests/check-gibber-unix-transport.c @@ -34,9 +34,6 @@ #include <gibber/gibber-unix-transport.h> #include <gibber/gibber-listener.h> -#include <check.h> -#include "check-gibber.h" - gboolean got_connection; gboolean received_credentials; GibberUnixTransport *unix_transport; @@ -107,7 +104,8 @@ new_connection_cb (GibberListener *listener, g_main_loop_quit (loop); } -START_TEST (test_send_credentials) +static void +test_send_credentials (void) { GibberListener *listener_unix; int ret; @@ -116,33 +114,34 @@ START_TEST (test_send_credentials) gchar *path = "/tmp/check-gibber-unix-transport-socket"; ret = unlink (path); - fail_if (ret == -1 && errno != ENOENT); + g_assert (!(ret == -1 && errno != ENOENT)); got_connection = FALSE; mainloop = g_main_loop_new (NULL, FALSE); listener_unix = gibber_listener_new (); - fail_if (listener_unix == NULL); + g_assert (listener_unix != NULL); g_signal_connect (listener_unix, "new-connection", G_CALLBACK (new_connection_cb), mainloop); ret = gibber_listener_listen_socket (listener_unix, path, FALSE, &error); - fail_if (ret != TRUE); + g_assert (ret == TRUE); unix_transport = gibber_unix_transport_new (); ret = gibber_unix_transport_connect (unix_transport, path, &error); - fail_if (ret != TRUE); + g_assert (ret == TRUE); if (!got_connection) g_main_loop_run (mainloop); - fail_if (!got_connection, "Failed to connect"); + /* "Failed to connect" */ + g_assert (got_connection); g_object_unref (listener_unix); g_object_unref (unix_transport); g_main_loop_unref (mainloop); -} END_TEST +} static void get_credentials_cb (GibberUnixTransport *transport, @@ -184,7 +183,8 @@ receive_new_connection_cb (GibberListener *listener, g_assert (ok == gibber_unix_transport_supports_credentials ()); } -START_TEST (test_receive_credentials) +static void +test_receive_credentials (void) { GibberListener *listener_unix; int ret; @@ -193,41 +193,50 @@ START_TEST (test_receive_credentials) gchar *path = "/tmp/check-gibber-unix-transport-socket"; ret = unlink (path); - fail_if (ret == -1 && errno != ENOENT); + g_assert (!(ret == -1 && errno != ENOENT)); received_credentials = FALSE; mainloop = g_main_loop_new (NULL, FALSE); listener_unix = gibber_listener_new (); - fail_if (listener_unix == NULL); + g_assert (listener_unix != NULL); g_signal_connect (listener_unix, "new-connection", G_CALLBACK (receive_new_connection_cb), mainloop); ret = gibber_listener_listen_socket (listener_unix, path, FALSE, &error); - fail_if (ret != TRUE); + g_assert (ret == TRUE); unix_transport = gibber_unix_transport_new (); ret = gibber_unix_transport_connect (unix_transport, path, &error); - fail_if (ret != TRUE); + g_assert (ret == TRUE); #if defined(__linux__) if (!received_credentials) g_main_loop_run (mainloop); - fail_if (!received_credentials, "Failed to receive credentials"); + /* Failed to receive credentials */ + g_assert (received_credentials); #endif g_object_unref (listener_unix); g_object_unref (unix_transport); g_main_loop_unref (mainloop); -} END_TEST +} -TCase * -make_gibber_unix_transport_tcase (void) +int +main (int argc, + char **argv) { - TCase *tc = tcase_create ("GibberUnixTransport"); - tcase_add_test (tc, test_send_credentials); - tcase_add_test (tc, test_receive_credentials); - return tc; + g_test_init (&argc, &argv, NULL); + g_type_init (); + + alarm (20); + + g_test_add_func ("/gibber/unix-transport/send-credentials", + test_send_credentials); + g_test_add_func ("/gibber/unix-transport/receive-credentials", + test_receive_credentials); + + return g_test_run (); } diff --git a/lib/gibber/tests/check-gibber-xmpp-connection-listener.c b/lib/gibber/tests/check-gibber-xmpp-connection-listener.c deleted file mode 100644 index 8dd19314..00000000 --- a/lib/gibber/tests/check-gibber-xmpp-connection-listener.c +++ /dev/null @@ -1,120 +0,0 @@ -/* - * check-gibber-xmpp-connection-listener.c - Test for - * GibberXmppConnectionListener - * Copyright (C) 2007 Collabora Ltd. - * @author Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - * - * 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 <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> - -#include <gibber/gibber-linklocal-transport.h> -#include <gibber/gibber-listener.h> -#include <gibber/gibber-xmpp-connection.h> -#include <gibber/gibber-xmpp-connection-listener.h> - -#include <check.h> -#include "check-gibber.h" - -gboolean got_connection; - -static void -new_connection_cb (GibberXmppConnectionListener *listener, - GibberXmppConnection *connection, - struct sockaddr *addr, - guint size, - gpointer user_data) -{ - got_connection = TRUE; -} - -static gboolean -connect_to_port (int port) -{ - GibberLLTransport *transport; - struct sockaddr_in addr; - gboolean result; - - transport = gibber_ll_transport_new (); - - memset (&addr, 0, sizeof (addr)); - addr.sin_family = AF_INET; - addr.sin_port = htons (port); - addr.sin_addr.s_addr = inet_addr ("127.0.0.1"); - - result = gibber_ll_transport_open_sockaddr (transport, - (struct sockaddr_storage *) &addr, NULL); - - g_object_unref (transport); - return result; -} - -START_TEST (test_listen) -{ - GibberXmppConnectionListener *listener; - int port; - gboolean result; - - got_connection = FALSE; - - listener = gibber_xmpp_connection_listener_new (); - fail_if (listener == NULL); - - g_signal_connect (listener, "new-connection", G_CALLBACK (new_connection_cb), - NULL); - - for (port = 5298; port < 5400; port++) - { - GError *error = NULL; - if (gibber_xmpp_connection_listener_listen (listener, port, &error)) - break; - - fail_if (!g_error_matches (error, GIBBER_LISTENER_ERROR, - GIBBER_LISTENER_ERROR_ADDRESS_IN_USE)); - g_error_free (error); - error = NULL; - } - fail_if (port >= 5400); - - result = connect_to_port (port); - fail_if (result == FALSE); - - while (g_main_context_iteration (NULL, FALSE)) - ; - fail_if (got_connection == FALSE); - - g_object_unref (listener); - - /* listener is destroyed, connection should be refused now */ - got_connection = FALSE; - result = connect_to_port (port); - fail_if (result == TRUE); -} END_TEST - -TCase * -make_gibber_xmpp_connection_listener_tcase (void) -{ - TCase *tc = tcase_create ("GibberXmppConnectionListener"); - tcase_add_test (tc, test_listen); - return tc; -} diff --git a/lib/gibber/tests/check-gibber-xmpp-connection.c b/lib/gibber/tests/check-gibber-xmpp-connection.c deleted file mode 100644 index de9dd1da..00000000 --- a/lib/gibber/tests/check-gibber-xmpp-connection.c +++ /dev/null @@ -1,126 +0,0 @@ -#include <stdio.h> -#include <unistd.h> -#include <glib.h> - -#include <gibber/gibber-xmpp-connection.h> -#include <gibber/gibber-transport.h> -#include "test-transport.h" -#include "check-gibber.h" - -#include <check.h> - -struct _FileChunker { - gchar *contents; - gsize length; - gsize size; - gsize offset; -}; -typedef struct _FileChunker FileChunker; - -static void -file_chunker_destroy (FileChunker *fc) { - g_free (fc->contents); - g_free (fc); -} - - -static FileChunker * -file_chunker_new (const gchar *filename, gsize chunk_size) { - FileChunker *fc; - fc = g_new0 (FileChunker, 1); - - fc->size = chunk_size; - if (!g_file_get_contents (filename, &fc->contents, &fc->length, NULL)) { - file_chunker_destroy (fc); - return NULL; - } - return fc; -} - -static gboolean -file_chunker_get_chunk (FileChunker *fc, - gchar **chunk, - gsize *chunk_size) { - if (fc->offset < fc->length) { - *chunk_size = MIN (fc->length - fc->offset, fc->size); - *chunk = fc->contents + fc->offset; - fc->offset += *chunk_size; - return TRUE; - } - return FALSE; -} - - -START_TEST (test_instantiation) -{ - GibberXmppConnection *connection; - TestTransport *transport; - - transport = test_transport_new (NULL, NULL); - connection = gibber_xmpp_connection_new (GIBBER_TRANSPORT(transport)); - - fail_if (connection == NULL); - - connection = gibber_xmpp_connection_new (NULL); - - fail_if (connection == NULL); -} -END_TEST - -static void -parse_error_cb (GibberXmppConnection *connection, gpointer user_data) -{ - gboolean *parse_error_found = user_data; - *parse_error_found = TRUE; -} - -START_TEST (test_simple_message) -{ - GibberXmppConnection *connection; - TestTransport *transport; - gchar *chunk; - gsize chunk_length; - gboolean parse_error_found = FALSE; - const gchar *srcdir; - gchar *file; - FileChunker *fc; - - srcdir = g_getenv ("srcdir"); - if (srcdir == NULL) - { - file = g_strdup ("inputs/simple-message.input"); - } - else - { - file = g_strdup_printf ("%s/inputs/simple-message.input", srcdir); - } - - fc = file_chunker_new (file, 10); - fail_if (fc == NULL); - - transport = test_transport_new (NULL, NULL); - connection = gibber_xmpp_connection_new (GIBBER_TRANSPORT(transport)); - - g_signal_connect (connection, "parse-error", - G_CALLBACK(parse_error_cb), &parse_error_found); - - while (!parse_error_found && - file_chunker_get_chunk (fc, &chunk, &chunk_length)) - { - test_transport_write (transport, (guint8 *) chunk, chunk_length); - } - - fail_if (parse_error_found); - - g_free (file); - file_chunker_destroy (fc); -} END_TEST - -TCase * -make_gibber_xmpp_connection_tcase (void) -{ - TCase *tc = tcase_create ("XMPP Connection"); - tcase_add_test (tc, test_instantiation); - tcase_add_test (tc, test_simple_message); - return tc; -} diff --git a/lib/gibber/tests/check-gibber-xmpp-error.c b/lib/gibber/tests/check-gibber-xmpp-error.c index b7e4ba26..926b2720 100644 --- a/lib/gibber/tests/check-gibber-xmpp-error.c +++ b/lib/gibber/tests/check-gibber-xmpp-error.c @@ -28,35 +28,32 @@ #define DEBUG_FLAG DEBUG_XMPP #include <gibber/gibber-debug.h> -#include <check.h> -#include "check-gibber.h" - static void test_xmpp_error_to_node_with_bad_request (void) { - GibberXmppStanza *stanza; - GibberXmppNode *node; + WockyStanza *stanza; + WockyNode *node; const gchar *code; const gchar *type; - stanza = gibber_xmpp_stanza_build ( - GIBBER_STANZA_TYPE_IQ, GIBBER_STANZA_SUB_TYPE_ERROR, + stanza = wocky_stanza_build ( + WOCKY_STANZA_TYPE_IQ, WOCKY_STANZA_SUB_TYPE_ERROR, "from", "to", - GIBBER_STANZA_END); + NULL); node = gibber_xmpp_error_to_node (XMPP_ERROR_BAD_REQUEST, wocky_stanza_get_top_node (stanza), NULL); - fail_if (node == NULL); - fail_if (strcmp (node->name, "error") != 0); + g_assert (node != NULL); + g_assert_cmpstr (node->name, ==, "error"); - code = gibber_xmpp_node_get_attribute (node, "code"); - fail_if (code == NULL || strcmp (code, "400") != 0); + code = wocky_node_get_attribute (node, "code"); + g_assert (!(code == NULL || strcmp (code, "400") != 0)); - type = gibber_xmpp_node_get_attribute (node, "type"); - fail_if (type == NULL || strcmp (type, "modify") != 0); + type = wocky_node_get_attribute (node, "type"); + g_assert (!(type == NULL || strcmp (type, "modify") != 0)); - fail_if (gibber_xmpp_node_get_child_ns (node, "bad-request", - "urn:ietf:params:xml:ns:xmpp-stanzas") == NULL); + g_assert (wocky_node_get_child_ns (node, "bad-request", + "urn:ietf:params:xml:ns:xmpp-stanzas") != NULL); g_object_unref (stanza); } @@ -64,77 +61,85 @@ test_xmpp_error_to_node_with_bad_request (void) static void test_xmpp_error_to_node_with_si_bad_profile (void) { - GibberXmppStanza *stanza; - GibberXmppNode *node; + WockyStanza *stanza; + WockyNode *node; const gchar *code; const gchar *type; - stanza = gibber_xmpp_stanza_build ( - GIBBER_STANZA_TYPE_IQ, GIBBER_STANZA_SUB_TYPE_ERROR, + stanza = wocky_stanza_build ( + WOCKY_STANZA_TYPE_IQ, WOCKY_STANZA_SUB_TYPE_ERROR, "from", "to", - GIBBER_STANZA_END); + NULL); node = gibber_xmpp_error_to_node (XMPP_ERROR_SI_BAD_PROFILE, wocky_stanza_get_top_node (stanza), NULL); - fail_if (node == NULL); - fail_if (strcmp (node->name, "error") != 0); + g_assert (node != NULL); + g_assert_cmpstr (node->name, ==, "error"); - code = gibber_xmpp_node_get_attribute (node, "code"); - fail_if (code == NULL || strcmp (code, "400") != 0); + code = wocky_node_get_attribute (node, "code"); + g_assert (!(code == NULL || strcmp (code, "400") != 0)); - type = gibber_xmpp_node_get_attribute (node, "type"); - fail_if (type == NULL || strcmp (type, "modify") != 0); + type = wocky_node_get_attribute (node, "type"); + g_assert (!(type == NULL || strcmp (type, "modify") != 0)); - fail_if (gibber_xmpp_node_get_child_ns (node, "bad-request", - "urn:ietf:params:xml:ns:xmpp-stanzas") == NULL); + g_assert (wocky_node_get_child_ns (node, "bad-request", + "urn:ietf:params:xml:ns:xmpp-stanzas") != NULL); - fail_if (gibber_xmpp_node_get_child_ns (node, "bad-profile", - "http://jabber.org/protocol/si") == NULL); + g_assert (wocky_node_get_child_ns (node, "bad-profile", + "http://jabber.org/protocol/si") != NULL); g_object_unref (stanza); } -START_TEST (test_xmpp_error_to_node) +static void +test_xmpp_error_to_node (void) { test_xmpp_error_to_node_with_bad_request (); test_xmpp_error_to_node_with_si_bad_profile (); -} END_TEST +} -START_TEST (test_message_get_xmpp_error) +static void +test_message_get_xmpp_error (void) { GibberXmppError xmpp_error; for (xmpp_error = 1; xmpp_error < NUM_XMPP_ERRORS; xmpp_error++) { - GibberXmppStanza *stanza; + WockyStanza *stanza; GError *error = NULL; - stanza = gibber_xmpp_stanza_build ( - GIBBER_STANZA_TYPE_IQ, GIBBER_STANZA_SUB_TYPE_ERROR, + stanza = wocky_stanza_build ( + WOCKY_STANZA_TYPE_IQ, WOCKY_STANZA_SUB_TYPE_ERROR, "from", "to", - GIBBER_STANZA_END); + NULL); gibber_xmpp_error_to_node (xmpp_error, wocky_stanza_get_top_node (stanza), NULL); error = gibber_message_get_xmpp_error (stanza); - fail_if (error == NULL); + g_assert (error != NULL); - fail_if (error->domain != GIBBER_XMPP_ERROR); - fail_if (error->code != (gint) xmpp_error); - fail_if (strcmp (error->message, gibber_xmpp_error_description ( - xmpp_error)) != 0); + g_assert (error->domain == GIBBER_XMPP_ERROR); + g_assert (error->code == (gint) xmpp_error); + g_assert_cmpstr (error->message, ==, + gibber_xmpp_error_description (xmpp_error)); g_object_unref (stanza); g_error_free (error); } -} END_TEST +} -TCase * -make_gibber_xmpp_error_tcase (void) +int +main (int argc, + char **argv) { - TCase *tc = tcase_create ("XMPP Error"); - tcase_add_test (tc, test_xmpp_error_to_node); - tcase_add_test (tc, test_message_get_xmpp_error); - return tc; + g_test_init (&argc, &argv, NULL); + g_type_init (); + + g_test_add_func ("/gibber/xmpp-error/to-node", + test_xmpp_error_to_node); + g_test_add_func ("/gibber/xmpp-error/message-get-xmpp-error", + test_message_get_xmpp_error); + + return g_test_run (); } diff --git a/lib/gibber/tests/check-gibber-xmpp-node.c b/lib/gibber/tests/check-gibber-xmpp-node.c deleted file mode 100644 index e7663ff8..00000000 --- a/lib/gibber/tests/check-gibber-xmpp-node.c +++ /dev/null @@ -1,146 +0,0 @@ -#include <stdlib.h> -#include <stdio.h> -#include <string.h> - -#include <gibber/gibber-xmpp-node.h> - -#include <check.h> -#include "check-helpers.h" -#include "check-gibber.h" - -START_TEST (test_instantiation) -{ - GibberXmppNode *node; - node = gibber_xmpp_node_new_ns ("test", "http://example.com/badgers/"); - fail_unless (node != NULL); - - gibber_xmpp_node_free (node); -} -END_TEST - -START_TEST (test_language) -{ - GibberXmppNode *node; - const gchar *lang; - - node = gibber_xmpp_node_new_ns ("test", "http://example.com/badgers/"); - lang = gibber_xmpp_node_get_language (node); - fail_unless (lang == NULL); - - gibber_xmpp_node_set_language (node, "en"); - lang = gibber_xmpp_node_get_language (node); - fail_unless (strcmp (lang, "en") == 0); - - gibber_xmpp_node_set_language (node, NULL); - lang = gibber_xmpp_node_get_language (node); - fail_unless (lang == NULL); - - gibber_xmpp_node_set_language_n (node, "en-US", 2); - lang = gibber_xmpp_node_get_language (node); - fail_unless (strcmp (lang, "en") == 0); - - gibber_xmpp_node_set_language_n (node, NULL, 2); - lang = gibber_xmpp_node_get_language (node); - fail_unless (lang == NULL); - - gibber_xmpp_node_free (node); -} -END_TEST - -START_TEST (test_namespace) -{ - GibberXmppNode *node; - const gchar *ns; - - node = gibber_xmpp_node_new_ns ("test", "foo"); - ns = gibber_xmpp_node_get_ns (node); - fail_unless (strcmp (ns, "foo") == 0); - gibber_xmpp_node_free (node); -} -END_TEST - - -START_TEST (test_attribute) -{ - GibberXmppNode *node; - const gchar *attribute; - - node = gibber_xmpp_node_new_ns ("test", "about:blank"); - - attribute = gibber_xmpp_node_get_attribute (node, "foo"); - fail_unless (attribute == NULL); - - attribute = gibber_xmpp_node_get_attribute (node, NULL); - fail_unless (attribute == NULL); - - attribute = gibber_xmpp_node_get_attribute_ns (node, "foo", "bar"); - fail_unless (attribute == NULL); - - gibber_xmpp_node_set_attribute (node, "foo", "baz"); - - attribute = gibber_xmpp_node_get_attribute (node, "foo"); - fail_unless (strcmp ( attribute, "baz") == 0); - - attribute = gibber_xmpp_node_get_attribute_ns (node, "foo", "bar"); - fail_unless (attribute == NULL); - - gibber_xmpp_node_set_attribute_ns (node, "foobar", "barbaz", "bar"); - - attribute = gibber_xmpp_node_get_attribute (node, "foobar"); - fail_unless (strcmp (attribute, "barbaz") == 0); - - attribute = gibber_xmpp_node_get_attribute_ns (node, "foobar", "bar"); - fail_unless (strcmp (attribute, "barbaz") == 0); - - attribute = gibber_xmpp_node_get_attribute_ns (node, "barfoo", "bar"); - fail_unless (attribute == NULL); - - gibber_xmpp_node_free (node); -} -END_TEST - -START_TEST (test_child) -{ - GibberXmppNode *node, *child; - - node = gibber_xmpp_node_new_ns ("test", "about:blank"); - - child = gibber_xmpp_node_get_child (node, "foo"); - fail_unless (child == NULL); - - gibber_xmpp_node_add_child (node, "foo"); - child = gibber_xmpp_node_get_child (node, "foo"); - fail_if (child == NULL); - fail_unless (strcmp (child->name, "foo") == 0); - - child = gibber_xmpp_node_get_child_ns (node, "foo", "bar"); - fail_unless (child == NULL); - - gibber_xmpp_node_add_child_ns (node, "foobar", "bar"); - child = gibber_xmpp_node_get_child_ns (node, "foobar", "foo"); - fail_unless (child == NULL); - child = gibber_xmpp_node_get_child_ns (node, "foobar", "bar"); - fail_if (child == NULL); - fail_unless (strcmp (child->name, "foobar") == 0); - - gibber_xmpp_node_add_child_with_content (node, "foo2", "blah"); - child = gibber_xmpp_node_get_child (node, "foo2"); - fail_if (child->content == NULL); - fail_unless (strcmp (child->content, "blah") == 0); - - gibber_xmpp_node_free (node); -} -END_TEST - - -TCase * -make_gibber_xmpp_node_tcase (void) -{ - TCase *tc = tcase_create ("XMPP Node"); - tcase_add_test (tc, test_instantiation); - tcase_add_test (tc, test_language); - tcase_add_test (tc, test_namespace); - tcase_add_test (tc, test_attribute); - tcase_add_test (tc, test_child); - return tc; -} diff --git a/lib/gibber/tests/check-gibber-xmpp-reader.c b/lib/gibber/tests/check-gibber-xmpp-reader.c index 43b60d1b..42bf9930 100644 --- a/lib/gibber/tests/check-gibber-xmpp-reader.c +++ b/lib/gibber/tests/check-gibber-xmpp-reader.c @@ -3,28 +3,24 @@ #include <string.h> #include <gibber/gibber-xmpp-reader.h> -#include <gibber/gibber-xmpp-stanza.h> - -#include <check.h> - -#include "check-gibber.h" +#include <wocky/wocky-stanza.h> typedef struct _ReceivedStanzaEvent ReceivedStanzaEvent; struct _ReceivedStanzaEvent { GibberXmppReader *reader; - GibberXmppStanza *stanza; + WockyStanza *stanza; }; static void received_stanza_cb (GibberXmppReader *reader, - GibberXmppStanza *stanza, gpointer user_data) + WockyStanza *stanza, gpointer user_data) { GQueue *events_queue = (GQueue *) user_data; ReceivedStanzaEvent *event; - fail_if (reader == NULL); - fail_if (stanza == NULL); - fail_if (events_queue == NULL); + g_assert (reader != NULL); + g_assert (stanza != NULL); + g_assert (events_queue != NULL); g_object_ref (stanza); @@ -36,19 +32,20 @@ static void received_stanza_cb (GibberXmppReader *reader, } -START_TEST (test_instantiation) +static void +test_instantiation (void) { GibberXmppReader *reader; reader = gibber_xmpp_reader_new_no_stream (); - fail_if (reader == NULL); + g_assert (reader != NULL); g_object_unref (reader); } -END_TEST -START_TEST (test_simple_message) +static void +test_simple_message (void) { GibberXmppReader *reader; - GibberXmppNode *node; + WockyNode *node; gchar *data; gsize length; gboolean valid; @@ -73,41 +70,39 @@ START_TEST (test_simple_message) file = g_strdup_printf ("%s/inputs/simple-message.input", srcdir); } - fail_unless (g_file_get_contents (file, &data, &length, NULL)); + g_assert (g_file_get_contents (file, &data, &length, NULL)); g_free (file); valid = gibber_xmpp_reader_push (reader, (guint8 *) data, length, NULL); - fail_unless (valid); + g_assert (valid); - fail_unless (g_queue_get_length (received_stanzas) == 2); + g_assert (g_queue_get_length (received_stanzas) == 2); event = g_queue_pop_head (received_stanzas); - fail_unless (event->reader == reader); + g_assert (event->reader == reader); node = wocky_stanza_get_top_node (event->stanza); - fail_if (node == NULL); - fail_unless (strcmp (node->name, "message") == 0); - fail_unless (strcmp (gibber_xmpp_node_get_language (node), "en") == 0); - fail_unless (strcmp (gibber_xmpp_node_get_attribute (node, "to"), - "juliet@example.com") == 0); - fail_unless (strcmp (gibber_xmpp_node_get_attribute (node, "id"), - "0") == 0); + g_assert (node != NULL); + g_assert_cmpstr (node->name, ==, "message"); + g_assert_cmpstr (wocky_node_get_language (node), ==, "en"); + g_assert_cmpstr (wocky_node_get_attribute (node, "to"), ==, + "juliet@example.com"); + g_assert_cmpstr (wocky_node_get_attribute (node, "id"), ==, "0"); g_object_unref (event->stanza); g_free (event); event = g_queue_pop_head (received_stanzas); - fail_unless (event->reader == reader); + g_assert (event->reader == reader); node = wocky_stanza_get_top_node (event->stanza); - fail_unless (strcmp (node->name, "message") == 0); - fail_unless (strcmp (gibber_xmpp_node_get_language (node), "en") == 0); - fail_unless (strcmp (gibber_xmpp_node_get_attribute (node, "to"), - "juliet@example.com") == 0); - fail_unless (strcmp (gibber_xmpp_node_get_attribute (node, "id"), - "1") == 0); + g_assert_cmpstr (node->name, ==, "message"); + g_assert_cmpstr (wocky_node_get_language (node), ==, "en"); + g_assert_cmpstr (wocky_node_get_attribute (node, "to"), ==, + "juliet@example.com"); + g_assert_cmpstr (wocky_node_get_attribute (node, "id"), ==, "1"); g_free (data); g_queue_free (received_stanzas); @@ -115,13 +110,18 @@ START_TEST (test_simple_message) g_free (event); g_object_unref (reader); } -END_TEST -TCase * -make_gibber_xmpp_reader_tcase (void) +int +main (int argc, + char **argv) { - TCase *tc = tcase_create ("XMPP Reader"); - tcase_add_test (tc, test_instantiation); - tcase_add_test (tc, test_simple_message); - return tc; + g_test_init (&argc, &argv, NULL); + g_type_init (); + + g_test_add_func ("/gibber/xmpp-reader/instantiation", + test_instantiation); + g_test_add_func ("/gibber/xmpp-reader/simple-message", + test_simple_message); + + return g_test_run (); } diff --git a/lib/gibber/tests/check-gibber-xmpp-stanza.c b/lib/gibber/tests/check-gibber-xmpp-stanza.c deleted file mode 100644 index dae2ab2f..00000000 --- a/lib/gibber/tests/check-gibber-xmpp-stanza.c +++ /dev/null @@ -1,168 +0,0 @@ -/* - * check-gibber-xmpp-stanza.c - Test for gibber-xmpp-stanza functions - * Copyright (C) 2007 Collabora Ltd. - * @author Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> - * - * 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 <gibber/gibber-xmpp-stanza.h> - -#define DEBUG_FLAG DEBUG_XMPP -#include <gibber/gibber-debug.h> - -#include <wocky/wocky-namespaces.h> - -#include <check.h> -#include "check-gibber.h" - -START_TEST (test_build_with_html_message) -{ - GibberXmppStanza *stanza; - const gchar *body = "Telepathy rocks!", - *xhtml_ns = "http://www.w3.org/1999/xhtml"; - GibberXmppNode *node; - const gchar *value; - - g_type_init (); -#ifdef ENABLE_DEBUG - gibber_debug_set_flags_from_env (); -#endif - - stanza = gibber_xmpp_stanza_build ( - GIBBER_STANZA_TYPE_MESSAGE, GIBBER_STANZA_SUB_TYPE_NONE, - "alice@collabora.co.uk", "bob@collabora.co.uk", - GIBBER_NODE, "html", - GIBBER_NODE_XMLNS, xhtml_ns, - GIBBER_NODE, "body", - GIBBER_NODE_ATTRIBUTE, "textcolor", "red", - GIBBER_NODE_TEXT, body, - GIBBER_NODE_END, - GIBBER_NODE_END, - GIBBER_STANZA_END); - - DEBUG_STANZA (stanza, "check"); - - fail_if (stanza == NULL); - /* <message> */ - node = wocky_stanza_get_top_node (stanza); - fail_if (node == NULL); - fail_unless (strcmp (node->name, "message") == 0); - value = gibber_xmpp_node_get_attribute (node, "type"); - fail_unless (value == NULL); - value = gibber_xmpp_node_get_attribute (node, "from"); - fail_unless (strcmp (value, "alice@collabora.co.uk") == 0); - value = gibber_xmpp_node_get_attribute (node, "to"); - fail_unless (strcmp (value, "bob@collabora.co.uk") == 0); - - /* <html> */ - node = gibber_xmpp_node_get_child_ns (node, "html", xhtml_ns); - fail_if (node == NULL); - - /* <body> */ - node = gibber_xmpp_node_get_child (node, "body"); - fail_if (node == NULL); - value = gibber_xmpp_node_get_attribute (node, "textcolor"); - fail_unless (strcmp (value, "red") == 0); - fail_unless (strcmp (node->content, body) == 0); - - g_object_unref (stanza); -} END_TEST - -START_TEST (test_get_type_info_with_simple_message) -{ - GibberXmppStanza *stanza; - GibberStanzaType type; - GibberStanzaSubType sub_type; - - stanza = gibber_xmpp_stanza_build ( - GIBBER_STANZA_TYPE_MESSAGE, GIBBER_STANZA_SUB_TYPE_NONE, - "alice@collabora.co.uk", "bob@collabora.co.uk", - GIBBER_STANZA_END); - fail_if (stanza == NULL); - - gibber_xmpp_stanza_get_type_info (stanza, &type, &sub_type); - fail_if (type != GIBBER_STANZA_TYPE_MESSAGE); - fail_if (sub_type != GIBBER_STANZA_SUB_TYPE_NONE); - - g_object_unref (stanza); -} END_TEST - -START_TEST (test_get_type_info_with_iq_set) -{ - GibberXmppStanza *stanza; - GibberStanzaType type; - GibberStanzaSubType sub_type; - - stanza = gibber_xmpp_stanza_build ( - GIBBER_STANZA_TYPE_IQ, GIBBER_STANZA_SUB_TYPE_SET, - "alice@collabora.co.uk", "bob@collabora.co.uk", - GIBBER_STANZA_END); - fail_if (stanza == NULL); - - gibber_xmpp_stanza_get_type_info (stanza, &type, &sub_type); - fail_if (type != GIBBER_STANZA_TYPE_IQ); - fail_if (sub_type != GIBBER_STANZA_SUB_TYPE_SET); - - g_object_unref (stanza); -} END_TEST - -START_TEST (test_get_type_info_with_unknown_type) -{ - GibberXmppStanza *stanza; - GibberStanzaType type; - - stanza = gibber_xmpp_stanza_new_ns ("goat", WOCKY_XMPP_NS_JABBER_CLIENT); - fail_if (stanza == NULL); - - gibber_xmpp_stanza_get_type_info (stanza, &type, NULL); - fail_if (type != GIBBER_STANZA_TYPE_UNKNOWN); - - g_object_unref (stanza); -} END_TEST - -START_TEST (test_get_type_info_with_unknown_sub_type) -{ - GibberXmppStanza *stanza; - GibberStanzaSubType sub_type; - - stanza = gibber_xmpp_stanza_new_ns ("iq", WOCKY_XMPP_NS_JABBER_CLIENT); - fail_if (stanza == NULL); - gibber_xmpp_node_set_attribute (wocky_stanza_get_top_node (stanza), - "type", "goat"); - - gibber_xmpp_stanza_get_type_info (stanza, NULL, &sub_type); - fail_if (sub_type != GIBBER_STANZA_SUB_TYPE_UNKNOWN); - - g_object_unref (stanza); -} END_TEST - - -TCase * -make_gibber_xmpp_stanza_tcase (void) -{ - TCase *tc = tcase_create ("XMPP Stanza"); - tcase_add_test (tc, test_build_with_html_message); - tcase_add_test (tc, test_get_type_info_with_simple_message); - tcase_add_test (tc, test_get_type_info_with_iq_set); - tcase_add_test (tc, test_get_type_info_with_unknown_type); - tcase_add_test (tc, test_get_type_info_with_unknown_sub_type); - return tc; -} diff --git a/lib/gibber/tests/check-gibber.h b/lib/gibber/tests/check-gibber.h deleted file mode 100644 index d98d3d08..00000000 --- a/lib/gibber/tests/check-gibber.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef __CHECK_GIBBER_H__ -#define __CHECK_GIBBER_H__ - -#include <check.h> - -TCase *make_gibber_xmpp_node_tcase (void); -TCase *make_gibber_xmpp_reader_tcase (void); -TCase *make_gibber_xmpp_connection_tcase (void); -TCase *make_gibber_r_multicast_packet_tcase (void); -TCase *make_gibber_r_multicast_causal_transport_tcase (void); -TCase *make_gibber_r_multicast_sender_tcase (void); -TCase *make_gibber_xmpp_stanza_tcase (void); -TCase *make_gibber_iq_helper_tcase (void); -TCase *make_gibber_listener_tcase (void); -TCase *make_gibber_xmpp_connection_listener_tcase (void); -TCase *make_gibber_xmpp_error_tcase (void); -TCase *make_gibber_unix_transport_tcase (void); - -#endif /* #ifndef __CHECK_GIBBER_H__ */ diff --git a/lib/gibber/tests/check-helpers.c b/lib/gibber/tests/check-helpers.c deleted file mode 100644 index 86ef1154..00000000 --- a/lib/gibber/tests/check-helpers.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - * check-helpers.c - Source for some check helpers - * Copyright (C) 2007 Collabora Ltd. - * - * 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 "check-helpers.h" - -static gboolean expecting_critical = FALSE; -static gboolean received_critical = FALSE; - -static void -check_helper_log_critical_func (const gchar *log_damain, - GLogLevelFlags log_level, - const gchar *message, - gpointer user_data) -{ - - if (!expecting_critical) - { - fail ("Unexpected critical message: %s\n", message); - } - - g_assert (log_level & G_LOG_LEVEL_CRITICAL); - - received_critical = TRUE; -} - -gboolean -got_critical (void) -{ - return received_critical; -} - -void -expect_critical (gboolean expected) -{ - expecting_critical = expected; - received_critical = FALSE; -} - -void -check_helpers_init (void) -{ - g_log_set_handler (NULL, G_LOG_LEVEL_CRITICAL, - check_helper_log_critical_func, NULL); -} diff --git a/lib/gibber/tests/check-helpers.h b/lib/gibber/tests/check-helpers.h deleted file mode 100644 index b71b3b65..00000000 --- a/lib/gibber/tests/check-helpers.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * check-helpers.c - Source for some check helpers - * Copyright (C) 2007 Collabora Ltd. - * - * 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 - */ -#ifndef __CHECK_HELPERS_H__ -#define __CHECK_HELPERS_H__ - -#include <glib.h> -#include <check.h> - -void -check_helpers_init (void); - -void -expect_critical (gboolean expected); - -gboolean -got_critical (void); - -#define fail_unless_critical(expr, ...) \ -G_STMT_START { \ - expect_critical (TRUE); \ - expr; \ - _fail_unless (got_critical (), __FILE__, __LINE__, \ - "Expected g_critical, got none", ## __VA_ARGS__, NULL); \ - expect_critical (FALSE); \ -} G_STMT_END; - -#endif /* #ifndef __CHECK_HELPERS_H__ */ diff --git a/lib/gibber/tests/check-main.c b/lib/gibber/tests/check-main.c deleted file mode 100644 index 075e250a..00000000 --- a/lib/gibber/tests/check-main.c +++ /dev/null @@ -1,55 +0,0 @@ -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <glib-object.h> - -#include <wocky/wocky.h> - -#include <check.h> - -#include "check-gibber.h" -#include "check-helpers.h" - -#include "config.h" - -static Suite * -make_gibber_suite (void) -{ - Suite *s = suite_create ("Gibber"); - - suite_add_tcase (s, make_gibber_xmpp_node_tcase ()); - suite_add_tcase (s, make_gibber_xmpp_reader_tcase ()); - suite_add_tcase (s, make_gibber_xmpp_connection_tcase ()); - suite_add_tcase (s, make_gibber_r_multicast_packet_tcase ()); - suite_add_tcase (s, make_gibber_r_multicast_sender_tcase ()); - suite_add_tcase (s, make_gibber_r_multicast_causal_transport_tcase ()); - suite_add_tcase (s, make_gibber_xmpp_stanza_tcase ()); - suite_add_tcase (s, make_gibber_iq_helper_tcase ()); - suite_add_tcase (s, make_gibber_listener_tcase ()); - suite_add_tcase (s, make_gibber_xmpp_connection_listener_tcase ()); - suite_add_tcase (s, make_gibber_xmpp_error_tcase ()); - suite_add_tcase (s, make_gibber_unix_transport_tcase ()); - - return s; -} - -int -main (void) -{ - int number_failed = 0; - Suite *s; - SRunner *sr; - - check_helpers_init (); - g_type_init (); - wocky_init (); - - s = make_gibber_suite (); - sr = srunner_create (s); - srunner_run_all (sr, CK_NORMAL); - number_failed += srunner_ntests_failed (sr); - srunner_free (sr); - - wocky_deinit (); - return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; -} diff --git a/lib/gibber/tests/test-xmpp-connection.c b/lib/gibber/tests/test-xmpp-connection.c deleted file mode 100644 index b957f718..00000000 --- a/lib/gibber/tests/test-xmpp-connection.c +++ /dev/null @@ -1,160 +0,0 @@ -#include <stdio.h> -#include <unistd.h> -#include <glib.h> - -#include <gibber/gibber-xmpp-connection.h> -#include <gibber/gibber-transport.h> -#include <wocky/wocky.h> -#include "test-transport.h" - -#define BUFSIZE 10 - -FILE *treefile = NULL; -FILE *xmlfile = NULL; -gboolean parsing_failed = FALSE; - -static gboolean -send_hook (GibberTransport *transport, const guint8 *data, - gsize length, GError **error, gpointer user_data) -{ - size_t written; - /* Nothing for now */ - written = fwrite (data, 1, length, xmlfile); - g_assert (written == length); - return TRUE; -} - -static void -parse_error (GibberXmppConnection *connection, gpointer user_data) -{ - fprintf (treefile, "PARSE ERROR\n"); - fprintf (stderr, "PARSING FAILED\n"); - parsing_failed = TRUE; -} - -static void -stream_opened (GibberXmppConnection *connection, const gchar *to, - const gchar *from, const gchar *version, gpointer user_data) -{ - fprintf (treefile, "STREAM OPENED to=%s from=%s version=%s\n", to, from, - version); - - gibber_xmpp_connection_open (connection, to, from, version); -} - -static void -stream_closed (GibberXmppConnection *connection, gpointer user_data) -{ - fprintf (treefile, "STREAM CLOSED\n"); - gibber_xmpp_connection_close (connection); -} - -static gboolean -print_attribute (const gchar *key, const gchar *value, const gchar *pref, - const gchar *ns, gpointer user_data) -{ - fprintf (treefile, "%*s |-- Attribute: %s -> %s (ns: %s)\n", - GPOINTER_TO_INT (user_data), " ", key, value, ns); - return TRUE; -} - -static void print_node (GibberXmppNode *node, gint ident); - -static gboolean -print_child (GibberXmppNode *node, gpointer user_data) -{ - print_node (node, GPOINTER_TO_INT(user_data)); - return TRUE; -} - -static void -print_node (GibberXmppNode *node, gint ident) -{ - fprintf (treefile, "%*s`-+-- Name: %s (ns: %s)\n", ident - 1, " ", - node->name, gibber_xmpp_node_get_ns (node)); - wocky_node_each_attribute (node, print_attribute, - GINT_TO_POINTER(ident)); - - if (node->content) - fprintf (treefile, "%*s |-- Content: %s\n", ident, " ", node->content); - if (gibber_xmpp_node_get_language (node)) - fprintf (treefile, "%*s |-- Language: %s\n", ident, " ", - gibber_xmpp_node_get_language (node)); - - gibber_xmpp_node_each_child (node, print_child, GINT_TO_POINTER (ident + 2)); -} - -static void -received_stanza (GibberXmppConnection *connection, GibberXmppStanza *stanza, - gpointer user_data) -{ - fprintf (treefile, "-|\n"); - print_node (wocky_stanza_get_top_node (stanza), 2); - g_assert (gibber_xmpp_connection_send (connection, stanza, NULL)); -} - -int -main (int argc, char **argv) -{ - GibberXmppConnection *connection; - TestTransport *transport; - FILE *file; - int ret = 0; - guint8 buf[BUFSIZE]; - - - g_type_init (); - wocky_init (); - - transport = test_transport_new (send_hook, NULL); - connection = gibber_xmpp_connection_new (GIBBER_TRANSPORT(transport)); - - g_signal_connect (connection, "parse-error", - G_CALLBACK (parse_error), NULL); - g_signal_connect (connection, "stream-opened", - G_CALLBACK (stream_opened), NULL); - g_signal_connect (connection, "stream-closed", - G_CALLBACK (stream_closed), NULL); - g_signal_connect (connection, "received-stanza", - G_CALLBACK (received_stanza), NULL); - - g_assert (argc >= 2 && argc < 5); - - file = fopen (argv[1], "r"); - g_assert (file != NULL); - - if (argc >= 3) - { - treefile = fopen (argv[2], "w+"); - } - else - { - treefile = stdout; - } - g_assert (treefile != NULL); - - if (argc >= 4) - { - xmlfile = fopen (argv[3], "w+"); - } - else - { - xmlfile = stderr; - } - g_assert (xmlfile != NULL); - - while (!parsing_failed && (ret = fread (buf, 1, BUFSIZE, file)) > 0) - { - test_transport_write (transport, buf, ret); - } - - while (g_main_context_iteration (NULL, FALSE)) - ; - - - g_assert (parsing_failed || ret == 0); - fclose (file); - - wocky_deinit (); - return parsing_failed ? 1 : 0; -} |