X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4ee9daf45c66b45b2062e5d01a1b9d8ff0db427f..931d6a47c32a5b4c283243cb553ce71ee2b535d5:/src/common/fileback.cpp diff --git a/src/common/fileback.cpp b/src/common/fileback.cpp index 3e35315984..c9c6c49476 100644 --- a/src/common/fileback.cpp +++ b/src/common/fileback.cpp @@ -2,7 +2,6 @@ // Name: src/common/fileback.cpp // Purpose: Back an input stream with memory or a file // Author: Mike Wetherell -// RCS-ID: $Id$ // Copyright: (c) 2006 Mike Wetherell // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -14,9 +13,9 @@ #pragma hdrstop #endif -#if wxUSE_BACKINGFILE +#if wxUSE_FILESYSTEM -#include "wx/fileback.h" +#include "wx/private/fileback.h" #ifndef WX_PRECOMP #include "wx/utils.h" @@ -82,8 +81,8 @@ wxBackingFileImpl::wxBackingFileImpl(wxInputStream *stream, { wxFileOffset len = m_stream->GetLength(); - if (len >= 0 && len + size_t(0) < m_bufsize) - m_bufsize = size_t(len); + if (len >= 0 && len + size_t(1) < m_bufsize) + m_bufsize = size_t(len + 1); if (m_bufsize) m_buf = new char[m_bufsize]; @@ -168,11 +167,9 @@ wxStreamError wxBackingFileImpl::ReadAt(wxFileOffset pos, m_filelen += count; if (count < m_buflen) { - delete m_stream; - m_stream = NULL; + wxDELETE(m_stream); if (count > 0) { - delete m_buf; - m_buf = NULL; + wxDELETEA(m_buf); m_buflen = 0; } m_parenterror = wxSTREAM_READ_ERROR; @@ -182,8 +179,7 @@ wxStreamError wxBackingFileImpl::ReadAt(wxFileOffset pos, m_buflen = 0; if (!m_stream) { - delete m_buf; - m_buf = NULL; + wxDELETEA(m_buf); } } @@ -197,8 +193,7 @@ wxStreamError wxBackingFileImpl::ReadAt(wxFileOffset pos, m_parenterror = m_stream->GetLastError(); if (m_parenterror == wxSTREAM_NO_ERROR) m_parenterror = wxSTREAM_EOF; - delete m_stream; - m_stream = NULL; + wxDELETE(m_stream); } } @@ -271,6 +266,29 @@ wxBackedInputStream::wxBackedInputStream(const wxBackingFile& backer) { } +wxFileOffset wxBackedInputStream::GetLength() const +{ + return m_backer.m_impl->GetLength(); +} + +wxFileOffset wxBackedInputStream::FindLength() const +{ + wxFileOffset len = GetLength(); + + if (len == wxInvalidOffset && IsOk()) { + // read a byte at 7ff...ffe + wxFileOffset pos = 1; + pos <<= sizeof(pos) * 8 - 1; + pos = ~pos - 1; + char ch; + size_t size = 1; + m_backer.m_impl->ReadAt(pos, &ch, &size); + len = GetLength(); + } + + return len; +} + size_t wxBackedInputStream::OnSysRead(void *buffer, size_t size) { if (!IsOk()) @@ -281,11 +299,6 @@ size_t wxBackedInputStream::OnSysRead(void *buffer, size_t size) return size; } -wxFileOffset wxBackedInputStream::GetLength() const -{ - return m_backer.m_impl->GetLength(); -} - wxFileOffset wxBackedInputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode) { switch (mode) { @@ -317,4 +330,4 @@ wxFileOffset wxBackedInputStream::OnSysTell() const return m_pos; } -#endif // wxUSE_BACKINGFILE +#endif // wxUSE_FILESYSTEM