From 70a7bd90f9bdafd5ffbc89fd0b79b9e900d7dd22 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 12 Dec 2004 11:53:53 +0000 Subject: [PATCH] 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 --- configure.in | 1 + docs/changes.txt | 3 ++- docs/latex/wx/ffile.tex | 10 ++++----- include/wx/ffile.h | 8 +++---- setup.h.in | 3 +++ setup.h_vms | 3 +++ src/common/ffile.cpp | 47 +++++++++++++++++++++++++++++------------ src/common/wfstream.cpp | 18 ++-------------- 8 files changed, 54 insertions(+), 39 deletions(-) diff --git a/configure.in b/configure.in index 445de1655b..75c2a01fac 100644 --- a/configure.in +++ b/configure.in @@ -1789,6 +1789,7 @@ fi dnl check for large file support AC_SYS_LARGEFILE +AC_FUNC_FSEEKO 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 diff --git a/docs/changes.txt b/docs/changes.txt index 4d176e8d74..04e981bdcd 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -8,6 +8,7 @@ wxWidgets 2.5 Change Log - For more verbose changes, see the manual All: - 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órski) - Norwegian (Bokmål) translation added (Hans F. Nordhaug) - wxDynamicLibrary::HasSymbol() added @@ -90,7 +91,7 @@ wxUniv: 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) - fixed memory leak in wxURL when using a proxy (Steven Van Ingelgem) - fixed bug in wxDateTime::Set(jdn) when DST was in effect diff --git a/docs/latex/wx/ffile.tex b/docs/latex/wx/ffile.tex index ada4a407af..72a8fd768f 100644 --- a/docs/latex/wx/ffile.tex +++ b/docs/latex/wx/ffile.tex @@ -155,7 +155,7 @@ be used for an opened file. \membersection{wxFFile::Length}\label{wxffilelength} -\constfunc{size\_t}{Length}{\void} +\constfunc{wxFileOffset}{Length}{\void} Returns the length of the file. @@ -175,7 +175,7 @@ Opens the file, returning \true if successful. \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. @@ -192,7 +192,7 @@ The number of bytes read. \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. @@ -205,7 +205,7 @@ Seeks to the specified position and returns \true on success. \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 and returns \true on success. @@ -217,7 +217,7 @@ and returns \true on success. \membersection{wxFFile::Tell}\label{wxffiletell} -\constfunc{size\_t}{Tell}{\void} +\constfunc{wxFileOffset}{Tell}{\void} Returns the current position. diff --git a/include/wx/ffile.h b/include/wx/ffile.h index 8f8ffde014..0236e154bf 100644 --- a/include/wx/ffile.h +++ b/include/wx/ffile.h @@ -78,13 +78,13 @@ public: // file pointer operations (return ofsInvalid on failure) // 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 - bool SeekEnd(long ofs = 0) { return Seek(ofs, wxFromEnd); } + bool SeekEnd(wxFileOffset ofs = 0) { return Seek(ofs, wxFromEnd); } // get current position in the file - size_t Tell() const; + wxFileOffset Tell() const; // get current file length - size_t Length() const; + wxFileOffset Length() const; // simple accessors: note that Eof() and Error() may only be called if // IsOpened()! diff --git a/setup.h.in b/setup.h.in index f89f8bfc5e..cf035834e6 100644 --- a/setup.h.in +++ b/setup.h.in @@ -1294,6 +1294,9 @@ /* Define this if you 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 */ #undef HAVE_XIM diff --git a/setup.h_vms b/setup.h_vms index e1e90daf61..b7689f5ccd 100644 --- a/setup.h_vms +++ b/setup.h_vms @@ -1322,6 +1322,9 @@ /* Define this if you are using gtk and gdk contains support for X11R6 XIM */ #undef HAVE_XIM +/* Define if fseeko and ftello are available. */ +#undef HAVE_FSEEKO + /* --------------------------------------------------------------------- Win32 adjustments section --------------------------------------------------------------------- diff --git a/src/common/ffile.cpp b/src/common/ffile.cpp index 866dc2ef6a..a208dacb3e 100644 --- a/src/common/ffile.cpp +++ b/src/common/ffile.cpp @@ -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 diff --git a/src/common/wfstream.cpp b/src/common/wfstream.cpp index af90722dd0..f660552426 100644 --- a/src/common/wfstream.cpp +++ b/src/common/wfstream.cpp @@ -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() -- 2.45.2