uiresources_plat/cdl_api/inc/CdlExplorer.h
changeset 0 05e9090e2422
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uiresources_plat/cdl_api/inc/CdlExplorer.h	Thu Dec 17 09:14:12 2009 +0200
@@ -0,0 +1,156 @@
+/*
+* 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 CDLPACKAGEEXPLORER_H
+#define CDLPACKAGEEXPLORER_H
+
+#include <CdlEngine.h>
+
+class CCdlRefs;
+
+/**
+* Enumeration used to indicate the result of comparing two customisation instances
+*/
+enum TCdlInstanceComparison
+	{
+	ECdlInstancesNotComparable,
+	EFirstCdlInstanceBetter,
+	ESecondCdlInstanceBetter
+	};
+
+
+/**
+* Utilities for the CDL explorer system
+*/
+class CdlExplorerUtils
+	{
+public:
+	/**
+	* Create a CCdlRefs containing a single reference to the instance passed in.
+	* @param aSingleInstance an instance whose reference will appear in the collection.
+	* @return a CCdlRefs containing a single reference to the instance passed in.
+	*/
+	IMPORT_C static CCdlRefs* CreateRefsLC(const CCdlInstance& aSingleInstance);
+	/**
+	* Create a CCdlRefs containing a collection of references which have come from a
+	* customisation instance. If any of the references do not give a DLL name, they take
+	* their DLL name from the instance provided.
+	* @param aHomeInstance a customisation instance which has provided the array of references
+	* @param aRefs a collection of references.
+	* @return a CCdlRefs containing the references supplied.
+	*/
+	IMPORT_C static CCdlRefs* CreateRefsLC(const CCdlInstance& aHomeInstance, const TCdlArray<TCdlRef>& aRefs);
+	};
+
+
+/**
+* Base class for CDL explorer classes. Has functionality for finding instances.
+*/
+class CCdlInstanceExplorerBase : public CBase
+	{
+public:
+	/**
+	* destructor
+	*/
+	IMPORT_C ~CCdlInstanceExplorerBase();
+
+protected:
+	/**
+	* Finds customisation instances that implement a particular interface. The returned set is
+	* filtered so that invalid and less good instances are removed.
+	* @param aCdlUid the CDL interfaces UID to look for.
+	* @return An array of instances that implement the specified interface.
+	*/
+	IMPORT_C CArrayPtr<CCdlInstance>* FindLC(TUid aCdlUid);
+
+private:
+	void TryAddL(const TCdlRef& aRef, const CCdlInstance* aSubLayer, CArrayPtr<CCdlInstance>* aInstances);
+
+private:
+	virtual CCdlInstance* CreateInstanceLC(const TCdlRef& aRef, const CCdlInstance* aSubLayer) = 0;
+	virtual TCdlInstanceComparison CallCompare(const CCdlInstance& aFirst, const CCdlInstance& aSecond) const = 0;
+	virtual TBool CallIsValid(const CCdlInstance& aInstance) const = 0;
+
+private:
+	CCdlInstance* iSubLayer;		// owned, used as a sub-layer for all returned instances
+	};
+
+
+/**
+* Template class for creating explorers for specific CDL interfaces.
+* The template parameter must be the CInstance class from a particular CDL interfaces namespace.
+* This class uses inline virtual functions, which could result in a lot of code duplication
+* if instantiated in a public header. Therefore, this class should only ever be derived from and
+* instantiated inside a .cpp file where it is needed.
+*/
+template<class T>
+class CCdlInstanceExplorer : public CCdlInstanceExplorerBase
+	{
+public:
+	/**
+	* Finds customisation instances of the type that this class is instantiated with.
+	* The returned set is filtered so that invalid and less good instances are removed.
+	* @return An array of instances of the type that this class is instantiated with.
+	*/
+	inline CArrayPtr<T>* FindLC();
+
+private:
+	inline CCdlInstance* CreateInstanceLC(const TCdlRef& aRef, const CCdlInstance* aSubLayer);
+	inline TCdlInstanceComparison CallCompare(const CCdlInstance& aFirst, const CCdlInstance& aSecond) const;
+	inline TBool CallIsValid(const CCdlInstance& aPackage) const;
+
+protected:	// These functions can be overridden to specialise explorer behavior
+	/**
+	* Virtual function for comparing two instances.
+	* Instances are comparable if they are alternative versions of the same implementation.
+	* Eg for different languages.
+	* If the instances are not related, they are not comparable.
+	* Compare should favor aFirst in case of a tie.
+	* @param aFirst The first instance to compare.
+	* @param aFirst The second instance to compare.
+	* @return The result of the comparison
+	*/
+	inline virtual TCdlInstanceComparison Compare(const T& aFirst, const T& aSecond) const;
+	/**
+	* Virtual function for checking the validity of an instance.
+	* Instantiations of the instance explorer may want to overide this to check that 
+	* instances meet certain requirements.
+	* @param aInstance The instance to check validity on
+	* @return ETrue if valid
+	*/
+	inline virtual TBool IsValid(const T& aInstance) const;
+	};
+
+
+/**
+*  Explorer class with added functionality for packages.
+*/
+template<class T>
+class CCdlPackageExplorer : public CCdlInstanceExplorer<T>
+	{
+public:
+	/**
+	* Extracts the contents of a package into a CCdlRefs collection
+	* @param aPackage the package whose contents require extraction
+	* @return a CCdlRefs containing the contents of the package.
+	*/
+	inline CCdlRefs* CreateRefsLC(const T& aPackage);
+	};
+
+
+#include <CdlExplorer.inl>
+
+#endif