// 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
/////////////////////////////////////////////////////////////////////////////
#pragma hdrstop
#endif
-#if wxUSE_BACKINGFILE
+#if wxUSE_FILESYSTEM
+
+#include "wx/private/fileback.h"
#ifndef WX_PRECOMP
- #include "wx/stream.h"
#include "wx/utils.h"
#include "wx/log.h"
#endif
-#include "wx/fileback.h"
#include "wx/private/filename.h"
// Prefer wxFFile unless wxFile has large file support but wxFFile does not.
//
-#if wxUSE_FFILE && (defined WXFFILE_LARGEFILE || !defined WXFILE_LARGEFILE)
+#if wxUSE_FFILE && (defined wxHAS_LARGE_FFILES || !defined wxHAS_LARGE_FILES)
typedef wxFFile wxBFFile;
static const bool wxBadSeek = false;
#else
{
wxFileOffset len = m_stream->GetLength();
- if (len >= 0 && len + size_t(0) < m_bufsize)
- m_bufsize = 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];
size1 = reqestedSize;
size2 = 0;
} else if (pos < m_filelen) {
- size1 = m_filelen - pos;
+ size1 = size_t(m_filelen - pos);
size2 = reqestedSize - size1;
} else {
size1 = 0;
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;
m_buflen = 0;
if (!m_stream) {
- delete m_buf;
- m_buf = NULL;
+ wxDELETEA(m_buf);
}
}
m_parenterror = m_stream->GetLastError();
if (m_parenterror == wxSTREAM_NO_ERROR)
m_parenterror = wxSTREAM_EOF;
- delete m_stream;
- m_stream = NULL;
+ wxDELETE(m_stream);
}
}
// copy to the user's buffer
- size_t start = pos - m_filelen;
+ size_t start = size_t(pos - m_filelen);
size_t len = wxMin(m_buflen - start, reqestedSize - *size);
memcpy((char*)buffer + *size, m_buf + start, len);
{
}
+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())
return size;
}
-wxFileOffset wxBackedInputStream::GetLength() const
-{
- return m_backer.m_impl->GetLength();
-}
-
wxFileOffset wxBackedInputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode)
{
switch (mode) {
return m_pos;
}
-#endif // wxUSE_BACKINGFILE
+#endif // wxUSE_FILESYSTEM