homescreenpluginsrv/hspsmanager/inc/hspsthemeserver.h
author MattD <mattd@symbian.org>
Thu, 01 Apr 2010 14:50:19 +0100
changeset 48 0d4ac38889fc
parent 0 79c6a41cd166
child 9 d0529222e3f0
permissions -rw-r--r--
Merged in kashif's, fdim's and my removal of abld.bat and .cproject files onto the fixed up version of Christian's head.

/*
* Copyright (c) 1020 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:  HSPS server
* 
*  Architecture
*  ************
*  ChspsThemeServer derives CPolicyServer when compiled on EKA2 based Symbian OS.
*  ChspsThemeServer depends on the following classes:
*  - ChspsInstallationHandler which implements MhspsInstallationHandler,
*  - ChspsMaintenanceHandler which implements MhspsMaintenanceHandler,
*  - ChspsClientRequestHandler which implements MhspsClientRequestHandler,
*  - ChspsDefinitionRepository and ChspsODT from Xuikon, 
*  - ChspsFileChangeListener,
*  - ChspsAutoInstaller, and
*  - CRepository from Symbian.
*
*  Functionality
*  *************
*  When client connects to hspsThemeServer, the access rights are checked. 
*  If access is granted, a server session is created. Once connected, client may
*  perform service requests as long as it is connected. Service requests are 
*  served by initiating appropriate service handlers. These service handlers are
*  Symbian active objects, based on CActive-class. In using active ojects, it is
*  possible to perform long-lasting service requests without blocking others 
*  clients getting served on-time. Active objects are also used to assist 
*  services to perform asynchronous operations internally, for e.g. when service
*  is executing slow media conversions. Furthermore, some of these services are
*  extended to implement timer-functionality, based on CTimer-class. 
*  These active timers are used to control different time-based server 
*  operations and initiate service-state refreshing functionality.
*  hspsThemeServer contains auto-install feature that can install Application
*  Theme on SISX-packet exctraction.
*    
*  
*  Installation Handler
*  ====================
*  ChspsInstallatioHandler-active object performs all installation related
*  functionality. Installation concerns reading installation instructions from 
*  manifest-file, utilizind Xuikon Definition Engine to parse xml- and 
*  css-files, and apply style and localisation information defined in dtd-files
*  into the DOM-document created. Installer also handles resources that theme 
*  may include. Some resource types may need conversions to fit on the target
*  device's screen or audio device etc. In this case, the installer performs 
*  media conversions by its Media Converter. Conversions are asynchronous and
*  they deploy MIME-types. For more information of media conversions, see 
*  ChspsMediaConverter documentation. When installation is successful, 
*  Installation Handler utilizes Xuikon Definition Repository to store the 
*  results. The resulted objects are for e.g. unlocalised and localised 
*  versions of application theme. Theme associated resources are also handled 
*  in unlocalised and localised versions. Resources are stored on repository 
*  and their related information is stored on the list of ChspsResource-objects
*  - a resource list. This list of ChspsResource-objects is called Resource List.
*  Definition Repository is located in hspsThemeServer private  folder. 
*  Repository is organisized by theme header information. 
*  For more information, see hspsResource documentation.
*  On theme updates, i.e. installation over previous one, Installation Handler
*  deploys ChspsSecurityEnforcer to control theme update rights.
*  For more information, see ChspsSecurityEnforcer documentation and 
*  ChspsInstallatioHandler documentation. 
*  
*  Maintenance Handler
*  ===================
*  ChspsMaintenanceHandler-active timer performs all theme maintenance related 
*  functionality. Maintenance services includes theme listing, theme activation,
*  theme removal and default theme restoring operations. Maintenance functions 
*  deploy Xuikon Definition Repository and Symbian Central Repository. 
*  Definition Repository maintains Application Themes in save place and Central
*  Repository maintains the information about which theme is active for what 
*  application. Information in Central Repository is presented in pairs of 
*  application UID and active theme UID.
*  For more information, see ChspsMaintenanceHandler documentation. 
*
*  Client Request Handler
*  ======================
*  ChspsClientRequestHandler-active timer performs all request accesses from 
*  Rendering Engine. When request exists, the just right one application theme 
*  is delivered to client process using memory chunk passing. Resource List is
*  delivered too. Client Request Handler uses Xuikon Definition Repository and 
*  Symbian Central Repository to get match theme on the request. Client Request
*  Handler serves also resource accesses. In using file handle passing 
*  introduced by Symbian Platform Security concept, Client Request Service 
*  arranges a resource access to hspsThemeServer's private folder for the client 
*  process. RFile handle passing is used. 
*  For more information, see ChspsClientRequestHandler documentation.
*
*  File Change Listener
*  ==================
*  ChspsFileChangeListener listens to given file folder and notifies its observer
*  if there is any file change. Observer is given as a parameter on 
*  initialising the listener. Observer must implement MhspsFileChangeObserver-interface.
*  FileChangeListener is asynchronous object that deploys Symbian RFs client-sideAutoInstaller
*  handle on File Manager. FileChangeListener is intended to be used by any object
*  that wants listen Symbian file system events.
*
*  Auto Installer
*  ==============
*  ChspsAutoInstaller installs theme from given location. It is intended
*  to be used by hspsThemeServer directly. AutoInstaller is initiated
*  when FileChangeListener finds installable theme source on given
*  location. Theme source is set during the SISX-package exctraction. 
*  AutoInstaller is deployed by calling its function InstallThemeL with manifest-file 
*  of the installable theme source set.
*  AutoInstaller deploys ChspsInstallationHandler. ChspsInstallationHandler
*  is asynchronous object, there for AutoInstaller is asynchronous object
*  as well capable to deploy asynchronous installation.
*  When installation ends, AutoInstaller calls its observer with 
*  ThspsServiceCompletedMessage-type parameter. Observer is given on
*  initialising of AutoInstaller and it must be ChspsThemeServer-type.
*  AutoInstaller have functions to get ODT-header of successfully installed
*  theme and ChspsResult-typed object expressing errors in unsuccessful cases.   
*
*  Security Enforcer
*  =================
*  ChspsSecurityEnforcer performs all security related functions in Xuikon
*  Application Theme Management services.
*  These functions are the following:
*  - locking policy functionality,
*  - style locking policy functionality,
*  - control user access on service request, and
*  - validate content of user queries.
*
*  Performance accelerators
*  ************************
*
*  HeaderListCache
*  ---------------
*  To speed up serving the theme request operations initiated by Rendering 
*  Engine in theme usage cases, hspsThemeServer maintains cache of the header
*  information of the themes stored in Definition Repository. When installation
*  occurs, cache is updated. First time the cache is updated when hspsThemeServer
*  starts - server is started by system starter service. This quaranties
*  that cache is up to date and hit will occur on the very first access. 
*  Cache is updated also by MaintenanceHandler and ClientRequestHandler on 
*  the cases where content of repository is affected.
* 
*  Pre-initialized objects
*  -----------------------
*  hspsThemeServer speeds up the performance also by pre-initialized objects 
*  which it passes to ChspsClientRequestHandler when one is initiated on new 
*  Client Request Service server session. These objects are the following:
*  - ChspsDefinitionRepository
*  - CRepository for the KhspsThemeStatusRepositoryUid  {0x10207342} 
*
*
*/


