diff -r 000000000000 -r 05e9090e2422 skins/AknSkins/srvinc/AknsSrvChunkMaintainer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/skins/AknSkins/srvinc/AknsSrvChunkMaintainer.h Thu Dec 17 09:14:12 2009 +0200 @@ -0,0 +1,646 @@ +/* +* Copyright (c) 2002-2008 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: Chunk maintainer. +* +*/ + + +#ifndef AKNSSRVCHUNKMAINTAINER_H +#define AKNSSRVCHUNKMAINTAINER_H + +// INCLUDES + +#include +#include + +#include +#include "AknsSrvItemDef.h" +#include "AknsSrvExclusion.h" + +// CONSTANTS + +// The shared memory chunk name +_LIT(KAKNSSRVSHAREDMEMORYCHUNKNAME, "AknsSrvSharedMemoryChunk"); +// The shared memory chunk protection semaphore +_LIT(KAKNSSRVWAITSEMAPHORENAME, "AknsSrvWaitSemaphore"); +// Rendering mutex +_LIT(KAKNSSRVRENDERMUTEXNAME, "AknsSrvRenderSemaphore"); + +static const TInt KAknsSrvMaxFileNameLen = 512; + +// DATA TYPES + +/** +* Header area offsets. +* Valid only for enhanced skins implementation. +*/ +enum TAknsSrvHeaderAreaOffsets + { + EAknsSrvItemDefAreaBaseOffset = 0, + EAknsSrvItemDefAreaAllocatedSizeOffset = 1, + EAknsSrvItemDefAreaCurrentSizeOffset = 2, + EAknsSrvDataAreaBaseOffset = 3, + EAknsSrvDataAreaAllocatedSizeOffset = 4, + EAknsSrvDataAreaCurrentSizeOffset = 5, + EAknsSrvFilenameAreaBaseOffset = 6, + EAknsSrvFilenameAreaAllocatedSizeOffset = 7, + EAknsSrvFilenameAreaCurrentSizeOffset = 8, + EAknsSrvScalableGfxAreaBaseOffset = 9, + EAknsSrvScalableGfxAreaAllocatedSizeOffset = 10, + EAknsSrvScalableGfxAreaCurrentSizeOffset = 11, + EAknsSrvItemDefHashBaseOffset = 12, + EAknsSrvItemDefHashAllocatedSizeOffset = 13, + EAknsSrvItemDefHashCurrentSizeOffset = 14 + }; + +/** +* Base area names. +* Valid only for enhanced skins implementation. +*/ +enum TAknsSrvBaseAreaName + { + EAknsSrvItemDefArea = 0, + EAknsSrvDataArea = 1, + EAknsSrvFilenameArea = 2, + EAknsSrvScalableGfxArea = 4, + EAknsSrvItemDefHash = 5 + }; + +/** +* Post operation types. +* Valid only for enhanced skins implementation. +* +* @internal +*/ +enum TAknsSrvCMPostOpType + { + EAknsSrvCMPOTTileX = 0, + EAknsSrvCMPOTTileY = 1, + EAknsSrvCMPOTTileToStretch = 2 + }; + +/** +* Hash Table data structure. +*/ +struct TAknsSrvHashTable + { + TInt iHead; + }; + + +/** +* Post operation data structure. +* Valid only for enhanced skins implementation. +*/ +struct TAknsSrvCMPostOp + { + public: // Data + TAknsSrvCMPostOpType iType; + TAknsItemID iIID; + + public: + static TInt LinearOrder( + const TAknsSrvCMPostOp& aFirst, + const TAknsSrvCMPostOp& aSecond ); + }; + +class MAknsSrvMorphingListener +{ + public: + virtual void MorhphingEventTimeout() = 0; +}; + +class CAknsSrvMorphingTimer : public CActive + { + public: + static CAknsSrvMorphingTimer* NewL(MAknsSrvMorphingListener* aListener, TInt aInterval); + void RunL(); + void DoCancel(); + void IssueRequest(); + ~CAknsSrvMorphingTimer(); + + protected: + void ConstructL(); + CAknsSrvMorphingTimer(MAknsSrvMorphingListener* aListener, TInt aInterval); + private: + MAknsSrvMorphingListener* iListener; + TInt iInterval; + RTimer iTimer; + }; + +// FORWARD DECLARATIONS + +class CAknsSrvFileBuffer; +class CAknsSrvBitmapStore; + +// CLASS DECLARATIONS + +/** +* Internal class for maintaining the shared memory chunk in the skin server. +* +* @since 2.0 +*/ +NONSHARABLE_CLASS(CAknsSrvChunkMaintainer) : public CBase + { + + public: // Construction and destruction + /** + * Default C++ constructor + */ + CAknsSrvChunkMaintainer(CAknsSrvBitmapStore* aBitmapStore); + + /** + * Destructor. + */ + ~CAknsSrvChunkMaintainer(); + + public: // New methods + + /** + * Reads normal skin (non ROM) definitions to the shared memory chunk. + * + * @since 2.0 + * + * @param aUid Uid of the skin file to read + * + * @param aClass Which class should be merged. + * + * @param aClearChunk A boolean value to specify + * if to discard existing content in the shared + * chunk + * + * @param aExclQuery Exclusion query object. + */ + void MergeSkinDefinitionsL( const TPtrC& aFilename, + const TAknsItemDefClass aClass, const TBool aClearChunk, + const TAknsSrvExclusionQuery& aExclQuery, + const TBool aAhOverride, + const TAknsPkgID& aPID ); + + /** + * Set the idle state wallpaper. + * + * @since 2.0 + * + * @param aIID the item id of the idle wallpaper. + * @param aFilename the filename of the wallpaper mbm-file(incl. path) + * @param aIndex of the bitmap in the mbm file + */ + void SetWallpaper( const TAknsItemID& aIID, + const TDesC& aFilename, TInt aIndex ); + + /** + * Blocks read acces to the shared memory chunk + * maintained by this class. + * + * @since 2.0 + */ + void BeginWrite(); + + /** + * Allows write acces to the shared memory chunk + * maintained by this class. + * + * @since 2.0 + */ + void EndWrite(); + + /** + * + */ + void ResetLevel(); + + /** + * + */ + void NextLevel(); + + /** + * Checks whether the given IID should be altered (i.e. is it in + * the skin package internal number space or in exclusion list), + * and modifies it accordingly. + * + * @since 2.0 + * + * @param aIID Item ID to be checked and modified, if necessary. + * + * @param aExclQuery Exclusion query object. + */ + void CheckAndModifyIID( TAknsItemID& aIID, + const TAknsSrvExclusionQuery& aExclQuery ); + + private: // New methods + + /** + * The actual merge function for normal (non ROM) skins. + * + * @since 2.0 + * + * @param aFilename the skin file name + * @param aClearChunk A boolean value to specify + * if to discard existing content in the shared + * chunk + * @param aExclQuery Exclusion query object. + * @param aAhOverride specifies if the data to be merged is + * A&H override. + * + * @par Exceptions: + * If merge operation fails, leaves with an error code. + */ + void MergeSkinDefinitionsUnprotectedL( const TDesC& aFilename, + const TBool aClearChunk, const TAknsSrvExclusionQuery& aExclQuery, + const TBool aAhOverride, + const TAknsPkgID& aPID ); + + /** + * The merge function for (non ROM) skins. + * Calls @c MergeSkinDefinitionsUnprotectedL to do the actual merge + * to avoid fatal errors. + * + * @since 2.0 + * + * @param aFile File buffer of the skin file to read from. + * @param aOffset The file offset to read from . + * @param aClass Which class should be merged. + * @param aExclQuery Exclusion query object. + * @param aAhOverride Specified if the skin file to be merged is an + * A&H variant. + * + * @par Exceptions: + * If merge fails, leaves with an error code. + */ + void DoMergeSkinDefinitionsL( CAknsSrvFileBuffer& file, + const TUint aOffset, const TAknsItemDefClass aClass, + const TAknsSrvExclusionQuery& aExclQuery, + const TBool aAhOverride ); + + private: // New methods - Type-specific merging + + /** + * Merge a single bitmap definition. + */ + void DoMergeBitmapDefinitionL( CAknsSrvFileBuffer& aFile, + const TUint aOffset, const TAknsItemDefClass aClass, + const TAknsSrvExclusionQuery& aExclQuery, + const TBool aAhOverride ); + + /** + * Merge a single color table definition. + */ + void DoMergeColorTableDefinitionL( CAknsSrvFileBuffer& aFile, + const TUint aOffset, const TAknsItemDefClass aClass, + const TAknsSrvExclusionQuery& aExclQuery, + const TBool aAhOverride ); + + /** + * Merge a single image table definition. + */ + void DoMergeImageTableDefinitionL( CAknsSrvFileBuffer& aFile, + const TUint aOffset, const TAknsItemDefClass aClass, + const TAknsSrvExclusionQuery& aExclQuery, + const TBool aAhOverride ); + + /** + * Merge a single bitmap animation definition. + */ + void DoMergeBmpAnimDefinitionL( CAknsSrvFileBuffer& aFile, + const TUint aOffset, const TAknsItemDefClass aClass, + const TAknsSrvExclusionQuery& aExclQuery, + const TBool aAhOverride ); + + /** + * Merge a single string definition. + */ + void DoMergeStringDefinitionL( CAknsSrvFileBuffer& aFile, + const TUint aOffset, const TAknsItemDefClass aClass, + const TAknsSrvExclusionQuery& aExclQuery, + const TBool aAhOverride ); + + private: // New methods - Chunk content utilities + + /** + * Retrieves the index of an item definition in the table. + * + * @since 2.0 + * + * @param aIID Item ID to be searched for. + * + * @return The index of the item definition, or -1 if not found. + */ + TInt FindDefIndex( const TAknsItemID& aIID ); + + /** + * Replaces or appends an item definition into the table located + * in the shared chunk. Also updates the data area. + * + * @since 2.0 + * + * @param aDef Pointer to the item definition to be updated. + * No ownership is claimed. + * + * @param aData Definition data. + * + * @param aDataSize The size of the definition data. + */ + void UpdateDef( const TAknsSrvDef* aDef, const TAny* aData, + const TInt aDataSize, const TInt aOldDataSize ); + + /** + * Replaces or appends data to the data area of the shared chunk. + * + * @since 2.0 + * + * @param aData Pointer to the new content. No ownership is claimed. + * If @c NULL is given, only space is allocated. + * + * @param aDataSize Size of the new content. + * + * @param aOldData Pointer to the old content, or @c NULL. + * + * @param aOldDataSize Size of the old content. + * + * @return Offset of the new data location in the shared chunk. + */ + TInt UpdateData( const TAny* aData, const TInt aDataSize, + TAny* aOldData = 0, const TInt aOldDataSize = 0 ); + + void UpdateDefHash ( TAknsSrvDef* aDef ); + + /** + * Initializes the shared chunk header and clears the allocated memory + * + * @since 2.8 + * + */ + void InitializeChunk(); + + /** + * Aligns the given value by 4 + * + * @since 2.8 + * + * @param aValue the value to align + * + * @return the aligned value + */ + TInt AlignToFour(const TInt aValue); + + public: // New methods - Scalable version + + /** + * + * @since 2.8 + */ + void StoreScalableGraphicsL( const TAknsItemID& aIID, + const TInt aType, const TSize& aLayoutSize, + TInt aBmpHandle, TInt aMskHandle, TBool aIsMorphing = EFalse); + + /** + * + * @since 2.8 + */ + void ClearScalableGraphics(TAknsSrcScreenMode aMode); + + /** + * + * @since 3.0 + */ + void ClearMorphedGraphics(); + void RemoveSingleScalableItem(const TAknsItemID& aIID ); + /** + * + * @since 3.0 + */ + void CreateMorphingTimerL(MAknsSrvMorphingListener* aListener); + void UpdateMorphingTime(); + private: // New methods - Scalable version + + /** + * + * @since 2.8 + */ + void DoMergeEffectQueueL( CAknsSrvFileBuffer& aFile, + const TUint aOffset, const TAknsItemDefClass aClass, + const TAknsSrvExclusionQuery& aExclQuery, + const TBool aAhOverride); + + /** + * @return The total size of parameters, in bytes. + * + * @since 3.0 + */ + TUint32 DoMergeParamsL( CAknsSrvFileBuffer& aFile, + const TUint aOffset, + TUint32& aEqBase, + RPointerArray& aParamArray, + const TUint16 aParamCount ); + /** + * @return The total size of param groups, in bytes. + * + * @since 3.0 + */ + TUint32 DoMergeParamGroupsL( CAknsSrvFileBuffer& aFile, + const TUint aOffset, + TUint32& aBase, + RPointerArray& aGroupArray, + const TUint16 aGroupCount ); + /** + * @return The total size of effect commands, in bytes. + * + * @since 3.0 + */ + TUint32 DoMergeEffectCommandsL( CAknsSrvFileBuffer& aFile, + const TUint aOffset, + TUint32& aEqBase, + RPointerArray& aEffectArray, + const TUint16 aEffectCount ); + /** + * @since 3.0 + */ + void DoMergeAnimationL( CAknsSrvFileBuffer& aFile, + const TUint aOffset, + const TAknsItemDefClass aClass, + const TAknsSrvExclusionQuery& aExclQuery, + const TBool aAhOverride ); + + /** + * + * @since 2.8 + */ + void UpdateFilename(TInt32 aFilenameID, TUint8* aFilenamePtr, + TUint16 aFilenameLen, const TDesC& aBaseFilename ); + + /** + * + * @since 2.8 + */ + TInt8* GetAreaBasePtr( TAknsSrvBaseAreaName aAreaname); + + /** + * + * @since 2.8 + */ + TInt GetAreaAllocatedSize( TAknsSrvBaseAreaName aAreaname ); + + /** + * + * @since 2.8 + */ + TInt GetAreaCurrentSize( TAknsSrvBaseAreaName aAreaname ); + + /** + * + * @since 2.8 + */ + void AdjustAreaAllocatedSize( + TAknsSrvBaseAreaName aAreaname, TInt aNewSize ); + + /** + * + * @since 2.8 + */ + void SetAreaCurrentSize( + TAknsSrvBaseAreaName aAreaname, TInt aNewSize ); + + /** + * + * @since 2.8 + */ + TInt GetFilenameOffsetByID( TInt32 aID ); + + /** + * + * @since 2.8 + */ + TInt ProcessChunksL(CAknsSrvFileBuffer& aFile, TUint32 aFileOffset, + TUint32 aChunkCount, const TDesC& aFilename, + const TAknsSrvExclusionQuery& aExclQuery, const TBool aMirrored); + + /** + * + * @since 2.8 + */ + TInt HandleFilenameChunkL(CAknsSrvFileBuffer& aFile, + TUint32 aFileOffset, const TDesC& aFilename); + + /** + * + * @since 2.8 + */ + TInt HandleClassChunkL(CAknsSrvFileBuffer& aFile, TUint32 aFileOffset, + const TAknsSrvExclusionQuery& aExclQuery); + + /** + * + * @since 2.8 + */ + TInt HandleLangOverrideChunkL(CAknsSrvFileBuffer& aFile, + TUint32 aFileOffset); + + /** + * + * @since 2.8 + */ + TInt HandleWallpaperChunkL(CAknsSrvFileBuffer& aFile, + TUint32 aFileOffset); + + /** + * Handles 2.6 release restriction chunk. + * + * @since 2.8 + */ + TInt Handle26RelRestrictionChunkL(CAknsSrvFileBuffer& aFile, + TUint32 aFileOffset, const TDesC& aFilename, + const TAknsSrvExclusionQuery& aExclQuery, const TBool aMirrored); + + /** + * Handles generic release restriction chunk. + * + * @since 2.8 + */ + TInt HandleGenericRelRestrictionChunkL(CAknsSrvFileBuffer& aFile, + TUint32 aFileOffset, const TDesC& aFilename, + const TAknsSrvExclusionQuery& aExclQuery, const TBool aMirrored); + + /** + * + * @since 2.8 + */ + TInt HandleLangRestrictionChunkL(CAknsSrvFileBuffer& aFile, + TUint32 aFileOffset, const TDesC& aFilename, + const TAknsSrvExclusionQuery& aExclQuery, const TBool aMirrored); + + /** + * + * @since 3.1 + */ + TInt HandleInformationChunkL(CAknsSrvFileBuffer& aFile, + TUint32 aFileOffset, const TDesC& aFilename); + + + /** + * + * @since 2.8 + */ + void EnqueuePostOperationL( const TAknsSrvCMPostOpType aType, + const TAknsItemID aIID ); + + /** + * Executes post operations. + * + * @since 2.8 + */ + void ExecutePostOperations(); + + /** + * Utility function for post operation execution. + * Changes tiling attribute from generic to X/Y specific. + * + * @since 2.8 + */ + void PostOpTile( TAknsSrvCMPostOp& op, TAknsSrvDef* itemDef ); + + /** + * Reads an attribute chunk. + * + * @since 2.8 + */ + void ReadAttributeChunkL( CAknsSrvFileBuffer& aFile, + const TUint aOffset, TInt& aAttributes, TInt& aAlignment, + TInt& aCoordX, TInt& aCoordY, TInt& aSizeW, TInt& aSizeH ); + + private: // Data + + RChunk iSharedChunk; + RSemaphore iWaitSema; + TInt iInternalSemaCount; + TInt iMergingLevel; + + private: // Data - Scalable version + RMutex iRenderMutex; + TInt iCurrentFilenameID; + TInt iFilenameCount; + TInt iMorphingMinInterval; + CAknsSrvMorphingTimer* iMorphingTimer; + CAknsSrvBitmapStore* iBitmapStore; + RArray iPostOpArray; + HBufC16* iBitmapPath; + TUint iPlatformMajor; + TUint iPlatformMinor; + TBool iMergeS60Skin; + }; + +#endif // AKNSSRVCHUNKMAINTAINER_H + +// End of file.