summaryrefslogtreecommitdiffhomepage
path: root/Private/KernelKit/FileManager.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'Private/KernelKit/FileManager.hpp')
-rw-r--r--Private/KernelKit/FileManager.hpp350
1 files changed, 185 insertions, 165 deletions
diff --git a/Private/KernelKit/FileManager.hpp b/Private/KernelKit/FileManager.hpp
index 51bfb13c..142e1afd 100644
--- a/Private/KernelKit/FileManager.hpp
+++ b/Private/KernelKit/FileManager.hpp
@@ -16,7 +16,7 @@
#ifdef __FSKIT_NEWFS__
#include <FSKit/NewFS.hxx>
-#endif // __FSKIT_NEWFS__
+#endif // __FSKIT_NEWFS__
#include <CompilerKit/CompilerKit.hxx>
#include <HintKit/CompilerHint.hxx>
@@ -27,207 +27,227 @@
/// @brief Filesystem abstraction manager.
/// Works like the VFS or IFS.
-#define kBootFolder "/Boot"
-#define kBinFolder "/Applications"
+#define kBootFolder "/Boot"
+#define kBinFolder "/Applications"
#define kShLibsFolder "/Library"
-#define kMountFolder "/Mount"
+#define kMountFolder "/Mount"
/// refer to first enum.
-#define kFileOpsCount 4
+#define kFileOpsCount 4
#define kFileMimeGeneric "application-type/*"
-namespace NewOS {
-enum {
- kFileWriteAll = 100,
- kFileReadAll = 101,
- kFileReadChunk = 102,
- kFileWriteChunk = 103,
- kFileIOCnt = (kFileWriteChunk - kFileWriteAll) + 1,
-};
+namespace NewOS
+{
+ enum
+ {
+ kFileWriteAll = 100,
+ kFileReadAll = 101,
+ kFileReadChunk = 102,
+ kFileWriteChunk = 103,
+ kFileIOCnt = (kFileWriteChunk - kFileWriteAll) + 1,
+ };
-typedef VoidPtr NodePtr;
+ typedef VoidPtr NodePtr;
-/**
+ /**
@brief Filesystem Manager Interface class
@brief Used to provide common I/O for a specific filesystem.
*/
-class FilesystemManagerInterface {
- public:
- FilesystemManagerInterface() = default;
- virtual ~FilesystemManagerInterface() = default;
+ class FilesystemManagerInterface
+ {
+ public:
+ FilesystemManagerInterface() = default;
+ virtual ~FilesystemManagerInterface() = default;
- public:
- NEWOS_COPY_DEFAULT(FilesystemManagerInterface);
+ public:
+ NEWOS_COPY_DEFAULT(FilesystemManagerInterface);
- public:
- /// @brief Mounts a new filesystem into an active state.
- /// @param interface the filesystem interface
- /// @return
- static bool Mount(FilesystemManagerInterface *interface);
+ public:
+ /// @brief Mounts a new filesystem into an active state.
+ /// @param interface the filesystem interface
+ /// @return
+ static bool Mount(FilesystemManagerInterface* interface);
- /// @brief Unmounts the active filesystem
- /// @return
- static FilesystemManagerInterface *Unmount();
+ /// @brief Unmounts the active filesystem
+ /// @return
+ static FilesystemManagerInterface* Unmount();
- /// @brief Getter, gets the active filesystem.
- /// @return
- static FilesystemManagerInterface *GetMounted();
+ /// @brief Getter, gets the active filesystem.
+ /// @return
+ static FilesystemManagerInterface* GetMounted();
- public:
- virtual NodePtr Create(_Input const char *path) = 0;
- virtual NodePtr CreateAlias(_Input const char *path) = 0;
- virtual NodePtr CreateDirectory(_Input const char *path) = 0;
+ public:
+ virtual NodePtr Create(_Input const char* path) = 0;
+ virtual NodePtr CreateAlias(_Input const char* path) = 0;
+ virtual NodePtr CreateDirectory(_Input const char* path) = 0;
- public:
- virtual bool Remove(_Input const char *path) = 0;
+ public:
+ virtual bool Remove(_Input const char* path) = 0;
- public:
- virtual NodePtr Open(_Input const char *path, _Input const char *r) = 0;
+ public:
+ virtual NodePtr Open(_Input const char* path, _Input const char* r) = 0;
- public:
- virtual Void Write(_Input NodePtr node, _Input VoidPtr data,
- _Input Int32 flags, _Input SizeT size) = 0;
- virtual _Output VoidPtr Read(_Input NodePtr node, _Input Int32 flags,
- _Input SizeT sz) = 0;
+ public:
+ virtual Void Write(_Input NodePtr node, _Input VoidPtr data, _Input Int32 flags, _Input SizeT size) = 0;
+ virtual _Output VoidPtr Read(_Input NodePtr node, _Input Int32 flags, _Input SizeT sz) = 0;
- public:
- virtual bool Seek(_Input NodePtr node, _Input SizeT off) = 0;
+ public:
+ virtual bool Seek(_Input NodePtr node, _Input SizeT off) = 0;
- public:
- virtual SizeT Tell(_Input NodePtr node) = 0;
- virtual bool Rewind(_Input NodePtr node) = 0;
-};
+ public:
+ virtual SizeT Tell(_Input NodePtr node) = 0;
+ virtual bool Rewind(_Input NodePtr node) = 0;
+ };
/** @brief invalid position. (n-pos) */
#define kNPos (SizeT)(-1);
#ifdef __FSKIT_NEWFS__
-/**
+ /**
* @brief Based of FilesystemManagerInterface, takes care of managing NewFS
* disks.
*/
-class NewFilesystemManager final : public FilesystemManagerInterface {
- public:
- explicit NewFilesystemManager();
- ~NewFilesystemManager() override;
-
- public:
- NEWOS_COPY_DEFAULT(NewFilesystemManager);
-
- public:
- NodePtr Create(const char *path) override;
- NodePtr CreateAlias(const char *path) override;
- NodePtr CreateDirectory(const char *path) override;
-
- public:
- bool Remove(const char *path) override;
- NodePtr Open(const char *path, const char *r) override;
- Void Write(NodePtr node, VoidPtr data, Int32 flags, SizeT sz) override;
- VoidPtr Read(NodePtr node, Int32 flags, SizeT sz) override;
- bool Seek(NodePtr node, SizeT off);
- SizeT Tell(NodePtr node) override;
- bool Rewind(NodePtr node) override;
-
- NewFSParser* GetImpl() noexcept;
-
- private:
- NewFSParser *fImpl{nullptr};
-};
-
-#endif // ifdef __FSKIT_NEWFS__
-
-/**
+ class NewFilesystemManager final : public FilesystemManagerInterface
+ {
+ public:
+ explicit NewFilesystemManager();
+ ~NewFilesystemManager() override;
+
+ public:
+ NEWOS_COPY_DEFAULT(NewFilesystemManager);
+
+ public:
+ NodePtr Create(const char* path) override;
+ NodePtr CreateAlias(const char* path) override;
+ NodePtr CreateDirectory(const char* path) override;
+
+ public:
+ bool Remove(const char* path) override;
+ NodePtr Open(const char* path, const char* r) override;
+ Void Write(NodePtr node, VoidPtr data, Int32 flags, SizeT sz) override;
+ VoidPtr Read(NodePtr node, Int32 flags, SizeT sz) override;
+ bool Seek(NodePtr node, SizeT off);
+ SizeT Tell(NodePtr node) override;
+ bool Rewind(NodePtr node) override;
+
+ NewFSParser* GetImpl() noexcept;
+
+ private:
+ NewFSParser* fImpl{nullptr};
+ };
+
+#endif // ifdef __FSKIT_NEWFS__
+
+ /**
* Usable FileStream
* @tparam Encoding file encoding (char, wchar_t...)
* @tparam FSClass Filesystem contract who takes care of it.
*/
-template <typename Encoding = char,
- typename FSClass = FilesystemManagerInterface>
-class FileStream final {
- public:
- explicit FileStream(const Encoding *path, const Encoding *restrict_type);
- ~FileStream();
-
- public:
- FileStream &operator=(const FileStream &);
- FileStream(const FileStream &);
-
- public:
- ErrorOr<Int64> WriteAll(const VoidPtr data) noexcept {
- if (data == nullptr) return ErrorOr<Int64>(H_INVALID_DATA);
-
- auto man = FSClass::GetMounted();
-
- if (man) {
- man->Write(fFile, data, kFileWriteAll);
- return ErrorOr<Int64>(0);
- }
-
- return ErrorOr<Int64>(H_INVALID_DATA);
- }
-
- VoidPtr Read() noexcept {
- auto man = FSClass::GetMounted();
-
- if (man) {
- VoidPtr ret = man->Read(fFile, kFileReadAll, 0);
- return ret;
- }
-
- return nullptr;
- }
-
- voidPtr Read(SizeT offset, SizeT sz) {
- auto man = FSClass::GetMounted();
-
- if (man) {
- man->Seek(fFile, offset);
- auto ret = man->Read(fFile, kFileReadChunk, sz);
-
- return ret;
- }
-
- return nullptr;
- }
-
- Void Write(SizeT offset, voidPtr data, SizeT sz) {
- auto man = FSClass::GetMounted();
-
- if (man) {
- man->Seek(fFile, offset);
- man->Write(fFile, data, sz, kFileReadChunk);
- }
- }
-
- /// @brief Leak node pointer.
- /// @return The node pointer.
- NodePtr Leak() { return fFile; }
-
- public:
- char *MIME() noexcept { return const_cast<char *>(fMime); }
-
- private:
- NodePtr fFile;
- const Char *fMime{kFileMimeGeneric};
-};
-
-#define kRestrictR "r"
+ template <typename Encoding = char,
+ typename FSClass = FilesystemManagerInterface>
+ class FileStream final
+ {
+ public:
+ explicit FileStream(const Encoding* path, const Encoding* restrict_type);
+ ~FileStream();
+
+ public:
+ FileStream& operator=(const FileStream&);
+ FileStream(const FileStream&);
+
+ public:
+ ErrorOr<Int64> WriteAll(const VoidPtr data) noexcept
+ {
+ if (data == nullptr)
+ return ErrorOr<Int64>(H_INVALID_DATA);
+
+ auto man = FSClass::GetMounted();
+
+ if (man)
+ {
+ man->Write(fFile, data, kFileWriteAll);
+ return ErrorOr<Int64>(0);
+ }
+
+ return ErrorOr<Int64>(H_INVALID_DATA);
+ }
+
+ VoidPtr Read() noexcept
+ {
+ auto man = FSClass::GetMounted();
+
+ if (man)
+ {
+ VoidPtr ret = man->Read(fFile, kFileReadAll, 0);
+ return ret;
+ }
+
+ return nullptr;
+ }
+
+ voidPtr Read(SizeT offset, SizeT sz)
+ {
+ auto man = FSClass::GetMounted();
+
+ if (man)
+ {
+ man->Seek(fFile, offset);
+ auto ret = man->Read(fFile, kFileReadChunk, sz);
+
+ return ret;
+ }
+
+ return nullptr;
+ }
+
+ Void Write(SizeT offset, voidPtr data, SizeT sz)
+ {
+ auto man = FSClass::GetMounted();
+
+ if (man)
+ {
+ man->Seek(fFile, offset);
+ man->Write(fFile, data, sz, kFileReadChunk);
+ }
+ }
+
+ /// @brief Leak node pointer.
+ /// @return The node pointer.
+ NodePtr Leak()
+ {
+ return fFile;
+ }
+
+ public:
+ char* MIME() noexcept
+ {
+ return const_cast<char*>(fMime);
+ }
+
+ private:
+ NodePtr fFile;
+ const Char* fMime{kFileMimeGeneric};
+ };
+
+#define kRestrictR "r"
#define kRestrictRB "rb"
-#define kRestrictW "w"
+#define kRestrictW "w"
#define kRestrictRW "rw"
-using FileStreamUTF8 = FileStream<Char>;
-using FileStreamUTF16 = FileStream<WideChar>;
+ using FileStreamUTF8 = FileStream<Char>;
+ using FileStreamUTF16 = FileStream<WideChar>;
-typedef UInt64 CursorType;
+ typedef UInt64 CursorType;
-template <typename Encoding, typename Class>
-FileStream<Encoding, Class>::FileStream(const Encoding *path,
- const Encoding *restrict_type)
- : fFile(Class::GetMounted()->Open(path, restrict_type)) {}
+ template <typename Encoding, typename Class>
+ FileStream<Encoding, Class>::FileStream(const Encoding* path,
+ const Encoding* restrict_type)
+ : fFile(Class::GetMounted()->Open(path, restrict_type))
+ {
+ }
-template <typename Encoding, typename Class>
-FileStream<Encoding, Class>::~FileStream() = default;
-} // namespace NewOS
+ template <typename Encoding, typename Class>
+ FileStream<Encoding, Class>::~FileStream() = default;
+} // namespace NewOS
#define node_cast(PTR) reinterpret_cast<NewOS::NodePtr>(PTR)