#ifndef __hspsTHEMESERVER_H__
#define __hspsTHEMESERVER_H__

#include <e32base.h>
#include <abclient.h>

#include "hspsfilechangelistener.h"
#include "hspscenreplistener.h"
#if defined(WINSCW) || defined(__WINS__)
#include "hspsfamilylistener.h"
#endif // defined(WINSCW)
#include "hspsthememanagement.h"
#include "hspsodt.h"
#include "hspsdefinitionrepository.h"
#include "hspsbrobserver.h"
#include "hspsbrhandler.h"

#include "hsps_builds_cfg.hrh"

/** hspsThemeServer name: */
_LIT(KhspsThemeServerName,"hspsthemeserver");

/** Supported manifest version */
_LIT(KhspsSupportedManifestVersion,"1.0");

/** hspsThemeServer Uid3 = SECUREID. */
const TUid KhspsThemeServerUid3 = {0x200159C0}; //old uid 0x10207254};

/** 
*   KhspsThemeServerMajorVersionNumber, KhspsThemeServerMinorVersionNumber, 
*   and KhspsThemeServerBuildVersionNumber.
*   These constants define a version to be given for creating a session 
*   with the hspsThemeServer.
*/
const TUint KhspsThemeServerMajorVersionNumber=1;
const TUint KhspsThemeServerMinorVersionNumber=0;
const TUint KhspsThemeServerBuildVersionNumber=0;

