[Telepathy-commits] [telepathy-gabble/master] Move publish_tube_in_node in tube-iface because it will be used both by GabbleTubesChannel and GabbleTubeStream/GabbleTubeDBus. Move send_new_stream_tube_msg in tube-stream.c. OfferStreamTube in Channel.Type.StreamTube will be implemented with it.

Alban Crequy alban.crequy at collabora.co.uk
Mon Nov 3 11:20:30 PST 2008


20080814142829-a41c0-deddf9425b6bc971219ca64b80cd33d975e5ee37.gz
---
 src/tube-iface.c    |   78 ++++++++++++++++++++++++++++
 src/tube-iface.h    |    6 ++-
 src/tube-stream.c   |   73 ++++++++++++++++++++++++---
 src/tube-stream.h   |    5 ++
 src/tubes-channel.c |  140 ++------------------------------------------------
 5 files changed, 159 insertions(+), 143 deletions(-)

diff --git a/src/tube-iface.c b/src/tube-iface.c
index 1c5b1f0..614f78b 100644
--- a/src/tube-iface.c
+++ b/src/tube-iface.c
@@ -21,6 +21,7 @@
 #include "tube-iface.h"
 
 #include "connection.h"
+#include "util.h"
 
 gboolean
 gabble_tube_iface_accept (GabbleTubeIface *self,
@@ -209,3 +210,80 @@ gabble_tube_iface_get_type (void)
 
   return type;
 }
+
+
+void
+gabble_tube_iface_publish_in_node (GabbleTubeIface *tube,
+                                   TpBaseConnection *conn,
+                                   LmMessageNode *node)
+{
+  LmMessageNode *parameters_node;
+  GHashTable *parameters;
+  TpTubeType type;
+  gchar *service, *id_str;
+  guint tube_id;
+  TpHandleRepoIface *contact_repo = tp_base_connection_get_handles (
+    conn, TP_HANDLE_TYPE_CONTACT);
+  TpHandle initiator_handle;
+
+  g_object_get (G_OBJECT (tube),
+      "type", &type,
+      "initiator", &initiator_handle,
+      "service", &service,
+      "parameters", &parameters,
+      "id", &tube_id,
+      NULL);
+
+  id_str = g_strdup_printf ("%u", tube_id);
+
+  lm_message_node_set_attributes (node,
+      "service", service,
+      "id", id_str,
+      NULL);
+
+  g_free (id_str);
+
+  switch (type)
+    {
+      case TP_TUBE_TYPE_DBUS:
+        {
+          gchar *name, *stream_id;
+
+          g_object_get (G_OBJECT (tube),
+              "stream-id", &stream_id,
+              "dbus-name", &name,
+              NULL);
+
+          lm_message_node_set_attributes (node,
+              "type", "dbus",
+              "stream-id", stream_id,
+              "initiator", tp_handle_inspect (contact_repo, initiator_handle),
+              NULL);
+
+          if (name != NULL)
+            lm_message_node_set_attribute (node, "dbus-name", name);
+
+          g_free (name);
+          g_free (stream_id);
+        }
+        break;
+      case TP_TUBE_TYPE_STREAM:
+        {
+          lm_message_node_set_attribute (node, "type", "stream");
+        }
+        break;
+      default:
+        {
+          g_return_if_reached ();
+        }
+    }
+
+  parameters_node = lm_message_node_add_child (node, "parameters",
+      NULL);
+  lm_message_node_add_children_from_properties (parameters_node, parameters,
+      "parameter");
+
+  g_free (service);
+  g_hash_table_unref (parameters);
+}
+
diff --git a/src/tube-iface.h b/src/tube-iface.h
index 97d203c..ced8165 100644
--- a/src/tube-iface.h
+++ b/src/tube-iface.h
@@ -1,6 +1,6 @@
 /*
  * tube-iface.h - Header for GabbleTube interface
- * Copyright (C) 2007 Collabora Ltd.
+ * Copyright (C) 2007-2008 Collabora Ltd.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -21,6 +21,7 @@
 #define __GABBLE_TUBE_IFACE_H__
 
 #include <glib-object.h>
+#include <telepathy-glib/base-connection.h>
 
 #include "bytestream-iface.h"
 
@@ -58,6 +59,9 @@ void gabble_tube_iface_close (GabbleTubeIface *tube);
 void gabble_tube_iface_add_bytestream (GabbleTubeIface *tube,
     GabbleBytestreamIface *bytestream);
 
+void gabble_tube_iface_publish_in_node (GabbleTubeIface *tube,
+    TpBaseConnection *conn, LmMessageNode *node);
+
 G_END_DECLS
 
 #endif /* #ifndef __GABBLE_TUBE_IFACE_H__ */
