X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/166c3ef0f9a77a66143968be2c1b58747994d32e..8e190f0ed9c242e6df5fd4dd99fdaf6c9dea1cda:/src/common/stream.cpp diff --git a/src/common/stream.cpp b/src/common/stream.cpp index 618ae6ed32..32e6fe8d15 100644 --- a/src/common/stream.cpp +++ b/src/common/stream.cpp @@ -192,6 +192,28 @@ void wxStreamBuffer::ResetBuffer() : m_buffer_start; } +void wxStreamBuffer::Truncate() +{ + size_t new_size = m_buffer_pos - m_buffer_start; + if ( new_size == m_buffer_size ) + return; + + if ( !new_size ) + { + FreeBuffer(); + InitBuffer(); + return; + } + + char *new_start = (char *)realloc(m_buffer_start, new_size); + wxCHECK_RET( new_size, _T("shrinking buffer shouldn't fail") ); + + m_buffer_start = new_start; + m_buffer_size = new_size; + m_buffer_end = m_buffer_start + m_buffer_size; + m_buffer_pos = m_buffer_end; +} + // fill the buffer with as much data as possible (only for read buffers) bool wxStreamBuffer::FillBuffer() { @@ -657,6 +679,8 @@ wxFileOffset wxStreamBuffer::Tell() const // wxStreamBase // ---------------------------------------------------------------------------- +IMPLEMENT_ABSTRACT_CLASS(wxStreamBase, wxObject) + wxStreamBase::wxStreamBase() { m_lasterror = wxSTREAM_NO_ERROR; @@ -693,6 +717,8 @@ wxFileOffset wxStreamBase::OnSysTell() const // wxInputStream // ---------------------------------------------------------------------------- +IMPLEMENT_ABSTRACT_CLASS(wxInputStream, wxStreamBase) + wxInputStream::wxInputStream() { m_wback = NULL; @@ -809,11 +835,11 @@ bool wxInputStream::Ungetch(char c) return Ungetch(&c, sizeof(c)) != 0; } -char wxInputStream::GetC() +int wxInputStream::GetC() { - char c; + unsigned char c; Read(&c, sizeof(c)); - return c; + return LastRead() ? c : wxEOF; } wxInputStream& wxInputStream::Read(void *buf, size_t size) @@ -869,6 +895,7 @@ char wxInputStream::Peek() wxInputStream& wxInputStream::Read(wxOutputStream& stream_out) { + size_t lastcount = 0; char buf[BUF_TEMP_SIZE]; for ( ;; ) @@ -879,8 +906,12 @@ wxInputStream& wxInputStream::Read(wxOutputStream& stream_out) if ( stream_out.Write(buf, bytes_read).LastWrite() != bytes_read ) break; + + lastcount += bytes_read; } + m_lastcount = lastcount; + return *this; } @@ -933,6 +964,8 @@ wxFileOffset wxInputStream::TellI() const // wxOutputStream // ---------------------------------------------------------------------------- +IMPLEMENT_ABSTRACT_CLASS(wxOutputStream, wxStreamBase) + wxOutputStream::wxOutputStream() { } @@ -983,6 +1016,8 @@ void wxOutputStream::Sync() // wxCountingOutputStream // ---------------------------------------------------------------------------- +IMPLEMENT_DYNAMIC_CLASS(wxCountingOutputStream, wxOutputStream) + wxCountingOutputStream::wxCountingOutputStream () { m_currentPos = 0; @@ -1045,6 +1080,8 @@ wxFileOffset wxCountingOutputStream::OnSysTell() const // wxFilterInputStream // ---------------------------------------------------------------------------- +IMPLEMENT_ABSTRACT_CLASS(wxFilterInputStream, wxInputStream) + wxFilterInputStream::wxFilterInputStream() : m_parent_i_stream(NULL), m_owns(false) @@ -1073,6 +1110,8 @@ wxFilterInputStream::~wxFilterInputStream() // wxFilterOutputStream // ---------------------------------------------------------------------------- +IMPLEMENT_ABSTRACT_CLASS(wxFilterOutputStream, wxOutputStream) + wxFilterOutputStream::wxFilterOutputStream() : m_parent_o_stream(NULL), m_owns(false) @@ -1106,38 +1145,49 @@ wxFilterOutputStream::~wxFilterOutputStream() } // ---------------------------------------------------------------------------- -// wxFilterClassFactory +// wxFilterClassFactoryBase // ---------------------------------------------------------------------------- -IMPLEMENT_ABSTRACT_CLASS(wxFilterClassFactory, wxObject) +IMPLEMENT_ABSTRACT_CLASS(wxFilterClassFactoryBase, wxObject) -wxFilterClassFactory *wxFilterClassFactory::sm_first = NULL; +wxString wxFilterClassFactoryBase::PopExtension(const wxString& location) const +{ + return location.substr(0, FindExtension(location)); +} -bool wxFilterClassFactory::CanHandle(const wxChar *protocol, - wxStreamProtocolType type) const +wxString::size_type wxFilterClassFactoryBase::FindExtension( + const wxString& location) const { - if (type == wxSTREAM_FILEEXTENSION) + for (const wxChar *const *p = GetProtocols(wxSTREAM_FILEEXT); *p; p++) { - size_t len = wxStrlen(protocol); + if ( location.EndsWith(*p) ) + return location.length() - wxStrlen(*p); + } - for (const wxChar * const *p = GetProtocols(type); p && *p; p++) - { - size_t l = wxStrlen(*p); + return wxString::npos; +} - if (l <= len && wxStrcmp(*p, protocol + len - l) == 0) - return true; - } - } +bool wxFilterClassFactoryBase::CanHandle(const wxString& protocol, + wxStreamProtocolType type) const +{ + if (type == wxSTREAM_FILEEXT) + return FindExtension(protocol) != wxString::npos; else - { - for (const wxChar * const *p = GetProtocols(type); p && *p; p++) - if (wxStrcmp(*p, protocol) == 0) + for (const wxChar *const *p = GetProtocols(type); *p; p++) + if (protocol == *p) return true; - } return false; } +// ---------------------------------------------------------------------------- +// wxFilterClassFactory +// ---------------------------------------------------------------------------- + +IMPLEMENT_ABSTRACT_CLASS(wxFilterClassFactory, wxFilterClassFactoryBase) + +wxFilterClassFactory *wxFilterClassFactory::sm_first = NULL; + void wxFilterClassFactory::Remove() { if (m_next != this)