diff -r 26b6f0522fd8 -r 8110bf1194d1 secureswitools/swisistools/source/rscparser/barscimpl.h --- a/secureswitools/swisistools/source/rscparser/barscimpl.h Mon May 03 12:38:03 2010 +0300 +++ b/secureswitools/swisistools/source/rscparser/barscimpl.h Fri May 14 15:58:48 2010 +0300 @@ -1,4 +1,4 @@ -// Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +// Copyright (c) 2009 - 2010 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" @@ -26,6 +26,9 @@ #include #include "commontypes.h" +//Forward declarations +struct SDictionaryCompressionData; +class RDictionaryCompressionBitStream; /** Accesses a resource file and reads the resource data into a buffer. It is the implementation class for CResourceFile class. @@ -76,8 +79,11 @@ @param aPos Offset from where to begin reading @param aData Buffer to store read values @param aLength Length of the bytes to be read. + @return Length of the bytes to be read. */ - void ReadL(TInt aPos,TUint8* aData,const TInt& aLength) ; + TInt ReadL(TInt aPos,TUint8* aData,const TInt& aLength); + + TUidType UidType() const; private: @@ -114,8 +120,9 @@ @param aPos Offset from where to begin reading @param aData Buffer to store read values @param aLength Length of the bytes to be read. + @return Length of the bytes to be read. */ - void ReadL(const TUint32& aFlags, TInt aPos, TUint8* aData, const TInt& aLength); + TInt ReadL(const TUint32& aFlags, TInt aPos, TUint8* aData, const TInt& aLength); /** @internalComponent @return The first resource record. @@ -155,6 +162,38 @@ @return Pointer to decompressed data */ Ptr8* DecompressUnicodeL(const Ptr8* aInputResourceData) const; + + + /** + The method will decompress the dictionary compressed data, allocate enough + memory from the heap for the decompressed data, copy the data there and return a pointer + to the decompressed data. + The method doesn't own the allocated heap memory for the decompressed data. It's a caller + responsibility to deallocate the allocated memory. + @pre OpenL() is called. + @leave KErrCorrupt The file is corrupted. + @leave KErrNoMemory There is not enough memory for the decompressed data. + Some other error codes are possible too. + */ + Ptr8* DictionaryDecompressedResourceDataL( + TInt aResourceIndex, + TUint aFlags, + const SDictionaryCompressionData& aDictionaryCompressionData, + const Ptr16* aIndex) const; + + + /** + The method will decomress the dictionary compressed data (aDictionaryCompressionData argument) and append + the decompressed data to the end of std::vector + (aStackOfDictionaryCompressionBitStreams argument). + */ + void AppendDictionaryCompressionBitStreamL( + std::vector& aStackOfDictionaryCompressionBitStreams, + TUint aFlags, + const SDictionaryCompressionData& aDictionaryCompressionData, + TInt aStartOfBitData, + TInt aStartOfIndex, + TInt aIndexEntry) const; /** Get the two bytes(in Little Endian format) from the specified buffer @@ -163,22 +202,52 @@ buffer. @return 2-bytes read from the buffer. */ - TInt LittleEndianTwoByteInteger(TUint8* aBuffer,const TInt& aIndexOfFirstByte) const; - Ptr8* GetDecompressedResourceDataL( - const TInt& aResourceIndex, - const TUint32& aFlags); + + TInt LittleEndianTwoByteInteger(const TUint8* aBuffer,const TInt& aIndexOfFirstByte,TInt aLength) const; + private: std::ifstream* iResourceContents; TInt iSizeOfLargestResourceWhenCompletelyUncompressed; - // An array of (unsigned) 16-bit file-positions - TUint16* iIndex; + //basically an array of (unsigned) 16-bit file-positions - + //this is only used for non-dictionary-compressed resource files + Ptr16* iIndex; + + //the position of this member in the class is exposed because RResourceFile::Offset() is + //an inline function accessing "iOffset". RResourceFileImpl is an implementation class for + //RResourceFile class. The "iOffset" offset from the beginning of the class must be exactly + //12 bytes. TInt iOffset; TExtra* iExtra; TUint32 iFlagsAndNumberOfResources; }; +struct SDictionaryCompressionData + { + inline SDictionaryCompressionData() : + iStartOfDictionaryData(0), + iStartOfDictionaryIndex(0), + iNumberOfDictionaryEntries(0), + iStartOfResourceData(0), + iStartOfResourceIndex(0), + iNumberOfBitsUsedForDictionaryTokens(0), + iCachedDictionaryIndex(0), + iCachedResourceBuffer(0)// = NULL; + { + } + TInt iStartOfDictionaryData; + TInt iStartOfDictionaryIndex; + TInt iNumberOfDictionaryEntries; + TInt iStartOfResourceData; + TInt iStartOfResourceIndex; + TInt iNumberOfBitsUsedForDictionaryTokens; + TUint16* iCachedDictionaryIndex; + TUint8* iCachedResourceBuffer; + + }; + + /** Stores the RSC filesize, offset and the bit-array representing resources containing compressed unicode. @@ -194,7 +263,7 @@ @param aRscIdx Resource Index @return Status of whether the resource is actually present or not. */ - TInt32 ContainsCompressedUnicode(const TInt& aRscIdx) const; + TInt32 ContainsCompressedUnicode(TInt& aRscIdx, TBool aFirstRscIsGen) const; private: // Prevent default copy constructor @@ -204,13 +273,15 @@ public: // RSC file UID - sTUid iUid; + TUidType iUidType; // An array of bits, one for each resource in the resource file - TUint8* iBitArrayOfResourcesContainingCompressedUnicode; + Ptr8* iBitArrayOfResourcesContainingCompressedUnicode; + SDictionaryCompressionData iDictionaryCompressionData; // Offset of RSC chunk TInt iFileOffset; // RSC file size TUint32 iFileSize; }; + #endif//__BARSCIMPL_H__