diff options
author | Alban Crequy <alban.crequy@collabora.co.uk> | 2008-09-24 15:24:58 +0100 |
---|---|---|
committer | Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> | 2009-02-03 13:28:26 +0000 |
commit | 6fe717a264c5270abe9bd37eec90a6024034c389 (patch) | |
tree | 48b077480d36415f2e494b1141a0c3145fc790ec /extensions | |
parent | 18cfbf89af680711c926c25c8039ef53f9d8f3b5 (diff) | |
download | telepathy-salut-6fe717a264c5270abe9bd37eec90a6024034c389.tar.gz |
Add the new tube D-Bus API in extensions.
Diffstat (limited to 'extensions')
-rw-r--r-- | extensions/Channel_Interface_Tube.xml | 125 | ||||
-rw-r--r-- | extensions/Channel_Type_DBus_Tube.xml | 183 | ||||
-rw-r--r-- | extensions/Channel_Type_Stream_Tube.xml | 219 | ||||
-rw-r--r-- | extensions/Makefile.am | 3 | ||||
-rw-r--r-- | extensions/all.xml | 14 |
5 files changed, 543 insertions, 1 deletions
diff --git a/extensions/Channel_Interface_Tube.xml b/extensions/Channel_Interface_Tube.xml new file mode 100644 index 00000000..d3c4e661 --- /dev/null +++ b/extensions/Channel_Interface_Tube.xml @@ -0,0 +1,125 @@ +<?xml version="1.0" ?> +<node name="/Channel_Interface_Tube" xmlns:tp="http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0"> + <tp:copyright>Copyright (C) 2008 Collabora Limited</tp:copyright> + <tp:copyright>Copyright (C) 2008 Nokia Corporation</tp:copyright> + <tp:license> + 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. + +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. + +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. + </tp:license> + <interface name="org.freedesktop.Telepathy.Channel.Interface.Tube.DRAFT" + tp:causes-havoc="experimental"> + <tp:requires interface="org.freedesktop.Telepathy.Channel"/> + <tp:docstring xmlns="http://www.w3.org/1999/xhtml"> + <p>A "tube" is a mechanism for arbitrary data transfer. A tube channel + can contain only one tube. This interface contains the properties, + signals and methods common to all types of tubes. One cannot create a + tube channel of type org.freedesktop.Telepathy.Channel.Interface.Tube + but only channels of a specific type tube channel. Only stream and + D-Bus tubes exist currently. They have their own interface and their + interface can be used to create a tube channel.</p> + + <p>The Tubes channel type may be requested for handles of type + HANDLE_TYPE_CONTACT and HANDLE_TYPE_ROOM.</p> + </tp:docstring> + + <property name="Initiator" type="u" tp:type="Contact_Handle" access="read" + tp:name-for-bindings="Initiator"> + <tp:docstring xmlns="http://www.w3.org/1999/xhtml"> + <p>Initiator handle.</p> + <p>When requesting a channel with + <tp:dbus-ref namespace="org.freedesktop.Telepathy">Connection.Interface.Requests.CreateChannel</tp:dbus-ref>, + this property MUST NOT be included in the request.</p> + </tp:docstring> + </property> + + <property name="Parameters" type="a{sv}" tp:type="String_Variant_Map" + access="readwrite" tp:name-for-bindings="Parameters"> + <tp:docstring xmlns="http://www.w3.org/1999/xhtml"> + <p>Each tube has a dictionary of arbitrary parameters. Parameters are + commonly used for bootstrap information. The allowable keys, + types and values are defined by the service. Connection managers + must support the value being a string (D-Bus type 's'), array of bytes + (D-Bus type 'ay'), unsigned integer (D-Bus type 'u'), integer (D-Bus + type 'i') and boolean (D-Bus type 'b').</p> + <p>When the tube is offered, the parameters are transmitted to the + other end.</p> + <p>Example of valid parameters: + <code>{'game name': 'go', 'board size': 19}</code></p> + <p>When requesting a channel with + <tp:dbus-ref namespace="org.freedesktop.Telepathy">Connection.Interface.Requests.CreateChannel</tp:dbus-ref>, + this property MAY be included in the request. If it is not included in + the request, the connection manager MUST consider the property to be + empty. This property MAY be changed after the channel creation when + the tube is in the state Not_Offered. If the tube is in another + state, changing this property MUST fail without side effect.</p> + </tp:docstring> + </property> + + <property name="Status" type="u" tp:type="Tube_Channel_State" access="read" + tp:name-for-bindings="Status"> + <tp:docstring xmlns="http://www.w3.org/1999/xhtml"> + <p>Status of the tube in this channel.</p> + <p>When requesting a channel with + <tp:dbus-ref namespace="org.freedesktop.Telepathy">Connection.Interface.Requests.CreateChannel</tp:dbus-ref>, + this property MUST NOT be included in the request.</p> + </tp:docstring> + </property> + + <tp:enum name="Tube_Channel_State" type="u"> + <tp:enumvalue suffix="Local_Pending" value="0"> + <tp:docstring> + The initiator offered the tube. The tube is waiting to be + accepted/closed locally. If the client accepts the tube, the tube's + state will be Open. + </tp:docstring> + </tp:enumvalue> + <tp:enumvalue suffix="Remote_Pending" value="1"> + <tp:docstring> + The tube is waiting to be accepted/closed remotely. If the + recipient accepts the tube, the tube's state will be Open. + </tp:docstring> + </tp:enumvalue> + <tp:enumvalue suffix="Open" value="2"> + <tp:docstring> + The initiator offered the tube and the recipient accepted it. The + tube is open for traffic. The tube's state stays in this state until + it is closed. + </tp:docstring> + </tp:enumvalue> + <tp:enumvalue suffix="Not_Offered" value="3"> + <tp:docstring> + The tube channel has been requested but the tube is not yet offered. + The client should offer the tube to the recipient and the tube's + state will be Remote_Pending. The method to offer the tube depend on + the tube type. + </tp:docstring> + </tp:enumvalue> + </tp:enum> + + <signal name="TubeChannelStateChanged" + tp:name-for-bindings="Tube_Channel_State_Changed"> + <tp:docstring> + Emitted when the state of the tube channel changes. + </tp:docstring> + <arg name="state" type="u" tp:type="Tube_Channel_State"> + <tp:docstring> + The new state of the tube; see the Tube_Channel_State enumeration. + </tp:docstring> + </arg> + </signal> + + </interface> + +</node> +<!-- vim:set sw=2 sts=2 et ft=xml: --> diff --git a/extensions/Channel_Type_DBus_Tube.xml b/extensions/Channel_Type_DBus_Tube.xml new file mode 100644 index 00000000..3846afbe --- /dev/null +++ b/extensions/Channel_Type_DBus_Tube.xml @@ -0,0 +1,183 @@ +<?xml version="1.0" ?> +<node name="/Channel_Type_DBus_Tube" xmlns:tp="http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0"> + <tp:copyright>Copyright (C) 2008 Collabora Limited</tp:copyright> + <tp:copyright>Copyright (C) 2008 Nokia Corporation</tp:copyright> + <tp:license> + 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. + +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. + +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. + </tp:license> + <interface name="org.freedesktop.Telepathy.Channel.Type.DBusTube.DRAFT" + tp:causes-havoc="experimental"> + <tp:requires interface="org.freedesktop.Telepathy.Channel"/> + <tp:requires interface="org.freedesktop.Telepathy.Channel.Interface.Tube.DRAFT"/> + <tp:docstring xmlns="http://www.w3.org/1999/xhtml"> + <p>A D-Bus tube is an ordered reliable transport, for transporting D-Bus + traffic.</p> + + <p>For each D-Bus tube, the connection manager listens on a D-Bus + server address, as detailed in the D-Bus specification. On this + address, it emulates a bus upon which each tube participant appears + as an endpoint.</p> + + <p>The objects and interfaces which are expected to exist on the + emulated bus depend on the well-known name; typically, either the + participant who initiated the tube is expected to export the same + objects/interfaces that would be exported by a service of that name + on a bus, or all participants are expected to export those + objects/interfaces.</p> + + <p>In a multi-user context (Handle_Type_Room) the tube behaves + like the D-Bus bus daemon, so participants can send each other + private messages, or can send broadcast messages which are + received by everyone in the tube (including themselves). + Each participant has a D-Bus unique name; connection managers + must prevent participants from sending messages with the wrong + sender unique name, and should attempt to avoid participants + receiving messages not intended for them.</p> + + <p>In a 1-1 context (Handle_Type_Contact) the tube behaves like + a peer-to-peer D-Bus connection - arbitrary D-Bus messages with + any sender and/or destination can be sent by each participant, + and each participant receives all messages sent by the other + participant.</p> + + </tp:docstring> + + <method name="OfferDBusTube" tp:name-for-bindings="Offer_DBus_Tube"> + <tp:docstring> + Offers a D-Bus tube providing the service specified. + </tp:docstring> + <tp:possible-errors> + <tp:error name="org.freedesktop.Telepathy.Error.NetworkError"/> + <tp:error name="org.freedesktop.Telepathy.Error.NotAvailable"> + <tp:docstring> + The contact associated with this channel doesn't have tubes + capabilities. + </tp:docstring> + </tp:error> + <tp:error name="org.freedesktop.Telepathy.Error.NotImplemented"> + <tp:docstring> + The connection manager doesn't support D-Bus tubes. + </tp:docstring> + </tp:error> + </tp:possible-errors> + </method> + + <method name="AcceptDBusTube" tp:name-for-bindings="Accept_DBus_Tube"> + <tp:docstring> + Accept a D-Bus tube that's in the "local pending" state. The + connection manager will attempt to open the tube. The tube remains in + the "local pending" state until the TubeStateChanged signal is + emitted. + </tp:docstring> + <arg direction="out" name="address" type="s"> + <tp:docstring> + The string describing the address of the private bus. The client + should not attempt to connect to the address until the tube is open. + </tp:docstring> + </arg> + <tp:possible-errors> + <tp:error name="org.freedesktop.Telepathy.Error.InvalidArgument"> + <tp:docstring> + The given tube ID is invalid or does not refer to a D-Bus + tube. + </tp:docstring> + </tp:error> + </tp:possible-errors> + </method> + + <method name="GetDBusTubeAddress" + tp:name-for-bindings="Get_DBus_Tube_Address"> + <tp:docstring> + Return a string describing the address of the private bus. + </tp:docstring> + <arg direction="out" type="s"> + <tp:docstring> + The bus address. + </tp:docstring> + </arg> + <tp:possible-errors> + <tp:error name="org.freedesktop.Telepathy.Error.InvalidArgument"> + <tp:docstring> + The tube is not a D-Bus tube. + </tp:docstring> + </tp:error> + <tp:error name="org.freedesktop.Telepathy.Error.NotAvailable"> + <tp:docstring> + This tube is not in the "open" state. + </tp:docstring> + </tp:error> + </tp:possible-errors> + </method> + + <method name="GetDBusNames" tp:name-for-bindings="Get_DBus_Names"> + <tp:docstring> + For a multi-user (i.e. Handle_Type_Room) D-Bus tube, obtain a mapping + between contact handles and their unique bus names on this tube. + </tp:docstring> + <arg direction="out" type="a(us)" tp:type="DBus_Tube_Member[]"> + <tp:docstring> + An array of structures, each containing a contact handle and a D-Bus + bus name. + </tp:docstring> + </arg> + <tp:possible-errors> + <tp:error name="org.freedesktop.Telepathy.Error.InvalidArgument"> + <tp:docstring> + The tube is not a multi-user D-Bus tube. + </tp:docstring> + </tp:error> + <tp:error name="org.freedesktop.Telepathy.Error.NotAvailable"> + <tp:docstring> + This tube is not in the "open" state. + </tp:docstring> + </tp:error> + </tp:possible-errors> + </method> + + <signal name="DBusNamesChanged" tp:name-for-bindings="DBus_Names_Changed"> + <tp:docstring> + Emitted on a multi-user (i.e. Handle_Type_Room) D-Bus tube when a + participant opens or closes the tube. + </tp:docstring> + <arg name="added" type="a(us)" tp:type="DBus_Tube_Member[]"> + <tp:docstring> + Array of handles and D-Bus names of new participants. + </tp:docstring> + </arg> + <arg name="removed" type="au" tp:type="Contact_Handle[]"> + <tp:docstring> + Array of handles of former participants. + </tp:docstring> + </arg> + </signal> + + <property name="ServiceName" type="s" access="read" + tp:name-for-bindings="Service_Name"> + <tp:docstring xmlns="http://www.w3.org/1999/xhtml"> + <p>A string representing the service name that will be used over the + tube. It should be a well-known D-Bus service name, of the form + com.example.ServiceName.</p> + <p>When the tube is offered, the service name is transmitted to the + other end.</p> + <p>When requesting a channel with + <tp:dbus-ref namespace="org.freedesktop.Telepathy">Connection.Interface.Requests.CreateChannel</tp:dbus-ref>, + this property MUST be included in the request.</p> + </tp:docstring> + </property> + + </interface> + +</node> +<!-- vim:set sw=2 sts=2 et ft=xml: --> diff --git a/extensions/Channel_Type_Stream_Tube.xml b/extensions/Channel_Type_Stream_Tube.xml new file mode 100644 index 00000000..f34f441b --- /dev/null +++ b/extensions/Channel_Type_Stream_Tube.xml @@ -0,0 +1,219 @@ +<?xml version="1.0" ?> +<node name="/Channel_Type_Stream_Tube" xmlns:tp="http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0"> + <tp:copyright>Copyright (C) 2008 Collabora Limited</tp:copyright> + <tp:copyright>Copyright (C) 2008 Nokia Corporation</tp:copyright> + <tp:license> + 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. + +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. + +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. + </tp:license> + <interface name="org.freedesktop.Telepathy.Channel.Type.StreamTube.DRAFT" + tp:causes-havoc="experimental"> + <tp:requires interface="org.freedesktop.Telepathy.Channel"/> + <tp:requires interface="org.freedesktop.Telepathy.Channel.Interface.Tube.DRAFT"/> + <tp:docstring xmlns="http://www.w3.org/1999/xhtml"> + <p>A stream tube is a transport for ordered, reliable data transfer, + similar to SOCK_STREAM sockets.</p> + + <p>When accepting a stream tube, a new listening local socket is + created. Each time the client connects to this socket, the + connection manager of the initiator of the tube opens a new + connection to its local socket. Both sides can then use this pair + of sockets to communicate together.</p> + + </tp:docstring> + + <method name="OfferStreamTube" tp:name-for-bindings="Offer_Stream_Tube"> + <tp:docstring> + Offer a stream tube exporting the local socket specified. + </tp:docstring> + <arg direction="in" name="address_type" type="u" tp:type="Socket_Address_Type"> + <tp:docstring> + The type of the listening address of the local service, as a member of + Socket_Address_Type. + </tp:docstring> + </arg> + <arg direction="in" name="address" type="v"> + <tp:docstring> + The listening address of the local service, as indicated by the + address_type. + </tp:docstring> + </arg> + <arg direction="in" name="access_control" type="u" tp:type="Socket_Access_Control"> + <tp:docstring> + The access control the local service applies to the local socket, + specified so the connection manager can behave appropriately + when it connects. + </tp:docstring> + </arg> + <arg direction="in" name="access_control_param" type="v"> + <tp:docstring> + A parameter for the access control type, to be interpreted as + specified in the documentation for the Socket_Access_Control enum. + </tp:docstring> + </arg> + <tp:possible-errors> + <tp:error name="org.freedesktop.Telepathy.Error.NetworkError"/> + <tp:error name="org.freedesktop.Telepathy.Error.NotAvailable"> + <tp:docstring> + The contact associated with this channel doesn't have tube + capabilities. + </tp:docstring> + </tp:error> + <tp:error name="org.freedesktop.Telepathy.Error.NotImplemented"> + <tp:docstring> + The connection manager doesn't support stream tubes, or + does not support the given address type or access-control type. + </tp:docstring> + </tp:error> + </tp:possible-errors> + </method> + + <method name="AcceptStreamTube" tp:name-for-bindings="Accept_Stream_Tube"> + <tp:docstring> + Accept a stream tube that's in the "local pending" state. The + connection manager will attempt to open the tube. The tube remains in + the "local pending" state until the TubeStateChanged signal is + emitted. + </tp:docstring> + <arg direction="in" name="address_type" type="u" tp:type="Socket_Address_Type"> + <tp:docstring> + The type of address the connection manager should listen on. + </tp:docstring> + </arg> + <arg direction="in" name="access_control" type="u" tp:type="Socket_Access_Control"> + <tp:docstring> + The type of access control the connection manager should apply to + the socket. + </tp:docstring> + </arg> + <arg direction="in" name="access_control_param" type="v"> + <tp:docstring> + A parameter for the access control type, to be interpreted as + specified in the documentation for the Socket_Access_Control enum. + </tp:docstring> + </arg> + <arg direction="out" name="address" type="v"> + <tp:docstring> + The address on which the connection manager will listen for + connections to this tube. The client should not attempt to connect + to the address until the tube is open. + </tp:docstring> + </arg> + + <tp:possible-errors> + <tp:error name="org.freedesktop.Telepathy.Error.InvalidArgument"> + <tp:docstring> + The given tube ID is invalid or does not refer to a stream + tube. + </tp:docstring> + </tp:error> + <tp:error name="org.freedesktop.Telepathy.Error.NotImplemented"> + <tp:docstring> + The given address type or access-control mechanism is not supported. + </tp:docstring> + </tp:error> + </tp:possible-errors> + </method> + + <method name="GetStreamTubeSocketAddress" + tp:name-for-bindings="Get_Stream_Tube_Socket_Address"> + <tp:docstring> + For a stream tube, obtain the address of the socket used to + communicate over this tube. + </tp:docstring> + <arg direction="out" name="address_type" type="u" tp:type="Socket_Address_Type"> + <tp:docstring> + The type of the listening address of the socket, as a member of + Socket_Address_Type. + </tp:docstring> + </arg> + <arg direction="out" name="address" type="v"> + <tp:docstring> + The listening address of the socket, as indicated by the + address_type. + </tp:docstring> + </arg> + <tp:possible-errors> + <tp:error name="org.freedesktop.Telepathy.Error.NotAvailable"> + <tp:docstring> + This tube is not in the "open" state. + </tp:docstring> + </tp:error> + </tp:possible-errors> + </method> + + <signal name="StreamTubeNewConnection" + tp:name-for-bindings="Stream_Tube_New_Connection"> + <tp:docstring> + Emitted on a stream tube when a participant opens a new connection + to its socket. + </tp:docstring> + <arg name="handle" type="u" tp:type="Contact_Handle"> + <tp:docstring> + The handle of the participant who opened the new connection + </tp:docstring> + </arg> + </signal> + + <property name="Service" type="s" access="read" + tp:name-for-bindings="Service"> + <tp:docstring xmlns="http://www.w3.org/1999/xhtml"> + <p> A string representing the service name that will be used over the + tube. It should be a well-known TCP service name as defined by + <a href="http://www.iana.org/assignments/port-numbers"> + http://www.iana.org/assignments/port-numbers</a> or + <a href="http://www.dns-sd.org/ServiceTypes.html"> + http://www.dns-sd.org/ServiceTypes.html</a>, for instance + "rsync" or "daap".</p> + <p>When the tube is offered, the service name is transmitted to the + other end.</p> + <p>When requesting a channel with + <tp:dbus-ref namespace="org.freedesktop.Telepathy">Connection.Interface.Requests.CreateChannel</tp:dbus-ref>, + this property MUST be included in the request.</p> + </tp:docstring> + </property> + + <property name="SupportedSocketTypes" type="a{uau}" + tp:type="Supported_Socket_Map" access="read" + tp:name-for-bindings="Supported_Socket_Types"> + <tp:docstring xmlns="http://www.w3.org/1999/xhtml"> + <p>A mapping from address types (members of Socket_Address_Type) to + arrays of access-control type (members of Socket_Access_Control) + that the connection manager supports for stream tubes with that + address type. For simplicity, if a CM supports offering a + particular type of tube, it is assumed to support accepting it.</p> + + <p>A typical value for a host without IPv6 support:</p> + + <pre> + { + Socket_Address_Type_IPv4: + [Socket_Access_Control_Localhost, Socket_Access_Control_Port, + Socket_Access_Control_Netmask], + Socket_Address_Type_Unix: + [Socket_Access_Control_Localhost, Socket_Access_Control_Credentials] + } + </pre> + + <p>When requesting a channel with + <tp:dbus-ref namespace="org.freedesktop.Telepathy">Connection.Interface.Requests.CreateChannel</tp:dbus-ref>, + this property MUST NOT be included in the request.</p> + + </tp:docstring> + </property> + + </interface> + +</node> +<!-- vim:set sw=2 sts=2 et ft=xml: --> diff --git a/extensions/Makefile.am b/extensions/Makefile.am index a1f7b816..b3bd24b2 100644 --- a/extensions/Makefile.am +++ b/extensions/Makefile.am @@ -2,6 +2,9 @@ tools_dir = $(top_srcdir)/tools EXTRA_DIST = \ Channel_Type_File_Transfer.xml \ + Channel_Type_Stream_Tube.xml \ + Channel_Type_DBus_Tube.xml \ + Channel_Interface_Tube.xml \ channel.xml \ OLPC_Buddy_Info.xml \ OLPC_Activity_Properties.xml \ diff --git a/extensions/all.xml b/extensions/all.xml index 8a54e2c2..9e9ad6d5 100644 --- a/extensions/all.xml +++ b/extensions/all.xml @@ -25,6 +25,10 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA</p> <xi:include href="channel.xml"/> <xi:include href="connection.xml"/> +<xi:include href="Channel_Type_Stream_Tube.xml"/> +<xi:include href="Channel_Type_DBus_Tube.xml"/> +<xi:include href="Channel_Interface_Tube.xml"/> + <tp:generic-types> <tp:external-type name="Contact_Handle" type="u" from="Telepathy specification"/> @@ -38,9 +42,17 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA</p> from="Telepathy specification"/> <tp:external-type name="Qualified_Property_Value_Map" type="a{sv}" from="Telepathy specification"/> + <tp:external-type name="String_Variant_Map" type="a{sv}" + from="Telepathy specification"/> + + <!-- use types from Channel_Type_Tubes --> + <tp:external-type name="Socket_Address_Type" type="u" + from="Telepathy specification"/> + <tp:external-type name="Socket_Access_Control" type="u" + from="Telepathy specification"/> <tp:external-type name="Supported_Socket_Map" type="a{uau}" from="Telepathy specification"/> - <tp:external-type name="Unix_Timestamp64" type="t" + <tp:external-type name="DBus_Tube_Member" type="(us)" from="Telepathy specification"/> </tp:generic-types> |