<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE xep SYSTEM 'xep.dtd' [
  <!ENTITY % ents SYSTEM 'xep.ent'>
%ents;
]>
<?xml-stylesheet type='text/xsl' href='xep.xsl'?>
<xep>
  <header>
    <title>Delivering Conference Information to Jingle Participants (Coin)</title>
    <abstract>This specification defines an XMPP extension for tightly coupled
      conference calls. It allows users who participate in multiparty Jingle
      calls via a focus agent (mixer) to retrieve information and receive
      notifications about the state of the call and the other participants.
      This extension is also meant to provide a straightforward way of
      connecting SIP and XMPP clients to the same conference room.
    </abstract>
    &LEGALNOTICE;
    <number>0298</number>
    <status>Experimental</status>
    <type>Standards Track</type>
    <sig>Standards</sig>
    <approver>Council</approver>
    <dependencies>
      <spec>XEP-0167</spec>
    </dependencies>
    <supersedes />
    <supersededby />
    <shortname>coin</shortname>
    <author>
      <firstname>Emil</firstname>
      <surname>Ivov</surname>
      <email>emcho@jitsi.org</email>
      <jid>emcho@jit.si</jid>
    </author>
    <author>
      <firstname>Enrico</firstname>
      <surname>Marocco</surname>
      <email>enrico.marocco@telecomitalia.it</email>
      <jid>enrico@tilab.com</jid>
    </author>
    <author>
      <firstname>Saúl Ibarra</firstname>
      <surname>Corretgé</surname>
      <email>saul@ag-projects.com</email>
      <jid>saul@ag-projects.com</jid>
    </author>
    <discuss>jingle</discuss>
    <revision>
      <version>0.2</version>
      <date>2015-07-02</date>
      <initials>sic</initials>
      <remark><p>Correcting errors in grammar and examples; aligning closer to dependent specifications.</p></remark>
    </revision>
    <revision>
      <version>0.1</version>
      <date>2011-06-09</date>
      <initials>psa</initials>
      <remark><p>Initial published version.</p></remark>
    </revision>
    <revision>
      <version>0.0.1</version>
      <date>2011-06-09</date>
      <initials>ei/em</initials>
      <remark>
        <p>First draft.</p>
      </remark>
    </revision>
  </header>
  <section1 topic='Introduction' anchor='intro'>
    <p>&xep0166; defines a way for XMPP agents to establish and control
    one-to-one media sessions. It is possible for either participant in such a
    session to also establish additional conversations and then serve as a
    media mixer. This could be viewed as a classic conference call scenario
    and is also often referred to as a tightly coupled conference.</p>

    <p>Basic participation or hosting of tightly coupled conferences requires
    no specific protocol support. With the exception of the mixing agent, call
    members, however, all perceive the session as a regular one-to-one call.
    They have no way of obtaining additional information about how many and what
    other users are participating.</p>

    <p>The Coin extension (short for Conference Information) allows media
    mixers to deliver to participants additional information about the status
    of the call, and that of its members.</p>

    <p>A conference participant exchanges Coin IQs only with the agent they
    have established a session with. This means that it can also be used in
    cases where only a subset of the users on a call are using XMPP while others
    are connected via alternative mechanisms such as SIP conferencing as defined
    in &rfc4579;</p>
  </section1>
  <section1 topic='Terminology' anchor='terms'>
  <dl>
    <di>
      <dt>Mixer</dt>
      <dd>Throughout this document the term is used to depict an entity that is
      responsible for mixing and delivering to conference participants both
      signalling and media. Other specifications refer to mixers and focus
      agents as two distinct entities but we find this separation to be
      unnecessary in the current specification and view both as a single logical
      entity. This entity may be a person hosting the conference and doing the mixing
      or a dedicated entity to which participants connect in order to establish a conference.
      For the purposes of this specification, both scenarios are equivalent.</dd>
    </di>
  </dl>
