Update contrib.
1 // Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
2 // All rights reserved.
3 // This component and the accompanying materials are made available
4 // under the terms of "Eclipse Public License v1.0"
5 // which accompanies this distribution, and is available
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
27 class CZipTest - defines text UI
29 LOCAL_D RTest test(_L("ZIPTEST"));
31 class CZipTest : public CBase
34 // execute UI until exit command processed
40 void ExtractFileL(RFs&, const CZipFileMember*, CZipFile*, const TFileName*, RFileWriteStream&);
41 void TheZipTestL(RFs&, TFileName*, RFileWriteStream&);
44 CConsoleBase* iConsole;
49 _LIT(KNoFilesFound,"No appropriate files located in this folder.\r\n");
50 _LIT(KOpeningFile,"Opening file ");
52 _LIT(KOutputFileName,"C:\\test\\zip\\extracts\\zip_out.txt");
53 _LIT(KErrFileNotOpened, "File could not be opened.");
55 _LIT(KZipName,"Name: ");
56 _LIT(KZipCRC32,"CRC32: ");
57 _LIT(KZipCSize,"Compressed Size: ");
58 _LIT(KZipUCSize,"Uncompressed Size: ");
59 _LIT(KOpenedSuccessfully, "%S opened sucessfully.\n");
60 _LIT(KLineSpace, "\r\n");
62 _LIT(KExtractZipPath, "C:\\test\\zip\\extracts\\");
64 #if !defined(__WINS__)
65 _LIT(KPath, "Z:\\test\\zip\\");
67 _LIT(KPath, "C:\\test\\zip\\");
70 void CZipTest::ExecuteL()
72 //text constant declarations
73 _LIT(KTxtZipTest,"Zip Test");
75 iConsole=Console::NewL(KTxtZipTest,
76 TSize(KConsFullScreen,KConsFullScreen));
86 void CZipTest::DoTestL()
94 User::LeaveIfError(Fs.Connect()); //Connect to file session
95 User::LeaveIfError(Fs.SetSessionPath(KPath)); //Set Session Path to direcrt containing test zip files
96 CleanupClosePushL(Fs);
98 Fs.MkDirAll(KOutputFileName);
99 iZipOut.Replace(Fs, KOutputFileName, EFileShareAny|EFileWrite);
100 RFileWriteStream stream(iZipOut);
103 Fs.GetDir(KPath, KEntryAttNormal, ESortByName, fileList);
104 CleanupStack::PushL(fileList);
105 TInt count = fileList->Count();
106 for (TInt y=0; y<count; y++)
111 TBuf<256> dirFileName((*fileList)[y].iName);
113 FileName= &dirFileName;
114 stream.WriteL(KLineSpace);
115 stream.WriteL(KOpeningFile);
116 stream.WriteL(*FileName);
117 stream.WriteL(KDots);
118 TheZipTestL(Fs, FileName, stream);
122 iConsole->Printf(KNoFilesFound);
123 stream.WriteL(KNoFilesFound);
126 CleanupStack::PopAndDestroy(2);
129 #if defined(__GCC32__)
130 typedef wchar_t __TText;
131 #elif defined(__VC32__)
132 typedef TUint16 __TText;
133 #elif defined(__CW32__)
134 typedef TUint16 __TText;
135 #elif !defined(__TText_defined)
136 #error no typedef for __TText
138 const __TText* KShortData1252 = L"\x20AC\u00FC\u00E9";
139 const __TText* KShortData850 = L"\u00C7\u00FC\u00E9";
140 const __TText* KLongData1252 = L"\u00E7\u00F8d\u00EB\u00DE\u00E3g\u00EA1252";
141 const __TText* KLongData850 = L"\u00E7\u00F6d\u00EBp\u00E4g\u00EA850";
142 const __TText* KShortWin2K1252 = L"CP1252Win2kShort.zip"; // created on win2k with winzip
143 const __TText* KShortWinXP1252 = L"CP1252WinXPShort.zip"; // created on XP with winzip
144 const __TText* KShortWin2K850 = L"CP850Win2kShort.zip";
145 const __TText* KShortWinXPMS850= L"CP850WinXPMSShort.zip";// created on XP with Compressed Folders
146 const __TText* KShortWinXP850 = L"CP850WinXPShort.zip";
147 const __TText* KLongWin2K = L"CPMixWin2kLong.zip";
148 const __TText* KLongWinXP = L"CPMixWinXPLong.zip";
149 const __TText* KLongWinXPMS = L"CPMixWinXPMSLong.zip";
150 struct TUnzipResultsArray
152 const __TText* iZipFileName;
153 TInt iZipFileMemberIndex;
154 const __TText* iZipFileMemberExpectedName;
156 const TUnzipResultsArray KUnzipResults[] =
158 {KShortWin2K1252, 1, KShortData1252},
159 {KShortWinXP1252, 1, KShortData1252},
160 {KShortWin2K850, 1, KShortData850},
161 {KShortWinXPMS850,1, KShortData850},
162 {KShortWinXP850, 1, KShortData850},
163 {KLongWin2K, 1, KLongData1252},
164 {KLongWin2K, 2, KLongData850},
165 {KLongWinXP, 1, KLongData850},
166 {KLongWinXP, 2, KLongData1252},
167 {KLongWinXPMS, 1, KLongData850},
168 {KLongWinXPMS, 2, KLongData1252}
170 void TestEntry(const TDesC16& aFileName, TInt aIndex, const TDesC16& aEntryName)
171 // Test for correct decoding of filenames containing extended characters (DEF083102)
172 // Cycle through data defined above looking for matching filenames and data
175 i != sizeof(KUnzipResults)/sizeof(KUnzipResults[0]); ++i)
177 TPtrC filename(reinterpret_cast<const TText16*>(
178 KUnzipResults[i].iZipFileName));
179 if(aFileName==filename && aIndex==KUnzipResults[i].iZipFileMemberIndex)
181 TPtrC entryname(reinterpret_cast<const TText16*>(
182 KUnzipResults[i].iZipFileMemberExpectedName));
183 test.Next(_L("DEF083102"));
184 test(aEntryName==entryname);
189 void CZipTest::TheZipTestL(RFs& aFs,
190 TFileName* aFileName,
191 RFileWriteStream& aStream)
194 CZipFileMember* Member=0;
195 CZipFileMemberIterator* FileMembers;
197 iConsole->Printf(_L("Test file: %S\r\n"), aFileName);
198 TRAPD(err, ZipFile = CZipFile::NewL(aFs,*aFileName));
200 if(err==KErrNoMemory)
201 User::Leave(err); // leave here if error is no memory
205 aStream.WriteL(KErrFileNotOpened);
206 aStream.WriteL(KLineSpace);
208 if (err == CZipArchive::KZipArchiveError)
209 aStream.WriteL(_L("Error: Zip Archive Error.\r\n"));
210 else if (err == CZipArchive::KCentralDirectoryTrailerNotFound)
211 aStream.WriteL(_L("Error: Central Directory Trailer Not Found.\r\n"));
212 else if (err == CZipArchive::KCentralDirectoryTrailerInvalid)
213 aStream.WriteL(_L("Error: KCentral Directory Trailer Invalid.\r\n"));
214 else if (err == CZipArchive::KCompressionMethodNotSupported)
215 aStream.WriteL(_L("Error: Compression Method Not Supported.\r\n"));
216 else if (err == CZipArchive::KMultiDiskArchivesNotSupported)
217 aStream.WriteL(_L("Error: Multi Disk Archives Not Supported.\r\n"));
218 else if (err == CZipArchive::KMemberNotFound)
219 aStream.WriteL(_L("Error: Member Not Found.\r\n"));
220 else if (err == CZipArchive::KZipArchiveMinError)
221 aStream.WriteL(_L("Error: Zip Archive Min Error.\r\n"));
227 CleanupStack::PushL(ZipFile);
229 aStream.WriteL(KLineSpace);
230 aStream.WriteL(KLineSpace);
231 iConsole->Printf(KOpenedSuccessfully, aFileName);
235 FileMembers = ZipFile->GetMembersL();
236 CleanupStack::PushL(FileMembers);
237 Member = FileMembers->NextL();
238 TInt index=1;// have to provide this - the one in the iterator is private
239 while (Member != NULL)
241 CleanupStack::PushL(Member);
243 CRC32.NumUC((TUint)Member->CRC32(), EHex);
245 UnComp.NumUC((TUint)Member->UncompressedSize());
247 Comp.NumUC((TUint)Member->CompressedSize());
248 aStream.WriteL(KZipName);
249 aStream.WriteL(*Member->Name());
250 aStream.WriteL(KLineSpace);
251 aStream.WriteL(KZipCRC32);
252 aStream.WriteL(CRC32);
253 aStream.WriteL(KLineSpace);
254 aStream.WriteL(KZipCSize);
255 aStream.WriteL(Comp);
256 aStream.WriteL(KLineSpace);
257 aStream.WriteL(KZipUCSize);
258 aStream.WriteL(UnComp);
259 aStream.WriteL(KLineSpace);
261 ExtractFileL(aFs, Member, ZipFile, aFileName, aStream);
262 TestEntry(*aFileName,index++,*Member->Name());
263 aFs.SetSessionPath(KPath);
264 CleanupStack::PopAndDestroy(Member);
265 Member = FileMembers->NextL();
267 CleanupStack::PopAndDestroy(FileMembers);
269 CleanupStack::PopAndDestroy(ZipFile);
272 void CZipTest::ExtractFileL(RFs& aFs,
273 const CZipFileMember* aMember,
275 const TFileName* aFileName,
276 RFileWriteStream& aStream)
279 HBufC* name = aMember->Name()->AllocLC();
280 while (loop<name->Length())
282 if ((*name)[loop] == '/')
284 name->Des()[loop] = '\\';
290 fn.Append(KExtractZipPath);
291 fn.Append(*aFileName);
295 RFile expandedMember;
296 CleanupClosePushL(expandedMember);
298 aFs.SetSessionPath(KExtractZipPath);
300 TInt retVal = expandedMember.Replace(aFs,fn, EFileShareAny|EFileWrite);
301 if(retVal != KErrNone)
303 //Could be a directory name which we are planning to write to.
304 CleanupStack::PopAndDestroy(2,name); //expanded member, name
305 expandedMember.Close();
310 RZipFileMemberReaderStream* fileStream;
311 TInt error = aZipFile->GetInputStreamL(aMember, fileStream);
312 if (error != KErrNone)
314 _LIT(KCompressionNotSupported, "Error: Compression Method Not Supported");
315 aStream.WriteL(KCompressionNotSupported);
316 aStream.WriteL(KLineSpace);
317 CleanupStack::PopAndDestroy(2,name); //expanded member and name
321 CleanupStack::PushL(fileStream);
323 TUint32 size = aMember->UncompressedSize();
324 HBufC8* bytes = HBufC8::New(size);
325 CleanupStack::PushL(bytes);
326 TPtr8 ptr = bytes->Des();
327 User::LeaveIfError(fileStream->Read(ptr,size));
328 User::LeaveIfError(expandedMember.Write(ptr));
329 CleanupStack::PopAndDestroy(4,name); // bytes, fileStream, expanded member and name
330 expandedMember.Close();
333 LOCAL_C void executeUiL()
335 CZipTest* ziptest=new (ELeave) CZipTest;
336 CleanupStack::PushL(ziptest);
338 CleanupStack::PopAndDestroy();
341 GLDEF_C TInt E32Main() // main function called by E32
344 __UHEAP_MARK; // mark heap state
345 test.Start(_L("Test ZIP"));
346 CTrapCleanup* cleanup=CTrapCleanup::New(); // get clean-up stack
347 TRAPD(error, executeUiL()); // do most stuff under cleanup stack
348 test(error==KErrNone);
350 delete cleanup; // destroy clean-up stack
351 __UHEAP_MARKEND; // check no memory leak
353 return 0; // and return