[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", ¶meters,
+ "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", ¶meters,
- "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