X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a8d2cf4e70be848aaa52b1bff27b52440da1b648..04a33b503114fa4b1d8b96f5c8c31a545a18da6e:/include/wx/stream.h diff --git a/include/wx/stream.h b/include/wx/stream.h index cad5148ab9..3f34c95212 100644 --- a/include/wx/stream.h +++ b/include/wx/stream.h @@ -21,9 +21,9 @@ #include "wx/string.h" #include "wx/filefn.h" // for wxFileOffset, wxInvalidOffset and wxSeekMode -class WXDLLIMPEXP_BASE wxStreamBase; -class WXDLLIMPEXP_BASE wxInputStream; -class WXDLLIMPEXP_BASE wxOutputStream; +class WXDLLIMPEXP_FWD_BASE wxStreamBase; +class WXDLLIMPEXP_FWD_BASE wxInputStream; +class WXDLLIMPEXP_FWD_BASE wxOutputStream; typedef wxInputStream& (*__wxInputManip)(wxInputStream&); typedef wxOutputStream& (*__wxOutputManip)(wxOutputStream&); @@ -42,6 +42,8 @@ enum wxStreamError wxSTREAM_READ_ERROR // generic read error }; +const int wxEOF = -1; + // ============================================================================ // base stream classes: wxInputStream and wxOutputStream // ============================================================================ @@ -50,7 +52,7 @@ enum wxStreamError // wxStreamBase: common (but non virtual!) base for all stream classes // --------------------------------------------------------------------------- -class WXDLLIMPEXP_BASE wxStreamBase +class WXDLLIMPEXP_BASE wxStreamBase : public wxObject { public: wxStreamBase(); @@ -80,6 +82,7 @@ protected: friend class wxStreamBuffer; + DECLARE_ABSTRACT_CLASS(wxStreamBase) DECLARE_NO_COPY_CLASS(wxStreamBase) }; @@ -106,11 +109,11 @@ public: // undefined), otherwise 1 virtual char Peek(); - // return one character from the stream, blocking until it appears if + // return one byte 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(); + // on success returns a value between 0 - 255, or wxEOF on EOF or error. + int GetC(); // read at most the given number of bytes from the stream // @@ -214,6 +217,7 @@ protected: friend class wxStreamBuffer; + DECLARE_ABSTRACT_CLASS(wxInputStream) DECLARE_NO_COPY_CLASS(wxInputStream) }; @@ -249,6 +253,7 @@ protected: friend class wxStreamBuffer; + DECLARE_ABSTRACT_CLASS(wxOutputStream) DECLARE_NO_COPY_CLASS(wxOutputStream) }; @@ -276,6 +281,7 @@ protected: size_t m_currentPos; + DECLARE_DYNAMIC_CLASS(wxCountingOutputStream) DECLARE_NO_COPY_CLASS(wxCountingOutputStream) }; @@ -301,6 +307,7 @@ protected: wxInputStream *m_parent_i_stream; bool m_owns; + DECLARE_ABSTRACT_CLASS(wxFilterInputStream) DECLARE_NO_COPY_CLASS(wxFilterInputStream) }; @@ -322,28 +329,24 @@ protected: wxOutputStream *m_parent_o_stream; bool m_owns; + DECLARE_ABSTRACT_CLASS(wxFilterOutputStream) DECLARE_NO_COPY_CLASS(wxFilterOutputStream) }; enum wxStreamProtocolType { - wxSTREAM_PROTOCOL, // wxFileSystem protocol (should be only one) - wxSTREAM_MIMETYPE, // Mime types the stream handles - wxSTREAM_ENCODING, // The http Content-Encodings the stream handles - wxSTREAM_FILEEXTENSION // File extensions the stream handles + wxSTREAM_PROTOCOL, // wxFileSystem protocol (should be only one) + wxSTREAM_MIMETYPE, // MIME types the stream handles + wxSTREAM_ENCODING, // The HTTP Content-Encodings the stream handles + wxSTREAM_FILEEXT // File extensions the stream handles }; void WXDLLIMPEXP_BASE wxUseFilterClasses(); -class WXDLLIMPEXP_BASE wxFilterClassFactory : public wxObject +class WXDLLIMPEXP_BASE wxFilterClassFactoryBase : public wxObject { public: - virtual ~wxFilterClassFactory() { } - - virtual wxFilterInputStream *NewStream(wxInputStream& stream) const = 0; - virtual wxFilterOutputStream *NewStream(wxOutputStream& stream) const = 0; - virtual wxFilterInputStream *NewStream(wxInputStream *stream) const = 0; - virtual wxFilterOutputStream *NewStream(wxOutputStream *stream) const = 0; + virtual ~wxFilterClassFactoryBase() { } wxString GetProtocol() const { return wxString(*GetProtocols()); } wxString PopExtension(const wxString& location) const; @@ -351,11 +354,27 @@ public: virtual const wxChar * const *GetProtocols(wxStreamProtocolType type = wxSTREAM_PROTOCOL) const = 0; - bool CanHandle(const wxChar *protocol, + bool CanHandle(const wxString& protocol, wxStreamProtocolType type = wxSTREAM_PROTOCOL) const; - static const wxFilterClassFactory *Find(const wxChar *protocol, +protected: + wxString::size_type FindExtension(const wxString& location) const; + + DECLARE_ABSTRACT_CLASS(wxFilterClassFactoryBase) +}; + +class WXDLLIMPEXP_BASE wxFilterClassFactory : public wxFilterClassFactoryBase +{ +public: + virtual ~wxFilterClassFactory() { } + + virtual wxFilterInputStream *NewStream(wxInputStream& stream) const = 0; + virtual wxFilterOutputStream *NewStream(wxOutputStream& stream) const = 0; + virtual wxFilterInputStream *NewStream(wxInputStream *stream) const = 0; + virtual wxFilterOutputStream *NewStream(wxOutputStream *stream) const = 0; + + static const wxFilterClassFactory *Find(const wxString& protocol, wxStreamProtocolType type = wxSTREAM_PROTOCOL); @@ -371,8 +390,6 @@ protected: wxFilterClassFactory& operator=(const wxFilterClassFactory&) { return *this; } - wxString::size_type FindExtension(const wxChar *location) const; - private: static wxFilterClassFactory *sm_first; wxFilterClassFactory *m_next; @@ -399,7 +416,23 @@ public: read_write }; - wxStreamBuffer(wxStreamBase& stream, BufMode mode); + wxStreamBuffer(wxStreamBase& stream, BufMode mode) + { + InitWithStream(stream, mode); + } + + wxStreamBuffer(wxInputStream& stream, size_t bufsize) + { + InitWithStream(stream, read); + SetBufferIO(bufsize); + } + + wxStreamBuffer(wxOutputStream& stream, size_t bufsize) + { + InitWithStream(stream, write); + SetBufferIO(bufsize); + } + wxStreamBuffer(const wxStreamBuffer& buf); virtual ~wxStreamBuffer(); @@ -417,6 +450,7 @@ public: // Buffer control void ResetBuffer(); + void Truncate(); // NB: the buffer must always be allocated with malloc() if takeOwn is // true as it will be deallocated by free() @@ -426,7 +460,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; } @@ -441,7 +475,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; } @@ -469,6 +503,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(); @@ -481,10 +518,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; @@ -496,13 +529,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&); + + DECLARE_NO_ASSIGN_CLASS(wxStreamBuffer) }; // --------------------------------------------------------------------------- @@ -512,9 +540,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(); @@ -551,9 +589,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);