]> git.saurik.com Git - wxWidgets.git/commitdiff
large files support for wxFFile (patch 1077980 from Mike Wetherell)
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 12 Dec 2004 11:53:53 +0000 (11:53 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 12 Dec 2004 11:53:53 +0000 (11:53 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30952 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

configure.in
docs/changes.txt
docs/latex/wx/ffile.tex
include/wx/ffile.h
setup.h.in
setup.h_vms
src/common/ffile.cpp
src/common/wfstream.cpp

index 445de1655b98fe4baa2665e28bcfb834e9fa88d0..75c2a01fac012832d38907752bd5faebf86d6752 100644 (file)
@@ -1789,6 +1789,7 @@ fi
 
 dnl check for large file support
 AC_SYS_LARGEFILE
 
 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
 
 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
index 4d176e8d743fb56ccc64f813264861f28769e5ea..04e981bdcd27eacc8b5ec1c1757fee56ac78db93 100644 (file)
@@ -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)
 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
 - 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:
 
 
 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
 - 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
index ada4a407af2400a44b368869766ac4db91003331..72a8fd768f0a5b1144c3d75c0b837c12077f47d7 100644 (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
 and returns \true on success.
 
 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}
 
 
 \membersection{wxFFile::Tell}\label{wxffiletell}
 
-\constfunc{size\_t}{Tell}{\void}
+\constfunc{wxFileOffset}{Tell}{\void}
 
 Returns the current position.
 
 
 Returns the current position.
 
index 8f8ffde0147c4677b2509b9a7f3d7a3f33b3a800..0236e154bfc6d3aac06b3b5b3c3f87f6a57ac4ec 100644 (file)
@@ -78,13 +78,13 @@ public:
 
   // file pointer operations (return ofsInvalid on failure)
     // move ptr ofs bytes related to start/current pos/end of file
 
   // 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
     // 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
   // IsOpened()!
 
   // simple accessors: note that Eof() and Error() may only be called if
   // IsOpened()!
index f89f8bfc5e9091c4f68123f01efa9c9293087a6a..cf035834e6eb4983b4661d80fbf3f55ac28d2ab6 100644 (file)
 /* Define this if you have _vsnwprintf */
 #undef HAVE__VSNWPRINTF
 
 /* 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
 
 /* Define this if you are using gtk and gdk contains support for X11R6 XIM */
 #undef HAVE_XIM
 
index e1e90daf61744f36afd11b4d9711f638be11bc53..b7689f5ccd968f9613834d1fc04964681a1e5caa 100644 (file)
 /* Define this if you are using gtk and gdk contains support for X11R6 XIM */
 #undef HAVE_XIM
 
 /* 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
    ---------------------------------------------------------------------
 /* ---------------------------------------------------------------------
    Win32 adjustments section
    ---------------------------------------------------------------------
index 866dc2ef6a348a99287ad981409761b5c5f23d07..a208dacb3ec124536650a4eb82e72f79bd796045 100644 (file)
 // 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);
-    if ( rc == -1 )
+    wxFileOffset rc = wxFtell(m_fp);
+    if ( rc == wxInvalidOffset )
     {
         wxLogSysError(_("Can't find current position in file '%s'"),
                       m_name.c_str());
     }
 
     {
         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
 
                  _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() )
         {
     {
         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
index af90722dd08a861976ba447d718f07e95b059f09..f66055242625c8bd543934fd3277220c5f665c78 100644 (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
-#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
 }
 
 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
-#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()
 }
 
 void wxFFileOutputStream::Sync()