* Cleanup.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@37646 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2010-07-21 11:23:42 +00:00
parent 866e21d3a6
commit f6a57629c3
+107 -95
View File
@@ -1,5 +1,5 @@
/* /*
* Copyright 2006-2007, Haiku, Inc. All Rights Reserved. * Copyright 2006-2010, Haiku, Inc. All Rights Reserved.
* Distributed under the terms of the MIT License. * Distributed under the terms of the MIT License.
*/ */
#ifndef NET_BUFFER_UTILITIES_H #ifndef NET_BUFFER_UTILITIES_H
@@ -9,142 +9,154 @@
#include <net_buffer.h> #include <net_buffer.h>
extern net_buffer_module_info *gBufferModule; extern net_buffer_module_info* gBufferModule;
class NetBufferModuleGetter { class NetBufferModuleGetter {
public: public:
static net_buffer_module_info *Get() { return gBufferModule; } static net_buffer_module_info *Get() { return gBufferModule; }
}; };
//! A class to access a field safely across node boundaries //! A class to access a field safely across node boundaries
template<typename Type, int Offset, typename Module = NetBufferModuleGetter> template<typename Type, int Offset, typename Module = NetBufferModuleGetter>
class NetBufferFieldReader { class NetBufferFieldReader {
public: public:
NetBufferFieldReader(net_buffer *buffer) NetBufferFieldReader(net_buffer* buffer)
: :
fBuffer(buffer) fBuffer(buffer)
{ {
fStatus = Module::Get()->direct_access(fBuffer, Offset, fStatus = Module::Get()->direct_access(fBuffer, Offset, sizeof(Type),
sizeof(Type), (void **)&fData); (void**)&fData);
if (fStatus != B_OK) { if (fStatus != B_OK) {
fStatus = Module::Get()->read(fBuffer, Offset, fStatus = Module::Get()->read(fBuffer, Offset, &fDataBuffer,
&fDataBuffer, sizeof(Type)); sizeof(Type));
fData = &fDataBuffer; fData = &fDataBuffer;
}
} }
}
status_t status_t Status() const
Status() const {
{ return fStatus;
return fStatus; }
}
Type & Type& Data() const
Data() const {
{ return *fData;
return *fData; }
}
Type * Type* operator->() const
operator->() const {
{ return fData;
return fData; }
}
Type & Type& operator*() const
operator*() const {
{ return *fData;
return *fData; }
}
void void Sync()
Sync() {
{ if (fBuffer == NULL || fStatus < B_OK)
if (fBuffer == NULL || fStatus < B_OK) return;
return;
if (fData == &fDataBuffer) if (fData == &fDataBuffer)
Module::Get()->write(fBuffer, Offset, fData, sizeof(Type)); Module::Get()->write(fBuffer, Offset, fData, sizeof(Type));
fBuffer = NULL; fBuffer = NULL;
} }
protected: protected:
NetBufferFieldReader() {} NetBufferFieldReader()
{
}
net_buffer *fBuffer; net_buffer* fBuffer;
status_t fStatus; status_t fStatus;
Type *fData; Type* fData;
Type fDataBuffer; Type fDataBuffer;
}; };
//! Writes back any changed data on destruction
template<typename Type, int Offset, typename Module = NetBufferModuleGetter> template<typename Type, int Offset, typename Module = NetBufferModuleGetter>
class NetBufferField : public NetBufferFieldReader<Type, Offset, Module> { class NetBufferField : public NetBufferFieldReader<Type, Offset, Module> {
public: public:
NetBufferField(net_buffer *buffer) NetBufferField(net_buffer* buffer)
: NetBufferFieldReader<Type, Offset, Module>(buffer) :
{} NetBufferFieldReader<Type, Offset, Module>(buffer)
{
}
~NetBufferField() ~NetBufferField()
{ {
this->Sync(); // Note, "this->" is needed here for GCC4
} this->Sync();
}
}; };
//! Can remove the header from the buffer
template<typename Type, typename Module = NetBufferModuleGetter> template<typename Type, typename Module = NetBufferModuleGetter>
class NetBufferHeaderReader : public NetBufferFieldReader<Type, 0, Module> { class NetBufferHeaderReader : public NetBufferFieldReader<Type, 0, Module> {
public: public:
NetBufferHeaderReader(net_buffer *buffer) NetBufferHeaderReader(net_buffer* buffer)
: NetBufferFieldReader<Type, 0, Module>(buffer) :
{} NetBufferFieldReader<Type, 0, Module>(buffer)
{
}
void void Remove()
Remove() {
{ Remove(sizeof(Type));
this->Remove(sizeof(Type)); }
}
void void Remove(size_t bytes)
Remove(size_t bytes) {
{ if (this->fBuffer != NULL) {
if (this->fBuffer != NULL) { Module::Get()->remove_header(this->fBuffer, bytes);
Module::Get()->remove_header(this->fBuffer, bytes); this->fBuffer = NULL;
this->fBuffer = NULL;
}
} }
}
}; };
//! Removes the header on destruction
template<typename Type, typename Module = NetBufferModuleGetter> template<typename Type, typename Module = NetBufferModuleGetter>
class NetBufferHeaderRemover : public NetBufferHeaderReader<Type, Module> { class NetBufferHeaderRemover : public NetBufferHeaderReader<Type, Module> {
public: public:
NetBufferHeaderRemover(net_buffer *buffer) NetBufferHeaderRemover(net_buffer* buffer)
: NetBufferHeaderReader<Type, Module>(buffer) :
{} NetBufferHeaderReader<Type, Module>(buffer)
{
}
~NetBufferHeaderRemover() ~NetBufferHeaderRemover()
{ {
this->Remove(); this->Remove();
} }
}; };
//! A class to add a header to a buffer
//! A class to add a header to a buffer, syncs itself on destruction
template<typename Type, typename Module = NetBufferModuleGetter> template<typename Type, typename Module = NetBufferModuleGetter>
class NetBufferPrepend : public NetBufferFieldReader<Type, 0, Module> { class NetBufferPrepend : public NetBufferFieldReader<Type, 0, Module> {
public: public:
NetBufferPrepend(net_buffer *buffer, size_t size = sizeof(Type)) NetBufferPrepend(net_buffer* buffer, size_t size = sizeof(Type))
{ {
this->fBuffer = buffer; this->fBuffer = buffer;
this->fStatus = Module::Get()->prepend_size(buffer, size, this->fStatus = Module::Get()->prepend_size(buffer, size,
(void **)&(this->fData)); (void**)&this->fData);
if (this->fStatus == B_OK && this->fData == NULL) if (this->fStatus == B_OK && this->fData == NULL)
this->fData = &this->fDataBuffer; this->fData = &this->fDataBuffer;
} }
~NetBufferPrepend() ~NetBufferPrepend()
{ {
this->Sync(); this->Sync();
} }
}; };
#endif // NET_BUFFER_UTILITIES_H #endif // NET_BUFFER_UTILITIES_H