layouts/cdl/CdlEngine/inc/CCdlEngine.h
changeset 0 05e9090e2422
child 54 08459e712984
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/layouts/cdl/CdlEngine/inc/CCdlEngine.h	Thu Dec 17 09:14:12 2009 +0200
@@ -0,0 +1,196 @@
+/*
+* Copyright (c) 2009 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:
+*
+*/
+#ifndef CCDLENGINE_H
+#define CCDLENGINE_H
+
+#include <e32base.h>
+#include <e32hashtab.h>
+#include "CdlLibrary.h"
+#include "CdlCustomisation.h"
+#include "CdlClient.h"
+#include "CdlRefs.h"
+#include "CdlChangeObserver.h"
+#include "CdlPanic.h"
+
+class CCdlEngine;
+
+/**
+* Utility functions for importing and exporting descriptors
+*/
+class CdlUtils
+	{
+public:
+	/**
+	* Copy aLen bytes of data from aBuf to aData and move aBuf on.
+	*/
+	static void Extract(TPtrC8& aBuf, TDes8& aData, TInt aLen);
+
+	/**
+	* Add aText to aBuf, growing aBuf exponentially as necessary.
+	* This exponential growth waste on average 1/3 extra space, but it reduces run time
+	* from O(n^2) to O(nLog(n))
+	* This function assumes aBuf is on top of the cleanup stack. The LDC ending means
+	* that it may leave, it may destroy the object on the cleanup stack and it may
+	* place a new object on the cleanup stack.
+	*/
+	static void AppendLDC(HBufC8*& aBuf, const TDesC8& aText);
+	
+	/**
+	* Templated function for extracting T-classes from a descriptor, using TPckg.
+	*/
+	template<class T>
+	inline static void Extract(TPtrC8& aBuf, T& aData)
+		{ TPckg<T> pckg(aData); Extract(aBuf, pckg, pckg.MaxLength()); }
+	};
+
+/**
+* CDL engine base class.
+* This has the reference counting and library manager functionality.
+* The CDL server uses this class to provide the engine functionality it needs.
+*/
+NONSHARABLE_CLASS(CCdlEngineBase) : public CBase
+	{
+public:
+	static CCdlEngineBase* Static();
+	static CCdlEngineBase* NewLC();
+	static CCdlEngineBase* InstanceLC(TBool& aPushed);
+
+	~CCdlEngineBase();
+	void IncRefCount();
+	void DecRefCount();
+
+	virtual CCdlRefCollection* FileContentsLC(const TDesC& aLibName);
+	CCdlLibManager* LibMan() const;
+	virtual TInt IsPluginInRom(const TDesC& aFileName, TBool& aIsInRom) const;
+	virtual TInt PluginDrive(const TDesC& aFileName, TDriveUnit& aDrive) const;
+
+protected:
+	CCdlEngineBase();
+	void ConstructL();
+
+private:
+	TInt iRefCount;
+	CCdlLibManager* iLibMan;		// owned
+	};
+
+/**
+* The client side CDL engine.
+* This adds all the customisation management functionality over the base class.
+*/
+NONSHARABLE_CLASS(CCdlEngine) : public CCdlEngineBase
+	{
+public:
+	static CCdlEngine* Static();
+	static CCdlEngine* NewLC();
+	static CCdlEngine* InstanceLC(TBool& aPushed);
+	static CCdlEngine& Instance();
+
+	~CCdlEngine();
+
+	TAny* GetData(TUid aCdlUid, TInt aApiId) const;
+	TCdlEngineFunc* GetFunction(TUid aCdlUid, TInt aApiId) const;
+
+	void RequireCustomisationL(const SCdlInterface* aInterfaceParams);
+	void LoadCustomisationL(const TCdlRef& aRef);
+	TBool IsCustomisationStarted(const SCdlInterface* aInterfaceParams) const;
+
+	const CCdlInstance& CustomisationInstance(TUid aCdlUid) const;
+	const TCdlRef& LastAccessedRef(TUid aCdlUid) const;
+	void FileNameRelativeToLastAccessedInstance(TUid aCdlUid, TFileName& aFileName) const;
+	TInt LastApiId() const;
+	inline void SetLastApiId(TInt aLastApiId) const;
+
+	CCdlRefs* FindInstancesLC(TUid aCdlUid) const;
+	CCdlNames* FindCustomisationFilesLC() const;
+	CCdlRefs* AllAvailableRefsLC() const;
+	TInt* LastApiRefL(TUid aCdlUid);
+
+	void SetLocalStateL(const CCdlRefs& aState);
+	void SetGlobalStateL(const CCdlRefs& aState);
+	CCdlRefs* LocalStateLC(const CCdlUids& aCdlUids) const;
+	CCdlRefs* GlobalStateLC(const CCdlUids& aCdlUids) const;
+
+	void EnableGlobalCustomisationL(const CCdlUids& aCdlUids, TBool aEnabled);
+	void StartGlobalCustomisationL();
+	
+	void AddCustomisationChangeObserverL(MCdlChangeObserver* aObserver, TUid aUid);
+	void AddGeneralChangeObserverL(MCdlChangeObserver* aObserver);
+	void RemoveChangeObserver(MCdlChangeObserver* aObserver);
+
+	void HandleGlobalCustomisationChangeL(TInt aSize);
+	void HandleAvailableRefsChangeL();
+
+	
+	// from CCdlEngineBase
+	virtual CCdlRefCollection* FileContentsLC(const TDesC& aLibName);
+	virtual TInt IsPluginInRom(const TDesC& aFileName, TBool& aIsInRom) const;
+	virtual TInt PluginDrive(const TDesC& aFileName, TDriveUnit& aDrive) const;
+
+private:
+	CCdlEngine();
+	void ConstructL();
+
+	CCdlCustomisationStack* Lookup(TUid aCdlUid) const;
+	CCdlCustomisationStack& LookupP(TUid aCdlUid) const;
+	CCdlRefs* GlobalStateLC(TInt aSize) const;
+	void DoSetLocalStateL(const CCdlRefs& aState, CCdlUids& aChangedUids);
+	CCdlCustomisationStack* LookupOrCreateL(TUid aCdlUid);
+	const CCdlInstance* LastAccessedInstance(TUid aCdlUid) const;
+	void AddLocalStateToRefs(TUid aUid, CCdlRefs* aState) const;
+
+private:
+	friend class CdlEngine;	// for optimised GetFunction()
+	typedef RHashMap<TUint32, CCdlCustomisationStack*> CCdlCustomisations;
+	CCdlCustomisations iCustomisations;			// contained CCdlCustomisationStacks are owned
+	//mutable CCdlCustomisationStack* iLastStack;	// not owned thru this pointer
+	RCdlSession iServer;
+	CCdlUids iGloballyCustomised;
+	CCdlChangeMonitor* iChangeMonitor;			// owned
+	CCdlChangeObservers iObservers;
+	//CCdlCustomisationStack** iBeginCust;
+	//CCdlCustomisationStack** iEndCust;
+	mutable TInt iLastApiId;
+	};
+
+
+/**
+* Wrapper around a CDL DLL, to access it's contents as a CCdlRefCollection
+*/
+NONSHARABLE_CLASS(CCdlLibraryContentsImp) : public CCdlRefCollection
+	{
+public:
+	static CCdlLibraryContentsImp* NewLC(const TDesC& aLibName, CCdlEngineBase* aEngine);
+	~CCdlLibraryContentsImp();
+
+	TInt CountRefs() const;
+	TCdlRef Ref(TInt aIndex) const;
+
+private:
+	void ConstructL(CCdlEngineBase* aEngine, const TDesC& aLibName);
+
+private:
+	RCdlLibRef iLib;
+	TCdlArray<SCdlCustomisation> iContent;
+	};
+
+
+void CCdlEngine::SetLastApiId(TInt aLastApiId) const
+	{
+	iLastApiId = aLastApiId;
+	}
+
+#endif