/*
*  KDefaultMessageSlots. Number of hspsThemeServer message slots.
*  Server slots allocation rules: 1 for synchronous request, 1 for each
*  concurrent outstanding asynchronous requests and 1 for each cancellation
*  => 3 in this case.
*/
const TInt KDefaultMessageSlots = 3;

// Forward declarations.
class ChspsDefinitionRepository;
class ChspsDefinitionEngineInterface;
class CRepository;
class ChspsSecurityEnforcer;
class ChspsRomInstaller;
class ChspsAutoInstaller;

#ifdef HSPS_LOG_ACTIVE
class ChspsLogBus;
#endif

// Keys for the Central Repository
const TInt KCenrepKeyLang                = 100000001;      // Device language from previous startup
const TInt KCenrepKeyPostRFS             = 100000002;      // Holds information whether the post RFS initializations have been done 
const TInt KCenrepKeyCheckConf           = 100000003;      // Holds information whether the configuration states must be checked 
const TInt KCenrepKeyAccessControlList   = 100000004;      // Holds information about security access control list

const TInt KCenRepBufferSize = 255;   // Control Access List length

/*
* Server's policy.
*/

/* Total number of ranges */
const TUint hspsThemeRangeCount = 4;

/* Definition of the ranges of IPC numbers */
const TInt hspsThemeRanges[hspsThemeRangeCount] = 
        {
        EhspsInstallationBase, 	/* installation messages (0,1,2 ) */
        EhspsMaintenanceBase, 	/* maintenance messages (3,4,5,6,7,8) */
        EhspsClientRequestBase, /* client request messages (9,10,11,12,13) */
        EhspsNotSupported, 		/* and up; non implemented function end of range check ; ENotSupported */ 
        }; 

/* Policy to implement for each of the above ranges */       
const TUint8 hspsThemeElementsIndex[hspsThemeRangeCount] = 
        {
        CPolicyServer::ECustomCheck, //applies to 0th range
        CPolicyServer::ECustomCheck, //applies to 1st range
        CPolicyServer::ECustomCheck, //applies to 2nd range
        CPolicyServer::ENotSupported //applies to 3rd range (out of range IPC)
        };

/* Specific capability checks */
const CPolicyServer::TPolicyElement hspsThemeElements[] = 
        {
        {_INIT_SECURITY_POLICY_C1(ECapabilityReadUserData), CPolicyServer::EFailClient},  
        //policy "0"; fail call if ReadUserData not present
        {_INIT_SECURITY_POLICY_C1(ECapabilityTCB), CPolicyServer::EFailClient} 
        //policy "1"; fail call if TCB not present
        };

/* Package all the above together into a policy */
const CPolicyServer::TPolicy hspsThemePolicy =
        {
        CPolicyServer::EAlwaysPass, /* specifies all connect attempts should pass */
        hspsThemeRangeCount,  /* number of ranges */                                  
        hspsThemeRanges,  /* ranges array */
        hspsThemeElementsIndex, /* elements<->ranges index */
        hspsThemeElements,    /* array of elements */
        };

// File filters related to imports folder
_LIT( KFilterAllImportsV1, "*.dat");
_LIT( KFilterAllAppImportsV1, "app_*.dat");
_LIT( KFilterAllPluginImportsV1, "plugin_*.dat");
_LIT( KFilterAllImportsV2, "*.*");

#ifdef _hsps_SERVER_SHUTDOWN_ENABLED_
/** 
 * MShutdownObserver
 * Observer for automatic shutdown class.
 * 
 * @since S60 5.0  
 */
class MShutdownObserver
    {
public:
    /**
    * Notifies observer that shutdown is initiating.
    * 
    * @since S60 5.0
    */
    virtual void ShutdownInitiating() = 0;
    };

/** 
 * CShutdown.
 * Auto shutdown class (standard pattern)
 * 
 * @since S60 5.0  
 */
