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
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
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
\membersection{wxFFile::Length}\label{wxffilelength}
-\constfunc{size\_t}{Length}{\void}
+\constfunc{wxFileOffset}{Length}{\void}
Returns the length of the file.
\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.
\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.
\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.
\membersection{wxFFile::Tell}\label{wxffiletell}
-\constfunc{size\_t}{Tell}{\void}
+\constfunc{wxFileOffset}{Tell}{\void}
Returns the current position.
// 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()!
/* 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
+/* Define if fseeko and ftello are available. */
+#undef HAVE_FSEEKO
+
/* ---------------------------------------------------------------------
Win32 adjustments section
---------------------------------------------------------------------
// 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
// ----------------------------------------------------------------------------
// 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") );
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());
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);
}
}
- return (size_t)-1;
+ return wxInvalidOffset;
}
#endif // wxUSE_FFILE
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 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()