[Telepathy] The XMPP implementation of Tubes
Simon McVittie
simon.mcvittie at collabora.co.uk
Mon Aug 13 09:49:46 PDT 2007
As part of the review process for the telepathy-gabble-tubes branch,
I've been looking at the XMPP protocol we use to implement Telepathy
Tubes. I think it needs documenting, and it also needs some changes - at
the moment it's a bit of an abuse of IBB.
To start with, I'll just document the current protocol. I'll reply to this
mail with criticisms and proposed changes.
===============================================================================
The Tubes protocol
===============================================================================
The draft of the Tubes specification that's implemented in the -tubes
branch can be found at
<http://projects.collabora.co.uk/~smcv/gabble-tubes-as-of-20070813.html>.
In this document, NS_SI_TUBES, NS_SI_TUBES_OLD and NS_TUBES mean
"http://telepathy.freedesktop.org/xmpp/si/profile/tubes",
"http://jabber.org/protocol/si/profile/tubes" and
"http://telepathy.freedesktop.org/xmpp/tubes" respectively.
The use of NS_SI_TUBES_OLD was a mistake (it's not in a namespace we
control, so we shouldn't use it) - wherever this is used, we need
to change it to NS_SI_TUBES.
Tubes can be used in a 1-1 context (for CONTACT tubes channels) or in a MUC
context (for ROOM tubes channels).
Usage in 1-1 context
====================
Opening the channel
-------------------
A 1-1 Tubes channel is opened by request, or when a Stream Initiation
request with profile NS_SI_TUBES or NS_SI_TUBES_OLD is received.
Offering a tube
---------------
To offer a tube, send a Stream Initiation request with profile
NS_SI_TUBES or NS_SI_TUBES_OLD (currently, the latter is sent). As per
XEP-0095_, the SI request must be sent to a full-JID. The resource
chosen is one that has NS_SI_TUBES or NS_SI_TUBES_OLD advertised as a
capability in its presence.
It's somewhat vague whether we support opening a 1-1 tubes channel with
a MUC contact - there is code to support it, but I don't think we put
capabilities in MUC presence. We should probably rule that it's
unsupported.
We currently support only IBB as a transport.
Accepting a tube
----------------
Responding to a tube offer is as usual for SI. Once the other end has
agreed to do IBB, we consider the tube to be open.
Sending and receiving data
--------------------------
The messages are sent as specified by IBB.
In the case of D-Bus tubes, each <message> contains (a) an entire
D-Bus message, and (b) no more than one D-Bus message.
In the case of stream tubes, <message> boundaries are arbitrary.
Usage in MUCs
=============
The <tubes> element with namespace NS_TUBES may be added to MUC presence.
Its children are <tube> elements representing those tubes which, in
the Telepathy Tubes spec, are in state Tube_State_Open. This is everyone's
tubes, not just ones we initiated.
Opening a channel
-----------------
A Tubes channel is opened on request, or when a <tubes> is seen in MUC
presence.
Offering a tube
---------------
Put it in your presence.
I still need to investigate how stream tubes work here.
Accepting a tube
----------------
No D-Bus tubes are remote-pending or local-pending at any time - the tube is
considered to be already open as soon as it appears in someone's presence,
so no accepting is ever needed.
I still need to investigate how stream tubes work here.
Sending data
------------
The messages are sent in <message>s as specified by IBB (XEP-0047_), except
that the sequence number @seq is meaningless on output, must be ignored
on input, and no <open> or <close> ever occurs.
The <tube> element
==================
Example::
<tube stream-id="stream1" type="dbus" initiator="room at conf.example.com/me"
service="com.example.TextEditor" offering="true" id="1343"
dbus-name=":0.fhsIUH">
<parameters>
<parameter name="filename" type="str">README.txt</parameter>
</parameters>
</tube>
:Attributes:
stream-id : string
In SI tubes, the stream ID that will be used when the IBB
stream is eventually opened. In MUC tubes, an arbitrary string
which is repeated on the pseudo-IBB messages.
type : "stream" or "dbus"
Required. The type of tube.
initiator : MUC member JID (MUC) / bare JID (SI)
Required. The initiator of the tube.
service : D-Bus well-known name
Required. The D-Bus service name.
offering : "true" or "false"
In SI context, OfferTube maps to offering="true". I'm not quite
sure how it can ever have offering="false" or why this is
necessary...
In MUC context, omitted.
id : decimal in range 0 to (2**31)-1
The per-channel stream ID. Generated randomly in an attempt to
avoid collisions.
dbus-name : D-Bus unique name
Required for D-Bus tubes. The unique name the contact whose
announcement this is will use in the tube.
:Children:
parameters
Tube parameters. Children are named "parameter" and have attributes
"name" (user-specified) and "type" ("str", "bytes", "int" or "uint").
Character content is UTF-8 (str), Base64 (bytes), ASCII decimal
(int, uint).
.. Note:: FIXME
This encoding can't support ASCII control codes in UTF-8
strings, because XML can't. Do we care?
.. Note:: Proposed change:
Children are either named after either basic D-Bus types, or 'ay'.
For example::
<parameters>
<s name="foo">Hello, world!</s>
<ay name="icon">Base64Base64Base64</ay>
<d name="quality">1.0</d>
</parameters>
.. Note:: Alternative:
The <parameters> element has character content, which is the
D-Bus serialization of the a{sv} in Base64. The encoding can be
obtained with libdbus by marshalling a dummy message containing
the a{sv}, then taking the body part of the message by doing
trivial parsing.
.. _XEP-0047: http://www.xmpp.org/extensions/xep-0047.html
.. _XEP-0095: http://www.xmpp.org/extensions/xep-0095.html
.. vim:set sw=4 sts=4 et ft=rst:
More information about the Telepathy
mailing list