<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:generic-types>
