- 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;
+ // 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 off_t SeekI(off_t pos, wxSeekMode mode = wxFromStart);
+
+ // return the current position of the stream pointer or wxInvalidOffset
+ virtual off_t 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 occured
+ // (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;
+};
+
+// ----------------------------------------------------------------------------
+// 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 off_t SeekO(off_t pos, wxSeekMode mode = wxFromStart);
+ virtual off_t TellO() const;
+
+ virtual size_t LastWrite() const { return wxStreamBase::m_lastcount; }
+
+ virtual void Sync();
+
+ 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;