<tp:generic-types
  xmlns:tp="http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0">

  <tp:simple-type name="Unix_Timestamp" type="u">
    <tp:docstring>An unsigned 32-bit integer representing time as the number
      of seconds elapsed since the Unix epoch
      (1970-01-01T00:00:00Z)</tp:docstring>
  </tp:simple-type>

  <tp:simple-type name="Unix_Timestamp64" type="x">
    <tp:docstring>An signed 64-bit integer representing time as the number
      of seconds elapsed since the Unix epoch
      (1970-01-01T00:00:00Z); negative for times before the epoch</tp:docstring>

    <tp:rationale>The Text interface is the only user of Unix_Timestamp so
      far, and we'd like to be Y2038 compatible in future
      interfaces.</tp:rationale>
  </tp:simple-type>

  <tp:simple-type name="DBus_Bus_Name" type="s"
    array-name="DBus_Bus_Name_List">
    <tp:docstring>A string representing a D-Bus bus name - either a well-known
      name like "org.freedesktop.Telepathy.MissionControl" or a unique name
      like ":1.123"</tp:docstring>
  </tp:simple-type>

  <tp:simple-type name="DBus_Well_Known_Name" type="s"
    array-name="DBus_Well_Known_Name_List">
    <tp:docstring>A string representing a D-Bus well-known
      name like "org.freedesktop.Telepathy.MissionControl".</tp:docstring>
  </tp:simple-type>

  <tp:simple-type name="DBus_Unique_Name" type="s"
    array-name="DBus_Unique_Name_List">
    <tp:docstring>A string representing a D-Bus unique name, such as
      ":1.123"</tp:docstring>
  </tp:simple-type>

  <tp:simple-type name="DBus_Interface" type="s"
    array-name="DBus_Interface_List">
    <tp:docstring>An ASCII string representing a D-Bus interface - two or more
      elements separated by dots, where each element is a non-empty
      string of ASCII letters, digits and underscores, not starting with
      a digit. The maximum total length is 255 characters. For example,
      "org.freedesktop.DBus.Peer".</tp:docstring>
  </tp:simple-type>

  <tp:simple-type name="DBus_Error_Name" type="s">
    <tp:docstring>An ASCII string representing a D-Bus error. This is
      syntactically the same as a <tp:type>DBus_Interface</tp:type>, but the
      meaning is different.</tp:docstring>
  </tp:simple-type>

  <tp:simple-type name="DBus_Signature" type="s">
    <tp:docstring>A string representing a D-Bus signature
      (the 'g' type isn't used because of poor interoperability, particularly
      with dbus-glib)</tp:docstring>
  </tp:simple-type>

  <tp:simple-type name="DBus_Member" type="s">
    <tp:docstring>An ASCII string representing a D-Bus method, signal
      or property name - a non-empty string of ASCII letters, digits and
      underscores, not starting with a digit, with a maximum length of 255
      characters. For example, "Ping".</tp:docstring>
  </tp:simple-type>

  <tp:simple-type name="DBus_Qualified_Member" type="s"
    array-name="DBus_Qualified_Member_List">
    <tp:docstring>A string representing the full name of a D-Bus method,
      signal or property, consisting of a DBus_Interface, followed by
      a dot, followed by a DBus_Member. For example,
      "org.freedesktop.DBus.Peer.Ping".</tp:docstring>
  </tp:simple-type>

  <tp:mapping name="Qualified_Property_Value_Map"
    array-name="Qualified_Property_Value_Map_List">
    <tp:docstring>A mapping from strings representing D-Bus
      properties (by their namespaced names) to their values.</tp:docstring>
    <tp:member type="s" name="Key" tp:type="DBus_Qualified_Member">
      <tp:docstring>
        A D-Bus interface name, followed by a dot and a D-Bus property name.
      </tp:docstring>
    </tp:member>
    <tp:member type="v" name="Value">
      <tp:docstring>
        The value of the property.
      </tp:docstring>
    </tp:member>
  </tp:mapping>

  <tp:mapping name="String_Variant_Map" array-name="String_Variant_Map_List">
    <tp:docstring>A mapping from strings to variants representing extra
      key-value pairs.</tp:docstring>
    <tp:member type="s" name="Key"/>
    <tp:member type="v" name="Value"/>
  </tp:mapping>

  <tp:mapping name="String_String_Map" array-name="String_String_Map_List">
    <tp:docstring>A mapping from strings to strings representing extra
      key-value pairs.</tp:docstring>
    <tp:member type="s" name="Key"/>
    <tp:member type="s" name="Value"/>
  </tp:mapping>

  <tp:struct name="Socket_Address_IP" array-name="Socket_Address_IP_List">
    <tp:docstring>An IP address and port.</tp:docstring>
    <tp:member type="s" name="Address">
      <tp:docstring>Either a dotted-quad IPv4 address literal as for
        <tp:type>Socket_Address_IPv4</tp:type>, or an RFC2373 IPv6 address
        as for <tp:type>Socket_Address_IPv6</tp:type>.
      </tp:docstring>
    </tp:member>
    <tp:member type="q" name="Port">
      <tp:docstring>The TCP or UDP port number.</tp:docstring>
    </tp:member>
  </tp:struct>

  <tp:struct name="Socket_Address_IPv4">
    <tp:docstring>An IPv4 address and port.</tp:docstring>
    <tp:member type="s" name="Address">
      <tp:docstring>A dotted-quad IPv4 address literal: four ASCII decimal
        numbers, each between 0 and 255 inclusive, e.g.
        "192.168.0.1".</tp:docstring>
    </tp:member>
    <tp:member type="q" name="Port">
      <tp:docstring>The TCP or UDP port number.</tp:docstring>
    </tp:member>
  </tp:struct>

  <tp:struct name="Socket_Address_IPv6">
    <tp:docstring>An IPv6 address and port.</tp:docstring>
    <tp:member type="s" name="Address">
      <tp:docstring>An IPv6 address literal as specified by RFC2373
        section 2.2, e.g. "2001:DB8::8:800:200C:4171".</tp:docstring>
    </tp:member>
    <tp:member type="q" name="Port">
      <tp:docstring>The TCP or UDP port number.</tp:docstring>
    </tp:member>
  </tp:struct>

  <tp:struct name="Socket_Netmask_IPv4">
    <tp:docstring>An IPv4 network or subnet.</tp:docstring>
    <tp:member type="s" name="Address">
      <tp:docstring>A dotted-quad IPv4 address literal: four ASCII decimal
        numbers, each between 0 and 255 inclusive, e.g.
        "192.168.0.1".</tp:docstring>
    </tp:member>
    <tp:member type="y" name="Prefix_Length">
      <tp:docstring>The number of leading bits of the address that must
        match, for this netmask to be considered to match an
        address.</tp:docstring>
    </tp:member>
  </tp:struct>

  <tp:struct name="Socket_Netmask_IPv6">
    <tp:docstring>An IPv6 network or subnet.</tp:docstring>
    <tp:member type="s" name="Address">
      <tp:docstring>An IPv6 address literal as specified by RFC2373
        section 2.2, e.g. "2001:DB8::8:800:200C:4171".</tp:docstring>
    </tp:member>
    <tp:member type="y" name="Prefix_Length">
      <tp:docstring>The number of leading bits of the address that must
        match, for this netmask to be considered to match an
        address.</tp:docstring>
    </tp:member>
  </tp:struct>

  <tp:simple-type name="User_Action_Timestamp" type="x">
    <tp:docstring xmlns="http://www.w3.org/1999/xhtml">
      <p>The time at which an user action occurred. This type has the 2
      following special values:</p>

      <p>0: the action doesn't involve any user action. Clients
      SHOULD avoid stealing focus when presenting the channel.</p>

      <p>MAX_INT64: clients SHOULD behave as though the user action happened
      at the current time, e.g. a client MAY request that its window gains
      focus.
      </p>

      <tp:rationale>
      <p>This can be used by clients that can't know the X server time like
      command line applications for example.</p>
      </tp:rationale>

      <p>For all the other values it corresponds to the time of the user
      action. Clients SHOULD use this for focus-stealing prevention,
      if applicable.
      Note that the time is dependant on the local
      environment and so is not necessarily a wall-clock time.
      For example in an X environment it's expected to be the X timestamp
      of events.
      This corresponds to the _NET_WM_USER_TIME property in
      <a href="http://standards.freedesktop.org/wm-spec/wm-spec-latest.html">EWMH</a>.</p>
    </tp:docstring>
  </tp:simple-type>

  <tp:mapping name="Object_Immutable_Properties_Map"
    array-name="Object_Immutable_Properties_Map_List">
    <tp:docstring>A mapping from object path to the immutable properties of
        the object.</tp:docstring>
    <tp:member type="o" name="Path">
      <tp:docstring>
        The object path of an object
      </tp:docstring>
    </tp:member>
    <tp:member type="a{sv}" name="Immutable_Properties" tp:type="Qualified_Property_Value_Map">
      <tp:docstring>
        The immutable properties of the object
      </tp:docstring>
    </tp:member>
  </tp:mapping>

</tp:generic-types>