</section1>
  <section1 topic='Requirements' anchor='reqs'>
    <p>The extension defined herein is designed to meet the following
      requirements:</p>
    <ol>
      <li>Provide a means for mixer agents in tightly coupled
        conferences to advertise call and member state information to the call
        participants.</li>
      <li>Reuse the existing format and XML schema already
        defined in <cite>RFC 4575</cite>.</li>
      <li>Impose no requirements on agents joining the call other than those
      necessary to establish a regular one-to-one call.</li>
      <li>Allow straightforward interoperability with other conferencing
        mechanisms such as &rfc4579; or &xep0272;</li>
    </ol>
  </section1>
  <section1 topic='How It Works' anchor='howitworks'>
    <p>This section provides a friendly introduction to Coin.</p>
    <p>In essence Coin allows clients that establish Jingle calls to
    determine whether their peer is acting as a mixer or to announce themselves
    as such. This way non-mixer participants would know when they are
    participating in a conference call and would be able to notify the user
    accordingly.</p>


    <p>Once in a call, participants and mixers can use Coin to exchange
    &rfc4575; conference information indicating what participants
    are currently on the call and what their status is.</p>
  </section1>
  <section1 topic='Creating a conference call' anchor='call-create'>
    <p>When creating conference calls mixers SHOULD indicate the nature of the
    call as early as possible. This is necessary in order to allow other
    participating user agents to adapt their user interface in an appropriate
    way.</p>

    <code caption="A mixer sends session-initiate for a conference call">
    <![CDATA[
<iq from='romeo@montague.lit/orchard'
    id='zid615d9'
    to='juliet@capulet.lit/balcony'
    type='set'>
  <jingle xmlns='urn:xmpp:jingle:1'>
          action='session-initiate'
          initiator='romeo@montague.lit/orchard'
          sid='a73sjjvkla37jfea'>
    <content creator='initiator' name='this-is-a-stub'>
      <description xmlns='urn:xmpp:jingle:apps:stub:0'/>
      <transport xmlns='urn:xmpp:jingle:transports:stub:0'/>
    </content>
    <conference-info xmlns='urn:xmpp:coin:1' isfocus='true'/>
  </jingle>
</iq>
    ]]></code>
    <p>Similarly mixers being dialed by new participants SHOULD indicate the
    nature of the call by including the &lt;conference-info/&gt; element into
    the Jingle session-accept message.</p>
    <p>Finally, when transforming an existing one-to-one session into a
     conference or vice-versa a mixer SHOULD send a Jingle session-info message
     with the appropriate &lt;conference-info/&gt; element. </p>
    <p>Note that presence of the &lt;conference-info/&gt; element is only
    determines whether the party sending it is currently acting as a mixer or
    not. If multiple peers in a call are independently acting as mixers they
    should all indicate their status accordingly.</p>
  </section1>
  <section1 topic='Delivering conference information' anchor='coin-delivery'>
    <p>Once a conference call has been established and advertised as such, a
    mixer MAY at any point send information describing the state of the call and
    its current participants.</p>

    <code caption="Mixer sends information about the current state of the call">
    <![CDATA[
<iq from='romeo@montague.lit/orchard'
    id='zid615d9'
    to='juliet@capulet.lit/balcony'
    type='set'>
    <jingle xmlns='urn:xmpp:jingle:1' sid='a73sjjvkla37jfea'/>
    <conference-info xmlns="urn:ietf:params:xml:ns:conference-info"
                     entity="xmpp:romeo@monague.lit/orchard"
                     state="full"
                     version="1">

     <!-- CONFERENCE INFO -->
     <conference-description>
       <subject>Ending a relationship</subject>
     </conference-description>

     <!-- CONFERENCE STATE -->
     <conference-state>
       <user-count>3</user-count>
     </conference-state>

     <!-- USERS -->
     <users>
       <user entity="xmpp:romeo@montague.lit" state="full">
         <display-text>Romeo</display-text>

         <!-- ENDPOINTS -->
         <endpoint entity="xmpp:romeo@montague.lit/orchard">
           <display-text>Romeo's smartphone</display-text>
           <status>disconnected</status>
           <disconnection-info>
             <when>2011-01-31T20:00:00Z</when>
             <reason>poisoned</reason>
           </disconnection-info>

           <!-- MEDIA -->
           <media id="1">
             <display-text>main audio</display-text>
             <type>audio</type>
             <src-id>432424</src-id>
           </media>
         </endpoint>
       </user>

       <user entity="xmpp:juliet@capulet.lit" state="full">
         <display-text>Juliet</display-text>

         <!-- ENDPOINTS -->
         <endpoint entity="juliet@capulet.lit/balcony">
           <display-text>Juliet's netbook</display-text>
           <status>connected</status>

           <!-- MEDIA -->
           <media id="1">
             <type>audio</type>
             <src-id>2124</src-id>
           </media>
         </endpoint>
       </user>

       <!-- USER -->
       <user entity="sip:alice@example.com" state="full">
         <display-text>Alice</display-text>

         <!-- ENDPOINTS -->
         <endpoint entity="sip:4kfk4j392jsu@example.com;grid=433kj4j3u">
           <status>connected</status>

           <!-- MEDIA -->
           <media id="1">
             <type>audio</type>
             <src-id>534232</src-id>
           </media>
         </endpoint>
       </user>
     </users>
   </conference-info>
</iq>

  ]]></code>

  <p>The IQ message containing the conference info document MAY also contain a jingle element with the
  session id attribute indicting the session to which the conference information refers to.</p>

  </section1>


  <section1 topic='Determining Support' anchor='support'>
    <p>If an entity supports Coin, it SHOULD advertise that fact by returning
    a feature of "urn:xmpp:coin:1" in response to a &xep0030;
    information request.</p>
    <example caption="Service Discovery Information Request"><![CDATA[
<iq from='kingclaudius@shakespeare.lit/castle'
    id='ku6e51v3'
    to='laertes@shakespeare.lit/castle'
    type='get'>
  <query xmlns='http://jabber.org/protocol/disco#info'/>
</iq>
    ]]></example>
    <example caption="Service Discovery Information Response"><![CDATA[
<iq from='laertes@shakespeare.lit/castle'
    id='ku6e51v3'
    to='kingclaudius@shakespeare.lit/castle'
    type='result'>
  <query xmlns='http://jabber.org/protocol/disco#info'>
    <feature var='urn:xmpp:coin:1'/>
  </query>
</iq>
    ]]></example>
    <p>In order for an application to determine whether an entity supports this
    protocol, where possible it SHOULD use the dynamic, presence-based profile
    of service discovery defined in &xep0115;. However, if an application has
    not received entity capabilities information from an entity, it SHOULD use
    explicit service discovery instead.</p>
  </section1>
  <section1 topic='Security Considerations' anchor='security'>
    <p>PENDING: <cite>RFC 4575</cite> mostly talks about authentication
    conference-info subscriptions but these are not part of this specification.
    The authors are hence currently unaware of any other Coin specific security
    considerations</p>
  </section1>
  <section1 topic='Open Issues' anchor='issues'>
    <p>This document provides a basic description of a simple way to support
    tightly coupled conference calls. It is in many respects still a stub and a
    number of open issues require the attention of the community:</p>
    <ol>
      <li>Need to define best practices for user agents to easily determine
      whether the request of user to establish a conference call should result
      in a Muji or a Coin conference.</li>
    </ol>
  </section1>
  <section1 topic='XML Schemas' anchor='schema'>
      <section2 topic='Advertising Conf Calls' anchor='schema-discover'>
    <code><![CDATA[
<?xml version='1.0' encoding='UTF-8'?>

<xs:schema
    xmlns:xs='http://www.w3.org/2001/XMLSchema'
    targetNamespace='urn:xmpp:coin:1'
    xmlns='urn:xmpp:coin:1'
    elementFormDefault='qualified'>

  <xs:annotation>
    <xs:documentation>
      The protocol documented by this schema is defined in
      XEP-0298: http://www.xmpp.org/extensions/xep-0298.html
    </xs:documentation>
  </xs:annotation>

  <xs:element name="conference-info" type="empty">
    <xs:complexType>
      <xs:attribute name='isfocus' type='xs:boolean' required='true'/>
    </xs:complexType>
  </xs:element>

</xs:schema>
    ]]></code>
  </section2>
  <section2 topic='Conference Info' anchor='schema-coin'>
    <code><![CDATA[
<?xml version="1.0" encoding="UTF-8" ?>
   <xs:schema
   targetNamespace="urn:ietf:params:xml:ns:conference-info"
   xmlns:tns="urn:ietf:params:xml:ns:conference-info"
   xmlns:xs="http://www.w3.org/2001/XMLSchema"
   xmlns="urn:ietf:params:xml:ns:conference-info"
   elementFormDefault="qualified"
   attributeFormDefault="unqualified">

   <xs:annotation>
    <xs:documentation>
      The protocol documented by this schema is defined in
      RFC 4575: http://tools.ietf.org/html/rfc4575  and reused by
      XEP-0298 http://www.xmpp.org/extensions/xep-0298.html
    </xs:documentation>
  </xs:annotation>

   <!--
     This imports the xml:language definition
   -->
      <xs:import namespace="http://www.w3.org/XML/1998/namespace"
       schemaLocation="http://www.w3.org/2001/03/xml.xsd"/>
   <!--
     CONFERENCE ELEMENT
   -->
      <xs:element name="conference-info" type="conference-type"/>
      <!--
         CONFERENCE TYPE
      -->
      <xs:complexType name="conference-type">
       <xs:sequence>
        <xs:element name="conference-description"
         type="conference-description-type" minOccurs="0"/>
        <xs:element name="host-info"
         type="host-type" minOccurs="0"/>
        <xs:element name="conference-state"
         type="conference-state-type" minOccurs="0"/>
        <xs:element name="users"
         type="users-type" minOccurs="0"/>
        <xs:element name="sidebars-by-ref"
         type="uris-type" minOccurs="0"/>
        <xs:element name="sidebars-by-val"
         type="sidebars-by-val-type" minOccurs="0"/>
        <xs:any namespace="##other" processContents="lax"
         minOccurs="0" maxOccurs="unbounded"/>
       </xs:sequence>
       <xs:attribute name="entity"
        type="xs:anyURI" use="required"/>
       <xs:attribute name="state"
        type="state-type" use="optional" default="full"/>
       <xs:attribute name="version"
        type="xs:unsignedInt" use="optional"/>
       <xs:anyAttribute namespace="##other" processContents="lax"/>
      </xs:complexType>
      <!--
         STATE TYPE
      -->
      <xs:simpleType name="state-type">
       <xs:restriction base="xs:string">
        <xs:enumeration value="full"/>
        <xs:enumeration value="partial"/>
        <xs:enumeration value="deleted"/>
       </xs:restriction>
      </xs:simpleType>
      <!--
         CONFERENCE DESCRIPTION TYPE
      -->
      <xs:complexType name="conference-description-type">
       <xs:sequence>
        <xs:element name="display-text"
         type="xs:string" minOccurs="0"/>
        <xs:element name="subject"
         type="xs:string" minOccurs="0"/>
        <xs:element name="free-text"
         type="xs:string" minOccurs="0"/>
        <xs:element name="keywords"
         type="keywords-type" minOccurs="0"/>
        <xs:element name="conf-uris"
         type="uris-type" minOccurs="0"/>
        <xs:element name="service-uris"
         type="uris-type" minOccurs="0"/>
        <xs:element name="maximum-user-count"
         type="xs:unsignedInt" minOccurs="0"/>
        <xs:element name="available-media"
         type="conference-media-type" minOccurs="0"/>
        <xs:any namespace="##other" processContents="lax"
         minOccurs="0" maxOccurs="unbounded"/>
       </xs:sequence>
       <xs:anyAttribute namespace="##other" processContents="lax"/>
      </xs:complexType>
      <!--
         HOST TYPE
      -->
      <xs:complexType name="host-type">
       <xs:sequence>
        <xs:element name="display-text" type="xs:string"
         minOccurs="0"/>
        <xs:element name="web-page" type="xs:anyURI"
         minOccurs="0"/>
        <xs:element name="uris" type="uris-type"
         minOccurs="0"/>
        <xs:any namespace="##other" processContents="lax"
         minOccurs="0" maxOccurs="unbounded"/>
       </xs:sequence>
       <xs:anyAttribute namespace="##other" processContents="lax"/>
      </xs:complexType>
      <!--
         CONFERENCE STATE TYPE
      -->
      <xs:complexType name="conference-state-type">
       <xs:sequence>
        <xs:element name="user-count" type="xs:unsignedInt"
         minOccurs="0"/>
        <xs:element name="active" type="xs:boolean"
         minOccurs="0"/>
        <xs:element name="locked" type="xs:boolean"
         minOccurs="0"/>
        <xs:any namespace="##other" processContents="lax"
         minOccurs="0" maxOccurs="unbounded"/>
       </xs:sequence>
       <xs:anyAttribute namespace="##other" processContents="lax"/>
      </xs:complexType>
      <!--
         CONFERENCE MEDIA TYPE
      -->
      <xs:complexType name="conference-media-type">
       <xs:sequence>
        <xs:element name="entry" type="conference-medium-type"
         maxOccurs="unbounded"/>
       </xs:sequence>
       <xs:anyAttribute namespace="##other" processContents="lax"/>
      </xs:complexType>
      <!--
         CONFERENCE MEDIUM TYPE
      -->
      <xs:complexType name="conference-medium-type">
       <xs:sequence>
        <xs:element name="display-text" type="xs:string"
         minOccurs="0"/>
        <xs:element name="type" type="xs:string"/>
        <xs:element name="status" type="media-status-type"
         minOccurs="0"/>
        <xs:any namespace="##other" processContents="lax"
         minOccurs="0" maxOccurs="unbounded"/>
       </xs:sequence>
       <xs:attribute name="label" type="xs:string"
        use="required"/>
       <xs:anyAttribute namespace="##other" processContents="lax"/>
      </xs:complexType>
      <!--
         URIs TYPE
      -->
      <xs:complexType name="uris-type">
       <xs:sequence>
        <xs:element name="entry" type="uri-type"
         maxOccurs="unbounded"/>
       </xs:sequence>
       <xs:attribute name="state" type="state-type"
        use="optional" default="full"/>
       <xs:anyAttribute namespace="##other" processContents="lax"/>
      </xs:complexType>
      <!--
         URI TYPE
      -->
      <xs:complexType name="uri-type">
       <xs:sequence>
        <xs:element name="uri" type="xs:anyURI"/>
        <xs:element name="display-text" type="xs:string"
         minOccurs="0"/>
        <xs:element name="purpose" type="xs:string"
         minOccurs="0"/>
        <xs:element name="modified" type="execution-type"
         minOccurs="0"/>
        <xs:any namespace="##other" processContents="lax"
         minOccurs="0" maxOccurs="unbounded"/>
       </xs:sequence>
       <xs:anyAttribute namespace="##other" processContents="lax"/>
      </xs:complexType>
      <!--
         KEYWORDS TYPE
      -->
      <xs:simpleType name="keywords-type">
       <xs:list itemType="xs:string"/>
      </xs:simpleType>
      <!--
         USERS TYPE
      -->
      <xs:complexType name="users-type">
       <xs:sequence>
        <xs:element name="user" type="user-type"
         minOccurs="0" maxOccurs="unbounded"/>
        <xs:any namespace="##other" processContents="lax"
         minOccurs="0" maxOccurs="unbounded"/>
       </xs:sequence>
       <xs:attribute name="state" type="state-type"
        use="optional" default="full"/>
       <xs:anyAttribute namespace="##other" processContents="lax"/>
      </xs:complexType>
      <!--
         USER TYPE
      -->
      <xs:complexType name="user-type">
       <xs:sequence>
        <xs:element name="display-text" type="xs:string"
         minOccurs="0"/>
        <xs:element name="associated-aors" type="uris-type"
         minOccurs="0"/>
        <xs:element name="roles" type="user-roles-type"
         minOccurs="0"/>
        <xs:element name="languages" type="user-languages-type"
         minOccurs="0"/>
        <xs:element name="cascaded-focus" type="xs:anyURI"
         minOccurs="0"/>
        <xs:element name="endpoint" type="endpoint-type"
         minOccurs="0" maxOccurs="unbounded"/>
        <xs:any namespace="##other" processContents="lax"
         minOccurs="0" maxOccurs="unbounded"/>
       </xs:sequence>
       <xs:attribute name="entity" type="xs:anyURI"/>
       <xs:attribute name="state" type="state-type"
        use="optional" default="full"/>
       <xs:anyAttribute namespace="##other" processContents="lax"/>
      </xs:complexType>
      <!--
         USER ROLES TYPE
      -->
      <xs:complexType name="user-roles-type">
       <xs:sequence>
        <xs:element name="entry" type="xs:string"
         maxOccurs="unbounded"/>
       </xs:sequence>
       <xs:anyAttribute namespace="##other" processContents="lax"/>
      </xs:complexType>
      <!--
         USER LANGUAGES TYPE
      -->
      <xs:simpleType name="user-languages-type">
       <xs:list itemType="xs:language"/>
      </xs:simpleType>
      <!--
         ENDPOINT TYPE
      -->
      <xs:complexType name="endpoint-type">
       <xs:sequence>
        <xs:element name="display-text" type="xs:string"
         minOccurs="0"/>
        <xs:element name="referred" type="execution-type"
         minOccurs="0"/>
        <xs:element name="status" type="endpoint-status-type"
         minOccurs="0"/>
        <xs:element name="joining-method" type="joining-type"
         minOccurs="0"/>
        <xs:element name="joining-info"
         type="execution-type"
         minOccurs="0"/>
        <xs:element name="disconnection-method"
         type="disconnection-type"
         minOccurs="0"/>
        <xs:element name="disconnection-info"
         type="execution-type"
         minOccurs="0"/>
        <xs:element name="media" type="media-type"
         minOccurs="0" maxOccurs="unbounded"/>
        <xs:element name="call-info" type="call-type"
         minOccurs="0"/>
        <xs:any namespace="##other" processContents="lax"
         minOccurs="0" maxOccurs="unbounded"/>
       </xs:sequence>
       <xs:attribute name="entity" type="xs:string"/>
       <xs:attribute name="state" type="state-type"
        use="optional" default="full"/>
       <xs:anyAttribute namespace="##other" processContents="lax"/>
      </xs:complexType>
      <!--
         ENDPOINT STATUS TYPE
      -->
      <xs:simpleType name="endpoint-status-type">
       <xs:restriction base="xs:string">
        <xs:enumeration value="pending"/>
        <xs:enumeration value="dialing-out"/>
        <xs:enumeration value="dialing-in"/>
        <xs:enumeration value="alerting"/>
        <xs:enumeration value="on-hold"/>
        <xs:enumeration value="connected"/>
        <xs:enumeration value="muted-via-focus"/>
        <xs:enumeration value="disconnecting"/>
        <xs:enumeration value="disconnected"/>
       </xs:restriction>
      </xs:simpleType>
      <!--
         JOINING TYPE
      -->
      <xs:simpleType name="joining-type">
       <xs:restriction base="xs:string">
        <xs:enumeration value="dialed-in"/>
        <xs:enumeration value="dialed-out"/>
        <xs:enumeration value="focus-owner"/>
       </xs:restriction>
      </xs:simpleType>
      <!--
         DISCONNECTION TYPE
      -->
      <xs:simpleType name="disconnection-type">
       <xs:restriction base="xs:string">
        <xs:enumeration value="departed"/>
        <xs:enumeration value="booted"/>
        <xs:enumeration value="failed"/>
        <xs:enumeration value="busy"/>
       </xs:restriction>
      </xs:simpleType>
      <!--
         EXECUTION TYPE
      -->
      <xs:complexType name="execution-type">
       <xs:sequence>
        <xs:element name="when" type="xs:dateTime"
         minOccurs="0"/>
        <xs:element name="reason" type="xs:string"
         minOccurs="0"/>
        <xs:element name="by" type="xs:anyURI"
         minOccurs="0"/>
       </xs:sequence>
       <xs:anyAttribute namespace="##other" processContents="lax"/>
      </xs:complexType>
     <!--
         CALL TYPE
      -->
      <xs:complexType name="call-type">
       <xs:choice>
        <xs:element name="sip" type="sip-dialog-id-type"/>
        <xs:any namespace="##other" processContents="lax"
         minOccurs="0" maxOccurs="unbounded"/>
       </xs:choice>
       <xs:anyAttribute namespace="##other" processContents="lax"/>
      </xs:complexType>
      <!--
         SIP DIALOG ID TYPE
      -->
      <xs:complexType name="sip-dialog-id-type">
       <xs:sequence>
        <xs:element name="display-text" type="xs:string"
         minOccurs="0"/>
        <xs:element name="call-id" type="xs:string"/>
        <xs:element name="from-tag" type="xs:string"/>
        <xs:element name="to-tag" type="xs:string"/>
        <xs:any namespace="##other" processContents="lax"
         minOccurs="0" maxOccurs="unbounded"/>
       </xs:sequence>
       <xs:anyAttribute namespace="##other" processContents="lax"/>
      </xs:complexType>
      <!--
         MEDIA TYPE
      -->
      <xs:complexType name="media-type">
       <xs:sequence>
        <xs:element name="display-text" type="xs:string"
         minOccurs="0"/>
        <xs:element name="type" type="xs:string"
         minOccurs="0"/>
        <xs:element name="label" type="xs:string"
         minOccurs="0"/>
        <xs:element name="src-id" type="xs:string"
         minOccurs="0"/>
        <xs:element name="status" type="media-status-type"
         minOccurs="0"/>
        <xs:any namespace="##other" processContents="lax"
         minOccurs="0" maxOccurs="unbounded"/>
       </xs:sequence>
       <xs:attribute name="id" type="xs:string"
        use="required"/>
       <xs:anyAttribute namespace="##other" processContents="lax"/>
      </xs:complexType>
      <!--
         MEDIA STATUS TYPE
      -->
      <xs:simpleType name="media-status-type">
       <xs:restriction base="xs:string">
        <xs:enumeration value="recvonly"/>
        <xs:enumeration value="sendonly"/>
        <xs:enumeration value="sendrecv"/>
        <xs:enumeration value="inactive"/>
       </xs:restriction>
      </xs:simpleType>
       <!--
         SIDEBARS BY VAL TYPE
       -->
       <xs:complexType name="sidebars-by-val-type">
        <xs:sequence>
         <xs:element name="entry" type="conference-type"
          minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:attribute name="state" type="state-type"
         use="optional" default="full"/>
        <xs:anyAttribute namespace="##other" processContents="lax"/>
       </xs:complexType>
      </xs:schema>

</xs:schema>
    ]]></code>
  </section2>
</section1>
<section1 topic='Acknowledgements' anchor='acks'>
  <p>Jitsi's participation in this specification is funded by the NLnet
   Foundation.</p>
</section1>
</xep>
