diff -r 000000000000 -r bde4ae8d615e os/ossrv/syslibsapitest/syslibssvs/ecom/TestPlugin/Src/TestEComResolver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/ossrv/syslibsapitest/syslibssvs/ecom/TestPlugin/Src/TestEComResolver.cpp Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,133 @@ +/* +* Copyright (c) 2005-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: +* +*/ + + + +#include "TestEComResolver.h" + +CTestEComResolver* CTestEComResolver::NewL(MPublicRegistry& aRegistry) + { + return new(ELeave) CTestEComResolver(aRegistry); + } + +CTestEComResolver::~CTestEComResolver() + { + if(iImplementationInfoArray) + { + iImplementationInfoArray->Reset(); + delete iImplementationInfoArray; + } + } + +CTestEComResolver::CTestEComResolver(MPublicRegistry& aRegistry) +: CResolver(aRegistry) + { + // Do nothing here + } + +TUid CTestEComResolver::IdentifyImplementationL( + TUid aInterfaceUid, + const TEComResolverParams& aAdditionalParameters +) const + { + RImplInfoArray& fullList = iRegistry.ListImplementationsL(aInterfaceUid); + + // Loop through the implementations matching on type + TUid ret = KNullUid; + const TDesC8& matchType = aAdditionalParameters.DataType(); + const TBool useWildcards = aAdditionalParameters.IsWildcardMatch(); + const TInt count = fullList.Count(); + for(TInt index = 0; (indexDataType(), matchType, useWildcards)) + { + ret=impData->ImplementationUid(); + } + } + + return ret; + } + +RImplInfoArray* CTestEComResolver::ListAllL( + TUid aInterfaceUid, + const TEComResolverParams& aAdditionalParameters +) const + { + // Use the member var to create the array so that we get proper cleanup behaviour + iImplementationInfoArray = new(ELeave) RImplInfoArray; + RImplInfoArray* retList = iImplementationInfoArray; + + RImplInfoArray& fullList = iRegistry.ListImplementationsL(aInterfaceUid); + + const TDesC8& matchType = aAdditionalParameters.DataType(); + const TBool useWildcards = aAdditionalParameters.IsWildcardMatch(); + const TInt numImps = fullList.Count(); + for(TInt index = 0; index < numImps; ++index) + { + CImplementationInformation* impData = fullList[index]; + if(Match(impData->DataType(), matchType, useWildcards)) + { + User::LeaveIfError(retList->Append(impData)); + } + } + + // Reset the member variable because we are passing ownership back + iImplementationInfoArray = NULL; + return retList; + } + +TBool CTestEComResolver::Match( + const TDesC8& aImplementationType, + const TDesC8& aMatchType, + TBool aUseWildcards +) const + { + _LIT8(dataSeparator, "||"); + const TInt separatorLength = dataSeparator().Length(); + + // Look for the section separator marker '||' + TPtrC8 remainingData = aImplementationType; + TInt separatorPos = remainingData.Find(dataSeparator); + TInt matchPos=KErrNotFound; + do + { + TPtrC8 dataSection; + if (separatorPos==KErrNotFound) + { + dataSection.Set(remainingData); + } + else + { + dataSection.Set(remainingData.Left(separatorPos)); + remainingData.Set(remainingData.Mid(separatorPos + separatorLength)); + } + if(aUseWildcards) + { + matchPos=dataSection.Match(aMatchType); + } + else + { + matchPos=dataSection.Compare(aMatchType); + } + } + while ((separatorPos!=KErrNotFound) && (matchPos==KErrNotFound)); + + return matchPos!=KErrNotFound; + }