RImplInfoArray* CAiwResolver::ListAllL(TUid aInterfaceUid, const TEComResolverParams& aAdditionalParameters) const { // Use the member var to create the array so that we get proper cleanup behaviour delete iImplementationInfoArray; iImplementationInfoArray = NULL; iImplementationInfoArray = new (ELeave) RImplInfoArray; RImplInfoArray* retList = iImplementationInfoArray; RImplInfoArray& fullList = iRegistry.ListImplementationsL(aInterfaceUid); const TBool useWildcards = aAdditionalParameters.IsWildcardMatch(); TBuf8<KMaxDataItemSize> content; TBuf8<KMaxDataItemSize> opaque; ParseInput(aAdditionalParameters.DataType(), content, opaque); const TInt numImps = fullList.Count(); for (TInt index = 0; index < numImps; ++index) { if (Match(fullList[index]->DataType(), content, useWildcards) && MatchServiceCmd(fullList[index]->OpaqueData(), opaque)) { User::LeaveIfError(retList->Append(fullList[index])); } } // Reset the member variable because we are passing ownership back iImplementationInfoArray = NULL; return retList; }
void GetResolvedDllInfo_OOMTestL() { TInt processHandlesS = 0; TInt threadHandlesS = 0; TInt processHandlesE = 0; TInt threadHandlesE = 0; RThread().HandleCount(processHandlesS, threadHandlesS); CEComServer* ecomServer = CEComServer::NewLC(); TClientRequest clientReq; RArray<TUid> extendedInterfaces; CleanupClosePushL(extendedInterfaces); RImplInfoArray* implInfoArray = ecomServer->ListImplementationsL(KCExampleInterfaceUid,extendedInterfaces,clientReq); CleanupStack::PopAndDestroy(&extendedInterfaces); TEST(implInfoArray->Count() > 0); for(TInt count=1;;++count) { // Setting Heap failure for OOM test __UHEAP_SETFAIL(RHeap::EDeterministic, count); __UHEAP_MARK; TEntry dllInfo; TUid dtorIdKey; TClientRequest clntRq; CImplementationInformation* info = (*implInfoArray)[0]; TRAPD(err, ecomServer->GetResolvedDllInfoL(info->ImplementationUid(), dllInfo, dtorIdKey, clntRq)); if(err == KErrNoMemory) { __UHEAP_MARKEND; } else if(err == KErrNone) { __UHEAP_MARKEND; RDebug::Print(_L("The test succeeded at heap failure rate=%d.\n"), count); break; } else { __UHEAP_MARKEND; TEST2(err, KErrNone); } __UHEAP_RESET; } __UHEAP_RESET; //implInfoArray should be deleted! The caller takes the ownership. if (implInfoArray!=NULL) { implInfoArray->Close(); delete implInfoArray; } CleanupStack::PopAndDestroy(ecomServer); RThread().HandleCount(processHandlesE, threadHandlesE); TEST(processHandlesS == processHandlesE); TEST(threadHandlesS == threadHandlesE); }
RImplInfoArray* CExampleResolver::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 TBool useWildcards = aAdditionalParameters.IsWildcardMatch(); const TDesC8& matchType = aAdditionalParameters.DataType(); const TInt numImps = fullList.Count(); for(TInt index = 0; index < numImps; ++index) { if(Match(fullList[index]->DataType(), matchType, useWildcards)) { User::LeaveIfError(retList->Append(fullList[index])); } } // Reset the member variable because we are passing ownership back iImplementationInfoArray = NULL; return retList; }
TUid CExampleResolver::Resolve(const RImplInfoArray& aImplementationsInfo, const TEComResolverParams& aAdditionalParameters) const { // Loop through the implementations matching on type const TInt count = aImplementationsInfo.Count(); for(TInt index = 0; index < count; ++index) { const CImplementationInformation& impData = *aImplementationsInfo[index]; // As soon as we get a match on the datatype then return uid of the // implementation found. if (Match(impData.DataType(), // The Datatype of this implementation aAdditionalParameters.DataType(), // The type we are trying to find aAdditionalParameters.IsWildcardMatch())) // If wildcards should be used return impData.ImplementationUid(); } return KNullUid; }