/*
* Copyright (c) 2002-2007 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:  Defines an internal concrete class CAknsAppSkinInstance and
*                related types. This class encapsulates the concrete skin
*                instance which is a singleton in thread scope.
*
*/


#ifndef AKNSAPPSKININSTANCE_H
#define AKNSAPPSKININSTANCE_H

//  INCLUDES
#include <coemain.h>

#include <AknsSkinInstance.h>
#include <AknsSrvClient.h>

// FORWARD DECLARATIONS
class CAknsAppSkinInstanceCacheEntry;
class CAknsTemporaryBitmap;
class MAknsRlRenderer;
class CAknsRlDefaultRenderer;
class CAknsRlMasterLayout;
class RApaLsSession;

// DATA TYPES

/**
* Simple pointer array data type for item definitions.
*
* @internal
*/
typedef RPointerArray<CAknsItemDef> RAknsItemDefPointerArray;

/**
* Control position list entry.
*
* @internal
*/
struct TAknsControlPositionEntry
    {
    TUint iKey;
    TPoint iScreenPos;
    };

/**
* Pointer store list entry.
*
* @internal
*/
struct TAknsPointerStoreEntry
    {
    TUint iKey;
    TAny* iValue;
    };

/**
* Simple pointer array data type for cache entries.
*
* @internal
*/
typedef RPointerArray<CAknsAppSkinInstanceCacheEntry>
    RAknsAppSkinInstanceCacheEntryPointerArray;

/**
* Simple pointer array data type for temporary bitmap entries.
*
* @since 2.6
*
* @internal
*/
typedef RPointerArray<CAknsTemporaryBitmap>
    RAknsAppSkinInstanceTemporaryBitmapArray;

// CLASS DECLARATION

