-wxOutputStream& WXDLLEXPORT wxEndL(wxOutputStream& o_stream);
-
-class WXDLLEXPORT wxStreamBuffer {
- public:
- wxStreamBuffer(wxInputStream& stream);
- wxStreamBuffer(wxOutputStream& stream);
- ~wxStreamBuffer();
-
- void Read(void *buffer, size_t size);
- void Write(const void *buffer, size_t size);
- void WriteBack(char c);
-
- void SetBufferIO(char *buffer_start, char *buffer_end);
- void SetBufferIO(size_t bufsize);
- void ResetBuffer();
-
- void SetBufferPosition(char *buffer_position)
- { m_buffer_pos = buffer_position; }
- void SetIntPosition(size_t pos)
- { m_buffer_pos = m_buffer_start + pos; }
- char *GetBufferPosition() const { return m_buffer_pos; }
- size_t GetIntPosition() const { return m_buffer_pos - m_buffer_start; }
-
- char *GetBufferStart() const { return m_buffer_start; }
- char *GetBufferEnd() const { return m_buffer_end; }
- size_t GetBufferSize() const { return m_buffer_size; }
- size_t GetLastAccess() const { return m_buffer_end - m_buffer_start; }
-
- protected:
- char *m_buffer_start, *m_buffer_end, *m_buffer_pos;
- size_t m_buffer_size;
-
- wxInputStream *m_istream;
- wxOutputStream *m_ostream;
+WXDLLIMPEXP_BASE wxOutputStream& wxEndL(wxOutputStream& o_stream);
+
+// ----------------------------------------------------------------------------
+// constants
+// ----------------------------------------------------------------------------
+
+enum wxStreamError
+{
+ wxSTREAM_NO_ERROR = 0, // stream is in good state
+ wxSTREAM_EOF, // EOF reached in Read() or similar
+ wxSTREAM_WRITE_ERROR, // generic write error
+ wxSTREAM_READ_ERROR // generic read error
+};
+
+// ============================================================================
+// base stream classes: wxInputStream and wxOutputStream
+// ============================================================================
+
+// ---------------------------------------------------------------------------
+// wxStreamBase: common (but non virtual!) base for all stream classes
+// ---------------------------------------------------------------------------
+
+class WXDLLIMPEXP_BASE wxStreamBase
+{
+public:
+ wxStreamBase();
+ virtual ~wxStreamBase();
+
+ // error testing
+ wxStreamError GetLastError() const { return m_lasterror; }
+ bool IsOk() const { return GetLastError() == wxSTREAM_NO_ERROR; }
+ bool operator!() const { return !IsOk(); }
+
+ // reset the stream state
+ void Reset() { m_lasterror = wxSTREAM_NO_ERROR; }
+
+ // this doesn't make sense for all streams, always test its return value
+ virtual size_t GetSize() const;
+ virtual wxFileOffset GetLength() const { return wxInvalidOffset; }
+
+ // returns true if the streams supports seeking to arbitrary offsets
+ virtual bool IsSeekable() const { return false; }
+
+protected:
+ virtual wxFileOffset OnSysSeek(wxFileOffset seek, wxSeekMode mode);
+ virtual wxFileOffset OnSysTell() const;
+
+ size_t m_lastcount;
+ wxStreamError m_lasterror;
+
+ friend class wxStreamBuffer;
+
+ DECLARE_NO_COPY_CLASS(wxStreamBase)
+};
+
+// ----------------------------------------------------------------------------
+// wxInputStream: base class for the input streams
+// ----------------------------------------------------------------------------
+
+class WXDLLIMPEXP_BASE wxInputStream : public wxStreamBase
+{
+public:
+ // ctor and dtor, nothing exciting
+ wxInputStream();
+ virtual ~wxInputStream();
+
+
+ // IO functions
+ // ------------
+
+ // return a character from the stream without removing it, i.e. it will
+ // still be returned by the next call to GetC()
+ //
+ // blocks until something appears in the stream if necessary, if nothing
+ // ever does (i.e. EOF) LastRead() will return 0 (and the return value is
+ // undefined), otherwise 1
+ virtual char Peek();
+
+ // return one character from the stream, blocking until it appears if
+ // necessary
+ //
+ // if EOF, return value is undefined and LastRead() will return 0 and not 1
+ char GetC();
+
+ // read at most the given number of bytes from the stream
+ //
+ // there are 2 possible situations here: either there is nothing at all in
+ // the stream right now in which case Read() blocks until something appears
+ // (use CanRead() to avoid this) or there is already some data available in
+ // the stream and then Read() doesn't block but returns just the data it
+ // can read without waiting for more
+ //
+ // in any case, if there are not enough bytes in the stream right now,
+ // LastRead() value will be less than size but greater than 0. If it is 0,
+ // it means that EOF has been reached.
+ virtual wxInputStream& Read(void *buffer, size_t size);
+
+ // copy the entire contents of this stream into streamOut, stopping only
+ // when EOF is reached or an error occurs
+ wxInputStream& Read(wxOutputStream& streamOut);
+
+
+ // status functions
+ // ----------------
+
+ // returns the number of bytes read by the last call to Read(), GetC() or
+ // Peek()
+ //
+ // this should be used to discover whether that call succeeded in reading
+ // all the requested data or not
+ virtual size_t LastRead() const { return wxStreamBase::m_lastcount; }
+
+ // returns true if some data is available in the stream right now, so that
+ // calling Read() wouldn't block
+ virtual bool CanRead() const;
+
+ // is the stream at EOF?
+ //
+ // note that this cannot be really implemented for all streams and
+ // CanRead() is more reliable than Eof()
+ virtual bool Eof() const;
+
+
+ // write back buffer
+ // -----------------
+
+ // put back the specified number of bytes into the stream, they will be
+ // fetched by the next call to the read functions
+ //
+ // returns the number of bytes really stuffed back
+ size_t Ungetch(const void *buffer, size_t size);
+
+ // put back the specified character in the stream
+ //
+ // returns true if ok, false on error
+ bool Ungetch(char c);
+
+
+ // position functions
+ // ------------------
+
+ // move the stream pointer to the given position (if the stream supports
+ // it)
+ //
+ // returns wxInvalidOffset on error
+ virtual wxFileOffset SeekI(wxFileOffset pos, wxSeekMode mode = wxFromStart);
+
+ // return the current position of the stream pointer or wxInvalidOffset
+ virtual wxFileOffset TellI() const;
+
+
+ // stream-like operators
+ // ---------------------
+
+ wxInputStream& operator>>(wxOutputStream& out) { return Read(out); }
+ wxInputStream& operator>>(__wxInputManip func) { return func(*this); }
+
+protected:
+ // do read up to size bytes of data into the provided buffer
+ //
+ // this method should return 0 if EOF has been reached or an error occurred
+ // (m_lasterror should be set accordingly as well) or the number of bytes
+ // read
+ virtual size_t OnSysRead(void *buffer, size_t size) = 0;
+
+ // write-back buffer support
+ // -------------------------
+
+ // return the pointer to a buffer big enough to hold sizeNeeded bytes
+ char *AllocSpaceWBack(size_t sizeNeeded);
+
+ // read up to size data from the write back buffer, return the number of
+ // bytes read
+ size_t GetWBack(void *buf, size_t size);
+
+ // write back buffer or NULL if none
+ char *m_wback;
+
+ // the size of the buffer
+ size_t m_wbacksize;
+
+ // the current position in the buffer
+ size_t m_wbackcur;
+
+ friend class wxStreamBuffer;
+
+ DECLARE_NO_COPY_CLASS(wxInputStream)