large files support for wxFFile (patch 1077980 from Mike Wetherell)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30952 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2004-12-12 11:53:53 +00:00
parent 34ea3c7491
commit 70a7bd90f9
8 changed files with 54 additions and 39 deletions

View File

@@ -41,6 +41,18 @@
// implementation
// ============================================================================
// ----------------------------------------------------------------------------
// seek and tell with large file support if available
// ----------------------------------------------------------------------------
#ifdef HAVE_FSEEKO
# define wxFseek fseeko
# define wxFtell ftello
#else
# define wxFseek fseek
# define wxFtell ftell
#endif
// ----------------------------------------------------------------------------
// opening the file
// ----------------------------------------------------------------------------
@@ -170,7 +182,7 @@ bool wxFFile::Flush()
// seeking
// ----------------------------------------------------------------------------
bool wxFFile::Seek(long ofs, wxSeekMode mode)
bool wxFFile::Seek(wxFileOffset ofs, wxSeekMode mode)
{
wxCHECK_MSG( IsOpened(), false, wxT("can't seek on closed file") );
@@ -194,7 +206,16 @@ bool wxFFile::Seek(long ofs, wxSeekMode mode)
break;
}
if ( fseek(m_fp, ofs, origin) != 0 )
#ifndef HAVE_FSEEKO
if ((long)ofs != ofs)
{
wxLogError(_("Seek error on file '%s' (large files not supported by stdio)"), m_name.c_str());
return false;
}
#endif
if ( wxFseek(m_fp, ofs, origin) != 0 )
{
wxLogSysError(_("Seek error on file '%s'"), m_name.c_str());
@@ -204,34 +225,34 @@ bool wxFFile::Seek(long ofs, wxSeekMode mode)
return true;
}
size_t wxFFile::Tell() const
wxFileOffset wxFFile::Tell() const
{
wxCHECK_MSG( IsOpened(), (size_t)-1,
wxCHECK_MSG( IsOpened(), wxInvalidOffset,
_T("wxFFile::Tell(): file is closed!") );
long rc = ftell(m_fp);
if ( rc == -1 )
wxFileOffset rc = wxFtell(m_fp);
if ( rc == wxInvalidOffset )
{
wxLogSysError(_("Can't find current position in file '%s'"),
m_name.c_str());
}
return (size_t)rc;
return rc;
}
size_t wxFFile::Length() const
wxFileOffset wxFFile::Length() const
{
wxCHECK_MSG( IsOpened(), (size_t)-1,
wxCHECK_MSG( IsOpened(), wxInvalidOffset,
_T("wxFFile::Length(): file is closed!") );
wxFFile& self = *(wxFFile *)this; // const_cast
size_t posOld = Tell();
if ( posOld != (size_t)-1 )
wxFileOffset posOld = Tell();
if ( posOld != wxInvalidOffset )
{
if ( self.SeekEnd() )
{
size_t len = Tell();
wxFileOffset len = Tell();
(void)self.Seek(posOld);
@@ -239,7 +260,7 @@ size_t wxFFile::Length() const
}
}
return (size_t)-1;
return wxInvalidOffset;
}
#endif // wxUSE_FFILE

View File

@@ -250,14 +250,7 @@ size_t wxFFileInputStream::OnSysRead(void *buffer, size_t size)
wxFileOffset wxFFileInputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode)
{
#ifdef __VMS
#pragma message disable intsignchange
#endif
wxASSERT_MSG( pos >= LONG_MIN && pos <= LONG_MAX, _T("no huge wxFFile support") );
return ( m_file->Seek((long)pos, mode) ? (wxFileOffset)m_file->Tell() : wxInvalidOffset );
#ifdef __VMS
#pragma message enable intsignchange
#endif
return m_file->Seek(pos, mode) ? m_file->Tell() : wxInvalidOffset;
}
wxFileOffset wxFFileInputStream::OnSysTell() const
@@ -331,14 +324,7 @@ wxFileOffset wxFFileOutputStream::OnSysTell() const
wxFileOffset wxFFileOutputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode)
{
#ifdef __VMS
#pragma message disable intsignchange
#endif
wxASSERT_MSG( pos >= LONG_MIN && pos <= LONG_MAX, _T("no huge wxFFile support") );
return ( m_file->Seek((long)pos, mode) ? (wxFileOffset)m_file->Tell() : wxInvalidOffset );
#ifdef __VMS
#pragma message enable intsignchange
#endif
return m_file->Seek(pos, mode) ? m_file->Tell() : wxInvalidOffset;
}
void wxFFileOutputStream::Sync()