<?xml version='1.0' encoding='ISO-8859-1' standalone='no'?>
<!DOCTYPE interface-description SYSTEM 'file:///usr/pkgsrc/lang/oo2c/work.macaroon/oo2c_32-2.0.11/rsrc/OOC/xml/interface-description.dtd'>
<interface-description name='IO' id=''>
  <oberon-doc>
    <summary>This set of modules defines a set of input/output abstractions for files, sockets, pipes, and so on.</summary>
    <p pad-after='yes' no-indent='yes'>This set of modules defines a set of input/output abstractions for files, sockets, pipes, and so on.  The modules are not related to the library modules <oberon-module href='Channel#'>Channel</oberon-module>, <oberon-module href='Files#'>Files</oberon-module>, and derivates.  Their goals are quite different:</p>
    <itemize pad-after='yes'>
      <itemize-mark><bullet/></itemize-mark>
      <item pad-after='yes'>
        <p pad-after='no' no-indent='yes'>Provide an thin and efficient layer on top of the operation system's I/O features.</p>
      </item>
      <item pad-after='yes'>
        <p pad-after='no' no-indent='yes'>Use exceptions to propagate errors to the application that are reported by the C library.</p>
      </item>
      <item pad-after='yes'>
        <p pad-after='no' no-indent='yes'>Provide an abstraction for I/O multiplexing that allows to use different mechanisms besides <code>select()</code>.</p>
      </item>
      <item pad-after='no'>
        <p pad-after='no' no-indent='yes'>The level of abstraction should be high-level enough to care for slighty different I/O primitives, most notably under Windows.</p>
      </item>
    </itemize>
    <p pad-after='yes' no-indent='no'>The roots of the interface are partially the Java IO package, Python, and the Oberon-2 standard I/O modules.  Eventually, the modules will replace the <samp>IO:*</samp> inherited from the old <samp>libxml</samp> package.</p>
  </oberon-doc>
  <import-decl name='SYSTEM' id='SYSTEM' export='no' module='SYSTEM'/>
  <import-decl name='Object' id='Object' export='no' module='Object'/>
  <import-decl name='Exception' id='Exception' export='no' module='Exception'/>
  <import-decl name='C' id='C' export='no' module='C'/>
  <type-decl name='SelectionKeyList' id='SelectionKeyList' export='no'>
    <type>
      <pointer>
        <pointer-base>
          <array>
            <element-type>
              <type-name name='SelectionKey' href='#SelectionKey'/>
            </element-type>
          </array>
        </pointer-base>
      </pointer>
    </type>
  </type-decl>
  <type-decl name='FileDescriptor' id='FileDescriptor' export='yes'>
    <type>
      <type-name module='C' name='int' href='C#int'/>
    </type>
  </type-decl>
  <const-decl name='opRead' id='opRead' export='yes' value='unknown'>
    <oberon-doc>
      <summary>Used to signal interest in new input data, or to indicate that some input data has become available for processing.</summary>
      <p pad-after='yes' no-indent='yes'>Used to signal interest in new input data, or to indicate that some input data has become available for processing.</p>
    </oberon-doc>
  </const-decl>
  <const-decl name='opWrite' id='opWrite' export='yes' value='unknown'>
    <oberon-doc>
      <summary>Used to signal interest to produce output on a channel, or to indicate that there is room for more data to be passed to the operating system.</summary>
      <p pad-after='yes' no-indent='yes'>Used to signal interest to produce output on a channel, or to indicate that there is room for more data to be passed to the operating system.</p>
    </oberon-doc>
  </const-decl>
  <const-decl name='opAccept' id='opAccept' export='yes' value='unknown'>
    <oberon-doc>
      <summary>Used to signal interest in connection requests, or to indicate that there are pending requests.</summary>
      <p pad-after='yes' no-indent='yes'>Used to signal interest in connection requests, or to indicate that there are pending requests.</p>
    </oberon-doc>
  </const-decl>
  <const-decl name='opConnect' id='opConnect' export='yes' value='unknown'>
    <oberon-doc>
      <summary>Used to signal interest in completion of a currently pending connection attempt, or to indicate that a pending connect has been completed.</summary>
      <p pad-after='yes' no-indent='yes'>Used to signal interest in completion of a currently pending connection attempt, or to indicate that a pending connect has been completed.</p>
    </oberon-doc>
  </const-decl>
  <procedure name='RaiseFormatError' id='RaiseFormatError' export='yes'>
    <formal-parameters>
      <parameter-decl name='msg' id='RaiseFormatError.msg' export='no' variable-parameter='no'>
        <type>
          <type-name name='STRING' href='#STRING'/>
        </type>
      </parameter-decl>
      <exceptions>
        <type-name name='FormatError' href='#FormatError'/>
      </exceptions>
    </formal-parameters>
  </procedure>
  <procedure name='RaiseNotImplemented' id='RaiseNotImplemented' export='yes'>
    <formal-parameters>
      <exceptions>
        <type-name name='NotImplemented' href='#NotImplemented'/>
      </exceptions>
    </formal-parameters>
  </procedure>
  <import-decl name='-RT0' id='-RT0' export='no' module='RT0'/>
  <import-decl name='-Object' id='-Object' export='no' module='Object'/>
  <import-decl name='-Exception' id='-Exception' export='no' module='Exception'/>
  <class name='Channel'>
    <type-decl name='Channel' id='Channel' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='ChannelDesc' href='#ChannelDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='ChannelDesc' id='ChannelDesc' export='yes'>
      <oberon-doc>
        <summary>A channel is a means by which a program can perform I/O operations.</summary>
        <p pad-after='yes' no-indent='yes'>A channel is a means by which a program can perform I/O operations.  Examples for channels are <oberon-type href='IO:FileChannel#Channel'>IO:FileChannel.Channel</oberon-type>, <oberon-type href='IO:SocketChannel#Channel'>IO:SocketChannel.Channel</oberon-type>, and <oberon-type href='IO:SocketChannel#ServerChannel'>IO:SocketChannel.ServerChannel</oberon-type>.</p>
      </oberon-doc>
      <type>
        <record>
          <field-decl name='readyOps' id='ChannelDesc.readyOps' export='yes'>
            <type>
              <type-name module='#predef' name='SET'/>
            </type>
          </field-decl>
        </record>
      </type>
    </type-decl>
    <procedure name='InitChannel' id='InitChannel' export='yes'>
      <formal-parameters>
        <parameter-decl name='ch' id='InitChannel.ch' export='no' variable-parameter='no'>
          <type>
            <type-name name='Channel' href='#Channel'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='FileDescriptor' id='ChannelDesc.FileDescriptor' export='yes'>
      <oberon-doc>
        <summary>Return the file descriptor of the channel.</summary>
        <p pad-after='yes' no-indent='yes'>Return the file descriptor of the channel.  This is the integer number that is used to identify the channel on the level of the C library.  If the channel is not associated with a file descriptor, result is <samp>-1</samp>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='ch' id='ChannelDesc.FileDescriptor.ch' export='no' variable-parameter='no'>
          <type>
            <type-name name='Channel' href='#Channel'/>
          </type>
        </receiver-decl>
        <result-type>
          <type-name module='#predef' name='FileDescriptor'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='RegisterWithSelector' id='ChannelDesc.RegisterWithSelector' export='yes'>
      <oberon-doc>
        <summary>Register the channel <oberon-param href='#ChannelDesc.RegisterWithSelector.ch'>ch</oberon-param> with the selector <oberon-param href='#ChannelDesc.RegisterWithSelector.sel'>sel</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Register the channel <oberon-param href='#ChannelDesc.RegisterWithSelector.ch'>ch</oberon-param> with the selector <oberon-param href='#ChannelDesc.RegisterWithSelector.sel'>sel</oberon-param>.  If such a registration already exists, then return the old selection key.  Otherwise, create a new key with an interest set <oberon-param href='#ChannelDesc.RegisterWithSelector.ops'>ops</oberon-param> and attachment <oberon-param href='#ChannelDesc.RegisterWithSelector.attachment'>attachment</oberon-param> and return it.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='ch' id='ChannelDesc.RegisterWithSelector.ch' export='no' variable-parameter='no'>
          <type>
            <type-name name='Channel' href='#Channel'/>
          </type>
        </receiver-decl>
        <parameter-decl name='sel' id='ChannelDesc.RegisterWithSelector.sel' export='no' variable-parameter='no'>
          <type>
            <type-name name='Selector' href='#Selector'/>
          </type>
        </parameter-decl>
        <parameter-decl name='ops' id='ChannelDesc.RegisterWithSelector.ops' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='SET'/>
          </type>
        </parameter-decl>
        <parameter-decl name='attachment' id='ChannelDesc.RegisterWithSelector.attachment' export='no' variable-parameter='no'>
          <type>
            <type-name module='Object' name='Object' href='Object#Object'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name name='SelectionKey' href='#SelectionKey'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='KeyForSelector' id='ChannelDesc.KeyForSelector' export='yes'>
      <oberon-doc>
        <summary>Return selection key of <oberon-param href='#ChannelDesc.KeyForSelector.ch'>ch</oberon-param> for selector <oberon-param href='#ChannelDesc.KeyForSelector.sel'>sel</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Return selection key of <oberon-param href='#ChannelDesc.KeyForSelector.ch'>ch</oberon-param> for selector <oberon-param href='#ChannelDesc.KeyForSelector.sel'>sel</oberon-param>.  Result is <code>NIL</code> if the channel is not registered with the selector.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='ch' id='ChannelDesc.KeyForSelector.ch' export='no' variable-parameter='no'>
          <type>
            <type-name name='Channel' href='#Channel'/>
          </type>
        </receiver-decl>
        <parameter-decl name='sel' id='ChannelDesc.KeyForSelector.sel' export='no' variable-parameter='no'>
          <type>
            <type-name name='Selector' href='#Selector'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name name='SelectionKey' href='#SelectionKey'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='SetBlocking' id='ChannelDesc.SetBlocking' export='yes'>
      <oberon-doc>
        <summary>Change the channel's blocking mode.</summary>
        <p pad-after='yes' no-indent='yes'>Change the channel's blocking mode.  Channels typically default to blocking mode on creation.</p>
        <p pad-after='yes' no-indent='no'>If a channel does not support non-blocking operation, then any call to this method is ignored.  Rider implementations from <oberon-module href='IO:BinaryRider#'>IO:BinaryRider</oberon-module> and <oberon-module href='IO:TextRider#'>IO:TextRider</oberon-module> only work with blocking channels.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='ch' id='ChannelDesc.SetBlocking.ch' export='no' variable-parameter='no'>
          <type>
            <type-name name='Channel' href='#Channel'/>
          </type>
        </receiver-decl>
        <parameter-decl name='block' id='ChannelDesc.SetBlocking.block' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='BOOLEAN'/>
          </type>
        </parameter-decl>
        <exceptions>
          <type-name name='Error' href='#Error'/>
        </exceptions>
      </formal-parameters>
    </procedure>
    <procedure name='Close' id='ChannelDesc.Close' export='yes'>
      <oberon-doc>
        <summary>Cancel all selection keys registered for the channel <oberon-param href='#ChannelDesc.Close.ch'>ch</oberon-param> and close the channel.</summary>
        <p pad-after='yes' no-indent='yes'>Cancel all selection keys registered for the channel <oberon-param href='#ChannelDesc.Close.ch'>ch</oberon-param> and close the channel.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='ch' id='ChannelDesc.Close.ch' export='no' variable-parameter='no'>
          <type>
            <type-name name='Channel' href='#Channel'/>
          </type>
        </receiver-decl>
        <exceptions>
          <type-name name='Error' href='#Error'/>
        </exceptions>
      </formal-parameters>
    </procedure>
    <procedure name='CloseAndRegister' id='ChannelDesc.CloseAndRegister' export='yes'>
      <oberon-doc>
        <summary>Like <oberon-proc href='#ChannelDesc.Close'>Channel.Close</oberon-proc>, but register the channel's target with its naming service once done.</summary>
        <p pad-after='yes' no-indent='yes'>Like <oberon-proc href='#ChannelDesc.Close'>Channel.Close</oberon-proc>, but register the channel's target with its naming service once done.  Right now, only <oberon-module href='IO:FileChannel#'>IO:FileChannel</oberon-module> supports this feature; see <oberon-const href='IO:FileChannel#tmpFile'>IO:FileChannel.tmpFile</oberon-const> for details.  By default, this method simply calls <oberon-proc href='#ChannelDesc.Close'>Channel.Close</oberon-proc>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='ch' id='ChannelDesc.CloseAndRegister.ch' export='no' variable-parameter='no'>
          <type>
            <type-name name='Channel' href='#Channel'/>
          </type>
        </receiver-decl>
        <exceptions>
          <type-name name='Error' href='#Error'/>
        </exceptions>
      </formal-parameters>
    </procedure>
    <procedure name='SetPos' id='ChannelDesc.SetPos' export='yes'>
      <oberon-doc>
        <summary>Change the channels position to <oberon-param href='#ChannelDesc.SetPos.pos'>pos</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Change the channels position to <oberon-param href='#ChannelDesc.SetPos.pos'>pos</oberon-param>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='ch' id='ChannelDesc.SetPos.ch' export='no' variable-parameter='no'>
          <type>
            <type-name name='Channel' href='#Channel'/>
          </type>
        </receiver-decl>
        <parameter-decl name='pos' id='ChannelDesc.SetPos.pos' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <exceptions>
          <type-name name='Error' href='#Error'/>
        </exceptions>
      </formal-parameters>
    </procedure>
  </class>
  <class name='ByteChannel'>
    <type-decl name='ByteChannel' id='ByteChannel' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='ByteChannelDesc' href='#ByteChannelDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='ByteChannelDesc' id='ByteChannelDesc' export='yes'>
      <oberon-doc>
        <summary>Common base type of channels supporting the <oberon-proc href='#ByteChannelDesc.Read'>ByteChannel.Read</oberon-proc> and <oberon-proc href='#ByteChannelDesc.Write'>ByteChannel.Write</oberon-proc> methods.</summary>
        <p pad-after='yes' no-indent='yes'>Common base type of channels supporting the <oberon-proc href='#ByteChannelDesc.Read'>ByteChannel.Read</oberon-proc> and <oberon-proc href='#ByteChannelDesc.Write'>ByteChannel.Write</oberon-proc> methods.</p>
      </oberon-doc>
      <type>
        <record/>
      </type>
    </type-decl>
    <procedure name='InitByteChannel' id='InitByteChannel' export='yes'>
      <formal-parameters>
        <parameter-decl name='ch' id='InitByteChannel.ch' export='no' variable-parameter='no'>
          <type>
            <type-name name='ByteChannel' href='#ByteChannel'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='Read' id='ByteChannelDesc.Read' export='yes'>
      <oberon-doc>
        <summary>Read a sequence of bytes from the channel into the buffer.</summary>
        <p pad-after='yes' no-indent='yes'>Read a sequence of bytes from the channel into the buffer.</p>
        <p pad-after='yes' no-indent='no'>An attempt is made to read up to <oberon-param href='#ByteChannelDesc.Read.length'>length</oberon-param> bytes from the channel.  The bytes are written to <oberon-param href='#ByteChannelDesc.Read.buffer'>buffer</oberon-param>, starting at position <oberon-param href='#ByteChannelDesc.Read.start'>start</oberon-param>.  Result is the number of bytes actually read, or <samp>-1</samp> if the read position is at the end of the channel, and <oberon-param href='#ByteChannelDesc.Read.length'>length</oberon-param> is not zero.</p>
        <p pad-after='yes' no-indent='no'>A read operation might not read <oberon-param href='#ByteChannelDesc.Read.length'>length</oberon-param> bytes, and in fact it might not read any bytes at all.  Whether or not it does so depends upon the nature and state of the channel.  A socket channel in non-blocking mode, for example, cannot read any more bytes than are immediately available from the socket's input buffer; similarly, a file channel cannot read any more bytes than remain in the file.  It is guaranteed, however, that if a channel is in blocking mode and there is at least one byte remaining in the buffer then this method will block until at least one byte is read.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><samp>0 &lt;= <oberon-param href='#ByteChannelDesc.Read.start'>start</oberon-param> &lt;= <oberon-param href='#ByteChannelDesc.Read.start'>start</oberon-param>+<oberon-param href='#ByteChannelDesc.Read.length'>length</oberon-param> &lt;= LEN(<oberon-param href='#ByteChannelDesc.Read.buffer'>buffer</oberon-param>)</samp> and <samp><oberon-param href='#ByteChannelDesc.Read.length'>length</oberon-param> &gt;= 0</samp>.</p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='ch' id='ByteChannelDesc.Read.ch' export='no' variable-parameter='no'>
          <type>
            <type-name name='ByteChannel' href='#ByteChannel'/>
          </type>
        </receiver-decl>
        <parameter-decl name='buffer' id='ByteChannelDesc.Read.buffer' export='no' variable-parameter='yes'>
          <type>
            <array>
              <element-type>
                <type-name module='SYSTEM' name='BYTE' href='SYSTEM#BYTE'/>
              </element-type>
            </array>
          </type>
        </parameter-decl>
        <parameter-decl name='start' id='ByteChannelDesc.Read.start' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <parameter-decl name='length' id='ByteChannelDesc.Read.length' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name module='#predef' name='LONGINT'/>
        </result-type>
        <exceptions>
          <type-name name='Error' href='#Error'/>
        </exceptions>
      </formal-parameters>
    </procedure>
    <procedure name='Write' id='ByteChannelDesc.Write' export='yes'>
      <oberon-doc>
        <summary>Write a sequence of bytes to this channel from the buffer.</summary>
        <p pad-after='yes' no-indent='yes'>Write a sequence of bytes to this channel from the buffer.</p>
        <p pad-after='yes' no-indent='no'>An attempt is made to write up to <oberon-param href='#ByteChannelDesc.Write.length'>length</oberon-param> bytes to the channel.  The bytes are taken from <oberon-param href='#ByteChannelDesc.Write.buffer'>buffer</oberon-param>, beginning at position <oberon-param href='#ByteChannelDesc.Write.start'>start</oberon-param>.</p>
        <p pad-after='yes' no-indent='no'>A write operation can return after writing less than <oberon-param href='#ByteChannelDesc.Write.length'>length</oberon-param> bytes.  That is, some types of channels, depending upon their state, may write only some of the bytes or possibly none at all.  A socket channel in non-blocking mode, for example, cannot write any more bytes than are free in the socket's output buffer.  Result is the number of bytes actually written.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><samp>0 &lt;= <oberon-param href='#ByteChannelDesc.Write.start'>start</oberon-param> &lt;= <oberon-param href='#ByteChannelDesc.Write.start'>start</oberon-param>+<oberon-param href='#ByteChannelDesc.Write.length'>length</oberon-param> &lt;= LEN(<oberon-param href='#ByteChannelDesc.Write.buffer'>buffer</oberon-param>)</samp> and <samp><oberon-param href='#ByteChannelDesc.Write.length'>length</oberon-param> &gt;= 0</samp>.</p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='ch' id='ByteChannelDesc.Write.ch' export='no' variable-parameter='no'>
          <type>
            <type-name name='ByteChannel' href='#ByteChannel'/>
          </type>
        </receiver-decl>
        <parameter-decl name='buffer' id='ByteChannelDesc.Write.buffer' export='no' variable-parameter='no'>
          <type>
            <array>
              <element-type>
                <type-name module='SYSTEM' name='BYTE' href='SYSTEM#BYTE'/>
              </element-type>
            </array>
          </type>
        </parameter-decl>
        <parameter-decl name='start' id='ByteChannelDesc.Write.start' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <parameter-decl name='length' id='ByteChannelDesc.Write.length' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name module='#predef' name='LONGINT'/>
        </result-type>
        <exceptions>
          <type-name name='Error' href='#Error'/>
        </exceptions>
      </formal-parameters>
    </procedure>
    <procedure name='Flush' id='ByteChannelDesc.Flush' export='yes'>
      <oberon-doc>
        <summary>Flush all buffers associated with channel <oberon-param href='#ByteChannelDesc.Flush.ch'>ch</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Flush all buffers associated with channel <oberon-param href='#ByteChannelDesc.Flush.ch'>ch</oberon-param>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='ch' id='ByteChannelDesc.Flush.ch' export='no' variable-parameter='no'>
          <type>
            <type-name name='ByteChannel' href='#ByteChannel'/>
          </type>
        </receiver-decl>
        <exceptions>
          <type-name name='Error' href='#Error'/>
        </exceptions>
      </formal-parameters>
    </procedure>
    <procedure name='TransferTo' id='ByteChannelDesc.TransferTo' export='yes'>
      <oberon-doc>
        <summary>Transfer upto <oberon-param href='#ByteChannelDesc.TransferTo.length'>length</oberon-param> bytes from channel <oberon-param href='#ByteChannelDesc.TransferTo.ch'>ch</oberon-param> to <oberon-param href='#ByteChannelDesc.TransferTo.target'>target</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Transfer upto <oberon-param href='#ByteChannelDesc.TransferTo.length'>length</oberon-param> bytes from channel <oberon-param href='#ByteChannelDesc.TransferTo.ch'>ch</oberon-param> to <oberon-param href='#ByteChannelDesc.TransferTo.target'>target</oberon-param>.  Result is the number of bytes actually copied.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='ch' id='ByteChannelDesc.TransferTo.ch' export='no' variable-parameter='no'>
          <type>
            <type-name name='ByteChannel' href='#ByteChannel'/>
          </type>
        </receiver-decl>
        <parameter-decl name='length' id='ByteChannelDesc.TransferTo.length' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <parameter-decl name='target' id='ByteChannelDesc.TransferTo.target' export='no' variable-parameter='no'>
          <type>
            <type-name name='ByteChannel' href='#ByteChannel'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name module='#predef' name='LONGINT'/>
        </result-type>
        <exceptions>
          <type-name name='Error' href='#Error'/>
        </exceptions>
      </formal-parameters>
    </procedure>
    <base-class module='IO' class='Channel' href='#Channel'>
      <inherited-method module='IO' name='Close' class='Channel' href='#ChannelDesc.Close'/>
      <inherited-method module='IO' name='CloseAndRegister' class='Channel' href='#ChannelDesc.CloseAndRegister'/>
      <inherited-method module='IO' name='FileDescriptor' class='Channel' href='#ChannelDesc.FileDescriptor'/>
      <inherited-method module='IO' name='KeyForSelector' class='Channel' href='#ChannelDesc.KeyForSelector'/>
      <inherited-method module='IO' name='RegisterWithSelector' class='Channel' href='#ChannelDesc.RegisterWithSelector'/>
      <inherited-method module='IO' name='SetBlocking' class='Channel' href='#ChannelDesc.SetBlocking'/>
      <inherited-method module='IO' name='SetPos' class='Channel' href='#ChannelDesc.SetPos'/>
      <inherited-field module='IO' name='readyOps' class='Channel' href='#ChannelDesc.readyOps'/>
    </base-class>
  </class>
  <class name='Selector'>
    <type-decl name='Selector' id='Selector' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='SelectorDesc' href='#SelectorDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='SelectorDesc' id='SelectorDesc' export='yes'>
      <oberon-doc>
        <summary>A mechanism to discover channels that are ready for I/O operations.</summary>
        <p pad-after='yes' no-indent='yes'>A mechanism to discover channels that are ready for I/O operations.  For example, a selector can be used to find out for which channels input data is available.</p>
        <p pad-after='yes' no-indent='no'>Note: The definition of this class covers both selectors that report the current state of a channel, and those that only report an event if a channel becomes ready.  <oberon-proc href='#SelectorDesc.Select'>Selector.Select</oberon-proc> only adds new ready flags, but never clears them.  I/O operations like <oberon-proc href='#ByteChannelDesc.Read'>ByteChannel.Read</oberon-proc>, <oberon-proc href='#ByteChannelDesc.Write'>ByteChannel.Write</oberon-proc>, <oberon-proc href='SocketChannel#Channel.Connect'>SocketChannel.Channel.Connect</oberon-proc>, and <oberon-proc href='SocketChannel#ServerChannel.Accept'>SocketChannel.ServerChannel.Accept</oberon-proc> clear the corresponding flag if the channel is in non-blocking mode and they get an <samp>EWOULDBLOCK</samp> error from the libc function.</p>
      </oberon-doc>
      <type>
        <record>
          <field-decl name='keys' id='SelectorDesc.keys' export='read-only'>
            <oberon-doc>
              <summary>A list of selection keys registered for this selector.</summary>
              <p pad-after='yes' no-indent='yes'>A list of selection keys registered for this selector.  The keys are linked via <oberon-field href='#SelectionKeyDesc.nextKey'>SelectionKey.nextKey</oberon-field>.</p>
            </oberon-doc>
            <type>
              <type-name name='SelectionKey' href='#SelectionKey'/>
            </type>
          </field-decl>
        </record>
      </type>
    </type-decl>
    <procedure name='InitSelector' id='InitSelector' export='yes'>
      <formal-parameters>
        <parameter-decl name='s' id='InitSelector.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='Selector' href='#Selector'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='Close' id='SelectorDesc.Close' export='yes'>
      <oberon-doc>
        <summary>Cancel all selection keys registered for the selector <oberon-param href='#SelectorDesc.Close.s'>s</oberon-param> and close the selector.</summary>
        <p pad-after='yes' no-indent='yes'>Cancel all selection keys registered for the selector <oberon-param href='#SelectorDesc.Close.s'>s</oberon-param> and close the selector.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='SelectorDesc.Close.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='Selector' href='#Selector'/>
          </type>
        </receiver-decl>
      </formal-parameters>
    </procedure>
    <procedure name='Select' id='SelectorDesc.Select' export='yes'>
      <oberon-doc>
        <summary>Determine if operations on registered channels are ready.</summary>
        <p pad-after='yes' no-indent='yes'>Determine if operations on registered channels are ready.  The function returns the number of channels with a non-empty ready set.  Result is <samp>0</samp> if no channels are ready or have become ready until the time the specified timeout expires.  If this function is called with a channel already being ready, then it behaves as if a timeout of zero had been requested.</p>
        <p pad-after='yes' no-indent='no'>After a call to <oberon-proc href='#SelectorDesc.Select'>Selector.Select</oberon-proc>, the method <oberon-proc href='#SelectorDesc.NextKey'>Selector.NextKey</oberon-proc> iterates over all ready channels.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='SelectorDesc.Select.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='Selector' href='#Selector'/>
          </type>
        </receiver-decl>
        <parameter-decl name='sec' id='SelectorDesc.Select.sec' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <parameter-decl name='usec' id='SelectorDesc.Select.usec' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='LONGINT'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name module='#predef' name='LONGINT'/>
        </result-type>
        <exceptions>
          <type-name name='Error' href='#Error'/>
        </exceptions>
      </formal-parameters>
    </procedure>
    <procedure name='NextKey' id='SelectorDesc.NextKey' export='yes'>
      <oberon-doc>
        <summary>Return the next selection key of selector <oberon-param href='#SelectorDesc.NextKey.s'>s</oberon-param> with a non-empty intersection of <oberon-field href='#SelectionKeyDesc.interestOps'>SelectionKey.interestOps</oberon-field> and <oberon-field href='#ChannelDesc.readyOps'>Channel.readyOps</oberon-field>.</summary>
        <p pad-after='yes' no-indent='yes'>Return the next selection key of selector <oberon-param href='#SelectorDesc.NextKey.s'>s</oberon-param> with a non-empty intersection of <oberon-field href='#SelectionKeyDesc.interestOps'>SelectionKey.interestOps</oberon-field> and <oberon-field href='#ChannelDesc.readyOps'>Channel.readyOps</oberon-field>.  Result is <code>NIL</code> if no such channel exists.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='SelectorDesc.NextKey.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='Selector' href='#Selector'/>
          </type>
        </receiver-decl>
        <result-type>
          <type-name name='SelectionKey' href='#SelectionKey'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='AddSelectionKey' id='SelectorDesc.AddSelectionKey' export='yes'>
      <oberon-doc>
        <summary>Private method of the selector.</summary>
        <p pad-after='yes' no-indent='yes'>Private method of the selector.  Create and initialize a selection key.  The caller is responsible for adding the key to the selector.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='SelectorDesc.AddSelectionKey.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='Selector' href='#Selector'/>
          </type>
        </receiver-decl>
        <parameter-decl name='fd' id='SelectorDesc.AddSelectionKey.fd' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='FileDescriptor'/>
          </type>
        </parameter-decl>
        <parameter-decl name='channel' id='SelectorDesc.AddSelectionKey.channel' export='no' variable-parameter='no'>
          <type>
            <type-name name='Channel' href='#Channel'/>
          </type>
        </parameter-decl>
        <parameter-decl name='ops' id='SelectorDesc.AddSelectionKey.ops' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='SET'/>
          </type>
        </parameter-decl>
        <parameter-decl name='attachment' id='SelectorDesc.AddSelectionKey.attachment' export='no' variable-parameter='no'>
          <type>
            <type-name module='Object' name='Object' href='Object#Object'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name name='SelectionKey' href='#SelectionKey'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <procedure name='RemoveSelectionKey' id='SelectorDesc.RemoveSelectionKey' export='yes'>
      <oberon-doc>
        <summary>Private method of the selector.</summary>
        <p pad-after='yes' no-indent='yes'>Private method of the selector.  Do any bookkeeping require to eliminate the selection key.  The caller is responsible for removing the key from the selector's list of keys.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='SelectorDesc.RemoveSelectionKey.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='Selector' href='#Selector'/>
          </type>
        </receiver-decl>
        <parameter-decl name='k' id='SelectorDesc.RemoveSelectionKey.k' export='no' variable-parameter='no'>
          <type>
            <type-name name='SelectionKey' href='#SelectionKey'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='RemoveCanceled' id='SelectorDesc.RemoveCanceled' export='yes'>
      <oberon-doc>
        <summary>Removes all keys that have been marked as <left-quote/>canceled<right-quote/> from the selector.</summary>
        <p pad-after='yes' no-indent='yes'>Removes all keys that have been marked as <left-quote/>canceled<right-quote/> from the selector.  This is a private method, and should only be called from <oberon-proc href='#SelectorDesc.Select'>Selector.Select</oberon-proc>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='s' id='SelectorDesc.RemoveCanceled.s' export='no' variable-parameter='no'>
          <type>
            <type-name name='Selector' href='#Selector'/>
          </type>
        </receiver-decl>
      </formal-parameters>
    </procedure>
    <base-class module='Object' class='Object' href='Object#Object'>
      <inherited-method module='Object' name='Equals' class='Object' href='Object#ObjectDesc.Equals'/>
      <inherited-method module='Object' name='HashCode' class='Object' href='Object#ObjectDesc.HashCode'/>
      <inherited-method module='Object' name='ToString' class='Object' href='Object#ObjectDesc.ToString'/>
    </base-class>
  </class>
  <class name='SelectionKey'>
    <type-decl name='SelectionKey' id='SelectionKey' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='SelectionKeyDesc' href='#SelectionKeyDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='SelectionKeyDesc' id='SelectionKeyDesc' export='yes'>
      <oberon-doc>
        <summary>Association between a <oberon-type href='#Channel'>Channel</oberon-type> and <oberon-type href='#Selector'>Selector</oberon-type>.</summary>
        <p pad-after='yes' no-indent='yes'>Association between a <oberon-type href='#Channel'>Channel</oberon-type> and <oberon-type href='#Selector'>Selector</oberon-type>.</p>
      </oberon-doc>
      <type>
        <record>
          <field-decl name='fd' id='SelectionKeyDesc.fd' export='read-only'>
            <type>
              <type-name module='#predef' name='FileDescriptor'/>
            </type>
          </field-decl>
          <field-decl name='interestOps' id='SelectionKeyDesc.interestOps' export='read-only'>
            <type>
              <type-name module='#predef' name='SET'/>
            </type>
          </field-decl>
          <field-decl name='attachment' id='SelectionKeyDesc.attachment' export='read-only'>
            <type>
              <type-name module='Object' name='Object' href='Object#Object'/>
            </type>
          </field-decl>
          <field-decl name='selector' id='SelectionKeyDesc.selector' export='read-only'>
            <type>
              <type-name name='Selector' href='#Selector'/>
            </type>
          </field-decl>
          <field-decl name='channel' id='SelectionKeyDesc.channel' export='read-only'>
            <type>
              <type-name name='Channel' href='#Channel'/>
            </type>
          </field-decl>
          <field-decl name='nextKey' id='SelectionKeyDesc.nextKey' export='read-only'>
            <type>
              <type-name name='SelectionKey' href='#SelectionKey'/>
            </type>
          </field-decl>
        </record>
      </type>
    </type-decl>
    <procedure name='InitSelectionKey' id='InitSelectionKey' export='yes'>
      <formal-parameters>
        <parameter-decl name='k' id='InitSelectionKey.k' export='no' variable-parameter='no'>
          <type>
            <type-name name='SelectionKey' href='#SelectionKey'/>
          </type>
        </parameter-decl>
        <parameter-decl name='fd' id='InitSelectionKey.fd' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='FileDescriptor'/>
          </type>
        </parameter-decl>
        <parameter-decl name='selector' id='InitSelectionKey.selector' export='no' variable-parameter='no'>
          <type>
            <type-name name='Selector' href='#Selector'/>
          </type>
        </parameter-decl>
        <parameter-decl name='channel' id='InitSelectionKey.channel' export='no' variable-parameter='no'>
          <type>
            <type-name name='Channel' href='#Channel'/>
          </type>
        </parameter-decl>
        <parameter-decl name='ops' id='InitSelectionKey.ops' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='SET'/>
          </type>
        </parameter-decl>
        <parameter-decl name='attachment' id='InitSelectionKey.attachment' export='no' variable-parameter='no'>
          <type>
            <type-name module='Object' name='Object' href='Object#Object'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='Attach' id='SelectionKeyDesc.Attach' export='yes'>
      <oberon-doc>
        <summary>Set <oberon-field href='#SelectionKeyDesc.attachment'>k.attachment</oberon-field> to <oberon-param href='#SelectionKeyDesc.Attach.obj'>obj</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Set <oberon-field href='#SelectionKeyDesc.attachment'>k.attachment</oberon-field> to <oberon-param href='#SelectionKeyDesc.Attach.obj'>obj</oberon-param>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='k' id='SelectionKeyDesc.Attach.k' export='no' variable-parameter='no'>
          <type>
            <type-name name='SelectionKey' href='#SelectionKey'/>
          </type>
        </receiver-decl>
        <parameter-decl name='obj' id='SelectionKeyDesc.Attach.obj' export='no' variable-parameter='no'>
          <type>
            <type-name module='Object' name='Object' href='Object#Object'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='Cancel' id='SelectionKeyDesc.Cancel' export='yes'>
      <oberon-doc>
        <summary>Mark key <oberon-param href='#SelectionKeyDesc.Cancel.k'>k</oberon-param> as canceled.</summary>
        <p pad-after='yes' no-indent='yes'>Mark key <oberon-param href='#SelectionKeyDesc.Cancel.k'>k</oberon-param> as canceled.  The key is immediately eliminated from the channels's list of keys.  It is removed from the selector's key list with the next call to <oberon-proc href='#SelectorDesc.Select'>Selector.Select</oberon-proc>.  Closing a channel cancels all its selection keys.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='k' id='SelectionKeyDesc.Cancel.k' export='no' variable-parameter='no'>
          <type>
            <type-name name='SelectionKey' href='#SelectionKey'/>
          </type>
        </receiver-decl>
      </formal-parameters>
    </procedure>
    <procedure name='SetInterestOps' id='SelectionKeyDesc.SetInterestOps' export='yes'>
      <oberon-doc>
        <summary>Set <oberon-field href='#SelectionKeyDesc.interestOps'>k.interestOps</oberon-field> to <oberon-param href='#SelectionKeyDesc.SetInterestOps.ops'>ops</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Set <oberon-field href='#SelectionKeyDesc.interestOps'>k.interestOps</oberon-field> to <oberon-param href='#SelectionKeyDesc.SetInterestOps.ops'>ops</oberon-param>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='k' id='SelectionKeyDesc.SetInterestOps.k' export='no' variable-parameter='no'>
          <type>
            <type-name name='SelectionKey' href='#SelectionKey'/>
          </type>
        </receiver-decl>
        <parameter-decl name='ops' id='SelectionKeyDesc.SetInterestOps.ops' export='no' variable-parameter='no'>
          <type>
            <type-name module='#predef' name='SET'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <base-class module='Object' class='Object' href='Object#Object'>
      <inherited-method module='Object' name='Equals' class='Object' href='Object#ObjectDesc.Equals'/>
      <inherited-method module='Object' name='HashCode' class='Object' href='Object#ObjectDesc.HashCode'/>
      <inherited-method module='Object' name='ToString' class='Object' href='Object#ObjectDesc.ToString'/>
    </base-class>
  </class>
  <class name='Error'>
    <type-decl name='Error' id='Error' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='ErrorDesc' href='#ErrorDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='ErrorDesc' id='ErrorDesc' export='yes'>
      <oberon-doc>
        <summary>Base class of all I/O exceptions raised by channel implementations.</summary>
        <p pad-after='yes' no-indent='yes'>Base class of all I/O exceptions raised by channel implementations.</p>
      </oberon-doc>
      <type>
        <record/>
      </type>
    </type-decl>
    <procedure name='INIT' id='ErrorDesc.INIT' export='yes'>
      <doc-inherited-from module='Exception' name='INIT' class='Exception' href='Exception#ExceptionDesc.INIT'/>
      <oberon-doc>
        <summary>Initialize exception <oberon-param href='#ErrorDesc.INIT.e'>e</oberon-param> and set <oberon-param href='#ErrorDesc.INIT.msg'>msg</oberon-param> as its message.</summary>
        <p pad-after='yes' no-indent='yes'>Initialize exception <oberon-param href='#ErrorDesc.INIT.e'>e</oberon-param> and set <oberon-param href='#ErrorDesc.INIT.msg'>msg</oberon-param> as its message.  <oberon-param href='#ErrorDesc.INIT.msg'>msg</oberon-param> may be <code>NIL</code>, but in this case <oberon-proc href='Exception#ExceptionDesc.GetMessage'>Exception.GetMessage</oberon-proc> must be redefined to provide a non-<code>NIL</code> message.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><oberon-param href='#ErrorDesc.INIT.e'>e</oberon-param> is not <code>NIL</code>.</p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='e' id='ErrorDesc.INIT.e' export='no' variable-parameter='no'>
          <type>
            <type-name name='Error' href='#Error'/>
          </type>
        </receiver-decl>
        <parameter-decl name='msg' id='ErrorDesc.INIT.msg' export='no' variable-parameter='no'>
          <type>
            <type-name name='STRING' href='#STRING'/>
          </type>
        </parameter-decl>
      </formal-parameters>
      <redefined-method module='Exception' name='INIT' class='Exception' href='Exception#ExceptionDesc.INIT'/>
    </procedure>
    <base-class module='Exception' class='Exception' href='Exception#Exception'>
      <inherited-method module='Exception' name='GetMessage' class='Exception' href='Exception#ExceptionDesc.GetMessage'/>
      <inherited-method module='Exception' name='INIT' class='Exception' href='Exception#ExceptionDesc.INIT'/>
      <inherited-method module='Exception' name='Name' class='Exception' href='Exception#ExceptionDesc.Name'/>
      <inherited-method module='Exception' name='WriteBacktrace' class='Exception' href='Exception#ExceptionDesc.WriteBacktrace'/>
    </base-class>
  </class>
  <class name='FileNotFound'>
    <type-decl name='FileNotFound' id='FileNotFound' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='FileNotFoundDesc' href='#FileNotFoundDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='FileNotFoundDesc' id='FileNotFoundDesc' export='no'>
      <type>
        <record/>
      </type>
    </type-decl>
    <base-class module='IO' class='Error' href='#Error'>
      <inherited-method module='IO' name='INIT' class='Error' href='#ErrorDesc.INIT'/>
      <base-class module='Exception' class='Exception' href='Exception#Exception'>
        <inherited-method module='Exception' name='GetMessage' class='Exception' href='Exception#ExceptionDesc.GetMessage'/>
        <inherited-method module='Exception' name='Name' class='Exception' href='Exception#ExceptionDesc.Name'/>
        <inherited-method module='Exception' name='WriteBacktrace' class='Exception' href='Exception#ExceptionDesc.WriteBacktrace'/>
      </base-class>
    </base-class>
  </class>
  <class name='AccessDenied'>
    <type-decl name='AccessDenied' id='AccessDenied' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='AccessDeniedDesc' href='#AccessDeniedDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='AccessDeniedDesc' id='AccessDeniedDesc' export='no'>
      <type>
        <record/>
      </type>
    </type-decl>
    <base-class module='IO' class='Error' href='#Error'>
      <inherited-method module='IO' name='INIT' class='Error' href='#ErrorDesc.INIT'/>
      <base-class module='Exception' class='Exception' href='Exception#Exception'>
        <inherited-method module='Exception' name='GetMessage' class='Exception' href='Exception#ExceptionDesc.GetMessage'/>
        <inherited-method module='Exception' name='Name' class='Exception' href='Exception#ExceptionDesc.Name'/>
        <inherited-method module='Exception' name='WriteBacktrace' class='Exception' href='Exception#ExceptionDesc.WriteBacktrace'/>
      </base-class>
    </base-class>
  </class>
  <class name='FileExists'>
    <type-decl name='FileExists' id='FileExists' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='FileExistsDesc' href='#FileExistsDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='FileExistsDesc' id='FileExistsDesc' export='no'>
      <type>
        <record/>
      </type>
    </type-decl>
    <base-class module='IO' class='Error' href='#Error'>
      <inherited-method module='IO' name='INIT' class='Error' href='#ErrorDesc.INIT'/>
      <base-class module='Exception' class='Exception' href='Exception#Exception'>
        <inherited-method module='Exception' name='GetMessage' class='Exception' href='Exception#ExceptionDesc.GetMessage'/>
        <inherited-method module='Exception' name='Name' class='Exception' href='Exception#ExceptionDesc.Name'/>
        <inherited-method module='Exception' name='WriteBacktrace' class='Exception' href='Exception#ExceptionDesc.WriteBacktrace'/>
      </base-class>
    </base-class>
  </class>
  <class name='FileBusy'>
    <type-decl name='FileBusy' id='FileBusy' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='FileBusyDesc' href='#FileBusyDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='FileBusyDesc' id='FileBusyDesc' export='no'>
      <type>
        <record/>
      </type>
    </type-decl>
    <base-class module='IO' class='Error' href='#Error'>
      <inherited-method module='IO' name='INIT' class='Error' href='#ErrorDesc.INIT'/>
      <base-class module='Exception' class='Exception' href='Exception#Exception'>
        <inherited-method module='Exception' name='GetMessage' class='Exception' href='Exception#ExceptionDesc.GetMessage'/>
        <inherited-method module='Exception' name='Name' class='Exception' href='Exception#ExceptionDesc.Name'/>
        <inherited-method module='Exception' name='WriteBacktrace' class='Exception' href='Exception#ExceptionDesc.WriteBacktrace'/>
      </base-class>
    </base-class>
  </class>
  <class name='InvalidArgument'>
    <type-decl name='InvalidArgument' id='InvalidArgument' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='InvalidArgumentDesc' href='#InvalidArgumentDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='InvalidArgumentDesc' id='InvalidArgumentDesc' export='no'>
      <type>
        <record/>
      </type>
    </type-decl>
    <base-class module='IO' class='Error' href='#Error'>
      <inherited-method module='IO' name='INIT' class='Error' href='#ErrorDesc.INIT'/>
      <base-class module='Exception' class='Exception' href='Exception#Exception'>
        <inherited-method module='Exception' name='GetMessage' class='Exception' href='Exception#ExceptionDesc.GetMessage'/>
        <inherited-method module='Exception' name='Name' class='Exception' href='Exception#ExceptionDesc.Name'/>
        <inherited-method module='Exception' name='WriteBacktrace' class='Exception' href='Exception#ExceptionDesc.WriteBacktrace'/>
      </base-class>
    </base-class>
  </class>
  <class name='OutOfRange'>
    <type-decl name='OutOfRange' id='OutOfRange' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='OutOfRangeDesc' href='#OutOfRangeDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='OutOfRangeDesc' id='OutOfRangeDesc' export='no'>
      <type>
        <record/>
      </type>
    </type-decl>
    <base-class module='IO' class='Error' href='#Error'>
      <inherited-method module='IO' name='INIT' class='Error' href='#ErrorDesc.INIT'/>
      <base-class module='Exception' class='Exception' href='Exception#Exception'>
        <inherited-method module='Exception' name='GetMessage' class='Exception' href='Exception#ExceptionDesc.GetMessage'/>
        <inherited-method module='Exception' name='Name' class='Exception' href='Exception#ExceptionDesc.Name'/>
        <inherited-method module='Exception' name='WriteBacktrace' class='Exception' href='Exception#ExceptionDesc.WriteBacktrace'/>
      </base-class>
    </base-class>
  </class>
  <class name='NotImplemented'>
    <type-decl name='NotImplemented' id='NotImplemented' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='NotImplementedDesc' href='#NotImplementedDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='NotImplementedDesc' id='NotImplementedDesc' export='no'>
      <type>
        <record/>
      </type>
    </type-decl>
    <base-class module='IO' class='Error' href='#Error'>
      <inherited-method module='IO' name='INIT' class='Error' href='#ErrorDesc.INIT'/>
      <base-class module='Exception' class='Exception' href='Exception#Exception'>
        <inherited-method module='Exception' name='GetMessage' class='Exception' href='Exception#ExceptionDesc.GetMessage'/>
        <inherited-method module='Exception' name='Name' class='Exception' href='Exception#ExceptionDesc.Name'/>
        <inherited-method module='Exception' name='WriteBacktrace' class='Exception' href='Exception#ExceptionDesc.WriteBacktrace'/>
      </base-class>
    </base-class>
  </class>
  <class name='FormatError'>
    <type-decl name='FormatError' id='FormatError' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='FormatErrorDesc' href='#FormatErrorDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='FormatErrorDesc' id='FormatErrorDesc' export='no'>
      <type>
        <record/>
      </type>
    </type-decl>
    <procedure name='NewFormatError' id='NewFormatError' export='yes'>
      <formal-parameters>
        <parameter-decl name='msg' id='NewFormatError.msg' export='no' variable-parameter='no'>
          <type>
            <type-name name='STRING' href='#STRING'/>
          </type>
        </parameter-decl>
        <result-type>
          <type-name name='FormatError' href='#FormatError'/>
        </result-type>
      </formal-parameters>
    </procedure>
    <base-class module='IO' class='Error' href='#Error'>
      <inherited-method module='IO' name='INIT' class='Error' href='#ErrorDesc.INIT'/>
      <base-class module='Exception' class='Exception' href='Exception#Exception'>
        <inherited-method module='Exception' name='GetMessage' class='Exception' href='Exception#ExceptionDesc.GetMessage'/>
        <inherited-method module='Exception' name='Name' class='Exception' href='Exception#ExceptionDesc.Name'/>
        <inherited-method module='Exception' name='WriteBacktrace' class='Exception' href='Exception#ExceptionDesc.WriteBacktrace'/>
      </base-class>
    </base-class>
  </class>
  <class name='ProtocolError'>
    <type-decl name='ProtocolError' id='ProtocolError' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='ProtocolErrorDesc' href='#ProtocolErrorDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='ProtocolErrorDesc' id='ProtocolErrorDesc' export='no'>
      <type>
        <record/>
      </type>
    </type-decl>
    <base-class module='IO' class='Error' href='#Error'>
      <inherited-method module='IO' name='INIT' class='Error' href='#ErrorDesc.INIT'/>
      <base-class module='Exception' class='Exception' href='Exception#Exception'>
        <inherited-method module='Exception' name='GetMessage' class='Exception' href='Exception#ExceptionDesc.GetMessage'/>
        <inherited-method module='Exception' name='Name' class='Exception' href='Exception#ExceptionDesc.Name'/>
        <inherited-method module='Exception' name='WriteBacktrace' class='Exception' href='Exception#ExceptionDesc.WriteBacktrace'/>
      </base-class>
    </base-class>
  </class>
  <class name='ErrorResponse'>
    <type-decl name='ErrorResponse' id='ErrorResponse' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='ErrorResponseDesc' href='#ErrorResponseDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='ErrorResponseDesc' id='ErrorResponseDesc' export='yes'>
      <oberon-doc>
        <summary>Raised if the remote side of a conversation sends a reply with an error status code.</summary>
        <p pad-after='yes' no-indent='yes'>Raised if the remote side of a conversation sends a reply with an error status code.</p>
      </oberon-doc>
      <type>
        <record/>
      </type>
    </type-decl>
    <base-class module='IO' class='Error' href='#Error'>
      <inherited-method module='IO' name='INIT' class='Error' href='#ErrorDesc.INIT'/>
      <base-class module='Exception' class='Exception' href='Exception#Exception'>
        <inherited-method module='Exception' name='GetMessage' class='Exception' href='Exception#ExceptionDesc.GetMessage'/>
        <inherited-method module='Exception' name='Name' class='Exception' href='Exception#ExceptionDesc.Name'/>
        <inherited-method module='Exception' name='WriteBacktrace' class='Exception' href='Exception#ExceptionDesc.WriteBacktrace'/>
      </base-class>
    </base-class>
  </class>
  <module-ref name='Files'>
    <ref-target type='html' relative-uri='Files.html'/>
  </module-ref>
  <module-ref name='IO:FileChannel'>
    <ref-target type='html' relative-uri='IO/FileChannel.html'/>
  </module-ref>
  <module-ref name='C'>
    <ref-target type='html' relative-uri='C.html'/>
  </module-ref>
  <module-ref name='Exception'>
    <ref-target type='html' relative-uri='Exception.html'/>
  </module-ref>
  <module-ref name='Object'>
    <ref-target type='html' relative-uri='Object.html'/>
  </module-ref>
  <module-ref name='IO:BinaryRider'>
    <ref-target type='html' relative-uri='IO/BinaryRider.html'/>
  </module-ref>
  <module-ref name='IO:TextRider'>
    <ref-target type='html' relative-uri='IO/TextRider.html'/>
  </module-ref>
  <module-ref name='IO:SocketChannel'>
    <ref-target type='html' relative-uri='IO/SocketChannel.html'/>
  </module-ref>
  <module-ref name='Channel'>
    <ref-target type='html' relative-uri='Channel.html'/>
  </module-ref>
</interface-description>
