#ifndef _ATTRIBUTE_STREAM_H
#define _ATTRIBUTE_STREAM_H
#include <ObjectList.h>
#include <Node.h>
#include <Rect.h>
#include <String.h>
#include <TypeConstants.h>
#include <fs_attr.h>
namespace BPrivate {
struct AttributeTemplate {
const char* fAttributeName;
uint32 fAttributeType;
off_t fSize;
const char* fBits;
};
class AttributeInfo {
public:
AttributeInfo();
AttributeInfo(const AttributeInfo& other);
AttributeInfo(const char* name, attr_info info);
AttributeInfo(const char* name, uint32 type, off_t size);
void SetTo(const AttributeInfo& other);
void SetTo(const char* name, attr_info info);
void SetTo(const char* name, uint32 type, off_t size);
const char* Name() const;
uint32 Type() const;
off_t Size() const;
private:
BString fName;
attr_info fInfo;
};
class AttributeStreamNode {
public:
AttributeStreamNode();
virtual ~AttributeStreamNode();
AttributeStreamNode &operator<<(AttributeStreamNode &source);
virtual void Rewind();
virtual void MakeEmpty() {}
virtual off_t Contains(const char*, uint32);
virtual off_t Read(const char* name, const char* foreignName,
uint32 type, off_t size, void* buffer, void (*swapFunc)(void*) = 0);
virtual off_t Write(const char* name, const char* foreignName,
uint32 type, off_t size, const void* buffer);
virtual bool Drive();
virtual const AttributeInfo* Next();
virtual const char* Get();
virtual bool Fill(char* buffer) const;
virtual bool CanFeed() const { return false; }
private:
bool Start();
void Detach();
protected:
AttributeStreamNode* fReadFrom;
AttributeStreamNode* fWriteTo;
};
class AttributeStreamFileNode : public AttributeStreamNode {
public:
AttributeStreamFileNode();
AttributeStreamFileNode(BNode*);
virtual void MakeEmpty();
virtual void Rewind();
virtual off_t Contains(const char* name, uint32 type);
virtual off_t Read(const char* name, const char* foreignName, uint32 type,
off_t size, void* buffer, void (*swapFunc)(void*) = 0);
virtual off_t Write(const char* name, const char* foreignName, uint32 type,
off_t size, const void* buffer);
void SetTo(BNode*);
BNode* Node() { return fNode; }
protected:
virtual bool CanFeed() const { return true; }
virtual bool Drive();
virtual const AttributeInfo* Next();
virtual const char* Get();
virtual bool Fill(char* buffer) const;
private:
AttributeInfo fCurrentAttr;
BNode* fNode;
typedef AttributeStreamNode _inherited;
};
class AttributeStreamMemoryNode : public AttributeStreamNode {
public:
AttributeStreamMemoryNode();
virtual void MakeEmpty();
virtual off_t Contains(const char* name, uint32 type);
virtual off_t Read(const char* name, const char* foreignName,
uint32 type, off_t size, void* buffer, void (*swapFunc)(void*) = 0);
virtual off_t Write(const char* name, const char* foreignName,
uint32 type, off_t size, const void* buffer);
protected:
virtual bool CanFeed() const { return true; }
virtual void Rewind();
virtual bool Drive();
virtual const AttributeInfo* Next();
virtual const char* Get();
virtual bool Fill(char* buffer) const;
class AttrNode {
public:
AttrNode(const char* name, uint32 type, off_t size, char* data)
:
fAttr(name, type, size),
fData(data)
{
}
~AttrNode()
{
delete[] fData;
}
AttributeInfo fAttr;
char* fData;
};
virtual AttrNode* BufferingGet();
virtual AttrNode* BufferingGet(const char* name, uint32 type, off_t size);
int32 Find(const char* name, uint32 type) const;
private:
BObjectList<AttrNode, true> fAttributes;
int32 fCurrentIndex;
typedef AttributeStreamNode _inherited;
};
class AttributeStreamTemplateNode : public AttributeStreamNode {
public:
AttributeStreamTemplateNode(const AttributeTemplate*, int32 count);
virtual off_t Contains(const char* name, uint32 type);
protected:
virtual bool CanFeed() const { return true; }
virtual void Rewind();
virtual const AttributeInfo* Next();
virtual const char* Get();
virtual bool Fill(char* buffer) const;
int32 Find(const char* name, uint32 type) const;
private:
AttributeInfo fCurrentAttr;
const AttributeTemplate* fAttributes;
int32 fCurrentIndex;
int32 fCount;
typedef AttributeStreamNode _inherited;
};
class AttributeStreamFilterNode : public AttributeStreamNode {
public:
AttributeStreamFilterNode()
{}
virtual off_t Contains(const char* name, uint32 type);
virtual off_t Read(const char* name, const char* foreignName,
uint32 type, off_t size, void* buffer, void (*swapFunc)(void*) = 0);
virtual off_t Write(const char* name, const char* foreignName,
uint32 type, off_t size, const void* buffer);
protected:
virtual bool Reject(const char* name, uint32 type, off_t size);
virtual const AttributeInfo* Next();
private:
typedef AttributeStreamNode _inherited;
};
class NamesToAcceptAttrFilter : public AttributeStreamFilterNode {
public:
NamesToAcceptAttrFilter(const char**);
protected:
virtual bool Reject(const char* name, uint32 type, off_t size);
private:
const char** fNameList;
};
class SelectiveAttributeTransformer : public AttributeStreamNode {
public:
SelectiveAttributeTransformer(const char* attributeName,
bool (*)(const char*, uint32 , off_t , void*, void*), void* params);
virtual ~SelectiveAttributeTransformer();
virtual off_t Read(const char* name, const char* foreignName, uint32 type,
off_t size, void* buffer, void (*swapFunc)(void*) = 0);
virtual void Rewind();
protected:
virtual bool WillTransform(const char* name, uint32 type, off_t size,
const char* data) const;
virtual char* CopyAndApplyTransformer(const char* name, uint32 type,
off_t size, const char* data);
virtual bool ApplyTransformer(const char* name, uint32 type, off_t size,
char* data);
virtual const AttributeInfo* Next();
virtual const char* Get();
private:
AttributeInfo fCurrentAttr;
const char* fAttributeNameToTransform;
bool (*fTransformFunc)(const char*, uint32 , off_t , void*, void*);
void* fTransformParams;
BObjectList<char> fTransformedBuffers;
typedef AttributeStreamNode _inherited;
};
template <class Type>
class AttributeStreamConstValue : public AttributeStreamNode {
public:
AttributeStreamConstValue(const char* name, uint32 attributeType,
Type value);
protected:
virtual bool CanFeed() const { return true; }
virtual void Rewind() { fRewound = true; }
virtual const AttributeInfo* Next();
virtual const char* Get();
virtual bool Fill(char* buffer) const;
int32 Find(const char* name, uint32 type) const;
private:
AttributeInfo fAttr;
Type fValue;
bool fRewound;
typedef AttributeStreamNode _inherited;
};
template<class Type>
AttributeStreamConstValue<Type>::AttributeStreamConstValue(const char* name,
uint32 attributeType, Type value)
:
fAttr(name, attributeType, sizeof(Type)),
fValue(value),
fRewound(true)
{
}
template<class Type>
const AttributeInfo*
AttributeStreamConstValue<Type>::Next()
{
if (!fRewound)
return NULL;
fRewound = false;
return &fAttr;
}
template<class Type>
const char*
AttributeStreamConstValue<Type>::Get()
{
return (const char*)&fValue;
}
template<class Type>
bool
AttributeStreamConstValue<Type>::Fill(char* buffer) const
{
memcpy(buffer, &fValue, sizeof(Type));
return true;
}
template<class Type>
int32
AttributeStreamConstValue<Type>::Find(const char* name, uint32 type) const
{
if (strcmp(fAttr.Name(), name) == 0 && type == fAttr.Type())
return 0;
return -1;
}
class AttributeStreamBoolValue : public AttributeStreamConstValue<bool> {
public:
AttributeStreamBoolValue(const char* name, bool value)
:
AttributeStreamConstValue<bool>(name, B_BOOL_TYPE, value)
{
}
};
class AttributeStreamInt32Value : public AttributeStreamConstValue<int32> {
public:
AttributeStreamInt32Value(const char* name, int32 value)
:
AttributeStreamConstValue<int32>(name, B_INT32_TYPE, value)
{
}
};
class AttributeStreamInt64Value : public AttributeStreamConstValue<int64> {
public:
AttributeStreamInt64Value(const char* name, int64 value)
:
AttributeStreamConstValue<int64>(name, B_INT64_TYPE, value)
{
}
};
class AttributeStreamRectValue : public AttributeStreamConstValue<BRect> {
public:
AttributeStreamRectValue(const char* name, BRect value)
:
AttributeStreamConstValue<BRect>(name, B_RECT_TYPE, value)
{
}
};
class AttributeStreamFloatValue : public AttributeStreamConstValue<float> {
public:
AttributeStreamFloatValue(const char* name, float value)
:
AttributeStreamConstValue<float>(name, B_FLOAT_TYPE, value)
{
}
};
}
using namespace BPrivate;
#endif