1/*
2 * Copyright 2002-2006, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _DIRECTORY_H
6#define _DIRECTORY_H
7
8
9#include <Node.h>
10#include <EntryList.h>
11#include <StorageDefs.h>
12
13
14class BFile;
15class BSymLink;
16struct stat_beos;
17
18
19class BDirectory : public BNode, public BEntryList {
20	public:
21		BDirectory();
22		BDirectory(const BDirectory &dir);
23		BDirectory(const entry_ref *ref);
24		BDirectory(const node_ref *nref);
25		BDirectory(const BEntry *entry);
26		BDirectory(const char *path);
27		BDirectory(const BDirectory *dir, const char *path);
28
29		virtual ~BDirectory();
30
31		status_t SetTo(const entry_ref *ref);
32		status_t SetTo(const node_ref *nref);
33		status_t SetTo(const BEntry *entry);
34		status_t SetTo(const char *path);
35		status_t SetTo(const BDirectory *dir, const char *path);
36
37		status_t GetEntry(BEntry *entry) const;
38
39		status_t FindEntry(const char *path, BEntry *entry,
40			bool traverse = false) const;
41
42		bool Contains(const char *path, int32 nodeFlags = B_ANY_NODE) const;
43		bool Contains(const BEntry *entry, int32 nodeFlags = B_ANY_NODE) const;
44
45		status_t GetStatFor(const char *path, struct stat *st) const;
46
47		virtual status_t GetNextEntry(BEntry *entry, bool traverse = false);
48		virtual status_t GetNextRef(entry_ref *ref);
49		virtual int32 GetNextDirents(dirent *buf, size_t bufSize,
50			int32 count = INT_MAX);
51		virtual status_t Rewind();
52		virtual int32 CountEntries();
53
54		status_t CreateDirectory(const char *path, BDirectory *dir);
55		status_t CreateFile(const char *path, BFile *file,
56			bool failIfExists = false);
57		status_t CreateSymLink(const char *path, const char *linkToPath,
58			BSymLink *link);
59
60		BDirectory &operator=(const BDirectory &dir);
61
62	private:
63		friend class BNode;
64		friend class BEntry;
65		friend class BFile;
66
67		virtual void _ErectorDirectory1();
68		virtual void _ErectorDirectory2();
69		virtual void _ErectorDirectory3();
70		virtual void _ErectorDirectory4();
71		virtual void _ErectorDirectory5();
72		virtual void _ErectorDirectory6();
73
74	private:
75		virtual void close_fd();
76		int get_fd() const;
77
78		status_t set_dir_fd(int fd);
79
80	private:
81		uint32 _reservedData[7];
82		int fDirFd;
83		node_ref fDirNodeRef;
84};
85
86status_t create_directory(const char *path, mode_t mode);
87
88#endif	// _DIRECTORY_H
89