loadstrings.lpr 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. library stringshelper;
  2. {$mode objfpc}
  3. {$h+}
  4. uses nothreads, classes, sysutils, variants, job.js;
  5. Type
  6. // Define the necessary interfaces from the browser APIs.
  7. IJSResponse = interface(IJSObject)
  8. ['{0B705D5E-D166-325F-8AD5-004BD5C7161F}']
  9. function text: IJSPromise; // Promise<USVString>
  10. end;
  11. IJSWindow = interface(IJSObject)
  12. function fetch(const aInput: UnicodeString): IJSPromise; // Promise<Response>
  13. end;
  14. { TJSResponse }
  15. TJSResponse = class(TJSObject,IJSResponse)
  16. Protected
  17. function text: IJSPromise; overload; // Promise<USVString>
  18. class function Cast(aObj : IJSObject): IJSResponse;
  19. end;
  20. { TJSWindow }
  21. TJSWindow = class(TJSObject,IJSWindow)
  22. function fetch(const aInput: UnicodeString): IJSPromise; // Promise<Response>
  23. end;
  24. TLoadHelper = class(TObject)
  25. FURL: string;
  26. FStrings: TStrings;
  27. constructor Create(aURL: string; AList: TStrings);
  28. procedure LoadFromURL;
  29. function LoadOK(const aRes: Variant): Variant;
  30. function LoadJsonOK(const aRes: Variant): Variant;
  31. end;
  32. TStringsHelper = class helper for TStrings
  33. procedure LoadFromURL(const aURL: string);
  34. end;
  35. TApp = Class(TObject)
  36. private
  37. sl: TStringList;
  38. public
  39. procedure Run;
  40. end;
  41. var
  42. JSWindow : IJSWindow;
  43. { TJSWindow }
  44. function TJSWindow.fetch(const aInput: UnicodeString): IJSPromise;
  45. begin
  46. Result:=InvokeJSObjectResult('fetch',[aInput],TJSPromise) as IJSPromise;
  47. end;
  48. function TJSResponse.text: IJSPromise;
  49. begin
  50. Result:=InvokeJSObjectResult('text',[],TJSPromise) as IJSPromise;
  51. end;
  52. class function TJSResponse.Cast(aObj: IJSObject): IJSResponse;
  53. begin
  54. Result:=TJSResponse.JOBCast(aObj);
  55. end;
  56. { TLoadHelper }
  57. constructor TLoadHelper.Create(aURL: string; aList: TStrings);
  58. begin
  59. FURL := aURL;
  60. FStrings := AList;
  61. end;
  62. procedure TLoadHelper.LoadFromURL;
  63. begin
  64. try
  65. JSWindow.fetch(FURL)._then(@LoadOK);
  66. except
  67. Writeln('Aaaarrghhhh, error fetching :( :(');
  68. Free; // Need to free ourselves
  69. end;
  70. end;
  71. function TLoadHelper.LoadOK(const aRes: Variant): Variant;
  72. var
  73. aUnknown : IUnknown;
  74. aObject : IJSObject;
  75. res: IJSResponse;
  76. begin
  77. try
  78. //fetch returns a Response object, need to call text()/json() first
  79. writeln('got response object');
  80. if vartype(aRes)=varUnknown then
  81. Writeln('Got interface valued variant');
  82. aUnknown:=aRes;
  83. Writeln('Got interface from variant');
  84. aObject:=aUnknown as IJSObject;
  85. Writeln('Got IJSObject interface from variant');
  86. res := TJSResponse.Cast(aObject);
  87. Writeln('Got TJSResponse interface from IJSObject');
  88. Writeln('request text');
  89. res.text._then(@LoadJsonOK);
  90. Writeln('Done requesting text');
  91. except
  92. On E : Exception do
  93. begin
  94. Writeln('Exception : ',E.ClassName,' : ',E.Message);
  95. //something went wrong, free
  96. Free;
  97. end;
  98. end;
  99. end;
  100. function TLoadHelper.LoadJsonOK(const aRes: Variant): Variant;
  101. var
  102. S : String;
  103. begin
  104. writeln('got text result. Dumping stringlist');
  105. if vartype(aRes) = varOleStr then
  106. begin
  107. FStrings.Text:=varToStr(aRes);
  108. Writeln('----');
  109. for S in FStrings do
  110. Writeln(S);
  111. Writeln('----');
  112. Writeln('Normally you would have a callback here to indicate the text is loaded');
  113. end;
  114. Free;
  115. end;
  116. { TStringsHelper }
  117. procedure TStringsHelper.LoadFromURL(const aURL: string);
  118. begin
  119. with TLoadHelper.Create(aURL, Self) do
  120. LoadFromURL;
  121. end;
  122. { TApp }
  123. procedure TApp.Run;
  124. begin
  125. try
  126. sl := TStringList.Create;
  127. sl.LoadFromURL('lorem.txt');
  128. except
  129. on E: Exception do
  130. Writeln(e.Message);
  131. end;
  132. end;
  133. var
  134. App : TApp;
  135. begin
  136. JSWindow:=TJSWindow.JOBCreateGlobal('window');
  137. App:=TApp.Create;
  138. App.Run;
  139. end.