X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/49e399d8c0f2683a885bfec77e43cfde3b2249f4..2b96d0fb4be7d684c17987d74f8f92d0cfe345b5:/include/wx/stream.h diff --git a/include/wx/stream.h b/include/wx/stream.h index 2f1c4b9098..00bf592d09 100644 --- a/include/wx/stream.h +++ b/include/wx/stream.h @@ -40,17 +40,17 @@ WXDLLEXPORT wxOutputStream& wxEndL(wxOutputStream& o_stream); enum wxStreamError { - wxSTREAM_NO_ERROR = 0, - wxSTREAM_NO_ERR = wxSTREAM_NO_ERROR, - wxSTREAM_NOERROR = wxSTREAM_NO_ERROR, + wxSTREAM_NO_ERROR = 0, + wxSTREAM_NO_ERR = wxSTREAM_NO_ERROR, + wxSTREAM_NOERROR = wxSTREAM_NO_ERROR, - wxSTREAM_EOF, + wxSTREAM_EOF, - wxSTREAM_WRITE_ERROR, - wxSTREAM_WRITE_ERR = wxSTREAM_WRITE_ERROR, + wxSTREAM_WRITE_ERROR, + wxSTREAM_WRITE_ERR = wxSTREAM_WRITE_ERROR, - wxSTREAM_READ_ERROR, - wxSTREAM_READ_ERR = wxSTREAM_READ_ERROR + wxSTREAM_READ_ERROR, + wxSTREAM_READ_ERR = wxSTREAM_READ_ERROR }; // compatibility @@ -66,17 +66,25 @@ public: virtual ~wxStreamBase(); // error testing - wxStreamError LastError() const { return m_lasterror; } wxStreamError GetLastError() const { return m_lasterror; } bool IsOk() const { return LastError() == wxSTREAM_NOERROR; } bool operator!() const { return LastError() != wxSTREAM_NOERROR; } - virtual size_t GetSize() const { return ~((size_t)0); } + virtual size_t GetSize() const { return 0; } + + // deprecated, for compatibility only + wxStreamError LastError() const { return m_lasterror; } size_t StreamSize() const { return GetSize(); } protected: + // VZ: these functions are really pure virtual and shouldn't be declared + // in the base class because it creates ambiguties in stream classes + // deriving from both wxInputStream and wxOutputStream +#if 0 virtual size_t OnSysRead(void *buffer, size_t bufsize); virtual size_t OnSysWrite(const void *buffer, size_t bufsize); +#endif + virtual off_t OnSysSeek(off_t seek, wxSeekMode mode); virtual off_t OnSysTell() const; @@ -86,7 +94,7 @@ protected: wxStreamError m_lasterror; }; -class WXDLLEXPORT wxInputStream: public wxStreamBase +class WXDLLEXPORT wxInputStream : /* virtual */ public wxStreamBase { public: wxInputStream(); @@ -120,6 +128,10 @@ public: wxInputStream& operator>>( __wxInputManip func) { return func(*this); } protected: + // to be implemented in the derived classes (it should have been pure + // virtual) + virtual size_t OnSysRead(void *buffer, size_t bufsize); + // Ungetch managers char *m_wback; size_t m_wbacksize; @@ -127,9 +139,11 @@ protected: char *AllocSpaceWBack(size_t needed_size); size_t GetWBack(void *buf, size_t bsize); + + friend class wxStreamBuffer; }; -class WXDLLEXPORT wxOutputStream: public wxStreamBase +class WXDLLEXPORT wxOutputStream : /* virtual */ public wxStreamBase { public: wxOutputStream(); @@ -151,13 +165,20 @@ public: wxOutputStream& operator<<(wxObject& obj); #endif 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; }; // --------------------------------------------------------------------------- // A stream for measuring streamed output // --------------------------------------------------------------------------- -class WXDLLEXPORT wxCountingOutputStream: public wxOutputStream +class WXDLLEXPORT wxCountingOutputStream : public wxOutputStream { public: wxCountingOutputStream(); @@ -166,9 +187,9 @@ public: bool Ok() const { return TRUE; } protected: - size_t OnSysWrite(const void *buffer, size_t size); - off_t OnSysSeek(off_t pos, wxSeekMode mode); - off_t OnSysTell() const; + virtual size_t OnSysWrite(const void *buffer, size_t size); + virtual off_t OnSysSeek(off_t pos, wxSeekMode mode); + virtual off_t OnSysTell() const; size_t m_currentPos; }; @@ -177,36 +198,41 @@ protected: // "Filter" streams // --------------------------------------------------------------------------- -class WXDLLEXPORT wxFilterInputStream: public wxInputStream +class WXDLLEXPORT wxFilterInputStream : public wxInputStream { public: wxFilterInputStream(); wxFilterInputStream(wxInputStream& stream); - ~wxFilterInputStream(); + virtual ~wxFilterInputStream(); char Peek() { return m_parent_i_stream->Peek(); } size_t GetSize() const { return m_parent_i_stream->GetSize(); } + wxInputStream *GetFilterInputStream() const { return m_parent_i_stream; } + protected: wxInputStream *m_parent_i_stream; }; -class WXDLLEXPORT wxFilterOutputStream: public wxOutputStream +class WXDLLEXPORT wxFilterOutputStream : public wxOutputStream { public: wxFilterOutputStream(); wxFilterOutputStream(wxOutputStream& stream); - ~wxFilterOutputStream(); + virtual ~wxFilterOutputStream(); size_t GetSize() const { return m_parent_o_stream->GetSize(); } + wxOutputStream *GetFilterOutputStream() const { return m_parent_o_stream; } + protected: wxOutputStream *m_parent_o_stream; }; // --------------------------------------------------------------------------- -// Stream buffer +// Stream buffer: this class can be derived from and passed to +// wxBufferedStreams to implement custom buffering // --------------------------------------------------------------------------- class WXDLLEXPORT wxStreamBuffer @@ -222,19 +248,19 @@ public: wxStreamBuffer(wxStreamBase& stream, BufMode mode); wxStreamBuffer(BufMode mode); wxStreamBuffer(const wxStreamBuffer& buf); - ~wxStreamBuffer(); + virtual ~wxStreamBuffer(); // Filtered IO - size_t Read(void *buffer, size_t size); + virtual size_t Read(void *buffer, size_t size); size_t Read(wxStreamBuffer *buf); - size_t Write(const void *buffer, size_t size); + virtual size_t Write(const void *buffer, size_t size); size_t Write(wxStreamBuffer *buf); - char Peek(); - char GetChar(); - void PutChar(char c); - off_t Tell() const; - off_t Seek(off_t pos, wxSeekMode mode); + virtual char Peek(); + virtual char GetChar(); + virtual void PutChar(char c); + virtual off_t Tell() const; + virtual off_t Seek(off_t pos, wxSeekMode mode); // Buffer control void ResetBuffer(); @@ -242,10 +268,12 @@ public: // NB: the buffer must always be allocated with malloc() if takeOwn is // TRUE as it will be deallocated by free() void SetBufferIO(void *start, void *end, bool takeOwnership = FALSE); + void SetBufferIO(void *start, size_t len, bool takeOwnership = FALSE); void SetBufferIO(size_t bufsize); void *GetBufferStart() const { return m_buffer_start; } void *GetBufferEnd() const { return m_buffer_end; } void *GetBufferPos() const { return m_buffer_pos; } + size_t GetBufferSize() const { return m_buffer_size; } size_t GetIntPosition() const { return m_buffer_pos - m_buffer_start; } void SetIntPosition(size_t pos) { m_buffer_pos = m_buffer_start + pos; } size_t GetLastAccess() const { return m_buffer_end - m_buffer_start; } @@ -265,6 +293,10 @@ public: bool IsFixed() const { return m_fixed; } bool IsFlushable() const { return m_flushable; } + // only for input/output buffers respectively, returns NULL otherwise + wxInputStream *GetInputStream() const; + wxOutputStream *GetOutputStream() const; + // deprecated, for compatibility only wxStreamBase *Stream() { return m_stream; } @@ -311,11 +343,13 @@ protected: // wxBufferedStreams // --------------------------------------------------------------------------- -class WXDLLEXPORT wxBufferedInputStream: public wxFilterInputStream +class WXDLLEXPORT wxBufferedInputStream : public wxFilterInputStream { public: - wxBufferedInputStream(wxInputStream& stream); - ~wxBufferedInputStream(); + // if a non NULL buffer is given to the stream, it will be deleted by it + wxBufferedInputStream(wxInputStream& stream, + wxStreamBuffer *buffer = NULL); + virtual ~wxBufferedInputStream(); char Peek(); wxInputStream& Read(void *buffer, size_t size); @@ -324,21 +358,28 @@ public: off_t SeekI(off_t pos, wxSeekMode mode = wxFromStart); off_t TellI() const; + // the buffer given to the stream will be deleted by it + void SetInputStreamBuffer(wxStreamBuffer *buffer); + wxStreamBuffer *GetInputStreamBuffer() const { return m_i_streambuf; } + + // deprecated, for compatibility only wxStreamBuffer *InputStreamBuffer() const { return m_i_streambuf; } protected: - size_t OnSysRead(void *buffer, size_t bufsize); - off_t OnSysSeek(off_t seek, wxSeekMode mode); - off_t OnSysTell() const; + virtual size_t OnSysRead(void *buffer, size_t bufsize); + virtual off_t OnSysSeek(off_t seek, wxSeekMode mode); + virtual off_t OnSysTell() const; wxStreamBuffer *m_i_streambuf; }; -class WXDLLEXPORT wxBufferedOutputStream: public wxFilterOutputStream +class WXDLLEXPORT wxBufferedOutputStream : public wxFilterOutputStream { public: - wxBufferedOutputStream(wxOutputStream& stream); - ~wxBufferedOutputStream(); + // if a non NULL buffer is given to the stream, it will be deleted by it + wxBufferedOutputStream(wxOutputStream& stream, + wxStreamBuffer *buffer = NULL); + virtual ~wxBufferedOutputStream(); wxOutputStream& Write(const void *buffer, size_t size); @@ -350,18 +391,22 @@ public: size_t GetSize() const; + // the buffer given to the stream will be deleted by it + void SetOutputStreamBuffer(wxStreamBuffer *buffer); + wxStreamBuffer *GetOutputStreamBuffer() const { return m_o_streambuf; } + + // deprecated, for compatibility only wxStreamBuffer *OutputStreamBuffer() const { return m_o_streambuf; } protected: - size_t OnSysWrite(const void *buffer, size_t bufsize); - off_t OnSysSeek(off_t seek, wxSeekMode mode); - off_t OnSysTell() const; + virtual size_t OnSysWrite(const void *buffer, size_t bufsize); + virtual off_t OnSysSeek(off_t seek, wxSeekMode mode); + virtual off_t OnSysTell() const; wxStreamBuffer *m_o_streambuf; }; -#endif - // wxUSE_STREAMS +#endif // wxUSE_STREAMS + +#endif // _WX_WXSTREAM_H__ -#endif - // _WX_WXSTREAM_H__