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/trunk@76798 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2014-06-30 01:00:45 +00:00
parent 866515c39e
commit 496bcff52b
2 changed files with 34 additions and 12 deletions

View File

@@ -351,17 +351,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