summaryrefslogtreecommitdiff
path: root/qt4/spec/Channel_Type_Streamed_Media.xml
diff options
context:
space:
mode:
Diffstat (limited to 'qt4/spec/Channel_Type_Streamed_Media.xml')
-rw-r--r--qt4/spec/Channel_Type_Streamed_Media.xml853
1 files changed, 853 insertions, 0 deletions
diff --git a/qt4/spec/Channel_Type_Streamed_Media.xml b/qt4/spec/Channel_Type_Streamed_Media.xml
new file mode 100644
index 000000000..aa2b90345
--- /dev/null
+++ b/qt4/spec/Channel_Type_Streamed_Media.xml
@@ -0,0 +1,853 @@
+<?xml version="1.0" ?>
+<node name="/Channel_Type_Streamed_Media" xmlns:tp="http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0">
+ <tp:copyright> Copyright © 2005-2009 Collabora Limited </tp:copyright>
+ <tp:copyright> Copyright © 2005-2009 Nokia Corporation </tp:copyright>
+ <tp:copyright> Copyright © 2006 INdT </tp:copyright>
+ <tp:license xmlns="http://www.w3.org/1999/xhtml">
+ <p>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.</p>
+
+<p>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.</p>
+
+<p>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 Street, Fifth Floor, Boston, MA 02110-1301, USA.</p>
+ </tp:license>
+ <interface name="org.freedesktop.Telepathy.Channel.Type.StreamedMedia">
+ <tp:requires interface="org.freedesktop.Telepathy.Channel"/>
+ <tp:requires interface="org.freedesktop.Telepathy.Channel.Interface.Group"/>
+
+ <tp:enum name="Media_Stream_Type" type="u"
+ array-name="Media_Stream_Type_List">
+ <tp:enumvalue suffix="Audio" value="0">
+ <tp:docstring>An audio stream</tp:docstring>
+ </tp:enumvalue>
+ <tp:enumvalue suffix="Video" value="1">
+ <tp:docstring>A video stream</tp:docstring>
+ </tp:enumvalue>
+ </tp:enum>
+
+ <tp:enum name="Media_Stream_State" type="u">
+ <tp:enumvalue suffix="Disconnected" value="0">
+ <tp:docstring>The stream is disconnected.</tp:docstring>
+ </tp:enumvalue>
+ <tp:enumvalue suffix="Connecting" value="1">
+ <tp:docstring>The stream is trying to connect.</tp:docstring>
+ </tp:enumvalue>
+ <tp:enumvalue suffix="Connected" value="2">
+ <tp:docstring>The stream is connected.</tp:docstring>
+ </tp:enumvalue>
+ </tp:enum>
+
+ <tp:enum name="Media_Stream_Direction" type="u">
+ <tp:enumvalue suffix="None" value="0">
+ <tp:docstring>Media are not being sent or received</tp:docstring>
+ </tp:enumvalue>
+ <tp:enumvalue suffix="Send" value="1">
+ <tp:docstring>Media are being sent, but not received</tp:docstring>
+ </tp:enumvalue>
+ <tp:enumvalue suffix="Receive" value="2">
+ <tp:docstring>Media are being received, but not sent</tp:docstring>
+ </tp:enumvalue>
+ <tp:enumvalue suffix="Bidirectional" value="3">
+ <tp:docstring>Media are being sent and received</tp:docstring>
+ </tp:enumvalue>
+ </tp:enum>
+
+ <tp:flags name="Media_Stream_Pending_Send" value-prefix="Media_Stream_Pending" type="u">
+ <tp:flag suffix="Local_Send" value="1">
+ <tp:docstring>
+ The local user has been asked to send media by the remote user.
+ Call <tp:member-ref>RequestStreamDirection</tp:member-ref> to
+ indicate whether or not this is acceptable.
+ </tp:docstring>
+ </tp:flag>
+ <tp:flag suffix="Remote_Send" value="2">
+ <tp:docstring>
+ The remote user has been asked to send media by the local user.
+ The <tp:member-ref>StreamDirectionChanged</tp:member-ref> signal
+ will be emitted when the remote user accepts or rejects this
+ change.
+ </tp:docstring>
+ </tp:flag>
+ </tp:flags>
+
+ <tp:struct name="Media_Stream_Info" array-name="Media_Stream_Info_List">
+ <tp:member type="u" tp:type="Stream_ID" name="Identifier"/>
+ <tp:member type="u" tp:type="Contact_Handle" name="Contact"/>
+ <tp:member type="u" tp:type="Media_Stream_Type" name="Type"/>
+ <tp:member type="u" tp:type="Media_Stream_State" name="State"/>
+ <tp:member type="u" tp:type="Media_Stream_Direction" name="Direction"/>
+ <tp:member type="u" tp:type="Media_Stream_Pending_Send"
+ name="Pending_Send_Flags"/>
+ </tp:struct>
+
+ <tp:simple-type name="Stream_ID" type="u"
+ array-name="Stream_ID_List">
+ <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
+ <p>An unsigned integer identifying a stream within a channel.</p>
+ </tp:docstring>
+ </tp:simple-type>
+
+ <method name="ListStreams" tp:name-for-bindings="List_Streams">
+ <arg direction="out" type="a(uuuuuu)" tp:type="Media_Stream_Info[]"
+ name="Streams">
+ <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
+ An array of structs containing:
+ <ul>
+ <li>the stream identifier</li>
+ <li>the contact handle who the stream is with (or 0 if the stream
+ represents more than a single member)</li>
+ <li>the type of the stream</li>
+ <li>the current stream state</li>
+ <li>the current direction of the stream</li>
+ <li>the current pending send flags</li>
+ </ul>
+ </tp:docstring>
+ </arg>
+ <tp:docstring>
+ Returns an array of structs representing the streams currently active
+ within this channel. Each stream is identified by an unsigned integer
+ which is unique for each stream within the channel.
+ </tp:docstring>
+ </method>
+
+ <method name="RemoveStreams" tp:name-for-bindings="Remove_Streams">
+ <arg direction="in" name="Streams" type="au" tp:type="Stream_ID[]">
+ <tp:docstring>
+ An array of stream identifiers (as defined in
+ <tp:member-ref>ListStreams</tp:member-ref>)
+ </tp:docstring>
+ </arg>
+
+ <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
+ <p>Request that the given streams are removed. If all streams are
+ removed, the channel MAY close.</p>
+
+ <p>Clients SHOULD NOT attempt to terminate calls by removing all the
+ streams; instead, clients SHOULD terminate calls by removing the
+ <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Channel.Interface">Group.SelfHandle</tp:dbus-ref>
+ from the channel, using either
+ <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Channel.Interface.Group">RemoveMembers</tp:dbus-ref>
+ or
+ <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Channel.Interface.Group">RemoveMembersWithReason</tp:dbus-ref>.
+ </p>
+ </tp:docstring>
+
+ <tp:possible-errors>
+ <tp:error name="org.freedesktop.Telepathy.Error.InvalidArgument">
+ <tp:docstring>
+ A stream identifier is unknown
+ </tp:docstring>
+ </tp:error>
+ </tp:possible-errors>
+ </method>
+
+ <method name="RequestStreamDirection"
+ tp:name-for-bindings="Request_Stream_Direction">
+ <arg direction="in" name="Stream_ID" type="u">
+ <tp:docstring>
+ The stream identifier (as defined in
+ <tp:member-ref>ListStreams</tp:member-ref>)
+ </tp:docstring>
+ </arg>
+ <arg direction="in" name="Stream_Direction" type="u" tp:type="Media_Stream_Direction">
+ <tp:docstring>
+ The desired stream direction (a value of MediaStreamDirection)
+ </tp:docstring>
+ </arg>
+ <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
+ <p>Request a change in the direction of an existing stream. In particular,
+ this might be useful to stop sending media of a particular type,
+ or inform the peer that you are no longer using media that is being
+ sent to you.</p>
+
+ <p>Depending on the protocol, streams which are no longer sending in
+ either direction should be removed and a
+ <tp:member-ref>StreamRemoved</tp:member-ref> signal emitted.
+ Some direction changes can be enforced locally (for example,
+ BIDIRECTIONAL -&gt; RECEIVE can be achieved by merely stopping sending),
+ others may not be possible on some protocols, and some need agreement
+ from the remote end. In this case, the MEDIA_STREAM_PENDING_REMOTE_SEND
+ flag will be set in the
+ <tp:member-ref>StreamDirectionChanged</tp:member-ref> signal, and the
+ signal
+ emitted again without the flag to indicate the resulting direction when
+ the remote end has accepted or rejected the change.</p>
+ </tp:docstring>
+ <tp:possible-errors>
+ <tp:error name="org.freedesktop.Telepathy.Error.InvalidArgument">
+ <tp:docstring>
+ A stream identifier is unknown
+ </tp:docstring>
+ </tp:error>
+ <tp:error name="org.freedesktop.Telepathy.Error.NotAvailable">
+ <tp:docstring>
+ The requested direction is not available on this stream
+ </tp:docstring>
+ </tp:error>
+ </tp:possible-errors>
+ </method>
+
+ <method name="RequestStreams" tp:name-for-bindings="Request_Streams">
+ <arg direction="in" name="Contact_Handle" type="u" tp:type="Contact_Handle">
+ <tp:docstring>
+ A contact handle with whom to establish the streams
+ </tp:docstring>
+ </arg>
+ <arg direction="in" name="Types" type="au" tp:type="Media_Stream_Type[]">
+ <tp:docstring>
+ An array of stream types (values of MediaStreamType)
+ </tp:docstring>
+ </arg>
+ <arg direction="out" type="a(uuuuuu)" tp:type="Media_Stream_Info[]"
+ name="Streams">
+ <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
+ An array of structs (in the same order as the given stream types)
+ containing:
+ <ul>
+ <li>the stream identifier</li>
+ <li>the contact handle who the stream is with (or 0 if the stream
+ represents more than a single member)</li>
+ <li>the type of the stream</li>
+ <li>the current stream state</li>
+ <li>the current direction of the stream</li>
+ <li>the current pending send flags</li>
+ </ul>
+ </tp:docstring>
+ </arg>
+ <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
+ <p>Request that streams be established to exchange the given types of
+ media with the given member. In general this will try and establish a
+ bidirectional stream, but on some protocols it may not be possible to
+ indicate to the peer that you would like to receive media, so a
+ send-only stream will be created initially. In the cases where the
+ stream requires remote agreement (eg you wish to receive media from
+ them), the <tp:member-ref>StreamDirectionChanged</tp:member-ref> signal
+ will be emitted with the
+ MEDIA_STREAM_PENDING_REMOTE_SEND flag set, and the signal emitted again
+ with the flag cleared when the remote end has replied.</p>
+
+ <p>If streams of the requested types already exist, calling this
+ method results in the creation of additional streams. Accordingly,
+ clients wishing to have exactly one audio stream or exactly one
+ video stream SHOULD check for the current streams using
+ <tp:member-ref>ListStreams</tp:member-ref> before calling this
+ method.</p>
+ </tp:docstring>
+ <tp:changed version="0.17.2">
+ <p>It is valid to use a handle which is neither
+ a current nor pending member in this channel's <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Channel.Interface">Group</tp:dbus-ref>
+ interface. If
+ so, that handle will be added to the remote-pending set only when
+ an attempt has actually been made to contact them. For further
+ call-state notification, use the <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Channel.Interface">CallState</tp:dbus-ref>
+ interface, if
+ supported. This usage was not allowed in spec versions below
+ 0.17.2.</p>
+ </tp:changed>
+ <tp:possible-errors>
+ <tp:error name="org.freedesktop.Telepathy.Error.InvalidHandle"/>
+ <tp:error name="org.freedesktop.Telepathy.Error.InvalidArgument">
+ <tp:docstring>
+ A stream type given is invalid.
+ </tp:docstring>
+ </tp:error>
+ <tp:error name="org.freedesktop.Telepathy.Error.NotImplemented">
+ <tp:docstring>
+ A stream type given is not implemented by the connection manager.
+ Since 0.17.23, connection managers SHOULD raise this error
+ in preference to InvalidArgument.
+ <tp:rationale>
+ Connection managers can't know whether an unknown number
+ is a valid stream type that was introduced in a later spec
+ version.
+ </tp:rationale>
+ </tp:docstring>
+ </tp:error>
+ <tp:error name="org.freedesktop.Telepathy.Error.NotAvailable">
+ <tp:docstring>
+ That contact's client does not implement one of the given stream
+ types. For this method, clients SHOULD consider this error and
+ NotCapable to be equivalent.
+ </tp:docstring>
+ </tp:error>
+ <tp:error name="org.freedesktop.Telepathy.Error.NotCapable">
+ <tp:docstring>
+ That contact's client does not implement one of the given stream
+ types. Since 0.17.23, connection managers SHOULD raise
+ this in preference to NotAvailable.
+ </tp:docstring>
+ </tp:error>
+ </tp:possible-errors>
+ </method>
+
+ <signal name="StreamAdded" tp:name-for-bindings="Stream_Added">
+ <arg name="Stream_ID" type="u">
+ <tp:docstring>
+ The stream identifier (as defined in
+ <tp:member-ref>ListStreams</tp:member-ref>)
+ </tp:docstring>
+ </arg>
+ <arg name="Contact_Handle" type="u" tp:type="Contact_Handle">
+ <tp:docstring>
+ The contact handle who the stream is with (or 0 if it
+ represents more than a single member)
+ </tp:docstring>
+ </arg>
+ <arg name="Stream_Type" type="u" tp:type="Media_Stream_Type">
+ <tp:docstring>
+ The stream type (a value from MediaStreamType)
+ </tp:docstring>
+ </arg>
+ <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
+ <p>Emitted when a new stream has been added to this channel.
+ Clients SHOULD assume that the stream's
+ <tp:type>Media_Stream_State</tp:type> is initially Disconnected.</p>
+
+ <p>If a connection manager needs to represent the addition of a stream
+ whose state is already Connecting or Connected, it MUST do this
+ by emitting StreamAdded, closely followed by
+ <tp:member-ref>StreamStateChanged</tp:member-ref> indicating a
+ change to the appropriate state.</p>
+
+ <tp:rationale>
+ <p>Historically, it was not clear from the StreamAdded signal what
+ the state of the stream was. telepathy-spec 0.17.22
+ clarified this.</p>
+ </tp:rationale>
+
+ <p>Similarly, clients SHOULD assume that the initial
+ <tp:type>Media_Stream_Direction</tp:type> of a newly added stream
+ is Receive, and that the initial
+ <tp:type>Media_Stream_Pending_Send</tp:type> is
+ Pending_Local_Send.</p>
+
+ <p>If a connection manager needs to represent the addition of a stream
+ whose direction or pending-send differs from those initial values,
+ it MUST do so by emitting StreamAdded, closely followed by
+ <tp:member-ref>StreamDirectionChanged</tp:member-ref> indicating a
+ change to the appropriate direction and pending-send state.</p>
+
+ <tp:rationale>
+ <p>StreamAdded doesn't itself indicate the stream's direction; this
+ is unfortunate, but is preserved for compatibility.</p>
+
+ <p>This is the appropriate direction for streams added by a remote
+ contact on existing connection managers, and does not violate
+ user privacy by automatically sending audio or video (audio streams
+ start off muted, video streams start off not sending). For
+ streams added by the local user using the client receiving the
+ signal, the true direction can also be determined from the return
+ value of the <tp:member-ref>RequestStreams</tp:member-ref>
+ method.</p>
+
+ <p>Existing clients typically operate by maintaining a separate
+ idea of the directions that they would like the streams to have,
+ and enforcing these intended directions by calling
+ <tp:member-ref>RequestStreamDirection</tp:member-ref> whenever
+ needed.</p>
+ </tp:rationale>
+ </tp:docstring>
+ </signal>
+
+ <signal name="StreamDirectionChanged"
+ tp:name-for-bindings="Stream_Direction_Changed">
+ <arg name="Stream_ID" type="u">
+ <tp:docstring>
+ The stream identifier (as defined in <tp:member-ref>ListStreams</tp:member-ref>)
+ </tp:docstring>
+ </arg>
+ <arg name="Stream_Direction" type="u" tp:type="Media_Stream_Direction">
+ <tp:docstring>
+ The new stream direction (as defined in ListStreams)
+ </tp:docstring>
+ </arg>
+ <arg name="Pending_Flags" type="u" tp:type="Media_Stream_Pending_Send">
+ <tp:docstring>
+ The new pending send flags (as defined in ListStreams)
+ </tp:docstring>
+ </arg>
+ <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
+ <p>Emitted when the direction or pending flags of a stream are
+ changed.</p>
+
+ <p>If the MEDIA_STREAM_PENDING_LOCAL_SEND flag is set, the remote user
+ has requested that we begin sending on this stream.
+ <tp:member-ref>RequestStreamDirection</tp:member-ref>
+ should be called to indicate whether or not this change is
+ acceptable.</p>
+
+ <tp:rationale>
+ <p>This allows for a MSN-style user interface, "Fred has asked you
+ to enable your webcam. (Accept | Reject)", if desired.</p>
+ </tp:rationale>
+ </tp:docstring>
+ </signal>
+
+ <signal name="StreamError" tp:name-for-bindings="Stream_Error">
+ <arg name="Stream_ID" type="u">
+ <tp:docstring>
+ The stream identifier (as defined in
+ <tp:member-ref>ListStreams</tp:member-ref>)
+ </tp:docstring>
+ </arg>
+ <arg name="Error_Code" type="u" tp:type="Media_Stream_Error">
+ <tp:docstring>
+ A stream error number, one of the values of MediaStreamError
+ </tp:docstring>
+ </arg>
+ <arg name="Message" type="s">
+ <tp:docstring>
+ A string describing the error (for debugging purposes only)
+ </tp:docstring>
+ </arg>
+ <tp:docstring>
+ Emitted when a stream encounters an error.
+ </tp:docstring>
+ </signal>
+
+ <signal name="StreamRemoved" tp:name-for-bindings="Stream_Removed">
+ <arg name="Stream_ID" type="u">
+ <tp:docstring>
+ stream_id - the stream identifier (as defined in
+ <tp:member-ref>ListStreams</tp:member-ref>)
+ </tp:docstring>
+ </arg>
+ <tp:docstring>
+ Emitted when a stream has been removed from this channel.
+ </tp:docstring>
+ </signal>
+
+ <signal name="StreamStateChanged"
+ tp:name-for-bindings="Stream_State_Changed">
+ <arg name="Stream_ID" type="u">
+ <tp:docstring>
+ The stream identifier (as defined in
+ <tp:member-ref>ListStreams</tp:member-ref>)
+ </tp:docstring>
+ </arg>
+ <arg name="Stream_State" type="u" tp:type="Media_Stream_State">
+ <tp:docstring>
+ The new stream state (as defined in ListStreams)
+ </tp:docstring>
+ </arg>
+ <tp:docstring>
+ Emitted when a member's stream's state changes.
+ </tp:docstring>
+ </signal>
+
+ <property name="InitialAudio" tp:name-for-bindings="Initial_Audio"
+ type="b" access="read">
+ <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
+ <p>If set to true in a channel request that will create a new channel,
+ the connection manager should immediately attempt to establish an
+ audio stream to the remote contact, making it unnecessary for the
+ client to call <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Channel.Type.StreamedMedia">RequestStreams</tp:dbus-ref>.</p>
+
+ <p>If this property, or InitialVideo, is passed to EnsureChannel
+ (as opposed to CreateChannel), the connection manager SHOULD ignore
+ these properties when checking whether it can return an existing
+ channel as suitable; these properties only become significant when
+ the connection manager has decided to create a new channel.</p>
+
+ <p>If true on a requested channel, this indicates that the audio
+ stream has already been requested and the client does not need to
+ call RequestStreams, although it MAY still do so.</p>
+
+ <p>If true on an unrequested (incoming) channel, this indicates that
+ the remote contact initially requested an audio stream; this does
+ not imply that that audio stream is still active (as indicated by
+ <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Channel.Type.StreamedMedia">ListStreams</tp:dbus-ref>).</p>
+
+ <p>This property is immutable (cannot change), and therefore SHOULD
+ appear wherever immutable properties are reported, e.g. <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Connection.Interface.Requests">NewChannels</tp:dbus-ref>
+ signals.</p>
+
+ <tp:rationale><p>This reduces D-Bus round trips.</p></tp:rationale>
+
+ <p>Connection managers capable of signalling audio calls to contacts
+ SHOULD include a channel class in <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Connection.Interface.Requests">RequestableChannelClasses</tp:dbus-ref>
+ with <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Channel">ChannelType</tp:dbus-ref>
+ = <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Channel.Type">StreamedMedia</tp:dbus-ref>
+ and <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Channel">TargetHandleType</tp:dbus-ref>
+ = Contact in the fixed properties dictionary, and InitialAudio
+ (and also InitialVideo, if applicable) in the allowed properties
+ list. Clients wishing to discover whether a connection manager
+ can signal audio and/or video calls SHOULD use this information.</p>
+
+ <tp:rationale>
+ <p>Not all protocols support signalling video calls, and it would be
+ possible (although unlikely) to have a protocol where only video,
+ and not audio, could be signalled.</p>
+ </tp:rationale>
+
+ <p>Connection managers that support the <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Connection.Interface">ContactCapabilities</tp:dbus-ref>
+ interface SHOULD represent the capabilities of receiving audio
+ and/or video calls by including a channel class in
+ a contact's capabilities with ChannelType = StreamedMedia
+ in the fixed properties dictionary, and InitialAudio and/or
+ InitialVideo in the allowed properties list. Clients wishing to
+ discover whether a particular contact is likely to be able to
+ receive audio and/or video calls SHOULD use this information.</p>
+
+ <tp:rationale>
+ <p>Not all clients support video calls, and it would also be
+ possible (although unlikely) to have a client which could only
+ stream video, not audio.</p>
+ </tp:rationale>
+
+ <p>Clients that are willing to receive audio and/or video calls
+ SHOULD include the following among their channel classes if
+ calling <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Connection.Interface.ContactCapabilities">UpdateCapabilities</tp:dbus-ref>
+ (clients of a <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy">ChannelDispatcher</tp:dbus-ref>
+ SHOULD instead arrange for the ChannelDispatcher to do this,
+ by including the filters in their <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Client.Handler">HandlerChannelFilter</tp:dbus-ref>
+ properties):</p>
+
+ <ul>
+ <li>{ ChannelType = StreamedMedia }</li>
+ <li>{ ChannelType = StreamedMedia, InitialAudio = true }
+ if receiving calls with audio is supported</li>
+ <li>{ ChannelType = StreamedMedia, InitialVideo = true }
+ if receiving calls with video is supported</li>
+ </ul>
+
+ <tp:rationale>
+ <p>Connection managers for protocols with capability discovery,
+ like XMPP, need this information to advertise the appropriate
+ capabilities for their protocol.</p>
+ </tp:rationale>
+ </tp:docstring>
+ </property>
+
+ <property name="InitialVideo" tp:name-for-bindings="Initial_Video"
+ type="b" access="read">
+ <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
+ <p>The same as <tp:member-ref>InitialAudio</tp:member-ref>, but for
+ a video stream. This property is immutable (cannot change).</p>
+
+ <p>In particular, note that if this property is false, this does not
+ imply that an active video stream has not been added, only that no
+ video stream was active at the time the channel appeared.</p>
+
+ <p>This property is the correct way to discover whether connection
+ managers, contacts etc. support video calls; it appears in
+ capabilities structures in the same way as InitialAudio.</p>
+ </tp:docstring>
+ </property>
+
+ <property name="ImmutableStreams" tp:name-for-bindings="Immutable_Streams"
+ type="b" access="read">
+ <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
+ <p>If <tt>True</tt>, once streams have been requested for this channel
+ (either by setting <tp:member-ref>InitialAudio</tp:member-ref> or
+ <tp:member-ref>InitialVideo</tp:member-ref> when the channel is
+ requested, or by calling
+ <tp:member-ref>RequestStreams</tp:member-ref> on a channel with no
+ streams), a stream of a different content type cannot be added;
+ subsequent calls to <tp:member-ref>RequestStreams</tp:member-ref>
+ that attempt to do so will fail.</p>
+
+ <p>If this property is missing, clients SHOULD assume that it is false,
+ and thus that the channel's streams can be changed once the call has
+ started.</p>
+
+ <p>If this property is present in the "allowed" set in all of the
+ StreamedMedia entries in a contact's capabilities, then user
+ interfaces MAY choose to show a separate "call" option for each
+ class of call.</p>
+
+ <tp:rationale>
+ <p>For example, once an audio-only Google Talk call has started,
+ it is not possible to add a video stream; both audio and video
+ must be requested at the start of the call if video is desired.
+ User interfaces may use this pseudo-capability as a hint to
+ display separate "Audio call" and "Video call" buttons, rather
+ than a single "Call" button with the option to add and remove
+ video once the call has started for contacts without this flag.
+ </p>
+ </tp:rationale>
+
+ <p>This property is immutable, and therefore SHOULD be announced
+ in <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Connection.Interface.Requests">NewChannels</tp:dbus-ref>,
+ etc.</p>
+ </tp:docstring>
+ </property>
+
+ <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
+ <p>A channel that can send and receive streamed media such as audio or
+ video. Provides a number of methods for listing and requesting new
+ streams, and signals to indicate when streams have been added, removed
+ and changed status. The state of the call (ringing remotely, ringing
+ locally, answered, missed, etc.) are represented using the properties
+ and signals of the Group interface.</p>
+
+ <p>In general this should be used in conjunction with the <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Channel.Interface">MediaSignalling</tp:dbus-ref>
+ interface to exchange connection candidates and codec choices with
+ whichever component is responsible for the streams. However, in certain
+ applications where no candidate exchange is necessary (eg the streams
+ are handled by specialised hardware which is controlled directly by the
+ connection manager), the signalling interface can be omitted and this
+ channel type used simply to control the streams.</p>
+
+ <h4>Outgoing calls</h4>
+
+ <p>To make an audio-only call to a contact <tt>foo@example.com</tt>,
+ clients should call:</p>
+
+ <blockquote>
+ <pre>
+<tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Connection.Interface.Requests">CreateChannel</tp:dbus-ref>({
+ <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Channel">ChannelType</tp:dbus-ref>: <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Channel.Type">StreamedMedia</tp:dbus-ref>,
+ <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Channel">TargetHandleType</tp:dbus-ref>: Contact,
+ <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Channel">TargetID</tp:dbus-ref>: 'foo@example.com',
+ <tp:member-ref>InitialAudio</tp:member-ref>: True,
+)</pre></blockquote>
+
+ <p>As always, <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Channel">TargetHandle</tp:dbus-ref>
+ may be used in place of TargetID if the contact's handle is already
+ known. To make an audio-and-video call, the client should also specify
+ <tp:member-ref>InitialVideo</tp:member-ref>. The connection manager
+ SHOULD return a channel whose immutable properties contain the local
+ user as the <tp:dbus-ref namespace='ofdT.Channel'>InitiatorHandle</tp:dbus-ref>,
+ the remote contact as the <tp:dbus-ref namespace='ofdT.Channel'>TargetHandle</tp:dbus-ref>,
+ <tp:dbus-ref namespace='ofdT.Channel'>Requested</tp:dbus-ref> = <code>True</code>
+ (indicating that the call is outgoing); the <tp:dbus-ref
+ namespace='ofdT.Channel.Interface'>Group</tp:dbus-ref> interface should
+ initially have the local user in <tp:dbus-ref
+ namespace='ofdT.Channel.Interface.Group'>Members</tp:dbus-ref> and the remote
+ contact in <tp:dbus-ref
+ namespace='ofdT.Channel.Interface.Group'>RemotePendingMembers</tp:dbus-ref>, to
+ indicate that we are awaiting their response.</p>
+
+ <p>The contact answering the call is represented by the CM signalling
+ <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Channel.Interface.Group">MembersChanged</tp:dbus-ref>,
+ moving the remote contact to Members, with the remote contact as the
+ <var>Actor</var> and <var>Reason</var> <code>None</code>. The contact
+ rejecting the call is represented by both contacts being removed from
+ the group, with the remote contact as the <var>Actor</var> and
+ <var>Reason</var> set appropriately. The local user may hang up at any
+ time by calling
+ <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Channel.Interface.Group">RemoveMembersWithReason</tp:dbus-ref>
+ to remove themself, with an appropriate reason; the CM SHOULD relay the
+ reason to the remote contact, and emit MembersChanged removing both
+ contacts from the group with the self handle as the <var>Actor</var>.</p>
+
+ <p>(In the past, several other patterns have been used to place outgoing
+ calls; see
+ <a href="http://telepathy.freedesktop.org/wiki/Requesting%20StreamedMedia%20channels">'Requesting StreamedMedia Channels' on the Telepathy wiki</a>
+ for the details.)</p>
+
+ <h4>Incoming calls</h4>
+
+ <p>Incoming calls' immutable properties should contain <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Channel">TargetHandleType</tp:dbus-ref>
+ = Contact, both <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Channel">TargetHandle</tp:dbus-ref> and
+ <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Channel">InitiatorHandle</tp:dbus-ref>
+ set to the remote contact, <tp:dbus-ref
+ namespace='ofdT.Channel'>Requested</tp:dbus-ref> = <code>False</code>
+ (indicating that this is an incoming call), and appropriate values of
+ <tp:member-ref>InitialAudio</tp:member-ref> and
+ <tp:member-ref>InitialVideo</tp:member-ref>; the Group interface should
+ initially have the local user in <tp:dbus-ref
+ namespace="ofdT.Channel.Interface.Group">LocalPendingMembers</tp:dbus-ref>
+ and the remote contact in <tp:dbus-ref
+ namespace="ofdT.Channel.Interface.Group">Members</tp:dbus-ref>,
+ indicating that the contact is awaiting our response.</p>
+
+ <p>To accept the call, use <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Channel.Interface.Group">AddMembers</tp:dbus-ref>
+ to move the local user to the group's members. To reject the call, use
+ <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Channel.Interface.Group">RemoveMembersWithReason</tp:dbus-ref>
+ to remove the local member from the group, with an appropriate reason.
+ If the remote user ends the call before it is answered, this is
+ represented by <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Channel.Interface.Group">MembersChanged</tp:dbus-ref>
+ removing both parties from the group with the remote contact as the
+ <var>Actor</var>, and <var>Reason</var> set appropriately.</p>
+
+ <p>Note that the call may end with the self handle as the
+ <var>Actor</var> without the user having chosen to reject the call, as
+ indicated by the nature of the <var>Reason</var>. Specifically, some
+ local component may time out the call (indicating this with reason
+ <code>No_Answer</code>; for example, the CM may have forwarded the call
+ to another number, as configured using <tp:dbus-ref
+ namespace='ofdT.Connection.Interface'>Forwarding.DRAFT</tp:dbus-ref>),
+ or something may have gone wrong with the call
+ (indicated by reason <code>Error</code>). Such calls SHOULD be
+ considered missed, just as if the remote contact had hung up before the
+ local user answered the call.</p>
+
+ <tp:rationale>
+ <p>This is a bit awkward, but these are the best ways we can represent
+ these situations. It's important to document which calls should be
+ considered missed, to ensure that the user can be notified.</p>
+ </tp:rationale>
+
+ <p>When the local user accepts an incoming call, the connection manager
+ SHOULD change the direction of any streams with pending local send
+ to be sending, without altering whether those streams are
+ receiving.</p>
+
+ <tp:rationale>
+ <p>This matches existing practice, and means that a client
+ can answer incoming calls and get an unmuted microphone/activated
+ webcam without having to take additional action to accept the
+ stream directions.</p>
+
+ <p>It does, however, introduce a race condition: a client believing
+ that it is accepting an audio-only call by calling AddMembers
+ can inadvertantly accept an audio + video call (and hence activate
+ sending from a webcam without the user's permission) if a video
+ stream is added just before AddMembers is processed. This race
+ should be removed when this specification is revised.</p>
+ </tp:rationale>
+
+ <h4>During a call</h4>
+
+ <p>If <tp:member-ref>ImmutableStreams</tp:member-ref> is
+ <code>False</code>, new streams may be requested using
+ <tp:member-ref>RequestStreams</tp:member-ref> (to add video to an
+ audio-only call, for instance), and existing streams may be removed using
+ <tp:member-ref>RemoveStreams</tp:member-ref> (for example, to downgrade
+ an audio-video call to audio-only). The call may be ended by calling
+ <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Channel.Interface.Group">RemoveMembers</tp:dbus-ref>
+ or <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Channel.Interface.Group">RemoveMembersWithReason</tp:dbus-ref>; the call ending is signalled by the CM emitting <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Channel.Interface.Group">MembersChanged</tp:dbus-ref>,
+ removing both parties from the group.</p>
+
+ <h4>Handler filters</h4>
+
+ <p>For historical reasons, handlers must specify more than one filter if
+ they want to correctly advertise support for audio and/or video calls. If
+ they can handle channels using the <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Channel.Interface">MediaSignalling</tp:dbus-ref>
+ interface, they should also advertise various
+ <tp:type>Handler_Capability_Token</tp:type>s to indicate which codecs and
+ transports they support. See <tp:member-ref>InitialAudio</tp:member-ref>
+ and <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Channel.Interface">MediaSignalling/video/h264</tp:dbus-ref>
+ for the gory details. In summary:</p>
+
+ <dl>
+ <dt>To advertise support for streamed media in general, include the
+ following filter in <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Client.Handler">HandlerChannelFilter</tp:dbus-ref>:</dt>
+ <dd><pre>
+{ '...Channel.ChannelType': '...Channel.Type.StreamedMedia' ,
+ '...Channel.TargetHandleType': Contact,
+}</pre></dd>
+
+ <dt>To advertise support for audio calls, also include the following
+ filter:</dt>
+ <dd><pre>
+{ '...Channel.ChannelType': '...Channel.Type.StreamedMedia' ,
+ '...Channel.TargetHandleType': Contact,
+ '...Channel.Type.StreamedMedia.InitialAudio': True,
+}</pre></dd>
+
+ <dt>To advertise support for video calls, also include the following
+ filter:</dt>
+ <dd><pre>
+{ '...Channel.ChannelType': '...Channel.Type.StreamedMedia' ,
+ '...Channel.TargetHandleType': Contact,
+ '...Channel.Type.StreamedMedia.InitialVideo': True,
+}</pre></dd>
+
+ <dt>If you use telepathy-farsight, and have H.264 support, you probably
+ want these <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy.Client.Handler">Capabilities</tp:dbus-ref>:</dt>
+ <dd><pre>
+[ "org.freedesktop.Telepathy.Channel.Interface.MediaSignalling/ice-udp",
+ "org.freedesktop.Telepathy.Channel.Interface.MediaSignalling/gtalk-p2p",
+ "org.freedesktop.Telepathy.Channel.Interface.MediaSignalling/video/h264",
+]</pre></dd>
+ </dl>
+ </tp:docstring>
+
+ <tp:flags name="Channel_Media_Capabilities" value-prefix="Channel_Media_Capability" type="u">
+ <tp:docstring>
+ The channel-type-specific capability flags used for
+ Channel.Type.StreamedMedia in the <tp:dbus-ref
+ namespace="org.freedesktop.Telepathy">Connection.Interface.Capabilities</tp:dbus-ref>
+ interface. See the <tp:member-ref>InitialAudio</tp:member-ref>
+ property for details of the mechanisms that will replace this.
+ </tp:docstring>
+ <tp:flag suffix="Audio" value="1">
+ <tp:docstring>
+ The handle is capable of using audio streams within a media channel.
+ </tp:docstring>
+ </tp:flag>
+ <tp:flag suffix="Video" value="2">
+ <tp:docstring>
+ The handle is capable of using video streams within a media channel.
+ </tp:docstring>
+ </tp:flag>
+ <tp:flag suffix="NAT_Traversal_STUN" value="4">
+ <tp:docstring>
+ The handle is capable of performing STUN to traverse NATs.
+ </tp:docstring>
+ </tp:flag>
+ <tp:flag suffix="NAT_Traversal_GTalk_P2P" value="8">
+ <tp:docstring>
+ The handle is capable of establishing Google Talk peer-to-peer
+ connections (as implemented in libjingle 0.3) to traverse NATs.
+ </tp:docstring>
+ </tp:flag>
+ <tp:flag suffix="NAT_Traversal_ICE_UDP" value="16">
+ <tp:docstring>
+ The handle is capable of establishing ICE UDP peer-to-peer
+ connections (as defined by the IETF MMUSIC working group) to traverse
+ NATs.
+ </tp:docstring>
+ </tp:flag>
+
+ <tp:flag suffix="Immutable_Streams" value="32">
+ <tp:docstring>
+ Channels whose target handle is this contact will have
+ <tp:member-ref>ImmutableStreams</tp:member-ref> = <tt>True</tt>.
+ </tp:docstring>
+ </tp:flag>
+
+ </tp:flags>
+
+ </interface>
+</node>
+<!-- vim:set sw=2 sts=2 et ft=xml: -->