-class WXDLLEXPORT wxOutputStream {
- public:
- wxOutputStream();
- virtual ~wxOutputStream();
-
- virtual wxOutputStream& Write(const void *buffer, size_t size);
- wxOutputStream& Write(wxInputStream& stream_in);
-
- virtual off_t SeekO(off_t pos, wxSeekMode mode = wxFromStart);
- virtual off_t TellO() const;
-
- virtual bool Bad() const { return m_bad; }
- virtual size_t LastWrite() const { return m_lastwrite; }
- wxStreamBuffer *OutputStreamBuffer() { return m_o_streambuf; }
-
- virtual void Sync();
-
- wxOutputStream& operator<<(wxInputStream& out) { return Write(out); }
- wxOutputStream& operator<<(const char *string);
- wxOutputStream& operator<<(wxString& string);
- wxOutputStream& operator<<(char c);
- wxOutputStream& operator<<(short i);
- wxOutputStream& operator<<(int i);
- wxOutputStream& operator<<(long i);
- wxOutputStream& operator<<(double f);
-#if USE_SERIAL
- wxOutputStream& operator<<(wxObject& obj);
-#endif
-
- wxOutputStream& operator<<(float f) { return operator<<((double)f); }
- wxOutputStream& operator<<(unsigned char c) { return operator<<((char)c); }
- wxOutputStream& operator<<(unsigned short i) { return operator<<((short)i); }
- wxOutputStream& operator<<(unsigned int i) { return operator<<((int)i); }
- wxOutputStream& operator<<(unsigned long i) { return operator<<((long)i); }
- wxOutputStream& operator<<( __wxOutputManip func) { return func(*this); }
-
- protected:
- friend class wxStreamBuffer;
- friend class wxFilterOutputStream;
-
- wxOutputStream(wxStreamBuffer *buffer);
-
- virtual size_t DoWrite( const void *WXUNUSED(buffer), size_t WXUNUSED(size) )
- { return 0; }
- virtual off_t DoSeekOutput( off_t WXUNUSED(pos), wxSeekMode WXUNUSED(mode) )
- { return wxInvalidOffset; }
- virtual off_t DoTellOutput() const
- { return wxInvalidOffset; }
-
- protected:
- bool m_bad, m_o_destroybuf;
- size_t m_lastwrite;
- wxStreamBuffer *m_o_streambuf;
+// ----------------------------------------------------------------------------
+// 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)
+};
+
+// ----------------------------------------------------------------------------
+// wxOutputStream: base for the output streams
+// ----------------------------------------------------------------------------
+
+class WXDLLIMPEXP_BASE wxOutputStream : public wxStreamBase
+{
+public:
+ wxOutputStream();
+ virtual ~wxOutputStream();
+
+ void PutC(char c);
+ virtual wxOutputStream& Write(const void *buffer, size_t size);
+ wxOutputStream& Write(wxInputStream& stream_in);
+
+ virtual wxFileOffset SeekO(wxFileOffset pos, wxSeekMode mode = wxFromStart);
+ virtual wxFileOffset TellO() const;
+
+ virtual size_t LastWrite() const { return wxStreamBase::m_lastcount; }
+
+ virtual void Sync();
+ virtual bool Close() { return true; }
+
+ wxOutputStream& operator<<(wxInputStream& out) { return Write(out); }
+ wxOutputStream& operator<<( __wxOutputManip func) { return func(*this); }
+
+protected:
+ // to be implemented in the derived classes (it should have been pure
+ // virtual)
+ virtual size_t OnSysWrite(const void *buffer, size_t bufsize);
+
+ friend class wxStreamBuffer;
+
+ DECLARE_NO_COPY_CLASS(wxOutputStream)