171 lines
4.8 KiB
ObjectPascal
171 lines
4.8 KiB
ObjectPascal
unit vfs;
|
|
|
|
interface
|
|
|
|
uses
|
|
hashmap, strings, lmemorymanager;
|
|
|
|
type
|
|
TOpenMode = (omReadOnly, omWriteOnly, omReadWrite);
|
|
TWriteMode = (wmRewrite, wmAppend, wmNew);
|
|
TError = (eNone, eUnknown, eFileInUse, eWriteOnly, eReadOnly, eFileDoesNotExist, eDirectoryDoesNotExist, eDirectoryAlreadyExists);
|
|
PError = ^TError;
|
|
TIsPathValid = (pvInvalid, pvFile, pvDirectory);
|
|
|
|
TFileHandle = uint32;
|
|
|
|
{ Callbacks }
|
|
TOpenFile = function(Handle : uint32; Filename : pchar; OpenMode : TOpenMode; WriteMode : TWriteMode; Lock : Boolean; Error : PError) : TFileHandle;
|
|
TWriteFile = function(Handle : uint32; FileHandle : TFileHandle; Position : uint32; Buffer : puint8; Length : uint32) : uint32;
|
|
TReadFile = function(Handle : uint32; FileHandle : TFileHandle; Position : uint32; Buffer : puint8; Length : uint32) : uint32;
|
|
TFileSize = function(Handle : uint32; Filename : pchar; error : puint8) : uint32;
|
|
TCloseFile = function(Handle : uint32; Filehandle : TFileHandle) : boolean;
|
|
TMakeDirectory = function(Handle : uint32; Path : pchar) : TError;
|
|
TGetDirectories = function(Handle : uint32; Path : pchar) : PHashMap;
|
|
TPathValid = function(Handle : uint32; Path : pchar) : TIsPathValid;
|
|
|
|
TObjectType = (otVDIRECTORY, otDIRECTORY, otDEVICE, otFILE, otMOUNT);
|
|
TVFSVDirectory = record
|
|
Contents : PHashMap;
|
|
end;
|
|
TVFSDrive = record
|
|
DriveHandle : uint32;
|
|
MakeDirectory : TMakeDirectory;
|
|
GetDirectories : TGetDirectories;
|
|
OpenFile : TOpenFile;
|
|
CloseFile : TCloseFile;
|
|
ReadFile : TReadFile;
|
|
WriteFile : TWriteFile;
|
|
FileSize : TFileSize;
|
|
PathValid : TPathValid;
|
|
end;
|
|
TVFSDevice = record
|
|
DeviceHandle : uint32;
|
|
MakeDirectory : TMakeDirectory;
|
|
GetDirectories : TGetDirectories;
|
|
OpenFile : TOpenFile;
|
|
CloseFile : TCloseFile;
|
|
ReadFile : TReadFile;
|
|
WriteFile : TWriteFile;
|
|
FileSize : TFileSize;
|
|
PathValid : TPathValid;
|
|
end;
|
|
TVFSFile = record
|
|
ReadFile : TReadFile;
|
|
WriteFile : TWriteFile;
|
|
end;
|
|
TVFSMount = record
|
|
Path : pchar;
|
|
ObjectType : TObjectType;
|
|
Reference : void;
|
|
end;
|
|
TVFSObject = record
|
|
ObjectType : TObjectType;
|
|
Reference : void;
|
|
end;
|
|
PVFSObject = ^TVFSObject;
|
|
|
|
var
|
|
VirtualFileSystem : PHashMap;
|
|
CurrentDirectory : pchar = nil;
|
|
|
|
procedure init();
|
|
Function OpenFile(Filename : pchar; OpenMode : TOpenMode; WriteMode : TWriteMode; Lock : Boolean; Error : PError) : TFileHandle;
|
|
function WriteFile(FileHandle : TFileHandle; Position : uint32; Buffer : puint8; Length : uint32) : uint32;
|
|
function ReadFile(FileHandle : TFileHandle; Position : uint32; Buffer : puint8; Length : uint32) : uint32;
|
|
function CloseFile(Filehandle : TFileHandle) : boolean;
|
|
function FileSize(Filename : pchar; error : puint8) : uint32;
|
|
function CreateDirectory(Handle : uint32; Path : pchar) : TError;
|
|
function GetDirectories(Handle : uint32; Path : pchar) : PHashMap;
|
|
function PathValid(Handle : uint32; Path : pchar) : TPathValid;
|
|
function changeDirectory(Path : pchar) : TPathValid;
|
|
function getWorkingDirectory : pchar;
|
|
|
|
//VFS Functions
|
|
function newVirtualDirectory(Path : pchar) : TError;
|
|
|
|
implementation
|
|
|
|
uses
|
|
terminal;
|
|
|
|
{ Internal Functions }
|
|
|
|
Procedure ChangeCurrentDirectoryValue(new : pchar);
|
|
begin
|
|
if CurrentDirectory <> nil then kfree(void(CurrentDirectory));
|
|
CurrentDirectory:= nil;
|
|
CurrentDirectory:= stringCopy(new);
|
|
end;
|
|
|
|
|
|
{ Filesystem Functions }
|
|
|
|
Function OpenFile(Filename : pchar; OpenMode : TOpenMode; WriteMode : TWriteMode; Lock : Boolean; Error : PError) : TFileHandle;
|
|
begin
|
|
|
|
end;
|
|
|
|
function WriteFile(FileHandle : TFileHandle; Position : uint32; Buffer : puint8; Length : uint32) : uint32;
|
|
begin
|
|
|
|
end;
|
|
|
|
function ReadFile(FileHandle : TFileHandle; Position : uint32; Buffer : puint8; Length : uint32) : uint32;
|
|
begin
|
|
|
|
end;
|
|
|
|
function CloseFile(Filehandle : TFileHandle) : boolean;
|
|
begin
|
|
|
|
end;
|
|
|
|
function FileSize(Filename : pchar; error : puint8) : uint32;
|
|
begin
|
|
|
|
end;
|
|
|
|
function CreateDirectory(Handle : uint32; Path : pchar) : TError;
|
|
begin
|
|
|
|
end;
|
|
|
|
function GetDirectories(Handle : uint32; Path : pchar) : PHashMap;
|
|
begin
|
|
|
|
end;
|
|
|
|
function PathValid(Handle : uint32; Path : pchar) : TPathValid;
|
|
begin
|
|
|
|
end;
|
|
|
|
function changeDirectory(Path : pchar) : TPathValid;
|
|
begin
|
|
|
|
end;
|
|
|
|
{ VFS Functions }
|
|
|
|
function newVirtualDirectory(Path : pchar) : TError;
|
|
begin
|
|
|
|
end;
|
|
|
|
function getWorkingDirectory : pchar;
|
|
begin
|
|
getWorkingDirectory:= CurrentDirectory;
|
|
end;
|
|
|
|
{ Terminal Commands }
|
|
|
|
{ Init }
|
|
|
|
procedure init();
|
|
begin
|
|
VirtualFileSystem:= hashmap.new;
|
|
ChangeCurrentDirectoryValue('/');
|
|
end;
|
|
|
|
end. |