sl@0: /* sl@0: * Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: * All rights reserved. sl@0: * This component and the accompanying materials are made available sl@0: * under the terms of the License "Eclipse Public License v1.0" sl@0: * which accompanies this distribution, and is available sl@0: * at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: * sl@0: * Initial Contributors: sl@0: * Nokia Corporation - initial contribution. sl@0: * sl@0: * Contributors: sl@0: * sl@0: * Description: sl@0: * refpolicyevaluator.cpp sl@0: * sl@0: */ sl@0: sl@0: sl@0: #include "testpolicyevaluator.h" sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: sl@0: using namespace UserPromptService; sl@0: sl@0: static const TUint KTestPolicyEvaluatorImplementationId = 0x10283698; sl@0: sl@0: CPolicyEvaluator* CTestPolicyEvaluator::CreatePolicyEvaluatorL() sl@0: /** sl@0: Factory method that instantiates a new policy evaluator ECOM plug-in. sl@0: sl@0: @return A pointer to the new reference policy evaluator object. sl@0: */ sl@0: { sl@0: CTestPolicyEvaluator* self = new (ELeave)CTestPolicyEvaluator(); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: static const TImplementationProxy ImplementationTable[] = sl@0: { sl@0: IMPLEMENTATION_PROXY_ENTRY(KTestPolicyEvaluatorImplementationId, CTestPolicyEvaluator::CreatePolicyEvaluatorL) sl@0: }; sl@0: sl@0: EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount) sl@0: /** sl@0: Standard ECOM factory sl@0: */ sl@0: { sl@0: aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy); sl@0: return ImplementationTable; sl@0: } sl@0: sl@0: sl@0: CTestPolicyEvaluator::CTestPolicyEvaluator() sl@0: /** sl@0: Constructor sl@0: */ sl@0: : CPolicyEvaluator() sl@0: { sl@0: CActiveScheduler::Add(this); sl@0: } sl@0: sl@0: CTestPolicyEvaluator::~CTestPolicyEvaluator() sl@0: /** sl@0: Destructor sl@0: */ sl@0: { sl@0: Deque(); sl@0: delete iDigest; sl@0: delete iClientEntity; sl@0: } sl@0: sl@0: void CTestPolicyEvaluator::ConstructL() sl@0: /** sl@0: Second phase constructor, creates the message digest sl@0: */ sl@0: { sl@0: iDigest = CMessageDigestFactory::NewDigestL(CMessageDigest::EMD5); sl@0: } sl@0: sl@0: sl@0: // From CActive sl@0: void CTestPolicyEvaluator::DoCancel() sl@0: { sl@0: // Logically should Cancel the internal outstanding requst, but sl@0: // currently GenerateFingerprints has already completed it. sl@0: sl@0: // And need to complete the clients request sl@0: if (iClientStatus) sl@0: { sl@0: User::RequestComplete(iClientStatus, KErrCancel); sl@0: } sl@0: } sl@0: sl@0: TInt CTestPolicyEvaluator::RunError(TInt aError) sl@0: { sl@0: if (iClientStatus) sl@0: { sl@0: User::RequestComplete(iClientStatus, aError); sl@0: } sl@0: return KErrNone; sl@0: } sl@0: sl@0: void CTestPolicyEvaluator::RunL() sl@0: { sl@0: // This plug-in doesn't use the opaque data sl@0: TInt opaqueDataLen = iRequest->OpaqueData().Length(); sl@0: if (opaqueDataLen > 0) sl@0: { sl@0: RDebug::Printf("Received %d bytes of opaque data", opaqueDataLen); sl@0: } sl@0: sl@0: SetClientEntityL(); sl@0: sl@0: // Create most specific hash first i.e. HASH(destination) sl@0: // N.B. Normally, the destination field should be parsed so that only relevant data is hashed. sl@0: iDigest->Reset(); sl@0: const TDesC& d = iRequest->Destination(); sl@0: TPtrC8 p(reinterpret_cast(d.Ptr()), d.Length() * 2); sl@0: TPtrC8 h(iDigest->Hash(p)); sl@0: sl@0: CFingerprint* f = CFingerprint::NewLC(h, d); sl@0: iFingerprints->AppendL(f); sl@0: CleanupStack::Pop(f); sl@0: sl@0: // An empty fingerprint may be used for decisions that apply to sl@0: // all destinations. sl@0: f = CFingerprint::NewLC(KNullDesC8, KNullDesC); sl@0: iFingerprints->AppendL(f); sl@0: CleanupStack::Pop(f); sl@0: sl@0: User::RequestComplete(iClientStatus, KErrNone); sl@0: } sl@0: sl@0: void CTestPolicyEvaluator::SetClientEntityL() sl@0: /** sl@0: Sets the name of the entity within the client process that made the request. sl@0: This is optional functionality designed to allow permissions to be set for scripts sl@0: where the scripting host process can execute a number of different scripts. sl@0: */ sl@0: { sl@0: // This doesn't really support client entities, so for testing purposes we sl@0: // extract the client entity name from the opaque data. sl@0: _LIT8(KClientEntityTagStart, ""); sl@0: _LIT8(KClientEntityTagEnd, ""); sl@0: TInt startPos; sl@0: TInt endPos; sl@0: if ((startPos = iRequest->OpaqueData().FindF(KClientEntityTagStart)) != KErrNotFound) sl@0: { sl@0: startPos += KClientEntityTagStart().Length(); sl@0: if ((endPos = iRequest->OpaqueData().FindF(KClientEntityTagEnd)) != KErrNotFound) sl@0: { sl@0: if (endPos > startPos) sl@0: { sl@0: TPtrC8 entityName = iRequest->OpaqueData().Mid(startPos, endPos - startPos); sl@0: iClientEntity = CClientEntity::NewL(entityName); sl@0: *iClientEntityPtr = iClientEntity; sl@0: } sl@0: } sl@0: } sl@0: } sl@0: sl@0: void CTestPolicyEvaluator::GenerateFingerprints( sl@0: const CPromptRequest& aRequest, const CPolicy& aPolicy, sl@0: RPointerArray& aFingerprints, const CClientEntity*& aClientEntity, sl@0: const TAny*& aDialogCreatorParams, TRequestStatus& aStatus) sl@0: { sl@0: iRequest = &aRequest; sl@0: iPolicy = &aPolicy; sl@0: iFingerprints = &aFingerprints; sl@0: iClientEntityPtr = &aClientEntity; sl@0: aDialogCreatorParams = 0; sl@0: sl@0: iClientStatus = &aStatus; sl@0: aStatus = KRequestPending; sl@0: sl@0: // Kick off policy evaluator state machine sl@0: iStatus = KRequestPending; sl@0: TRequestStatus* status = &iStatus; sl@0: SetActive(); sl@0: User::RequestComplete(status, KErrNone); sl@0: } sl@0: sl@0: TBool CTestPolicyEvaluator::ForcePromptL(const CDecisionRecord& aDecision, TUint& aNewEvaluatorInfo) sl@0: { sl@0: (void) aDecision; sl@0: aNewEvaluatorInfo = aDecision.iEvaluatorInfo + 10; sl@0: return EFalse; sl@0: }