/ src / files / files_file_system.h
files_file_system.h
 1  #pragma once
 2  
 3  #include <cstdint>
 4  #include <cstddef>
 5  
 6  #include "files_storage_driver.h"
 7  
 8  namespace files
 9  {
10  	template <typename FileHandle,
11  				typename DirectoryHandle = nullptr_t,
12  				typename FileInfoHandle = nullptr_t>
13  	class FileSystem
14  	{
15  	public:
16  		FileSystem() = default;
17  		virtual ~FileSystem() = default;
18  		FileSystem(const FileSystem&) = delete;
19  		FileSystem& operator=(const FileSystem&) = delete;
20  
21  		// disk operation interface
22  		virtual bool Mount() = 0;
23  		virtual bool Unmount() = 0;
24  
25  		// file interface
26  		virtual bool FileOpen(FileHandle& file, const char* filePath, uint16_t mode) = 0;
27  		virtual bool FileRead(FileHandle& file, void* buffer, size_t amountToRead, size_t* amountRead) = 0;
28  		virtual bool FileWrite(FileHandle& file, const void* buffer, size_t bufferLength, size_t* amountWritten) = 0;
29  		virtual bool FileSeek(FileHandle& file, size_t offset) = 0;
30  		virtual bool FileClose(FileHandle& file) = 0;
31  
32  		// directory interface
33  		virtual bool DirectoryOpen(DirectoryHandle& dir, const char* directoryPath) = 0;
34  		virtual bool DirectoryRead(DirectoryHandle& dir, FileInfoHandle& info) = 0;
35  		virtual bool DirectoryClose(DirectoryHandle& dir) = 0;
36  
37  		// file information interface
38  		virtual bool FileStat(FileInfoHandle& fileInfo, const char* path) = 0;
39  
40  		// drive information interface
41  		virtual inline const char* GetDriveLabel() { return ""; }
42  		virtual inline uint32_t GetDriveSerial() { return 0; }
43  
44  		// disk information interface
45  		virtual inline bool IsMounted() { return mounted; }
46  
47  		// directory styling
48  		inline virtual constexpr const char* GetRootDirectory() { return DirectoryUnixStyleRoot; }
49  		inline virtual constexpr const char* GetRelativeCurrentDirectory() { return DirectoryOneDot; }
50  		inline virtual constexpr const char* GetRelativeParentDirectory() { return DirectoryTwoDots; }
51  		inline virtual constexpr const char GetDirectorySeperator() { return DirectorySeperatorUnix; }
52  
53  	protected:
54  		static constexpr const char* DirectoryUnixStyleRoot = "/";
55  		static constexpr const char* DirectoryOneDot = ".";
56  		static constexpr const char* DirectoryTwoDots = "..";
57  		static constexpr const char DirectorySeperatorUnix = '/';
58  		static constexpr const char DirectorySeperatorWindows = '\\';
59  
60  		bool mounted = false;
61  	};
62  } // namespace files