messagingfw/msgtestproduct/testutils/upssupport/refdialogcreator/source/refdialogcreator.cpp
--- /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);
+ }
+