diff -r 000000000000 -r 05e9090e2422 layouts/cdl/CdlEngine/inc/CCdlEngine.h --- /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 +#include +#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 + inline static void Extract(TPtrC8& aBuf, T& aData) + { TPckg 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 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 iContent; + }; + + +void CCdlEngine::SetLastApiId(TInt aLastApiId) const + { + iLastApiId = aLastApiId; + } + +#endif