BDataIO: Add methods {Read,Write}Exactly()
This commit is contained in:
@@ -89,6 +89,51 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\fn virtual status_t BDataIO::ReadExactly(void* buffer, size_t size, size_t* _bytesRead)
|
||||||
|
\brief Reads an exact amount of data from the object into a buffer.
|
||||||
|
|
||||||
|
This is a convenience wrapper method for Read() for code that expects the
|
||||||
|
exact number of bytes requested to be read. This method calls Read() in a
|
||||||
|
loop to read the data. It fails when Read() returns an error or fails to
|
||||||
|
read any more data (i.e. returns 0).
|
||||||
|
|
||||||
|
\param buffer Pointer to pre-allocated storage of at least \a size bytes
|
||||||
|
into which the data shall be read. Won't be dereferenced, when \a size
|
||||||
|
is 0.
|
||||||
|
\param size The number of bytes to be read.
|
||||||
|
\param _bytesRead Optional pointer to a pre-allocated size_t into which the
|
||||||
|
number of bytes actually read will be written. When the method returns
|
||||||
|
\c B_OK this will always be \a size. Can be \c NULL.
|
||||||
|
\return An error code indicated whether the method succeeded.
|
||||||
|
\retval B_OK All data have been read.
|
||||||
|
\retval B_PARTIAL_READ Read() didn't fail, but couldn't provide as many
|
||||||
|
bytes as requested.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
\fn virtual status_t BDataIO::WriteExactly(const void* buffer, size_t size, size_t* _bytesWritten)
|
||||||
|
\brief Writes an exact amount of data from a buffer to the object.
|
||||||
|
|
||||||
|
This is a convenience wrapper method for Write() for code that expects the
|
||||||
|
exact number of bytes given to be written. This method calls Write() in a
|
||||||
|
loop to write the data. It fails when Write() returns an error or fails to
|
||||||
|
write any more data (i.e. returns 0).
|
||||||
|
|
||||||
|
\param buffer Pointer to a buffer of at least \a size bytes containing the
|
||||||
|
data to be written. Won't be dereferenced, when \a size is 0.
|
||||||
|
\param size The number of bytes to be written.
|
||||||
|
\param _bytesWritten Optional pointer to a pre-allocated size_t into which
|
||||||
|
the number of bytes actually written will be written. When the method
|
||||||
|
returns \c B_OK this will always be \a size. Can be \c NULL.
|
||||||
|
\return An error code indicated whether the method succeeded.
|
||||||
|
\retval B_OK All data have been written.
|
||||||
|
\retval B_PARTIAL_READ Write() didn't fail, but couldn't write as many
|
||||||
|
bytes as provided.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
//////////// BPositionIO
|
//////////// BPositionIO
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,11 @@ public:
|
|||||||
virtual ssize_t Read(void* buffer, size_t size);
|
virtual ssize_t Read(void* buffer, size_t size);
|
||||||
virtual ssize_t Write(const void* buffer, size_t size);
|
virtual ssize_t Write(const void* buffer, size_t size);
|
||||||
|
|
||||||
|
status_t ReadExactly(void* buffer, size_t size,
|
||||||
|
size_t* _bytesRead = NULL);
|
||||||
|
status_t WriteExactly(const void* buffer, size_t size,
|
||||||
|
size_t* _bytesWritten = NULL);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
BDataIO(const BDataIO&);
|
BDataIO(const BDataIO&);
|
||||||
BDataIO& operator=(const BDataIO&);
|
BDataIO& operator=(const BDataIO&);
|
||||||
|
|||||||
@@ -38,6 +38,66 @@ BDataIO::Write(const void* buffer, size_t size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
BDataIO::ReadExactly(void* buffer, size_t size, size_t* _bytesRead)
|
||||||
|
{
|
||||||
|
uint8* out = (uint8*)buffer;
|
||||||
|
size_t bytesRemaining = size;
|
||||||
|
status_t error = B_OK;
|
||||||
|
|
||||||
|
while (bytesRemaining > 0) {
|
||||||
|
ssize_t bytesRead = Read(out, bytesRemaining);
|
||||||
|
if (bytesRead < 0) {
|
||||||
|
error = bytesRead;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bytesRead == 0) {
|
||||||
|
error = B_PARTIAL_READ;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
out += bytesRead;
|
||||||
|
bytesRemaining -= bytesRead;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_bytesRead != NULL)
|
||||||
|
*_bytesRead = size - bytesRemaining;
|
||||||
|
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
BDataIO::WriteExactly(const void* buffer, size_t size, size_t* _bytesWritten)
|
||||||
|
{
|
||||||
|
const uint8* in = (const uint8*)buffer;
|
||||||
|
size_t bytesRemaining = size;
|
||||||
|
status_t error = B_OK;
|
||||||
|
|
||||||
|
while (bytesRemaining > 0) {
|
||||||
|
ssize_t bytesWritten = Write(in, bytesRemaining);
|
||||||
|
if (bytesWritten < 0) {
|
||||||
|
error = bytesWritten;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bytesWritten == 0) {
|
||||||
|
error = B_PARTIAL_WRITE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
in += bytesWritten;
|
||||||
|
bytesRemaining -= bytesWritten;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_bytesWritten != NULL)
|
||||||
|
*_bytesWritten = size - bytesRemaining;
|
||||||
|
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Private or Reserved
|
// Private or Reserved
|
||||||
|
|
||||||
BDataIO::BDataIO(const BDataIO &)
|
BDataIO::BDataIO(const BDataIO &)
|
||||||
|
|||||||
Reference in New Issue
Block a user