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:
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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.
|
||||||
|
|
||||||
|
@@ -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()!
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
@@ -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
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
|
@@ -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
|
||||||
|
@@ -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()
|
||||||
|
Reference in New Issue
Block a user