123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- program BrowserDom10;
- {$mode objfpc}
- uses
- BrowserConsole, JS, Classes, SysUtils, Web, BrowserApp, libzenfs, libzenfsdom, wasizenfs,
- zenfsutils;
- Type
- { TMyApplication }
- TMyApplication = class(TBrowserApplication)
- Private
- BtnDownload : TJSHTMLButtonElement;
- EdtFileName : TJSHTMLInputElement;
- DivDownloads : TJSHTMLElement;
- FTreeBuilder : THTMLZenFSTree;
- procedure CreateFiles;
- procedure DoReset(Event: TJSEvent); async;
- procedure DoSelectFile(Sender: TObject; aFileName: String; aType: TFileType);
- procedure MaybeCreateFiles;
- procedure SetupFS; async;
- procedure DoDownload(Event : TJSEvent);
- Public
- constructor Create(aOwner : TComponent); override;
- procedure DoRun; override;
- end;
- { TMyApplication }
- constructor TMyApplication.Create(aOwner: TComponent);
- begin
- inherited Create(aOwner);
- // Allow to load file specified in hash: index.html#mywasmfile.wasm
- BtnDownload:=TJSHTMLButtonElement(GetHTMLElement('btnDownload'));
- BtnDownload.AddEVentListener('click',@DoDownload);
- BtnDownload:=TJSHTMLButtonElement(GetHTMLElement('btnReset'));
- BtnDownload.AddEVentListener('click',@DoReset);
- EdtFileName:=TJSHTMLInputElement(GetHTMLElement('edtFilename'));
- DivDownloads:=GetHTMLElement('divDownloads');
- FTreeBuilder:=THTMLZenFSTree.Create(Self);
- FTreeBuilder.MaxHeight:='300px';
- FTreeBuilder.ParentElementID:='treeFiles';
- FTreeBuilder.OnFileSelected:=@DoSelectFile;
- end;
- procedure TMyApplication.DoRun;
- begin
- SetupFS;
- end;
- procedure TMyApplication.CreateFiles;
- Procedure ForceDir(const aDir: string);
- var
- Stat : TZenFSStats;
- begin
- try
- Stat:=ZenFS.statSync(aDir);
- except
- Writeln('Directory "',aDir,'" does not exist, creating it.')
- end;
- if Not assigned(Stat) then
- begin
- try
- ZenFS.mkdirSync(aDir,&775)
- except
- Writeln('Failed to create directory "',aDir,'"');
- Raise;
- end;
- end
- else if Stat.isDirectory then
- Raise Exception.Create(aDir+' is not a directory');
- end;
- Procedure ForceFile(aFile : String);
- var
- S : String;
- I : Integer;
- begin
- Writeln('Creating file: ',aFile);
- S:='This is the content of file "'+aFile+'". Some random numbers:';
- For I:=1 to 10+Random(90) do
- S:=S+'Line '+IntToStr(i)+': '+IntToStr(1+Random(100))+sLineBreak;
- try
- ZenFS.writeFileSync(aFile,S);
- except
- Writeln('Failed to create file: ',aFile);
- end;
- end;
- var
- FN : Integer;
- begin
- ForceDir('/tmp');
- ForceFile('/tmp/file1.txt');
- ForceDir('/tmp/logs');
- For FN:=2 to 5+Random(5) do
- ForceFile(Format('/tmp/file_%d.txt',[FN]));
- For FN:=1 to 5+Random(5) do
- ForceFile(Format('/tmp/logs/file_%.6d.log',[FN]));
- ForceDir('/home');
- ForceDir('/home/user');
- For FN:=1 to 5+Random(5) do
- ForceFile(Format('/home/user/diary%d.log',[FN]));
- ForceDir('/home/user2');
- For FN:=1 to 1+Random(5) do
- ForceFile(Format('/home/user2/diary%d.log',[FN]));
- end;
- procedure TMyApplication.DoSelectFile(Sender: TObject; aFileName: String; aType: TFileType);
- const
- filetypes : Array[TFileType] of string = ('Unknown','File','Directory','SymLink');
- begin
- Writeln('You selected '+FileTypes[aType]+': '+aFileName);
- if aType=ftFile then
- EdtFileName.Value:=aFileName;
- end;
- procedure TMyApplication.MaybeCreateFiles;
- var
- Stat : TZenFSStats;
- begin
- try
- Stat:=ZenFS.statSync('/tmp/file1.txt');
- except
- Writeln('Directory structure does not exist, creating one');
- end;
- if Not assigned(Stat) then
- CreateFiles
- else
- Writeln('Directory structure already exists.');
- end;
- procedure TMyApplication.SetupFS;
- begin
- Terminate;
- aWait(TJSObject,ZenFS.configure(
- New([
- 'mounts', New([
- '/',DomBackends.WebStorage
- ])
- ])));
- MaybeCreateFiles;
- FTreeBuilder.ShowDir('/');
- end;
- procedure TMyApplication.DoReset(Event : TJSEvent);
- begin
- window.localStorage.removeItem('0');
- FTreeBuilder.Clear;
- SetupFS;
- end;
- procedure TMyApplication.DoDownload(Event : TJSEvent);
- var
- a : TJSHTMLAnchorElement;
- begin
- a:=CreateDownLoadFromFile(edtFileName.value,'application/octet-stream',divDownloads,'file '+edtFileName.value);
- a.click;
- end;
- var
- Application : TMyApplication;
- begin
- Application:=TMyApplication.Create(nil);
- Application.Initialize;
- Application.Run;
- end.
|