class CShutdown : public CTimer
    {    
public:
    /**
    * Create new shutdown timer.
    * 
    * @since S60 5.0 
    * @param aObserver Shutdown observer.
    */    
    static CShutdown* NewL( MShutdownObserver& aObserver );

    /**
    * Start shutdown timer.
    * 
    * @since S60 5.0
    */        
    void Start();
  
protected:
    /**
    * C++ constructor.
    *
    * @since S60 5.0  
    * @param aObserver Shutdown observer.
    */        
    CShutdown( MShutdownObserver& aObserver );    
    
    /**
    * Symbian 2nd phase constructor.
    * 
    * @since S60 5.0
    */        
    void ConstructL();

private:
    /**
    * From CActive.
    */        
    void RunL();
    
private:
    // Shutdown delay.
    enum { KhspsShutdownDelay = 2000000 };
    
    // Shutdown observer.
    MShutdownObserver& iObserver;
  };
#endif // _hsps_SERVER_SHUTDOWN_ENABLED_

// States of the auto installer
enum TAutoInstallerStates
    {
    EAutoInstallerStateIdle = 0,
    EAutoInstallerStateInstall = 1,
    EAutoInstallerUninstall = 2
    };

// Operations for header cache updates
enum ThspsCacheOperations 
    {
    EhspsCacheAddHeader,
    EhspsCacheRemoveHeader
    };

// Backup states
enum ThspsBRStates 
    {
    EhspsBRNormal = 0,
    EhspsBRBackup,
    EhspsBRRestore
    };


/**
 * @ingroup group_hspsserver
 * ChspsThemeServer. 
 * @since S60 5.0
 **/
class ChspsThemeServer : public CPolicyServer, 
                       public MhspsFileChangeObserver,
                       public MhspsDefinitionRepositoryObserver,
                       public MhspsCenRepObserver
#ifdef _hsps_SERVER_SHUTDOWN_ENABLED_
                       , public MShutdownObserver
#endif // _hsps_SERVER_SHUTDOWN_ENABLED_         
#if defined(WINSCW) || defined(__WINS__)                         
                       , public MhspsFamilyObserver
