diff -r 000000000000 -r 96e5fb8b040d kerneltest/e32test/misc/t_unzip.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/kerneltest/e32test/misc/t_unzip.cpp Thu Dec 17 09:24:54 2009 +0200 @@ -0,0 +1,171 @@ +// Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of the License "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// e32test\misc\t_unzip.cpp +// +// + +#include +#include +#include "unzip.h" + +RTest test(_L("T_UNZIP")); + +RFile TheInputFile; +TUint8* OutPtr; + +GLDEF_C void AcceptUnzippedBlock(TZipInfo& /*aInfo*/, TUint8*& aOutPtr, TInt aError) + { + if (aError==KErrNone) + OutPtr=aOutPtr; + } + +GLDEF_C TInt ReadInputData(TUint8* aDest, TInt& aLength) + { + TPtr8 ptr(aDest,0,aLength); + return TheInputFile.Read(ptr); + } + +GLDEF_C TInt UnzipComplete(TZipInfo& /*a*/, TUint8* /*aOutPtr*/, TInt /*aError*/) + { + return KErrNone; + } + +_LIT(KLitThreadName,"Unzip"); +TInt Initialise(TZipInfo& a) + { + TInt r=InitInfo(a); + if (r!=KErrNone) + return r; + a.iFileBufSize=4*a.iInBufSize; + TAny* pFileBuf=MALLOC(a.iFileBufSize); + if (!pFileBuf) + return KErrNoMemory; + a.iFileBuf=(TUint8*)pFileBuf; + RThread t; + r=t.Create(KLitThreadName,UnzipThread,0x2000,NULL,&a); + if (r!=KErrNone) + { + FREE(pFileBuf); + a.iFileBuf=NULL; + return r; + } + t.SetPriority(EPriorityLess); + t.Logon(a.iThreadStatus); + t.Resume(); + a.iThreadHandle=t.Handle(); + return KErrNone; + } + +void ProcessHeader(TZipInfo& a) + { + test.Printf(_L("Flags=%d\n"),a.iFlags); + test.Printf(_L("Method=%d\n"),a.iMethod); + test.Printf(_L("Crc=%d\n"),a.iCrc); + test.Printf(_L("Compressed size=%d\n"),a.iCompressedSize); + test.Printf(_L("Uncompressed size=%d\n"),a.iUncompressedSize); + test.Printf(_L("File name %S\n"),&a.iName); + test.Printf(_L("Data offset %d\n\n"),a.iDataOffset); + + test.Next(_L("Allocate memory for unzipped file")); + a.iOutBuf=(TUint8*)User::Alloc(a.iUncompressedSize); + test(a.iOutBuf!=NULL); + test.Next(_L("Begin unzipping")); + a.iHeaderDone=2; + TRequestStatus* pS=&a.iProcessedHeader; + RThread t; + t.SetHandle(a.iThreadHandle); + t.RequestComplete(pS,0); + } + +void Cleanup(TZipInfo& a) + { + delete a.iFileBuf; + a.iFileBuf=NULL; + delete a.iOutBuf; + a.iOutBuf=NULL; + RThread& t=*(RThread*)&a.iThreadHandle; + t.Close(); + } + +GLDEF_C TInt E32Main() + { + test.Title(); + TFileName inputFileName; + User::CommandLine(inputFileName); + test.Start(_L("Connect to file server")); + RFs fs; + TInt r=fs.Connect(); + test(r==KErrNone); + test.Printf(_L("Open file %S\n"),&inputFileName); + r=TheInputFile.Open(fs,inputFileName,EFileRead); + test(r==KErrNone); + TZipInfo z; + r=TheInputFile.Size(z.iRemain); + test(r==KErrNone); + test.Printf(_L("File size %d\n"),z.iRemain); + + test.Next(_L("Initialise")); + r=Initialise(z); + test(r==KErrNone); + + test.Next(_L("Read header")); + TUint32 c=0; + RThread t; + t.SetHandle(z.iThreadHandle); + while (z.iRemain && z.iThreadStatus==KRequestPending) + { + TRequestStatus dummy; + TRequestStatus* pS=&dummy; + r=ReadBlockToBuffer(z); + test(r==KErrNone); + t.RequestComplete(pS,0); // same process +// test.Printf(_L(".")); + while(z.iHeaderDone==0 && z.iThreadStatus==KRequestPending) + DELAY(20000); + if (z.iHeaderDone==1 && z.iThreadStatus==KRequestPending) + { + // after reading first block, process the header + ProcessHeader(z); + c=User::NTickCount(); + } + } + + test.Next(_L("\nWait for thread to exit")); + User::WaitForRequest(z.iThreadStatus); + if (z.iRemain || t.ExitReason()!=KErrNone) + { + test.Printf(_L("Error %d\n"),t.ExitReason()); + test(0); + } + TUint c2=User::NTickCount(); + test.Printf(_L("Took %dms\n"),c2-c); + TheInputFile.Close(); + test.Getch(); + + TInt unc_size=OutPtr-z.iOutBuf; + test.Printf(_L("Recovered size %d\n"),unc_size); + test.Printf(_L("Writing to file\n")); + RFile file; + r=file.Replace(fs,z.iName,EFileWrite); + test(r==KErrNone); + TPtrC8 ptr(z.iOutBuf,unc_size); + r=file.Write(ptr); + file.Close(); + + fs.Close(); + Cleanup(z); + + return KErrNone; + } +