1// ShareAttrDir.h
2
3#ifndef NET_FS_SHARE_ATTR_DIR_H
4#define NET_FS_SHARE_ATTR_DIR_H
5
6#include <fs_attr.h>
7
8#include "ShareAttrDirIterator.h"
9#include "SLList.h"
10
11class AttrDirInfo;
12class AttributeInfo;
13class BNode;
14
15// Attribute
16class Attribute : public SLListLinkImpl<Attribute> {
17								Attribute(const char* name,
18									const attr_info& info, const void* data);
19								~Attribute();
20public:
21	static	status_t			CreateAttribute(const char* name,
22									const attr_info& info, const void* data,
23									Attribute** attribute);
24	static	void				DeleteAttribute(Attribute* attribute);
25
26			const char*			GetName() const;
27			void				GetInfo(attr_info* info) const;
28			uint32				GetType() const;
29			off_t				GetSize() const;
30			const void*			GetData() const;
31
32private:
33			attr_info			fInfo;
34			char				fDataAndName[1];
35};
36
37// ShareAttrDir
38class ShareAttrDir {
39public:
40								ShareAttrDir();
41								~ShareAttrDir();
42
43			status_t			Init(const AttrDirInfo& dirInfo);
44			status_t			Update(const AttrDirInfo& dirInfo,
45									DoublyLinkedList<ShareAttrDirIterator>*
46										iterators);
47
48			void				SetRevision(int64 revision);
49			int64				GetRevision() const;
50
51			void				SetUpToDate(bool upToDate);
52			bool				IsUpToDate() const;
53
54			// These modifying methods are currently used internally only.
55			// Init()/Update() should be sufficient.
56			void				ClearAttrDir();
57
58			status_t			AddAttribute(const char* name,
59									const attr_info& info, const void* data);
60			bool				RemoveAttribute(const char* name);
61			void				RemoveAttribute(Attribute* attribute);
62
63			Attribute*			GetAttribute(const char* name) const;
64			Attribute*			GetFirstAttribute() const;
65			Attribute*			GetNextAttribute(Attribute* attribute) const;
66
67private:
68			status_t			_GetAttributes(const AttrDirInfo& dirInfo,
69									Attribute**& attributes, int32& count);
70
71private:
72			SLList<Attribute>	fAttributes;
73// TODO: Rethink whether we rather want an array.
74			int64				fRevision;
75			bool				fUpToDate;	// to enforce reloading even if
76											// a revision is cached
77};
78
79#endif	// NET_FS_SHARE_ATTR_DIR_H
80