
#ifndef VXSTREAM_H
#define VXSTREAM_H
/****************************************************************************
Summary: Base class for file IO.
Remarks:
The VxFile and VxSubFile both derives from this base class.
It defines the base method to read/write data to a stream
*****************************************************************************/
class VX_EXPORT VxStream
{
public:
	/***********************************************************************
	Summary: Starting position and direction of a seek.
	See Also:VxStream::Seek
	***********************************************************************/
	enum SeekMode {
		START,		// From start of stream
		END,		// From end of strem
		CURRENT     // From current cursor position (See VxStream::Position())
	};

	/***********************************************************************
	Summary: Returns the current cursor position.
	***********************************************************************/
	virtual XDWORD Position() = 0;

	/***********************************************************************
	Summary: Returns the stream size in bytes.
	***********************************************************************/
	virtual XDWORD Size() = 0;

	/***********************************************************************
	Summary: Returns TRUE if the stream is still valid.
	***********************************************************************/
	virtual XBOOL IsValid() = 0;

	/***********************************************************************
	Summary: Seeks to a given position into the stream, starting from a given
	origin mode.
	***********************************************************************/
	virtual XBOOL Seek(int iOffset, SeekMode iOrigin) = 0;

	/***********************************************************************
	Summary: Reads given amount of data from the stream to the buffer.
	Return Value: The number of bytes actually read
	***********************************************************************/
	virtual XDWORD Read(void* oBuffer, XDWORD iSize) = 0;

	/***********************************************************************
	Summary: Writes given amount of data from the buffer to the stream.
	Return Value: The number of bytes actually written
	***********************************************************************/
	virtual XDWORD Write(const void* iBuffer, XDWORD iSize) = 0;

	/***********************************************************************
	Summary: Copy given amount of data from the source stream to the stream.
	A size of 0 means copy the whole stream.
	Return Value: The number of bytes actually written
	***********************************************************************/
	virtual XDWORD Copy(VxStream& iStream, XDWORD iSize = 0);
};


#endif