1. new wxFFile class - as wxFile but uses fopen/fread/fseek... instead of
open/read/seek... 2. wxTextCtrlBase appears, several bug fixes in MSW wxTextCtrl and made LoadFile() behave in the same way under GTK and MSW (fixed it for MSW too) 3. Corrected the sash position calculation in sashwin.cpp - seems to work now but I wonder how it could ever work before? 4. new, tmake generated, MSW makefiles. They probably don't work - will fix them as soon as people start complaining. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3004 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
235
src/common/ffile.cpp
Normal file
235
src/common/ffile.cpp
Normal file
@@ -0,0 +1,235 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: 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 <zeitlin@dptmaths.ens-cachan.fr>
|
||||
// Licence: wxWindows license
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// ============================================================================
|
||||
// declarations
|
||||
// ============================================================================
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// headers
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation "ffile.h"
|
||||
#endif
|
||||
|
||||
// For compilers that support precompilation, includes "wx.h".
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#if wxUSE_FILE
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#endif
|
||||
|
||||
#include "wx/ffile.h"
|
||||
|
||||
// ============================================================================
|
||||
// implementation
|
||||
// ============================================================================
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// opening the file
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
wxFFile::wxFFile(const wxChar *filename, const char *mode)
|
||||
{
|
||||
Detach();
|
||||
|
||||
(void)Open(filename, mode);
|
||||
}
|
||||
|
||||
bool wxFFile::Open(const wxChar *filename, const char *mode)
|
||||
{
|
||||
wxASSERT_MSG( !m_fp, _T("should close or detach the old file first") );
|
||||
|
||||
m_fp = fopen(filename, mode);
|
||||
|
||||
if ( !m_fp )
|
||||
{
|
||||
wxLogSysError(_("can't open file '%s'"), filename);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
m_name = filename;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool wxFFile::Close()
|
||||
{
|
||||
if ( IsOpened() )
|
||||
{
|
||||
if ( !fclose(m_fp) )
|
||||
{
|
||||
wxLogSysError(_("can't close file '%s'"), m_name.c_str());
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Detach();
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// read/write
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
bool wxFFile::ReadAll(wxString *str)
|
||||
{
|
||||
wxCHECK_MSG( str, FALSE, _T("invalid parameter") );
|
||||
wxCHECK_MSG( IsOpened(), FALSE, _T("can't read from closed file") );
|
||||
|
||||
clearerr(m_fp);
|
||||
|
||||
str->Empty();
|
||||
str->Alloc(Length());
|
||||
|
||||
wxChar buf[1024];
|
||||
static const size_t nSize = WXSIZEOF(buf) - 1; // -1 for trailing '\0'
|
||||
while ( !Eof() )
|
||||
{
|
||||
size_t nRead = fread(buf, sizeof(wxChar), nSize, m_fp);
|
||||
if ( (nRead < nSize) && Error() )
|
||||
{
|
||||
wxLogSysError(_("Read error on file '%s'"), m_name.c_str());
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
//else: just EOF
|
||||
|
||||
buf[nRead] = 0;
|
||||
*str += buf;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
size_t wxFFile::Read(void *pBuf, size_t nCount)
|
||||
{
|
||||
wxCHECK_MSG( pBuf, FALSE, _T("invalid parameter") );
|
||||
wxCHECK_MSG( IsOpened(), FALSE, _T("can't read from closed file") );
|
||||
|
||||
size_t nRead = fread(pBuf, 1, nCount, m_fp);
|
||||
if ( (nRead < nCount) && Error() )
|
||||
{
|
||||
wxLogSysError(_("Read error on file '%s'"), m_name.c_str());
|
||||
}
|
||||
|
||||
return nRead;
|
||||
}
|
||||
|
||||
size_t wxFFile::Write(const void *pBuf, size_t nCount)
|
||||
{
|
||||
wxCHECK_MSG( pBuf, FALSE, _T("invalid parameter") );
|
||||
wxCHECK_MSG( IsOpened(), FALSE, _T("can't write to closed file") );
|
||||
|
||||
size_t nWritten = fwrite(pBuf, 1, nCount, m_fp);
|
||||
if ( nWritten < nCount )
|
||||
{
|
||||
wxLogSysError(_("Write error on file '%s'"), m_name.c_str());
|
||||
}
|
||||
|
||||
return nWritten;
|
||||
}
|
||||
|
||||
bool wxFFile::Flush()
|
||||
{
|
||||
if ( IsOpened() )
|
||||
{
|
||||
if ( !fflush(m_fp) )
|
||||
{
|
||||
wxLogSysError(_("failed to flush the file '%s'"), m_name.c_str());
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// seeking
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
bool wxFFile::Seek(long ofs, wxSeekMode mode)
|
||||
{
|
||||
wxCHECK_MSG( IsOpened(), FALSE, _T("can't seek on closed file") );
|
||||
|
||||
int origin;
|
||||
switch ( mode )
|
||||
{
|
||||
default:
|
||||
wxFAIL_MSG(_T("unknown seek mode"));
|
||||
// still fall through
|
||||
|
||||
case wxFromStart:
|
||||
origin = SEEK_SET;
|
||||
break;
|
||||
|
||||
case wxFromCurrent:
|
||||
origin = SEEK_CUR;
|
||||
break;
|
||||
|
||||
case wxFromEnd:
|
||||
origin = SEEK_END;
|
||||
break;
|
||||
}
|
||||
|
||||
if ( fseek(m_fp, ofs, origin) != 0 )
|
||||
{
|
||||
wxLogSysError(_("Seek error on file '%s'"), m_name.c_str());
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
size_t wxFFile::Tell() const
|
||||
{
|
||||
long rc = ftell(m_fp);
|
||||
if ( rc == -1 )
|
||||
{
|
||||
wxLogSysError(_("Can't find current position in file '%s'"),
|
||||
m_name.c_str());
|
||||
}
|
||||
|
||||
return (size_t)rc;
|
||||
}
|
||||
|
||||
size_t wxFFile::Length() const
|
||||
{
|
||||
wxFFile& self = *(wxFFile *)this; // const_cast
|
||||
|
||||
size_t posOld = Tell();
|
||||
if ( posOld != (size_t)-1 )
|
||||
{
|
||||
if ( self.SeekEnd() )
|
||||
{
|
||||
size_t len = Tell();
|
||||
|
||||
(void)self.Seek(posOld);
|
||||
|
||||
return len;
|
||||
}
|
||||
}
|
||||
|
||||
return (size_t)-1;
|
||||
}
|
||||
|
||||
#endif // wxUSE_FILE
|
||||
Reference in New Issue
Block a user