summaryrefslogtreecommitdiffhomepage
path: root/Kernel/Source/FileManager.cxx
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-05-09 00:42:44 +0200
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-05-09 00:42:44 +0200
commitaf8a516fc22865abd80d6e26f1541fa3d6bebfdc (patch)
tree96d42a10945fc03df022389aef54708383c1d616 /Kernel/Source/FileManager.cxx
parenta874e9cc98df994178d55996943fe81799c61d2f (diff)
MHR-23: :boom:, refactors.
- Move NewBoot to /Boot, thus making Kernel directory only containing the kernel. Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'Kernel/Source/FileManager.cxx')
-rw-r--r--Kernel/Source/FileManager.cxx183
1 files changed, 183 insertions, 0 deletions
diff --git a/Kernel/Source/FileManager.cxx b/Kernel/Source/FileManager.cxx
new file mode 100644
index 00000000..72ea15a1
--- /dev/null
+++ b/Kernel/Source/FileManager.cxx
@@ -0,0 +1,183 @@
+/* -------------------------------------------
+
+ Copyright SoftwareLabs
+
+------------------------------------------- */
+
+#include <KernelKit/FileManager.hpp>
+#include <NewKit/Utils.hpp>
+
+/// BUGS: 0
+//! @brief File manager for NewOS.
+
+namespace NewOS
+{
+ static FilesystemManagerInterface* kMounted = nullptr;
+
+ /// @brief FilesystemManager getter.
+ /// @return The mounted filesystem.
+ FilesystemManagerInterface* FilesystemManagerInterface::GetMounted()
+ {
+ return kMounted;
+ }
+
+ /// @brief Unmount filesystem.
+ /// @return The unmounted filesystem.
+ FilesystemManagerInterface* FilesystemManagerInterface::Unmount()
+ {
+ if (kMounted)
+ {
+ auto mount = kMounted;
+ kMounted = nullptr;
+
+ return mount;
+ }
+
+ return nullptr;
+ }
+
+ /// @brief Mount filesystem.
+ /// @param mountPtr The filesystem to mount.
+ /// @return if it succeeded true, otherwise false.
+ bool FilesystemManagerInterface::Mount(FilesystemManagerInterface* mountPtr)
+ {
+ if (kMounted == nullptr)
+ {
+ kMounted = mountPtr;
+ return true;
+ }
+
+ return false;
+ }
+
+#ifdef __FSKIT_NEWFS__
+ /// @brief Opens a new file.
+ /// @param path
+ /// @param r
+ /// @return
+ NodePtr NewFilesystemManager::Open(const char* path, const char* r)
+ {
+ if (!path || *path == 0)
+ return nullptr;
+
+ if (!r || *r == 0)
+ return nullptr;
+
+ auto catalog = fImpl->GetCatalog(path);
+
+ if (catalog->Kind != kNewFSCatalogKindFile)
+ {
+ fImpl->CloseCatalog(catalog);
+ return nullptr;
+ }
+
+ return node_cast(catalog);
+ }
+
+ /// @brief Writes to a catalog's fork.
+ /// @param node the node ptr.
+ /// @param data the data.
+ /// @param flags the size.
+ /// @return
+ Void NewFilesystemManager::Write(NodePtr node, VoidPtr data, Int32 flags, SizeT size)
+ {
+ if (!size ||
+ size > kNewFSForkSize)
+ return;
+
+ if (!data)
+ return;
+
+ NEWOS_UNUSED(flags);
+
+ const char* cReadAllFork = fDataFork;
+
+ if ((reinterpret_cast<NewCatalog*>(node))->Kind == kNewFSCatalogKindFile)
+ fImpl->WriteCatalog(reinterpret_cast<NewCatalog*>(node), data, size,
+ cReadAllFork);
+ }
+
+ /// @brief Read from filesystem fork.
+ /// @param node the catalog node.
+ /// @param flags the flags with it.
+ /// @param sz the size to read.
+ /// @return
+ VoidPtr NewFilesystemManager::Read(NodePtr node, Int32 flags, SizeT sz)
+ {
+ if (sz > kNewFSForkSize)
+ return nullptr;
+
+ if (!sz)
+ return nullptr;
+
+ NEWOS_UNUSED(flags);
+
+ const char* cReadAllFork = fDataFork;
+
+ if ((reinterpret_cast<NewCatalog*>(node))->Kind == kNewFSCatalogKindFile)
+ return fImpl->ReadCatalog(reinterpret_cast<NewCatalog*>(node), sz,
+ cReadAllFork);
+
+ return nullptr;
+ }
+
+ /// @brief Seek from Catalog.
+ /// @param node
+ /// @param off
+ /// @retval true always returns false, this is unimplemented.
+ /// @retval false always returns this, it is unimplemented.
+
+ bool NewFilesystemManager::Seek(NodePtr node, SizeT off)
+ {
+ if (!node || off == 0)
+ return false;
+
+ return fImpl->Seek(reinterpret_cast<NewCatalog*>(node), off);
+ }
+
+ /// @brief Tell where the catalog is.
+ /// @param node
+ /// @retval true always returns false, this is unimplemented.
+ /// @retval false always returns this, it is unimplemented.
+
+ SizeT NewFilesystemManager::Tell(NodePtr node)
+ {
+ if (!node)
+ return kNPos;
+
+ return fImpl->Tell(reinterpret_cast<NewCatalog*>(node));
+ }
+
+ /// @brief Rewinds the catalog.
+ /// @param node
+ /// @retval true always returns false, this is unimplemented.
+ /// @retval false always returns this, it is unimplemented.
+
+ bool NewFilesystemManager::Rewind(NodePtr node)
+ {
+ if (!node)
+ return false;
+
+ return this->Seek(node, 0);
+ }
+
+ /// @brief Returns the filesystem parser.
+ /// @return the Filesystem parser class.
+ NewFSParser* NewFilesystemManager::GetImpl() noexcept
+ {
+ return fImpl;
+ }
+
+ void NewFilesystemManager::SetResourceFork(const char* forkName)
+ {
+ if (!forkName) return;
+ rt_copy_memory((VoidPtr)forkName, (VoidPtr)fRsrcFork, rt_string_len(forkName));
+ }
+
+ void NewFilesystemManager::SetDataFork(const char* forkName)
+ {
+ if (!forkName) return;
+ rt_copy_memory((VoidPtr)forkName, (VoidPtr)fDataFork, rt_string_len(forkName));
+ }
+#endif // __FSKIT_NEWFS__
+} // namespace NewOS