[Telepathy-commits] [telepathy-salut/master] Add direct-bytestream-manager, still empty

Alban Crequy alban.crequy at collabora.co.uk
Tue Nov 25 03:59:17 PST 2008


20080724144226-a41c0-de09b2f960ed9b35ff161f0f5688ae49a7827cda.gz
---
 src/Makefile.am                       |    2 +
 src/salut-connection.c                |   68 +++++++++-
 src/salut-direct-bytestream-manager.c |  242 +++++++++++++++++++++++++++++++++
 src/salut-direct-bytestream-manager.h |   69 ++++++++++
 src/tube-stream.c                     |   30 +++-
 5 files changed, 401 insertions(+), 10 deletions(-)
 create mode 100644 src/salut-direct-bytestream-manager.c
 create mode 100644 src/salut-direct-bytestream-manager.h

diff --git a/src/Makefile.am b/src/Makefile.am
index 1e09c86..89ca990 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -42,6 +42,8 @@ CORE_SOURCES =                                          \
     salut-contact-channel.c                             \
     salut-si-bytestream-manager.h                       \
     salut-si-bytestream-manager.c                       \
+    salut-direct-bytestream-manager.h                   \
+    salut-direct-bytestream-manager.c                   \
     text-helper.c                                       \
     text-helper.h                                       \
     salut-roomlist-channel.h                            \
diff --git a/src/salut-connection.c b/src/salut-connection.c
index 369aec8..4d7efe5 100644
--- a/src/salut-connection.c
+++ b/src/salut-connection.c
@@ -44,6 +44,7 @@
 #include "salut-self.h"
 #include "salut-xmpp-connection-manager.h"
 #include "salut-si-bytestream-manager.h"
+#include "salut-direct-bytestream-manager.h"
 
 #ifdef ENABLE_OLPC
 #include "salut-olpc-activity-manager.h"
@@ -136,6 +137,7 @@ enum {
   PROP_SELF,
   PROP_XCM,
   PROP_SI_BYTESTREAM_MANAGER,
+  PROP_DIRECT_BYTESTREAM_MANAGER,
 #ifdef ENABLE_OLPC
   PROP_OLPC_ACTIVITY_MANAGER,
 #endif
@@ -182,9 +184,12 @@ struct _SalutConnectionPrivate
   /* Tubes channel manager */
   SalutTubesManager *tubes_manager;
 
-  /* Bytestream manager */
+  /* Bytestream manager for stream initiation (XEP-0095) */
   SalutSiBytestreamManager *si_bytestream_manager;
 
+  /* Bytestream manager for p2p tubes */
+  SalutDirectBytestreamManager *direct_bytestream_manager;
+
 #ifdef ENABLE_OLPC
   SalutOlpcActivityManager *olpc_activity_manager;
 #endif
@@ -307,6 +312,17 @@ salut_connection_get_property (GObject *object,
     case PROP_SI_BYTESTREAM_MANAGER:
       g_value_set_object (value, priv->si_bytestream_manager);
       break;
+    case PROP_DIRECT_BYTESTREAM_MANAGER:
+      g_value_set_object (value, priv->direct_bytestream_manager);
+      break;
+#ifdef ENABLE_OLPC
+    case PROP_OLPC_ACTIVITY_MANAGER:
+      g_value_set_object (value, priv->olpc_activity_manager);
+      break;
+#endif
+    case PROP_BACKEND:
+      g_value_set_gtype (value, priv->backend_type);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
     }
@@ -668,15 +684,53 @@ salut_connection_class_init (SalutConnectionClass *salut_connection_class)
       param_spec);
 
   param_spec = g_param_spec_object (
-      "bytestream-manager",
+      "si-bytestream-manager",
       "SalutSiBytestreamManager object",
-      "The Salut Bytestream Manager associated with this Salut Connection",
+      "The Salut SI Bytestream Manager associated with this Salut Connection",
       SALUT_TYPE_SI_BYTESTREAM_MANAGER,
       G_PARAM_READABLE |
       G_PARAM_STATIC_NICK |
       G_PARAM_STATIC_BLURB);
   g_object_class_install_property (object_class, PROP_SI_BYTESTREAM_MANAGER,
       param_spec);
