home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 September / Chip_2002-09_cd1.bin / zkuste / vbasic / Data / Utils / XZipComp.exe / XceedCompression.Cab / F112846_unManager.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  2001-05-10  |  14.8 KB  |  370 lines

  1. {*
  2.   Xceed Streaming Compression Library - Compression Manager sample
  3.   Copyright (c) 2001 Xceed Software Inc.
  4.  
  5.   This sample demonstrates how to compress a file using different kinds of
  6.   compression formats and methods, and how to decompress a compressed file.
  7.   It specifically uses:
  8.     - The ProcessFile method
  9.     - The CompressionFormat property
  10.  
  11.   This file is part of the Xceed Streaming Compression Library sample
  12.   applications. The source code in this file is only intended as a supplement
  13.   to the Xceed Streaming Compression Library's documentation and is provided 
  14.   "as is" without warranty of any kind, either expressed or implied.
  15. *}
  16.  
  17. unit unManager;
  18.  
  19. interface
  20.  
  21. uses
  22.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  23.   StdCtrls, XceedStreamingCompressionLib_TLB;
  24.  
  25. type TCompressionFormat = ( cfBZip2,    //0
  26.                             cfGZip,     //1
  27.                             cfStandard, //2
  28.                             cfZip3,     //3
  29.                             cfZLib,     //4
  30.                             // The next 3 are not compression formats. They
  31.                             // are compression methods. See the comments in
  32.                             // the PrepareCompressionFormat function
  33.                             cfBWT,      //5
  34.                             cfDeflate,  //6
  35.                             cfStore );  //7
  36.  
  37. type
  38.   TfrmManager = class(TForm)
  39.     Label1                  : TLabel;
  40.     Label2                  : TLabel;
  41.     Label3                  : TLabel;
  42.     Label4                  : TLabel;
  43.     cboCompressionFormat    : TComboBox;
  44.     edtSourceFile           : TEdit;
  45.     edtDestinationFile      : TEdit;
  46.     btBrowseForSource       : TButton;
  47.     btBrowseForDestination  : TButton;
  48.     btCompress              : TButton;
  49.     btDecompress            : TButton;
  50.     xOpenDialog             : TOpenDialog;
  51.     xSaveDialog             : TSaveDialog;
  52.     lstMessages             : TListBox;
  53.     procedure FormCreate(Sender: TObject);
  54.     procedure btBrowseForDestinationClick(Sender: TObject);
  55.     procedure btBrowseForSourceClick(Sender: TObject);
  56.     procedure btCompressClick(Sender: TObject);
  57.     procedure btDecompressClick(Sender: TObject);
  58.     procedure edtSourceFileExit(Sender: TObject);
  59.     procedure cboCompressionFormatChange(Sender: TObject);
  60.   private
  61.     { Private declarations }
  62.     procedure SetDestinationFilename();
  63.  
  64.     function RemoveFileExtension( sFilename : string ) : string;
  65.     function PrepareCompressionFormat( var xCompressor : TXceedStreamingCompression ) : boolean;
  66.     function CompressFile( sSourceFilename : string;
  67.                            sCompressedFilename : string ) : boolean;
  68.     function DecompressFile( sSourceFilename : string;
  69.                              sDecompressedFilename : string ) : boolean;
  70.   public
  71.     { Public declarations }
  72.   end;
  73.  
  74. var
  75.   frmManager: TfrmManager;
  76.  
  77. implementation
  78.  
  79. {$R *.DFM}
  80.  
  81. {-----------------------------------------------------------------------}
  82. { Assign a default value to the destination file name if the            }
  83. { destination edit box is empty                                         }
  84. {-----------------------------------------------------------------------}
  85. procedure TfrmManager.SetDestinationFilename();
  86. var
  87.   sCompressedFilename : string;
  88. begin
  89.   sCompressedFilename := edtDestinationFile.Text;
  90.  
  91.   if( Length( sCompressedFilename ) = 0 ) then
  92.   begin
  93.     sCompressedFilename := RemoveFileExtension( edtSourceFile.Text );
  94.     if( Length( sCompressedFilename ) <> 0 ) then
  95.     begin
  96.       case TCompressionFormat( cboCompressionFormat.ItemIndex ) of
  97.         cfBZip2     : edtDestinationFile.Text := sCompressedFilename + '.bz2';
  98.         cfGZip      : edtDestinationFile.Text := sCompressedFilename + '.gz';
  99.         cfStandard  : edtDestinationFile.Text := sCompressedFilename + '.std';
  100.         cfZip3      : edtDestinationFile.Text := sCompressedFilename + '.zp3';
  101.         cfZLib      : edtDestinationFile.Text := sCompressedFilename + '.zl';
  102.         cfBWT       : edtDestinationFile.Text := sCompressedFilename + '.bwt';
  103.         cfDeflate   : edtDestinationFile.Text := sCompressedFilename + '.dfl';
  104.         cfStore     : edtDestinationFile.Text := sCompressedFilename + '.sto';
  105.       end;
  106.     end;
  107.   end;
  108. end;
  109.  
  110. {-----------------------------------------------------------------------}
  111. { Returns the path and file name without it's extension                 }
  112. {-----------------------------------------------------------------------}
  113. function TfrmManager.RemoveFileExtension( sFilename : string ) : string;
  114. var
  115.   i            : integer;
  116.   nFilenameLen : integer;
  117.   nLenToRemove : integer;
  118. begin
  119.   nFilenameLen := Length( sFilename );
  120.   i := nFilenameLen;
  121.   nLenToRemove := -1;
  122.  
  123.   while ( i > 0 ) and ( nLenToRemove = -1 ) do
  124.   begin
  125.     if( copy( sFilename, i, 1 ) = '.' ) then
  126.       nLenToRemove := i - 1;
  127.  
  128.     if( copy( sFilename, i, 1 ) = '\' ) then
  129.       nLenToRemove := nFilenameLen;
  130.  
  131.     i := i - 1;
  132.   end;
  133.  
  134.   if( nLenToRemove = -1 ) then
  135.     RemoveFileExtension := ''
  136.   else
  137.     RemoveFileExtension := copy( sFilename, 0, nLenToRemove );
  138. end;
  139.  
  140. {-----------------------------------------------------------------------}
  141. { Prepare the compression format according to the user selection.       }
  142. { Return True if all succeeded.                                         }
  143. {-----------------------------------------------------------------------}
  144. function TFrmManager.PrepareCompressionFormat( var xCompressor : TXceedStreamingCompression ) : boolean;
  145. var
  146.   xBZip2    : DXceedBZip2CompressionFormat;
  147.   xGZip     : DXceedGZipCompressionFormat;
  148.   xStandard : DXceedStandardCompressionFormat;
  149.   xZip3     : DXceedZip3CompressionFormat;
  150.   xZLib     : DXceedZLibCompressionFormat;
  151.   xBWT      : DXceedBWTCompressionMethod;
  152.   xDeflate  : DXceedDeflateCompressionMethod;
  153.   xStore    : DXceedStoreCompressionMethod;
  154. begin
  155.   // We instantiate a new compression format, assigning it directly to
  156.   // the CompressionFormat of the XceedStreamingCompression object.
  157.   try
  158.     case TCompressionFormat( cboCompressionFormat.ItemIndex ) of
  159.       cfBZip2     : begin
  160.                       xBZip2 := CoXceedBZip2CompressionFormat.Create();
  161.                       xCompressor.CompressionFormat := xBZip2;
  162.                     end;
  163.       cfGZip      : begin
  164.                       xGZip := CoXceedGZipCompressionFormat.Create();
  165.                      xCompressor.CompressionFormat := xGZip;
  166.                     end;
  167.       cfStandard  : begin
  168.                      xStandard := CoXceedStandardCompressionFormat.Create();;
  169.                       xCompressor.CompressionFormat := xStandard;
  170.                     end;
  171.       cfZip3      : begin
  172.                       xZip3 := CoXceedZip3CompressionFormat.Create();
  173.                       xCompressor.CompressionFormat := xZip3;
  174.                     end;
  175.       cfZLib      : begin
  176.                       xZLib := CoXceedZLibCompressionFormat.Create();
  177.                       xCompressor.CompressionFormat := xZLib;
  178.                     end;
  179.       // The next three items are not compression formats. They are compression
  180.       // methods that can be assigned to the CompressionFormat property of the
  181.       // Xceed Streaming Compression object. In these cases, the resulting
  182.       // compressed streams will have no formatting (header, footer, checksum...)
  183.  
  184.       cfBWT       : begin
  185.                       xBWT := CoXceedBWTCompressionMethod.Create();
  186.                       xCompressor.CompressionFormat := xBWT;
  187.                     end;
  188.       cfDeflate   : begin
  189.                       xDeflate := CoXceedDeflateCompressionMethod.Create();
  190.                       xCompressor.CompressionFormat := xDeflate;
  191.                     end;
  192.       // Using store as the compression format will produce an output compressed
  193.       // stream identical to the text to compress!
  194.       cfStore     : begin
  195.                       xStore := CoXceedStoreCompressionMethod.Create();
  196.                       xCompressor.CompressionFormat := xStore;
  197.                     end;
  198.     end;
  199.     PrepareCompressionFormat := true;
  200.   except
  201.     on xErr: Exception do
  202.     begin
  203.       lstMessages.Items.Add( 'PREPARE FORMAT : ' + xErr.Message );
  204.       PrepareCompressionFormat := false;
  205.     end;
  206.   end;
  207. end;
  208.  
  209. {-----------------------------------------------------------------------}
  210. { Perform the actual compression of a source file to a destination file }
  211. {-----------------------------------------------------------------------}
  212. function TfrmManager.CompressFile( sSourceFilename : string;
  213.                                    sCompressedFilename : string ) : boolean;
  214. var
  215.   xCompressor : TXceedStreamingCompression;
  216.   vaBytesRead : OleVariant;
  217. begin
  218.   // Initialize the Compressor and set the compression format the user chose
  219.   xCompressor := TXceedStreamingCompression.Create( self );
  220.  
  221.   if( PrepareCompressionFormat( xCompressor ) ) then
  222.   begin
  223.     lstMessages.Clear();
  224.     try
  225.       // Process the file:
  226.       //  - Compress the entire file (no offset or size)
  227.       //  - Compress it in a single call (bEndOfData is TRUE)
  228.       //  - Overwrite the destination file (bAppend is FALSE)
  229.       xCompressor.ProcessFile( sSourceFilename, 0, 0, cfpCompress, true,
  230.                                sCompressedFilename, false, vaBytesRead );
  231.  
  232.       lstMessages.Items.Add( sSourceFilename + ' successfully compressed in ' +
  233.                              sCompressedFilename );
  234.     except
  235.       on xErr: Exception do
  236.         lstMessages.Items.Add( 'COMPRESS : ' + xErr.Message );
  237.     end;
  238.   end;
  239.   CompressFile := true;
  240.   xCompressor.Free();
  241. end;
  242.  
  243. {-----------------------------------------------------------------------}
  244. { Perform the actual decompression of a source file to a destination    }
  245. { file.                                                                 }
  246. {-----------------------------------------------------------------------}
  247. function TfrmManager.DecompressFile( sSourceFilename : string;
  248.                                      sDecompressedFilename : string ) : boolean;
  249. var
  250.   xCompressor : TXceedStreamingCompression;
  251.   vaBytesRead : OleVariant;
  252. begin
  253.   // Initialize the Compressor and set the compression format the user chose
  254.   xCompressor := TXceedStreamingCompression.Create( self );
  255.  
  256.   if( PrepareCompressionFormat( xCompressor ) ) then
  257.   begin
  258.     lstMessages.Clear();
  259.  
  260.     try
  261.       // Process the file:
  262.       //  - Decompress the entire file (no offset or size)
  263.       //  - Decompress it in a single call (bEndOfData is TRUE)
  264.       //  - Overwrite the destination file (bAppend is FALSE)
  265.       xCompressor.ProcessFile( sSourceFilename, 0, 0, cfpDecompress, true,
  266.                                sDecompressedFilename, false, vaBytesRead );
  267.  
  268.       lstMessages.Items.Add( sSourceFilename + ' successfully decompressed in ' +
  269.                              sDecompressedFilename );
  270.     except
  271.       on xErr: Exception do
  272.         lstMessages.Items.Add( 'DECOMPRESS : ' + xErr.Message );
  273.     end;
  274.   end;
  275.   DecompressFile := true;
  276.   xCompressor.Free();
  277. end;
  278.  
  279. {-----------------------------------------------------------------------}
  280. { Initialize the form's controls. For the purposes of this example,     }
  281. { the combo box was filled from Delphi's property menu.                 }
  282. {-----------------------------------------------------------------------}
  283. procedure TfrmManager.FormCreate(Sender: TObject);
  284. begin
  285.   cboCompressionFormat.ItemIndex := 0;
  286. end;
  287.  
  288. {-----------------------------------------------------------------------}
  289. { Let the user select a destination file name and path using a file     }
  290. { save dialog.                                                          }
  291. {-----------------------------------------------------------------------}
  292. procedure TfrmManager.btBrowseForDestinationClick(Sender: TObject);
  293. begin
  294.   xSaveDialog.Files.Clear();
  295.   xSaveDialog.Title  := 'Destination File';
  296.   xSaveDialog.Filter := 'Compressed (*.bz2;*.gz;*.std;*.zp3;*.zl;*.bwt;' +
  297.                         '*.dfl;*.sto)|*.bz2;*.gz;*.std;*.zp3;*.zl;*.bwt;' +
  298.                         '*.dfl;*.sto|All Files (*.*)|*.*';
  299.   xSaveDialog.FilterIndex := 0;
  300.  
  301.   if( xSaveDialog.Execute ) then
  302.     edtDestinationFile.Text := trim( xSaveDialog.Files.Text );
  303. end;
  304.  
  305. {-----------------------------------------------------------------------}
  306. { Let the user select a source file name and path using a file open     }
  307. { dialog.                                                               }
  308. {-----------------------------------------------------------------------}
  309. procedure TfrmManager.btBrowseForSourceClick(Sender: TObject);
  310. begin
  311.   xOpenDialog.Files.Clear();
  312.   xOpenDialog.Title  := 'Source File';
  313.   xOpenDialog.Filter := 'All Files (*.*)';
  314.   xOpenDialog.FilterIndex := 0;
  315.  
  316.   if( xOpenDialog.Execute ) then
  317.   begin
  318.     edtSourceFile.Text := trim( xopenDialog.Files.Text );
  319.     SetDestinationFilename();
  320.   end;
  321. end;
  322.  
  323. {-----------------------------------------------------------------------}
  324. { Compress the selected source file to the destination file             }
  325. {-----------------------------------------------------------------------}
  326. procedure TfrmManager.btCompressClick(Sender: TObject);
  327. begin
  328.   if( CompressFile( edtSourceFile.Text, edtDestinationFile.Text ) ) then
  329.   begin
  330.     // If the compression is successful, empty the source and destination
  331.     // edit boxes to simplify subsequent compression/decompression
  332.     edtSourceFile.Text := '';
  333.     edtDestinationFile.Text := '';
  334.   end;
  335. end;
  336.  
  337. {-----------------------------------------------------------------------}
  338. { Decompress the selected source file to the specified destination file }
  339. {-----------------------------------------------------------------------}
  340. procedure TfrmManager.btDecompressClick(Sender: TObject);
  341. begin
  342.   if( DecompressFile( edtSourceFile.Text, edtDestinationFile.Text ) ) then
  343.   begin
  344.     // If the compression is successful, empty the source and destination
  345.     // edit boxes to simplify subsequent compression/decompression
  346.     edtSourceFile.Text := '';
  347.     edtDestinationFile.Text := '';
  348.   end;
  349. end;
  350.  
  351. {-----------------------------------------------------------------------}
  352. { Initialize the destination file to a default value if the destination }
  353. { edit box is empty.                                                    }
  354. {-----------------------------------------------------------------------}
  355. procedure TfrmManager.edtSourceFileExit(Sender: TObject);
  356. begin
  357.   SetDestinationFilename();
  358. end;
  359.  
  360. {-----------------------------------------------------------------------}
  361. { Initialize the destination file to a default value if the destination }
  362. { edit box is empty.                                                    }
  363. {-----------------------------------------------------------------------}
  364. procedure TfrmManager.cboCompressionFormatChange(Sender: TObject);
  365. begin
  366.   SetDestinationFilename();
  367. end;
  368.  
  369. end.
  370.