authorisation/userpromptservice/examples/integration/tmsgapp/tmsgapp.cpp
changeset 8 35751d3474b7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/authorisation/userpromptservice/examples/integration/tmsgapp/tmsgapp.cpp	Thu Sep 10 14:01:51 2009 +0300
@@ -0,0 +1,212 @@
+/*
+* 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: 
+* Example Code
+*
+*/
+
+
+#include "tmsgapp.h"
+#include <e32debug.h>
+#include <f32file.h>
+
+// UPS client library is only included to allow the test application
+// to reset its decision records.
+#include <ups/upsclient.h>	
+
+_LIT(KTo, "+442071541000");
+_LIT_SECURE_ID(KMySecureId, 0x01000003);
+
+// CAlarm ********************************************************************
+inline CAlarm::CAlarm() :CTimer(-1) {CActiveScheduler::Add(this);}
+inline void CAlarm::ConstructL() {CTimer::ConstructL();}
+
+void CAlarm::RunL() 
+	{
+	iObserver->WakeupL();
+	}
+
+void CAlarm::After(MAlarmObserver* aObserver, TTimeIntervalMicroSeconds32 aInterval)
+	{
+	iObserver = aObserver;
+	CTimer::After(aInterval);
+	}
+
+// CSendMessages *************************************************************
+CSendMessages::CSendMessages() : CActive(EPriorityStandard) 
+	{
+	CActiveScheduler::Add(this);
+	}
+
+CSendMessages::~CSendMessages() 
+	{
+	Deque();
+	iMsgCon.Close();
+	}
+
+CSendMessages* CSendMessages::NewLC()
+	{
+	CSendMessages* self = new(ELeave) CSendMessages();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+void CSendMessages::ConstructL()
+	{
+	iAlarm.ConstructL();
+	User::LeaveIfError(iMsgCon.Connect());
+	TRequestStatus* status = &iStatus;
+	*status = KRequestPending;
+	SetActive();
+	User::RequestComplete(status, KErrNone);
+	}
+
+TInt CSendMessages::RunError(TInt /* aError */)
+	{
+	CActiveScheduler::Stop(); // Non-recoverable error
+	return KErrNone;
+	}
+
+void CSendMessages::DoCancel()
+	{
+	iMsgCon.CancelSendMsg();	
+	iAlarm.Cancel();
+	}
+
+void CSendMessages::WakeupL()
+/**
+ * Timeout the pending message.
+ */
+	{
+	iMsgCon.CancelSendMsg();
+	}
+
+void CSendMessages::RunL()
+/**
+ * Send a series of test messages and cancellations that should trigger
+ * user prompts.
+ * All test cases timeout after KDefaultTimeout to enable automated tests
+ */
+	{
+	TInt err = iStatus.Int();
+	if (iStatus != KErrNone && iStatus != KErrCancel && iStatus != KErrPermissionDenied) 
+		{
+		User::Leave(err);
+		}
+	iAlarm.Cancel();
+	
+	RDebug::Printf("Test %d completed with error %d", iTestNum, 0);
+		
+	++iTestNum;	// move on to next test case	
+	switch (iTestNum)
+		{
+		case 1:
+			{
+			// Send message and wait for user prompt to complete			
+			_LIT(KBody, "Hello");
+			iMsgCon.SendMsg(KTo, KBody, iStatus);
+			SetActive();
+			iAlarm.After(this, KDefaultTimeout);
+			break;
+			}
+		case 2:
+			{
+			// Send a message and cancel straight away, should be no user prompt
+			_LIT(KBody, "Hello - Cancel immediate");
+			iMsgCon.SendMsg(KTo, KBody, iStatus);
+			SetActive();
+			iAlarm.After(this, 1);
+			break;
+			}
+		case 3:
+			{
+			// Send a message and attempt to cancel whilst the user prompt is being displayed.
+			_LIT(KBody, "Hello - Cancel 5 secs");
+			iMsgCon.SendMsg(KTo, KBody, iStatus);
+			SetActive();
+			iAlarm.After(this, 5 * 1000 * 1000);
+			break;
+			}
+		case 4:
+			{
+			// Force the message server to exit
+			iMsgCon.Close();
+			_LIT(KInfo, "Waiting for messageserver to exit");
+			User::InfoPrint(KInfo);
+			User::After(5 * 1000 * 1000);	
+			User::LeaveIfError(iMsgCon.Connect());	// reconnect
+
+			// Send a message to the new server instance
+			_LIT(KBody, "Hello again");
+			iMsgCon.SendMsg(KTo, KBody, iStatus);
+			SetActive();
+			iAlarm.After(this, KDefaultTimeout);
+			break;
+			}
+		default:
+			// All done
+			CActiveScheduler::Stop();
+			break;
+		}	
+	}
+
+void DeleteOldDecisionsL()
+/**
+ * Delete all decision records for this test application
+ */
+	{
+	UserPromptService::RUpsManagement m;
+	CleanupClosePushL(m);
+	User::LeaveIfError(m.Connect());
+	UserPromptService::CDecisionFilter* f = UserPromptService::CDecisionFilter::NewLC();
+	f->SetClientSid(KMySecureId, UserPromptService::EEqual);
+	m.RemoveDecisionsL(*f);
+	CleanupStack::PopAndDestroy(2, &m); // m, f
+	}
+
+void MainL()
+	{
+	// Create active scheduler, reset UPS and start tests
+	CActiveScheduler* s=new(ELeave) CActiveScheduler;	
+	CleanupStack::PushL(s);
+	CActiveScheduler::Install(s);
+	DeleteOldDecisionsL();	// reset decision database
+	CSendMessages* test = CSendMessages::NewLC();
+	s->Start();
+	CleanupStack::PopAndDestroy(2, s); // s, test
+	
+	// Add log file for automated test environment
+	RFs fs;
+	User::LeaveIfError(fs.Connect());
+	CleanupClosePushL(fs);
+	RFile log;
+	CleanupClosePushL(log);
+	User::LeaveIfError(log.Replace(fs, _L("c:\\tmsgapp.log"), EFileShareAny|EFileWrite));
+	User::LeaveIfError(log.Write(_L8("\n\n0 tests failed out of 1\n")));
+	CleanupStack::PopAndDestroy(2, &fs);
+	}
+
+GLDEF_C TInt E32Main()
+	{
+	CTrapCleanup* cleanup = CTrapCleanup::New();
+	if(cleanup == NULL)
+		{
+		return KErrNoMemory;
+		}
+	TRAP_IGNORE(MainL());
+	delete cleanup;
+	return KErrNone;
+	}
+