Fixed atEnd() and bytesAvailable() to consider QIODevice buffered data
This commit is contained in:
parent
d4c34ce65b
commit
43dd4b0a7f
2 changed files with 12 additions and 2 deletions
|
@ -213,6 +213,7 @@ qint64 QuaZIODevice::readData(char *data, qint64 maxSize)
|
|||
case Z_STREAM_END:
|
||||
read = (char *) d->zins.next_out - data;
|
||||
d->inBufPos = (char *) d->zins.next_in - d->inBuf;
|
||||
d->atEnd = true;
|
||||
return read;
|
||||
case Z_BUF_ERROR: // this should never happen, but just in case
|
||||
if (!d->zBufError) {
|
||||
|
@ -323,10 +324,16 @@ bool QuaZIODevice::isSequential() const
|
|||
|
||||
bool QuaZIODevice::atEnd() const
|
||||
{
|
||||
return (openMode() == NotOpen) || d->atEnd;
|
||||
// Here we MUST check QIODevice::bytesAvailable() because WE
|
||||
// might have reached the end, but QIODevice didn't--
|
||||
// it could have simply pre-buffered all remaining data.
|
||||
return (openMode() == NotOpen) || (QIODevice::bytesAvailable() == 0 && d->atEnd);
|
||||
}
|
||||
|
||||
qint64 QuaZIODevice::bytesAvailable() const
|
||||
{
|
||||
return (atEnd() ? 0 : 1) + QIODevice::bytesAvailable();
|
||||
// If we haven't recevied Z_STREAM_END, it means that
|
||||
// we have at least one more input byte available.
|
||||
// Plus whatever QIODevice has buffered.
|
||||
return (d->atEnd ? 0 : 1) + QIODevice::bytesAvailable();
|
||||
}
|
||||
|
|
|
@ -74,6 +74,9 @@ void TestQuaZIODevice::readMany()
|
|||
QCOMPARE(testDevice.read(outBuf, 4), static_cast<qint64>(4));
|
||||
QVERIFY(!testDevice.atEnd());
|
||||
QVERIFY(testDevice.bytesAvailable() > 0);
|
||||
QCOMPARE(testDevice.read(4).size(), 4);
|
||||
QCOMPARE(testDevice.bytesAvailable(), static_cast<qint64>(0));
|
||||
QVERIFY(testDevice.atEnd());
|
||||
testDevice.close();
|
||||
QVERIFY(!testDevice.isOpen());
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue