[Telepathy] The XMPP implementation of Tubes

Simon McVittie simon.mcvittie at collabora.co.uk
Mon Aug 13 10:20:31 PDT 2007


On Mon, 13 Aug 2007 at 17:49:46 +0100, Simon McVittie wrote:
> To offer a tube, send a Stream Initiation request with profile
> NS_SI_TUBES or NS_SI_TUBES_OLD (currently, the latter is sent).

Clearly wrong, we should use the correct namespace.

> 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.

What I said.

> 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 1-1 tubes we should support arbitrary fragmentation - it's relatively
simple to parse enough of a D-Bus message to be able to find message
boundaries.

> 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.

I propose sending <message><data xmlns=NS_TUBES>base64</data></message>.
The data element should also have an optional attribute "frag" or
something, with values "first", "middle", "last"; omitting the attribute
means it's a complete message (i.e. simultaneously first and last).

This means the stream-id is meaningless and can be omitted...

>     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.

... so this can be omitted too in MUC context.

>     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...

I need to examine stream tubes and work out whether this can ever be
useful.

> :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).

This should be extended to support (at least) the complete set of D-Bus
basic (non-container) types, plus 'ay'. Also, we should either explicitly
not support the two 16-bit integer types, or note in the spec that
16-bit integers might become 32-bit integers in transit (dbus-glib
doesn't let you distinguish, which is IMO a bug but we're stuck with it).

I wonder whether it should just have Base64 character content which is
the D-Bus serialization of the a{sv}. This can be done easily if we can
require D-Bus 1.1.0 (i.e. dbus_message_marshal), by serializing a dummy
message with the a{sv} as payload, then Base64ing just the body part.

Sending arbitrary D-Bus strings in an XML stream is problematic, because
not all Unicode strings can be represented in XML. (Tabs may be converted
to spaces, newlines are normalized, carriage-returns are discarded and
other characters from the first 32 in ASCII are not allowed).


More information about the Telepathy mailing list