From 859bc191b1096c02cebad011c75a4573289904e7 Mon Sep 17 00:00:00 2001 From: Markus Goetz Date: Wed, 6 Jan 2010 13:15:12 +0100 Subject: QIODevice: Fix readAll() My patch from yesterday did not have any effect: Instead of really using what was in the buffer, it used it but then read it from the underlying device anyway. Thanks Ritt Konstantin and Joao. Reviewed-by: joao --- src/corelib/io/qiodevice.cpp | 5 +++-- tests/auto/qfile/tst_qfile.cpp | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/corelib/io/qiodevice.cpp b/src/corelib/io/qiodevice.cpp index 1e98473..4e14ba8 100644 --- a/src/corelib/io/qiodevice.cpp +++ b/src/corelib/io/qiodevice.cpp @@ -970,6 +970,7 @@ QByteArray QIODevice::readAll() if (!(d->openMode & Text) && !d->buffer.isEmpty()) { result = d->buffer.readAll(); readBytes = result.size(); + d->pos += readBytes; } qint64 theSize; @@ -985,8 +986,8 @@ QByteArray QIODevice::readAll() } else { // Read it all in one go. // If resize fails, don't read anything. - result.resize(int(theSize - d->pos)); - readBytes = read(result.data(), result.size()); + result.resize(int(readBytes + theSize - d->pos)); + readBytes += read(result.data() + readBytes, result.size() - readBytes); } if (readBytes <= 0) diff --git a/tests/auto/qfile/tst_qfile.cpp b/tests/auto/qfile/tst_qfile.cpp index d3a607d..453434d 100644 --- a/tests/auto/qfile/tst_qfile.cpp +++ b/tests/auto/qfile/tst_qfile.cpp @@ -131,6 +131,7 @@ private slots: void readLineNullInLine(); void readAll_data(); void readAll(); + void readAllBuffer(); void readAllStdin(); void readLineStdin(); void readLineStdin_lineByLine(); @@ -390,6 +391,7 @@ void tst_QFile::cleanupTestCase() QFile::remove("myLink2.lnk"); QFile::remove("resources"); QFile::remove("qfile_map_testfile"); + QFile::remove("readAllBuffer.txt"); } //------------------------------------------ @@ -793,6 +795,38 @@ void tst_QFile::readAll() QCOMPARE(a, b); } +void tst_QFile::readAllBuffer() +{ + QString fileName = QLatin1String("readAllBuffer.txt"); + + QFile::remove(fileName); + + QFile writer(fileName); + QFile reader(fileName); + + QByteArray data1("This is arguably a very simple text."); + QByteArray data2("This is surely not as simple a test."); + + QVERIFY( writer.open(QIODevice::ReadWrite | QIODevice::Unbuffered) ); + QVERIFY( reader.open(QIODevice::ReadOnly) ); + + QCOMPARE( writer.write(data1), qint64(data1.size()) ); + QVERIFY( writer.seek(0) ); + + QByteArray result; + result = reader.read(18); + QCOMPARE( result.size(), 18 ); + + QCOMPARE( writer.write(data2), qint64(data2.size()) ); // new data, old version buffered in reader + QCOMPARE( writer.write(data2), qint64(data2.size()) ); // new data, unbuffered in reader + + result += reader.readAll(); + + QCOMPARE( result, data1 + data2 ); + + QFile::remove(fileName); +} + void tst_QFile::readAllStdin() { #if defined(Q_OS_WINCE) || defined(Q_OS_SYMBIAN) -- cgit v0.12