X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f281f29f89a06dffd4a9357623e4d7a247419dc9..931d6a47c32a5b4c283243cb553ce71ee2b535d5:/src/common/ffile.cpp?ds=sidebyside diff --git a/src/common/ffile.cpp b/src/common/ffile.cpp index 78cf20c8c3..0f479565d2 100644 --- a/src/common/ffile.cpp +++ b/src/common/ffile.cpp @@ -1,10 +1,9 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: ffile.cpp +// Name: src/common/ffile.cpp // Purpose: wxFFile encapsulates "FILE *" IO stream // Author: Vadim Zeitlin // Modified by: // Created: 14.07.99 -// RCS-ID: $Id$ // Copyright: (c) 1998 Vadim Zeitlin // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -17,10 +16,6 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "ffile.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -33,6 +28,11 @@ #ifndef WX_PRECOMP #include "wx/intl.h" #include "wx/log.h" + #include "wx/crt.h" +#endif + +#ifdef __WINDOWS__ +#include "wx/msw/mslu.h" #endif #include "wx/ffile.h" @@ -41,43 +41,31 @@ // 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 // ---------------------------------------------------------------------------- -wxFFile::wxFFile(const wxChar *filename, const wxChar *mode) +wxFFile::wxFFile(const wxString& filename, const wxString& mode) { - Detach(); + m_fp = NULL; (void)Open(filename, mode); } -bool wxFFile::Open(const wxChar *filename, const wxChar *mode) +bool wxFFile::Open(const wxString& filename, const wxString& mode) { wxASSERT_MSG( !m_fp, wxT("should close or detach the old file first") ); - m_fp = wxFopen(filename, mode); + FILE* const fp = wxFopen(filename, mode); - if ( !m_fp ) + if ( !fp ) { wxLogSysError(_("can't open file '%s'"), filename); return false; } - m_name = filename; + Attach(fp, filename); return true; } @@ -93,7 +81,7 @@ bool wxFFile::Close() return false; } - Detach(); + m_fp = NULL; } return true; @@ -103,41 +91,42 @@ bool wxFFile::Close() // read/write // ---------------------------------------------------------------------------- -bool wxFFile::ReadAll(wxString *str, wxMBConv& conv) +bool wxFFile::ReadAll(wxString *str, const wxMBConv& conv) { wxCHECK_MSG( str, false, wxT("invalid parameter") ); wxCHECK_MSG( IsOpened(), false, wxT("can't read from closed file") ); wxCHECK_MSG( Length() >= 0, false, wxT("invalid length") ); - size_t length = (size_t)Length(); + size_t length = wx_truncate_cast(size_t, Length()); wxCHECK_MSG( (wxFileOffset)length == Length(), false, wxT("huge file not supported") ); clearerr(m_fp); - const size_t fileLen = Length(); - wxCharBuffer buf(fileLen + 1); + wxCharBuffer buf(length); - // note that realLen may be less than fileLen for text files with DOS EOLs + // note that real length may be less than file length for text files with DOS EOLs // ('\r's get dropped by CRT when reading which means that we have // realLen = fileLen - numOfLinesInTheFile) - size_t realLen = fread(buf.data(), sizeof(char), fileLen, m_fp); + length = fread(buf.data(), 1, length, m_fp); - if ( Error() ) + if ( Error() ) { wxLogSysError(_("Read error on file '%s'"), m_name.c_str()); return false; } - buf.data()[realLen] = 0; - *str = wxString(buf, conv); + buf.data()[length] = 0; + + wxString strTmp(buf, conv); + str->swap(strTmp); return true; } size_t wxFFile::Read(void *pBuf, size_t nCount) { - wxCHECK_MSG( pBuf, FALSE, wxT("invalid parameter") ); - wxCHECK_MSG( IsOpened(), FALSE, wxT("can't read from closed file") ); + wxCHECK_MSG( pBuf, 0, wxT("invalid parameter") ); + wxCHECK_MSG( IsOpened(), 0, wxT("can't read from closed file") ); size_t nRead = fread(pBuf, 1, nCount, m_fp); if ( (nRead < nCount) && Error() ) @@ -150,8 +139,8 @@ size_t wxFFile::Read(void *pBuf, size_t nCount) size_t wxFFile::Write(const void *pBuf, size_t nCount) { - wxCHECK_MSG( pBuf, FALSE, wxT("invalid parameter") ); - wxCHECK_MSG( IsOpened(), FALSE, wxT("can't write to closed file") ); + wxCHECK_MSG( pBuf, 0, wxT("invalid parameter") ); + wxCHECK_MSG( IsOpened(), 0, wxT("can't write to closed file") ); size_t nWritten = fwrite(pBuf, 1, nCount, m_fp); if ( nWritten < nCount ) @@ -162,13 +151,21 @@ size_t wxFFile::Write(const void *pBuf, size_t nCount) return nWritten; } +bool wxFFile::Write(const wxString& s, const wxMBConv& conv) +{ + const wxWX2MBbuf buf = s.mb_str(conv); + if ( !buf ) + return false; + + const size_t size = strlen(buf); // FIXME: use buf.length() when available + return Write(buf, size) == size; +} + bool wxFFile::Flush() { if ( IsOpened() ) { - // fflush returns non-zero on error - // - if ( fflush(m_fp) ) + if ( fflush(m_fp) != 0 ) { wxLogSysError(_("failed to flush the file '%s'"), m_name.c_str()); @@ -207,7 +204,7 @@ bool wxFFile::Seek(wxFileOffset ofs, wxSeekMode mode) break; } -#ifndef HAVE_FSEEKO +#ifndef wxHAS_LARGE_FFILES if ((long)ofs != ofs) { wxLogError(_("Seek error on file '%s' (large files not supported by stdio)"), m_name.c_str()); @@ -231,7 +228,7 @@ bool wxFFile::Seek(wxFileOffset ofs, wxSeekMode mode) wxFileOffset wxFFile::Tell() const { wxCHECK_MSG( IsOpened(), wxInvalidOffset, - _T("wxFFile::Tell(): file is closed!") ); + wxT("wxFFile::Tell(): file is closed!") ); wxFileOffset rc = wxFtell(m_fp); if ( rc == wxInvalidOffset ) @@ -246,9 +243,9 @@ wxFileOffset wxFFile::Tell() const wxFileOffset wxFFile::Length() const { wxCHECK_MSG( IsOpened(), wxInvalidOffset, - _T("wxFFile::Length(): file is closed!") ); + wxT("wxFFile::Length(): file is closed!") ); - wxFFile& self = *(wxFFile *)this; // const_cast + wxFFile& self = *const_cast(this); wxFileOffset posOld = Tell(); if ( posOld != wxInvalidOffset )