diff --git a/src/tube-stream.c b/src/tube-stream.c
index a53f59f..9c5c740 100644
--- a/src/tube-stream.c
+++ b/src/tube-stream.c
@@ -144,7 +144,7 @@ struct _GabbleTubeStreamPrivate
   TpHandle initiator;
   gchar *service;
   GHashTable *parameters;
-  TpTubeState state;
+  GabbleTubeChannelState state;
 
   TpSocketAddressType address_type;
   GValue *address;
@@ -1149,17 +1149,17 @@ gabble_tube_stream_constructor (GType type,
       if (priv->handle_type == TP_HANDLE_TYPE_CONTACT)
         {
           /* Private tube */
-          priv->state = TP_TUBE_STATE_REMOTE_PENDING;
+          priv->state = GABBLE_TUBE_CHANNEL_STATE_NOT_OFFERED;
         }
       else
         {
           /* Muc tube */
-          priv->state = TP_TUBE_STATE_OPEN;
+          priv->state = GABBLE_TUBE_CHANNEL_STATE_OPEN;
         }
     }
   else
     {
-      priv->state = TP_TUBE_STATE_LOCAL_PENDING;
+      priv->state = GABBLE_TUBE_CHANNEL_STATE_LOCAL_PENDING;
     }
 
   bus = tp_get_bus ();
@@ -1410,7 +1410,7 @@ gabble_tube_stream_accept (GabbleTubeIface *tube,
   GabbleTubeStream *self = GABBLE_TUBE_STREAM (tube);
   GabbleTubeStreamPrivate *priv = GABBLE_TUBE_STREAM_GET_PRIVATE (self);
 
-  if (priv->state != TP_TUBE_STATE_LOCAL_PENDING)
+  if (priv->state != GABBLE_TUBE_CHANNEL_STATE_LOCAL_PENDING)
     return TRUE;
 
   if (!tube_stream_open (self, error))
@@ -1419,7 +1419,7 @@ gabble_tube_stream_accept (GabbleTubeIface *tube,
       return FALSE;
     }
 
-  priv->state = TP_TUBE_STATE_OPEN;
+  priv->state = GABBLE_TUBE_CHANNEL_STATE_OPEN;
   g_signal_emit (G_OBJECT (self), signals[OPENED], 0);
   return TRUE;
 }
