[Telepathy-commits] [telepathy-salut/master] TubesChannel: implement ExportableChannel and Channel.FUTURE
Will Thompson
will.thompson at collabora.co.uk
Thu Oct 23 07:30:46 PDT 2008
---
src/salut-muc-channel.c | 2 +-
src/salut-muc-manager.c | 16 +++++++++----
src/salut-muc-manager.h | 2 +-
src/salut-tubes-channel.c | 52 +++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 65 insertions(+), 7 deletions(-)
diff --git a/src/salut-muc-channel.c b/src/salut-muc-channel.c
index 7762c9b..dff2fc4 100644
--- a/src/salut-muc-channel.c
+++ b/src/salut-muc-channel.c
@@ -1136,7 +1136,7 @@ salut_muc_channel_received_stanza (GibberMucConnection *conn,
SalutTubesChannel *tubes_chan;
tubes_chan = salut_muc_manager_ensure_tubes_channel (priv->muc_manager,
- priv->handle);
+ priv->handle, from_handle);
g_assert (tubes_chan != NULL);
tubes_message_received (tubes_chan, sender, stanza);
diff --git a/src/salut-muc-manager.c b/src/salut-muc-manager.c
index f94e2ab..48cf390 100644
--- a/src/salut-muc-manager.c
+++ b/src/salut-muc-manager.c
@@ -485,7 +485,8 @@ salut_muc_manager_new_muc_channel (SalutMucManager *mgr,
static SalutTubesChannel *
new_tubes_channel (SalutMucManager *self,
TpHandle room,
- SalutMucChannel *muc)
+ SalutMucChannel *muc,
+ TpHandle initiator)
{
SalutMucManagerPrivate *priv = SALUT_MUC_MANAGER_GET_PRIVATE (self);
TpBaseConnection *conn = (TpBaseConnection *) priv->connection;
@@ -506,6 +507,7 @@ new_tubes_channel (SalutMucManager *self,
"handle", room,
"handle-type", TP_HANDLE_TYPE_ROOM,
"muc", muc,
+ "initiator-handle", initiator,
NULL);
g_signal_connect (chan, "closed", (GCallback) tubes_channel_closed_cb, self);
@@ -651,6 +653,7 @@ make_roomlist_channel (SalutMucManager *self,
static SalutTubesChannel *
create_tubes_channel (SalutMucManager *self,
TpHandle handle,
+ TpHandle initiator,
GError **error)
{
SalutMucManagerPrivate *priv = SALUT_MUC_MANAGER_GET_PRIVATE (self);
@@ -663,13 +666,14 @@ create_tubes_channel (SalutMucManager *self,
if (text_chan == NULL)
{
DEBUG ("have to create the text channel before the tubes one");
+ /* FIXME: this channel will come out with Requested: True. */
text_chan = salut_muc_manager_request_new_muc_channel (self,
handle, error);
if (text_chan == NULL)
return NULL;
}
- tubes_chan = new_tubes_channel (self, handle, text_chan);
+ tubes_chan = new_tubes_channel (self, handle, text_chan, initiator);
g_assert (tubes_chan != NULL);
return tubes_chan;
@@ -752,7 +756,8 @@ salut_muc_manager_factory_iface_request (TpChannelFactoryIface *iface,
}
else
{
- tubes_chan = create_tubes_channel (mgr, handle, error);
+ tubes_chan = create_tubes_channel (mgr, handle,
+ base_connection->self_handle, error);
if (tubes_chan == NULL)
return TP_CHANNEL_FACTORY_REQUEST_STATUS_ERROR;
@@ -975,7 +980,8 @@ salut_muc_manager_handle_si_stream_request (SalutMucManager *self,
SalutTubesChannel *
salut_muc_manager_ensure_tubes_channel (SalutMucManager *self,
- TpHandle handle)
+ TpHandle handle,
+ TpHandle actor)
{
SalutMucManagerPrivate *priv = SALUT_MUC_MANAGER_GET_PRIVATE (self);
SalutTubesChannel *tubes_chan;
@@ -988,7 +994,7 @@ salut_muc_manager_ensure_tubes_channel (SalutMucManager *self,
return tubes_chan;
}
- tubes_chan = create_tubes_channel (self, handle, NULL);
+ tubes_chan = create_tubes_channel (self, handle, actor, NULL);
g_assert (tubes_chan != NULL);
g_object_ref (tubes_chan);
diff --git a/src/salut-muc-manager.h b/src/salut-muc-manager.h
index e0cf962..8bffb24 100644
--- a/src/salut-muc-manager.h
+++ b/src/salut-muc-manager.h
@@ -86,7 +86,7 @@ void salut_muc_manager_handle_si_stream_request (SalutMucManager *muc_manager,
const gchar *stream_id, GibberXmppStanza *msg);
SalutTubesChannel * salut_muc_manager_ensure_tubes_channel (
- SalutMucManager *muc_manager, TpHandle handle);
+ SalutMucManager *muc_manager, TpHandle handle, TpHandle actor);
/* "protected" methods */
diff --git a/src/salut-tubes-channel.c b/src/salut-tubes-channel.c
index 40c5ec6..d286b19 100644
--- a/src/salut-tubes-channel.c
+++ b/src/salut-tubes-channel.c
@@ -39,6 +39,8 @@
#include <gibber/gibber-namespaces.h>
#include <gibber/gibber-xmpp-error.h>
+#include "extensions/extensions.h"
+
#define DEBUG_FLAG DEBUG_TUBES
#include "debug.h"
#include "salut-util.h"
@@ -72,6 +74,8 @@ G_DEFINE_TYPE_WITH_CODE (SalutTubesChannel, salut_tubes_channel, G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_DBUS_PROPERTIES,
tp_dbus_properties_mixin_iface_init);
G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_CHANNEL, channel_iface_init);
+ G_IMPLEMENT_INTERFACE (SALUT_TYPE_SVC_CHANNEL_FUTURE, NULL);
+ G_IMPLEMENT_INTERFACE (TP_TYPE_EXPORTABLE_CHANNEL, NULL);
G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_CHANNEL_TYPE_TUBES, tubes_iface_init);
G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_CHANNEL_INTERFACE_GROUP,
tp_external_group_mixin_iface_init);
@@ -83,6 +87,7 @@ static const char *salut_tubes_channel_interfaces[] = {
/* If more interfaces are added, either keep Group as the first, or change
* the implementations of salut_tubes_channel_get_interfaces () and
* salut_tubes_channel_get_property () too */
+ SALUT_IFACE_CHANNEL_FUTURE,
NULL
};
@@ -96,6 +101,9 @@ enum
PROP_MUC,
PROP_INTERFACES,
PROP_TARGET_ID,
+ PROP_REQUESTED,
+ PROP_INITIATOR_ID,
+ PROP_INITIATOR_HANDLE,
LAST_PROPERTY
};
@@ -109,6 +117,7 @@ struct _SalutTubesChannelPrivate
TpHandle handle;
TpHandleType handle_type;
TpHandle self_handle;
+ TpHandle initiator;
GibberMucConnection *muc_connection;
GHashTable *tubes;
@@ -249,6 +258,22 @@ salut_tubes_channel_get_property (GObject *object,
g_value_set_string (value, tp_handle_inspect (repo, priv->handle));
}
break;
+ case PROP_INITIATOR_HANDLE:
+ g_assert (priv->initiator != 0);
+ g_value_set_uint (value, priv->initiator);
+ break;
+ case PROP_INITIATOR_ID:
+ {
+ TpHandleRepoIface *repo = tp_base_connection_get_handles (
+ (TpBaseConnection *) priv->conn, TP_HANDLE_TYPE_CONTACT);
+
+ g_assert (priv->initiator != 0);
+ g_value_set_string (value, tp_handle_inspect (repo, priv->handle));
+ }
+ break;
+ case PROP_REQUESTED:
+ g_value_set_boolean (value, (priv->initiator != priv->self_handle));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -291,6 +316,10 @@ salut_tubes_channel_set_property (GObject *object,
case PROP_MUC:
chan->muc = g_value_get_object (value);
break;
+ case PROP_INITIATOR_HANDLE:
+ priv->initiator = g_value_get_uint (value);
+ g_assert (priv->initiator != 0);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -1835,6 +1864,29 @@ salut_tubes_channel_class_init (
G_PARAM_STATIC_BLURB);
g_object_class_install_property (object_class, PROP_TARGET_ID, param_spec);
+ param_spec = g_param_spec_boolean ("requested", "Requested?",
+ "True if this channel was requested by the local user",
+ FALSE,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_STATIC_NAME);
+ g_object_class_install_property (object_class, PROP_REQUESTED, param_spec);
+
+ param_spec = g_param_spec_uint ("initiator-handle", "Initiator's handle",
+ "The contact which caused the Tubes channel to appear",
+ 0, G_MAXUINT32, 0,
+ G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE |
+ G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_STATIC_NAME);
+ g_object_class_install_property (object_class, PROP_INITIATOR_HANDLE,
+ param_spec);
+
+ param_spec = g_param_spec_string ("initiator-id", "Initiator JID",
+ "The string obtained by inspecting this channel's initiator-handle",
+ NULL,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_STATIC_NAME);
+ g_object_class_install_property (object_class, PROP_INITIATOR_ID,
+ param_spec);
+
param_spec = g_param_spec_object (
"connection",
"SalutConnection object",
--
1.5.6.5
More information about the Telepathy-commits
mailing list