Files
haiku-beta6/src/servers/app/RAMLinkMsgReader.cpp
T

79 lines
1.2 KiB
C++
Raw Normal View History

2004-10-14 01:23:00 +00:00
#include "RAMLinkMsgReader.h"
#include <stdlib.h>
#include <string.h>
2004-10-14 01:23:00 +00:00
RAMLinkMsgReader::RAMLinkMsgReader(int8 *buffer)
: BPrivate::LinkReceiver(-1)
2004-10-14 01:23:00 +00:00
{
SetBuffer(buffer);
}
RAMLinkMsgReader::RAMLinkMsgReader(void)
: BPrivate::LinkReceiver(-1)
2004-10-14 01:23:00 +00:00
{
SetBuffer(NULL);
2004-10-14 01:23:00 +00:00
}
RAMLinkMsgReader::~RAMLinkMsgReader(void)
{
// Note that this class does NOT take responsibility for the buffer it reads from.
}
void
RAMLinkMsgReader::SetBuffer(int8 *buffer)
2004-10-14 01:23:00 +00:00
{
if (!buffer) {
fBuffer = NULL;
fAttachStart = NULL;
fPosition = NULL;
fAttachSize = 0;
fCode = B_ERROR;
2004-10-14 01:23:00 +00:00
return;
}
fBuffer = buffer;
fPosition = fBuffer + 4;
fCode = *((int32*)fBuffer);
fAttachSize = *((size_t *)fPosition);
fPosition += sizeof(size_t);
fAttachStart = fPosition;
2004-10-14 01:23:00 +00:00
}
int8 *
RAMLinkMsgReader::GetBuffer(void)
2004-10-14 01:23:00 +00:00
{
return fBuffer;
}
size_t
RAMLinkMsgReader::GetBufferSize(void)
2004-10-14 01:23:00 +00:00
{
return fAttachSize;
}
status_t
RAMLinkMsgReader::Read(void *data, ssize_t size)
2004-10-14 01:23:00 +00:00
{
if (!fBuffer || fAttachSize == 0)
2004-10-14 01:23:00 +00:00
return B_NO_INIT;
if (size < 1)
2004-10-14 01:23:00 +00:00
return B_BAD_VALUE;
if (fPosition + size > fAttachStart + fAttachSize) {
2004-10-14 01:23:00 +00:00
// read past end of buffer
return B_BAD_VALUE;
}
2004-10-14 01:23:00 +00:00
memcpy(data, fPosition, size);
fPosition += size;
2004-10-14 01:23:00 +00:00
return B_OK;
}