diff options
Diffstat (limited to 'src/input')
-rw-r--r-- | src/input/InputStream.cxx | 31 | ||||
-rw-r--r-- | src/input/InputStream.hxx | 19 |
2 files changed, 49 insertions, 1 deletions
diff --git a/src/input/InputStream.cxx b/src/input/InputStream.cxx index 419c4f07f..bf6fd198e 100644 --- a/src/input/InputStream.cxx +++ b/src/input/InputStream.cxx @@ -133,9 +133,38 @@ InputStream::LockRead(void *ptr, size_t _size, Error &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(); } - diff --git a/src/input/InputStream.hxx b/src/input/InputStream.hxx index 84b4f3fae..3733b20a5 100644 --- a/src/input/InputStream.hxx +++ b/src/input/InputStream.hxx @@ -363,6 +363,25 @@ public: */ gcc_nonnull_all size_t LockRead(void *ptr, size_t size, Error &error); + + /** + * Reads the whole data from the stream into the caller-supplied buffer. + * + * The caller must lock the mutex. + * + * @param ptr the buffer to read into + * @param size the number of bytes to read + * @return true if the whole data was read, false otherwise. + */ + gcc_nonnull_all + bool ReadFull(void *ptr, size_t size, Error &error); + + /** + * Wrapper for ReadFull() which locks and unlocks the mutex; + * the caller must not be holding it already. + */ + gcc_nonnull_all + bool LockReadFull(void *ptr, size_t size, Error &error); }; #endif |