diff -r 000000000000 -r f58d6ec98e88 reszip/src/rcmp.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/reszip/src/rcmp.cpp Thu Dec 17 09:14:18 2009 +0200 @@ -0,0 +1,286 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "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: +* +*/ +// RCMP.CPP +// +// + +#include +#include +#include +#include + + +#include "rescomp.h" +#include "resdict.h" +#include "resentry.h" + +const TInt KConsWidth = 20; +const TInt KConsHeight = 15; + +// TOOL version string (will be printed on command line so please keep upto date) +_LIT(KReszipVersionString, "reszip version 2.0.0"); + +LOCAL_D CConsoleBase* console; +LOCAL_D RFs TheFs; +LOCAL_D CTrapCleanup* TheTrapCleanup; + +LOCAL_D CArrayFixFlat* iFileList; + +TBuf<256> Arg; + + +_LIT(KUncompressedExt,".orig"); + +LOCAL_C void setupCleanup() +// +// Initialise the cleanup stack. +// + { + TheTrapCleanup=CTrapCleanup::New(); + } + +void AddToFileListL(const TDesC& aName); + + +void AddFileListL(const TDesC& aName) + { + RDebug::Print(_L("Adding files from ")); + RDebug::Print(aName); + + RFileReadStream stream; + User::LeaveIfError( stream.Open(TheFs, aName, EFileRead) ); + CleanupClosePushL(stream); + + TBuf<512> buf; + TInt ch = 0; + TInt err = KErrNone; + while(err == KErrNone) + { + TRAP(err, ch = stream.ReadUint8L()); + if (err == KErrNone) + { + if (ch != 13 && ch != 10) + { + buf.Append(ch); + } + else + { + AddToFileListL(buf); + buf.Zero(); + } + } + } + + CleanupStack::PopAndDestroy(); // stream + } + +void AddToFileListL(const TDesC& aName) + { + if (aName.Length() == 0) + { + return; + } + RDebug::Print(aName); + + if (aName[0] == '@') + { + AddFileListL(aName.Right(aName.Length()-1)); + return; + } + + TParse parse; + if (parse.Set(aName, NULL, NULL) != KErrNone) + { + return; + } + TFileName name(parse.NameAndExt()); + TPtrC driveAndPath(parse.DriveAndPath()); + + CDir* fileList = NULL; + CDir* dirList = NULL; + + + // Report any missing files (not fatal, as we don't want to stop the list) + TEntry entry; + if((!parse.IsWild()) && TheFs.Entry(aName,entry) != KErrNone) + console->Printf(_L("Error: Cannot find %S\n"), &aName); + + + TInt err = TheFs.GetDir(aName, KEntryAttNormal,ESortByName,fileList,dirList); + if (err != KErrNone) + { + delete fileList; + delete dirList; + return; + } + + TInt count = fileList->Count(); + + _LIT(KString,"%S\n"); + + TInt appendErr = KErrNone; + for (TInt i=0;iAppendL(fullName) ); + if(appendErr!=KErrNone) + break; + } + + delete fileList; + delete dirList; + User::LeaveIfError(appendErr); + } + + + +void ProcessAllFilesL() + { + TInt totalSize = 0; + TInt totalCompressed = 0; + + if (Arg.Length() == 0) + { + // Write help information + console->Printf(_L("ResZip ROM Resource Compressor (%S)\n------------------------------\n"), &KReszipVersionString); + console->Printf(_L("Syntax: ResZip [full path to resource files]\n")); + console->Printf(_L(" ResZip [@full path to text file containing resource filenames]\n")); + console->Printf(_L("e.g: ResZip r:\\epoc32\\release\\wins\\udeb\\z\\system\\data\\*.rsc\n")); + console->Printf(_L(" ResZip @r:\\files.txt\n")); + console->Printf(_L(" where r:\\files.txt contains list of filenames (wildcards allowed)\n")); + console->Printf(_L("Full Path may include wildcards for compressing all resources in a directory\n")); + console->Printf(_L("May be used to compress non-ROM resources, with lower run-time performance\n")); + return; + } + + iFileList = new(ELeave)CArrayFixFlat(32); + + AddToFileListL(Arg); + + TInt filecount = iFileList->Count(); + + if (filecount == 0) + { + console->Printf(_L("No files to process\n")); + } + else + { + TBuf<80> buf; + buf.Format(_L("Processing %d files\n"), filecount); + console->Printf(buf); + console->Printf(_L("Name\t\t\t Resource\tOrig\tUncompressed\tNew\t%%\tDictSize\n")); + console->Printf(_L("====\t\t\t ========\t====\t============\t===\t==\t========\n")); + } + + TTime startTime; + startTime.UniversalTime(); + + for (TInt ii=0; iiAt(ii)); + compressor->LoadFileL(TheFs, fullName); + compressor->CompressL(); + + if (!compressor->IsValid()) + { + console->Printf(_L("\r")); + console->Printf(compressor->iConOutput); + console->Printf(_L("Not compressed\n")); + } + else + { + compressor->DisplayStats(); + totalSize += compressor->OriginalFileSize(); + totalCompressed += compressor->CompressedSize(); + TFileName newName(fullName); + newName.Append(KUncompressedExt); + TheFs.Delete(newName); + User::LeaveIfError(TheFs.Rename(fullName, newName)); + TRAPD(err, compressor->WriteFileL(TheFs,fullName)); + if(err != KErrNone) + { + TheFs.Delete(fullName); + TheFs.Rename(newName, fullName); + User::Leave(err); + } + } + + CleanupStack::PopAndDestroy(compressor); + } + + console->Printf(_L("------------------------------\n")); + console->Printf(_L("Total File Size: %d bytes\n"), totalSize); + console->Printf(_L("Total Compressed Size: %d bytes\n"), totalCompressed); + + if (totalSize > 0) + { + TInt compression = ((totalCompressed) * 100) / totalSize; + console->Printf(_L("Total Compression = %d %%\n"), compression); + } + + TTime endTime; + endTime.UniversalTime(); + + TTimeIntervalSeconds seconds; + endTime.SecondsFrom(startTime, seconds); + + TInt secs = seconds.Int(); + + TInt mins = secs / 60; + TInt hour = mins / 60; + + secs -= (mins * 60); + mins -= (hour * 60); + + TBuf<80> time; + time.Format(_L("Total time: %02d:%02d:%02d"), hour, mins, secs); + console->Printf(time); + + delete iFileList; + } + + +void DoConsoleL() + { + console=Console::NewL(_L("EPOC32 - reszip"), + TSize(KConsWidth,KConsHeight)); + CleanupStack::PushL(console); + // + User::CommandLine(Arg); + // + User::LeaveIfError( TheFs.Connect() ); + // + TRAPD(r,ProcessAllFilesL()); + + if (r!=KErrNone) + console->Printf(_L("failed with code %d\n"), r); + CleanupStack::PopAndDestroy(); // console + TheFs.Close(); + } + +GLDEF_C TInt E32Main() + { + setupCleanup(); + TRAPD(err,DoConsoleL()); + delete TheTrapCleanup; + return KErrNone; + }