+
+  param_spec = g_param_spec_object (
+      "direct-bytestream-manager",
+      "SalutDirectBytestreamManager object",
+      "The Salut Direct Bytestream Manager associated with this Salut Connection",
+      SALUT_TYPE_SI_BYTESTREAM_MANAGER,
+      G_PARAM_READABLE |
+      G_PARAM_STATIC_NICK |
+      G_PARAM_STATIC_BLURB);
+  g_object_class_install_property (object_class, PROP_DIRECT_BYTESTREAM_MANAGER,
+      param_spec);
+
+#ifdef ENABLE_OLPC
+  param_spec = g_param_spec_object (
+      "olpc-activity-manager",
+      "SalutOlpcActivityManager object",
+      "The OLPC activity Manager associated with this Salut Connection",
+      SALUT_TYPE_OLPC_ACTIVITY_MANAGER,
+      G_PARAM_READABLE |
+      G_PARAM_STATIC_NICK |
+      G_PARAM_STATIC_BLURB);
+  g_object_class_install_property (object_class, PROP_OLPC_ACTIVITY_MANAGER,
+      param_spec);
+#endif
+
+  param_spec = g_param_spec_gtype (
+      "backend-type",
+      "backend type",
+      "a G_TYPE_GTYPE of the backend to use",
+      G_TYPE_NONE,
+      G_PARAM_CONSTRUCT_ONLY |
+      G_PARAM_READWRITE |
+      G_PARAM_STATIC_NAME |
+      G_PARAM_STATIC_NICK |
+      G_PARAM_STATIC_BLURB);
+  g_object_class_install_property (object_class, PROP_BACKEND,
+      param_spec);
+
 }
 
 void
@@ -718,6 +772,12 @@ salut_connection_dispose (GObject *object)
       priv->si_bytestream_manager = NULL;
     }
 
+  if (priv->direct_bytestream_manager != NULL)
+    {
+      g_object_unref (priv->direct_bytestream_manager);
+      priv->direct_bytestream_manager = NULL;
+    }
+
   /* release any references held by the object here */
   if (G_OBJECT_CLASS (salut_connection_parent_class)->dispose)
     G_OBJECT_CLASS (salut_connection_parent_class)->dispose (object);
@@ -872,6 +932,8 @@ _ga_client_running_cb(GaClient *c,
   /* Create the bytestream manager */
   priv->si_bytestream_manager = salut_si_bytestream_manager_new (self,
     salut_discovery_client_get_host_name_fqdn (priv->discovery_client));
+  priv->direct_bytestream_manager = salut_direct_bytestream_manager_new (self,
+    salut_discovery_client_get_host_name_fqdn (priv->discovery_client));
 }
 
 /* public functions */
