From 3e15dde39639521641eef1508c2de56ebd5ac319 Mon Sep 17 00:00:00 2001
From: Vadim Zeitlin <vadim@wxwidgets.org>
Date: Sat, 19 Feb 2005 15:53:04 +0000
Subject: [PATCH] added wxMBConv parameter for wxFFile::ReadAll() and
 documented it (improved patch 1041642)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@32187 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 docs/changes.txt        |  1 +
 docs/latex/wx/ffile.tex | 18 ++++++++++++++++++
 include/wx/ffile.h      |  2 +-
 src/common/ffile.cpp    | 26 +++++++++-----------------
 4 files changed, 29 insertions(+), 18 deletions(-)

diff --git a/docs/changes.txt b/docs/changes.txt
index bffd44543c..6f30ee8830 100644
--- a/docs/changes.txt
+++ b/docs/changes.txt
@@ -51,6 +51,7 @@ All:
 - Various changes to how wxListCtrl and wxTreeCtrl react to right
   mouse clicks and left mouse click for starting a drag operation.
 - "Alt" key (VK_MENU) now results in WXK_ALT keyboard event, not WXK_MENU
+- wxFFile::ReadAll() now takes an optional wxMBConv parameter
 
 
 All (GUI):
diff --git a/docs/latex/wx/ffile.tex b/docs/latex/wx/ffile.tex
index 3db99c9ffd..569fa17f0a 100644
--- a/docs/latex/wx/ffile.tex
+++ b/docs/latex/wx/ffile.tex
@@ -208,6 +208,24 @@ Reads the specified number of bytes into a buffer, returning the actual number r
 The number of bytes read.
 
 
+\membersection{wxFFile::ReadAll}\label{wxffilereadall}
+
+\func{bool}{ReadAll}{\param{wxString *}{ str}, \param{wxMBConv\&}{ conv = wxConvUTF8}}
+
+Reads the entire contents of the file into a string.
+
+\wxheading{Parameters}
+
+\docparam{str}{String to read data into.}
+
+\docparam{conv}{Conversion object to use in Unicode build; by default supposes
+that file contents is encoded in UTF-8.}
+
+\wxheading{Return value}
+
+\true if file was read successfully, \false otherwise.
+
+
 \membersection{wxFFile::Seek}\label{wxffileseek}
 
 \func{bool}{Seek}{\param{wxFileOffset }{ofs}, \param{wxSeekMode }{mode = wxFromStart}}
diff --git a/include/wx/ffile.h b/include/wx/ffile.h
index f61a97fd29..6b63bded48 100644
--- a/include/wx/ffile.h
+++ b/include/wx/ffile.h
@@ -60,7 +60,7 @@ public:
 
   // read/write (unbuffered)
     // read all data from the file into a string (useful for text files)
-  bool ReadAll(wxString *str);
+  bool ReadAll(wxString *str, wxMBConv& conv = wxConvUTF8);
     // returns number of bytes read - use Eof() and Error() to see if an error
     // occured or not
   size_t Read(void *pBuf, size_t nCount);
diff --git a/src/common/ffile.cpp b/src/common/ffile.cpp
index 736bbea55f..42a43f2cb4 100644
--- a/src/common/ffile.cpp
+++ b/src/common/ffile.cpp
@@ -103,7 +103,7 @@ bool wxFFile::Close()
 // read/write
 // ----------------------------------------------------------------------------
 
-bool wxFFile::ReadAll(wxString *str)
+bool wxFFile::ReadAll(wxString *str, wxMBConv& conv)
 {
     wxCHECK_MSG( str, false, wxT("invalid parameter") );
     wxCHECK_MSG( IsOpened(), false, wxT("can't read from closed file") );
@@ -113,26 +113,18 @@ bool wxFFile::ReadAll(wxString *str)
 
     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() )
+    const size_t fileLen = Length();
+    wxCharBuffer buf(fileLen + 1);
+    if ( (fread(buf.data(), sizeof(char), fileLen, m_fp) < fileLen) || Error() ) 
     {
-        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
+        wxLogSysError(_("Read error on file '%s'"), m_name.c_str());
 
-        buf[nRead] = 0;
-        *str += buf;
+        return false;
     }
 
+    buf.data()[fileLen] = 0;
+    *str = wxString(buf, conv);
+
     return true;
 }
 
-- 
2.50.0

