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

@@ -1789,6 +1789,7 @@ fi
dnl check for large file support dnl check for large file support
AC_SYS_LARGEFILE AC_SYS_LARGEFILE
AC_FUNC_FSEEKO
dnl we need to define _FILE_OFFSET_BITS or _LARGE_FILES on the compiler command dnl we need to define _FILE_OFFSET_BITS or _LARGE_FILES on the compiler command
dnl line because otherwise the system headers risk being included before dnl line because otherwise the system headers risk being included before

View File

@@ -8,6 +8,7 @@ wxWidgets 2.5 Change Log - For more verbose changes, see the manual
All: All:
- new classes for reading and writing ZIP files (M.J.Wetherell) - new classes for reading and writing ZIP files (M.J.Wetherell)
- large files support for wxFFile (M.J.Wetherell)
- classes in the manual are now cross-referenced (Zbigniew Zag<61>rski) - classes in the manual are now cross-referenced (Zbigniew Zag<61>rski)
- Norwegian (Bokm<6B>l) translation added (Hans F. Nordhaug) - Norwegian (Bokm<6B>l) translation added (Hans F. Nordhaug)
- wxDynamicLibrary::HasSymbol() added - wxDynamicLibrary::HasSymbol() added
@@ -90,7 +91,7 @@ wxUniv:
All: All:
- support for huge (>2 Gb) files (Tim Kosse) - support for large (>2 Gb) files in wxFile (Tim Kosse)
- number of fixes to wxPluginManager (Rick Brice, Hans Van Leemputten) - number of fixes to wxPluginManager (Rick Brice, Hans Van Leemputten)
- fixed memory leak in wxURL when using a proxy (Steven Van Ingelgem) - fixed memory leak in wxURL when using a proxy (Steven Van Ingelgem)
- fixed bug in wxDateTime::Set(jdn) when DST was in effect - fixed bug in wxDateTime::Set(jdn) when DST was in effect

View File

@@ -155,7 +155,7 @@ be used for an opened file.
\membersection{wxFFile::Length}\label{wxffilelength} \membersection{wxFFile::Length}\label{wxffilelength}
\constfunc{size\_t}{Length}{\void} \constfunc{wxFileOffset}{Length}{\void}
Returns the length of the file. Returns the length of the file.
@@ -175,7 +175,7 @@ Opens the file, returning \true if successful.
\membersection{wxFFile::Read}\label{wxffileread} \membersection{wxFFile::Read}\label{wxffileread}
\func{size\_t}{Read}{\param{void*}{ buffer}, \param{off\_t}{ count}} \func{size\_t}{Read}{\param{void*}{ buffer}, \param{size\_t}{ count}}
Reads the specified number of bytes into a buffer, returning the actual number read. Reads the specified number of bytes into a buffer, returning the actual number read.
@@ -192,7 +192,7 @@ The number of bytes read.
\membersection{wxFFile::Seek}\label{wxffileseek} \membersection{wxFFile::Seek}\label{wxffileseek}
\func{bool}{Seek}{\param{long }{ofs}, \param{wxSeekMode }{mode = wxFromStart}} \func{bool}{Seek}{\param{wxFileOffset }{ofs}, \param{wxSeekMode }{mode = wxFromStart}}
Seeks to the specified position and returns \true on success. Seeks to the specified position and returns \true on success.
@@ -205,7 +205,7 @@ Seeks to the specified position and returns \true on success.
\membersection{wxFFile::SeekEnd}\label{wxffileseekend} \membersection{wxFFile::SeekEnd}\label{wxffileseekend}
\func{bool}{SeekEnd}{\param{long }{ofs = 0}} \func{bool}{SeekEnd}{\param{wxFileOffset }{ofs = 0}}
Moves the file pointer to the specified number of bytes before the end of the file Moves the file pointer to the specified number of bytes before the end of the file
and returns \true on success. and returns \true on success.
@@ -217,7 +217,7 @@ and returns \true on success.
\membersection{wxFFile::Tell}\label{wxffiletell} \membersection{wxFFile::Tell}\label{wxffiletell}
\constfunc{size\_t}{Tell}{\void} \constfunc{wxFileOffset}{Tell}{\void}
Returns the current position. Returns the current position.

View File