@@ -1520,10 +1520,10 @@ gabble_tube_stream_add_bytestream (GabbleTubeIface *tube,
     {
       TpHandle contact;
 
-      if (priv->state == TP_TUBE_STATE_REMOTE_PENDING)
+      if (priv->state == GABBLE_TUBE_CHANNEL_STATE_REMOTE_PENDING)
         {
           DEBUG ("Received first connection. Tube is now open");
-          priv->state = TP_TUBE_STATE_OPEN;
+          priv->state = GABBLE_TUBE_CHANNEL_STATE_OPEN;
           g_signal_emit (G_OBJECT (self), signals[OPENED], 0);
         }
 
@@ -1718,6 +1718,63 @@ gabble_tube_stream_check_params (TpSocketAddressType address_type,
     }
 }
 
+/* can be called both from the old tube API and the new tube API */
+gboolean gabble_tube_stream_offer (GabbleTubeStream *self,
+                                   guint address_type,
+                                   const GValue *address, guint access_control,
+                                   const GValue *access_control_param,
+                                   GError **error)
+{
+  GabbleTubeStreamPrivate *priv = GABBLE_TUBE_STREAM_GET_PRIVATE (self);
+  LmMessageNode *tube_node = NULL;
+  LmMessage *msg;
+  TpHandleRepoIface *contact_repo;
+  const gchar *jid;
+  gboolean result;
+
+  g_assert (priv->state == GABBLE_TUBE_CHANNEL_STATE_NOT_OFFERED);
+
+  contact_repo = tp_base_connection_get_handles (
+     (TpBaseConnection *) priv->conn, TP_HANDLE_TYPE_CONTACT);
+
+  jid = tp_handle_inspect (contact_repo, priv->handle);
+
+  msg = lm_message_build (jid, LM_MESSAGE_TYPE_MESSAGE,
+      '(', "tube", "",
+        '*', &tube_node,
+        '@', "xmlns", NS_TUBES,
+      ')',
+      '(', "amp", "",
+        '@', "xmlns", NS_AMP,
+        '(', "rule", "",
+          '@', "condition", "deliver-at",
+          '@', "value", "stored",
+          '@', "action", "error",
+        ')',
+        '(', "rule", "",
+          '@', "condition", "match-resource",
+          '@', "value", "exact",
+          '@', "action", "error",
+        ')',
+      ')',
+      NULL);
+
+  g_assert (tube_node != NULL);
+
+  gabble_tube_iface_publish_in_node (GABBLE_TUBE_IFACE (self),
+      (TpBaseConnection *) priv->conn, tube_node);
+
+  result = _gabble_connection_send (priv->conn, msg, error);
+  if (result)
+    {
+      priv->state = GABBLE_TUBE_CHANNEL_STATE_REMOTE_PENDING;
+    }
+
+  lm_message_unref (msg);
+  return result;
+}
+
+
 /**
  * gabble_tube_stream_offer_stream_tube
  *
diff --git a/src/tube-stream.h b/src/tube-stream.h
index 08d1efe..b873e3a 100644
--- a/src/tube-stream.h
+++ b/src/tube-stream.h
@@ -25,6 +25,7 @@
 #include <telepathy-glib/enums.h>
 
 #include "connection.h"
+#include "extensions/extensions.h"
 
 G_BEGIN_DECLS
 
@@ -71,6 +72,10 @@ gboolean gabble_tube_stream_check_params (TpSocketAddressType address_type,
     const GValue *address, TpSocketAccessControl access_control,
     const GValue *access_control_param, GError **error);
 
+gboolean gabble_tube_stream_offer (GabbleTubeStream *self, guint address_type,
+    const GValue *address, guint access_control,
+    const GValue *access_control_param, GError **error);
+
 G_END_DECLS
 
 #endif /* #ifndef __GABBLE_TUBE_STREAM_H__ */
diff --git a/src/tubes-channel.c b/src/tubes-channel.c
index 4587a0c..20b36b4 100644
--- a/src/tubes-channel.c
+++ b/src/tubes-channel.c
@@ -1016,83 +1016,6 @@ copy_parameter (gpointer key,
   g_hash_table_insert (parameters, g_strdup (prop), gvalue_copied);
 }
 
-static void
-publish_tube_in_node (GabbleTubesChannel *self,
-                      LmMessageNode *node,
-                      GabbleTubeIface *tube)
-{
-  LmMessageNode *parameters_node;
-  GHashTable *parameters;
-  TpTubeType type;
-  gchar *service, *id_str;
-  guint tube_id;
-  GabbleTubesChannelPrivate *priv =
-      GABBLE_TUBES_CHANNEL_GET_PRIVATE (self);
-  TpHandleRepoIface *contact_repo = tp_base_connection_get_handles (
-    (TpBaseConnection *) priv->conn, TP_HANDLE_TYPE_CONTACT);
-  TpHandle initiator_handle;
-
-  g_object_get (G_OBJECT (tube),
-      "type", &type,
-      "initiator", &initiator_handle,
-      "service", &service,
-      "parameters", &parameters,
-      "id", &tube_id,
-      NULL);
-
-  id_str = g_strdup_printf ("%u", tube_id);
-
-  lm_message_node_set_attributes (node,
-      "service", service,
-      "id", id_str,
-      NULL);
-
-  g_free (id_str);
-
-  switch (type)
-    {
-      case TP_TUBE_TYPE_DBUS:
-        {
-          gchar *name, *stream_id;
-
-          g_object_get (G_OBJECT (tube),
-              "stream-id", &stream_id,
-              "dbus-name", &name,
-              NULL);
-
-          lm_message_node_set_attributes (node,
-              "type", "dbus",
-              "stream-id", stream_id,
-              "initiator", tp_handle_inspect (contact_repo, initiator_handle),
-              NULL);
-
-          if (name != NULL)
-            lm_message_node_set_attribute (node, "dbus-name", name);
-
-          g_free (name);
-          g_free (stream_id);
-        }
-        break;
-      case TP_TUBE_TYPE_STREAM:
-        {
-          lm_message_node_set_attribute (node, "type", "stream");
-        }
-        break;
-      default:
-        {
-          g_return_if_reached ();
-        }
-    }
-
-  parameters_node = lm_message_node_add_child (node, "parameters",
-      NULL);
-  lm_message_node_add_children_from_properties (parameters_node, parameters,
-      "parameter");
-
-  g_free (service);
-  g_hash_table_unref (parameters);
-}
-
 struct _i_hate_g_hash_table_foreach
 {
   GabbleTubesChannel *self;
@@ -1131,7 +1054,8 @@ publish_tubes_in_node (gpointer key,
     return;
 
   tube_node = lm_message_node_add_child (data->tubes_node, "tube", NULL);
-  publish_tube_in_node (data->self, tube_node, tube);
+  gabble_tube_iface_publish_in_node (tube, (TpBaseConnection *) priv->conn,
+      tube_node);
 }
 
 static void
@@ -1430,7 +1354,8 @@ start_stream_initiation (GabbleTubesChannel *self,
 
   tube_node = lm_message_node_add_child (si_node, "tube", NULL);
   lm_message_node_set_attribute (tube_node, "xmlns", NS_TUBES);
-  publish_tube_in_node (self, tube_node, tube);
+  gabble_tube_iface_publish_in_node (tube, (TpBaseConnection *) priv->conn,
+      tube_node);
 
   data = g_slice_new (struct _bytestream_negotiate_cb_data);
   data->self = self;
@@ -1454,60 +1379,6 @@ start_stream_initiation (GabbleTubesChannel *self,
 }
 #endif
 
-static gboolean
-send_new_stream_tube_msg (GabbleTubesChannel *self,
-                          GabbleTubeIface *tube,
-                          const gchar *stream_id,
-                          GError **error)
-{
-  GabbleTubesChannelPrivate *priv;
-  LmMessageNode *tube_node = NULL;
-  LmMessage *msg;
-  TpHandleRepoIface *contact_repo;
-  const gchar *jid;
-  TpTubeType type;
-  gboolean result;
-
-  g_object_get (tube, "type", &type, NULL);
-  g_assert (type == TP_TUBE_TYPE_STREAM);
-
-  priv = GABBLE_TUBES_CHANNEL_GET_PRIVATE (self);
-
-  contact_repo = tp_base_connection_get_handles (
-     (TpBaseConnection *) priv->conn, TP_HANDLE_TYPE_CONTACT);
-
-  jid = tp_handle_inspect (contact_repo, priv->handle);
-
-  msg = lm_message_build (jid, LM_MESSAGE_TYPE_MESSAGE,
-      '(', "tube", "",
-        '*', &tube_node,
-        '@', "xmlns", NS_TUBES,
-      ')',
-      '(', "amp", "",
-        '@', "xmlns", NS_AMP,
-        '(', "rule", "",
-          '@', "condition", "deliver-at",
-          '@', "value", "stored",
-          '@', "action", "error",
-        ')',
-        '(', "rule", "",
-          '@', "condition", "match-resource",
-          '@', "value", "exact",
-          '@', "action", "error",
-        ')',
-      ')',
-      NULL);
-
-  g_assert (tube_node != NULL);
-
-  publish_tube_in_node (self, tube_node, tube);
-
-  result = _gabble_connection_send (priv->conn, msg, error);
-
-  lm_message_unref (msg);
-  return result;
-}
-
 static void
 send_tube_close_msg (GabbleTubesChannel *self,
                      guint tube_id)
@@ -1824,7 +1695,8 @@ gabble_tubes_channel_offer_stream_tube (TpSvcChannelTypeTubes *iface,
   if (priv->handle_type == TP_HANDLE_TYPE_CONTACT)
     {
       /* Stream initiation */
-      if (!send_new_stream_tube_msg (self, tube, stream_id, &error))
+      if (!gabble_tube_stream_offer (GABBLE_TUBE_STREAM (tube), address_type,
+          address, access_control, access_control_param, &error))
         {
           gabble_tube_iface_close (tube);
 
-- 
1.5.6.5




More information about the Telepathy-commits mailing list