1/*
2 * Copyright 2010, Jérôme Duval, korli@users.berlios.de.
3 * Copyright 2004-2008, Axel Dörfler, axeld@pinc-software.de.
4 * This file may be used under the terms of the MIT License.
5 */
6#ifndef ATTRIBUTE_H
7#define ATTRIBUTE_H
8
9
10#include "CachedBlock.h"
11#include "Inode.h"
12
13
14struct attr_cookie {
15	char	name[B_ATTR_NAME_LENGTH];
16	uint32	type;
17	int		open_mode;
18	bool	create;
19};
20
21
22class Attribute {
23public:
24							Attribute(Inode* inode);
25							Attribute(Inode* inode, attr_cookie* cookie);
26							~Attribute();
27
28			status_t		InitCheck();
29			status_t		CheckAccess(const char* name, int openMode);
30
31			status_t		Find(const char* name);
32			status_t		Find(int32 index);
33			status_t		GetName(char* name, size_t* _nameLength);
34			void			Put();
35
36			status_t		Create(const char* name, type_code type,
37								int openMode, attr_cookie** _cookie);
38			status_t		Open(const char* name, int openMode,
39								attr_cookie** _cookie);
40
41			status_t		Stat(struct stat& stat);
42
43			status_t		Read(attr_cookie* cookie, off_t pos, uint8* buffer,
44								size_t* _length);
45			status_t		Write(Transaction& transaction, attr_cookie* cookie,
46								off_t pos, const uint8* buffer,
47								size_t* _length, bool* _created);
48
49private:
50			status_t		_Truncate();
51			status_t		_Find(const char* name, int32 index);
52			status_t		_FindAttributeBody(const uint8* start, const uint8* end,
53								const char* name, int32 index, int32 *count,
54								ext2_xattr_entry** entry);
55			status_t		_FindAttributeBlock(const uint8* start, const uint8* end,
56								const char* name, int32 index, int32 *count,
57								ext2_xattr_entry** entry);
58			status_t 		_FindAttribute(const uint8* start, const uint8* end,
59								const char* name, int32 index, int32 *count,
60								ext2_xattr_entry** entry);
61			status_t		_PrefixedName(ext2_xattr_entry* entry, char* _name,
62								size_t* _nameLength);
63
64			::Volume*		fVolume;
65			CachedBlock		fBlock;
66			Inode*			fInode;
67			ext2_xattr_entry* fBodyEntry;
68			ext2_xattr_entry* fBlockEntry;
69			const char*		fName;
70};
71
72#endif	// ATTRIBUTE_H
73