/**
* Concrete application skin instance.
* Application skin instance is a thread-singleton class that implements
* MAknsSkinInstance (and also MAknsDataContext to provide root data
* context).
*
* This is an internal class that contains no exported functions.
* The class is not intended for derivation outside the library.
*
* @since 2.0
*
* @internal
*/
NONSHARABLE_CLASS(CAknsAppSkinInstance) :
    public CCoeStatic, public MAknsSkinInstance, public MAknsDataContext,
    public MAknsSkinChangeObserver
    {
    protected: // Protected constructor

        /**
        * C++ default constructor.
        *
        * @internal
        */
        CAknsAppSkinInstance();

    public: // Constructors and destructors

        /**
        * Creates application skin instance singleton.
        *
        * @par Exceptions:
        *   If construction fails, leaves with an error code.
        *
        * @internal
        */
        static void CreateSingletonL();

        /**
        * Destructor.
        *
        * @internal
        */
        virtual ~CAknsAppSkinInstance();

    public: // Functions from MAknsSkinInstance - Item data

        /**
        * @copydoc MAknsSkinInstance::RootDataContext()
        */
        MAknsDataContext* RootDataContext();

        /**
        * @copydoc MAknsSkinInstance::GetCachedItemData(TAknsItemID,TAknsItemType)
        */
        CAknsItemData* GetCachedItemData( const TAknsItemID& aID,
            const TAknsItemType aType );

        /**
        * @copydoc MAknsSkinInstance::GetCachedItemData(TAknsItemID)
        */
        CAknsItemData* GetCachedItemData( const TAknsItemID& aID );

        /**
        * @copydoc MAknsSkinInstance::CreateUncachedItemDataL(TAknsItemID,TAknsItemType)
        */
        CAknsItemData* CreateUncachedItemDataL( const TAknsItemID& aID,
            const TAknsItemType aType );

        /**
        * @copydoc MAknsSkinInstance::CreateUncachedItemDataL(TAknsItemID)
        */
        CAknsItemData* CreateUncachedItemDataL( const TAknsItemID& aID );

    public: // Functions from MAknsSkinInstance - Item definitions

        /**
        * @copydoc MAknsSkinInstance::SetLocalItemDefL()
        */
        void SetLocalItemDefL( CAknsItemDef* aDef );

        /**
        * @copydoc MAknsSkinInstance::SetChangeEventsEnabled()
        */
        void SetChangeEventsEnabled( TBool aEnabled );

    public: // Functions from MAknsSkinInstance - Error handling

        /**
        * @copydoc MAknsSkinInstance::NotifyClientError();
        */
        void NotifyClientError( const TAknsClientError aError );

    public: // Functions fro MAknsSkinInstance - Querying the change reason
        /**
        * @copydoc MAknsSkinInstance::SkinChangeReason()
        */
        TAknsSkinChangeReason SkinChangeReason();

    public: // Functions fro MAknsSkinInstance - removing local item defs
        /**
        * @copydoc MAknsSkinInstance::RemoveLocalItemDefs()
        */
        void RemoveLocalItemDefs();

    public: // Functions from MAknsDataContext

        /**
        * @copydoc MAknsDataContext::ReserveItemL()
        */
        void ReserveItemL( const TAknsItemID& aID );

        /**
        * @copydoc MAknsDataContext::ReleaseItem()
        */
        void ReleaseItem( const TAknsItemID& aID );

    public: // Functions from MAknsSkinChangeObserver

        void FlushLocalCaches();
        /**
        * @copydoc MAknsSkinChangeObserver::SkinContentChanged()
        */
        void SkinContentChanged();

        /**
        * @copydoc MAknsSkinChangeObserver::SkinConfigurationChanged()
        */
        void SkinConfigurationChanged(
            const TAknsSkinStatusConfigurationChangeReason aReason );

        /**
        * @copydoc MAknsSkinChangeObserver::SkinPackageChanged()
        */
        void SkinPackageChanged(
            const TAknsSkinStatusPackageChangeReason aReason );

    public: // New functions - Testing

        /**
        * Returns the current count of local item definition list.
        */
        IMPORT_C TInt DebugLocalItemDefCount();

        /**
        * Returns the current count of item data cache.
        */
        IMPORT_C TInt DebugCacheCount();

        /**
        * Disables server error notification and registers observer.
        */
        IMPORT_C void DebugHookClientErrors( void (*aCallback)(TAny*), TAny* aParam );

        /**
        * Disables change notification and registers observer.
        */
        IMPORT_C void DebugHookChangeNotifications( void (*aCallback)(TAny*), TAny* aParam );

        /**
        * Resets the internal state.
        */
        IMPORT_C void DebugReset();

    protected:  // New functions

        /**
        * Updates cached item.
        * This method should be called when an item definition changes.
        * If item data (for the specified IID) is in the ASI cache,
        * it is reconstructed. Type of the new item definition must
        * match the existing cached item, if one exists.
        *
        * @param aCacheEntry Cache entry to be updated.
        *
        * @param aRemoveIfNotFound Boolean flag to indicate whether
        *   the cache item should be removed if no new definition is found.
        *
        * @par Exceptions:
        *   If item data creation fails, leaves with an error code.
        *   Cached item (if any) is automatically destroyed.
        *
        * @internal
        */
        void UpdateCachedItemL( CAknsAppSkinInstanceCacheEntry* aCacheEntry,
            const TBool aRemoveIfNotFound );

        /**
        * Notifies the application that an item definition has changed.
        * Sends skin resource change event to the window group of the
        * current application. Also redraws the screen (if there are items
        * in cache) to enable controls
        * that use cached items to update their appearance.
        *
        * @internal
        */
        void NotifyItemDefChange(TBool aFgOnly = EFalse);

        /**
        * Redraws the screen.
        *
        * @internal
        */
        void RedrawScreen() const;

        /**
        * Finds item definition for specified item, creates item data for
        * it and inserts it into the cache.
        *
        * @param aID Item ID to be cached.
        * @param aType Type of the item. EAknsITUnknown if any type is
        *   acceptable.
        *
        * @return Pointer to cache entry. Application skin instance still
        *   owns the cache entry object and controls its lifetime.
        *   @c NULL value is returned if no item definition is found.
        *
        * @par Exceptions:
        *   If creation fails, leaves with an error code.
        *
        * @internal
        */
        CAknsAppSkinInstanceCacheEntry* LookupCreateAndCacheL(
            const TAknsItemID& aID, const TAknsItemType aType );

        /**
        * Finds item definition for specified item and creates an independent
        * item data for it.
        *
        * @param aID Item ID matching the item data to be created.
        * @param aType Type of the item. EAknsITUnknown if any type is
        *   acceptable.
        *
        * @return Newly created item data instance for the specified item.
        *   Ownership of the item data is transferred to the caller.
        *   @c NULL value is returned if no item definition is found.
        *
        * @par Exceptions:
        *   If creation fails, leaves with an error code.
        *
        * @internal
        */
        CAknsItemData* LookupAndCreateL( const TAknsItemID& aID,
            const TAknsItemType aType );

        /**
        * Finds specified item from cache.
        *
        * @param aID Item ID to be found.
        *
        * @return Pointer to cache entry or @c NULL if none found.
        *   Application skin instance still owns the cache entry and controls
        *   its lifetime.
        *
        * @internal
        */
        CAknsAppSkinInstanceCacheEntry* FindFromCache( const TAknsItemID& aID );

        /**
        * Removes specified item from cache and destroys it.
        *
        * @param aID Item ID to be removed and destroyed.
        *
        * @internal
        */
        void RemoveAndDestroyFromCache( const TAknsItemID& aID );

        /**
        * Handles the client error condition.
        *
        * @param aError Type of the error.
        *
        * @internal
        */
        void HandleClientError( const TAknsClientError aError );

        /**
        * Finds the specified item definition, but does not construct the
        * item data object.
        *
        * @since 2.1
        *
        * @param aOwnershipTransfer Output parameter that is assigned to
        *   ETrue if the caller should destroy the returned definition
        *   object.
        *
        * @param aID Item ID of the item definition to be retrieved.
        *
        * @param aType Type (or base type) of the item definition to be
        *   retrieved.
        *
        * @return Pointer to the item definition object or @c NULL if
        *   not found. The caller must observe aOwnershipTransfer
        *   value to determine whether the object should be destroyed.
        *
        * @internal
        */
        CAknsItemDef* LookupDef( TBool& aOwnershipTransfer,
            const TAknsItemID& aID, const TAknsItemType aType );

        /**
        *
        * @since 2.8
        *
        * @internal
        */
        void UpdateLocalLayoutBitmapToServerL( const TAknsItemID& aID,
            const TInt aLayout, const TSize& aLayoutSize, CFbsBitmap* aBitmap,
            CFbsBitmap* aMask, const TBool aMorphing );

        /**
        *
        * @since 2.8
        *
        * @internal
        */
        void UpdateLocalLayoutBitmapFromServerL( const TAknsItemID& aID,
            const TInt aLayout, const TSize& aLayoutSize );

    public: // New methods

        /**
        * Retrieves (and creates if necessary) a temporary bitmap
        * for the given item ID and given size.
        *
        * @since 2.6
        *
        * @internal
        */
        CAknsTemporaryBitmap* GetTemporaryBitmapL(
            const TAknsItemID& aID, const TSize& aSize );

        /**
        * Retrieves a non-owned pointer to the renderer.
        *
        * @since 2.8
        *
        * @internal
        */
        MAknsRlRenderer* DefaultRenderer();

        /**
        * Retrieves a non-owned pointer to the master layout.
        *
        * @since 2.8
        *
        * @internal
        */
        CAknsRlMasterLayout* MasterLayout();

        /**
        * Adds a layout bitmap, ownership transferred.
        *
        * @since 2.8
        *
        * @internal
        */
        void AddLayoutBitmapL(
            const TAknsItemID& aID, CAknsMaskedBitmapItemData* aData,
            const TInt aLayout, const TSize& aLayoutSize,
            const TBool aMorphing, const TBool aLocalItem );

        /**
        * Retrieves a layout bitmap, ownership not transferred.
        *
        * @since 2.8
        *
        * @internal
        */
        CAknsImageItemData* GetLayoutBitmap( const TAknsItemID& aID,
            const TSize& aLayoutSize, const TInt aLayout, TBool& aMorphingOut, const TBool& aLocalItem );

        /**
        * Begins rendering. EndRender must be called to free the mutex
        * after rendering completes.
        *
        * @since 2.8
        *
        * @internal
        */
        void BeginRender();

        /**
        * Ends rendering. BeginRender must have been called, otherwise
        * the mutex state will be corrupted.
        *
        * @since 2.8
        *
        * @internal
        */
        void EndRender();

        /**
        * From base class MAknsSkinChangeObserver.
        * @copydoc MAknsSkinChangeObserver::IsUpdateInProgress()
        */
        TBool IsUpdateInProgress();

        /**
        * The product variant status of highlight animation.
        *
        * @return ETrue if product supports highlight animations, EFalse if
        *         highlight animations should not be used.
        * @since 3.1
        * @internal
        */
        TBool VariantHighlightAnimationEnabled();

        /**
        * Checks if the given AppUid icon has been configured with AppArc cenrep configuration file.
        * @param aAppUid application UID to check
        * @return ETrue if the icon is configured with the cenrep file, otherwise EFalse.
        */
        TBool IsIconConfiguredL( TUid aAppUid );

        /**
        * Get Current Animation Backgournd State.
        * @return ETrue if the Animation Backgournd is ON, otherwise EFalse.
        */       
        TBool AnimBackgroundState( ) const;
        
        /**
        * Get if wallpaper defined.
        * @return if wallpaper defined.
        */       
        TBool WallpaperDefined( ) const;
        
        /**
         * Sets the flag indicating whether animation background should be used
         * in the scope of the current AppUi.
         * 
         * @param Value of the flag as TBool.
         */
        void SetAnimationBackgroundDisabledL( TBool aDisabled );
        
        /**
         * Queries whether animation background should be used for newly created
         * current AppUi.
         *
         * @return ETrue if animation background is disabled, EFalse
         *         otherwise. The default value is EFalse.
         */        
        TBool AnimationBackgroundDisabled() const;

    private: // Private ConstructL

        /**
        * By default Symbian OS constructor is private.
        */
        void ConstructL();
        
		/**
        * Read Animation Backgournd State
        */
        void InitAnimBackgroundL( );

        /**
        * Read Psln Cenrep
        */
        void InitPslnCenrepL( TBool aOnlyWP = EFalse );

    protected: // Data

        /**
        * Local item definition array.
        */
        RAknsItemDefPointerArray iLocalItemDefArray;

        /**
        * Cache entry array.
        */
        RAknsAppSkinInstanceCacheEntryPointerArray iCache;

        /**
        * Flag indicating whether change events are enabled.
        */
        TBool iChangeEventsEnabled;

        /**
        * Flag indicating whether there is a pending change event.
        */
        TBool iChangeEventPending;

        /**
        * Skin server session.
        */
        RAknsSrvSession iSession;

        /**
        * Internal control position list used by AknsUtils.
        */
        RArray<TAknsControlPositionEntry> iControlPositionList;

        /**
        * Internal pointer store used by AknsUtils.
        */
        RArray<TAknsPointerStoreEntry> iPointerStoreList;

        /**
        * Chunk lookup instance.
        */
        CAknsSrvChunkLookup* iChunkLookup;

        /**
        * Temporary bitmap array.
        */
        RAknsAppSkinInstanceTemporaryBitmapArray iTmpBmpArray;

        /**
        * Default renderer instance.
        */
        CAknsRlDefaultRenderer* iRenderer;

        /**
        * Master layout instance.
        */
        CAknsRlMasterLayout* iMasterLayout;

        /**
        * Layout bitmap array.
        */
        RAknsAppSkinInstanceTemporaryBitmapArray iLayoutBmpArray;

        /**
        * Update status
        */
        TBool iUpdateInProgress;

        /**
        * Product variant enable/disable status for highlight animations.
        */
        TBool iVariantHlAnimStatus;

        /**
        * Cached AppArc server session
        */
        RApaLsSession* iCachedApaSession;

        /**
        * The last skin change reason
        */
        TAknsSkinChangeReason iLastChangeReason;

        /**
        * Are the application icons configured with cenrep?
        *
        */
        TBool iAppConfigurationCenrepNotUsed;
        
        /**
        * Animation Background State
        */
        TBool iAnimBgState;
        
        /**
        * Wallpaper Type
        */
        TBool iWallpaperDefined;
        
        /**
         * Flag indicating whether default skin parameters should be used
         * for newly created Avkon controls.
         */
        TBool iAnimationBackgroundDisabled;
        
        /**
        * Application UID
        */
        TUid iAppUid;

    private: // Data

        /**
        * Debug hook for client errors
        */
        void (*iDebugErrorCallback)(TAny*);
        TAny* iDebugErrorCallbackParam;

        /**
        * Debug hook for change notifications
        */
        void (*iDebugChangeCallback)(TAny*);
        TAny* iDebugChangeCallbackParam;

    public: // Friend classes

        friend class AknsUtils;
        friend class AknsPointerStore;
        friend class AknsItemDataFactory;
        friend class AknsScalabilityUtils;
        friend class CAknsAlAnimatorBmp; // To access iSession
    };

#endif // AKNSAPPSKININSTANCE_H

// End of File