#endif // defined(WINSCW)

    {
public:
	
    /**
    * NewLC
    * @since S60 3.1
    */
    static CServer2* NewLC();
    
    /**
    * AddSession
    * @since S60 3.1
    */
    void AddSession();
    
    /**
    * DropSession
    * @since S60 3.1
    */
    void DropSession();
    
public: // public functions
	
    /**
    * UpdateHeaderListCacheL
    * Re-scans the file system under the Plug-in Repository. 
    * Execution is slow and should be used only when absolutely required. 
    * Updates headerlist cache
    * @since S60 5.0
    */
    void UpdateHeaderListCacheL();
    
    /**
     * Updates the header list cache based on the provided ODT information.
     * Should be preferred over the previous API.     
     * @since S60 5.0
     * @param aOperation is an enumeration of the cache operations
     * @param aRootUid is an UID of the application/interface
     * @param aProviderUid is an UID of the provider
     * @param aConfUid is an UID of the plug-in configuration
     */
    TInt UpdateHeaderListCache(    
        ThspsCacheOperations aOperation,
        const TInt aRootUid,
        const TInt aProviderUid,
        const TInt aConfigurationUid );
    
    /**
    * CleanupTemporaryFilesL
    * Cleans temporary files
    * @since S60 3.1
    */
    void CleanupTemporaryFilesL(TInt secureId = 0);
    
    /**
    * IncreaseRequestClientCount
    * Increases count of client requests
    * @since S60 5.0
    */
    void IncreaseRequestClientCount();
    
    /**
    * DecreaseRequestClientCount
    * Decreases count of client requests
    * @since S60 5.0
    */
    void DecreaseRequestClientCount();
        
    /**
    * HandleAutoInstallerEvent
    * Handles autoinstaller events
    * @since S60 3.1
    */
    void HandleAutoInstallerEvent( ThspsServiceCompletedMessage aMsg );
            
    /**
    * DefinitionRepository
    * @since S60 3.1
    */
    ChspsDefinitionRepository& DefinitionRepository();
    
    /**
    * SecurityEnforcer
    * @since S60 3.1
    */
    ChspsSecurityEnforcer& SecurityEnforcer();
    
    /**
    * CentralRepository
    * @since S60 3.1
    */
    CRepository& CentralRepository();
    
    /**
    * DeviceLanguage
    * Returns device language
    * @since S60 3.1
    */
    TLanguage DeviceLanguage();
        
    /**
    * HeaderListCache
    * Returns headerlist cache
    * @since S60 3.1
    */
    CArrayPtrSeg<ChspsODT>& HeaderListCache();
    
    /**
    * GetConfigurationL
    * Retrieves a configuration with the provided UIDs.
    * @since S60 5.0    
    * @param aInterfaceUid An uid of the interface or application (e.g. AI3, Java etc), optional.
    * @param aConfigurationUid An uid of the plugin configuration     
    * @param aRetrievedODT Retrieved configuration
    * @return KErrNone if operation succeeded
    */
    TInt GetConfigurationL(
		const TInt aInterfaceUid,
		const TInt aConfigurationUid,
		ChspsODT& aRetrievedODT );

    /**
    * GetConfigurationHeaderL
    * Retrieves a configuration header matching the search criteria
    * @since S60 5.0    
    * @param aSearchMask ODT header defining search criteria
    * @param aConfHeader Found ODT header
    * @param aPos Start/Found position
    */
    void GetConfigurationHeader(
        ChspsODT& aSearchMask,
        ChspsODT*& aConfHeader,
        TInt& aPos );
    
    /**
     * Localizes an ODT.
     * Testing: change first two digits from \epoc32\RELEASE\WINSCW\udeb\
     * Z\resource\BootData\Languages.txt file and reboot the emulator.     
     * @since S60 5.0
     * @param aEngine is a service for replacing DTD entities in XML.
     * @param aOdt is an ODT instance to be localized.     
     * @return ETrue if the ODT was successfully localized
     */
    TBool LocalizeL( 
		ChspsDefinitionEngineInterface& aEngine,
		ChspsODT& aOdt );
    
    /**
     * Parses name of a manifest from the provided import's name.                      
     * @since S60 5.0
     * @param aImportFile is a name of the import to be parsed
     * @param aPath is a path from which the import should be found
     * @return descriptor holding name of the manifest or NULL     
     */
    HBufC* GetManifestFromImportLC(
        const TDesC& aImportFile,
        const TDesC& aPath );

    /**
     * Check the installed configurations
     * @param aAppUid Application UID which configurations are checked
     * @since S60 5.0
     */
    void CheckConfigurationL(
        const TInt aAppUid );

    /**
     * Reinstalls defined configuration
     * @param aAppUid Application UID which configuration is reinstalled
     * @param aConfUid Configuration UID of reinstalled configuration
     * @since S60 5.0
     */
    void ReinstallConfL(
        TInt aAppUid,
        TInt aConfUid );

    /**
     * Handles received backup event
     * @since S60 5.0
     * @param aEvent Backup event
     */
    void HandleBREventL( TInt aEvent );

    /**
     * Prepares backup data for passive backup
     * @since S60 5.0
     */
    void CreateBackupDataL();


    /**
     * Check the installed plugin is used in some application configuration
     * @since S60 5.0
     * @param aPluginUid Plugin UID of installed configuration
     */
   TInt CheckInstalledPluginUsageL( const TInt aPluginUid );

    /**
     * Check if given plugin is in header cache.
     * 
     * @since S60 5.0
     * @param aPluginUid Plugin UID to search from header cache.
     */    
    TBool PluginInHeaderCache( const TUid aPluginUid );

   /**
    * Cleanup server resources. This method is called when server is been
    * shut down and active scheduler is still installed.
    * 
    * @since S60 5.0
    */
   void Cleanup();
   
   /**
    * Activates provided application configuration. 
    * @param aSetMask Identifies an application configuration which is to be activated.
    * @param aOdt Activated application configuration
    */
   TInt ActivateThemeL(
           const ChspsODT& aSetMask, 
           ChspsODT& aOdt );

   /**
    * Retrieves active application configuration from Central Repository.
    * @since S60 5.0
    * @param aAppUid Identifies the application
    * @param aOdt Contains currently active application configuration
    */
   TInt GetActivateAppConfigurationL(
           const TInt aAppUid, 
           ChspsODT& aOdt );
   
   /**
    * Gets family information from an active application configuration.
    * @since S60 5.0
    * @param aAppUid Identifies the application    
    * @returns The active family
    */
   TUint32 GetActiveFamilyL( 
           const TInt aAppUid );      
   
public: // from MhspsFileChangeObserver
	
    /**
    * HandleFileSystemChange
    * Handles change of filesystem
    * @since S60 3.1
    */
    void HandleFileSystemChange();
    
    /**
    * HandleRepositoryChange
    * Handles change of repository
    * @since S60 3.1
    */
    inline void HandleRepositoryChange() {};

#ifdef _hsps_SERVER_SHUTDOWN_ENABLED_
public: // From MShutdownObserver
    /**
    * From MShutdownObserver.
    */
    void ShutdownInitiating();    
#endif // _hsps_SERVER_SHUTDOWN_ENABLED_
    
    
public: // from MhspsDefinitioRepositoryObserver
	
    /**
    * HandleDefinitionRespositoryEvent
    * Handles change events received from definition repository
    * @since S60 3.1
    */
    TBool HandleDefinitionRespositoryEvent( ThspsRepositoryInfo aRepositoryInfo );
    
public: // from MhspsCenRepObserver
         
    void HandleCenRepChangeL( const TUint32 aId );    
     
#if defined(WINSCW) || defined(__WINS__)    
public: // from MshspFamilyObserver    
    TBool HandleFamilyChangeL( const ThspsFamily aNewFamily );
#endif // defined(WINSCW)
    
private:
	
    /**
    * ChspsThemeServer
    * @since S60 3.1
    */
    ChspsThemeServer();
    
    /**
    * ~ChspsThemeServer
    * @since S60 3.1
    */
    ~ChspsThemeServer();
    
    /**
    * ConstructL
    * @since S60 3.1
    */
    void ConstructL();
    
    /**
    * NewSessionL
    * @since S60 3.1
    */
    CSession2* NewSessionL(const TVersion& aVersion, const RMessage2& aMessage) const;
    
    /**
    * ComparePaths
    * @since S60 3.1
    */
    TBool ComparePaths(const ChspsODT& aOldHeader, const ChspsODT& aNewHeader);
    
    /**
    * GetHeaderListL
    * Gets current headerlist from filesystem
    * @param aHeaderList Destination for read headerlists from filesystem  
    * @param aSearchMask SearchMask to use when reading headerlists from filesystem  
    * @since S60 3.1
    */
    void GetHeaderListL(CArrayPtrSeg<ChspsODT>& aHeaderList, const ChspsODT& aSearchMask );
                   
    /**
    * CheckActiveThemesL
    * Check active themes from the central repository and if needed open path info file for them
    * @since S60 3.1
    */               
    void CheckActiveThemesL();
    
    //From CPolicyServer
    /**
    * CustomSecurityCheckL
    * @since S60 3.1
    */
    CPolicyServer::TCustomResult CustomSecurityCheckL(const RMessage2& aMsg, TInt& aAction,
                              TSecurityInfo& aMissing);
                              
    /**
    * HandleFileSystemChangeL
    * Does the actual filesystem change handling
    * @since S60 3.2
    */
    void HandleFileSystemChangeL(); 

    /**
    * RunAutoInstaller
    * Runs auto installer
    * @since S60 5.0
    */    
    TBool RunAutoInstaller( TAutoInstallerStates aState );

    /**
    * StopAutoInstaller
    * Stops auto installer and does house keeping after installation
    * @since S60 3.2
    */        
    void StopAutoInstaller();
   
   /**
    * HandleThemeUpgrade;
    * Handles the SIS theme upgrade
    */        
    void HandleThemeUpgradeL();
    
    /**
    * Checks whether the device language has been changed and updates 
	* configurations accordingly
	*/
    void HandleLanguageChangeL();
    
    /**
     * Localizes ODT files according to the device language.
     * @since S60 5.0
     */
    void LocalizeConfigurationsL();
    
    /**     
     * Localizes an application configuration with a device language. 
     * This function is used by the LocalizeL service.
     * @since S60 5.0
     * @param aEngine is a service for replacing DTD entities in XML.
     * @param aRequestedLanguage is the requsted language
     * @return ETrue if all the application and plugin configurations were localized
     */
    TBool LocalizeApplicationConfigurationL(
        ChspsDefinitionEngineInterface& aEngine,
        ChspsODT& aOdt,
        const TLanguage aRequestedLanguage );
    
    /**
     * Localizes a plugin configuration with a device language. 
     * This function is used by the LocalizeL service.
     * @since S60 5.0
     * @param aEngine is a service for replacing DTD entities in XML.
     * @param aRequestedLanguage is the requsted language
     * @param aPluginUid is > 0 when LocalizeApplicationConfigurationL() is used 
     * @return ETrue if the plugin configuration was localized
     */
    TBool LocalizePluginConfigurationL(
        ChspsDefinitionEngineInterface& aEngine,
        ChspsODT& aOdt,
        const TLanguage aRequestedLanguage,
        TInt aPluginUid );
                
    /**
     * Handles installation of ROM based manifest files when a Restore Factory Settings (RFS)
     * operation has been executed (controlled via the Central Repository).    
     * This function is executed at bootup when the server starts. 
     * @since S60 5.0 
     */
    void HandleRomInstallationsL();
    
    /**
     * Executes installation of manifest files from the ROM drive.
     * @since S60 5.0 
     */
    void InstallManifestsFromRomDriveL();
                                
    /**
     * V2 method for finding manifest files from Z\private\200159C0\install subfolders,
     * these folders should have a "hsps" subfolder.
     * Appends iManifestFiles array. 
     * @since S60 5.0     
     * @param aPluginFolders holds names of the plugin folders which are V2 based
     */
    void FindRomInstallationsV2L(        
        RPointerArray<HBufC>& aPluginFolders );
    
    /**
     * Initiates uninstallation of a manifest file located under the imports folder.
     * @since S60 5.0
     * @param aFilelist is a list of dat files under the imports folder or NULL 
     */
    void UninstallImport( 
		const CDir* aFilelist );
                
    /**
     * Installs new configuration based on the information in imports name.
     * @since S60 5.0
     * @param aFilelist is a list of dat files to be parsed under the imports folder
     */    
    void InstallImportsL( 
		const CDir& aFilelist );        
    
    /**
     * Handles installation/uninstallation of imported configurations.
     * A file filter controls which type of configurations are to be handled. 
     * @since S60 5.0
     * @param aFilePrefix is a prefix for finding either plugin or application configuration imports.
     */
    void HandleConfigurationImportsL(
		const TDesC& aFilePrefix );    
    
    /**
     * 
     * @since S60 5.0
     * @param aAppUid is an UID of the application
     */
    void UnlockSisxImportL( 
            const TUint32 aAppUid );
    
    /**
     * 
     * @since S60 5.0
     * @param aAppUid is an UID of the application
 	 * @param aConfUid is an UID of the active configuration
     */
    void LockSisxImportL( 
            const TUint32 aAppUid,
			const TInt aConfUid );

    /**
    * GetDeviceLanguage
    * @since S60 5.0
    */
    TLanguage GetDeviceLanguage();
    
    /**     
     * Retrieves a list of headers matching a iCacheMask search mask.
     * @since S60 5.0
     * @param aHeaderList is a list of headers found from the Plug-in Repository
     * @return KErrNone if operation was successfull
     */
    TInt DoUpdateHeaderListCache(
            CArrayPtrSeg<ChspsODT>& aHeaderList );       

    
    /**
     * Adds specific header to the cache.
     * An alternative to UpdateHeaderListCacheL API for updating the header 
     * cache with a minimum performance hit. 
     * @since S60 5.0
     * @param aRootUid is an UID of the application/interface
     * @param aProviderUid is an UID of the provider
     * @param aConfUid is an UID of the plug-in configuration
     */
    void HeaderCacheAddL(
            const TInt aRootUid,
            const TInt aProviderUid,
            const TInt aConfigurationUid );
    
    /**
     * Removes specific header from the cache.
     * An alternative to UpdateHeaderListCacheL API for updating the header 
     * cache with a minimum performance hit. 
     * @since S60 5.0
     * @param aRootUid is an UID of the application/interface
     * @param aProviderUid is an UID of the provider
     * @param aConfUid is an UID of the plug-in configuration
     */
    TInt HeaderCacheRemove( 
            const TInt aRootUid,
            const TInt aProviderUid,
            const TInt aConfigurationUid );   

    /**
     * Handles backup events in EhspsBRNormal backup state
     * @since S60 5.0
     * @param aEvent is a received backup event
     */
    void HandleBRNormalStateL(
        TInt aEvent );

    /**
     * Handles backup events in EhspsBRBackup backup state
     * @since S60 5.0
     * @param aEvent is a received backup event
     */
    void HandleBRBackupStateL(
        TInt aEvent );

    /**
     * Handles backup events in EhspsBRRestore backup state
     * @since S60 5.0
     * @param aEvent is a received backup event
     */
    void HandleBRRestoreStateL(
        TInt aEvent );

    /**
     * Creates active backup and restore handler
     * @since S60 5.0
     * @param aEvent is a received backup event
     */
    void CreateBRHandlerL(
        TInt aEvent );

    /**
     * Deletes active backup and restore handler
     * @since S60 5.0
     */
    void DeleteBRHandler();

    /**
     * Enables autoinstallations
     * @since S60 5.0
     */
    void EnableAutoInstallationL();

    /**
     * Disable autoinstallations
     * @since S60 5.0
     */
    void DisableAutoInstallation();

    /**
     * Installs restored configurations from backup/import folder
     * @since S60 5.0
     */
    void RestoreImportedConfigurationsL();

    /**
     * Restores application configurations from backup/themes folder
     * @since S60 5.0
     */
    void RestoreApplicationConfigurationsL();

    /**
     * Validates restored application configuration
     * @since S60 5.0
     * @param aOdt is reference to application configuration to be validated
     */
    void ValidateRestoredConfigurationL(
        ChspsODT& aOdt );

    /**
     * Restore configuration
     * @since S60 5.0
     * @param aOdt is reference to application configuration to be restored
     */
    void RestoreConfigurationL(
        ChspsODT& aOdt );
    
#if defined(WINSCW) || defined(__WINS__)    

    /**
     * Executed at startup to activate root configurations which were designed
     * for the current resolution.
     * @since S60 5.0 
     */
    void ActivateRootConfigurationsL();
           
#endif // defined(WINSCW)
    
    
private:
    TInt iSessionCount;
    
#ifdef _hsps_SERVER_SHUTDOWN_ENABLED_    
    CShutdown* iShutdown;
#endif // _hsps_SERVER_SHUTDOWN_ENABLED_

    /* 
    * iRequestClientCount counts the number of RequestClientHandler instances
    * when this number is 0, no resource file access exist and the temporary resource
    * file instances can be removed safely
    */
    TInt iRequestClientCount;
      
    // Contents of the header cache
    CArrayPtrSeg<ChspsODT>* iHeaderListCache;
    TBool iHeaderListPending;
           
    RFs iFsSession;
    ChspsDefinitionRepository* iDefinitionRepository;
    CRepository* iCentralRepository;
    ChspsSecurityEnforcer* iSecurityEnforcer;
    ChspsFileChangeListener* iFileChangeListener;
    
    // Active device language
    TLanguage iDeviceLanguage;
        
    ChspsODT* iCacheMask;
    
    // Installation handler for ROM imports 
    ChspsRomInstaller* iRomInstaller;
    
    // Installation handler for SISX imports
    ChspsAutoInstaller* iAutoInstaller;
                               
    // Array of installable *.dat files under the imports folder
    RPointerArray<HBufC> iInstallableSisxThemes;
    
    // Array of installed *.dat files under the imports folder
    RPointerArray<HBufC> iInstalledSisxThemes;        
    
    // Array of installable manifest files
    RPointerArray<HBufC> iManifestFiles;
    
    // Index of a manifest in autoinstallation
    TInt iCurrentManifestFile;
    
    // State of the SISX installer
    TInt iAutoInstallerState;
    
    // Index of the theme to be removed
    TInt iThemeIndexToRemove;
    
	// File locks for preventing uninstallation of active SISX configurations
    RFile iFileAS;
    RFile iFileAI;
    RFile iFileLT;
    
    // Pointer to Central Repository Listener        
    ChspsCenRepListener* iCenRepListener;

    // Pointer to backup event listener
    CHSPSBRObserver* iBRObserver;

    // Backup state
    ThspsBRStates iBRState;

    // Active backup client
    conn::CActiveBackupClient* iActiveBackupClient;
    
    // Backup handler
    CHSPSBRHandler* iBRHandler;
    

#if defined(WINSCW) || defined(__WINS__)
    // Listener for resolution and orientation changes
    ChspsFamilyListener* iFamilyListener;
#endif // defined(WINSCW)    
    
#ifdef HSPS_LOG_ACTIVE    
    /**
     * Log bus.
     */        
    ChspsLogBus* iLogBus;
#endif    
    };

#endif //__hspsTHEMESERVER_H__