Join Now
Quality Rating:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)
Expertise Level:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)

This page was last modified 11:31, 14 May 2008.

CS000950 - Compressing and decompressing files using CEZFileBufferManager

From Forum Nokia Wiki


ID CS000950 Creation date May 14, 2008
Platform S60 3rd Edition, FP1 Tested on devices Nokia N93
Category Symbian C++ Subcategory Files/Data


Keywords (APIs, classes, methods, functions): RFile,CEZFileBufferManager,CEZCompressor,CEZDecompressor, RFile::Open(),RFile::Create(),CEZCompressor::DeflateL(),CEZDecompressor::InflateL()

Overview

This snippet shows how to compress and decompress files using the classes CEZCompressor, CEZDecompressor, and CEZFileBufferManager.

This snippet can be self-signed.

MMP file

The following libraries are required:

LIBRARY efsrv.lib
LIBRARY ezlib.lib

Header file

Source file

#include <ezcompressor.h>
#include <ezdecompressor.h>
#include <ezfilebuffer.h>
#include <f32file.h>
 
void CompressFileL(RFs &aFs, TInt aBufferSize, TInt aMethod, const TDesC& aFileName)
{
  TInt err(KErrNone);
  RFile input;
  RFile output;
         
  HBufC *compressedFile = HBufC::NewLC(aFileName.Length()+2);
  _LIT(KCompressedFileName,"%S.c");
  compressedFile->Des().Format(KCompressedFileName,&aFileName);
    
  User::LeaveIfError(input.Open(aFs,aFileName,EFileStream | EFileRead | EFileShareAny));
  CleanupClosePushL(input);
 
  err = output.Create(aFs, *compressedFile,EFileStream | EFileWrite | EFileShareExclusive);
 
  if (err == KErrAlreadyExists)
    User::LeaveIfError(output.Open(aFs, *compressedFile,EFileStream | EFileWrite |
 EFileShareExclusive));
  else 
    User::LeaveIfError(err);
  CleanupClosePushL(output);
 
  CEZFileBufferManager *fileBufferManager = CEZFileBufferManager::NewLC(input,output, aBufferSize);
  CEZCompressor *compressor = CEZCompressor::NewLC(*fileBufferManager, aMethod);
  
  _LIT(KCompressingFileText,"Compressing file %S to %S\n");
  console->Printf(KCompressingFileText,&aFileName,compressedFile);
    
  while (compressor->DeflateL())
    {
    // loop here until the file is compressed
    }
  
  CleanupStack::PopAndDestroy(5); //compressor,bufManager,output,input,compressedFile
}
 
void DecompressFileL(RFs &aFs, TInt aBufferSize, const TDesC& aFileName)
{
  TInt err(KErrNone);
  RFile input;
  RFile output;
  
  User::LeaveIfError(input.Open(aFs, aFileName,EFileStream | EFileRead | EFileShareAny));
  CleanupClosePushL(input);
  
  HBufC *decompressedFile = HBufC::NewLC(aFileName.Length()+2);
  _LIT(KDecompressedFileName,"%S.d");
  decompressedFile->Des().Format(KDecompressedFileName,&aFileName);
  
  err = output.Create(aFs, *decompressedFile,EFileStream | EFileWrite | EFileShareExclusive);
  if (err == KErrAlreadyExists)
    User::LeaveIfError(output.Open(aFs, *decompressedFile,EFileStream | EFileWrite |
 EFileShareExclusive));
  else 
    User::LeaveIfError(err);  
  CleanupClosePushL(output);
  
  CEZFileBufferManager *fileBufferManager = CEZFileBufferManager::NewLC(input,output,aBufferSize);
  CEZDecompressor *decompressor = CEZDecompressor::NewLC(*fileBufferManager);
 
  _LIT(KDecompressingFileText,"Decompressing file %S from %S\n");
  console->Printf(KDecompressingFileText,decompressedFile,&aFileName);
    
  while (decompressor->InflateL())
    {
    // loop here until the file is decompressed
    }
 
  CleanupStack::PopAndDestroy(5); //decompressor,bufManager,output,input,decompressedFile
 
}


Using CompressFileL() and DecompressFileL() methods

This simple example method reads command line arguments and compresses or decompresses given files.

