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