Check for conversion failure correctly in wx[F]File::Write().

Check for the length of the buffer to determine whether the conversion failed
instead of checking whether it's NULL because this is currently never the case
because of the code in wxString::AsCharBuf() which returns "" and not NULL in
case of conversion failure.

This at least eliminates silent data loss when saving data that can't be
converted to the current locale encoding.

Closes #16348.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_3_0_BRANCH@76793 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2014-06-30 01:00:16 +00:00
parent c78b1fa01c
commit 73052bd106
3 changed files with 35 additions and 12 deletions

View File

@@ -579,6 +579,7 @@ Major new features in this release
All:
- Fix silent data loss in wx[F]File::Write(wxString) if conversion fails.
- Make wxString::FromCDouble() work when the global C++ locale is not the C one.
wxMSW:

View File

@@ -153,17 +153,28 @@ size_t wxFFile::Write(const void *pBuf, size_t nCount)
bool wxFFile::Write(const wxString& s, const wxMBConv& conv)
{
const wxWX2MBbuf buf = s.mb_str(conv);
if ( !buf )
return false;
// Writing nothing always succeeds -- and simplifies the check for
// conversion failure below.
if ( s.empty() )
return true;
const wxWX2MBbuf buf = s.mb_str(conv);
#if wxUSE_UNICODE
const size_t size = buf.length();
const size_t size = buf.length();
if ( !size )
{
// This means that the conversion failed as the original string wasn't
// empty (we explicitly checked for this above) and in this case we
// must fail too to indicate that we can't save the data.
return false;
}
#else
const size_t size = s.length();
const size_t size = s.length();
#endif
return Write(buf, size) == size;
return Write(buf, size) == size;
}
bool wxFFile::Flush()

View File

@@ -356,17 +356,28 @@ size_t wxFile::Write(const void *pBuf, size_t nCount)
bool wxFile::Write(const wxString& s, const wxMBConv& conv)
{
const wxWX2MBbuf buf = s.mb_str(conv);
if ( !buf )
return false;
// Writing nothing always succeeds -- and simplifies the check for
// conversion failure below.
if ( s.empty() )
return true;
const wxWX2MBbuf buf = s.mb_str(conv);
#if wxUSE_UNICODE
const size_t size = buf.length();
const size_t size = buf.length();
if ( !size )
{
// This means that the conversion failed as the original string wasn't
// empty (we explicitly checked for this above) and in this case we
// must fail too to indicate that we can't save the data.
return false;
}
#else
const size_t size = s.length();
const size_t size = s.length();
#endif
return Write(buf, size) == size;
return Write(buf, size) == size;
}
// flush