]> 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
+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
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)
+- 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
index ada4a407af2400a44b368869766ac4db91003331..72a8fd768f0a5b1144c3d75c0b837c12077f47d7 100644 (file)
@@ -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.
 
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
-  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()!
index f89f8bfc5e9091c4f68123f01efa9c9293087a6a..cf035834e6eb4983b4661d80fbf3f55ac28d2ab6 100644 (file)
 /* 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
 
index e1e90daf61744f36afd11b4d9711f638be11bc53..b7689f5ccd968f9613834d1fc04964681a1e5caa 100644 (file)
 /* 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
    ---------------------------------------------------------------------
index 866dc2ef6a348a99287ad981409761b5c5f23d07..a208dacb3ec124536650a4eb82e72f79bd796045 100644 (file)
 // 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
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)
 {
-#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()