xref: /haiku/src/system/boot/loader/file_systems/fat/Directory.h (revision 085cf27b40c06dc45f633f33c41258f32bec3a23)
1 /*
2 ** Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
3 ** Distributed under the terms of the OpenBeOS License.
4 */
5 #ifndef DIRECTORY_H
6 #define DIRECTORY_H
7 
8 
9 #include "fatfs.h"
10 #include "Stream.h"
11 
12 #include <boot/vfs.h>
13 
14 
15 namespace FATFS {
16 
17 struct dir_entry;
18 class Volume;
19 
20 class Directory : public ::Directory {
21 	public:
22 		Directory();
23 		Directory(Volume &volume, off_t dirEntryOffset, uint32 cluster,
24 			const char *name);
25 		virtual ~Directory();
26 
27 		status_t InitCheck();
28 
29 		off_t DirEntryOffset() const	{ return fDirEntryOffset; }
30 
31 		virtual status_t Open(void **_cookie, int mode);
32 		virtual status_t Close(void *cookie);
33 
34 		virtual Node *Lookup(const char *name, bool traverseLinks);
35 
36 		virtual status_t GetNextEntry(void *cookie, char *nameBuffer, size_t bufferSize);
37 		virtual status_t GetNextNode(void *cookie, Node **_node);
38 		virtual status_t Rewind(void *cookie);
39 		virtual bool IsEmpty();
40 
41 		virtual status_t GetName(char *name, size_t size) const;
42 		virtual ino_t Inode() const;
43 
44 		virtual status_t CreateFile(const char *name, mode_t permissions,
45 			Node **_node);
46 
47 		static status_t UpdateDirEntry(Volume& volume, off_t dirEntryOffset,
48 			uint32 firstCluster, uint32 size);
49 
50 	private:
51 		status_t GetNextEntry(void *cookie,
52 				uint8 mask = FAT_VOLUME, uint8 match = 0);
53 		status_t _AddEntry(dir_entry& entry, off_t& _entryOffset);
54 		off_t _GetStreamSize();
55 
56 		Volume			&fVolume;
57 		Stream			fStream;
58 		off_t			fDirEntryOffset;
59 
60 		typedef ::Directory _inherited;
61 };
62 
63 }	// namespace FATFS
64 
65 #endif	/* DIRECTORY_H */
66