xref: /haiku/src/add-ons/kernel/file_systems/reiserfs/Item.h (revision 2f470aec1c92ce6917b8a903e343795dc77af41f)
1 // Item.h
2 //
3 // Copyright (c) 2003, Ingo Weinhold (bonefish@cs.tu-berlin.de)
4 //
5 // This program is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation; either version 2 of the License, or
8 // (at your option) any later version.
9 //
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software
17 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18 //
19 // You can alternatively use *this file* under the terms of the the MIT
20 // license included in this package.
21 
22 #ifndef ITEM_H
23 #define ITEM_H
24 
25 #include "endianess.h"
26 #include "reiserfs.h"
27 #include "Key.h"
28 
29 class LeafNode;
30 
31 // ItemHeader
32 class ItemHeader : private item_head {
33 public:
34 	ItemHeader() {}
35 
36 	uint16 GetLen() const { return le2h(ih_item_len); }
37 	uint16 GetLocation() const { return le2h(ih_item_location); }
38 	uint16 GetVersion() const { return le2h(ih_version); }
39 	const Key *GetKey() const { return Key::CastFrom(&ih_key); }
40 	VKey *GetKey(VKey *k) const { k->SetTo(GetKey(), GetVersion()); return k; }
41 
42 	// indirect item only
43 	uint16 GetFreeSpaceReserved() const
44 	{
45 		return (GetVersion() == KEY_FORMAT_3_6
46 			? 0 : le2h(u.ih_free_space_reserved));
47 	}
48 
49 	// directory item only
50 	uint16 GetEntryCount() const { return le2h(u.ih_entry_count); }
51 
52 	uint32 GetDirID() const { return GetKey()->GetDirID(); }
53 	uint32 GetObjectID() const { return GetKey()->GetObjectID(); }
54 	uint64 GetOffset() const { return GetKey()->GetOffset(GetVersion()); }
55 	uint16 GetType() const { return GetKey()->GetType(GetVersion()); }
56 } _PACKED;
57 
58 
59 // Item
60 class Item {
61 public:
62 	Item();
63 	Item(const Item &item);
64 	Item(LeafNode *node, const ItemHeader *header);
65 	~Item();
66 
67 	status_t SetTo(LeafNode *node, const ItemHeader *header);
68 	status_t SetTo(LeafNode *node, int32 index);
69 	void Unset();
70 
71 	LeafNode *GetNode() const;
72 	ItemHeader *GetHeader() const;
73 	int32 GetIndex() const;
74 
75 	void *GetData() const;
76 	uint16 GetLen() const;
77 	uint16 GetType() const;
78 	uint32 GetDirID() const;
79 	uint32 GetObjectID() const;
80 	uint64 GetOffset() const;
81 	const Key *GetKey() const;
82 	VKey *GetKey(VKey *k) const;
83 
84 	uint16 GetEntryCount() const;
85 
86 	status_t Check() const;
87 
88 	Item &operator=(const Item &item);
89 
90 protected:
91 	LeafNode	*fNode;
92 	ItemHeader	*fHeader;
93 };
94 
95 #endif	// ITEM_H
96