<?xml version="1.0" ?>
<node name="/Connection_Interface_Contact_Capabilities" xmlns:tp="http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0">
  <tp:copyright> Copyright (C) 2005, 2006, 2008 Collabora Limited </tp:copyright>
  <tp:copyright> Copyright (C) 2005, 2006, 2008 Nokia Corporation </tp:copyright>
  <tp:copyright> Copyright (C) 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.Connection.Interface.ContactCapabilities">
    <tp:requires interface="org.freedesktop.Telepathy.Connection"/>
    <tp:added version="0.17.28">(as stable API)</tp:added>

    <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
      <p>Contact capabilities describe the channel classes which may be
        created with a given contact in advance of attempting to create a
        channel. Each capability represents a commitment by the
        connection manager that it will ordinarily be able to create a channel
        with a contact when given a request with the properties defined by the
        channel class.</p>

      <p>Capabilities pertain to particular contact handles, and represent
        activities such as having a text chat, a voice call with the user or a
        stream tube of a defined type.</p>

      <p>This interface also enables user interfaces to notify the connection
        manager what capabilities to advertise for the user to other contacts.
        This is done by using the
        <tp:member-ref>UpdateCapabilities</tp:member-ref> method.</p>

      <tp:rationale>
        <p>XMPP is a major user of this interface: XMPP contacts will not,
          in general, be callable using VoIP unless they advertise suitable
          Jingle capabilities.</p>

        <p>Many other protocols also have some concept of capability flags,
          which this interface exposes in a protocol-independent way.</p>
      </tp:rationale>
    </tp:docstring>

    <tp:struct name="Handler_Capabilities"
      array-name="Handler_Capabilities_List">
      <tp:docstring>
        A structure representing the capabilities of a single client.
      </tp:docstring>

      <tp:member name="Well_Known_Name" type="s" tp:type="DBus_Well_Known_Name">
        <tp:docstring>
          For implementations of the <tp:dbus-ref
            namespace="org.freedesktop.Telepathy">Client</tp:dbus-ref>
          interface, the well-known bus name name of the client; for any other
          process, any other reversed domain name that uniquely identifies it.
        </tp:docstring>
      </tp:member>

      <tp:member name="Channel_Classes" type="aa{sv}"
           tp:type="String_Variant_Map[]">
        <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
          An array of channel classes that can be handled by this client.
          This will usually be a copy of the client's <tp:dbus-ref
            namespace="org.freedesktop.Telepathy.Client.Handler">HandlerChannelFilter</tp:dbus-ref>
          property.
        </tp:docstring>
      </tp:member>

      <tp:member name="Capabilities"
        type="as" tp:type="Handler_Capability_Token[]">
        <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
          An array of client capabilities supported by this client, to be
          used by the connection manager to determine what capabilities to
          advertise. This will usually be a copy of the client's <tp:dbus-ref
            namespace="org.freedesktop.Telepathy.Client.Handler">Capabilities</tp:dbus-ref>
          property.
        </tp:docstring>
      </tp:member>
    </tp:struct>

    <method name="UpdateCapabilities" tp:name-for-bindings="Update_Capabilities">
      <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
        <p>Alter the connection's advertised capabilities to include
          the intersection of the given clients' capabilities with what the
          connection manager is able to implement.</p>

        <p>On connections managed by the ChannelDispatcher, processes other
          than the ChannelDispatcher SHOULD NOT call this method, and the
          ChannelDispatcher SHOULD use this method to advertise the
          capabilities of all the registered <tp:dbus-ref
            namespace="org.freedesktop.Telepathy">Client.Handler</tp:dbus-ref>
          implementations.On connections not managed by the ChannelDispatcher,
          clients MAY use this method directly, to indicate the channels they
          will handle and the extra capabilities they have.</p>

        <p>Upon a successful invocation of this method, the connection manager
          will only emit the
          <tp:member-ref>ContactCapabilitiesChanged</tp:member-ref> signal
          for the user's <tp:dbus-ref
            namespace="org.freedesktop.Telepathy.Connection">SelfHandle</tp:dbus-ref>
          if, in the underlying protocol, the new capabilities are distinct
          from the previous state.</p>

        <tp:rationale>
          <p>The connection manager will essentially intersect the provided
            capabilities and the channel classes it implements. Therefore,
            certain properties which are never fixed for a channel class
            (such as the target handle, or the Parameters property of a tube
            channel) will almost certainly not be advertised.</p>
        </tp:rationale>

        <p>This method MAY be called on a newly-created connection while it
          is still in the DISCONNECTED state, to request that when the
          connection connects, it will do so with the appropriate
          capabilities. Doing so MUST NOT fail.</p>
      </tp:docstring>

      <arg direction="in" name="Handler_Capabilities" type="a(saa{sv}as)"
        tp:type="Handler_Capabilities[]">
        <tp:docstring>
          <p>The capabilities of one or more clients.</p>

          <p>For each client in the given list, any capabilities previously
            advertised for the same client name are discarded, then replaced by
            the capabilities indicated.</p>

          <p>As a result, if a client becomes unavailable, this method SHOULD
            be called with a <tp:type>Handler_Capabilities</tp:type> structure
            containing its name, an empty list of channel classes, and an
            empty list of capabilities. When this is done, the connection
            manager SHOULD free all memory associated with that client name.</p>

          <tp:rationale>
            <p>This method takes a list of clients so that
              when the channel dispatcher first calls it (with a list of all
              the Handlers that are initially available), the changes can be
              made atomically, with only one transmission of updated
              capabilities to the network. Afterwards, the channel dispatcher
              will call this method with a single-element list every time
              a Handler becomes available or unavailable.</p>
          </tp:rationale>

          <p>The connection manager MUST ignore any channel classes and client
            capabilities for which there is no representation in the protocol
            or no support in the connection manager.</p>
        </tp:docstring>
      </arg>

      <tp:possible-errors>
        <tp:error name="org.freedesktop.Telepathy.Error.NetworkError"/>
      </tp:possible-errors>
    </method>

    <method name="GetContactCapabilities"
            tp:name-for-bindings="Get_Contact_Capabilities">
      <arg direction="in" name="handles" type="au" tp:type="Contact_Handle[]">
        <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
          <p>An array of contact handles for this connection.</p>

          <p>The handle zero MUST NOT be included in the request.</p>
        </tp:docstring>
      </arg>
      <arg direction="out" type="a{ua(a{sv}as)}"
           tp:type="Contact_Capabilities_Map" name="Contact_Capabilities">
        <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
          An array of structures containing:
          <ul>
            <li>a dictionary mapping the channel properties to their values.</li>
            <li>an array of additional allowed properties</li>
          </ul>
        </tp:docstring>
      </arg>
      <tp:docstring>
        Returns an array of enhanced capabilities for the given contact handles.
      </tp:docstring>
      <tp:possible-errors>
        <tp:error name="org.freedesktop.Telepathy.Error.Disconnected"/>
        <tp:error name="org.freedesktop.Telepathy.Error.InvalidHandle">
          <tp:docstring>
            The handle does not represent a contact. Zero is always invalid.
          </tp:docstring>
        </tp:error>
      </tp:possible-errors>
    </method>

    <signal name="ContactCapabilitiesChanged"
            tp:name-for-bindings="Contact_Capabilities_Changed">
      <arg name="caps" type="a{ua(a{sv}as)}"
           tp:type="Contact_Capabilities_Map">
        <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
          All the capabilities of the contacts
        </tp:docstring>
      </arg>
      <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
        <p>Announce that there has been a change of capabilities on the
          given handles. A single signal can be emitted for several
        contacts.</p>

        <tp:rationale>
          <p>The underlying protocol can get several contacts' capabilities at
            the same time.</p>
        </tp:rationale>

      </tp:docstring>
    </signal>

  <tp:mapping name="Contact_Capabilities_Map"
              array-name="Contact_Capabilities_Map_List">
    <tp:docstring>A mapping from contact handle to their capabilities.
    </tp:docstring>
    <tp:member type="u" name="Key" tp:type="Contact_Handle">
      <tp:docstring>
        A contact handle.
      </tp:docstring>
    </tp:member>
    <tp:member type="a(a{sv}as)" name="Value"
               tp:type="Requestable_Channel_Class[]">
      <tp:docstring>
        The contact capabilities.
      </tp:docstring>
    </tp:member>
  </tp:mapping>

    <tp:contact-attribute name="capabilities"
      type="a(a{sv}as)" tp:type="Requestable_Channel_Class[]">
      <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
        <p>The same structs that would be returned by
          <tp:member-ref>GetContactCapabilities</tp:member-ref>.
          Omitted from the result if the contact's capabilities
          are not known; present in the result as an empty array if the
          contact is known to have no capabilities at all.</p>
      </tp:docstring>
    </tp:contact-attribute>

  </interface>
</node>
<!-- vim:set sw=2 sts=2 et ft=xml: -->
