X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/12811c1c3bf188b29188ede4e4320db9ff74b691..34eeb223b428c2e9ec90d88348e7e62dfeb1cb65:/src/common/fileback.cpp diff --git a/src/common/fileback.cpp b/src/common/fileback.cpp index a0cbc707d8..bc5f2ff9dd 100644 --- a/src/common/fileback.cpp +++ b/src/common/fileback.cpp @@ -83,7 +83,7 @@ wxBackingFileImpl::wxBackingFileImpl(wxInputStream *stream, wxFileOffset len = m_stream->GetLength(); if (len >= 0 && len + size_t(1) < m_bufsize) - m_bufsize = len + 1; + m_bufsize = size_t(len + 1); if (m_bufsize) m_buf = new char[m_bufsize]; @@ -271,6 +271,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 +304,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) {