* Copyright 2009-2011, Ingo Weinhold, ingo_weinhold@gmx.de.
* Distributed under the terms of the MIT License.
*/
#include <io_requests.h>
#include "IORequest.h"
static status_t
transfer_io_request_data(io_request* request, void* buffer, size_t size,
bool writeToRequest)
{
if (writeToRequest == request->IsWrite()
|| request->RemainingBytes() < size) {
return B_BAD_VALUE;
}
IOBuffer* ioBuffer = request->Buffer();
if (ioBuffer->IsUser() && !ioBuffer->IsMemoryLocked()) {
status_t error = ioBuffer->LockMemory(request->TeamID(),
!writeToRequest);
if (error != B_OK)
return error;
}
off_t offset = request->Offset() + request->TransferredBytes();
status_t error = writeToRequest
? request->CopyData(buffer, offset, size)
: request->CopyData(offset, buffer, size);
if (error != B_OK)
return error;
request->Advance(size);
return B_OK;
}
bool
io_request_is_write(const io_request* request)
{
return request->IsWrite();
}
bool
io_request_is_vip(const io_request* request)
{
return (request->Flags() & B_VIP_IO_REQUEST) != 0;
}
This is the immutable offset the request was created with;
read_from_io_request() and write_to_io_request() don't change it.
*/
off_t
io_request_offset(const io_request* request)
{
return request->Offset();
}
This is the immutable length the request was created with;
read_from_io_request() and write_to_io_request() don't change it.
*/
off_t
io_request_length(const io_request* request)
{
return request->Length();
}
the request's transferred data pointer.
Multiple calls to read_from_io_request() are allowed, but the total size
must not exceed io_request_length(request).
*/
status_t
read_from_io_request(io_request* request, void* buffer, size_t size)
{
return transfer_io_request_data(request, buffer, size, false);
}
the request's transferred data pointer.
Multiple calls to write_to_io_request() are allowed, but the total size
must not exceed io_request_length(request).
*/
status_t
write_to_io_request(io_request* request, const void* buffer, size_t size)
{
return transfer_io_request_data(request, (void*)buffer, size, true);
}
is finished.
*/
void
notify_io_request(io_request* request, status_t status)
{
request->SetStatusAndNotify(status);
}