[Telepathy-commits] [telepathy-salut/master] GibberIqHelper: Change the API to be able to reply to a iq request after the request stanza has been freed
Alban Crequy
alban.crequy at collabora.co.uk
Tue Nov 25 03:59:28 PST 2008
---
lib/gibber/gibber-iq-helper.c | 52 ++++++++++++++++++++++++++----------
lib/gibber/gibber-iq-helper.h | 10 +++++-
src/salut-si-bytestream-manager.c | 6 +++-
src/salut-tubes-manager.c | 6 +++-
tests/check-gibber-iq-helper.c | 14 ++++++---
5 files changed, 62 insertions(+), 26 deletions(-)
diff --git a/lib/gibber/gibber-iq-helper.c b/lib/gibber/gibber-iq-helper.c
index aa863cc..a3cb8cd 100644
--- a/lib/gibber/gibber-iq-helper.c
+++ b/lib/gibber/gibber-iq-helper.c
@@ -50,6 +50,13 @@ struct _GibberIqHelperPrivate
#define GIBBER_IQ_HELPER_GET_PRIVATE(obj) \
((GibberIqHelperPrivate *) ((GibberIqHelper *)obj)->priv)
+struct _GibberIqHelperRequestStanza
+{
+ gchar *from;
+ gchar *to;
+ gchar *id;
+};
+
static void
reply_handler_object_destroy_notify_cb (gpointer _data, GObject *object);
@@ -347,15 +354,35 @@ gibber_iq_helper_send_with_reply (GibberIqHelper *self,
}
static GibberXmppStanza *
-new_reply (GibberXmppStanza *iq,
+new_reply (GibberIqHelperRequestStanza *iq,
GibberStanzaSubType sub_type)
{
GibberXmppStanza *reply;
- 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);
+
+ reply = gibber_xmpp_stanza_build (GIBBER_STANZA_TYPE_IQ,
+ sub_type,
+ iq->to, iq->from,
+ GIBBER_NODE_ATTRIBUTE, "id", iq->id,
+ GIBBER_STANZA_END);
+
+ g_free (iq->from);
+ g_free (iq->to);
+ g_free (iq->id);
+ g_free (iq);
+
+ return reply;
+}
+
+GibberIqHelperRequestStanza *
+gibber_iq_helper_get_request_stanza (GibberXmppStanza *iq)
+{
+ GibberIqHelperRequestStanza *req;
+ const gchar *id;
+ const gchar *iq_from, *iq_to;
+
g_return_val_if_fail (strcmp (iq->node->name, "iq") == 0, NULL);
id = gibber_xmpp_node_get_attribute (iq->node, "id");
@@ -364,23 +391,21 @@ new_reply (GibberXmppStanza *iq,
iq_from = gibber_xmpp_node_get_attribute (iq->node, "from");
iq_to = gibber_xmpp_node_get_attribute (iq->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;
+ req = g_new0 (GibberIqHelperRequestStanza, 1);
+ req->to = g_strdup (iq_to);
+ req->from = g_strdup (iq_from);
+ req->id = g_strdup (id);
+ return req;
}
GibberXmppStanza *
-gibber_iq_helper_new_result_reply (GibberXmppStanza *iq)
+gibber_iq_helper_new_result_reply (GibberIqHelperRequestStanza *iq)
{
return new_reply (iq, GIBBER_STANZA_SUB_TYPE_RESULT);
}
GibberXmppStanza *
-gibber_iq_helper_new_error_reply (GibberXmppStanza *iq,
+gibber_iq_helper_new_error_reply (GibberIqHelperRequestStanza *iq,
GibberXmppError error,
const gchar *errmsg)
{
@@ -388,8 +413,5 @@ gibber_iq_helper_new_error_reply (GibberXmppStanza *iq,
stanza = new_reply (iq, GIBBER_STANZA_SUB_TYPE_ERROR);
gibber_xmpp_error_to_node (error, stanza->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
index dc3648c..2c66cb6 100644
--- a/lib/gibber/gibber-iq-helper.h
+++ b/lib/gibber/gibber-iq-helper.h
@@ -31,6 +31,8 @@ G_BEGIN_DECLS
typedef struct _GibberIqHelper GibberIqHelper;
typedef struct _GibberIqHelperClass GibberIqHelperClass;
+typedef struct _GibberIqHelperRequestStanza GibberIqHelperRequestStanza;
+
struct _GibberIqHelperClass
{
GObjectClass parent_class;
@@ -75,11 +77,15 @@ gibber_iq_helper_send_with_reply (GibberIqHelper *helper,
GibberXmppStanza *iq, GibberIqHelperStanzaReplyFunc reply_func,
GObject *object, gpointer user_data, GError **error);
+GibberIqHelperRequestStanza *
+gibber_iq_helper_get_request_stanza (GibberXmppStanza *iq);
+
GibberXmppStanza *
-gibber_iq_helper_new_result_reply (GibberXmppStanza *iq);
+gibber_iq_helper_new_result_reply (GibberIqHelperRequestStanza *iq);
GibberXmppStanza *
-gibber_iq_helper_new_error_reply (GibberXmppStanza *iq, GibberXmppError error,
+gibber_iq_helper_new_error_reply (GibberIqHelperRequestStanza *iq,
+ GibberXmppError error,
const gchar *errmsg);
G_END_DECLS
diff --git a/src/salut-si-bytestream-manager.c b/src/salut-si-bytestream-manager.c
index e41a8f8..6b11d76 100644
--- a/src/salut-si-bytestream-manager.c
+++ b/src/salut-si-bytestream-manager.c
@@ -316,7 +316,8 @@ si_request_cb (SalutXmppConnectionManager *xcm,
{
GibberXmppStanza *reply;
- reply = gibber_iq_helper_new_error_reply (stanza, XMPP_ERROR_BAD_REQUEST,
+ reply = gibber_iq_helper_new_error_reply (
+ gibber_iq_helper_get_request_stanza (stanza), XMPP_ERROR_BAD_REQUEST,
"failed to parse SI request");
gibber_xmpp_connection_send (connection, reply, NULL);
@@ -344,7 +345,8 @@ si_request_cb (SalutXmppConnectionManager *xcm,
GibberXmppStanza *reply;
DEBUG ("SI request doesn't contain any supported stream method.");
- reply = gibber_iq_helper_new_error_reply (stanza,
+ reply = gibber_iq_helper_new_error_reply (
+ gibber_iq_helper_get_request_stanza (stanza),
XMPP_ERROR_SI_NO_VALID_STREAMS, NULL);
gibber_xmpp_connection_send (connection, reply, NULL);
diff --git a/src/salut-tubes-manager.c b/src/salut-tubes-manager.c
index 86e37ce..4c67175 100644
--- a/src/salut-tubes-manager.c
+++ b/src/salut-tubes-manager.c
@@ -313,7 +313,8 @@ iq_tube_request_cb (SalutXmppConnectionManager *xcm,
{
GibberXmppStanza *reply;
- reply = gibber_iq_helper_new_error_reply (stanza, XMPP_ERROR_BAD_REQUEST,
+ reply = gibber_iq_helper_new_error_reply (
+ gibber_iq_helper_get_request_stanza (stanza), XMPP_ERROR_BAD_REQUEST,
"failed to parse tube request");
gibber_xmpp_connection_send (conn, reply, NULL);
@@ -345,7 +346,8 @@ iq_tube_request_cb (SalutXmppConnectionManager *xcm,
parameters, tube_id, portnum);
}
- reply = gibber_iq_helper_new_result_reply (stanza);
+ reply = gibber_iq_helper_new_result_reply (
+ gibber_iq_helper_get_request_stanza (stanza));
gibber_xmpp_connection_send (conn, reply, NULL);
g_object_unref (reply);
diff --git a/tests/check-gibber-iq-helper.c b/tests/check-gibber-iq-helper.c
index edd664c..188c76e 100644
--- a/tests/check-gibber-iq-helper.c
+++ b/tests/check-gibber-iq-helper.c
@@ -254,7 +254,8 @@ START_TEST (test_new_result_reply)
NULL, NULL, NULL);
fail_unless (result);
- reply = gibber_iq_helper_new_result_reply (stanza);
+ reply = gibber_iq_helper_new_result_reply
+ (gibber_iq_helper_get_request_stanza (stanza));
fail_unless (reply != NULL);
fail_unless (strcmp (reply->node->name, "iq") == 0);
fail_unless (strcmp (gibber_xmpp_node_get_attribute (reply->node, "type"),
@@ -293,8 +294,9 @@ START_TEST (test_new_error_reply)
NULL, NULL, NULL);
fail_unless (result);
- reply = gibber_iq_helper_new_error_reply (stanza,
- XMPP_ERROR_BAD_REQUEST, "test");
+ reply = gibber_iq_helper_new_error_reply
+ (gibber_iq_helper_get_request_stanza (stanza),
+ XMPP_ERROR_BAD_REQUEST, "test");
fail_unless (reply != NULL);
fail_unless (strcmp (reply->node->name, "iq") == 0);
fail_unless (strcmp (gibber_xmpp_node_get_attribute (reply->node, "type"),
@@ -352,7 +354,8 @@ START_TEST (test_send_with_object_living)
object, NULL, NULL);
fail_unless (result);
- reply = gibber_iq_helper_new_result_reply (stanza);
+ reply = gibber_iq_helper_new_result_reply
+ (gibber_iq_helper_get_request_stanza (stanza));
fail_unless (reply != NULL);
result = gibber_xmpp_connection_send (xmpp_connection, reply, NULL);
fail_unless (result);
@@ -394,7 +397,8 @@ START_TEST (test_send_with_object_destroyed)
g_object_unref (object);
- reply = gibber_iq_helper_new_result_reply (stanza);
+ reply = gibber_iq_helper_new_result_reply
+ (gibber_iq_helper_get_request_stanza (stanza));
fail_unless (reply != NULL);
result = gibber_xmpp_connection_send (xmpp_connection, reply, NULL);
fail_unless (result);
--
1.5.6.5
More information about the Telepathy-commits
mailing list