[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