Files
haiku-beta6/headers/private/net/NetBufferUtilities.h
T

159 lines
2.9 KiB
C++
Raw Normal View History

/*
* Copyright 2006, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef NET_BUFFER_UTILITIES_H
#define NET_BUFFER_UTILITIES_H
#include <net_buffer.h>
extern net_buffer_module_info *gBufferModule;
class NetBufferModuleGetter {
public:
static net_buffer_module_info *Get() { return gBufferModule; }
};
2007-04-11 16:40:40 +00:00
//! A class to access a field safely across node boundaries
template<typename Type, int Offset, typename Module = NetBufferModuleGetter>
class NetBufferFieldReader {
public:
2007-04-11 16:40:40 +00:00
NetBufferFieldReader(net_buffer *buffer)
:
2007-04-11 16:40:40 +00:00
fBuffer(buffer),
fStatus(B_BAD_VALUE)
{
2007-04-11 16:40:40 +00:00
if ((Offset + sizeof(Type)) <= buffer->size) {
fStatus = Module::Get()->direct_access(fBuffer, Offset,
sizeof(Type), (void **)&fData);
if (fStatus != B_OK) {
fData = NULL;
fStatus = Module::Get()->read(fBuffer, Offset,
&fDataBuffer, sizeof(Type));
}
}
}
status_t
Status()
{
2007-04-11 16:40:40 +00:00
return fStatus;
}
Type &
Data()
{
2007-04-11 16:40:40 +00:00
if (fData != NULL)
return *fData;
return fDataBuffer;
}
2007-04-11 16:40:40 +00:00
Type *
operator->()
{
2007-04-11 16:40:40 +00:00
return &Data();
}
2007-04-11 16:40:40 +00:00
Type &
operator*()
{
2007-04-11 16:40:40 +00:00
return Data();
}
void
2007-04-11 16:40:40 +00:00
Sync()
{
2007-04-11 16:40:40 +00:00
if (fBuffer == NULL)
return;
if (fData == NULL)
Module::Get()->write(fBuffer, Offset, &fDataBuffer,
sizeof(Type));
fBuffer = NULL;
}
2007-04-11 16:40:40 +00:00
protected:
NetBufferFieldReader() {}
net_buffer *fBuffer;
2007-04-11 16:40:40 +00:00
status_t fStatus;
Type *fData;
Type fDataBuffer;
};
2007-04-11 16:40:40 +00:00
template<typename Type, int Offset, typename Module = NetBufferModuleGetter>
class NetBufferField : public NetBufferFieldReader<Type, Offset, Module> {
public:
2007-04-11 16:40:40 +00:00
NetBufferField(net_buffer *buffer)
: NetBufferFieldReader<Type, Offset, Module>(buffer)
{}
2007-04-11 16:40:40 +00:00
~NetBufferField()
{
2007-04-11 16:40:40 +00:00
Sync();
}
2007-04-11 16:40:40 +00:00
};
2007-04-11 16:40:40 +00:00
template<typename Type, typename Module = NetBufferModuleGetter>
class NetBufferHeaderReader : public NetBufferFieldReader<Type, 0, Module> {
public:
NetBufferHeaderReader(net_buffer *buffer)
: NetBufferFieldReader<Type, 0, Module>(buffer)
{}
2007-04-11 16:40:40 +00:00
void
Remove()
{
2007-04-11 16:40:40 +00:00
Remove(sizeof(Type));
}
void
2007-04-11 16:40:40 +00:00
Remove(size_t bytes)
{
2007-04-11 16:40:40 +00:00
if (fBuffer != NULL) {
Module::Get()->remove_header(fBuffer, bytes);
fBuffer = NULL;
}
}
2007-04-11 16:40:40 +00:00
};
2007-04-11 16:40:40 +00:00
template<typename Type, typename Module = NetBufferModuleGetter>
class NetBufferHeaderRemover : public NetBufferHeaderReader<Type, Module> {
public:
NetBufferHeaderRemover(net_buffer *buffer)
: NetBufferHeaderReader<Type, Module>(buffer)
{}
2007-04-11 16:40:40 +00:00
~NetBufferHeaderRemover()
{
Remove();
}
};
//! A class to add a header to a buffer
template<typename Type, typename Module = NetBufferModuleGetter>
2007-04-11 16:40:40 +00:00
class NetBufferPrepend : public NetBufferFieldReader<Type, 0, Module> {
public:
NetBufferPrepend(net_buffer *buffer, size_t size = 0)
{
fBuffer = buffer;
fData = NULL;
if (size == 0)
size = sizeof(Type);
fStatus = Module::Get()->prepend_size(buffer, size, (void **)&fData);
}
2007-04-11 16:40:40 +00:00
~NetBufferPrepend()
{
Sync();
}
};
#endif // NET_BUFFER_UTILITIES_H