unzipdll.pas 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. {
  2. $Id$
  3. }
  4. unit UnzipDLL;
  5. {$IFDEF VIRTUALPASCAL}
  6. {$Cdecl+,AlignRec-,OrgName+}
  7. {$ELSE}
  8. {$IFDEF FPC}
  9. {$PACKRECORDS 1}
  10. {$ENDIF}
  11. {$ENDIF}
  12. interface
  13. const
  14. UnzipErr: longint = 0;
  15. type
  16. TArgV = array [0..1024] of PChar;
  17. PArgV = ^TArgV;
  18. TCharArray = array [1..1024*1024] of char;
  19. PCharArray = ^TCharArray;
  20. function FileUnzipEx (SourceZipFile, TargetDirectory,
  21. FileSpecs: PChar): integer;
  22. (* Returns non-zero result on success. *)
  23. implementation
  24. uses
  25. {$IFDEF OS2}
  26. {$IFDEF FPC}
  27. DosCalls,
  28. {$ELSE FPC}
  29. {$IFDEF VirtualPascal}
  30. OS2Base,
  31. {$ELSE VirtualPascal}
  32. BseDos,
  33. {$ENDIF VirtualPascal}
  34. {$ENDIF FPC}
  35. {$ELSE}
  36. {$IFDEF WIN32}
  37. Windows,
  38. {$ENDIF WIN32}
  39. {$ENDIF OS2}
  40. Dos;
  41. type
  42. UzpMainFunc = function (ArgC: longint; var ArgV: TArgV): longint; cdecl;
  43. const
  44. {$IFDEF OS2}
  45. AllFiles: string [1] = '*';
  46. {$ELSE}
  47. {$IFDEF WIN32}
  48. AllFiles: string [3] = '*.*';
  49. {$ENDIF}
  50. {$ENDIF}
  51. {$IFDEF OS2}
  52. LibPath = 'LIBPATH';
  53. {$ELSE}
  54. LibPath = 'PATH';
  55. {$ENDIF}
  56. UzpMainOrd = 4;
  57. DLLName: string [8] = 'UNZIP32'#0;
  58. UzpMain: UzpMainFunc = nil;
  59. QuiteOpt: array [1..4] of char = '-qq'#0;
  60. OverOpt: array [1..3] of char = '-o'#0;
  61. CaseInsOpt: array [1..3] of char = '-C'#0;
  62. ExDirOpt: array [1..3] of char = '-d'#0;
  63. OptCount = 4;
  64. var
  65. DLLHandle: longint;
  66. OldExit: pointer;
  67. function DLLInit: boolean;
  68. var
  69. {$IFDEF OS2}
  70. ErrPath: array [0..259] of char;
  71. {$ENDIF}
  72. DLLPath: PathStr;
  73. Dir: DirStr;
  74. Name: NameStr;
  75. Ext: ExtStr;
  76. begin
  77. DLLInit := false;
  78. FSplit (FExpand (ParamStr (0)), Dir, Name, Ext);
  79. DLLPath := Dir + DLLName;
  80. Insert ('.DLL', DLLPath, byte (DLLPath [0]));
  81. {$IFDEF OS2}
  82. if (DosLoadModule (@ErrPath, SizeOf (ErrPath), @DLLPath [1], DLLHandle) <> 0)
  83. and (DosLoadModule (@ErrPath, SizeOf (ErrPath), @DLLName [1], DLLHandle) <> 0)
  84. then
  85. begin
  86. if ErrPath [0] <> #0 then
  87. begin
  88. Write (#13#10'Error while loading module ');
  89. WriteLn (PChar (@ErrPath));
  90. end;
  91. {$IFDEF FPC}
  92. end else DLLInit := DosQueryProcAddr (DLLHandle, UzpMainOrd, nil, pointer (UzpMain)) = 0;
  93. {$ELSE}
  94. end else DLLInit := DosQueryProcAddr (DLLHandle, UzpMainOrd, nil, @UzpMain) = 0;
  95. {$ENDIF}
  96. {$ELSE}
  97. {$IFDEF WIN32}
  98. DLLHandle := LoadLibrary (@DLLPath [1]);
  99. if DLLHandle = 0 then DLLHandle := LoadLibrary (@DLLName [1]);
  100. if DLLHandle = 0 then WriteLn (#13#10'Error while loading DLL.') else
  101. begin
  102. (* UzpMain := UzpMainFunc (GetProcAddress (DLLHandle, 'UzpMain'));
  103. *)
  104. UzpMain := UzpMainFunc (GetProcAddress (DLLHandle, 'Unz_Unzip'));
  105. DLLInit := Assigned (UzpMain);
  106. end;
  107. {$ENDIF}
  108. {$ENDIF}
  109. end;
  110. procedure NewExit;
  111. begin
  112. ExitProc := OldExit;
  113. {$IFDEF OS2}
  114. DosFreeModule (DLLHandle);
  115. {$ELSE}
  116. {$IFDEF WIN32}
  117. FreeLibrary (DLLHandle);
  118. {$ENDIF}
  119. {$ENDIF}
  120. end;
  121. function FileUnzipEx (SourceZipFile, TargetDirectory,
  122. FileSpecs: PChar): integer;
  123. var
  124. I, FCount, ArgC: longint;
  125. ArgV: TArgV;
  126. P: PChar;
  127. StrLen: array [Succ (OptCount)..1024] of longint;
  128. begin
  129. ArgV [0] := @DLLName;
  130. ArgV [1] := @QuiteOpt;
  131. ArgV [2] := @OverOpt;
  132. ArgV [3] := @CaseInsOpt;
  133. ArgV [4] := SourceZipFile;
  134. FCount := 0;
  135. if FileSpecs^ <> #0 then
  136. begin
  137. P := FileSpecs;
  138. I := 0;
  139. repeat
  140. case FileSpecs^ of
  141. '"': begin
  142. Inc (FileSpecs);
  143. repeat Inc (I) until (FileSpecs^ = '"') or (FileSpecs^ = #0);
  144. Inc (FileSpecs);
  145. Inc (I);
  146. end;
  147. '''': begin
  148. Inc (FileSpecs);
  149. repeat Inc (I) until (FileSpecs^ = '''') or (FileSpecs^ = #0);
  150. Inc (FileSpecs);
  151. Inc (I);
  152. end;
  153. #0, ' ', #9: begin
  154. Inc (I);
  155. Inc (FCount);
  156. GetMem (ArgV [OptCount + FCount], I);
  157. Move (P^, ArgV [OptCount + FCount]^, Pred (I));
  158. PCharArray (ArgV [OptCount + FCount])^ [I] := #0;
  159. StrLen [OptCount + FCount] := I;
  160. while (FileSpecs^ = #9) or (FileSpecs^ = ' ') do Inc (FileSpecs);
  161. P := FileSpecs;
  162. I := 0;
  163. end;
  164. else
  165. begin
  166. Inc (I);
  167. Inc (FileSpecs);
  168. end;
  169. end;
  170. until (FileSpecs^ = #0) and (I = 0);
  171. end else
  172. begin
  173. FCount := 1;
  174. StrLen [OptCount + FCount] := Succ (byte (AllFiles [0]));
  175. GetMem (ArgV [OptCount + FCount], StrLen [OptCount + FCount]);
  176. Move (AllFiles [1], ArgV [OptCount + FCount]^, StrLen [OptCount + FCount]);
  177. end;
  178. ArgC := Succ (FCount + OptCount);
  179. ArgV [ArgC] := @ExDirOpt;
  180. Inc (ArgC);
  181. ArgV [ArgC] := TargetDirectory;
  182. Inc (ArgC);
  183. ArgV [ArgC] := @ExDirOpt [3]; (* contains #0 *)
  184. UnzipErr := UzpMain (ArgC, ArgV);
  185. if UnzipErr <> 0 then FileUnzipEx := 0 else FileUnzipEx := FCount;
  186. for I := 1 to FCount do FreeMem (ArgV [I + OptCount], StrLen [I + OptCount]);
  187. end;
  188. begin
  189. if DLLInit then
  190. begin
  191. OldExit := ExitProc;
  192. ExitProc := @NewExit;
  193. end else
  194. begin
  195. WriteLn (#13#10'Dynamic library UNZIP32.DLL from InfoZip is needed to install.');
  196. WriteLn ('This library could not be found on your system, however.');
  197. WriteLn ('Please, download the library, either from the location where you found');
  198. WriteLn ('this installer, or from any FTP archive carrying InfoZip programs.');
  199. WriteLn ('If you have this DLL on your disk, please, check your configuration (' + LIBPATH + ').');
  200. Halt (255);
  201. end;
  202. end.
  203. {
  204. $Log$
  205. Revision 1.2 2000-10-18 20:14:32 hajny
  206. * FPC compatibility issues
  207. Revision 1.1 2000/07/13 06:30:22 michael
  208. + Initial import
  209. Revision 1.5 2000/06/18 18:27:32 hajny
  210. + archive validity checking, progress indicator, better error checking
  211. Revision 1.4 2000/06/13 16:21:36 hajny
  212. * Win32 support corrected/completed
  213. Revision 1.3 2000/03/05 17:57:08 hajny
  214. + added support for Win32 (untested)
  215. Revision 1.2 1999/06/10 07:28:29 hajny
  216. * compilable with TP again
  217. Revision 1.1 1999/02/19 16:45:26 peter
  218. * moved to fpinst/ directory
  219. + makefile
  220. }