--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/authorisation/userpromptservice/test/tups/src/tupsclientstep.cpp Thu Sep 10 14:01:51 2009 +0300
@@ -0,0 +1,901 @@
+/*
+* Copyright (c) 2007-2009 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:
+*
+*/
+
+
+
+#include "tupsclientstep.h"
+#include "tupsintegdefs.h"
+#include "tupsproperty.h"
+#include <e32property.h>
+
+
+TServiceRequestParameters::TServiceRequestParameters()
+ :iServiceUID(0), iServerName(0),iDestination(0), iExpectedError(0),
+ iOpaqueData(0), iSelectDialogOption(0), iButtonsDisplayed(0),
+ iDialogCreatorInvoked(0), iPolicyEvaluatorInvoked(0), iAccessGranted(0),
+ iCloseSession(EFalse), iHoldEvaluatorOpen(EFalse), iHoldPrepareDialogOpen(EFalse), iHoldDisplayDialogOpen(EFalse),
+ iRequestDurationThreshold(0), iLeaveDialog(EFalse), iLeaveEvaluator(EFalse), iCancelUpsRequest(EFalse),
+ iPlatSecPass(EFalse),iForcePrompt(EFalse),iExpectedEvaluatorInfo(0),iSelectFingerprint(0),
+ iWaitUntilFileAppears(0)
+ {
+ };
+
+COpenSession* COpenSession::NewL(const TPtrC& aServerName)
+ {
+ COpenSession * self = new (ELeave) COpenSession();
+ CleanupStack::PushL(self);
+ self->ConstructL(aServerName);
+ CleanupStack::Pop(self);
+ return(self);
+ } // End of function
+
+void COpenSession::ConstructL(const TPtrC& aServerName)
+ {
+ iServerName = aServerName;
+ iPointerToServer = new RUpsTestServ;
+ User::LeaveIfError(iPointerToServer->Connect(iServerName, ETrue));
+ iPointerToSession = new RUpsTestSession;
+ User::LeaveIfError(iPointerToSession->Open(*iPointerToServer));
+ } // End of function
+
+COpenSession::~COpenSession()
+ {
+ if (iPointerToSession)
+ iPointerToSession->Close();
+ if (iPointerToServer)
+ iPointerToServer->Close();
+ delete iPointerToSession;
+ delete iPointerToServer;
+ } // End of function
+
+CUpsClientStep::~CUpsClientStep()
+/**
+ * Destructor
+ */
+ {
+ iArraySersToRequest.Close();
+
+ CloseAllOpenSessions();
+ delete iPropertyReader;
+ __UHEAP_MARKEND;
+ } // End of function
+
+
+CUpsClientStep::CUpsClientStep()
+/**
+ * Constructor
+ */
+ {
+ SetTestStepName(KUPSClientStep);
+ } // End of function
+
+
+TVerdict CUpsClientStep::doTestStepPreambleL()
+/**
+ * @return - TVerdict code
+ * Override of base class virtual
+ */
+ {
+
+ __UHEAP_MARK;
+
+ // Read values to config servers from INI file. (ARRAY of values)
+
+ // Read how many times the test step needs to be repeated.
+ TName fStepRepeat(_L("StepRepeat"));
+ TInt repeats;
+
+ if(GetIntFromConfig(ConfigSection(),fStepRepeat,repeats))
+ {
+ iStepRepeat=repeats;
+ }
+ else
+ {
+ iStepRepeat=1;
+ }
+
+ // Read values for test sequence from INI file. (ARRAY of values)
+ TInt index=0;
+ TName fUseServiceUID;
+ fUseServiceUID.Format(_L("UseServiceUID_%d"),index);
+ TName fUseServerName;
+ fUseServerName.Format(_L("UseServerName_%d"),index);
+ TName fDestination;
+ fDestination.Format(_L("Destination_%d"),index);
+ TName fExpectedError;
+ fExpectedError.Format(_L("ExpectedError_%d"),index);
+ TName fUseOpaqueData;
+ fUseOpaqueData.Format(_L("UseOpaqueData_%d"),index);
+ TName fSelectDialogOption;
+ fSelectDialogOption.Format(_L("SelectDialogOption_%d"),index);
+ TName fButtonsDisplayed;
+ fButtonsDisplayed.Format(_L("ButtonsDisplayed_%d"),index);
+ TName fDialogCreatorInvoked;
+ fDialogCreatorInvoked.Format(_L("DialogCreatorInvoked_%d"),index);
+ TName fPolicyEvaluatorInvoked;
+ fPolicyEvaluatorInvoked.Format(_L("PolicyEvaluatorInvoked_%d"),index);
+ TName fAccessGranted;
+ fAccessGranted.Format(_L("AccessGranted_%d"), index);
+ TName fCloseSession;
+ fCloseSession.Format(_L("CloseSession_%d"), index);
+ TName fHoldEvaluatorOpen;
+ fHoldEvaluatorOpen.Format(_L("HoldEvaluatorOpen_%d"), index);
+ TName fHoldPrepareDialogOpen;
+ fHoldPrepareDialogOpen.Format(_L("HoldPrepareDialogOpen_%d"), index);
+ TName fHoldDisplayDialogOpen;
+ fHoldDisplayDialogOpen.Format(_L("HoldDisplayDialogOpen_%d"), index);
+ TName fRequestDurationThreshold;
+ fRequestDurationThreshold.Format(_L("RequestDurationThreshold_%d"), index);
+ TName fLeaveDialog;
+ fLeaveDialog.Format(_L("LeaveDialog_%d"), index);
+ TName fLeaveEvaluator;
+ fLeaveEvaluator.Format(_L("LeaveEvaluator_%d"), index);
+ TName fCancelUpsRequest;
+ fCancelUpsRequest.Format(_L("CancelUpsRequest_%d"), index);
+ TName fPlatSecPass;
+ fPlatSecPass.Format(_L("PlatSecPass_%d"), index);
+ TName fForcePrompt;
+ fForcePrompt.Format(_L("ForcePrompt_%d"), index);
+ TName fExpectedEvaInfo;
+ fExpectedEvaInfo.Format(_L("ExpectedEvaluatorInfo_%d"), index);
+ TName fSelectFingerprint;
+ fSelectFingerprint.Format(_L("SelectFingerprint_%d"), index);
+ TName fWaitUntilFileAppears;
+ fWaitUntilFileAppears.Format(_L("WaitUntilFileAppears_%d"), index);
+
+ TInt useServiceUID;
+ TPtrC useServerName;
+ TPtrC destination;
+ TInt expectedError;
+ TPtrC useOpaqueData;
+ TPtrC selectDialogOption;
+ TInt buttonsDisplayed;
+ TInt dialogCreatorInvoked;
+ TInt policyEvaluatorInvoked;
+ TPtrC accessGranted;
+ TBool closeSession;
+ TBool holdEvaluatorOpen;
+ TBool holdPrepareDialogOpen;
+ TBool holdDisplayDialogOpen;
+ TInt requestDurationThreshold;
+ TBool leaveDialog;
+ TBool leaveEvaluator;
+ TBool cancelUpsRequest;
+ TBool platSecPass;
+ TBool forcePrompt;
+ TInt expectedEvaInfo;
+ TInt selectFingerprint;
+ TPtrC waitUntilFileAppears;
+
+ while (GetHexFromConfig(ConfigSection(), fUseServiceUID,useServiceUID)
+ && GetStringFromConfig(ConfigSection(),fUseServerName,useServerName)
+ && GetStringFromConfig(ConfigSection(),fDestination,destination)
+ && GetStringFromConfig(ConfigSection(),fAccessGranted,accessGranted))
+ {
+ TServiceRequestParameters newSerReq;
+ newSerReq.iServiceUID = useServiceUID;
+ newSerReq.iServerName = useServerName;
+ newSerReq.iDestination = destination;
+ newSerReq.iAccessGranted = accessGranted;
+
+ // Close session is optional.
+ if(GetBoolFromConfig(ConfigSection(),fCloseSession,closeSession))
+ {
+ newSerReq.iCloseSession = closeSession;
+ }
+
+ // use of dialog creator is optional.
+ if(GetStringFromConfig(ConfigSection(),fSelectDialogOption,selectDialogOption)
+ && GetIntFromConfig(ConfigSection(),fButtonsDisplayed,buttonsDisplayed)
+ && GetIntFromConfig(ConfigSection(),fDialogCreatorInvoked,dialogCreatorInvoked))
+ {
+ newSerReq.iSelectDialogOption = selectDialogOption;
+ newSerReq.iButtonsDisplayed = buttonsDisplayed;
+ newSerReq.iDialogCreatorInvoked = dialogCreatorInvoked;
+ }
+
+ // use of policy evaluator is optional.
+ if(GetIntFromConfig(ConfigSection(),fPolicyEvaluatorInvoked,policyEvaluatorInvoked))
+ {
+ newSerReq.iPolicyEvaluatorInvoked = policyEvaluatorInvoked;
+ }
+
+ // Opaque data is optional
+ if(GetStringFromConfig(ConfigSection(),fUseOpaqueData,useOpaqueData))
+ {
+ HBufC8* converter = HBufC8::NewLC(useOpaqueData.Length());
+ converter->Des().Copy(useOpaqueData);
+
+ newSerReq.iOpaqueData = converter->Ptr() ;
+ CleanupStack::PopAndDestroy(); //converter
+ }
+
+ // Expected error is optional.
+ if(GetIntFromConfig(ConfigSection(),fExpectedError,expectedError))
+ {
+ newSerReq.iExpectedError = expectedError;
+ }
+
+ // hold policy evaluator open is optional.
+ if(GetBoolFromConfig(ConfigSection(),fHoldEvaluatorOpen, holdEvaluatorOpen))
+ {
+ newSerReq.iHoldEvaluatorOpen = holdEvaluatorOpen;
+ }
+
+ // hold prepare dialog open is optional.
+ if(GetBoolFromConfig(ConfigSection(),fHoldPrepareDialogOpen, holdPrepareDialogOpen))
+ {
+ newSerReq.iHoldPrepareDialogOpen = holdPrepareDialogOpen;
+ }
+
+ // hold display dialog open is optional.
+ if(GetBoolFromConfig(ConfigSection(),fHoldDisplayDialogOpen, holdDisplayDialogOpen))
+ {
+ newSerReq.iHoldDisplayDialogOpen = holdDisplayDialogOpen;
+ }
+
+ // request duration threshold - if a request takes
+ // longer than this threshold it will fail the test
+ if(GetIntFromConfig(ConfigSection(),fRequestDurationThreshold, requestDurationThreshold))
+ {
+ newSerReq.iRequestDurationThreshold = requestDurationThreshold;
+ }
+
+ // leave dialog is optional.
+ if(GetBoolFromConfig(ConfigSection(),fLeaveDialog,leaveDialog))
+ {
+ newSerReq.iLeaveDialog = leaveDialog;
+ }
+
+ // leave Evaluator is optional.
+ if(GetBoolFromConfig(ConfigSection(),fLeaveEvaluator,leaveEvaluator))
+ {
+ newSerReq.iLeaveEvaluator = leaveEvaluator;
+ }
+
+ // Cancel ups request is optional.
+ if(GetBoolFromConfig(ConfigSection(),fCancelUpsRequest,cancelUpsRequest))
+ {
+ newSerReq.iCancelUpsRequest = cancelUpsRequest;
+ }
+
+ // plat sec pass is optional.
+ if(GetBoolFromConfig(ConfigSection(),fPlatSecPass,platSecPass))
+ {
+ newSerReq.iPlatSecPass = platSecPass;
+ }
+
+ // Force prompt is optional.
+ if(GetBoolFromConfig(ConfigSection(),fForcePrompt,forcePrompt))
+ {
+ newSerReq.iForcePrompt = forcePrompt;
+ }
+
+ // use of policy evaluator is optional.
+ if(GetIntFromConfig(ConfigSection(),fExpectedEvaInfo,expectedEvaInfo))
+ {
+ newSerReq.iExpectedEvaluatorInfo = expectedEvaInfo;
+ }
+
+ // Fingerprint selection is optional.
+ if(GetIntFromConfig(ConfigSection(),fSelectFingerprint,selectFingerprint))
+ {
+ newSerReq.iSelectFingerprint = selectFingerprint;
+ }
+
+ // iRepeatUntilFileAppears is optional.
+ if(GetStringFromConfig(ConfigSection(),fWaitUntilFileAppears,waitUntilFileAppears))
+ {
+ newSerReq.iWaitUntilFileAppears = waitUntilFileAppears;
+ }
+
+ // Add the new service to be requested to array.
+ iArraySersToRequest.Append(newSerReq);
+
+ index++;
+ fUseServiceUID.Format(_L("UseServiceUID_%d"),index);
+ fUseServerName.Format(_L("UseServerName_%d"),index);
+ fDestination.Format(_L("Destination_%d"),index);
+ fExpectedError.Format(_L("ExpectedError_%d"),index);
+ fUseOpaqueData.Format(_L("UseOpaqueData_%d"),index);
+ fSelectDialogOption.Format(_L("SelectDialogOption_%d"),index);
+ fButtonsDisplayed.Format(_L("ButtonsDisplayed_%d"),index);
+ fDialogCreatorInvoked.Format(_L("DialogCreatorInvoked_%d"),index);
+ fPolicyEvaluatorInvoked.Format(_L("PolicyEvaluatorInvoked_%d"),index);
+ fAccessGranted.Format(_L("AccessGranted_%d"), index);
+ fCloseSession.Format(_L("CloseSession_%d"), index);
+ fHoldEvaluatorOpen.Format(_L("HoldEvaluatorOpen_%d"), index);
+ fHoldPrepareDialogOpen.Format(_L("HoldPrepareDialogOpen_%d"), index);
+ fHoldDisplayDialogOpen.Format(_L("HoldDisplayDialogOpen_%d"), index);
+ fRequestDurationThreshold.Format(_L("RequestDurationThreshold_%d"), index);
+ fLeaveDialog.Format(_L("LeaveDialog_%d"), index);
+ fLeaveEvaluator.Format(_L("LeaveEvaluator_%d"), index);
+ fCancelUpsRequest.Format(_L("CancelUpsRequest_%d"), index);
+ fPlatSecPass.Format(_L("PlatSecPass_%d"), index);
+ fForcePrompt.Format(_L("ForcePrompt_%d"), index);
+ fExpectedEvaInfo.Format(_L("ExpectedEvaluatorInfo_%d"), index);
+ fSelectFingerprint.Format(_L("SelectFingerprint_%d"), index);
+ fWaitUntilFileAppears.Format(_L("WaitUntilFileAppears_%d"), index);
+ }
+
+ // now try for some clientStep specific stuff
+ // this ini file entry specifies the property key value for the hold flag
+ // If the hold flag property is true then monitor it until it becomes false
+ // then continue
+ TInt holdKey;
+ if(GetIntFromConfig(ConfigSection(),_L("HoldClientStepKey"), holdKey))
+ {
+ iHoldClientStepKey = holdKey;
+
+ // as this property is present then set it to true using a direct call to p&s api because
+ // the ups p&s api only handles policy evaluators and dialog creators and not test steps
+ User::LeaveIfError(RProperty::Set(KPropertyCreatorUid, iHoldClientStepKey, 2));
+ }
+
+ // Instantiates property reader and seter
+ iPropertyReader= CUpsProperty::NewL(KPropertyCreatorUid);
+
+ // reads client name and SID
+ TParse clientFullName;
+ RThread client;
+ clientFullName.Set(client.FullName(),NULL, NULL);
+ iTEFServerName=clientFullName.Name();
+ iExpectedClientSid = client.SecureId() ;
+ client.Close();
+
+ SetTestStepResult(EPass);
+ return TestStepResult();
+ }
+
+
+TVerdict CUpsClientStep::doTestStepL()
+ {
+ // loop to request for different test services.
+ TVerdict testResult= EPass;
+ TInt numServicesToRequest = iArraySersToRequest.Count();
+
+ if(numServicesToRequest > 0)
+ {
+ // check if the test step needs to hold until another step allows it to continue
+ if (iHoldClientStepKey)
+ {
+ HoldClientL();
+ }
+
+ // repeats the sequence of test services request as many times as specified in iStepRepeat
+ for(TInt repeatTimes = 0;repeatTimes<iStepRepeat;++repeatTimes)
+ {
+ INFO_PRINTF3(_L("%S: Repeat number: %d"),&iTEFServerName,repeatTimes);
+
+ for(TInt index=0;index < numServicesToRequest; ++index )
+ {
+ INFO_PRINTF6(_L("%S: Service request: %d. SysServer: %S Destination: %S ServiceUID: %X "),&iTEFServerName, index, &iArraySersToRequest[index].iServerName ,&iArraySersToRequest[index].iDestination, iArraySersToRequest[index].iServiceUID);
+ RUpsTestSession * sessionToBeUsed;
+
+ sessionToBeUsed = GetSessionToServerL(iArraySersToRequest[index].iServerName);
+
+ SetTestDataL(index);
+
+ sessionToBeUsed->UseTestService(iRequestData,iReturnData);
+
+ iServerId=sessionToBeUsed->GetServerSid();
+ // Check results.
+ if(CheckResultsL(index) == EFalse)
+ {
+ ERR_PRINTF2(_L("%S: Incorrect results"),&iTEFServerName);
+ User::Leave(KErrGeneral);
+ }
+
+ // Checks from config value if session need to be closed.
+ if(iArraySersToRequest[index].iCloseSession)
+ {
+ INFO_PRINTF3(_L("%S :Closing session to server: %S"),&iTEFServerName, &iArraySersToRequest[index].iServerName );
+ CloseSessionL(iArraySersToRequest[index].iServerName);
+ }
+
+ // If it needs to wait for file installation (via swi)
+ if(iArraySersToRequest[index].iWaitUntilFileAppears.CompareF(_L(""))!=0)
+ {
+ WaitThatFileAppearsL(iArraySersToRequest[index].iWaitUntilFileAppears);
+ INFO_PRINTF3(_L("%S :File installed by SWI found: %S"),&iTEFServerName,&iArraySersToRequest[index].iWaitUntilFileAppears);
+ }
+ } // End of second loop
+ }// End of first loop
+
+ // Sets the status of the first instance of policy evaluator and dialog creator to
+ // completed so that the coordinator step can progress in concurrent mode
+ SetClientStatusCompleteL();
+ }
+ else
+ {
+ testResult= EFail;
+ ERR_PRINTF2(_L("%S :Problem reading ini file"),&iTEFServerName);
+ User::Leave(KErrGeneral);
+ }
+
+ return testResult;
+ } // End of function
+
+
+TVerdict CUpsClientStep::doTestStepPostambleL()
+ {
+ return TestStepResult();
+ }
+
+
+void CUpsClientStep::HoldClientL(void)
+ {
+ RProperty checkIfStillNeedtoHold;
+ User::LeaveIfError(checkIfStillNeedtoHold.Attach(KPropertyCreatorUid, iHoldClientStepKey));
+ CleanupClosePushL(checkIfStillNeedtoHold);
+ checkIfStillNeedtoHold.Set(KPropertyCreatorUid, iHoldClientStepKey, 1);
+ TRequestStatus holdStatus;
+ checkIfStillNeedtoHold.Subscribe(holdStatus);
+
+ TInt holdState;
+
+ checkIfStillNeedtoHold.Get(KPropertyCreatorUid, iHoldClientStepKey, holdState);
+ if(!holdState)
+ {
+ checkIfStillNeedtoHold.Cancel();
+ }
+ else
+ {
+ User::WaitForRequest(holdStatus);
+ }
+
+ RDebug::Printf("[UPS ClientStep 0x%x] HoldClient() stopped holding\n", this);
+
+ // set the hold state back to 1 for future holds
+ checkIfStillNeedtoHold.Set(KPropertyCreatorUid, iHoldClientStepKey, 2);
+ CleanupStack::PopAndDestroy(&checkIfStillNeedtoHold);
+ }
+
+
+TBool CUpsClientStep::FindOpenSession(const TDesC& aServerName,TInt &position)
+ {
+ TBool sessionFound = EFalse;
+ TInt sessionsCount = iArraySessionsInUse.Count();
+ for(TInt index = 0;index < sessionsCount; ++index)
+ {
+ if(!aServerName.CompareF(iArraySessionsInUse[index]->iServerName))
+ {
+ position = index;
+ sessionFound = ETrue;
+ break;
+ }
+ }
+ return sessionFound;
+ } // End of function
+
+
+RUpsTestSession* CUpsClientStep::GetSessionToServerL(const TDesC& aServerName)
+ {
+ // Finds out if a session is already open for server requested
+ TInt foundPos;
+ RUpsTestSession* sessionToReturn;
+ if(!FindOpenSession(aServerName,foundPos))
+ {
+ // if open session for intended server not found it creates a new one
+ COpenSession* sessionToAppend=COpenSession::NewL(aServerName);
+ iArraySessionsInUse.AppendL(sessionToAppend);
+ foundPos = iArraySessionsInUse.Count()-1; // position of new session is last one in array.
+ }
+ sessionToReturn = iArraySessionsInUse[foundPos]->iPointerToSession;
+
+ return sessionToReturn;
+ } // End of function
+
+
+void CUpsClientStep::CloseSessionL(const TDesC& aServerName)
+ {
+ // Finds out if a session is already open for server requested
+ TInt foundPos;
+
+ if(!FindOpenSession(aServerName,foundPos))
+ {
+ // if a session for this server was not found it leaves.
+ ERR_PRINTF2(_L("%S: The server to be closed was not found"),&iTEFServerName);
+ User::Leave(KErrGeneral);
+ }
+ delete iArraySessionsInUse[foundPos]; // deletes instance.
+ iArraySessionsInUse.Remove(foundPos); // removes empty slot
+
+ } // End of function
+
+
+void CUpsClientStep::CloseAllOpenSessions()
+ {
+ while(iArraySessionsInUse.Count()>0)
+ { // delete and remove first session of array.
+ delete iArraySessionsInUse[0];
+ iArraySessionsInUse.Remove(0);
+ }
+ iArraySessionsInUse.Close();
+ } // End of function
+
+
+void CUpsClientStep::SetTestDataL(TInt aIndex)
+ {
+ // Set data for request.
+ iReturnData.iError=KErrNone;
+ iServerId=0;
+ iRequestData.iMeasureResponceTime = EFalse;
+ iRequestData.iServiceUid = TUid::Uid(iArraySersToRequest[aIndex].iServiceUID);
+
+ if(iArraySersToRequest[aIndex].iOpaqueData.CompareF(_L8(""))==0)
+ {
+ iRequestData.iOpaquePresent = EFalse;
+ }
+ else
+ {
+ iRequestData.iOpaquePresent = ETrue;
+ iRequestData.iOpaqueData =iArraySersToRequest[aIndex].iOpaqueData;
+ }
+
+ iRequestData.iDestination = iArraySersToRequest[aIndex].iDestination;
+ iRequestData.iCancelRequest = iArraySersToRequest[aIndex].iCancelUpsRequest;
+ iRequestData.iPlatSecPass = iArraySersToRequest[aIndex].iPlatSecPass;
+
+ // set properties for policy evaluator.
+ if (iArraySersToRequest[aIndex].iPolicyEvaluatorInvoked != 0)
+ {
+ //Reset various publisher and suscribe properties for policy evaluator.
+ TInt instance = iArraySersToRequest[aIndex].iPolicyEvaluatorInvoked;
+ iPropertyReader->SetL(instance,KPe_Status,CUpsProperty::EPolicyEvaluator, KUpsPeStatusReset);
+ iPropertyReader->SetL(instance,KPe_ClientSid,CUpsProperty::EPolicyEvaluator, 0);
+ iPropertyReader->SetL(instance,KPe_ServerSid,CUpsProperty::EPolicyEvaluator, 0);
+ TBool leaveEvaluator = iArraySersToRequest[aIndex].iLeaveEvaluator;
+ iPropertyReader->SetL(instance,KPe_Leave,CUpsProperty::EPolicyEvaluator, leaveEvaluator);
+ iPropertyReader->SetL(instance,KPe_Error,CUpsProperty::EPolicyEvaluator, KErrNone);
+ TBool holdEvaluatorOpen = iArraySersToRequest[aIndex].iHoldEvaluatorOpen;
+ iPropertyReader->SetL(instance,KPe_HoldEvaluatorOpen,CUpsProperty::EPolicyEvaluator, holdEvaluatorOpen);
+ TBool forcePrompt = iArraySersToRequest[aIndex].iForcePrompt;
+ iPropertyReader->SetL(instance,KPe_ForcePrompt,CUpsProperty::EPolicyEvaluator, forcePrompt);
+ iPropertyReader->SetL(instance,KPe_EvaluatorInfo,CUpsProperty::EPolicyEvaluator, 0);
+ }
+
+ // set properties for dialog creator.
+ if (iArraySersToRequest[aIndex].iDialogCreatorInvoked != 0)
+ {
+ //Reset various publisher and suscribe properties for dialog creator.
+ TInt instance = iArraySersToRequest[aIndex].iDialogCreatorInvoked;
+ iPropertyReader->SetL(instance,KDc_Status,CUpsProperty::EDialogCreator, KUpsDcStatusReset);
+ iPropertyReader->SetL(instance,KDc_ClientSid,CUpsProperty::EDialogCreator, 0);
+ iPropertyReader->SetL(instance,KDc_ServerSid,CUpsProperty::EDialogCreator, 0);
+ TBool dialogLeave = iArraySersToRequest[aIndex].iLeaveDialog ;
+ iPropertyReader->SetL(instance,KDc_Leave,CUpsProperty::EDialogCreator, dialogLeave);
+ iPropertyReader->SetL(instance,KDc_Error,CUpsProperty::EDialogCreator, KErrNone);
+ iPropertyReader->SetL(instance,KDc_UpsRequestedButtons,CUpsProperty::EDialogCreator, 0);
+ TInt buttonToPress = ButtonToInt(iArraySersToRequest[aIndex].iSelectDialogOption);
+ iPropertyReader->SetL(instance,KDc_WhichButtonToPress,CUpsProperty::EDialogCreator, buttonToPress);
+ TBool holdPrepareDialogOpen = iArraySersToRequest[aIndex].iHoldPrepareDialogOpen;
+ iPropertyReader->SetL(instance,KDc_HoldPrepareDialogOpen,CUpsProperty::EDialogCreator, holdPrepareDialogOpen);
+ TBool holdDisplayDialogOpen = iArraySersToRequest[aIndex].iHoldDisplayDialogOpen;
+ iPropertyReader->SetL(instance,KDc_HoldDisplayDialogOpen,CUpsProperty::EDialogCreator, holdDisplayDialogOpen);
+ TBool selectFingerprint = iArraySersToRequest[aIndex].iSelectFingerprint ;
+ iPropertyReader->SetL(instance,KDc_SelectFingerprint,CUpsProperty::EDialogCreator, selectFingerprint);
+ }
+
+ } // End of function.
+
+
+void CUpsClientStep::SetClientStatusCompleteL()
+/**
+ * Sets the status of the first policy evaluator invoked by the client to "KUpsClientCompleted" so that
+ * the coordinator step can determine when the step has completely finish and progress in Concurrent mode
+ *
+ * NOTE: When using the Coordinator in this manner, ALL requests made to UPS must invoke the same instance
+ * of the Policy Evaluator and Dialog Creator! e.g. Policy Evalutor 1 and Dialog Creator 1
+ */
+ {
+ TInt requestCount = iArraySersToRequest.Count();
+
+ for(TInt i=0; i<requestCount; ++i)
+ {
+ if (iArraySersToRequest[i].iPolicyEvaluatorInvoked != 0)
+ {
+ TInt instance = iArraySersToRequest[i].iPolicyEvaluatorInvoked;
+ iPropertyReader->SetL(instance,KPe_Status,CUpsProperty::EPolicyEvaluator, KUpsClientCompleted);
+ iPropertyReader->SetL(instance,KDc_Status,CUpsProperty::EDialogCreator, KUpsClientCompleted);
+ break;
+ }
+ }
+ }
+
+
+TUpsDecision CUpsClientStep::StringToTUpsDecision(const TPtrC& aString)
+ {
+ if(aString.CompareF(_L("Yes"))==0)
+ {
+ return TUpsDecision(EUpsDecYes);
+ }
+ else if(aString.CompareF(_L("No"))==0)
+ {
+ return TUpsDecision(EUpsDecNo);
+ }
+ else if(aString.CompareF(_L("SessionYes"))==0)
+ {
+ return TUpsDecision(EUpsDecSessionYes);
+ }
+ else
+ {
+ return TUpsDecision(EUpsDecSessionNo);
+ }
+ } // End of function.
+
+
+TPtrC CUpsClientStep::TUpsDecisionToString(TUpsDecision aDecision)
+ {
+ if(aDecision == EUpsDecYes)
+ {
+ return _L("Yes");
+ }
+ else if(aDecision == EUpsDecNo)
+ {
+ return _L("No");
+ }
+ else if(aDecision == EUpsDecSessionYes)
+ {
+ return _L("SessionYes");
+ }
+ else if(aDecision == EUpsDecSessionNo)
+ {
+ return _L("SessionNo");
+ }
+ else
+ {
+ return _L("Undefined");
+ }
+ } // End of function.
+
+
+TInt CUpsClientStep::ButtonToInt(const TPtrC& aButton)
+ {
+ if(aButton.CompareF(_L("Yes"))==0)
+ {
+ return KYes;
+ }
+ else if(aButton.CompareF(_L("No"))==0)
+ {
+ return KNo;
+ }
+ else if(aButton.CompareF(_L("Always"))==0)
+ {
+ return KAlways;
+ }
+ else if(aButton.CompareF(_L("SessionYes"))==0)
+ {
+ return KSessionYes;
+ }
+ else if(aButton.CompareF(_L("SessionNo"))==0)
+ {
+ return KSessionNo;
+ }
+ else if(aButton.CompareF(_L("Never"))==0)
+ {
+ return KNever;
+ }
+ else return KNone;
+
+ } // End of function.
+
+
+TBool CUpsClientStep::CheckResultsL(TInt aIndex)
+ {
+ TBool theReturn = ETrue;
+
+ if(iArraySersToRequest[aIndex].iExpectedError == KErrNone)
+ {
+ TUpsDecision expectedDecision = StringToTUpsDecision(iArraySersToRequest[aIndex].iAccessGranted);
+ if(expectedDecision != iReturnData.iDecision)
+ {
+ TPtrC decisionReceived(TUpsDecisionToString(iReturnData.iDecision));
+ ERR_PRINTF4(_L("%S: Decision expected: %S ,Decision received: %S"),&iTEFServerName, &iArraySersToRequest[aIndex].iAccessGranted, &decisionReceived);
+ theReturn=EFalse;
+ }
+ }
+
+ if(iArraySersToRequest[aIndex].iExpectedError != iReturnData.iError)
+ {
+ // Incorrect error code returned.
+ theReturn=EFalse;
+ ERR_PRINTF3(_L("%S: Error code expected: %d"),&iTEFServerName,iArraySersToRequest[aIndex].iExpectedError);
+ ERR_PRINTF3(_L("%S: Error code Received: %d"),&iTEFServerName,iReturnData.iError);
+ }
+
+ // checks returned properties from dialog creator & policy evaluator.
+ if ( CheckDialogCreatorResultsL(aIndex) == EFalse || CheckPolicyEvaluatorResultsL(aIndex) == EFalse)
+ {
+ theReturn = EFalse;
+ }
+
+ // display the request duration and check against the ini file value, if supplied
+ INFO_PRINTF3(_L("%S: UPS decision request duration: %u milliseconds"),&iTEFServerName, iReturnData.iRequestDuration);
+ if (iArraySersToRequest[aIndex].iRequestDurationThreshold > 0)
+ {
+ // check whether the request duration was too long
+ if (static_cast<TInt>(iReturnData.iRequestDuration) > iArraySersToRequest[aIndex].iRequestDurationThreshold)
+ {
+ ERR_PRINTF3(_L("%S: UPS decision request took too long: %u"), &iTEFServerName, iArraySersToRequest[aIndex].iRequestDurationThreshold);
+ theReturn = EFalse;
+ }
+ }
+
+ return theReturn;
+ } // End of function.
+
+
+TBool CUpsClientStep::CheckDialogCreatorResultsL(TInt aIndex)
+ {
+ TBool checkPassed = ETrue;
+
+ // checks return properties from dialog creator.
+ if (iArraySersToRequest[aIndex].iDialogCreatorInvoked != 0)
+ {
+ TInt instanceDia = iArraySersToRequest[aIndex].iDialogCreatorInvoked;
+ TInt dialogError = 0;
+ iPropertyReader->GetL(instanceDia,KDc_Error,CUpsProperty::EDialogCreator, dialogError);
+
+ // Checks that any error encountered by dialog creator is transmited by UPS to system server
+ if(dialogError != iReturnData.iError && dialogError!=KErrNone)
+ {
+ ERR_PRINTF3(_L("%S: Dialog creator found an error: %d"),&iTEFServerName,dialogError);
+ checkPassed = EFalse;
+ }
+
+ TInt clientSidDia=0;
+ iPropertyReader->GetL(instanceDia,KDc_ClientSid,CUpsProperty::EDialogCreator, clientSidDia);
+
+ if(iExpectedClientSid != clientSidDia)
+ {
+ ERR_PRINTF2(_L("%S: Client SID returned by dialog creator is not what is expected"),&iTEFServerName);
+ checkPassed = EFalse;
+ }
+
+ TInt buttonsDisplayed=0;
+ iPropertyReader->GetL(instanceDia,KDc_UpsRequestedButtons,CUpsProperty::EDialogCreator, buttonsDisplayed);
+ TInt32 expectedButtonsDisplayed=iArraySersToRequest[aIndex].iButtonsDisplayed;
+ if(expectedButtonsDisplayed != buttonsDisplayed)
+ {
+ ERR_PRINTF2(_L("%S: Incorrect buttons displayed."),&iTEFServerName);
+ ERR_PRINTF3(_L("%S: Buttons displayed expected: %d"),&iTEFServerName,expectedButtonsDisplayed);
+ ERR_PRINTF3(_L("%S: Buttons displayed received: %d"),&iTEFServerName,buttonsDisplayed);
+ checkPassed = EFalse;
+ }
+
+ TInt serverSidDia=0;
+ iPropertyReader->GetL(instanceDia,KDc_ServerSid,CUpsProperty::EDialogCreator, serverSidDia);
+
+ if(iServerId != serverSidDia)
+ {
+ ERR_PRINTF2(_L("%S: Server SID returned by dialog creator is not what is expected"),&iTEFServerName);
+ checkPassed = EFalse;
+ }
+
+ TInt serviceSidDia=0;
+ iPropertyReader->GetL(instanceDia,KDc_ServiceId,CUpsProperty::EDialogCreator, serviceSidDia);
+ if(serviceSidDia != iArraySersToRequest[aIndex].iServiceUID)
+ {
+ ERR_PRINTF3(_L("%S: Service ID reported by dialog creator is not what is expected: %d"),&iTEFServerName,serviceSidDia);
+ checkPassed = EFalse;
+ }
+ }
+
+ return checkPassed;
+ } // End of function.
+
+
+TBool CUpsClientStep::CheckPolicyEvaluatorResultsL(TInt aIndex)
+ {
+ TBool checkPassed = ETrue;
+
+ if (iArraySersToRequest[aIndex].iPolicyEvaluatorInvoked != 0)
+ {
+ TInt instanceEva = iArraySersToRequest[aIndex].iPolicyEvaluatorInvoked;
+ TInt evaluatorError = 0;
+
+ // Checks that any error encountered by policy evaluator is transmited by UPS to system server
+ iPropertyReader->GetL(instanceEva,KPe_Error,CUpsProperty::EPolicyEvaluator, evaluatorError);
+ if(evaluatorError != iReturnData.iError && evaluatorError!=KErrNone)
+ {
+ ERR_PRINTF3(_L("%S: Policy evaluator found an error: %d"),&iTEFServerName,evaluatorError);
+ checkPassed = EFalse;
+ }
+
+ TInt clientSidEva=0;
+ iPropertyReader->GetL(instanceEva,KPe_ClientSid,CUpsProperty::EPolicyEvaluator, clientSidEva);
+
+ if(iExpectedClientSid != clientSidEva)
+ {
+ ERR_PRINTF2(_L("%S: Client SID returned by policy evaluator is not what is expected"),&iTEFServerName);
+ checkPassed = EFalse;
+ }
+
+ TInt serverSidEva=0;
+ iPropertyReader->GetL(instanceEva,KPe_ServerSid,CUpsProperty::EPolicyEvaluator, serverSidEva);
+
+ if(iServerId != serverSidEva)
+ {
+ ERR_PRINTF2(_L("%S: Server SID returned by policy evaluator is not what is expected"),&iTEFServerName);
+ checkPassed = EFalse;
+ }
+
+ TInt serviceSidEva = 0;
+ iPropertyReader->GetL(instanceEva,KPe_ServiceId,CUpsProperty::EPolicyEvaluator, serviceSidEva);
+ if(serviceSidEva != iArraySersToRequest[aIndex].iServiceUID)
+ {
+ ERR_PRINTF3(_L("%S: Service ID reported by policy evaluator is not what is expected: %d"),&iTEFServerName,serviceSidEva);
+ checkPassed = EFalse;
+ }
+ if( iArraySersToRequest[aIndex].iForcePrompt)
+ {
+ // Read evaluator info
+ TInt evaluatorInfo = 0;
+ iPropertyReader->GetL(instanceEva,KPe_EvaluatorInfo,CUpsProperty::EPolicyEvaluator, evaluatorInfo);
+ if(evaluatorInfo != iArraySersToRequest[aIndex].iExpectedEvaluatorInfo)
+ {
+ ERR_PRINTF4(_L("%S: incorrect evaluator info:Expected: %d Received: %d"),&iTEFServerName,iArraySersToRequest[aIndex].iExpectedEvaluatorInfo,evaluatorInfo);
+ checkPassed = EFalse;
+ }
+ }
+ }
+
+ return checkPassed;
+ } // End of function.
+
+
+void CUpsClientStep::WaitThatFileAppearsL(const TDesC& aFileName)
+ {
+ RFs aFs;
+ aFs.Connect();
+
+ RProperty checkSwiState;
+
+ User::LeaveIfError(checkSwiState.Attach(KUidSystemCategory, Swi::KUidSoftwareInstallKey));
+ CleanupClosePushL(checkSwiState);
+
+ TRequestStatus swiStatus;
+ TInt swisState;
+
+ while(ETrue)
+ {
+ checkSwiState.Subscribe(swiStatus);
+ checkSwiState.Get(KUidSystemCategory,Swi::KUidSoftwareInstallKey, swisState);
+ if(((swisState & Swi::KSwisOperationMask) == Swi::ESwisNone) && BaflUtils::FileExists(aFs,aFileName))
+ {
+ checkSwiState.Cancel();
+ break;
+ }
+ User::WaitForRequest(swiStatus);
+ }
+
+ CleanupStack::PopAndDestroy(&checkSwiState);
+
+ //Wait for swiobserver to shutdown
+ while(ETrue)
+ {
+ _LIT(KSWIObserverName,"swiobserver.exe*");
+ TFindProcess finder(KSWIObserverName);
+ TFullName result;
+ if (KErrNone != finder.Next(result))
+ {
+ break;
+ }
+ User::After(4000);
+ }
+ } // End of function.