module Fox
  #
  # A stream is a way to serialize data and objects into a byte stream.
  # Each item of data that is saved or loaded from the stream may be byte-swapped,
  # thus allowing little-endian machines to read data produced on big endian ones
  # and vice-versa.
  # Data is serialized exactly as-is.  There are no tags or other markers
  # inserted into the stream; thus, the stream may be used to save or load arbitrary
  # binary data.
  # Objects derived from FXObjects may be serialized also; whenever a reference to an
  # object is serialized, a table is consulted to determine if the same object has
  # been encountered previously; if not, the object is added to the table and then
  # its contents are serialized.  If the object has been encountered before, only a
  # reference to the object is serialized.
  # When loading back a serialized object, new instances are constructed using
  # the default constructor, and subsequently the object's contents are loaded.
  # A special container object may be passed in which is placed in the table
  # as if it had been encountered before; this will cause only references to this
  # object to be saved.  The container object is typically the top-level document
  # object which manages all objects contained by it.  Additional objects may be
  # added using addObject(); these will not be actually saved or loaded.
  #
  # === Stream status codes
  #
  # +FXStreamOK+::		OK
  # +FXStreamEnd+::		Try read past end of stream
  # +FXStreamFull+::		Filled up stream buffer or disk full
  # +FXStreamNoWrite+::		Unable to open for write
  # +FXStreamNoRead+::		Unable to open for read
  # +FXStreamFormat+::		Stream format error
  # +FXStreamUnknown+::		Trying to read unknown class
  # +FXStreamAlloc+::		Alloc failed
  # +FXStreamFailure+::		General failure
  #
  # === Stream data flow direction
  #
  # +FXStreamDead+::		Unopened stream
  # +FXStreamSave+::		Saving stuff to stream
  # +FXStreamLoad+::		Loading stuff from stream
  #
  # === Stream seeking
  #
  # +FXFromStart+::		Seek from start position
  # +FXFromCurrent+::		Seek from current position
  # +FXFromEnd+::		Seek from end position
  #
  class FXStream

    # Stream status [Integer]
    attr_reader :status

    # Stream direction, one of +FXStreamSave+, +FXStreamLoad+ or +FXStreamDead+.
    attr_reader :direction
  
    # Parent object [FXObject]
    attr_reader :container

    # Available buffer space
    attr_accessor :space

    # Stream position (an offset from the beginning of the stream) [Integer]
    attr_accessor :position
  
    #
    # Construct stream with given container object.  The container object
    # is an object that will itself not be saved to or loaded from the stream,
    # but which may be referenced by other objects.  These references will be
    # properly saved and restored.
    #
    # ==== Parameters:
    #
    # +cont+::	the container object, or +nil+ if there is none [FXObject].
    #
    def initialize(cont=nil) # :yields: theStream
    end
  
    #
    # Open stream for reading or for writing.
    # An initial buffer size may be given, which must be at least 16 bytes.
    # If _data_ is not +nil+, it is expected to point to an external data buffer
    # of length _size_; otherwise the stream will use an internally managed buffer.
    # Returns +true+ on success, +false+ otherwise.
    #
    # ==== Parameters:
    #
    # +save_or_load+::	access mode, either +FXStreamSave+ or +FXStreamLoad+ [Integer]
    # +size+::		initial buffer size [Integer]
    # +data+::		external data buffer (if any) [String]
    #
    def open(save_or_load, data=nil, size=8192, owned=false); end
  
    #
    # Close stream; returns +true+ if OK.
    #
    def close(); end
  
    #
    # Flush buffer
    #
    def flush(); end

    #
    # Get available buffer space
    #
    def getSpace(); end
  
    #
    # Set available buffer space
    #
    def setSpace(sp); end

    #
    # Return +true+ if at end of file or error.
    #
    def eof?; end

    #
    # Set status code, where _err_ is one of the stream status
    # codes listed above.
    #
    def error=(err); end

    # Set the byte-swapped flag to +true+ or +false+.
    def bytesSwapped=(swapBytes); end
    
    # Returns +true+ if bytes are swapped for this stream
    def bytesSwapped?; end
  
    #
    # Set stream to big endian mode if +true+. Byte swapping will
    # be enabled if the machine native byte order is not equal to
    # the desired byte order.
    #
    def bigEndian=(big); end

    #
    # Return +true+ if big endian mode.
    #
    def bigEndian?; end
  end
end

