CyberbitNetInstall.Mod 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. MODULE CyberbitNetInstall; (** AUTHOR "PL"; PURPOSE "Downloads Cyberbit Unicode Truetype Font from Netscape FTP"; *)
  2. IMPORT
  3. Streams, KernelLog, Files, Strings, WMDialogs, WMComponents, WMWindowManager, Commands,
  4. WMGraphics, WMGraphicUtilities, WMStandardComponents, WMRectangles, FTPClient;
  5. CONST
  6. user = "anonymous";
  7. pass = "anonymous@the.net";
  8. address = "ftp.netscape.com";
  9. path = "/pub/communicator/extras/fonts/windows/";
  10. file = "Cyberbit.ZIP";
  11. BufSize = 16*1024;
  12. TYPE
  13. Downloader = OBJECT
  14. PROCEDURE &New*;
  15. VAR res : WORD; temp : ARRAY 16 OF CHAR;
  16. r : Streams.Reader; w : Files.Writer;
  17. buf: ARRAY BufSize OF CHAR; len : LONGINT;
  18. msg, s : ARRAY 256 OF CHAR; i, j : LONGINT;
  19. ftpConnection : FTPClient.FTPClient;
  20. errorStr : ARRAY 512 OF CHAR;
  21. f : Files.File;
  22. status : StatusWindow; transCount : LONGINT;
  23. BEGIN
  24. NEW(ftpConnection);
  25. (* open connection to the ftp *)
  26. ftpConnection.Open(address, user, pass, 21, res);
  27. IF (res # 0) THEN
  28. Strings.IntToStr(res, temp);
  29. COPY("Connection Failed with Error: ", errorStr); Strings.Append(errorStr, temp);
  30. WMDialogs.Error("CyberbitNetInstall Error", errorStr);
  31. RETURN
  32. END;
  33. (* change into correct directory *)
  34. ftpConnection.ChangeDir(path, res);
  35. IF (res # 0) THEN
  36. Strings.IntToStr(res, temp);
  37. COPY("Directory not found: ", errorStr); Strings.Append(errorStr, path);
  38. WMDialogs.Error("CyberbitNetInstall Error", errorStr);
  39. ftpConnection.Close(res);
  40. RETURN
  41. END;
  42. (* open the remote file *)
  43. ftpConnection.OpenGet(file, r, res);
  44. IF (res # 0) THEN
  45. Strings.IntToStr(res, temp);
  46. COPY("Couldn't open file: ", errorStr); Strings.Append(errorStr, file);
  47. WMDialogs.Error("CyberbitNetInstall Error", errorStr);
  48. ftpConnection.Close(res);
  49. RETURN
  50. END;
  51. (* get the size of the file *)
  52. COPY(ftpConnection.msg, msg); j := 0;
  53. FOR i := Strings.Pos("(", msg) TO Strings.Pos("bytes", msg)-2 DO
  54. temp[j] := msg[i+1];
  55. INC(j)
  56. END;
  57. temp[j] := 0X;
  58. Strings.StrToInt(temp, i);
  59. (* open the local file *)
  60. res := -1;
  61. IF (Files.Old(file) = NIL) OR (WMDialogs.Confirmation("Confirm overwriting", file) = WMDialogs.ResYes) THEN
  62. f := Files.New(file);
  63. IF f # NIL THEN
  64. Files.OpenWriter(w, f, 0);
  65. res := 0
  66. END
  67. ELSE
  68. RETURN
  69. END;
  70. (* create the status window *)
  71. NEW(status);
  72. status.fileSize := i;
  73. status.nofFiles := 1;
  74. (* transfer the bytes and update the statuswindow *)
  75. IF res = 0 THEN
  76. status.Show; transCount := 0;
  77. REPEAT
  78. r.Bytes(buf, 0, BufSize, len); w.Bytes(buf, 0, len);
  79. INC(transCount, len);
  80. status.UpdateStatus(1, transCount);
  81. UNTIL r.res # 0;
  82. ftpConnection.CloseGet(res);
  83. (* register/update file *)
  84. w.Update;
  85. f.Update;
  86. Files.Register(f);
  87. status.Hide
  88. END;
  89. (* close FTP connection *)
  90. ftpConnection.Close(res);
  91. (* extract File *)
  92. COPY("Unzip.ExtractAll ", s); Strings.Append(s, file);
  93. Commands.Call(s, {}, res, msg);
  94. IF res # 0 THEN
  95. KernelLog.String(msg); KernelLog.Ln
  96. ELSE
  97. KernelLog.String("CyberbitNetInstall finished"); KernelLog.Ln;
  98. END
  99. END New;
  100. END Downloader;
  101. StatusWindow = OBJECT(WMComponents.FormWindow)
  102. VAR
  103. nofFiles* : LONGINT;
  104. currentFile* : LONGINT;
  105. fileSize* : LONGINT;
  106. transferred* : LONGINT;
  107. currentFilename* : ARRAY 256 OF CHAR;
  108. shown : BOOLEAN;
  109. windowWidth, windowHeight : LONGINT;
  110. px, py : LONGINT;
  111. bar : WMStandardComponents.Panel;
  112. PROCEDURE &New*;
  113. VAR vc : WMComponents.VisualComponent;
  114. BEGIN
  115. manager := WMWindowManager.GetDefaultManager();
  116. px := 300; py := 200; shown := FALSE;
  117. windowWidth := 350; windowHeight := 100;
  118. vc := CreateForm();
  119. Init(vc.bounds.GetWidth(), vc.bounds.GetHeight(), FALSE);
  120. SetContent(vc);
  121. SetTitle(Strings.NewString("Status Window"));
  122. END New;
  123. PROCEDURE CreateForm*(): WMComponents.VisualComponent;
  124. VAR form, panel : WMStandardComponents.Panel;
  125. back : BevelPanel;
  126. label : WMStandardComponents.Label;
  127. rect : WMRectangles.Rectangle;
  128. windowStyle : WMWindowManager.WindowStyle;
  129. BEGIN
  130. windowStyle := manager.GetStyle();
  131. NEW(form);
  132. form.bounds.SetExtents(windowWidth, windowHeight);
  133. form.fillColor.Set(windowStyle.bgColor);
  134. NEW(panel);
  135. panel.alignment.Set(WMComponents.AlignClient);
  136. rect := WMRectangles.MakeRect(20, 10, 20, 20); panel.bearing.Set(rect);
  137. form.AddContent(panel);
  138. NEW(label);
  139. label.bounds.SetHeight(20); label.alignment.Set(WMComponents.AlignTop);
  140. label.textColor.Set(windowStyle.fgColor); label.alignH.Set(WMGraphics.AlignCenter);
  141. label.caption.SetAOC("Transfering...");
  142. panel.AddContent(label);
  143. NEW(back); back.bevelWidth := 2; back.bevelColor := windowStyle.bgColor;
  144. back.bounds.SetHeight(20);
  145. back.alignment.Set(WMComponents.AlignTop); (* back.fillColor.Set(0FFFFFFFFH); *)
  146. rect := WMRectangles.MakeRect(0, 10, 0, 10);
  147. back.bearing.Set(rect);
  148. panel.AddContent(back);
  149. NEW(bar);
  150. bar.bounds.SetWidth(0);
  151. bar.alignment.Set(WMComponents.AlignLeft); bar.fillColor.Set(0FFFFH);
  152. back.AddContent(bar);
  153. RETURN form
  154. END CreateForm;
  155. PROCEDURE Show*;
  156. BEGIN
  157. IF ~shown THEN
  158. shown := TRUE;
  159. WMWindowManager.ExtAddWindow(SELF, px, py,
  160. {WMWindowManager.FlagFrame, WMWindowManager.FlagStayOnTop, WMWindowManager.FlagClose, WMWindowManager.FlagMinimize});
  161. END;
  162. END Show;
  163. PROCEDURE Hide*;
  164. BEGIN
  165. manager.Remove(SELF);
  166. shown := FALSE
  167. END Hide;
  168. PROCEDURE UpdateStatus*(file, size : LONGINT);
  169. BEGIN
  170. bar.bounds.SetWidth(ENTIER((windowWidth-20)/fileSize*size));
  171. END UpdateStatus;
  172. END StatusWindow;
  173. BevelPanel* = OBJECT(WMStandardComponents.Panel);
  174. VAR
  175. bevelWidth* : LONGINT;
  176. bevelColor* : LONGINT;
  177. PROCEDURE DrawBackground*(canvas : WMGraphics.Canvas);
  178. BEGIN
  179. IF ~visible.Get() THEN RETURN END;
  180. Acquire;
  181. WMGraphicUtilities.DrawBevelPanel(canvas, GetClientRect(), bevelWidth, TRUE, bevelColor, 0 );
  182. Release;
  183. END DrawBackground;
  184. END BevelPanel;
  185. PROCEDURE Start*;
  186. VAR loader : Downloader;
  187. BEGIN
  188. NEW(loader);
  189. END Start;
  190. END CyberbitNetInstall.
  191. ------------------------------------------------------------------------------------------
  192. System.Free CyberbitNetInstall~
  193. CyberbitNetInstall.Start~