messagingfw/msgtestproduct/testutils/upssupport/refdialogcreator/source/refdialogcreator.cpp
changeset 0 8e480a14352b
child 58 6c34d0baa0b1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingfw/msgtestproduct/testutils/upssupport/refdialogcreator/source/refdialogcreator.cpp	Mon Jan 18 20:36:02 2010 +0200
@@ -0,0 +1,326 @@
+// 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 "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 "refdialogcreator.h"
+#include <ecom/implementationproxy.h>
+#include <apaid.h>
+#include <apgcli.h>
+#include <ups/promptrequest.h>
+
+static const TUint KRefDialogCreatorImplementationId = 0x10283694;
+
+//static const TUint KRefNotifierImplementationId = 0x1028369B;
+
+CDialogCreator* CRefDialogCreator::CreateDialogCreatorL()
+/**
+Factory method that instantiates a new dialog creator ECOM plug-in.
+
+@return A pointer to the new reference dialog creator object.
+*/
+	{
+	CRefDialogCreator* self = new (ELeave)CRefDialogCreator();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+static const TImplementationProxy ImplementationTable[] = 
+	{
+	IMPLEMENTATION_PROXY_ENTRY(KRefDialogCreatorImplementationId, CRefDialogCreator::CreateDialogCreatorL)
+	};
+
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
+/**
+Standard ECOM factory
+*/
+	{
+	aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
+	return ImplementationTable;
+	}	
+	
+
+CRefDialogCreator::CRefDialogCreator() 
+/**
+Constructor
+*/
+	: CDialogCreator(), iPromptData(), iPromptDataPckg(iPromptData),
+	iPromptResultPckg(iPromptResult), iState(EIdle)
+	{
+	CActiveScheduler::Add(this);
+	}
+	
+CRefDialogCreator::~CRefDialogCreator()
+/**
+Destructor
+*/
+	{
+	Deque();
+	}
+
+void CRefDialogCreator::ConstructL()
+/**
+Second phase constructor
+*/
+	{
+	//connect to notifier server
+	}
+
+void CRefDialogCreator::DoCancel()
+	{
+	if (iState == EProcessResult)
+		{
+		//cancel the notifier operation
+		}
+	if (iClientStatus)
+		{
+		User::RequestComplete(iClientStatus, KErrCancel);
+		}
+	}
+	
+TInt CRefDialogCreator::RunError(TInt aError)
+	{
+	if (iClientStatus)
+		{
+		User::RequestComplete(iClientStatus, aError);
+		}
+	return KErrNone;
+	}
+
+void CRefDialogCreator::RunL()
+	{
+	User::LeaveIfError(iStatus.Int());
+	switch (iState)
+		{
+		case EPrepareDialog:
+			DoPrepareDialogL();
+			break;
+		case EDisplayDialog:
+			DoDisplayDialogL();
+			break;
+		case EProcessResult:
+			DoProcessResultL();
+			break;
+		default:
+			ASSERT(EFalse);			
+		}
+	}
+	
+	
+	
+void CRefDialogCreator::DoPrepareDialogL()
+	{
+	// Only one state at the moment but more should be
+	// added for long running operators e.g. querying the SIS registry
+	// or resolving the client entity.
+	ResolveClientNameL();
+	
+	// Get the vendor name for the client process
+	ResolveVendorNameL(iRequest->ClientVid());
+	
+	// Server / Service localized names generated in notifier plug-in. 
+	iPromptData.iServerSid = iRequest->ServerSid();
+	iPromptData.iServiceId = iRequest->ServiceId();
+	
+	// Use the options specified by the policy
+	iPromptData.iOptions = iPolicy->Options();
+	
+	// Add the descriptions of the fingerprints 
+	// The reference implementation only allows two fingerprints for a prompt
+	// but other implementations could support more.
+	// E.g. a specific phone number OR all phone numbers
+	if (iFingerprints->Count() > 0)
+		{
+		iPromptData.iDestination1.Copy((*iFingerprints)[0]->Description());
+		iPromptData.iNumDestinations++;
+		}
+		
+	if (iFingerprints->Count() > 1)
+		{
+		iPromptData.iDestination2.Copy((*iFingerprints)[1]->Description());
+		iPromptData.iNumDestinations++;
+		}
+	User::RequestComplete(iClientStatus, KErrNone);		
+	// DisplayDialog is invoked by the UPS, this just verifies 
+	// that PrepareDialog was called first.
+	iState = EDisplayDialog;
+	}
+ 
+	
+ void CRefDialogCreator::DoDisplayDialogL() 
+/**
+Uses the notifier framework to display the dialog.
+*/
+	{
+	TRequestStatus* status = &iStatus;
+	SetActive();
+	User::RequestComplete(status, KErrNone);
+	iState = EProcessResult;
+	}
+
+	
+void CRefDialogCreator::DoProcessResultL()
+/**
+Set the user response by reading strings form the file a
+*/
+	{
+ 	_LIT(KUserResPonseFile,"c:\\UserResponse.txt");
+ 	_LIT8(KUserResponseYes, "YES");
+ 	_LIT8(KUserResponseSession, "SESSION");
+ 	_LIT8(KUserResponseAlways, "ALWAYS");
+// 	_LIT8(KUserResponseNo, "NO"); Not required as the default response would be NO
+ 	_LIT8(KUserResponseNever, "NEVER");
+ 	
+ 
+ 	RFs fileServerSession;
+ 	fileServerSession.Connect();
+ 	RFile file;
+ 	
+ 	
+ 	file.Open(fileServerSession,KUserResPonseFile,EFileRead);
+ 	TBuf8<8> userResponse;
+ 	file.Read(userResponse);
+ 	file.Close();
+ 	userResponse.UpperCase();
+ 	TPromptResult policyEnum;
+	if(userResponse.CompareC(KUserResponseYes) == 0)
+		{
+		iPromptResult.iSelected=CPolicy::EYes;
+		}
+	else if(userResponse.CompareC(KUserResponseSession) == 0)
+		{
+		iPromptResult.iSelected = CPolicy::ESession;
+		}
+	else if(userResponse.CompareC(KUserResponseAlways) == 0)
+		{
+		iPromptResult.iSelected = CPolicy::EAlways;
+		}
+	else if(userResponse.CompareC(KUserResponseNever) == 0)
+		{
+		iPromptResult.iSelected = CPolicy::ENever;
+		}
+	else
+		{
+		iPromptResult.iSelected = CPolicy::ENo;
+		}
+		
+	if(iPromptResult.iSelected == CPolicy::EAlways || iPromptResult.iSelected == CPolicy::ENever)
+	 	{ 
+		// The Always or Never option was selected so return the fingerprint 
+		// for the new decision record.
+		// 
+		// In this implementation a copy of the original fingerprint is returned. However,
+		// it is permitted to return a different fingerprint e.g. a modifier description.		
+		if (iPromptResult.iDestination >= 0 && iPromptResult.iDestination < iFingerprints->Count())		
+			{
+			*iFingerprint = (*iFingerprints)[iPromptResult.iDestination];
+			}
+		else
+			{
+			ASSERT(EFalse);
+			}
+
+	 	}
+	*iOptionSelected =	iPromptResult.iSelected;
+	*iEvaluatorInfo = 0;	// TODO add example
+	iState = EIdle;
+	User::RequestComplete(iClientStatus, KErrNone);		
+	}
+
+void CRefDialogCreator::ResolveVendorNameL(TVendorId aVid)
+/**
+Looks up the localized vendor name for the client process and writes
+this to iPromptData.iVendorName.
+
+Typically, this would be resolved from the SIS registry or a lookup table.
+
+@param aVid	The vendor id of the client process.
+*/
+	{
+	// TODO SIS registry lookup	
+	if (aVid.iId == 0x70000001)
+		{
+		_LIT(KSymbian, "Symbian Software Ltd");
+		iPromptData.iVendorName.Copy(KSymbian);
+		}
+	else 
+		{
+		_LIT(KUnknown, "Unknown vendor");
+		iPromptData.iVendorName.Copy(KUnknown);
+		}
+	}
+	
+void CRefDialogCreator::ResolveClientNameL()
+/**
+Generates a human readable name for the client process. In order of 
+preference the following data is returned
+*/
+	{
+	RThread clientThread;
+	User::LeaveIfError(clientThread.Open(iRequest->ClientThreadId()));
+	CleanupClosePushL(clientThread);
+	
+	RProcess clientProcess;
+	User::LeaveIfError(clientThread.Process(clientProcess));
+	CleanupClosePushL(clientProcess);
+	iPromptData.iClientName.Copy(clientProcess.FileName());
+	
+	CleanupStack::PopAndDestroy(2, &clientThread); // clientThread, clientProcess	
+	}
+
+
+// From CDialogCreator
+void CRefDialogCreator::PrepareDialog(
+	const UserPromptService::CPromptRequest& aRequest, const CPolicy& aPolicy,			
+	const RPointerArray<CFingerprint>& aFingerprints, const CClientEntity* aClientEntity,
+	const TAny* aEvalPrivateData, TRequestStatus& aStatus)
+	{
+	aStatus = KRequestPending;
+	iClientStatus = &aStatus;
+	
+	iRequest = &aRequest;
+	iPolicy = &aPolicy;
+	iFingerprints = &aFingerprints;
+	iEvalPrivateData = aEvalPrivateData;
+	(void) aClientEntity;
+
+	// Kick off dialog creator state machine
+	iState = EPrepareDialog;
+	iStatus = KRequestPending;
+	TRequestStatus* status = &iStatus;
+	SetActive();
+	User::RequestComplete(status, KErrNone);
+	}
+	
+void CRefDialogCreator::DisplayDialog(CPolicy::TOptions& aOptions, const CFingerprint*& aFingerprint,
+		TUint& aEvaluatorInfo, TRequestStatus& aStatus)
+	{	
+	aStatus = KRequestPending;
+	iClientStatus = &aStatus;
+	
+	iOptionSelected = &aOptions;
+	iFingerprint = &aFingerprint;
+	aFingerprint = 0;
+	iEvaluatorInfo = &aEvaluatorInfo;
+	iClientStatus = &aStatus;
+	
+	// Start state machine
+	ASSERT(iState == EDisplayDialog); // PrepareDialog should have been called first
+	iStatus = KRequestPending;
+	TRequestStatus* status = &iStatus;
+	SetActive();
+	User::RequestComplete(status, KErrNone);
+	}
+