InputStream: add ReadFull method

Convenient method that behave differently than Read, and that will be used by
tag scanners.

This method will return in case of error, if the whole data is read or is EOF
is reached.
This commit is contained in:
Thomas Guillem
2015-06-05 16:27:10 +02:00
committed by Max Kellermann
parent 90e7ace980
commit 6e2d7445c5
2 changed files with 49 additions and 1 deletions

View File

@@ -132,10 +132,39 @@ InputStream::LockRead(void *ptr, size_t _size, Error &error)
return Read(ptr, _size, error);
}
bool
InputStream::ReadFull(void *_ptr, size_t _size, Error &error)
{
uint8_t *ptr = (uint8_t *)_ptr;
size_t nbytes_total = 0;
while (_size > 0) {
size_t nbytes = Read(ptr + nbytes_total, _size, error);
if (nbytes == 0)
return false;
nbytes_total += nbytes;
_size -= nbytes;
}
return true;
}
bool
InputStream::LockReadFull(void *ptr, size_t _size, Error &error)
{
#if !CLANG_CHECK_VERSION(3,6)
/* disabled on clang due to -Wtautological-pointer-compare */
assert(ptr != nullptr);
#endif
assert(_size > 0);
const ScopeLock protect(mutex);
return ReadFull(ptr, _size, error);
}
bool
InputStream::LockIsEOF()
{
const ScopeLock protect(mutex);
return IsEOF();
}