Options:

  • -c = compress
  • -d = decompress
  • -b n = buffer size
  • -m n = method

(from ezlib.h: 0(Z_NO_COMPRESSION), 1(Z_BEST_SPEED), 9(Z_BEST_COMPRESSION), -1(Z_DEFAULT_COMPRESSION))

  • filename = compressed or decompressed file
void doCompressionDecompressionL()
  {
  RFs fs;
  User::LeaveIfError(fs.Connect());
  CleanupClosePushL(fs);
  
  TBool doCompress = ETrue;
  TInt bufferSize = 32768;
  TInt method = Z_BEST_COMPRESSION;  
  TInt cmdLineLen = User::CommandLineLength();
    
  if (cmdLineLen <= 0)
    {
    _LIT(KUsage,"Usage: program.exe [-cd] [-u buffer] [-m method] filename\n");
    console->Printf(KUsage);
    User::Leave(KErrGeneral);
    }
 
  HBufC *argv = HBufC::NewLC(cmdLineLen);
  TPtr argPtr=argv->Des();
  User::CommandLine(argPtr);
 
  TLex arguments(*argv);
 
  TPtrC options(arguments.NextToken());
  TBool bufferSizeSpecified = EFalse;
  TBool methodSpecified = EFalse;
  
  _LIT(KInvalidOption,"Invalid option %S\n");
  _LIT(KUnknownOption,"Unknown option %S\n");
  _LIT(KNoOptionSpecified,"No option specified\n");
  
  while (options[0]=='-' || bufferSizeSpecified || methodSpecified)
    {
    TInt index = 1;
 
    if (bufferSizeSpecified || methodSpecified)
      {
      if (options.Length() == 0)
        {
        console->Printf(KNoOptionSpecified);
        console->Getch();
        User::Leave(KErrGeneral);
        }
      else
        {
        TLex lex(options);
        TInt ret = KErrNone;         
        
        if(bufferSizeSpecified)
          {
          ret = lex.Val(bufferSize);
          bufferSizeSpecified = EFalse;
          }
        else
          {
          ret = lex.Val(method);
          methodSpecified  = EFalse;
          }
        
        if (ret != KErrNone)
          {
          console->Printf(KInvalidOption,&options);
          console->Getch();
          User::Leave(KErrGeneral);
          }
        }
      }
    else
      {        
      while (index < options.Length())
        {
        if (options[index] == 'd')
          doCompress = EFalse;
        else if (options[index] == 'c')
          doCompress = ETrue;
        else if (options[index] == 'b' )
           bufferSizeSpecified = ETrue;  
        else if (options[index] == 'm')  
          methodSpecified = ETrue;
        else 
          {
          console->Printf(KUnknownOption,&options);
          console->Getch();
          User::Leave(KErrGeneral);
          }
        index++;
        }
      
      if (index == 1)
        {        
        console->Printf(KNoOptionSpecified);
        console->Getch();
        User::Leave(KErrGeneral);
        }
      }
    options.Set(arguments.NextToken());
    }
    
    TPtrC fileNamePtr(options);
    HBufC *fileNameBuf = HBufC::NewLC(fileNamePtr.Length());
    *fileNameBuf = fileNamePtr;
        
    if(doCompress)
      {
       CompressFileL(fs,bufferSize,method,*fileNameBuf);
      }
    else
      {
       DecompressFileL(fs,bufferSize,*fileNameBuf);      
      }
 
    CleanupStack::PopAndDestroy(3); //fileNameBuf,argv,fs
}

Postconditions

Depending on given parameters and the used method, files are compressed or decompressed.

See also

CS000949 - Compressing and decompressing GZIP files

Related Discussions
Thread Thread Starter Forum Replies Last Post
Error message scenedave General Symbian C++ 6 2003-06-09 03:50
How to share common files from folder in multiple projects Tejaswini Carbide.c++ and CodeWarrior Tools 14 2007-04-16 12:51
how do I send midi file through MMS using 7650? sgc_wdi General Messaging 1 2002-08-16 04:29
Problem With Opening Files ctrl-d General Symbian C++ 1 2006-06-19 02:36
unable to execute files for security reason rsf Python 2 2008-04-26 15:14
 
Powered by MediaWiki