2
0

GXS.ArchiveManager.pas 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740
  1. //
  2. // The graphics engine GXScene https://github.com/glscene
  3. //
  4. unit GXS.ArchiveManager;
  5. {$I Stage.Defines.inc}
  6. interface
  7. uses
  8. System.Classes,
  9. System.SysUtils,
  10. Stage.Strings,
  11. GXS.PersistentClasses,
  12. GXS.ApplicationFileIO;
  13. Type
  14. TCompressionLevel = (
  15. clNone,
  16. clFastest,
  17. clDefault,
  18. clMax,
  19. clLevel1,
  20. clLevel2,
  21. clLevel3,
  22. clLevel4,
  23. clLevel5,
  24. clLevel6,
  25. clLevel7,
  26. clLevel8,
  27. clLevel9
  28. );
  29. //Base classes for archivers
  30. TgxBaseArchive = class(TgxDataFile)
  31. protected
  32. FFileName: string;
  33. FContentList: TStrings;
  34. FCompressionLevel: TCompressionLevel;
  35. Procedure SetCompressionLevel(aValue: TCompressionLevel); Virtual;
  36. public
  37. constructor Create(AOwner: TPersistent); override;
  38. destructor Destroy; override;
  39. property ContentList: TStrings read FContentList;
  40. property CompressionLevel: TCompressionLevel
  41. read FCompressionLevel
  42. write SetCompressionLevel default clNone;
  43. procedure Clear; virtual;abstract;
  44. function ContentExists(ContentName: string): boolean;virtual;abstract;
  45. function GetContent(Stream: TStream; index: integer): TStream; overload;virtual;abstract;
  46. function GetContent(ContentName: string): TStream; overload;virtual;abstract;
  47. function GetContent(index: integer): TStream; overload;virtual;abstract;
  48. function GetContentSize(index: integer): integer; overload;virtual;abstract;
  49. function GetContentSize(ContentName: string): integer; overload;virtual;abstract;
  50. procedure AddFromStream(ContentName, Path: string; FS: TStream);virtual;abstract;
  51. procedure AddFromFile(FileName, Path: string);virtual;abstract;
  52. procedure RemoveContent(index: integer); overload;virtual;abstract;
  53. procedure RemoveContent(ContentName: string); overload;virtual;abstract;
  54. procedure Extract(index: integer; NewName: string); overload; virtual;abstract;
  55. procedure Extract(ContentName, NewName: string); overload; virtual;abstract;
  56. end;
  57. TgxBaseArchiveClass = class of TgxBaseArchive;
  58. // Registered archives for using extentions, e.g.: GLFilePak,GLFileZLib
  59. TArchiveFileFormat = class
  60. public
  61. BaseArchiveClass: TgxBaseArchiveClass;
  62. Extension: string;
  63. Description: string;
  64. DescResID: Integer;
  65. end;
  66. // List of registered classes
  67. TgxArchiveFileFormatsList = class(TgxPersistentObjectList)
  68. public
  69. destructor Destroy; override;
  70. procedure Add(const Ext, Desc: string; DescID: Integer; AClass:
  71. TgxBaseArchiveClass);
  72. function FindExt(ext: string): TgxBaseArchiveClass;
  73. function FindFromFileName(const fileName: string): TgxBaseArchiveClass;
  74. procedure Remove(AClass: TgxBaseArchiveClass);
  75. end;
  76. (* To work with several archives simultaniously collections implemented
  77. Item to work with one archive *)
  78. TLibArchive = class(TCollectionItem)
  79. private
  80. vArchive: TgxBaseArchive;
  81. ArcClass: TgxBaseArchiveClass;
  82. FFileName: string;
  83. FName: string;
  84. procedure SetCompressionLevel(aValue: TCompressionLevel);
  85. function GetCompressionLevel: TCompressionLevel;
  86. function GetContentList: TStrings;
  87. procedure SetName(const val: string);
  88. protected
  89. function GetDisplayName: string; override;
  90. public
  91. constructor Create(ACollection: TCollection); override;
  92. destructor Destroy; override;
  93. property CompressionLevel: TCompressionLevel
  94. read GetCompressionLevel
  95. write SetCompressionLevel default clNone;
  96. procedure CreateArchive(FileName: string;
  97. OverwriteExistingFile: boolean = False);
  98. property ContentList: TStrings read GetContentList;
  99. procedure LoadFromFile(aFileName: string); overload;
  100. procedure LoadFromFile(aFileName, aAchiverType: string); overload;
  101. procedure Clear;
  102. function ContentExists(aContentName: string): boolean;
  103. property FileName: string read FFileName;
  104. function GetContent(aindex: integer): TStream; overload;
  105. function GetContent(aContentName: string): TStream; overload;
  106. function GetContentSize(aindex: integer): integer; overload;
  107. function GetContentSize(aContentName: string): integer; overload;
  108. procedure AddFromStream(aContentName, aPath: string; aF: TStream); overload;
  109. procedure AddFromStream(aContentName: string; aF: TStream); overload;
  110. procedure AddFromFile(aFileName, aPath: string); overload;
  111. procedure AddFromFile(aFileName: string); overload;
  112. procedure RemoveContent(aindex: integer); overload;
  113. procedure RemoveContent(aContentName: string); overload;
  114. procedure Extract(aindex: integer; aNewName: string); overload;
  115. procedure Extract(aContentName, aNewName: string); overload;
  116. published
  117. property Name: string read FName write SetName;
  118. end;
  119. TLibArchives = class(TOwnedCollection)
  120. protected
  121. procedure SetItems(index: Integer; const val: TLibArchive);
  122. function GetItems(index: Integer): TLibArchive;
  123. public
  124. constructor Create(AOwner: TComponent);
  125. function Owner: TPersistent;
  126. function IndexOf(const Item: TLibArchive): integer;
  127. function Add: TLibArchive;
  128. function FindItemID(ID: integer): TLibArchive;
  129. property Items[index: integer]: TLibArchive read GetItems
  130. write SetItems; default;
  131. // Looking for an archive by the name of an open archive
  132. function GetArchiveByFileName(const AName: string): TLibArchive;
  133. function GetFileNameOfArchive(aValue: TLibArchive): string;
  134. // Looking for an necessary item
  135. function MakeUniqueName(const nameRoot: string): string;
  136. function GetLibArchiveByName(const AName: string): TLibArchive;
  137. function GetNameOfLibArchive(const Archive: TLibArchive): string;
  138. end;
  139. TgxSArchiveManager = class(TComponent)
  140. Private
  141. FArchives: TLibArchives;
  142. Procedure SetArchives(aValue: TLibArchives);
  143. Public
  144. constructor Create(AOwner: TComponent); override;
  145. destructor Destroy; override;
  146. function GetArchiveByFileName(const aName: string): TLibArchive;
  147. function GetFileNameOfArchive(const aArchive: TLibArchive): string;
  148. function GetContent(aContentName: string): TStream;
  149. function ContentExists(aContentName: string): boolean;
  150. function OpenArchive(aFileName: string): TLibArchive; overload;
  151. function OpenArchive(aFileName, aAchiverType: string): TLibArchive; overload;
  152. procedure CloseArchive(aArchive: TLibArchive);
  153. Published
  154. property Archives: TLibArchives read FArchives write SetArchives;
  155. end;
  156. EInvalidArchiveFile = class(Exception);
  157. function GetArchiveFileFormats: TgxArchiveFileFormatsList;
  158. procedure RegisterArchiveFormat(const AExtension, ADescription: string;
  159. AClass: TgxBaseArchiveClass);
  160. procedure UnregisterArchiveFormat(AClass: TgxBaseArchiveClass);
  161. // Note! It's working only with one manager
  162. function GetArchiveManager: TgxSArchiveManager;
  163. // Users getting results after LoadFromFile with this functions
  164. function ArcCreateFileStream(const fileName: string; mode: word): TStream;
  165. function ArcFileStreamExists(const fileName: string): boolean;
  166. // ------------------------------------------------------------------
  167. implementation
  168. // ------------------------------------------------------------------
  169. var
  170. vArchiveFileFormats: TgxArchiveFileFormatsList;
  171. vArchiveManager: TgxSArchiveManager;
  172. function GetArchiveFileFormats: TgxArchiveFileFormatsList;
  173. begin
  174. if not Assigned(vArchiveFileFormats) then
  175. vArchiveFileFormats := TgxArchiveFileFormatsList.Create;
  176. Result := vArchiveFileFormats;
  177. end;
  178. procedure RegisterArchiveFormat(const AExtension, ADescription: string;
  179. AClass: TgxBaseArchiveClass);
  180. begin
  181. RegisterClass(AClass);
  182. GetArchiveFileFormats.Add(AExtension, ADescription, 0, AClass);
  183. end;
  184. procedure UnregisterArchiveFormat(AClass: TgxBaseArchiveClass);
  185. begin
  186. if Assigned(vArchiveFileFormats) then
  187. vArchiveFileFormats.Remove(AClass);
  188. end;
  189. function GetArchiveManager: TgxSArchiveManager;
  190. begin
  191. Result := vArchiveManager;
  192. end;
  193. function ArcCreateFileStream(const fileName: string; mode: word): TStream;
  194. begin
  195. If GetArchiveManager <> nil then
  196. with GetArchiveManager do
  197. if ContentExists(fileName) then
  198. begin
  199. Result := GetContent(fileName);
  200. Exit;
  201. end;
  202. if FileExists(fileName) then begin
  203. Result := TFileStream.Create(FileName, mode);
  204. Exit;
  205. // Why to create filestream having no file while searching ???
  206. (* end
  207. else begin
  208. Result := TFileStream.Create(FileName, fmCreate or fmShareDenyWrite);
  209. Exit; *)
  210. end;
  211. Result:=nil;
  212. end;
  213. function ArcFileStreamExists(const fileName: string): boolean;
  214. begin
  215. If GetArchiveManager <> nil then
  216. with GetArchiveManager do
  217. if ContentExists(fileName) then
  218. begin
  219. Result:=True;
  220. Exit;
  221. end;
  222. Result := FileExists(fileName);
  223. end;
  224. //--------------------------------------
  225. // TLibArchive
  226. //--------------------------------------
  227. constructor TLibArchive.Create(ACollection: TCollection);
  228. begin
  229. inherited Create(ACollection);
  230. FName := TLibArchives(ACollection).MakeUniqueName('LibArchive');
  231. end;
  232. destructor TLibArchive.Destroy;
  233. begin
  234. Clear;
  235. inherited Destroy;
  236. end;
  237. procedure TLibArchive.SetCompressionLevel(aValue: TCompressionLevel);
  238. begin
  239. if vArchive = nil then Exit;
  240. vArchive.CompressionLevel := aValue;
  241. end;
  242. function TLibArchive.GetCompressionLevel: TCompressionLevel;
  243. begin
  244. Result := clNone;
  245. if vArchive = nil then Exit;
  246. Result := vArchive.CompressionLevel;
  247. end;
  248. procedure TLibArchive.CreateArchive(FileName: string;
  249. OverwriteExistingFile: boolean = False);
  250. var
  251. fFile: TFileStream;
  252. begin
  253. if OverwriteExistingFile or not FileExists(FileName) then
  254. begin
  255. fFile := TFileStream.Create(FileName, fmCreate);
  256. fFile.Free;
  257. end;
  258. end;
  259. procedure TLibArchive.LoadFromFile(aFileName: string);
  260. var
  261. ext: string;
  262. begin
  263. ext := LowerCase(ExtractFileExt(aFileName));
  264. Delete(ext,1,1);
  265. LoadFromFile(aFileName, ext);
  266. end;
  267. procedure TLibArchive.LoadFromFile(aFileName, aAchiverType: string);
  268. begin
  269. if not FileExists(aFileName) then
  270. Exit;
  271. ArcClass := GetArchiveFileFormats.FindExt(aAchiverType);
  272. If ArcClass=nil then
  273. begin
  274. raise Exception.Create(ClassName+': Unable to find module archiver to expand '+ aAchiverType);
  275. exit;
  276. end;
  277. vArchive := ArcClass.Create(nil);
  278. vArchive .LoadFromFile(aFileName);
  279. FFileName := aFileName;
  280. end;
  281. procedure TLibArchive.Clear;
  282. begin
  283. if vArchive=nil then Exit;
  284. vArchive.Clear;
  285. vArchive.Free;
  286. ArcClass :=nil;
  287. FFileName := '';
  288. end;
  289. function TLibArchive.ContentExists(aContentName: string): boolean;
  290. begin
  291. Result := false;
  292. if vArchive=nil then Exit;
  293. Result := vArchive.ContentExists(aContentName)
  294. end;
  295. function TLibArchive.GetContent(aindex: integer): TStream;
  296. begin
  297. Result := nil;
  298. if vArchive=nil then Exit;
  299. Result := vArchive.GetContent(aindex)
  300. end;
  301. function TLibArchive.GetContent(aContentName: string): TStream;
  302. begin
  303. Result := nil;
  304. if vArchive=nil then Exit;
  305. Result := vArchive.GetContent(aContentName)
  306. end;
  307. function TLibArchive.GetContentSize(aindex: integer): integer;
  308. begin
  309. Result := -1;
  310. if vArchive=nil then Exit;
  311. Result := vArchive.GetContentSize(aindex)
  312. end;
  313. function TLibArchive.GetContentSize(aContentName: string): integer;
  314. begin
  315. Result := -1;
  316. if vArchive=nil then Exit;
  317. Result := vArchive.GetContentSize(aContentName)
  318. end;
  319. procedure TLibArchive.AddFromStream(aContentName, aPath: string; aF: TStream);
  320. begin
  321. if vArchive=nil then Exit;
  322. vArchive.AddFromStream(aContentName, aPath, aF)
  323. end;
  324. procedure TLibArchive.AddFromStream(aContentName: string; aF: TStream);
  325. begin
  326. if vArchive=nil then Exit;
  327. vArchive.AddFromStream(aContentName, '', aF)
  328. end;
  329. procedure TLibArchive.AddFromFile(aFileName, aPath: string);
  330. begin
  331. if vArchive = nil then
  332. Exit;
  333. vArchive.AddFromFile(aFileName, aPath)
  334. end;
  335. procedure TLibArchive.AddFromFile(aFileName: string);
  336. begin
  337. if vArchive = nil then
  338. Exit;
  339. vArchive.AddFromFile(aFileName, '')
  340. end;
  341. procedure TLibArchive.RemoveContent(aindex: integer);
  342. begin
  343. if vArchive = nil then
  344. Exit;
  345. vArchive.RemoveContent(aindex)
  346. end;
  347. procedure TLibArchive.RemoveContent(aContentName: string);
  348. begin
  349. if vArchive = nil then
  350. Exit;
  351. vArchive.RemoveContent(aContentName)
  352. end;
  353. procedure TLibArchive.Extract(aindex: integer; aNewName: string);
  354. begin
  355. if vArchive = nil then
  356. Exit;
  357. vArchive.Extract(aindex, aNewName)
  358. end;
  359. procedure TLibArchive.Extract(aContentName, aNewName: string);
  360. begin
  361. if vArchive = nil then
  362. Exit;
  363. vArchive.Extract(aContentName, aNewName)
  364. end;
  365. function TLibArchive.GetContentList: TStrings;
  366. begin
  367. Result := nil;
  368. if vArchive = nil then
  369. Exit;
  370. Result := vArchive.ContentList;
  371. end;
  372. procedure TLibArchive.SetName(const val: string);
  373. begin
  374. if val <> FName then
  375. begin
  376. if not (csLoading in
  377. TComponent(TLibArchives(Collection).GetOwner).ComponentState) then
  378. begin
  379. if TLibArchives(Collection).GetLibArchiveByName(val) <> Self then
  380. FName := TLibArchives(Collection).MakeUniqueName(val)
  381. else
  382. FName := val;
  383. end
  384. else
  385. FName := val;
  386. end;
  387. end;
  388. function TLibArchive.GetDisplayName: string;
  389. begin
  390. Result := Name;
  391. end;
  392. //--------------------------------------
  393. // TLibArchives
  394. //--------------------------------------
  395. procedure TLibArchives.SetItems(index: Integer; const val: TLibArchive);
  396. begin
  397. GetItems(Index).Assign(Val);
  398. end;
  399. function TLibArchives.GetItems(index: Integer): TLibArchive;
  400. begin
  401. Result := TLibArchive(inherited GetItem(Index));
  402. end;
  403. constructor TLibArchives.Create(AOwner: TComponent);
  404. begin
  405. inherited Create(AOwner, TLibArchive);
  406. end;
  407. function TLibArchives.Owner: TPersistent;
  408. begin
  409. Result := GetOwner;
  410. end;
  411. function TLibArchives.IndexOf(const Item: TLibArchive): Integer;
  412. var
  413. I: Integer;
  414. begin
  415. Result := -1;
  416. if Count <> 0 then
  417. for I := 0 to Count - 1 do
  418. if GetItems(I) = Item then
  419. begin
  420. Result := I;
  421. Exit;
  422. end;
  423. end;
  424. function TLibArchives.Add: TLibArchive;
  425. begin
  426. Result := (inherited Add) as TLibArchive;
  427. end;
  428. function TLibArchives.FindItemID(ID: Integer): TLibArchive;
  429. begin
  430. Result := (inherited FindItemID(ID)) as TLibArchive;
  431. end;
  432. function TLibArchives.GetArchiveByFileName(const AName: string): TLibArchive;
  433. var
  434. i: Integer;
  435. Arc: TLibArchive;
  436. begin
  437. for i := 0 to Count - 1 do
  438. begin
  439. Arc := TLibArchive(inherited Items[i]);
  440. if Arc.FileName = AName then
  441. begin
  442. Result := Arc;
  443. Exit;
  444. end;
  445. end;
  446. Result := nil;
  447. end;
  448. function TLibArchives.GetFileNameOfArchive(aValue: TLibArchive): string;
  449. var
  450. ArcIndex: Integer;
  451. begin
  452. ArcIndex := IndexOf(aValue);
  453. if ArcIndex <> -1 then
  454. Result := GetItems(ArcIndex).FileName
  455. else
  456. Result := '';
  457. end;
  458. function TLibArchives.MakeUniqueName(const nameRoot: string): string;
  459. var
  460. i: Integer;
  461. begin
  462. Result := nameRoot;
  463. i := 1;
  464. while GetLibArchiveByName(Result) <> nil do
  465. begin
  466. Result := nameRoot + IntToStr(i);
  467. Inc(i);
  468. end;
  469. end;
  470. function TLibArchives.GetLibArchiveByName(const AName: string): TLibArchive;
  471. var
  472. i: Integer;
  473. Arc: TLibArchive;
  474. begin
  475. for i := 0 to Count - 1 do
  476. begin
  477. Arc := TLibArchive(inherited Items[i]);
  478. if (Arc.Name = AName) then
  479. begin
  480. Result := Arc;
  481. Exit;
  482. end;
  483. end;
  484. Result := nil;
  485. end;
  486. function TLibArchives.GetNameOfLibArchive(const Archive: TLibArchive): string;
  487. var
  488. MatIndex: Integer;
  489. begin
  490. MatIndex := IndexOf(Archive);
  491. if MatIndex <> -1 then
  492. Result := GetItems(MatIndex).Name
  493. else
  494. Result := '';
  495. end;
  496. //--------------------------------------
  497. // TgxArchiveFileFormatsList
  498. //--------------------------------------
  499. destructor TgxArchiveFileFormatsList.Destroy;
  500. begin
  501. Clean;
  502. inherited Destroy;
  503. end;
  504. procedure TgxArchiveFileFormatsList.Add(const Ext, Desc: string; DescID: Integer;
  505. AClass: TgxBaseArchiveClass);
  506. var
  507. newRec: TArchiveFileFormat;
  508. begin
  509. newRec := TArchiveFileFormat.Create;
  510. with newRec do
  511. begin
  512. Extension := AnsiLowerCase(Ext);
  513. BaseArchiveClass := AClass;
  514. Description := Desc;
  515. DescResID := DescID;
  516. end;
  517. inherited Add(newRec);
  518. end;
  519. function TgxArchiveFileFormatsList.FindExt(ext: string): TgxBaseArchiveClass;
  520. var
  521. i: Integer;
  522. begin
  523. ext := AnsiLowerCase(ext);
  524. for i := Count - 1 downto 0 do
  525. with TArchiveFileFormat(Items[I]) do
  526. begin
  527. if Extension = ext then
  528. begin
  529. Result := BaseArchiveClass;
  530. Exit;
  531. end;
  532. end;
  533. Result := nil;
  534. end;
  535. function TgxArchiveFileFormatsList.FindFromFileName(const fileName: string
  536. ): TgxBaseArchiveClass;
  537. var
  538. ext: string;
  539. begin
  540. ext := ExtractFileExt(Filename);
  541. System.Delete(ext, 1, 1);
  542. Result := FindExt(ext);
  543. if not Assigned(Result) then
  544. raise EInvalidArchiveFile.CreateFmt(strUnknownExtension,
  545. [ext, 'GLFile' + UpperCase(ext)]);
  546. end;
  547. procedure TgxArchiveFileFormatsList.Remove(AClass: TgxBaseArchiveClass);
  548. var
  549. i: Integer;
  550. begin
  551. for i := Count - 1 downto 0 do
  552. begin
  553. if TArchiveFileFormat(Items[i]).BaseArchiveClass.InheritsFrom(AClass) then
  554. DeleteAndFree(i);
  555. end;
  556. end;
  557. //--------------------------------------
  558. // TgxBaseArchive
  559. //--------------------------------------
  560. procedure TgxBaseArchive.SetCompressionLevel(aValue: TCompressionLevel);
  561. begin
  562. if FCompressionLevel <> aValue then
  563. FCompressionLevel := aValue;
  564. end;
  565. constructor TgxBaseArchive.Create(AOwner: TPersistent);
  566. begin
  567. inherited Create(AOwner);
  568. FContentList := TStringList.Create;
  569. FCompressionLevel := clNone;
  570. end;
  571. destructor TgxBaseArchive.Destroy;
  572. begin
  573. FContentList.Free;
  574. inherited Destroy;
  575. end;
  576. //--------------------------------------
  577. // TgxSArchiveManager
  578. //--------------------------------------
  579. constructor TgxSArchiveManager.Create(AOwner: TComponent);
  580. begin
  581. inherited Create(AOwner);
  582. FArchives := TLibArchives.Create(self);
  583. vArchiveManager := Self;
  584. vGXAFIOCreateFileStream := ArcCreateFileStream;
  585. vGXAFIOFileStreamExists := ArcFileStreamExists;
  586. end;
  587. destructor TgxSArchiveManager.Destroy;
  588. begin
  589. vArchiveManager := nil;
  590. FArchives.Free;
  591. inherited Destroy;
  592. end;
  593. procedure TgxSArchiveManager.SetArchives(aValue: TLibArchives);
  594. begin
  595. FArchives.Assign(aValue);
  596. end;
  597. function TgxSArchiveManager.GetArchiveByFileName(const aName: string): TLibArchive;
  598. begin
  599. Result := FArchives.GetArchiveByFileName(AName);
  600. end;
  601. function TgxSArchiveManager.GetFileNameOfArchive(const aArchive: TLibArchive): string;
  602. begin
  603. Result := FArchives.GetFileNameOfArchive(aArchive)
  604. end;
  605. function TgxSArchiveManager.GetContent(aContentName: string): TStream;
  606. var
  607. i: integer;
  608. begin
  609. Result := nil;
  610. With FArchives do
  611. for i:=0 to Count-1 do
  612. if Items[i].ContentExists(aContentName) then
  613. begin
  614. Result := Items[i].GetContent(aContentName);
  615. Exit;
  616. end;
  617. end;
  618. function TgxSArchiveManager.ContentExists(aContentName: string): boolean;
  619. var
  620. i: integer;
  621. begin
  622. Result := false;
  623. With FArchives do
  624. for i:=0 to Count-1 do
  625. if Items[i].ContentExists(aContentName) then
  626. begin
  627. Result := Items[i].ContentExists(aContentName);
  628. Exit;
  629. end;
  630. end;
  631. function TgxSArchiveManager.OpenArchive(aFileName: string): TLibArchive;
  632. begin
  633. Result := FArchives.Add;
  634. Result.LoadFromFile(aFileName);
  635. end;
  636. function TgxSArchiveManager.OpenArchive(aFileName, aAchiverType: string
  637. ): TLibArchive;
  638. begin
  639. Result := FArchives.Add;
  640. Result.LoadFromFile(aFileName, aAchiverType);
  641. end;
  642. procedure TgxSArchiveManager.CloseArchive(aArchive: TLibArchive);
  643. begin
  644. FArchives.Delete(FArchives.IndexOf(aArchive));
  645. end;
  646. //--------------------------------------------------------
  647. initialization
  648. //--------------------------------------------------------
  649. RegisterClasses([TgxSArchiveManager, TLibArchives]);
  650. finalization
  651. FreeAndNil(vArchiveFileFormats);
  652. end.