X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/40ff126ac4ff57ab4aa22a5c7c7ce621479e8739..c3e54dee9173954a7f18a88632fbc263695938f6:/include/wx/stream.h diff --git a/include/wx/stream.h b/include/wx/stream.h index ca3b84eb57..2452244060 100644 --- a/include/wx/stream.h +++ b/include/wx/stream.h @@ -42,6 +42,8 @@ enum wxStreamError wxSTREAM_READ_ERROR // generic read error }; +const int wxEOF = -1; + // ============================================================================ // base stream classes: wxInputStream and wxOutputStream // ============================================================================ @@ -58,7 +60,7 @@ public: // error testing wxStreamError GetLastError() const { return m_lasterror; } - bool IsOk() const { return GetLastError() == wxSTREAM_NO_ERROR; } + virtual bool IsOk() const { return GetLastError() == wxSTREAM_NO_ERROR; } bool operator!() const { return !IsOk(); } // reset the stream state @@ -106,11 +108,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 // @@ -266,7 +268,8 @@ public: wxCountingOutputStream(); wxFileOffset GetLength() const; - bool Ok() const { return true; } + bool Ok() const { return IsOk(); } + bool IsOk() const { return true; } protected: virtual size_t OnSysWrite(const void *buffer, size_t size); @@ -287,6 +290,7 @@ class WXDLLIMPEXP_BASE wxFilterInputStream : public wxInputStream public: wxFilterInputStream(); wxFilterInputStream(wxInputStream& stream); + wxFilterInputStream(wxInputStream *stream); virtual ~wxFilterInputStream(); char Peek() { return m_parent_i_stream->Peek(); } @@ -297,6 +301,7 @@ public: protected: wxInputStream *m_parent_i_stream; + bool m_owns; DECLARE_NO_COPY_CLASS(wxFilterInputStream) }; @@ -306,18 +311,86 @@ class WXDLLIMPEXP_BASE wxFilterOutputStream : public wxOutputStream public: wxFilterOutputStream(); wxFilterOutputStream(wxOutputStream& stream); + wxFilterOutputStream(wxOutputStream *stream); virtual ~wxFilterOutputStream(); wxFileOffset GetLength() const { return m_parent_o_stream->GetLength(); } wxOutputStream *GetFilterOutputStream() const { return m_parent_o_stream; } + bool Close(); + protected: wxOutputStream *m_parent_o_stream; + bool m_owns; 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_FILEEXT // File extensions the stream handles +}; + +void WXDLLIMPEXP_BASE wxUseFilterClasses(); + +class WXDLLIMPEXP_BASE wxFilterClassFactoryBase : public wxObject +{ +public: + virtual ~wxFilterClassFactoryBase() { } + + wxString GetProtocol() const { return wxString(*GetProtocols()); } + wxString PopExtension(const wxString& location) const; + + virtual const wxChar * const *GetProtocols(wxStreamProtocolType type + = wxSTREAM_PROTOCOL) const = 0; + + bool CanHandle(const wxChar *protocol, + wxStreamProtocolType type + = wxSTREAM_PROTOCOL) const; + +protected: + wxString::size_type FindExtension(const wxChar *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 wxChar *protocol, + wxStreamProtocolType type + = wxSTREAM_PROTOCOL); + + static const wxFilterClassFactory *GetFirst(); + const wxFilterClassFactory *GetNext() const { return m_next; } + + void PushFront() { Remove(); m_next = sm_first; sm_first = this; } + void Remove(); + +protected: + wxFilterClassFactory() : m_next(this) { } + + wxFilterClassFactory& operator=(const wxFilterClassFactory&) + { return *this; } + +private: + static wxFilterClassFactory *sm_first; + wxFilterClassFactory *m_next; + + DECLARE_ABSTRACT_CLASS(wxFilterClassFactory) +}; + // ============================================================================ // buffered streams // ============================================================================