/*
* Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "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: 
*     Impelementation of a custom resolver.
*
*/

/*
* %version: 10 %
*/

#ifndef __EAPPLUGINRESOLVER_H__
#define __EAPPLUGINRESOLVER_H__

// INCLUDES
#include <ecom/resolver.h>


/**
 * Class:       CEapVpnInterfaceResolver
 *
 * Description: An implementation of the CResolver definition. This controls
 *              the identification, (resolution), of which implementation
 *              will be used to satisfy an interface implementation
 *              instantiation.
 */
class CEapVpnInterfaceResolver : public CResolver
	{
public:
	/**
     * Function:    NewL
     *
     * Description: Create instance of concrete implementation. The method
	 *              takes a MPublicRegistry, allowing access to a list of
	 *              implementations for a particular interface
     *
     * @param       aRegistry provides a list of implementations of a specified
	 *              interface.
     *
	 * @return      Instance of this class.
     *
     */
	static CEapVpnInterfaceResolver* NewL (MPublicRegistry& aRegistry);

	/**
     * Function:    ~CEapVpnInterfaceResolver
     *
     * Description: Destroy the object
     */ 
	virtual ~CEapVpnInterfaceResolver();

public: // CResolver
	/**
     * Function:    IdentifyImplementationL
     *
     * Description: Identifies the most appropriate implementation of a
	 *              specified interface.
	 *
	 * @param       aInterfaceUid is a unique id specific to definition
	 *              interface.
	 * @param       aAdditionalParameters The parameters which must match for an
	 *              implementation to be suitable.
	 *
	 * @return      The UID of the implementation which satisfies the
	 *              specified parameters. If there is no suitable
	 *              implementation, then KNullUid is returned.
     */
	virtual TUid IdentifyImplementationL(TUid aInterfaceUid,
		const TEComResolverParams& aAdditionalParameters) const;

	/**
     * Function:    ListAllL
     *
     * Description: Lists all the implementations of the specified interface
	 *              definition that satisfy the supplied resolution parameters.
	 *
	 * @param       aInterfaceUid The UID of the interface of which to list
	 *              implementations
	 * @param       aAdditionalParameters The parameters that must match for an
	 *              implementation to be suitable
	 *              implementation to be suitable
	 *
	 * @return      Pointer to an array of suitable implementations. Ownership
	 *              of this array is passed to the calling function, which
	 *              should close and delete the array when its use is complete
     */
	virtual RImplInfoArray* ListAllL(TUid aInterfaceUid,
		const TEComResolverParams& aAdditionalParameters) const;

private:
	/**
     * Function:   CEapVpnInterfaceResolver
     *
     * Discussion: Constructor for this object.
	 *
	 * @param      aRegistry provides a list of implementations of a specified
	 *             interface.
     */
	CEapVpnInterfaceResolver(MPublicRegistry& aRegistry);

	/**
     * Function:    Resolve
     *
     * Description: Search algorithm implemented to find the requested
	 *              interface implementation.
	 *
	 * @param       aImplementationsInfo Information on the potential
	 *              implementations
	 * @param       aAdditionalParameters The data to match against to detemine
	 *              the implementation
	 *
	 * @return      If found returns the Uid of the implementation, else it
	 *              returns KNullUid
     */
	TUid Resolve(const RImplInfoArray& aImplementationsInfo,
		const TEComResolverParams& aAdditionalParameters) const;

	/**
     * Function:    IdentifyImplementationL
     *
     * Description: Method used to find a match between two implementation
	 *              types
	 *
	 * @param       aImplementationType The implementation data type to search
	 *              for a match
	 * @param       aMatchType The data to search against
	 * @param       aUseWildcards ETrue if wildcard matching should be allowed
	 *
	 * @return      ETrue is returned if found else EFalse
     */
	TBool Match(const TDesC8& aImplementationType, const TDesC8& aMatchType,
		TBool aUseWildcards) const;
	};

#endif