@@ -78,13 +78,13 @@ public:
// file pointer operations (return ofsInvalid on failure) // file pointer operations (return ofsInvalid on failure)
// move ptr ofs bytes related to start/current pos/end of file // move ptr ofs bytes related to start/current pos/end of file
bool Seek(long ofs, wxSeekMode mode = wxFromStart); bool Seek(wxFileOffset ofs, wxSeekMode mode = wxFromStart);
// move ptr to ofs bytes before the end // move ptr to ofs bytes before the end
bool SeekEnd(long ofs = 0) { return Seek(ofs, wxFromEnd); } bool SeekEnd(wxFileOffset ofs = 0) { return Seek(ofs, wxFromEnd); }
// get current position in the file // get current position in the file
size_t Tell() const; wxFileOffset Tell() const;
// get current file length // get current file length
size_t Length() const; wxFileOffset Length() const;
// simple accessors: note that Eof() and Error() may only be called if // simple accessors: note that Eof() and Error() may only be called if
// IsOpened()! // IsOpened()!

View File

@@ -1294,6 +1294,9 @@
/* Define this if you have _vsnwprintf */ /* Define this if you have _vsnwprintf */
#undef HAVE__VSNWPRINTF #undef HAVE__VSNWPRINTF
/* Define if fseeko and ftello are available. */
#undef HAVE_FSEEKO
/* Define this if you are using gtk and gdk contains support for X11R6 XIM */ /* Define this if you are using gtk and gdk contains support for X11R6 XIM */
#undef HAVE_XIM #undef HAVE_XIM

View File

@@ -1322,6 +1322,9 @@
/* Define this if you are using gtk and gdk contains support for X11R6 XIM */ /* Define this if you are using gtk and gdk contains support for X11R6 XIM */
#undef HAVE_XIM #undef HAVE_XIM
/* Define if fseeko and ftello are available. */
#undef HAVE_FSEEKO
/* --------------------------------------------------------------------- /* ---------------------------------------------------------------------
Win32 adjustments section Win32 adjustments section
--------------------------------------------------------------------- ---------------------------------------------------------------------

View File

@@ -41,6 +41,18 @@
// implementation // 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 // opening the file
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -170,7 +182,7 @@ bool wxFFile::Flush()
// seeking // 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") ); wxCHECK_MSG( IsOpened(), false, wxT("can't seek on closed file") );
@@ -194,7 +206,16 @@ bool wxFFile::Seek(long ofs, wxSeekMode mode)
break; 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()); wxLogSysError(_("Seek error on file '%s'"), m_name.c_str());
@@ -204,34 +225,34 @@ bool wxFFile::Seek(long ofs, wxSeekMode mode)
return true; 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!") ); _T("wxFFile::Tell(): file is closed!") );
long rc = ftell(m_fp); wxFileOffset rc = wxFtell(m_fp);
if ( rc == -1 ) if ( rc == wxInvalidOffset )
{ {
wxLogSysError(_("Can't find current position in file '%s'"), wxLogSysError(_("Can't find current position in file '%s'"),
m_name.c_str()); 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!") ); _T("wxFFile::Length(): file is closed!") );
wxFFile& self = *(wxFFile *)this; // const_cast wxFFile& self = *(wxFFile *)this; // const_cast
size_t posOld = Tell(); wxFileOffset posOld = Tell();
if ( posOld != (size_t)-1 ) if ( posOld != wxInvalidOffset )
{ {
if ( self.SeekEnd() ) if ( self.SeekEnd() )
{ {
size_t len = Tell(); wxFileOffset len = Tell();
(void)self.Seek(posOld); (void)self.Seek(posOld);
@@ -239,7 +260,7 @@ size_t wxFFile::Length() const
} }
} }
return (size_t)-1; return wxInvalidOffset;
} }
#endif // wxUSE_FFILE #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) wxFileOffset wxFFileInputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode)
{ {
#ifdef __VMS return m_file->Seek(pos, mode) ? m_file->Tell() : wxInvalidOffset;
#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
} }
wxFileOffset wxFFileInputStream::OnSysTell() const wxFileOffset wxFFileInputStream::OnSysTell() const
@@ -331,14 +324,7 @@ wxFileOffset wxFFileOutputStream::OnSysTell() const
wxFileOffset wxFFileOutputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode) wxFileOffset wxFFileOutputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode)
{ {
#ifdef __VMS return m_file->Seek(pos, mode) ? m_file->Tell() : wxInvalidOffset;
#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
} }
void wxFFileOutputStream::Sync() void wxFFileOutputStream::Sync()