sl@0: // Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // ZIPTEST.CPP sl@0: // sl@0: // sl@0: sl@0: #include "zipfile.h" sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: sl@0: /* sl@0: class CZipTest - defines text UI sl@0: */ sl@0: LOCAL_D RTest test(_L("ZIPTEST")); sl@0: sl@0: class CZipTest : public CBase sl@0: { sl@0: public: sl@0: // execute UI until exit command processed sl@0: void ExecuteL(); sl@0: private: sl@0: // destructor sl@0: ~CZipTest(); sl@0: void DoTestL(); sl@0: void ExtractFileL(RFs&, const CZipFileMember*, CZipFile*, const TFileName*, RFileWriteStream&); sl@0: void TheZipTestL(RFs&, TFileName*, RFileWriteStream&); sl@0: sl@0: private: sl@0: CConsoleBase* iConsole; sl@0: RFile iZipOut; sl@0: TBool NoFiles; sl@0: }; sl@0: sl@0: _LIT(KNoFilesFound,"No appropriate files located in this folder.\r\n"); sl@0: _LIT(KOpeningFile,"Opening file "); sl@0: _LIT(KDots,"..."); sl@0: _LIT(KOutputFileName,"C:\\test\\zip\\extracts\\zip_out.txt"); sl@0: _LIT(KErrFileNotOpened, "File could not be opened."); sl@0: _LIT(KOk, "Ok"); sl@0: _LIT(KZipName,"Name: "); sl@0: _LIT(KZipCRC32,"CRC32: "); sl@0: _LIT(KZipCSize,"Compressed Size: "); sl@0: _LIT(KZipUCSize,"Uncompressed Size: "); sl@0: _LIT(KOpenedSuccessfully, "%S opened sucessfully.\n"); sl@0: _LIT(KLineSpace, "\r\n"); sl@0: sl@0: _LIT(KExtractZipPath, "C:\\test\\zip\\extracts\\"); sl@0: sl@0: #if !defined(__WINS__) sl@0: _LIT(KPath, "Z:\\test\\zip\\"); sl@0: #else sl@0: _LIT(KPath, "C:\\test\\zip\\"); sl@0: #endif sl@0: sl@0: void CZipTest::ExecuteL() sl@0: { sl@0: //text constant declarations sl@0: _LIT(KTxtZipTest,"Zip Test"); sl@0: sl@0: iConsole=Console::NewL(KTxtZipTest, sl@0: TSize(KConsFullScreen,KConsFullScreen)); sl@0: DoTestL(); sl@0: } sl@0: sl@0: CZipTest::~CZipTest() sl@0: { sl@0: delete iConsole; sl@0: } sl@0: sl@0: sl@0: void CZipTest::DoTestL() sl@0: { sl@0: sl@0: TFileName* FileName; sl@0: RFs Fs; sl@0: sl@0: NoFiles=ETrue; sl@0: sl@0: User::LeaveIfError(Fs.Connect()); //Connect to file session sl@0: User::LeaveIfError(Fs.SetSessionPath(KPath)); //Set Session Path to direcrt containing test zip files sl@0: CleanupClosePushL(Fs); sl@0: sl@0: Fs.MkDirAll(KOutputFileName); sl@0: iZipOut.Replace(Fs, KOutputFileName, EFileShareAny|EFileWrite); sl@0: RFileWriteStream stream(iZipOut); sl@0: CDir* fileList; sl@0: sl@0: Fs.GetDir(KPath, KEntryAttNormal, ESortByName, fileList); sl@0: CleanupStack::PushL(fileList); sl@0: TInt count = fileList->Count(); sl@0: for (TInt y=0; y dirFileName((*fileList)[y].iName); sl@0: sl@0: FileName= &dirFileName; sl@0: stream.WriteL(KLineSpace); sl@0: stream.WriteL(KOpeningFile); sl@0: stream.WriteL(*FileName); sl@0: stream.WriteL(KDots); sl@0: TheZipTestL(Fs, FileName, stream); sl@0: } sl@0: if (NoFiles) sl@0: { sl@0: iConsole->Printf(KNoFilesFound); sl@0: stream.WriteL(KNoFilesFound); sl@0: } sl@0: stream.Close(); sl@0: CleanupStack::PopAndDestroy(2); sl@0: } sl@0: sl@0: #if defined(__GCC32__) sl@0: typedef wchar_t __TText; sl@0: #elif defined(__VC32__) sl@0: typedef TUint16 __TText; sl@0: #elif defined(__CW32__) sl@0: typedef TUint16 __TText; sl@0: #elif !defined(__TText_defined) sl@0: #error no typedef for __TText sl@0: #endif sl@0: const __TText* KShortData1252 = L"\x20AC\u00FC\u00E9"; sl@0: const __TText* KShortData850 = L"\u00C7\u00FC\u00E9"; sl@0: const __TText* KLongData1252 = L"\u00E7\u00F8d\u00EB\u00DE\u00E3g\u00EA1252"; sl@0: const __TText* KLongData850 = L"\u00E7\u00F6d\u00EBp\u00E4g\u00EA850"; sl@0: const __TText* KShortWin2K1252 = L"CP1252Win2kShort.zip"; // created on win2k with winzip sl@0: const __TText* KShortWinXP1252 = L"CP1252WinXPShort.zip"; // created on XP with winzip sl@0: const __TText* KShortWin2K850 = L"CP850Win2kShort.zip"; sl@0: const __TText* KShortWinXPMS850= L"CP850WinXPMSShort.zip";// created on XP with Compressed Folders sl@0: const __TText* KShortWinXP850 = L"CP850WinXPShort.zip"; sl@0: const __TText* KLongWin2K = L"CPMixWin2kLong.zip"; sl@0: const __TText* KLongWinXP = L"CPMixWinXPLong.zip"; sl@0: const __TText* KLongWinXPMS = L"CPMixWinXPMSLong.zip"; sl@0: struct TUnzipResultsArray sl@0: { sl@0: const __TText* iZipFileName; sl@0: TInt iZipFileMemberIndex; sl@0: const __TText* iZipFileMemberExpectedName; sl@0: }; sl@0: const TUnzipResultsArray KUnzipResults[] = sl@0: { sl@0: {KShortWin2K1252, 1, KShortData1252}, sl@0: {KShortWinXP1252, 1, KShortData1252}, sl@0: {KShortWin2K850, 1, KShortData850}, sl@0: {KShortWinXPMS850,1, KShortData850}, sl@0: {KShortWinXP850, 1, KShortData850}, sl@0: {KLongWin2K, 1, KLongData1252}, sl@0: {KLongWin2K, 2, KLongData850}, sl@0: {KLongWinXP, 1, KLongData850}, sl@0: {KLongWinXP, 2, KLongData1252}, sl@0: {KLongWinXPMS, 1, KLongData850}, sl@0: {KLongWinXPMS, 2, KLongData1252} sl@0: }; sl@0: void TestEntry(const TDesC16& aFileName, TInt aIndex, const TDesC16& aEntryName) sl@0: // Test for correct decoding of filenames containing extended characters (DEF083102) sl@0: // Cycle through data defined above looking for matching filenames and data sl@0: { sl@0: for (TInt i = 0; sl@0: i != sizeof(KUnzipResults)/sizeof(KUnzipResults[0]); ++i) sl@0: { sl@0: TPtrC filename(reinterpret_cast( sl@0: KUnzipResults[i].iZipFileName)); sl@0: if(aFileName==filename && aIndex==KUnzipResults[i].iZipFileMemberIndex) sl@0: { sl@0: TPtrC entryname(reinterpret_cast( sl@0: KUnzipResults[i].iZipFileMemberExpectedName)); sl@0: test.Next(_L("DEF083102")); sl@0: test(aEntryName==entryname); sl@0: } sl@0: } sl@0: } sl@0: sl@0: void CZipTest::TheZipTestL(RFs& aFs, sl@0: TFileName* aFileName, sl@0: RFileWriteStream& aStream) sl@0: { sl@0: CZipFile* ZipFile=0; sl@0: CZipFileMember* Member=0; sl@0: CZipFileMemberIterator* FileMembers; sl@0: sl@0: iConsole->Printf(_L("Test file: %S\r\n"), aFileName); sl@0: TRAPD(err, ZipFile = CZipFile::NewL(aFs,*aFileName)); sl@0: sl@0: if(err==KErrNoMemory) sl@0: User::Leave(err); // leave here if error is no memory sl@0: sl@0: if (err!=KErrNone) sl@0: { sl@0: aStream.WriteL(KErrFileNotOpened); sl@0: aStream.WriteL(KLineSpace); sl@0: sl@0: if (err == CZipArchive::KZipArchiveError) sl@0: aStream.WriteL(_L("Error: Zip Archive Error.\r\n")); sl@0: else if (err == CZipArchive::KCentralDirectoryTrailerNotFound) sl@0: aStream.WriteL(_L("Error: Central Directory Trailer Not Found.\r\n")); sl@0: else if (err == CZipArchive::KCentralDirectoryTrailerInvalid) sl@0: aStream.WriteL(_L("Error: KCentral Directory Trailer Invalid.\r\n")); sl@0: else if (err == CZipArchive::KCompressionMethodNotSupported) sl@0: aStream.WriteL(_L("Error: Compression Method Not Supported.\r\n")); sl@0: else if (err == CZipArchive::KMultiDiskArchivesNotSupported) sl@0: aStream.WriteL(_L("Error: Multi Disk Archives Not Supported.\r\n")); sl@0: else if (err == CZipArchive::KMemberNotFound) sl@0: aStream.WriteL(_L("Error: Member Not Found.\r\n")); sl@0: else if (err == CZipArchive::KZipArchiveMinError) sl@0: aStream.WriteL(_L("Error: Zip Archive Min Error.\r\n")); sl@0: sl@0: User::Leave(err); sl@0: } sl@0: else sl@0: { sl@0: CleanupStack::PushL(ZipFile); sl@0: aStream.WriteL(KOk); sl@0: aStream.WriteL(KLineSpace); sl@0: aStream.WriteL(KLineSpace); sl@0: iConsole->Printf(KOpenedSuccessfully, aFileName); sl@0: sl@0: NoFiles=EFalse; sl@0: sl@0: FileMembers = ZipFile->GetMembersL(); sl@0: CleanupStack::PushL(FileMembers); sl@0: Member = FileMembers->NextL(); sl@0: TInt index=1;// have to provide this - the one in the iterator is private sl@0: while (Member != NULL) sl@0: { sl@0: CleanupStack::PushL(Member); sl@0: TBuf<16> CRC32; sl@0: CRC32.NumUC((TUint)Member->CRC32(), EHex); sl@0: TBuf<16> UnComp; sl@0: UnComp.NumUC((TUint)Member->UncompressedSize()); sl@0: TBuf<16> Comp; sl@0: Comp.NumUC((TUint)Member->CompressedSize()); sl@0: aStream.WriteL(KZipName); sl@0: aStream.WriteL(*Member->Name()); sl@0: aStream.WriteL(KLineSpace); sl@0: aStream.WriteL(KZipCRC32); sl@0: aStream.WriteL(CRC32); sl@0: aStream.WriteL(KLineSpace); sl@0: aStream.WriteL(KZipCSize); sl@0: aStream.WriteL(Comp); sl@0: aStream.WriteL(KLineSpace); sl@0: aStream.WriteL(KZipUCSize); sl@0: aStream.WriteL(UnComp); sl@0: aStream.WriteL(KLineSpace); sl@0: aStream.CommitL(); sl@0: ExtractFileL(aFs, Member, ZipFile, aFileName, aStream); sl@0: TestEntry(*aFileName,index++,*Member->Name()); sl@0: aFs.SetSessionPath(KPath); sl@0: CleanupStack::PopAndDestroy(Member); sl@0: Member = FileMembers->NextL(); sl@0: } sl@0: CleanupStack::PopAndDestroy(FileMembers); sl@0: } sl@0: CleanupStack::PopAndDestroy(ZipFile); sl@0: } sl@0: sl@0: void CZipTest::ExtractFileL(RFs& aFs, sl@0: const CZipFileMember* aMember, sl@0: CZipFile* aZipFile, sl@0: const TFileName* aFileName, sl@0: RFileWriteStream& aStream) sl@0: { sl@0: TInt loop=0; sl@0: HBufC* name = aMember->Name()->AllocLC(); sl@0: while (loopLength()) sl@0: { sl@0: if ((*name)[loop] == '/') sl@0: { sl@0: name->Des()[loop] = '\\'; sl@0: } sl@0: loop++; sl@0: } sl@0: sl@0: TFileName fn; sl@0: fn.Append(KExtractZipPath); sl@0: fn.Append(*aFileName); sl@0: fn.Append('\\'); sl@0: fn.Append(*name); sl@0: // sl@0: RFile expandedMember; sl@0: CleanupClosePushL(expandedMember); sl@0: // sl@0: aFs.SetSessionPath(KExtractZipPath); sl@0: aFs.MkDirAll(fn); sl@0: TInt retVal = expandedMember.Replace(aFs,fn, EFileShareAny|EFileWrite); sl@0: if(retVal != KErrNone) sl@0: { sl@0: //Could be a directory name which we are planning to write to. sl@0: CleanupStack::PopAndDestroy(2,name); //expanded member, name sl@0: expandedMember.Close(); sl@0: return; sl@0: } sl@0: sl@0: // sl@0: RZipFileMemberReaderStream* fileStream; sl@0: TInt error = aZipFile->GetInputStreamL(aMember, fileStream); sl@0: if (error != KErrNone) sl@0: { sl@0: _LIT(KCompressionNotSupported, "Error: Compression Method Not Supported"); sl@0: aStream.WriteL(KCompressionNotSupported); sl@0: aStream.WriteL(KLineSpace); sl@0: CleanupStack::PopAndDestroy(2,name); //expanded member and name sl@0: aFs.Delete(fn); sl@0: return; sl@0: } sl@0: CleanupStack::PushL(fileStream); sl@0: // sl@0: TUint32 size = aMember->UncompressedSize(); sl@0: HBufC8* bytes = HBufC8::New(size); sl@0: CleanupStack::PushL(bytes); sl@0: TPtr8 ptr = bytes->Des(); sl@0: User::LeaveIfError(fileStream->Read(ptr,size)); sl@0: User::LeaveIfError(expandedMember.Write(ptr)); sl@0: CleanupStack::PopAndDestroy(4,name); // bytes, fileStream, expanded member and name sl@0: expandedMember.Close(); sl@0: } sl@0: sl@0: LOCAL_C void executeUiL() sl@0: { sl@0: CZipTest* ziptest=new (ELeave) CZipTest; sl@0: CleanupStack::PushL(ziptest); sl@0: ziptest->ExecuteL(); sl@0: CleanupStack::PopAndDestroy(); sl@0: } sl@0: sl@0: GLDEF_C TInt E32Main() // main function called by E32 sl@0: { sl@0: test.Title(); sl@0: __UHEAP_MARK; // mark heap state sl@0: test.Start(_L("Test ZIP")); sl@0: CTrapCleanup* cleanup=CTrapCleanup::New(); // get clean-up stack sl@0: TRAPD(error, executeUiL()); // do most stuff under cleanup stack sl@0: test(error==KErrNone); sl@0: test.End(); sl@0: delete cleanup; // destroy clean-up stack sl@0: __UHEAP_MARKEND; // check no memory leak sl@0: test.Close(); sl@0: return 0; // and return sl@0: } sl@0: