Fix fatal bug in the recently added wxFile::ReadAll().
Make sure we exit the loop when reading the file in chunks in wxFile::ReadAll() and add a unit test for it to ensure that it's really correct. Closes #14725. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@72614 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -295,7 +295,7 @@ bool wxFile::ReadAll(wxString *str, const wxMBConv& conv)
|
|||||||
{
|
{
|
||||||
wxCHECK_MSG( str, false, wxS("Output string must be non-NULL") );
|
wxCHECK_MSG( str, false, wxS("Output string must be non-NULL") );
|
||||||
|
|
||||||
size_t length = wx_truncate_cast(size_t, Length());
|
ssize_t length = Length();
|
||||||
wxCHECK_MSG( (wxFileOffset)length == Length(), false, wxT("huge file not supported") );
|
wxCHECK_MSG( (wxFileOffset)length == Length(), false, wxT("huge file not supported") );
|
||||||
|
|
||||||
wxCharBuffer buf(length);
|
wxCharBuffer buf(length);
|
||||||
@@ -309,6 +309,10 @@ bool wxFile::ReadAll(wxString *str, const wxMBConv& conv)
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
p += nread;
|
p += nread;
|
||||||
|
if ( length <= nread )
|
||||||
|
break;
|
||||||
|
|
||||||
|
length -= nread;
|
||||||
}
|
}
|
||||||
|
|
||||||
*p = 0;
|
*p = 0;
|
||||||
|
@@ -34,6 +34,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
CPPUNIT_TEST_SUITE( FileTestCase );
|
CPPUNIT_TEST_SUITE( FileTestCase );
|
||||||
|
CPPUNIT_TEST( ReadAll );
|
||||||
#if wxUSE_UNICODE
|
#if wxUSE_UNICODE
|
||||||
CPPUNIT_TEST( RoundTripUTF8 );
|
CPPUNIT_TEST( RoundTripUTF8 );
|
||||||
CPPUNIT_TEST( RoundTripUTF16 );
|
CPPUNIT_TEST( RoundTripUTF16 );
|
||||||
@@ -42,6 +43,7 @@ private:
|
|||||||
CPPUNIT_TEST( TempFile );
|
CPPUNIT_TEST( TempFile );
|
||||||
CPPUNIT_TEST_SUITE_END();
|
CPPUNIT_TEST_SUITE_END();
|
||||||
|
|
||||||
|
void ReadAll();
|
||||||
#if wxUSE_UNICODE
|
#if wxUSE_UNICODE
|
||||||
void RoundTripUTF8() { DoRoundTripTest(wxConvUTF8); }
|
void RoundTripUTF8() { DoRoundTripTest(wxConvUTF8); }
|
||||||
void RoundTripUTF16() { DoRoundTripTest(wxMBConvUTF16()); }
|
void RoundTripUTF16() { DoRoundTripTest(wxMBConvUTF16()); }
|
||||||
@@ -65,6 +67,29 @@ CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( FileTestCase, "FileTestCase" );
|
|||||||
// tests implementation
|
// tests implementation
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void FileTestCase::ReadAll()
|
||||||
|
{
|
||||||
|
TestFile tf;
|
||||||
|
|
||||||
|
const char* text = "Ream\nde";
|
||||||
|
|
||||||
|
{
|
||||||
|
wxFile fout(tf.GetName(), wxFile::write);
|
||||||
|
CPPUNIT_ASSERT( fout.IsOpened() );
|
||||||
|
fout.Write(text, strlen(text));
|
||||||
|
CPPUNIT_ASSERT( fout.Close() );
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
wxFile fin(tf.GetName(), wxFile::read);
|
||||||
|
CPPUNIT_ASSERT( fin.IsOpened() );
|
||||||
|
|
||||||
|
wxString s;
|
||||||
|
CPPUNIT_ASSERT( fin.ReadAll(&s) );
|
||||||
|
CPPUNIT_ASSERT_EQUAL( text, s );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#if wxUSE_UNICODE
|
#if wxUSE_UNICODE
|
||||||
|
|
||||||
void FileTestCase::DoRoundTripTest(const wxMBConv& conv)
|
void FileTestCase::DoRoundTripTest(const wxMBConv& conv)
|
||||||
|
Reference in New Issue
Block a user