#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;
}
off_t
io_request_offset(const io_request* request)
{
return request->Offset();
}
off_t
io_request_length(const io_request* request)
{
return request->Length();
}
status_t
read_from_io_request(io_request* request, void* buffer, size_t size)
{
return transfer_io_request_data(request, buffer, size, false);
}
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);
}
void
notify_io_request(io_request* request, status_t status)
{
request->SetStatusAndNotify(status);
}