[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