diff --git a/Projects/SAMufasaGUI/project1.lpi b/Projects/SAMufasaGUI/project1.lpi
index bb4a1cc..b576214 100644
--- a/Projects/SAMufasaGUI/project1.lpi
+++ b/Projects/SAMufasaGUI/project1.lpi
@@ -6,7 +6,7 @@
-
+
@@ -30,12 +30,12 @@
-
+
-
+
@@ -167,7 +167,7 @@
-
+
@@ -299,8 +299,8 @@
-
-
+
+
@@ -318,8 +318,8 @@
-
-
+
+
@@ -328,8 +328,8 @@
-
-
+
+
@@ -344,8 +344,15 @@
+
+
+
+
+
+
+
-
+
@@ -374,6 +381,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Projects/SAMufasaGUI/project1.lpr b/Projects/SAMufasaGUI/project1.lpr
index e3b0935..6f57d71 100644
--- a/Projects/SAMufasaGUI/project1.lpr
+++ b/Projects/SAMufasaGUI/project1.lpr
@@ -14,6 +14,7 @@ uses
begin
{$I project1.lrs}
Application.Initialize;
+ Application.CreateForm(TForm1, Form1);
Application.Run;
end.
diff --git a/Units/MMLCore/client.pas b/Units/MMLCore/client.pas
index af2b8b9..a5cf458 100644
--- a/Units/MMLCore/client.pas
+++ b/Units/MMLCore/client.pas
@@ -5,7 +5,7 @@ unit Client;
interface
uses
- Classes, SysUtils, MufasaTypes, Window, Input;
+ Classes, SysUtils, MufasaTypes, Window, Input, Files;
type
TClient = class(TObject)
@@ -15,6 +15,7 @@ type
public
MWindow: TMWindow;
MInput: TMInput;
+ MFiles: TMFiles;
end;
@@ -27,12 +28,15 @@ begin
MWindow := TMWindow.Create(Self);
MInput := TMInput.Create(Self);
+ MFiles := TMFiles.Create;
end;
destructor TClient.Destroy;
begin
- MWindow.Destroy;
+ MFiles.Destroy;
MInput.Destroy;
+ MWindow.Destroy;
+
inherited;
end;
diff --git a/Units/MMLCore/files.pas b/Units/MMLCore/files.pas
index 2663130..bf89695 100644
--- a/Units/MMLCore/files.pas
+++ b/Units/MMLCore/files.pas
@@ -8,25 +8,442 @@ uses
Classes, SysUtils;
type
- TMWindow = class(TObject)
- constructor Create(Client: TObject);
- destructor Destroy; override;
- public
+ TMufasaFile = record
+ Path: String;
+ FS: TFileStream;
+ BytesRead, Mode: Integer;
+ end;
+ TMufasaFilesArray = Array Of TMufasaFile;
+
+ TMFiles = class(TObject)
+ constructor Create;
+ destructor Destroy; override;
+ public
+ function CreateFile(Path: string): Integer;
+ function OpenFile(Path: string; Shared: Boolean): Integer;
+ function RewriteFile(Path: string; Shared: Boolean): Integer;
+ procedure CloseFile(FileNum: Integer);
+ function EndOfFile(FileNum: Integer): Boolean;
+ function FileSizeMuf(FileNum: Integer): LongInt;
+ function ReadFileString(FileNum: Integer; var s: string; x: Integer): Boolean;
+ function WriteFileString(FileNum: Integer; s: string): Boolean;
+ Function SetFileCharPointer(FileNum, cChars, Origin: Integer): Integer;
+ function FilePointerPos(FileNum: Integer): Integer;
+ protected
+ MFiles: TMufasaFilesArray;
+ FreeSpots: Array Of Integer;
+ private
+ procedure FreeFileList;
+ function AddFileToManagedList(Path: string; FS: TFileStream; Mode: Integer): Integer;
end;
implementation
+uses
+ {$IFDEF MSWINDOWS}Windows,{$ENDIF} IniFiles;
-constructor TMWindow.Create(Client: TObject);
+constructor TMFiles.Create;
begin
inherited Create;
+ SetLength(Self.MFiles, 0);
+ SetLength(Self.FreeSpots, 0);
end;
-destructor TMWindow.Destroy;
+procedure TMFiles.FreeFileList;
+var
+ I : integer;
+begin;
+ //WriteLn('Freeing all open Files.');
+ For I := 0 To High(MFiles) Do
+ If MFiles[i].FS <> nil Then
+ Begin
+ WriteLn('You forgot to free a file...');
+ Try
+ MFiles[I].FS.Free;
+ Except
+ WriteLn('FreeFileList - Exception when freeing');
+ End;
+ //FileClose(Files[i].Handle);
+ End;
+ SetLength(MFiles, 0);
+ SetLength(FreeSpots, 0);
+ //WriteLn('Done Freeing all Files');
+end;
+
+destructor TMFiles.Destroy;
+begin
+ FreeFileList;
+ inherited;
+end;
+
+Function TMFiles.AddFileToManagedList(Path: String; FS: TFileStream; Mode: Integer): Integer;
+Var
+ tFile: TMufasaFile;
+Begin
+ tFile.Path := Path;
+ tFile.FS := FS;
+ tFile.Mode := Mode;
+ tFile.BytesRead := 0;
+
+ If Length(FreeSpots) > 0 Then
+ Begin
+ //WriteLn('There is a free spot: ' + IntToStr(FreeSpots[High(FreeSpots)]));
+ MFiles[FreeSpots[High(FreeSpots)]] := tFile;
+ Result := FreeSpots[High(FreeSpots)];
+ SetLength(FreeSpots, High(FreeSpots));
+ End Else
+ Begin
+ //WriteLn('No Free Spot. Increasing the size');
+ SetLength(MFiles, Length(MFiles) + 1);
+ //Writeln('Length of Files: ' + IntToStr(Length(Files)));
+ MFiles[High(MFiles)] := tFile;
+ Result := High(MFiles);
+ End;
+End;
+
+{/\
+ Copies content of the file into the result (if no errors occur).
+/\}
+Function TMFiles.SetFileCharPointer(FileNum, cChars, Origin: Integer): Integer;
+Begin
+ If(FileNum < 0) or (FileNum >= Length(MFiles)) Then
+ Begin
+ WriteLn('Invalid File Num');
+ Result := -1;
+ Exit;
+ End;
+
+ {If Files[FileNum].Handle = -1 Then
+ Begin
+ WriteLn('SetFileCharPointer: Invalid Internal Handle');
+ Result := -1;
+ Exit;
+ End;}
+
+ case Origin of
+ fsFromBeginning:
+ If(cChars < 0) Then
+ Begin
+ Writeln('fsFromBeginning takes no negative cChars.');
+ Result := -1;
+ Exit;
+ End;
+ fsFromCurrent:
+ ;
+ fsFromEnd:
+ If(cChars > 0) Then
+ Begin
+ Writeln('fsFromEnd takes no positive cChars.');
+ Result := -1;
+ Exit;
+ End;
+ else
+ Begin
+ WriteLn('Invalid Origin: ' + IntToStr(Origin));
+ Result := -1;
+ Exit;
+ End;
+ End;
+
+ Try
+ Result := MFiles[FileNum].FS.Seek(cChars, Origin);
+ Except
+ WriteLn('SetFileCharPointer - Exception Occured.');
+ End;
+ //Result := FileSeek(Files[FileNum].Handle, cChars, Origin);
+End;
+{/\
+ Opens a file for reading.
+ Returns the handle (index) to the File Array.
+ Returns -1 if unsuccesfull.
+/\}
+
+function TMFiles.CreateFile(Path: string): Integer;
+
+Var
+ FS: TFileStream;
+
+begin
+ Try
+ FS := TFileStream.Create(Path, fmCreate);
+ Except
+ Result := -1;
+ WriteLn('CreateFile - Exception. Could not create file. Returning -1');
+ Exit;
+ End;
+
+ Result := AddFileToManagedList(Path, FS, fmCreate);
+end;
+
+{/\
+ Opens a file for reading.
+ Returns the handle (index) to the File Array.
+ Returns -1 if unsuccesfull.
+/\}
+
+function TMFiles.OpenFile(Path: string; Shared: Boolean): Integer;
+
+Var
+ FS: TFileStream;
+ fMode: Integer;
+
+begin
+ If Shared Then
+ fMode := fmOpenRead or fmShareDenyNone
+ Else
+ fMode := fmOpenRead or fmShareExclusive;
+
+ Try
+ FS := TFileStream.Create(Path, fMode)
+ Except
+ Result := -1;
+ WriteLn('OpenFile - Exception. Could not create file. Returning -1');
+ Exit;
+ End;
+
+ Result := AddFileToManagedList(Path, FS, fMode);
+
+ {Result := FileOpen(Path, fmOpenRead);
+ If Result <> -1 Then
+ Begin
+ //WriteLn('File was successfully opened');
+ Result := AddFileToManagedList(Path, Result, fmOpenRead);
+ {If Result <> -1 Then
+ WriteLn('File was successfully added: ' + IntToStr(Result));}
+ End Else
+ Begin
+ WriteLn('Could not open file. Returning -1');
+ End; }
+end;
+
+{/\
+ Opens a file for writing.
+ Returns the handle (index) to the File Array.
+ Returns -1 if unsuccesfull.
+/\}
+
+function TMFiles.RewriteFile(Path: string; Shared: Boolean): Integer;
+
+Var
+ FS: TFileStream;
+ fMode: Integer;
+begin
+ If Shared Then
+ fMode := fmOpenReadWrite or fmShareDenyNone or fmCreate
+ Else
+ fMode := fmOpenReadWrite or fmShareDenyWrite or fmShareDenyRead or fmCreate;
+
+ Try
+ FS := TFileStream.Create(Path, fMode);
+ Except
+ Result := -1;
+ WriteLn('ReWriteFile - Exception. Could not create file. Returning -1');
+ Exit;
+ End;
+
+ Result := AddFileToManagedList(Path, FS, fMode);
+
+ {Result := FileOpen(Path, fmOpenReadWrite);
+ If Result <> -1 Then
+ Begin
+ //WriteLn('File was successfully opened.');
+ Result := AddFileToManagedList(Path, Result, fmOpenReadWrite);
+ {If Result <> -1 Then
+ WriteLn('File was successfully added: ' + IntToStr(Result)); }
+ End Else
+ Begin
+ WriteLn('Could not open file. Returning -1');
+ End; }
+end;
+
+{/\
+ Free's the given File at the given index.
+/\}
+procedure TMFiles.CloseFile(FileNum: Integer);
+
+begin
+ //Writeln('Length of Files: ' + IntToStr(Length(Files)));
+ If (FileNum >= Length(MFiles)) or (FileNum < 0) Then
+ Begin
+ WriteLn('CloseFile. Invalid FileNum: ' + IntToStr(FileNum));
+ Exit;
+ End;
+
+ Try
+ MFiles[FileNum].FS.Free;
+ Except
+ WriteLn('CloseFile, exception when freeing the file...');
+ Exit;
+ End;
+
+ MFiles[FileNum].FS := nil;
+ SetLength(FreeSpots, Length(FreeSpots) + 1);
+ FreeSpots[High(FreeSpots)] := FileNum;
+
+ {If Files[FileNum].Handle = -1 Then
+ Begin
+ WriteLn('CloseFile: Invalid Internal Handle');
+ Exit;
+ End;
+ FileClose(Files[FileNum].Handle); }
+
+end;
+
+{/\
+ Returns true if the BytesRead of the given FileNum (Index) has been reached.
+ Also returns true if the FileNum is not valid.
+/\}
+
+function TMFiles.EndOfFile(FileNum: Integer): Boolean;
+begin
+ If(FileNum < 0) or (FileNum >= Length(MFiles)) Then
+ Begin
+ WriteLn('Invalid File Num');
+ Result := True;
+ Exit;
+ End;
+ If MFiles[FileNum].FS = nil Then
+ Begin
+ WriteLn('EndOfFile: Invalid Internal Handle');
+ Result := True;
+ Exit;
+ End;
+
+ Result := FilePointerPos(FileNum) >= FileSizeMuf(FileNum);
+end;
+
+{/\
+ Returns the FileSize of the given index (FileNum)
+/\}
+
+function TMFiles.FileSizeMuf(FileNum: Integer): LongInt;
+Var
+ tempPos: Integer;
begin
- inherited;
+ If(FileNum < 0) or (FileNum >= Length(MFiles)) Then
+ Begin
+ WriteLn('Invalid File Num');
+ Result := -1;
+ Exit;
+ End;
+
+ If MFiles[FileNum].FS = nil Then
+ Begin
+ WriteLn('FileSize: Invalid Internal Handle');
+ Result := -1;
+ Exit;
+ End;
+
+ Result := MFiles[FileNum].FS.Size;
+
+ {
+ If Files[FileNum].Handle = -1 Then
+ Begin
+ WriteLn('FileSize: Invalid Internal Handle');
+ Result := -1;
+ Exit;
+ End;
+ // Get our current position.
+ tempPos := FileSeek(Files[FileNum].Handle, 0, fsFromCurrent);
+
+ // End of the file.
+ Result := FileSeek(Files[FileNum].Handle, 0, fsFromEnd);
+
+ // Reset the position.
+ FileSeek(Files[FileNum].Handle, tempPos, fsFromBeginning); }
+end;
+
+function TMFiles.FilePointerPos(FileNum: Integer): Integer;
+begin
+ If(FileNum < 0) or (FileNum >= Length(MFiles)) Then
+ Begin
+ WriteLn('Invalid File Num');
+ Result := -1;
+ Exit;
+ End;
+ If MFiles[FileNum].FS = nil Then
+ Begin
+ WriteLn('FileSize: Invalid Internal Handle');
+ Result := -1;
+ Exit;
+ End;
+
+ try
+ Result := MFiles[FileNum].FS.Seek(0, fsFromCurrent);
+ Except
+ WriteLn('Exception in FilePointerPos');
+ End;
+ //Result := FileSeek(Files[FileNum].FS, 0, fsFromCurrent);
+end;
+
+{/\
+ Reads x numbers of characters from a file, and stores it into s.
+/\}
+
+function TMFiles.ReadFileString(FileNum: Integer; var s: string; x: Integer): Boolean;
+
+begin
+ If(FileNum < 0) or (FileNum >= Length(MFiles)) Then
+ Begin
+ WriteLn('Invalid File Num');
+ Result := False;
+ Exit;
+ End;
+ If MFiles[FileNum].FS = nil Then
+ Begin
+ WriteLn('ReadFileString: Invalid Internal Handle');
+ Exit;
+ End;
+
+ SetLength(S, 0);
+ SetLength(S, X);
+ MFiles[FileNum].FS.Read(S[1], x);
+
+ {Files[FileNum].BytesRead := Files[FileNum].BytesRead + X;
+ FileRead(Files[FileNum].Handle, S[1], X);
+ SetLength(S, X); }
+end;
+
+{/\
+ Writes s in the given File.
+/\}
+
+function TMFiles.WriteFileString(FileNum: Integer; s: string): Boolean;
+var
+ BytesRead : DWord;
+begin
+ If(FileNum < 0) or (FileNum >= Length(MFiles)) Then
+ Begin
+ WriteLn('Invalid File Num');
+ Result := False;
+ Exit;
+ End;
+ If(MFiles[FileNum].FS = nil) Then
+ Begin
+ WriteLn('WriteFileString: Invalid Internal Handle');
+ Result := False;
+ Exit;
+ End;
+
+ {If((Files[FileNum].Mode and fmOpenWrite) = 0) Then
+ Begin
+ WriteLn('This file may not write');
+ Exit;
+ End; }
+
+ try
+ Result := MFiles[FileNum].FS.Write(S[1], Length(S)) <> 1;
+ except
+ WriteLn('Exception - WriteFileString.');
+ Result := False;
+ end;
+
+ {If(FileWrite(Files[FileNum].Handle, S[1], Length(S)) <> -1) Then
+ Result := True
+ Else
+ Result := False; }
end;
end.