1/*
2 * Copyright 2002-2011, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _NODE_H
6#define _NODE_H
7
8
9#include <Statable.h>
10
11
12class BDirectory;
13class BEntry;
14class BString;
15struct entry_ref;
16
17
18struct node_ref {
19	node_ref();
20	node_ref(const node_ref& ref);
21
22	bool operator==(const node_ref& ref) const;
23	bool operator!=(const node_ref& ref) const;
24	node_ref& operator=(const node_ref& ref);
25
26	dev_t device;
27	ino_t node;
28};
29
30
31class BNode : public BStatable {
32public:
33								BNode();
34								BNode(const entry_ref* ref);
35								BNode(const BEntry* entry);
36								BNode(const char* path);
37								BNode(const BDirectory* dir, const char* path);
38								BNode(const BNode& node);
39	virtual						~BNode();
40
41			status_t			InitCheck() const;
42
43	virtual	status_t			GetStat(struct stat* st) const;
44
45			status_t			SetTo(const entry_ref* ref);
46			status_t			SetTo(const BEntry* entry);
47			status_t			SetTo(const char* path);
48			status_t			SetTo(const BDirectory* dir, const char* path);
49			void				Unset();
50
51			status_t			Lock();
52			status_t			Unlock();
53
54			status_t			Sync();
55
56			ssize_t				WriteAttr(const char* name, type_code type,
57									off_t offset, const void* buffer,
58									size_t length);
59			ssize_t				ReadAttr(const char* name, type_code type,
60									off_t offset, void* buffer,
61									size_t length) const;
62			status_t			RemoveAttr(const char* name);
63			status_t			RenameAttr(const char* oldName,
64									const char* newName);
65			status_t			GetAttrInfo(const char* name,
66									struct attr_info* info) const;
67			status_t			GetNextAttrName(char* buffer);
68			status_t			RewindAttrs();
69			status_t			WriteAttrString(const char* name,
70									const BString* data);
71			status_t			ReadAttrString(const char* name,
72									BString* result) const;
73
74			BNode&				operator=(const BNode& node);
75			bool				operator==(const BNode& node) const;
76			bool				operator!=(const BNode& node) const;
77
78			int					Dup();
79				// This should be "const" but R5's is not... Ugggh.
80
81private:
82	friend class BFile;
83	friend class BDirectory;
84	friend class BSymLink;
85
86	virtual	void				_RudeNode1();
87	virtual	void				_RudeNode2();
88	virtual	void				_RudeNode3();
89	virtual	void				_RudeNode4();
90	virtual	void				_RudeNode5();
91	virtual	void				_RudeNode6();
92
93private:
94			status_t			set_fd(int fd);
95	virtual	void				close_fd();
96			void				set_status(status_t newStatus);
97
98			status_t			_SetTo(int fd, const char* path, bool traverse);
99			status_t			_SetTo(const entry_ref* ref, bool traverse);
100
101	virtual	status_t			set_stat(struct stat& st, uint32 what);
102
103			status_t			_GetStat(struct stat* st) const;
104	virtual	status_t			_GetStat(struct stat_beos* st) const;
105			status_t			InitAttrDir();
106
107private:
108			uint32				rudeData[4];
109			int					fFd;
110			int					fAttrFd;
111			status_t			fCStatus;
112};
113
114
115#endif	// _NODE_H
116