X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b5dbe15d0bacde245539f54c4d97af6b4696f01f..8e77fd8bca165aab9709649d79a7cbc6a172d4e1:/include/wx/stream.h diff --git a/include/wx/stream.h b/include/wx/stream.h index 73522f1c37..b1746b84b5 100644 --- a/include/wx/stream.h +++ b/include/wx/stream.h @@ -64,7 +64,7 @@ public: bool operator!() const { return !IsOk(); } // reset the stream state - void Reset() { m_lasterror = wxSTREAM_NO_ERROR; } + void Reset(wxStreamError error = wxSTREAM_NO_ERROR) { m_lasterror = error; } // this doesn't make sense for all streams, always test its return value virtual size_t GetSize() const; @@ -83,7 +83,7 @@ protected: friend class wxStreamBuffer; DECLARE_ABSTRACT_CLASS(wxStreamBase) - DECLARE_NO_COPY_CLASS(wxStreamBase) + wxDECLARE_NO_COPY_CLASS(wxStreamBase); }; // ---------------------------------------------------------------------------- @@ -128,6 +128,11 @@ public: // it means that EOF has been reached. virtual wxInputStream& Read(void *buffer, size_t size); + // Read exactly the given number of bytes, unlike Read(), which may read + // less than the requested amount of data without returning an error, this + // method either reads all the data or returns false. + bool ReadAll(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); @@ -218,7 +223,7 @@ protected: friend class wxStreamBuffer; DECLARE_ABSTRACT_CLASS(wxInputStream) - DECLARE_NO_COPY_CLASS(wxInputStream) + wxDECLARE_NO_COPY_CLASS(wxInputStream); }; // ---------------------------------------------------------------------------- @@ -233,6 +238,12 @@ public: void PutC(char c); virtual wxOutputStream& Write(const void *buffer, size_t size); + + // This is ReadAll() equivalent for Write(): it either writes exactly the + // given number of bytes or returns false, unlike Write() which can write + // less data than requested but still return without error. + bool WriteAll(const void *buffer, size_t size); + wxOutputStream& Write(wxInputStream& stream_in); virtual wxFileOffset SeekO(wxFileOffset pos, wxSeekMode mode = wxFromStart); @@ -254,7 +265,7 @@ protected: friend class wxStreamBuffer; DECLARE_ABSTRACT_CLASS(wxOutputStream) - DECLARE_NO_COPY_CLASS(wxOutputStream) + wxDECLARE_NO_COPY_CLASS(wxOutputStream); }; // ============================================================================ @@ -270,19 +281,20 @@ class WXDLLIMPEXP_BASE wxCountingOutputStream : public wxOutputStream public: wxCountingOutputStream(); - wxFileOffset GetLength() const; + virtual wxFileOffset GetLength() const; bool Ok() const { return IsOk(); } - bool IsOk() const { return true; } + virtual bool IsOk() const { return true; } protected: virtual size_t OnSysWrite(const void *buffer, size_t size); virtual wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode); virtual wxFileOffset OnSysTell() const; - size_t m_currentPos; + size_t m_currentPos, + m_lastPos; DECLARE_DYNAMIC_CLASS(wxCountingOutputStream) - DECLARE_NO_COPY_CLASS(wxCountingOutputStream) + wxDECLARE_NO_COPY_CLASS(wxCountingOutputStream); }; // --------------------------------------------------------------------------- @@ -308,7 +320,7 @@ protected: bool m_owns; DECLARE_ABSTRACT_CLASS(wxFilterInputStream) - DECLARE_NO_COPY_CLASS(wxFilterInputStream) + wxDECLARE_NO_COPY_CLASS(wxFilterInputStream); }; class WXDLLIMPEXP_BASE wxFilterOutputStream : public wxOutputStream @@ -330,7 +342,7 @@ protected: bool m_owns; DECLARE_ABSTRACT_CLASS(wxFilterOutputStream) - DECLARE_NO_COPY_CLASS(wxFilterOutputStream) + wxDECLARE_NO_COPY_CLASS(wxFilterOutputStream); }; enum wxStreamProtocolType @@ -416,7 +428,23 @@ public: read_write }; - wxStreamBuffer(wxStreamBase& stream, BufMode mode); + wxStreamBuffer(wxStreamBase& stream, BufMode mode) + { + InitWithStream(stream, mode); + } + + wxStreamBuffer(size_t bufsize, wxInputStream& stream) + { + InitWithStream(stream, read); + SetBufferIO(bufsize); + } + + wxStreamBuffer(size_t bufsize, wxOutputStream& stream) + { + InitWithStream(stream, write); + SetBufferIO(bufsize); + } + wxStreamBuffer(const wxStreamBuffer& buf); virtual ~wxStreamBuffer(); @@ -444,7 +472,7 @@ public: 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 GetBufferSize() const { return m_buffer_end - m_buffer_start; } 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; } @@ -459,7 +487,7 @@ public: // misc accessors wxStreamBase *GetStream() const { return m_stream; } - bool HasBuffer() const { return m_buffer_size != 0; } + bool HasBuffer() const { return m_buffer_start != m_buffer_end; } bool IsFixed() const { return m_fixed; } bool IsFlushable() const { return m_flushable; } @@ -487,6 +515,9 @@ protected: // common part of several ctors void Init(); + // common part of ctors taking wxStreamBase parameter + void InitWithStream(wxStreamBase& stream, BufMode mode); + // init buffer variables to be empty void InitBuffer(); @@ -499,10 +530,6 @@ protected: *m_buffer_end, *m_buffer_pos; - // the buffer size - // FIXME: isn't it the same as m_buffer_end - m_buffer_start? (VZ) - size_t m_buffer_size; - // the stream we're associated with wxStreamBase *m_stream; @@ -514,13 +541,8 @@ protected: m_fixed, m_flushable; -private: -// Cannot use -// DECLARE_NO_COPY_CLASS(wxStreamBuffer) -// because copy constructor is explicitly declared above; -// but no copy assignment operator is defined, so declare -// it private to prevent the compiler from defining it: - wxStreamBuffer& operator=(const wxStreamBuffer&); + + wxDECLARE_NO_ASSIGN_CLASS(wxStreamBuffer); }; // --------------------------------------------------------------------------- @@ -530,9 +552,19 @@ private: class WXDLLIMPEXP_BASE wxBufferedInputStream : public wxFilterInputStream { public: - // if a non NULL buffer is given to the stream, it will be deleted by it + // create a buffered stream on top of the specified low-level stream + // + // if a non NULL buffer is given to the stream, it will be deleted by it, + // otherwise a default 1KB buffer will be used wxBufferedInputStream(wxInputStream& stream, wxStreamBuffer *buffer = NULL); + + // ctor allowing to specify the buffer size, it's just a more convenient + // alternative to creating wxStreamBuffer, calling its SetBufferIO(bufsize) + // and using the ctor above + wxBufferedInputStream(wxInputStream& stream, size_t bufsize); + + virtual ~wxBufferedInputStream(); char Peek(); @@ -559,7 +591,7 @@ protected: wxStreamBuffer *m_i_streambuf; - DECLARE_NO_COPY_CLASS(wxBufferedInputStream) + wxDECLARE_NO_COPY_CLASS(wxBufferedInputStream); }; // ---------------------------------------------------------------------------- @@ -569,9 +601,18 @@ protected: class WXDLLIMPEXP_BASE wxBufferedOutputStream : public wxFilterOutputStream { public: - // if a non NULL buffer is given to the stream, it will be deleted by it + // create a buffered stream on top of the specified low-level stream + // + // if a non NULL buffer is given to the stream, it will be deleted by it, + // otherwise a default 1KB buffer will be used wxBufferedOutputStream(wxOutputStream& stream, wxStreamBuffer *buffer = NULL); + + // ctor allowing to specify the buffer size, it's just a more convenient + // alternative to creating wxStreamBuffer, calling its SetBufferIO(bufsize) + // and using the ctor above + wxBufferedOutputStream(wxOutputStream& stream, size_t bufsize); + virtual ~wxBufferedOutputStream(); wxOutputStream& Write(const void *buffer, size_t size); @@ -602,7 +643,7 @@ protected: wxStreamBuffer *m_o_streambuf; - DECLARE_NO_COPY_CLASS(wxBufferedOutputStream) + wxDECLARE_NO_COPY_CLASS(wxBufferedOutputStream); }; #if WXWIN_COMPATIBILITY_2_6 @@ -611,6 +652,54 @@ protected: inline wxStreamBuffer *wxBufferedOutputStream::OutputStreamBuffer() const { return m_o_streambuf; } #endif // WXWIN_COMPATIBILITY_2_6 +// --------------------------------------------------------------------------- +// wxWrapperInputStream: forwards all IO to another stream. +// --------------------------------------------------------------------------- + +class WXDLLIMPEXP_BASE wxWrapperInputStream : public wxFilterInputStream +{ +public: + // Constructor fully initializing the stream. The overload taking pointer + // takes ownership of the parent stream, the one taking reference does not. + // + // Notice that this class also has a default ctor but it's protected as the + // derived class is supposed to take care of calling InitParentStream() if + // it's used. + wxWrapperInputStream(wxInputStream& stream); + wxWrapperInputStream(wxInputStream* stream); + + // Override the base class methods to forward to the wrapped stream. + virtual wxFileOffset GetLength() const; + virtual bool IsSeekable() const; + +protected: + virtual size_t OnSysRead(void *buffer, size_t size); + virtual wxFileOffset OnSysSeek(wxFileOffset pos, wxSeekMode mode); + virtual wxFileOffset OnSysTell() const; + + // Ensure that our own last error is the same as that of the real stream. + // + // This method is const because the error must be updated even from const + // methods (in other words, it really should have been mutable in the first + // place). + void SynchronizeLastError() const + { + const_cast(this)-> + Reset(m_parent_i_stream->GetLastError()); + } + + // Default constructor, use InitParentStream() later. + wxWrapperInputStream(); + + // Set up the wrapped stream for an object initialized using the default + // constructor. The ownership logic is the same as above. + void InitParentStream(wxInputStream& stream); + void InitParentStream(wxInputStream* stream); + + wxDECLARE_NO_COPY_CLASS(wxWrapperInputStream); +}; + + #endif // wxUSE_STREAMS #endif // _WX_WXSTREAM_H__