AsphyreArcSQX.pas
上传用户:ctlcnc
上传日期:2021-12-10
资源大小:4933k
文件大小:7k
源码类别:

2D图形编程

开发平台:

Delphi

  1. unit AsphyreArcSQX;
  2. //---------------------------------------------------------------------------
  3. // AsphyreArcSQX.pas                                    Modified: 14-Jan-2007
  4. // Archive Wrapper for SQX file format                            Version 1.0
  5. //---------------------------------------------------------------------------
  6. // The contents of this file are subject to the Mozilla Public License
  7. // Version 1.1 (the "License"); you may not use this file except in
  8. // compliance with the License. You may obtain a copy of the License at
  9. // http://www.mozilla.org/MPL/
  10. //
  11. // Software distributed under the License is distributed on an "AS IS"
  12. // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
  13. // License for the specific language governing rights and limitations
  14. // under the License.
  15. //---------------------------------------------------------------------------
  16. interface
  17. //---------------------------------------------------------------------------
  18. uses
  19.  Windows, Classes, SysUtils, AsphyreAsserts, MediaUtils, AsphyreArchives,
  20.  AsphyreSQX;
  21. //---------------------------------------------------------------------------
  22. type
  23.  TAsphyreArchiveSQX = class(TAsphyreCustomArchive)
  24.  private
  25.   ArchiveHandle: THandle;
  26.   FileList: array of string;
  27.   procedure ClearList();
  28.   function AddToList(const FileName: string): Integer;
  29.   function ListFiles(): Boolean;
  30.  protected
  31.   function GetItemCount(): Integer; override;
  32.   function GetItemName(Num: Integer): string; override;
  33.   function OpenArchive(const FileName: string): Boolean; override;
  34.   procedure CloseArchive(); override;
  35.   procedure DoCreate(); override;
  36.  public
  37.   function ExtractToDisk(const ItemName,
  38.    DestPath: string): Boolean; override;
  39.   function ExtractToStream(const ItemName: string;
  40.    Stream: TStream): Boolean; override;
  41.  end;
  42. //---------------------------------------------------------------------------
  43. procedure RegisterSQX(const Ext: string);
  44. //---------------------------------------------------------------------------
  45. implementation
  46. //---------------------------------------------------------------------------
  47. function SqxCallback(Param: Pointer;
  48.  var CallbackInfo: TSqxCallbackInfo): Integer; stdcall;
  49. begin
  50.  Result:= SQX_PROGRESS_OK;
  51. end;
  52. //---------------------------------------------------------------------------
  53. procedure TAsphyreArchiveSQX.DoCreate();
  54. begin
  55.  FAttributes:= [aaNoExtractToMem];
  56.  ArchiveHandle:= 0;
  57. end;
  58. //---------------------------------------------------------------------------
  59. procedure TAsphyreArchiveSQX.ClearList();
  60. begin
  61.  SetLength(FileList, 0);
  62. end;
  63. //---------------------------------------------------------------------------
  64. function TAsphyreArchiveSQX.AddToList(const FileName: string): Integer;
  65. var
  66.  Index: Integer;
  67. begin
  68.  Index:= Length(FileList);
  69.  SetLength(FileList, Index + 1);
  70.  FileList[Index]:= FileName;
  71.  Result:= Index;
  72. end;
  73. //---------------------------------------------------------------------------
  74. function TAsphyreArchiveSQX.ListFiles(): Boolean;
  75. var
  76.  FileMaskList: THandle;
  77.  ArcFileList : PSqxArcList;
  78.  ArcInfo     : TSqxArcInfo;
  79.  ListNode    : PSqxArcListNode;
  80. begin
  81.  // Create the lists.
  82.  FileMaskList:= SqxInitFileList(ArchiveHandle);
  83.  Result:= (FileMaskList <> 0);
  84.  if (not Result) then Exit;
  85.  ArcFileList := SqxInitArcFileList(ArchiveHandle);
  86.  Result:= (ArcFileList <> nil);
  87.  if (not Result) then Exit;
  88.  // Initialize archive information.
  89.  FillChar(ArcInfo, SizeOf(TSqxArcInfo), 0);
  90.  ArcInfo.Size:= SizeOf(TSqxArcInfo);
  91.  // Listing all files.
  92.  SqxAppendFileList(ArchiveHandle, FileMaskList, PChar('*.*'));
  93.  // List the archive.
  94.  Result:= (SqxListFiles(ArchiveHandle, FileMaskList, ArcFileList,
  95.   ArcInfo) = SQX_ERR_SUCCESS);
  96.  if (not Result) then
  97.   begin
  98.    SqxDoneFileList(ArchiveHandle, FileMaskList);
  99.    SqxDoneArcFileList(ArchiveHandle, ArcFileList);
  100.   end;
  101.  // Getting the first node.
  102.  ListNode:= ArcFileList.Head;
  103.  while (ListNode <> nil) do
  104.   begin
  105.    if (ListNode.ArcNode.Tagged) then
  106.     AddToList(ListNode.ArcNode.FileName);
  107.     
  108.    ListNode:= ListNode.Next;
  109.   end;
  110.  // Free the lists.
  111.  SqxDoneFileList(ArchiveHandle, FileMaskList);
  112.  SqxDoneArcFileList(ArchiveHandle, ArcFileList);
  113. end;
  114. //---------------------------------------------------------------------------
  115. function TAsphyreArchiveSQX.OpenArchive(const FileName: string): Boolean;
  116. begin
  117.  // Initialize SQX archiver
  118.  if (ArchiveHandle = 0) then
  119.   begin
  120.    Result:= (SqxInitArchive(PChar(FileName), SqxCallback, Self,
  121.     ArchiveHandle) = SQX_ERR_SUCCESS);
  122.    if (not Result) then Exit;
  123.   end;
  124.  ClearList();
  125.  Result:= ListFiles();
  126. end;
  127. //---------------------------------------------------------------------------
  128. procedure TAsphyreArchiveSQX.CloseArchive();
  129. begin
  130.  if (ArchiveHandle <> 0) then
  131.   begin
  132.    SqxDoneArchive(ArchiveHandle);
  133.    ArchiveHandle:= 0;
  134.   end;
  135. end;
  136. //---------------------------------------------------------------------------
  137. function TAsphyreArchiveSQX.GetItemCount(): Integer;
  138. begin
  139.  Result:= Length(FileList);
  140. end;
  141. //---------------------------------------------------------------------------
  142. function TAsphyreArchiveSQX.GetItemName(Num: Integer): string;
  143. begin
  144.  Assert((Num >= 0)and(Num < Length(FileList)), msgIndexOutOfBounds);
  145.  Result:= FileList[Num];
  146. end;
  147. //---------------------------------------------------------------------------
  148. function TAsphyreArchiveSQX.ExtractToDisk(const ItemName,
  149.  DestPath: string): Boolean;
  150. var
  151.  FileMaskList: THandle;
  152.  ExtractOptions: TSqxExtractOptions;
  153. begin
  154.  // Create a file list.
  155.  FileMaskList:= SqxInitFileList(ArchiveHandle);
  156.  Result:= (FileMaskList <> 0);
  157.  if (not Result) then Exit;
  158.  // Extracting the specific file.
  159.  SqxAppendFileList(ArchiveHandle, FileMaskList, PChar(ItemName));
  160.  // Extract options.
  161.  FillChar(ExtractOptions, SizeOf(TSqxExtractOptions), 0);
  162.  ExtractOptions.Size:= SizeOf(TSqxExtractOptions);
  163.  // Extract to the destination path.
  164.  lstrcpy(@ExtractOptions.OutputPath, PChar(DestPath));
  165.  ExtractOptions.CreateFolders:= True;
  166.  ExtractOptions.OverwriteAlways:= True;
  167.  // Extract the archive.
  168.  Result:= SqxExtractFiles(ArchiveHandle, SqxCallback, Self, FileMaskList,
  169.   ExtractOptions) = SQX_ERR_SUCCESS;
  170.  // Free the file list.
  171.  SqxDoneFileList(ArchiveHandle, FileMaskList);
  172. end;
  173. //---------------------------------------------------------------------------
  174. function TAsphyreArchiveSQX.ExtractToStream(const ItemName: string;
  175.  Stream: TStream): Boolean;
  176. var
  177.  TempPath, TempFile: string;
  178.  Aux: TFileStream;
  179. begin
  180.  TempPath:= GetTempPath();
  181.  Result:= ExtractToDisk(ItemName, TempPath);
  182.  if (Result) then
  183.   begin
  184.    TempFile:= MakeValidPath(TempPath) + MakeValidFileName(ItemName);
  185.    try
  186.     Aux:= TFileStream.Create(TempFile, fmOpenRead or fmShareDenyWrite);
  187.    except
  188.     Result:= False;
  189.     DeleteFile(TempFile);
  190.     Exit;
  191.    end;
  192.    try
  193.     try
  194.      Stream.CopyFrom(Aux, Aux.Size);
  195.     except
  196.      Result:= False;
  197.     end;
  198.    finally
  199.     Aux.Free();
  200.     DeleteFile(TempFile);
  201.    end;
  202.   end;
  203. end;
  204. //---------------------------------------------------------------------------
  205. procedure RegisterSQX(const Ext: string);
  206. begin
  207.  ArchiveManager.RegisterExt(Ext, TAsphyreArchiveSQX);
  208. end;
  209. //---------------------------------------------------------------------------
  210. end.