NeKernel dev
Loading...
Searching...
No Matches
FileMgr.h
Go to the documentation of this file.
1/* ========================================
2
3 Copyright (C) 2024-2025, Amlal El Mahrouss , licensed under the Apache 2.0 license.
4
5 File: FileMgr.h
6 Purpose: Kernel file manager.
7 Author: Amlal El Mahrouss (amlal@nekernel.org)
8
9======================================== */
10
11/* ========================================
12
13 Revision History:
14
15 31/01/24: Update documentation (amlel)
16 05/07/24: NeFS support, and fork support, updated constants and specs
17 as well.
18 18/01/25: Patches to FileStream class.
19
20 ======================================== */
21
22#ifndef INC_FILEMGR_H
23#define INC_FILEMGR_H
24
28
30#include <FSKit/Ext2+IFS.h>
31#include <FSKit/NeFS.h>
32#include <FSKit/OpenHeFS.h>
33
36#include <KernelKit/HeapMgr.h>
37#include <KernelKit/KPC.h>
38#include <NeKit/ErrorOr.h>
39#include <NeKit/Ref.h>
40#include <NeKit/Stream.h>
41#include <hint/CompilerHint.h>
42
45
46#define kRestrictR "r"
47#define kRestrictRB "rb"
48#define kRestrictW "w"
49#define kRestrictWR "rw"
50#define kRestrictWRB "rwb"
51
52#define kRestrictMax (5U)
53
54#define rtl_node_cast(PTR) reinterpret_cast<Kernel::NodePtr>(PTR)
55
56#define kFileMimeGeneric "ne-application-kind/all"
57
59#define kFileMgrNPos (~0UL)
60
61namespace Kernel {
62enum {
68 // File flags (HFS+, NeFS specific)
72};
73
75
81 public:
82 explicit IFilesystemMgr() = default;
83 virtual ~IFilesystemMgr() = default;
84
85 public:
87
88 public:
92 static bool Mount(IFilesystemMgr* interface);
93
96 static IFilesystemMgr* Unmount();
97
100 static IFilesystemMgr* GetMounted();
101
102 public:
103 virtual NodePtr Create(_Input const Char* path) = 0;
104 virtual NodePtr CreateAlias(_Input const Char* path) = 0;
105 virtual NodePtr CreateDirectory(_Input const Char* path) = 0;
106 virtual NodePtr CreateSwapFile(const Char* path) = 0;
107
108 public:
109 virtual bool Remove(_Input const Char* path) = 0;
110
111 public:
112 virtual NodePtr Open(_Input const Char* path, _Input const Char* r) = 0;
113
114 public:
115 virtual Void Write(_Input NodePtr node, _Input VoidPtr data, _Input Int32 flags,
116 _Input SizeT size) = 0;
117
118 virtual _Output VoidPtr Read(_Input NodePtr node, _Input Int32 flags, _Input SizeT sz) = 0;
119
120 virtual Void Write(_Input const Char* name, _Input NodePtr node, _Input VoidPtr data,
121 _Input Int32 flags, _Input SizeT size) = 0;
122
123 virtual _Output VoidPtr Read(_Input const Char* name, _Input NodePtr node, _Input Int32 flags,
124 _Input SizeT sz) = 0;
125
126 public:
127 virtual bool Seek(_Input NodePtr node, _Input SizeT off) = 0;
128
129 public:
130 virtual SizeT Tell(_Input NodePtr node) = 0;
131 virtual bool Rewind(_Input NodePtr node) = 0;
132};
133
134#ifdef __FSKIT_INCLUDES_NEFS__
139class NeFileSystemMgr final : public IFilesystemMgr {
140 public:
141 explicit NeFileSystemMgr();
142 ~NeFileSystemMgr() override;
143
144 public:
145 NE_COPY_DEFAULT(NeFileSystemMgr)
146
147 public:
148 NodePtr Create(const Char* path) override;
149 NodePtr CreateAlias(const Char* path) override;
150 NodePtr CreateDirectory(const Char* path) override;
151 NodePtr CreateSwapFile(const Char* path) override;
152
153 public:
154 bool Remove(_Input const Char* path) override;
155 NodePtr Open(_Input const Char* path, _Input const Char* r) override;
156 Void Write(_Input NodePtr node, _Input VoidPtr data, _Input Int32 flags,
157 _Input SizeT sz) override;
158 VoidPtr Read(_Input NodePtr node, _Input Int32 flags, _Input SizeT sz) override;
159 bool Seek(_Input NodePtr node, _Input SizeT off) override;
160 SizeT Tell(_Input NodePtr node) override;
161 bool Rewind(_Input NodePtr node) override;
162
163 Void Write(_Input const Char* name, _Input NodePtr node, _Input VoidPtr data, _Input Int32 flags,
164 _Input SizeT size) override;
165
166 _Output VoidPtr Read(_Input const Char* name, _Input NodePtr node, _Input Int32 flags,
167 _Input SizeT sz) override;
168
169 public:
172 NeFileSystemParser* GetParser();
173
174 private:
175 NeFileSystemParser* mParser{nullptr};
176};
177
178#endif // ifdef __FSKIT_INCLUDES_NEFS__
179
180#ifdef __FSKIT_INCLUDES_EXT2__
185class Ext2FileSystemMgr final : public IFilesystemMgr {
186 public:
187 explicit Ext2FileSystemMgr();
188 ~Ext2FileSystemMgr() override;
189
190 public:
191 NE_COPY_DEFAULT(Ext2FileSystemMgr)
192
193 public:
194 NodePtr Create(const Char* path) override;
195 NodePtr CreateAlias(const Char* path) override;
196 NodePtr CreateDirectory(const Char* path) override;
197 NodePtr CreateSwapFile(const Char* path) override;
198
199 public:
200 bool Remove(_Input const Char* path) override;
201 NodePtr Open(_Input const Char* path, _Input const Char* r) override;
202 Void Write(_Input NodePtr node, _Input VoidPtr data, _Input Int32 flags,
203 _Input SizeT sz) override;
204 VoidPtr Read(_Input NodePtr node, _Input Int32 flags, _Input SizeT sz) override;
205 bool Seek(_Input NodePtr node, _Input SizeT off) override;
206 SizeT Tell(_Input NodePtr node) override;
207 bool Rewind(_Input NodePtr node) override;
208
209 Void Write(_Input const Char* name, _Input NodePtr node, _Input VoidPtr data, _Input Int32 flags,
210 _Input SizeT size) override;
211
212 _Output VoidPtr Read(_Input const Char* name, _Input NodePtr node, _Input Int32 flags,
213 _Input SizeT sz) override;
214
215 public:
218 Ext2FileSystemParser* GetParser();
219
220 private:
221 Ext2FileSystemParser* mParser{nullptr};
222};
223
224#endif // ifdef __FSKIT_INCLUDES_EXT2__
225
226#ifdef __FSKIT_INCLUDES_OPENHEFS__
231class HeFileSystemMgr final : public IFilesystemMgr {
232 public:
233 explicit HeFileSystemMgr();
234 ~HeFileSystemMgr() override;
235
236 public:
237 NE_COPY_DEFAULT(HeFileSystemMgr)
238
239 public:
240 NodePtr Create(const Char* path) override;
241 NodePtr CreateAlias(const Char* path) override;
242 NodePtr CreateDirectory(const Char* path) override;
243 NodePtr CreateSwapFile(const Char* path) override;
244
245 public:
246 bool Remove(_Input const Char* path) override;
247 NodePtr Open(_Input const Char* path, _Input const Char* r) override;
248 Void Write(_Input NodePtr node, _Input VoidPtr data, _Input Int32 flags,
249 _Input SizeT sz) override;
250 VoidPtr Read(_Input NodePtr node, _Input Int32 flags, _Input SizeT sz) override;
251 bool Seek(_Input NodePtr node, _Input SizeT off) override;
252 SizeT Tell(_Input NodePtr node) override;
253 bool Rewind(_Input NodePtr node) override;
254
255 Void Write(_Input const Char* name, _Input NodePtr node, _Input VoidPtr data, _Input Int32 flags,
256 _Input SizeT size) override;
257
258 _Output VoidPtr Read(_Input const Char* name, _Input NodePtr node, _Input Int32 flags,
259 _Input SizeT sz) override;
260
261 public:
264 HeFileSystemParser* GetParser();
265
266 private:
267 HeFileSystemParser* mParser{nullptr};
268};
269
270#endif // ifdef __FSKIT_INCLUDES_OPENHEFS__
271
277template <typename Encoding = Char, typename FSClass = IFilesystemMgr>
278class FileStream final {
279 public:
280 explicit FileStream(const Encoding* path, const Encoding* restrict_type);
282
283 public:
286
287 public:
288 ErrorOr<Int64> Write(SizeT offset, const VoidPtr data, SizeT len) {
294
295 if (data == nullptr) return ErrorOr<Int64>(kErrorInvalidData);
296
297 auto man = FSClass::GetMounted();
298
299 if (man) {
300 man->Write(offset, fFile, data, len);
302 }
303
305 }
306
307 ErrorOr<Int64> Write(const Char* name, const VoidPtr data, SizeT len) {
313
314 if (data == nullptr) return ErrorOr<Int64>(kErrorInvalidData);
315
316 auto man = FSClass::GetMounted();
317
318 if (man) {
319 man->Write(name, fFile, data, 0, len);
321 }
322
324 }
325
326 VoidPtr Read(const Char* name, SizeT sz) {
331 return nullptr;
332
333 auto man = FSClass::GetMounted();
334
335 if (man) {
336 VoidPtr ret = man->Read(name, fFile, kFileReadAll, sz);
337 return ret;
338 }
339
340 return nullptr;
341 }
342
343 VoidPtr Read(SizeT offset, SizeT sz) {
348 return nullptr;
349
350 auto man = FSClass::GetMounted();
351
352 if (man) {
353 man->Seek(fFile, offset);
354 auto ret = man->Read(fFile, kFileReadChunk, sz);
355
356 return ret;
357 }
358
359 return nullptr;
360 }
361
362 public:
365 NodePtr Leak() { return fFile; }
366
369 Char* MIME() { return const_cast<Char*>(fMime); }
370
371 enum {
378 };
379
380 private:
381 NodePtr fFile{nullptr};
384};
385
389
391
392inline STATIC const auto kRestrictStrLen = 8U;
393
399
401template <typename Encoding, typename Class>
402inline FileStream<Encoding, Class>::FileStream(const Encoding* path, const Encoding* restrict_type)
403 : fFile(Class::GetMounted()->Open(path, restrict_type)) {
404 SizeT kRestrictCount = kRestrictMax;
405 const FILEMGR_RESTRICT kRestrictList[] = {{
406 .fRestrict = kRestrictR,
407 .fMappedTo = kFileMgrRestrictRead,
408 },
409 {
410 .fRestrict = kRestrictRB,
411 .fMappedTo = kFileMgrRestrictReadBinary,
412 },
413 {
414 .fRestrict = kRestrictWRB,
416 },
417 {
418 .fRestrict = kRestrictW,
419 .fMappedTo = kFileMgrRestrictWrite,
420 },
421 {
422 .fRestrict = kRestrictWR,
423 .fMappedTo = kFileMgrRestrictReadWrite,
424 }};
425
426 for (SizeT index = 0; index < kRestrictCount; ++index) {
427 if (rt_string_cmp(restrict_type, kRestrictList[index].fRestrict,
428 rt_string_len(kRestrictList[index].fRestrict)) == 0) {
429 fFileRestrict = kRestrictList[index].fMappedTo;
430 break;
431 }
432 }
433
434 kout << "FileMgr: Open file at: " << path << ".\r";
435}
436
438template <typename Encoding, typename Class>
443} // namespace Kernel
444
445#endif // ifndef INC_FILEMGR_H
#define _Output
Definition CompilerHint.h:15
#define _Input
Definition CompilerHint.h:14
#define kout
Definition DebugOutput.h:189
#define NE_COPY_DEFAULT(KLASS)
Definition Detail.h:17
#define STATIC
#define kRestrictW
Definition FileMgr.h:48
#define kRestrictWR
Definition FileMgr.h:49
#define kFileMimeGeneric
Definition FileMgr.h:56
#define kRestrictMax
Definition FileMgr.h:52
#define kRestrictRB
Definition FileMgr.h:47
#define kRestrictR
Include filesystems that NeKernel supports.
Definition FileMgr.h:46
#define kRestrictWRB
Definition FileMgr.h:50
: Memory allocation support for the NeKernel.
Kernel Procedure Code.
ErrorOr class for error handling.
Definition ErrorOr.h:22
Definition FileMgr.h:278
FileStream(const Encoding *path, const Encoding *restrict_type)
constructor
Definition FileMgr.h:402
ErrorOr< Int64 > Write(SizeT offset, const VoidPtr data, SizeT len)
Definition FileMgr.h:288
const Char * fMime
Definition FileMgr.h:383
VoidPtr Read(SizeT offset, SizeT sz)
Definition FileMgr.h:343
~FileStream()
destructor of the file stream.
Definition FileMgr.h:439
VoidPtr Read(const Char *name, SizeT sz)
Definition FileMgr.h:326
@ kFileMgrRestrictReadWrite
Definition FileMgr.h:376
@ kFileMgrRestrictWrite
Definition FileMgr.h:374
@ kFileMgrRestrictWriteBinary
Definition FileMgr.h:375
@ kFileMgrRestrictReadWriteBinary
Definition FileMgr.h:377
@ kFileMgrRestrictReadBinary
Definition FileMgr.h:373
@ kFileMgrRestrictRead
Definition FileMgr.h:372
FileStream & operator=(const FileStream &)
NodePtr fFile
Definition FileMgr.h:381
FileStream(const FileStream &)
ErrorOr< Int64 > Write(const Char *name, const VoidPtr data, SizeT len)
Definition FileMgr.h:307
NodePtr Leak()
Leak node pointer.
Definition FileMgr.h:365
Int32 fFileRestrict
Definition FileMgr.h:382
Char * MIME()
Leak MIME.
Definition FileMgr.h:369
Filesystem Mgr Interface class.
Definition FileMgr.h:80
virtual Void Write(_Input const Char *name, _Input NodePtr node, _Input VoidPtr data, _Input Int32 flags, _Input SizeT size)=0
virtual NodePtr CreateAlias(_Input const Char *path)=0
virtual NodePtr CreateDirectory(_Input const Char *path)=0
static IFilesystemMgr * Unmount()
Unmounts the active filesystem.
Definition FileMgr.cc:27
virtual NodePtr Open(_Input const Char *path, _Input const Char *r)=0
virtual ~IFilesystemMgr()=default
virtual bool Remove(_Input const Char *path)=0
virtual _Output VoidPtr Read(_Input const Char *name, _Input NodePtr node, _Input Int32 flags, _Input SizeT sz)=0
static bool Mount(IFilesystemMgr *interface)
Mounts a new filesystem into an active state.
Definition FileMgr.cc:41
virtual SizeT Tell(_Input NodePtr node)=0
virtual bool Seek(_Input NodePtr node, _Input SizeT off)=0
virtual NodePtr Create(_Input const Char *path)=0
virtual bool Rewind(_Input NodePtr node)=0
virtual Void Write(_Input NodePtr node, _Input VoidPtr data, _Input Int32 flags, _Input SizeT size)=0
static IFilesystemMgr * GetMounted()
Getter, gets the active filesystem.
Definition FileMgr.cc:21
virtual NodePtr CreateSwapFile(const Char *path)=0
virtual _Output VoidPtr Read(_Input NodePtr node, _Input Int32 flags, _Input SizeT sz)=0
Definition NeFS.h:253
UPS inline definitions.
Definition Device.h:12
char Char
Definition Config.h:51
void Void
Definition Config.h:87
Size rt_string_len(const Char *str)
Definition AsciiUtils.cc:23
constexpr KPCError kErrorSuccess
Definition KPC.h:32
FileStream< Char > FileStreamASCII
Definition FileMgr.h:386
FileStream< Utf8Char > FileStreamUTF8
Definition FileMgr.h:387
STATIC const auto kRestrictStrLen
Definition FileMgr.h:392
Int rt_string_cmp(const Char *src, const Char *cmp, Size len)
Definition AsciiUtils.cc:10
__SIZE_TYPE__ SizeT
Definition Config.h:60
Int32 mm_free_ptr(VoidPtr heap_ptr)
Declare pointer as free.
Definition HeapMgr.cc:187
@ kFileReadChunk
Definition FileMgr.h:66
@ kFileFlagData
Definition FileMgr.h:70
@ kFileIOCnt
Definition FileMgr.h:71
@ kFileWriteAll
Definition FileMgr.h:64
@ kFileReadAll
Definition FileMgr.h:65
@ kFileIOInvalid
Definition FileMgr.h:63
@ kFileWriteChunk
Definition FileMgr.h:67
@ kFileFlagRsrc
Definition FileMgr.h:69
void * VoidPtr
Definition Config.h:33
constexpr KPCError kErrorInvalidData
Definition KPC.h:56
__INT32_TYPE__ Int32
Definition Config.h:38
UInt64 CursorType
Definition FileMgr.h:390
FileStream< WideChar > FileStreamUTF16
Definition FileMgr.h:388
VoidPtr NodePtr
Definition FileMgr.h:74
__UINT64_TYPE__ UInt64
Definition Config.h:48
OpenHeFS filesystem support.
restrict information about the file descriptor.
Definition FileMgr.h:395
Char fRestrict[kRestrictStrLen]
Definition FileMgr.h:396
Int32 fMappedTo
Definition FileMgr.h:397