00001 // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). 00002 // All rights reserved. 00003 // This component and the accompanying materials are made available 00004 // under the terms of "Eclipse Public License v1.0" 00005 // which accompanies this distribution, and is available 00006 // at the URL "http://www.eclipse.org/legal/epl-v10.html". 00007 // 00008 // Initial Contributors: 00009 // Nokia Corporation - initial contribution. 00010 // 00011 // Contributors: 00012 // 00013 // Description: 00014 // This example program demonstrates the use of the Ezlib API. 00015 // The code demonstrates how to 00016 // -# Open a ZIP file and get the properties of each file 00017 // -# Extract a selected member of the ZIP file and save it to a new file. 00018 // -# Save all the members of a ZIP file to a file. 00019 // -# Open a GZIP file and extract the contents to a file. 00020 // -# Compress a file into a GZIP file. 00021 // 00022 00023 00024 00028 #include "ezlibexample.h" 00029 #include <e32cons.h> 00030 #include <ezgzip.h> 00031 00032 _LIT(KTitle, "Ezlib example"); 00033 _LIT(KTextPressAKey, "\n\nPress any key to step through the example\n"); 00034 _LIT(KExit,"\nPress any key to exit the application"); 00035 _LIT(KPressAKey,"\nPress any key to continue \n"); 00036 _LIT(KProperties,"Press any key to have a look at the properties of the zipped files \n"); 00037 _LIT(KDecompress,"Gzip file successfully decompressed\n"); 00038 _LIT(KCompress,"\nFile successfully compressed to gzip format and saved\n"); 00039 _LIT(KNoFilesFound,"No appropriate files located in this folder.\r\n"); 00040 _LIT(KLineSpace, "\r\n"); 00041 _LIT(KFileInfo,"\nCompressing file %S"); 00042 _LIT(KFileOpen,"\nOpening file: %S\r\n"); 00043 _LIT(KFileExtract,"\nExtracting the file %S\n"); 00044 _LIT(KFileZipExtract,"\nExtracting files from the zip file %S\n"); 00045 00046 #if defined(__WINS__) 00047 _LIT(KCInputZipFile, "\\private\\E80000B7\\zip\\input\\EzlibZipFolder.zip"); 00048 _LIT(KCInputGzipPath, "\\private\\E80000B7\\gzip\\error.wav"); 00049 _LIT(KCInputGzipFile, "\\private\\E80000B7\\gzip\\icon.bmp.gz"); 00050 #endif 00051 00052 #if defined(__EPOC32__) 00053 _LIT(KZInputZipFile, "z:\\private\\E80000B7\\zip\\input\\EzlibZipFolder.zip"); 00054 _LIT(KZInputGzipPath, "z:\\private\\E80000B7\\gzip\\error.wav"); 00055 _LIT(KZInputGzipFile, "z:\\private\\E80000B7\\gzip\\icon.bmp.gz"); 00056 #endif 00057 00058 _LIT(KZipName,"\nName: %S "); 00059 _LIT(KZipCRC32,"\nCRC32: %X "); 00060 _LIT(KZipCSize,"\nCompressed Size: %d"); 00061 _LIT(KZipUCSize,"\nUncompressed Size: %d"); 00062 _LIT(KOpenedSuccessfully, "%S opened successfully.\n"); 00063 00064 _LIT(KExtractZipPathMulti, "\\private\\E80000B7\\zip\\extracts\\"); 00065 _LIT(KExtractZipPathSingle, "\\private\\E80000B7\\zip\\extracts\\singlefile\\"); 00066 _LIT(KCompressGzipPath, "\\private\\E80000B7\\gzip\\extracts\\"); 00067 _LIT(KCompressZipFile, "icon.bmp"); 00068 _LIT(KExtractGzipFile, "error.wav"); 00069 00075 CEzlibExample * CEzlibExample::NewLC() 00076 { 00077 CEzlibExample * rep = new(ELeave) CEzlibExample(); 00078 CleanupStack::PushL(rep); 00079 rep->ConstructL(); 00080 return rep; 00081 } 00082 00086 CEzlibExample::CEzlibExample() 00087 { 00088 } 00089 00090 void CEzlibExample::ConstructL() 00091 { 00092 iConsole = Console::NewL(KTitle,TSize(KConsFullScreen,KConsFullScreen)); 00093 iConsole->Printf(KTextPressAKey); 00094 iConsole->Getch(); 00095 } 00096 00100 CEzlibExample::~CEzlibExample() 00101 { 00102 iConsole->Printf(KExit); 00103 iConsole->Getch(); 00104 00105 delete iConsole; 00106 } 00107 00108 00123 void CEzlibExample::GetPropertiesL(TFileName& aFileName, RFs& aFsSession) 00124 { 00125 CZipFile* zipFile = 0; 00126 CZipFileMember* member = 0; 00127 CZipFileMemberIterator* fileMembers; 00128 00129 iConsole->Printf(KFileOpen, &aFileName); 00130 00131 zipFile = CZipFile::NewL(aFsSession, aFileName); 00132 CleanupStack::PushL(zipFile); 00133 00134 iConsole->Printf(KOpenedSuccessfully, &aFileName); 00135 00136 // Search for a file in the zip archive. 00137 // The name of the file to be searched for 00138 // in the zipfile is case-insensitive. 00139 _LIT(KSearchFile, "EzlibZipFolder\\icon.bmp"); 00140 member = zipFile->CaseInsensitiveMemberL(KSearchFile); 00141 CleanupStack::PushL(member); 00142 if(member != NULL) 00143 { 00144 // Extract the file that was searched for and found. 00145 ExtractFilesL(member, zipFile, aFsSession, KExtractZipPathSingle); 00146 iConsole->Printf(KFileExtract, &KSearchFile); 00147 } 00148 else 00149 { 00150 iConsole->Printf(KNoFilesFound); 00151 } 00152 CleanupStack::PopAndDestroy(member); 00153 // Gets the iterator used for iterating through the files 00154 // contained in the ZIP file. 00155 fileMembers = zipFile->GetMembersL(); 00156 CleanupStack::PushL(fileMembers); 00157 // Moves the entry iterator onto the next 00158 // zip file member contained in the ZIP file 00159 member = fileMembers->NextL(); 00160 00161 iConsole->Printf(KFileZipExtract, &aFileName); 00162 iConsole->Printf(KProperties); 00163 iConsole->Getch(); 00164 00165 // Get the properties of all the files 00166 while(member != NULL) 00167 { 00168 CleanupStack::PushL(member); 00169 00170 // Retrieve CRC(Cyclic Redundancy Check) value in a compressed file 00171 // contained in a CZipFile archive file. 00172 TUint32 redundencyCode = member->CRC32(); 00173 00174 // Retrieve the size of uncompressed file 00175 // contained in a CZipFile archive file. 00176 TUint32 UnCompSize = member->UncompressedSize(); 00177 00178 // Retrieve the size of compressed file 00179 // contained in a CZipFile archive file. 00180 TUint32 CompSize = member->CompressedSize(); 00181 00182 // Print the properties 00183 // Name of the zipped file 00184 TFileName fileName = *member->Name(); 00185 iConsole->Printf(KZipName, &fileName); 00186 00187 // CRC value which will be printed in hexadecimal 00188 iConsole->Printf(KZipCRC32, redundencyCode); 00189 00190 // Size of the compressed file 00191 iConsole->Printf(KZipCSize, CompSize); 00192 00193 // Original size of te file 00194 iConsole->Printf(KZipUCSize,UnCompSize); 00195 00196 // Extract each member in the zip file 00197 ExtractFilesL(member, zipFile, aFsSession, KExtractZipPathMulti); 00198 00199 CleanupStack::PopAndDestroy(member); 00200 member = fileMembers->NextL(); 00201 } 00202 00203 CleanupStack::PopAndDestroy(fileMembers); 00204 CleanupStack::PopAndDestroy(zipFile); 00205 } 00206 00218 void CEzlibExample::ExtractFilesL(const CZipFileMember* aMember, CZipFile* aZipFile, RFs& aFsSession, const TDesC& aOutputPath) 00219 { 00220 TInt loop = 0; 00221 // Allocate memory for the retrieved name of a 00222 // compressed file contained in a CZipFile archive file. 00223 HBufC* name = aMember->Name()->AllocLC(); 00224 while(loop < name->Length()) 00225 { 00226 if((*name)[loop] == '/') 00227 { 00228 name->Des()[loop] = '\\'; 00229 } 00230 loop++; 00231 } 00232 00233 // Create the directory to which the files need to be extracted. 00234 TFileName fn; 00235 fn.Append(aOutputPath); 00236 // Append the name of the file to the directory 00237 // where the file would get extracted. 00238 fn.Append(*name); 00239 aFsSession.MkDirAll(fn); 00240 00241 RFile extractedMember; 00242 extractedMember.Replace(aFsSession,fn, EFileShareAny|EFileWrite); 00243 CleanupClosePushL(extractedMember); 00244 00245 RZipFileMemberReaderStream* fileStream; 00246 // Create and return the input stream for a file in the archive. 00247 TInt error = aZipFile->GetInputStreamL(aMember, fileStream); 00248 if(error != KErrNone) 00249 { 00250 _LIT(KCompressionNotSupported, "Error! Compression Method Not Supported"); 00251 iConsole->Printf(KCompressionNotSupported); 00252 iConsole->Printf(KLineSpace); 00253 CleanupStack::PopAndDestroy(2,name); //expanded member, name 00254 aFsSession.Delete(fn); 00255 return; 00256 } 00257 CleanupStack::PushL(fileStream); 00258 00259 // Retrieve the size of uncompressed file contained 00260 // in a CZipFile archive file. 00261 TUint16 size = aMember->UncompressedSize(); 00262 00263 RBuf8 bytes; 00264 bytes.CreateL(size); 00265 bytes.CleanupClosePushL(); 00266 00267 // Read the specified number of bytes of binary data 00268 // from the file at the current position. 00269 User::LeaveIfError(fileStream->Read(bytes,size)); 00270 // Write to the file 00271 User::LeaveIfError(extractedMember.Write(bytes)); 00272 00273 CleanupStack::PopAndDestroy(4,name); // bytes, fileStream, expanded member and name 00274 00275 } 00276 00285 void CEzlibExample::ExtractGzipFileL(RFs& aFsSession) 00286 { 00287 iConsole->Printf(KPressAKey); 00288 iConsole->Getch(); 00289 00290 #if defined(__WINS__) 00291 TFileName gzipInputFileName(KCInputGzipFile); 00292 #endif 00293 00294 #if defined(__EPOC32__) 00295 TFileName gzipInputFileName(KZInputGzipFile); 00296 #endif 00297 00298 //TFileName gzipInputFileName(KInputGzipFile); 00299 00300 RFile input; 00301 RFile output; 00302 00303 User::LeaveIfError(input.Open(aFsSession, gzipInputFileName, EFileStream | EFileRead | EFileShareAny)); 00304 CleanupClosePushL(input); 00305 00306 TFileName outputFile(KCompressGzipPath); 00307 // Append the path to the directory where you want to 00308 // store the uncompressed file. 00309 aFsSession.MkDirAll(outputFile); 00310 outputFile.Append(KCompressZipFile); 00311 00312 // Create and open icon.bmp on 00313 // c:\private\E80000B7\gzip\extracts\ folder. 00314 output.Replace(aFsSession, outputFile, EFileStream | EFileWrite | EFileShareExclusive); 00315 CleanupClosePushL(output); 00316 00317 // icon.bmp.gz file is the input file 00318 TPtrC inputFile = gzipInputFileName; 00319 00320 RBuf uncompressedFile; 00321 uncompressedFile.CreateL(outputFile.Length()); 00322 uncompressedFile.CleanupClosePushL(); 00323 00324 _LIT(KUfl,"%S"); 00325 // Format and copy the filename into the descriptor 00326 uncompressedFile.Format(KUfl,&inputFile); 00327 00328 _LIT(KInfo,"\nDecompressing file %S\n"); 00329 iConsole->Printf(KInfo,&inputFile); 00330 00331 CEZGZipToFile *def = CEZGZipToFile::NewLC(aFsSession,uncompressedFile,output); 00332 00333 // Decompress the gzip file 00334 while(def->InflateL()) 00335 { 00336 // InflateL decompresses the file in stages. 00337 // It returns false when decompression is complete 00338 } 00339 iConsole->Printf(KDecompress); 00340 00341 CleanupStack::PopAndDestroy(4); // input, output, uncompressedFile, def 00342 00343 } 00344 00353 void CEzlibExample::CompressToGzipFileL(RFs& aFsSession) 00354 { 00355 iConsole->Printf(KPressAKey); 00356 iConsole->Getch(); 00357 00358 #if defined(__WINS__) 00359 TFileName inputFileToBeGzipped(KCInputGzipPath); 00360 #endif 00361 00362 #if defined(__EPOC32__) 00363 TFileName inputFileToBeGzipped(KZInputGzipPath); 00364 #endif 00365 //TFileName inputFileToBeGzipped(KInputGzipPath); 00366 00367 RFile input; 00368 00369 User::LeaveIfError(input.Open(aFsSession, inputFileToBeGzipped, EFileStream | EFileRead | EFileShareAny)); 00370 CleanupClosePushL(input); 00371 00372 // Set the output path to the directory where you 00373 // want to store the compressed file. 00374 TFileName outputFile(KCompressGzipPath); 00375 aFsSession.MkDirAll(outputFile); 00376 outputFile.Append(KExtractGzipFile); 00377 00378 iConsole->Printf(KFileInfo, &inputFileToBeGzipped); 00379 00380 // Prevent the length of the descriptor to which data is written, 00381 // from exceeding its maximum length by appending additional length. 00382 const TInt extensionLength = 3; 00383 00384 RBuf compressedFile; 00385 compressedFile.CreateL(outputFile.Length() + extensionLength); 00386 compressedFile.CleanupClosePushL(); 00387 00388 _LIT(KAppendExtension,"%S.gz"); 00389 // Format and copy the filename into the descriptor 00390 compressedFile.Format(KAppendExtension,&outputFile); 00391 00392 CEZFileToGZip *def = CEZFileToGZip::NewLC(aFsSession, compressedFile, input); 00393 // Compress the file to gzip format 00394 while(def->DeflateL()) 00395 { 00396 // DeflateL compresses the file in stages. 00397 // It returns false when compression is complete 00398 } 00399 00400 iConsole->Printf(KCompress); 00401 00402 CleanupStack::PopAndDestroy(3); // def, compressedFile, input 00403 00404 } 00405 00406 00407 LOCAL_C void MainL() 00408 { 00409 // Create an Active Scheduler to handle asychronous calls 00410 CActiveScheduler* scheduler = new(ELeave) CActiveScheduler; 00411 CleanupStack::PushL(scheduler); 00412 CActiveScheduler::Install( scheduler ); 00413 00414 CEzlibExample * app = CEzlibExample::NewLC(); 00415 00416 RFs fsSession; 00417 // Connect to file session 00418 User::LeaveIfError(fsSession.Connect()); 00419 00420 // Create the private directory on the writable drive 00421 // i.e. "\private\E80000B7\" 00422 // Note that the number E80000B7 is the process security id 00423 // taken from the 2nd UID specified in the mmp file. 00424 00425 fsSession.CreatePrivatePath(RFs::GetSystemDrive()); 00426 // Set the session path to this private directory on the writable drive 00427 fsSession.SetSessionToPrivate(RFs::GetSystemDrive()); 00428 00429 // Get the properties of files in the zip file 00430 #if defined(__WINS__) 00431 TBuf<256> inputFileName(KCInputZipFile); 00432 #endif 00433 00434 #if defined(__EPOC32__) 00435 TBuf<256> inputFileName(KZInputZipFile); 00436 #endif 00437 00438 app->GetPropertiesL(inputFileName, fsSession); 00439 00440 // Compress a file to gzip format 00441 app->CompressToGzipFileL(fsSession); 00442 00443 // Extract a gzip file 00444 app->ExtractGzipFileL(fsSession); 00445 00446 CleanupStack::PopAndDestroy(2); //app, scheduler 00447 // Close the file session 00448 fsSession.Close(); 00449 00450 } 00451 00452 GLDEF_C TInt E32Main() 00453 { 00454 __UHEAP_MARK; 00455 CTrapCleanup* cleanup = CTrapCleanup::New(); 00456 if(cleanup == NULL) 00457 { 00458 return KErrNoMemory; 00459 } 00460 TRAPD(err, MainL()); 00461 if(err != KErrNone) 00462 { 00463 User::Panic(_L("Failed to complete"),err); 00464 } 00465 00466 delete cleanup; 00467 __UHEAP_MARKEND; 00468 return KErrNone; 00469 } 00470 00471
Copyright ©2010 Nokia Corporation and/or its subsidiary(-ies).
All rights
reserved. Unless otherwise stated, these materials are provided under the terms of the Eclipse Public License
v1.0.