<?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='ADT:Storable' id=''>
  <oberon-doc>
    <summary>The module defines new binary rider classes, which are extensions of the ones defined in module <oberon-module href='IO:BinaryRider#'>BinaryRider</oberon-module>.</summary>
    <p pad-after='yes' no-indent='yes'>The module defines new binary rider classes, which are extensions of the ones defined in module <oberon-module href='IO:BinaryRider#'>BinaryRider</oberon-module>.  Concrete implementations of these abstract classes (like module <oberon-module href='ADT:Object:Storage#'>ADT:Object:Storage</oberon-module>) provide the mechanisms necessary to externalize and internalize arbitrary data structures.  The riders add some type-bound procedures to the interfaces inherited from <oberon-module href='IO:BinaryRider#'>BinaryRider</oberon-module>, and rely on the type-bound procedures <oberon-proc href='#ObjectDesc.Store'>Object.Store</oberon-proc> and <oberon-proc href='#ObjectDesc.Load'>Object.Load</oberon-proc> to store and load an object's private data.</p>
  </oberon-doc>
  <import-decl name='Obj' id='Obj' export='no' module='Object'/>
  <import-decl name='IO' id='IO' export='no' module='IO'/>
  <import-decl name='BinaryRider' id='BinaryRider' export='no' module='IO:BinaryRider'/>
  <procedure name='RaiseTypeError' id='RaiseTypeError' export='yes'>
    <formal-parameters>
      <parameter-decl name='msg' id='RaiseTypeError.msg' export='no' variable-parameter='no'>
        <type>
          <type-name name='STRING' href='#STRING'/>
        </type>
      </parameter-decl>
      <exceptions>
        <type-name name='TypeError' href='#TypeError'/>
      </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='Object'>
    <type-decl name='Object' id='Object' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='ObjectDesc' href='#ObjectDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='ObjectDesc' id='ObjectDesc' export='yes'>
      <oberon-doc>
        <summary>This class defines a protocol for object persistence using with <oberon-proc href='#ObjectDesc.Store'>Object.Store</oberon-proc> and <oberon-proc href='#ObjectDesc.Load'>Object.Load</oberon-proc>).</summary>
        <p pad-after='yes' no-indent='yes'>This class defines a protocol for object persistence using with <oberon-proc href='#ObjectDesc.Store'>Object.Store</oberon-proc> and <oberon-proc href='#ObjectDesc.Load'>Object.Load</oberon-proc>).</p>
      </oberon-doc>
      <type>
        <record/>
      </type>
    </type-decl>
    <procedure name='Store' id='ObjectDesc.Store' export='yes'>
      <oberon-doc>
        <summary>Stores data of <oberon-param href='#ObjectDesc.Store.obj'>obj</oberon-param> to <oberon-param href='#ObjectDesc.Store.w'>w</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Stores data of <oberon-param href='#ObjectDesc.Store.obj'>obj</oberon-param> to <oberon-param href='#ObjectDesc.Store.w'>w</oberon-param>.  Nested record pointers are stored by calling the type-bound procedure <oberon-proc href='#WriterDesc.WriteObject'>Writer.WriteObject</oberon-proc>.  The procedure is not allowed to make any changes to the global state of the program, except for calling the <samp>Write</samp> methods of the writer <oberon-param href='#ObjectDesc.Store.w'>w</oberon-param>.  Any redefinition of this procedure must include a super call, preferably as the first statement of the procedure body.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'>This procedure is either activated by a super call, or from the procedure <oberon-proc href='#WriterDesc.WriteObject'>Writer.WriteObject</oberon-proc>.</p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='obj' id='ObjectDesc.Store.obj' export='no' variable-parameter='no'>
          <type>
            <type-name name='Object' href='#Object'/>
          </type>
        </receiver-decl>
        <parameter-decl name='w' id='ObjectDesc.Store.w' export='no' variable-parameter='no'>
          <type>
            <type-name name='Writer' href='#Writer'/>
          </type>
        </parameter-decl>
        <exceptions>
          <type-name module='IO' name='Error' href='IO#Error'/>
        </exceptions>
      </formal-parameters>
    </procedure>
    <procedure name='Load' id='ObjectDesc.Load' export='yes'>
      <oberon-doc>
        <summary>Loads data of <oberon-param href='#ObjectDesc.Load.obj'>obj</oberon-param> from <oberon-param href='#ObjectDesc.Load.r'>r</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Loads data of <oberon-param href='#ObjectDesc.Load.obj'>obj</oberon-param> from <oberon-param href='#ObjectDesc.Load.r'>r</oberon-param>.  Nested record pointers are loaded by calling the type-bound procecdure <oberon-proc href='#ReaderDesc.ReadObject'>Reader.ReadObject</oberon-proc>.  This procedure must be symmetric to <oberon-proc href='#ObjectDesc.Store'>Object.Store</oberon-proc>, or data internalization will break, causing undefined object state or program termination.</p>
        <p pad-after='yes' no-indent='no'>Note: When internalizing a file with alien objects, it is possible that the type-bound procedure <oberon-proc href='#ObjectDesc.Load'>Object.Load</oberon-proc> is invoked more than once for a single object.  Except for the results of the last call, all duplicates are discarded.  Because of this, all changes by this procedure to any program state that is not part of the object <oberon-param href='#ObjectDesc.Load.obj'>obj</oberon-param> are deprecated.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'>This procedure is either activated by a super call, or from the procedure <oberon-proc href='#ReaderDesc.ReadObject'>Reader.ReadObject</oberon-proc>.</p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='obj' id='ObjectDesc.Load.obj' export='no' variable-parameter='no'>
          <type>
            <type-name name='Object' href='#Object'/>
          </type>
        </receiver-decl>
        <parameter-decl name='r' id='ObjectDesc.Load.r' export='no' variable-parameter='no'>
          <type>
            <type-name name='Reader' href='#Reader'/>
          </type>
        </parameter-decl>
        <exceptions>
          <type-name module='IO' name='Error' href='IO#Error'/>
        </exceptions>
      </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='Reader'>
    <type-decl name='Reader' id='Reader' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='ReaderDesc' href='#ReaderDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='ReaderDesc' id='ReaderDesc' export='yes'>
      <oberon-doc>
        <summary><oberon-type href='#Reader'>Reader</oberon-type> defines the infrastructure for reading of serialized object data.</summary>
        <p pad-after='yes' no-indent='yes'><oberon-type href='#Reader'>Reader</oberon-type> defines the infrastructure for reading of serialized object data.  Its primary task is to add the method <oberon-proc href='#ReaderDesc.ReadObject'>Reader.ReadObject</oberon-proc> to the class <oberon-type href='IO:BinaryRider#Reader'>BinaryRider.Reader</oberon-type>.  Together with <oberon-proc href='#ObjectDesc.Load'>Object.Load</oberon-proc> it handles conversion of byte sequences back into living objects.</p>
        <p pad-after='yes' no-indent='no'>This is an abstract class.  For a concrete implementation, see <oberon-type href='ADT:Object:Storage#Reader'>ADT:Object:Storage.Reader</oberon-type>.</p>
      </oberon-doc>
      <type>
        <record/>
      </type>
    </type-decl>
    <procedure name='InitReader' id='InitReader' export='yes'>
      <oberon-doc>
        <summary>Initializes a new reader instance <oberon-param href='#InitReader.r'>r</oberon-param> for channel <oberon-param href='#InitReader.ch'>ch</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Initializes a new reader instance <oberon-param href='#InitReader.r'>r</oberon-param> for channel <oberon-param href='#InitReader.ch'>ch</oberon-param>.  Little endian byte ordering is used by the reader.</p>
      </oberon-doc>
      <formal-parameters>
        <parameter-decl name='r' id='InitReader.r' export='no' variable-parameter='no'>
          <type>
            <type-name name='Reader' href='#Reader'/>
          </type>
        </parameter-decl>
        <parameter-decl name='ch' id='InitReader.ch' export='no' variable-parameter='no'>
          <type>
            <type-name module='IO' name='ByteChannel' href='IO#ByteChannel'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='ReadObject' id='ReaderDesc.ReadObject' export='yes'>
      <oberon-doc>
        <summary>Reads an object reference from the channel underlying the reader <oberon-param href='#ReaderDesc.ReadObject.r'>r</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Reads an object reference from the channel underlying the reader <oberon-param href='#ReaderDesc.ReadObject.r'>r</oberon-param>.  The object <oberon-param href='#ReaderDesc.ReadObject.obj'>obj</oberon-param> itself is required to provide the necessary type-bound procedure <oberon-proc href='#ObjectDesc.Load'>Object.Load</oberon-proc> to restore its own data from <oberon-param href='#ReaderDesc.ReadObject.r'>r</oberon-param>.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='r' id='ReaderDesc.ReadObject.r' export='no' variable-parameter='no'>
          <type>
            <type-name name='Reader' href='#Reader'/>
          </type>
        </receiver-decl>
        <parameter-decl name='obj' id='ReaderDesc.ReadObject.obj' export='no' variable-parameter='yes'>
          <type>
            <type-name module='Obj' name='Object' href='Object#Object'/>
          </type>
        </parameter-decl>
        <exceptions>
          <type-name module='IO' name='Error' href='IO#Error'/>
        </exceptions>
      </formal-parameters>
    </procedure>
    <procedure name='Disconnect' id='ReaderDesc.Disconnect' export='yes'>
      <oberon-doc>
        <summary>Disconnects reader <oberon-param href='#ReaderDesc.Disconnect.r'>r</oberon-param>, and cleans up the internal data structures.</summary>
        <p pad-after='yes' no-indent='yes'>Disconnects reader <oberon-param href='#ReaderDesc.Disconnect.r'>r</oberon-param>, and cleans up the internal data structures.  Any resources allocated by the reader are freed.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='r' id='ReaderDesc.Disconnect.r' export='no' variable-parameter='no'>
          <type>
            <type-name name='Reader' href='#Reader'/>
          </type>
        </receiver-decl>
      </formal-parameters>
    </procedure>
    <base-class module='IO:BinaryRider' class='Reader' href='IO:BinaryRider#Reader'>
      <inherited-method module='IO:BinaryRider' name='ReadBool' class='Reader' href='IO:BinaryRider#ReaderDesc.ReadBool'/>
      <inherited-method module='IO:BinaryRider' name='ReadBytes' class='Reader' href='IO:BinaryRider#ReaderDesc.ReadBytes'/>
      <inherited-method module='IO:BinaryRider' name='ReadChar' class='Reader' href='IO:BinaryRider#ReaderDesc.ReadChar'/>
      <inherited-method module='IO:BinaryRider' name='ReadInt' class='Reader' href='IO:BinaryRider#ReaderDesc.ReadInt'/>
      <inherited-method module='IO:BinaryRider' name='ReadLChar' class='Reader' href='IO:BinaryRider#ReaderDesc.ReadLChar'/>
      <inherited-method module='IO:BinaryRider' name='ReadLInt' class='Reader' href='IO:BinaryRider#ReaderDesc.ReadLInt'/>
      <inherited-method module='IO:BinaryRider' name='ReadLReal' class='Reader' href='IO:BinaryRider#ReaderDesc.ReadLReal'/>
      <inherited-method module='IO:BinaryRider' name='ReadLString' class='Reader' href='IO:BinaryRider#ReaderDesc.ReadLString'/>
      <inherited-method module='IO:BinaryRider' name='ReadNum' class='Reader' href='IO:BinaryRider#ReaderDesc.ReadNum'/>
      <inherited-method module='IO:BinaryRider' name='ReadReal' class='Reader' href='IO:BinaryRider#ReaderDesc.ReadReal'/>
      <inherited-method module='IO:BinaryRider' name='ReadSInt' class='Reader' href='IO:BinaryRider#ReaderDesc.ReadSInt'/>
      <inherited-method module='IO:BinaryRider' name='ReadSet' class='Reader' href='IO:BinaryRider#ReaderDesc.ReadSet'/>
      <inherited-method module='IO:BinaryRider' name='ReadStr' class='Reader' href='IO:BinaryRider#ReaderDesc.ReadStr'/>
      <inherited-method module='IO:BinaryRider' name='ReadString' class='Reader' href='IO:BinaryRider#ReaderDesc.ReadString'/>
      <inherited-method module='IO:BinaryRider' name='SetByteOrder' class='Reader' href='IO:BinaryRider#ReaderDesc.SetByteOrder'/>
      <inherited-method module='IO:BinaryRider' name='SetPos' class='Reader' href='IO:BinaryRider#ReaderDesc.SetPos'/>
      <inherited-field module='IO:BinaryRider' name='byteOrder' class='Reader' href='IO:BinaryRider#ReaderDesc.byteOrder'/>
      <inherited-field module='IO:BinaryRider' name='channel' class='Reader' href='IO:BinaryRider#ReaderDesc.channel'/>
    </base-class>
  </class>
  <class name='Writer'>
    <type-decl name='Writer' id='Writer' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='WriterDesc' href='#WriterDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='WriterDesc' id='WriterDesc' export='yes'>
      <oberon-doc>
        <summary><oberon-type href='#Reader'>Reader</oberon-type> defines writing of serialized object data.</summary>
        <p pad-after='yes' no-indent='yes'><oberon-type href='#Reader'>Reader</oberon-type> defines writing of serialized object data.  It defines <oberon-proc href='#ReaderDesc.ReadObject'>Reader.ReadObject</oberon-proc>, which together with <oberon-proc href='#ObjectDesc.Store'>Object.Store</oberon-proc> handles serialization of objects into byte streams.</p>
        <p pad-after='yes' no-indent='no'>This is an abstract class.  For a concrete implementation, see <oberon-type href='ADT:Object:Storage#Writer'>ADT:Object:Storage.Writer</oberon-type>.</p>
      </oberon-doc>
      <type>
        <record/>
      </type>
    </type-decl>
    <procedure name='InitWriter' id='InitWriter' export='yes'>
      <oberon-doc>
        <summary>Initializes a new writer instance <oberon-param href='#InitWriter.w'>w</oberon-param> for channel <oberon-param href='#InitWriter.ch'>ch</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Initializes a new writer instance <oberon-param href='#InitWriter.w'>w</oberon-param> for channel <oberon-param href='#InitWriter.ch'>ch</oberon-param>.  Little endian byte ordering is used by the writer.</p>
      </oberon-doc>
      <formal-parameters>
        <parameter-decl name='w' id='InitWriter.w' export='no' variable-parameter='no'>
          <type>
            <type-name name='Writer' href='#Writer'/>
          </type>
        </parameter-decl>
        <parameter-decl name='ch' id='InitWriter.ch' export='no' variable-parameter='no'>
          <type>
            <type-name module='IO' name='ByteChannel' href='IO#ByteChannel'/>
          </type>
        </parameter-decl>
      </formal-parameters>
    </procedure>
    <procedure name='WriteObject' id='WriterDesc.WriteObject' export='yes'>
      <oberon-doc>
        <summary>Writes object to the channel underlying the writer <oberon-param href='#WriterDesc.WriteObject.w'>w</oberon-param>.</summary>
        <p pad-after='yes' no-indent='yes'>Writes object to the channel underlying the writer <oberon-param href='#WriterDesc.WriteObject.w'>w</oberon-param>.  The externalization framework is provided by the concrete instance of writer <oberon-param href='#WriterDesc.WriteObject.w'>w</oberon-param>.  The object itself is required to provide the necessary type-bound procedure <oberon-proc href='#ObjectDesc.Store'>Object.Store</oberon-proc> to pass its own data to <oberon-param href='#WriterDesc.WriteObject.w'>w</oberon-param>.</p>
        <pre-cond pad-after='yes'>
          <p pad-after='no' no-indent='yes'><oberon-param href='#WriterDesc.WriteObject.obj'>obj</oberon-param> is <code>NIL</code>, or it is an instance of <oberon-type href='#Object'>Object</oberon-type>.</p>
        </pre-cond>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='w' id='WriterDesc.WriteObject.w' export='no' variable-parameter='no'>
          <type>
            <type-name name='Writer' href='#Writer'/>
          </type>
        </receiver-decl>
        <parameter-decl name='obj' id='WriterDesc.WriteObject.obj' export='no' variable-parameter='no'>
          <type>
            <type-name module='Obj' name='Object' href='Object#Object'/>
          </type>
        </parameter-decl>
        <exceptions>
          <type-name module='IO' name='Error' href='IO#Error'/>
        </exceptions>
      </formal-parameters>
    </procedure>
    <procedure name='Disconnect' id='WriterDesc.Disconnect' export='yes'>
      <oberon-doc>
        <summary>Completes the data written to the channel of writer <oberon-param href='#WriterDesc.Disconnect.w'>w</oberon-param>, and cleans up the internal data structures.</summary>
        <p pad-after='yes' no-indent='yes'>Completes the data written to the channel of writer <oberon-param href='#WriterDesc.Disconnect.w'>w</oberon-param>, and cleans up the internal data structures.  Without calling <oberon-proc href='#WriterDesc.Disconnect'>Writer.Disconnect</oberon-proc> the externalized objects may be left in a invalid state, and no new externalization process can be started.  After <oberon-proc href='#WriterDesc.Disconnect'>Writer.Disconnect</oberon-proc>, all operations on <oberon-param href='#WriterDesc.Disconnect.w'>w</oberon-param> are undefined.</p>
      </oberon-doc>
      <formal-parameters>
        <receiver-decl name='w' id='WriterDesc.Disconnect.w' export='no' variable-parameter='no'>
          <type>
            <type-name name='Writer' href='#Writer'/>
          </type>
        </receiver-decl>
      </formal-parameters>
    </procedure>
    <base-class module='IO:BinaryRider' class='Writer' href='IO:BinaryRider#Writer'>
      <inherited-method module='IO:BinaryRider' name='SetByteOrder' class='Writer' href='IO:BinaryRider#WriterDesc.SetByteOrder'/>
      <inherited-method module='IO:BinaryRider' name='SetPos' class='Writer' href='IO:BinaryRider#WriterDesc.SetPos'/>
      <inherited-method module='IO:BinaryRider' name='WriteBool' class='Writer' href='IO:BinaryRider#WriterDesc.WriteBool'/>
      <inherited-method module='IO:BinaryRider' name='WriteBytes' class='Writer' href='IO:BinaryRider#WriterDesc.WriteBytes'/>
      <inherited-method module='IO:BinaryRider' name='WriteChar' class='Writer' href='IO:BinaryRider#WriterDesc.WriteChar'/>
      <inherited-method module='IO:BinaryRider' name='WriteInt' class='Writer' href='IO:BinaryRider#WriterDesc.WriteInt'/>
      <inherited-method module='IO:BinaryRider' name='WriteLChar' class='Writer' href='IO:BinaryRider#WriterDesc.WriteLChar'/>
      <inherited-method module='IO:BinaryRider' name='WriteLInt' class='Writer' href='IO:BinaryRider#WriterDesc.WriteLInt'/>
      <inherited-method module='IO:BinaryRider' name='WriteLReal' class='Writer' href='IO:BinaryRider#WriterDesc.WriteLReal'/>
      <inherited-method module='IO:BinaryRider' name='WriteLString' class='Writer' href='IO:BinaryRider#WriterDesc.WriteLString'/>
      <inherited-method module='IO:BinaryRider' name='WriteNum' class='Writer' href='IO:BinaryRider#WriterDesc.WriteNum'/>
      <inherited-method module='IO:BinaryRider' name='WriteReal' class='Writer' href='IO:BinaryRider#WriterDesc.WriteReal'/>
      <inherited-method module='IO:BinaryRider' name='WriteSInt' class='Writer' href='IO:BinaryRider#WriterDesc.WriteSInt'/>
      <inherited-method module='IO:BinaryRider' name='WriteSet' class='Writer' href='IO:BinaryRider#WriterDesc.WriteSet'/>
      <inherited-method module='IO:BinaryRider' name='WriteStr' class='Writer' href='IO:BinaryRider#WriterDesc.WriteStr'/>
      <inherited-method module='IO:BinaryRider' name='WriteString' class='Writer' href='IO:BinaryRider#WriterDesc.WriteString'/>
      <inherited-field module='IO:BinaryRider' name='byteOrder' class='Writer' href='IO:BinaryRider#WriterDesc.byteOrder'/>
      <inherited-field module='IO:BinaryRider' name='channel' class='Writer' href='IO:BinaryRider#WriterDesc.channel'/>
    </base-class>
  </class>
  <class name='TypeError'>
    <type-decl name='TypeError' id='TypeError' export='yes'>
      <type>
        <pointer>
          <pointer-base>
            <type-name name='TypeErrorDesc' href='#TypeErrorDesc'/>
          </pointer-base>
        </pointer>
      </type>
    </type-decl>
    <type-decl name='TypeErrorDesc' id='TypeErrorDesc' export='no'>
      <type>
        <record/>
      </type>
    </type-decl>
    <base-class module='IO' class='Error' href='IO#Error'>
      <inherited-method module='IO' name='INIT' class='Error' href='IO#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='IO:BinaryRider'>
    <ref-target type='html' relative-uri='../IO/BinaryRider.html'/>
  </module-ref>
  <module-ref name='ADT:Object:Storage'>
    <ref-target type='html' relative-uri='Object/Storage.html'/>
  </module-ref>
  <module-ref name='Object'>
    <ref-target type='html' relative-uri='../Object.html'/>
  </module-ref>
  <module-ref name='Exception'>
    <ref-target type='html' relative-uri='../Exception.html'/>
  </module-ref>
  <module-ref name='IO'>
    <ref-target type='html' relative-uri='../IO.html'/>
  </module-ref>
</interface-description>
