#ifndef NET_FS_ATTRIBUTE_DIRECTORY_H
#define NET_FS_ATTRIBUTE_DIRECTORY_H
#include <fs_attr.h>
#include "SLList.h"
class BNode;
enum {
ATTRIBUTE_DIRECTORY_NOT_LOADED,
ATTRIBUTE_DIRECTORY_VALID,
ATTRIBUTE_DIRECTORY_TOO_BIG,
};
class Attribute : public SLListLinkImpl<Attribute> {
Attribute(const char* name,
const attr_info& info, const void* data);
~Attribute();
public:
static status_t CreateAttribute(const char* name,
const attr_info& info, const void* data,
Attribute** attribute);
static void DeleteAttribute(Attribute* attribute);
const char* GetName() const;
void GetInfo(attr_info* info) const;
uint32 GetType() const;
off_t GetSize() const;
const void* GetData() const;
private:
attr_info fInfo;
char fDataAndName[1];
};
class AttributeDirectory {
public:
AttributeDirectory();
virtual ~AttributeDirectory();
uint32 GetAttrDirStatus() const;
bool IsAttrDirValid() const;
status_t LoadAttrDir();
void ClearAttrDir();
status_t AddAttribute(const char* name,
const attr_info& info, const void* data);
bool RemoveAttribute(const char* name);
void RemoveAttribute(Attribute* attribute);
status_t UpdateAttribute(const char* name, bool* removed,
attr_info* info, const void** data);
Attribute* GetAttribute(const char* name) const;
Attribute* GetFirstAttribute() const;
Attribute* GetNextAttribute(Attribute* attribute) const;
virtual status_t OpenNode(BNode& node) = 0;
private:
status_t _LoadAttribute(BNode& node, const char* name,
attr_info& info, void* data,
bool& dataLoaded);
private:
SLList<Attribute> fAttributes;
uint32 fStatus;
};
#endif