diff --git a/src/salut-direct-bytestream-manager.c b/src/salut-direct-bytestream-manager.c
new file mode 100644
index 0000000..d8167ff
--- /dev/null
+++ b/src/salut-direct-bytestream-manager.c
@@ -0,0 +1,242 @@
+/*
+ * salut-direct-bytestream-manager.c - Source for SalutDirectBytestreamManager
+ * 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
+ * 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 "salut-direct-bytestream-manager.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <gibber/gibber-xmpp-stanza.h>
+#include <gibber/gibber-namespaces.h>
+#include <gibber/gibber-xmpp-error.h>
+#include <gibber/gibber-iq-helper.h>
+
+#include "salut-im-manager.h"
+#include "salut-muc-manager.h"
+#include "salut-tubes-manager.h"
+
+#define DEBUG_FLAG DEBUG_DIRECT_BYTESTREAM_MGR
+#include "debug.h"
+
+G_DEFINE_TYPE (SalutDirectBytestreamManager, salut_direct_bytestream_manager,
+    G_TYPE_OBJECT)
+
+/* properties */
+enum
+{
+  PROP_CONNECTION = 1,
+  PROP_HOST_NAME_FQDN,
+  LAST_PROPERTY
+};
+
+/* private structure */
+typedef struct _SalutDirectBytestreamManagerPrivate SalutDirectBytestreamManagerPrivate;
+
+struct _SalutDirectBytestreamManagerPrivate
+{
+  SalutConnection *connection;
+  SalutImManager *im_manager;
+  SalutXmppConnectionManager *xmpp_connection_manager;
+  gchar *host_name_fqdn;
+
+  gboolean dispose_has_run;
+};
+
+#define SALUT_DIRECT_BYTESTREAM_MANAGER_GET_PRIVATE(obj) \
+    ((SalutDirectBytestreamManagerPrivate *) ((SalutDirectBytestreamManager *)obj)->priv)
+
+static void
+salut_direct_bytestream_manager_init (SalutDirectBytestreamManager *self)
+{
+  SalutDirectBytestreamManagerPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
+      SALUT_TYPE_DIRECT_BYTESTREAM_MANAGER, SalutDirectBytestreamManagerPrivate);
+
+  self->priv = priv;
+
+  priv->dispose_has_run = FALSE;
+}
+
+
+void
+salut_direct_bytestream_manager_dispose (GObject *object)
+{
+  SalutDirectBytestreamManager *self = SALUT_DIRECT_BYTESTREAM_MANAGER (object);
+  SalutDirectBytestreamManagerPrivate *priv = SALUT_DIRECT_BYTESTREAM_MANAGER_GET_PRIVATE
+      (self);
+
+  if (priv->dispose_has_run)
+    return;
+
+  priv->dispose_has_run = TRUE;
+
+  g_object_unref (priv->im_manager);
+  g_object_unref (priv->xmpp_connection_manager);
+
+  if (G_OBJECT_CLASS (salut_direct_bytestream_manager_parent_class)->dispose)
+    G_OBJECT_CLASS (salut_direct_bytestream_manager_parent_class)->dispose (object);
+}
+
+void
+salut_direct_bytestream_manager_finalize (GObject *object)
+{
+  SalutDirectBytestreamManager *self = SALUT_DIRECT_BYTESTREAM_MANAGER (object);
+  SalutDirectBytestreamManagerPrivate *priv = SALUT_DIRECT_BYTESTREAM_MANAGER_GET_PRIVATE (
+      self);
+
+  g_free (priv->host_name_fqdn);
+
+  if (G_OBJECT_CLASS (salut_direct_bytestream_manager_parent_class)->finalize)
+    G_OBJECT_CLASS (salut_direct_bytestream_manager_parent_class)->finalize
+        (object);
+}
+
+static void
+salut_direct_bytestream_manager_get_property (GObject *object,
+                                          guint property_id,
+                                          GValue *value,
+                                          GParamSpec *pspec)
+{
+  SalutDirectBytestreamManager *self = SALUT_DIRECT_BYTESTREAM_MANAGER (object);
+  SalutDirectBytestreamManagerPrivate *priv = SALUT_DIRECT_BYTESTREAM_MANAGER_GET_PRIVATE (
+      self);
+
+  switch (property_id)
+    {
+      case PROP_CONNECTION:
+        g_value_set_object (value, priv->connection);
+        break;
+      case PROP_HOST_NAME_FQDN:
+        g_value_set_string (value, priv->host_name_fqdn);
+        break;
+      default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+        break;
+    }
+}
+
+static void
+salut_direct_bytestream_manager_set_property (GObject *object,
+                                          guint property_id,
+                                          const GValue *value,
+                                          GParamSpec *pspec)
+{
+  SalutDirectBytestreamManager *self = SALUT_DIRECT_BYTESTREAM_MANAGER (object);
+  SalutDirectBytestreamManagerPrivate *priv = SALUT_DIRECT_BYTESTREAM_MANAGER_GET_PRIVATE (
+      self);
+
+  switch (property_id)
+    {
+      case PROP_CONNECTION:
+        priv->connection = g_value_get_object (value);
+        break;
+      case PROP_HOST_NAME_FQDN:
+        g_free (priv->host_name_fqdn);
+        priv->host_name_fqdn = g_value_dup_string (value);
+        break;
+      default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+        break;
+    }
+}
+
+static GObject *
+salut_direct_bytestream_manager_constructor (GType type,
+                                      guint n_props,
+                                      GObjectConstructParam *props)
+{
+  GObject *obj;
+  SalutDirectBytestreamManager *self;
+  SalutDirectBytestreamManagerPrivate *priv;
+
+  obj = G_OBJECT_CLASS (salut_direct_bytestream_manager_parent_class)->
+           constructor (type, n_props, props);
+
+  self = SALUT_DIRECT_BYTESTREAM_MANAGER (obj);
+  priv = SALUT_DIRECT_BYTESTREAM_MANAGER_GET_PRIVATE (self);
+
+  g_assert (priv->connection != NULL);
+  g_object_get (priv->connection,
+      "im-manager", &(priv->im_manager),
+      "xmpp-connection-manager", &(priv->xmpp_connection_manager),
+      NULL);
+  g_assert (priv->im_manager != NULL);
+  g_assert (priv->xmpp_connection_manager != NULL);
+  g_assert (priv->host_name_fqdn != NULL);
+
+  return obj;
+}
+
+static void
+salut_direct_bytestream_manager_class_init (
+    SalutDirectBytestreamManagerClass *salut_direct_bytestream_manager_class)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS
+      (salut_direct_bytestream_manager_class);
+  GParamSpec *param_spec;
+
+  g_type_class_add_private (salut_direct_bytestream_manager_class,
+      sizeof (SalutDirectBytestreamManagerPrivate));
+
+  object_class->constructor = salut_direct_bytestream_manager_constructor;
+  object_class->dispose = salut_direct_bytestream_manager_dispose;
+  object_class->finalize = salut_direct_bytestream_manager_finalize;
+
+  object_class->get_property = salut_direct_bytestream_manager_get_property;
+  object_class->set_property = salut_direct_bytestream_manager_set_property;
+
+  param_spec = g_param_spec_object (
+      "connection",
+      "SalutConnection object",
+      "Salut Connection that owns the connection for this bytestream channel",
+      SALUT_TYPE_CONNECTION,
+      G_PARAM_CONSTRUCT_ONLY |
+      G_PARAM_READWRITE |
+      G_PARAM_STATIC_NAME |
+      G_PARAM_STATIC_NICK |
+      G_PARAM_STATIC_BLURB);
+  g_object_class_install_property (object_class, PROP_CONNECTION, param_spec);
+
+  param_spec = g_param_spec_string (
+      "host-name-fqdn",
+      "host name FQDN",
+      "The FQDN host name that will be used by OOB bytestreams",
+      NULL,
+      G_PARAM_CONSTRUCT_ONLY |
+      G_PARAM_READWRITE |
+      G_PARAM_STATIC_NAME |
+      G_PARAM_STATIC_NICK |
+      G_PARAM_STATIC_BLURB);
+  g_object_class_install_property (object_class, PROP_HOST_NAME_FQDN,
+      param_spec);
+}
+
+SalutDirectBytestreamManager *
+salut_direct_bytestream_manager_new (SalutConnection *conn,
+                              const gchar *host_name_fqdn)
+{
+  g_return_val_if_fail (SALUT_IS_CONNECTION (conn), NULL);
+
+  return g_object_new (
+      SALUT_TYPE_DIRECT_BYTESTREAM_MANAGER,
+      "connection", conn,
+      "host-name-fqdn", host_name_fqdn,
+      NULL);
+}
+
diff --git a/src/salut-direct-bytestream-manager.h b/src/salut-direct-bytestream-manager.h
new file mode 100644
index 0000000..5d5d719
--- /dev/null
+++ b/src/salut-direct-bytestream-manager.h
@@ -0,0 +1,69 @@
+/*
+ * salut-direct-bytestream-manager.h - Header for SalutDirectBytestreamManager
+ * 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
+ * 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 __SALUT_DIRECT_BYTESTREAM_MANAGER_H__
+#define __SALUT_DIRECT_BYTESTREAM_MANAGER_H__
+
+#include <glib-object.h>
+#include "salut-xmpp-connection-manager.h"
+#include "salut-contact.h"
+
+#include <gibber/gibber-linklocal-transport.h>
+#include <gibber/gibber-bytestream-iface.h>
+
+G_BEGIN_DECLS
+
+typedef struct _SalutDirectBytestreamManager SalutDirectBytestreamManager;
+typedef struct _SalutDirectBytestreamManagerClass SalutDirectBytestreamManagerClass;
+
+struct _SalutDirectBytestreamManagerClass {
+    GObjectClass parent_class;
+};
+
+struct _SalutDirectBytestreamManager {
+    GObject parent;
+
+    gpointer priv;
+};
+
+
+GType salut_Direct_bytestream_manager_get_type (void);
+
+/* TYPE MACROS */
+#define SALUT_TYPE_DIRECT_BYTESTREAM_MANAGER \
+  (salut_direct_bytestream_manager_get_type ())
+#define SALUT_DIRECT_BYTESTREAM_MANAGER(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj), SALUT_TYPE_DIRECT_BYTESTREAM_MANAGER, \
+                              SalutDirectBytestreamManager))
+#define SALUT_DIRECT_BYTESTREAM_MANAGER_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST((klass), SALUT_TYPE_DIRECT_BYTESTREAM_MANAGER, \
+                           SalutDirectBytestreamManagerClass))
+#define SALUT_IS_DIRECT_BYTESTREAM_MANAGER(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj), SALUT_TYPE_DIRECT_BYTESTREAM_MANAGER))
+#define SALUT_IS_DIRECT_BYTESTREAM_MANAGER_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_TYPE((klass), SALUT_TYPE_DIRECT_BYTESTREAM_MANAGER))
+#define SALUT_DIRECT_BYTESTREAM_MANAGER_GET_CLASS(obj) \
+  (G_TYPE_INSTANCE_GET_CLASS ((obj), SALUT_TYPE_DIRECT_BYTESTREAM_MANAGER, \
+                              SalutDirectBytestreamManagerClass))
+
+SalutDirectBytestreamManager *
+salut_direct_bytestream_manager_new (SalutConnection *connection,
+    const gchar *host_name_fqdn);
+
+#endif /* #ifndef __SALUT_DIRECT_BYTESTREAM_MANAGER_H__*/
diff --git a/src/tube-stream.c b/src/tube-stream.c
index 3deea50..16a9468 100644
--- a/src/tube-stream.c
+++ b/src/tube-stream.c
@@ -372,7 +372,7 @@ start_stream_initiation (SalutTubeStream *self,
   struct _extra_bytestream_negotiate_cb_data *data;
   SalutContact *contact;
   SalutContactManager *contact_mgr;
-  SalutSiBytestreamManager *bytestream_mgr;
+  SalutSiBytestreamManager *si_bytestream_mgr;
 
   contact_repo = tp_base_connection_get_handles (
      (TpBaseConnection*) priv->conn, TP_HANDLE_TYPE_CONTACT);
@@ -391,6 +391,7 @@ start_stream_initiation (SalutTubeStream *self,
 
   if (priv->handle_type == TP_HANDLE_TYPE_CONTACT)
     {
+      g_assert_not_reached ();
       node = gibber_xmpp_node_add_child (si_node, "stream");
     }
   else
@@ -412,10 +413,10 @@ start_stream_initiation (SalutTubeStream *self,
   data->fd = fd;
 
   g_object_get (priv->conn,
-      "bytestream-manager", &bytestream_mgr,
+      "si-bytestream-manager", &si_bytestream_mgr,
       "contact-manager", &contact_mgr,
       NULL);
-  g_assert (bytestream_mgr != NULL);
+  g_assert (si_bytestream_mgr != NULL);
   g_assert (contact_mgr != NULL);
 
   contact = salut_contact_manager_get_contact (contact_mgr, priv->initiator);
@@ -428,7 +429,7 @@ start_stream_initiation (SalutTubeStream *self,
   else
     {
       result = salut_si_bytestream_manager_negotiate_stream (
-        bytestream_mgr,
+        si_bytestream_mgr,
         contact,
         msg,
         stream_id,
@@ -439,7 +440,7 @@ start_stream_initiation (SalutTubeStream *self,
       g_object_unref (contact);
     }
 
-  g_object_unref (bytestream_mgr);
+  g_object_unref (si_bytestream_mgr);
   g_object_unref (contact_mgr);
   g_object_unref (msg);
   g_free (stream_id);
@@ -499,11 +500,26 @@ listen_cb (GIOChannel *source,
 
   DEBUG ("request new bytestream");
 
-  if (!start_stream_initiation (self, fd, NULL))
+  /* Streams in MUC tubes are established with stream initiation (XEP-0095).
+   * We use SalutSiBytestreamManager.
+   *
+   * Streams in P2P tubes are established directly with a TCP connection. We
+   * use SalutDirectBytestreamManager.
+   */
+  if (priv->handle_type == TP_HANDLE_TYPE_CONTACT)
     {
-      DEBUG ("closing new client connection");
+      /* TODO: To be implemented */
+      DEBUG ("SalutDirectBytestreamManager to be implemented");
       close (fd);
     }
+  else
+    {
+      if (!start_stream_initiation (self, fd, NULL))
+        {
+          DEBUG ("closing new client connection");
+          close (fd);
+        }
+    }
 
   return TRUE;
 }
-- 
1.5.6.5




More information about the Telepathy-commits mailing list