policymanagement/policyengine/policyengineserver/inc/PolicyEngineServer.h
author William Roberts <williamr@symbian.org>
Wed, 16 Jun 2010 13:52:50 +0100
branchGCC_SURGE
changeset 37 58ccf230e26b
parent 0 b497e44ab2fc
permissions -rw-r--r--
GCC needs EABI def files - bug 2956

/*
* Copyright (c) 2000 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: Implementation of policymanagement components
*
*/


#ifndef __POLICY_ENGINE_SERVER_H__
#define __POLICY_ENGINE_SERVER_H__

// INCLUDES

#include <e32base.h>
#include "PolicyEngineClient.h"
#include "PlatformSecurityPolicies.h"

// CONSTANTS

// ----------------------------------------------------------------------------------------
// PolicyEngine server panic codes
// ----------------------------------------------------------------------------------------

enum TPolicyEnginePanic
	{
	EPanicGeneral,
	EBadSubsessionHandle,
	EPanicIllegalFunction,
	EBadDescriptor
	};
	
const TInt KPolicyEngineSelfCheckDelay 			= 8000000;	// approx 8s
const TInt KPolicyEngineShutdownDelay  		 	= 5;		// approx 8s * 2 = 40s
const TInt KPolicyEngineReleaseElementsDelay  	= 1;		// approx 8s * 1 = 8s


// DATA TYPES
// FUNCTION PROTOTYPES

void PanicClient(const RMessagePtr2& aMessage,TPolicyEnginePanic aPanic);

// FORWARD DECLARATIONS

class CPolicyStorage;
class CPolicyProcessor;
class CPolicyManager;
class CTrustedSession;
class CCertificateMaps;

#ifdef _DEBUG
namespace DebugUtility
{
	TBool PolicyCheckActive();
}
#endif


// MACROS

#ifdef _DEBUG
	#define NO_POLICY_CHECK_RETURN if(!DebugUtility::PolicyCheckActive())return;
	#define NO_POLICY_CHECK_FALSE DebugUtility::PolicyCheckActive()
#else
	#define NO_POLICY_CHECK_RETURN ;
	#define NO_POLICY_CHECK_FALSE ETrue
#endif

// CLASS DECLARATION     

class CShutdown : public CTimer
{
	//shutdown timer for policy server
	public:
	public:
		inline CShutdown();
		inline void ConstructL();
		inline void Start();
	private:
		void RunL();
		TInt iSelfCheckCounter;
};

class CServerStatusFlags : public CBase
{
	public:
		CServerStatusFlags() {}
	public:
		TBool iManagementUiActive;
		TBool iUiActive;
		TBool iProcessorActive;
		TBool iManagementActive;
	private:
};

class CSubSessionObjects : public CObject
{
	public:
		static CSubSessionObjects * NewL( CPolicyProcessor * aPolicyProcessor, 
										  CPolicyManager * aPolicyManager,
			  							  CTrustedSession * aTrustedSession);
		~CSubSessionObjects();
	private:
		CSubSessionObjects( CPolicyProcessor * aPolicyProcessor, 
							CPolicyManager * aPolicyManager,
							CTrustedSession * aTrustedSession);
	private:
		CPolicyProcessor * iPolicyProcessor;
 		CPolicyManager * iPolicyManager; 
		CTrustedSession * iTrustedSession;

	
		friend class CPolicyEngineSession;
		friend class CPolicyEngineServer;
};

/**
*  CPolicyEngineServer 
*  Description.
*/

class CPolicyEngineServer : public CPolicyServer
{
	public:
		static CServer2* NewLC();
		~CPolicyEngineServer();
		void AddSession();
		void DropSession();
	
	/**
    * Description
	* @param a??? 
    * @return CObjectCon
    */
	
		CObjectCon* NewContainerL();
		
		static CCertificateMaps * CertificateMaps();
		static CServerStatusFlags* StatusFlags();
		static void AddActiveObjectL( CActive* aActiveObject);
		static void RemoveActiveObject( CActive* aActiveObject);
		static void StopAllPendingRequests();
		
		//get active subsessions object to PolicyEngineServer
		static void SetActiveSubSession( const CBase* iBase);
		void Panic( TInt aPanicCode);
private:
		CPolicyEngineServer();
		void ConstructL();
		CSession2* NewSessionL(const TVersion& aVersion, const RMessage2& aMessage) const;	
		
		//From CPolicyServer
		CPolicyServer::TCustomResult CustomSecurityCheckL(const RMessage2& aMsg, TInt& aAction, TSecurityInfo& aMissing);

		
private:
		TInt iSessionCount;
		CShutdown iShutdown;
		RArray<CActive*> iActiveObjectCancelList;
		CPolicyStorage* iPolicyStorage;
		CCertificateMaps* iCertificateMaps;
		CSubSessionObjects* iSubSessionObjects;
		CServerStatusFlags* iFlags;
		CObjectConIx *iContainerIndex;
		
		static CPolicyEngineServer* iServer;
		CPolicyServer::TPolicy iPolicyEngineSecurityPolicy;
		
		friend class CPolicyEngineSession;
};

class CPolicyEngineSession : public CSession2
{
	
	public:
		CPolicyEngineSession();
		void CreateL();
		void SetStatusFlags( CServerStatusFlags* aFlags);
		
		CSubSessionObjects* GetSubSessionObjects( const CBase* iBase);
 	private:

	private:
		~CPolicyEngineSession();
		inline CPolicyEngineServer& Server();

		void ServiceL(const RMessage2& aMessage);
		
		void DispatchMessageL(const RMessage2& aMessage);
		void ServiceError(const RMessage2& aMessage,TInt aError);
	
		void NewSubSessionL( const RMessage2& aMessage);
		CSubSessionObjects* SubSessionFromHandle( const RMessage2& aMessage);
		void DeleteSubSession( const RMessage2& aMessage);

		void ExecuteRequestL( const RMessage2& aMessage);
		void AddCertificateForSessionL(  const RMessage2& aMessage);
		
		void PerformRFSL();
	private:	
		TInt iSubsessionCount;

		CObjectCon *iContainer; 		// object container for this session
		CObjectIx* iSessionsObjects; 	// object index which stores objects for this session
};

class CASyncHandler : public CActive
{
	public:
		~CASyncHandler();
		static CASyncHandler* NewLC();
	
		TRequestStatus& GetRequestStatus();
		void WaitForRequest();
	protected:	
		CASyncHandler();
		void RunL();
		void DoCancel();		
	private:
		CActiveSchedulerWait iWaitScheduler;	
};

#endif //__POLICYENGINESERVER_H__