commsfwtools/preparedefaultcommsdatabase/te_commsdat/src/notificationtester.cpp
changeset 0 dfb7c4ff071f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commsfwtools/preparedefaultcommsdatabase/te_commsdat/src/notificationtester.cpp	Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,124 @@
+// Copyright (c) 2005-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:
+//
+
+/**
+ @file notificationtester.cpp
+*/
+#include "notificationtester.h"
+ 
+CNotificationTester* CNotificationTester::NewL(const TDesC &aThreadName, CommsDat::CMDBSession* aSession, CommsDat::CMDBElement* aElement)
+	{
+	CNotificationTester* self = new(ELeave) CNotificationTester(aSession, aElement);
+	CleanupStack::PushL(self);
+	self->ConstructL(aThreadName);
+	CleanupStack::Pop(self);
+	
+	return self;
+	}
+	
+CNotificationTester::CNotificationTester(CommsDat::CMDBSession* aSession, CommsDat::CMDBElement* aElement)
+:CActive(0)
+	{
+	iSession = aSession;
+	iElement = aElement;
+	}
+
+void CNotificationTester::ConstructL(const TDesC &aThreadName)
+	{
+	iThreadRunning = EFalse;
+
+	iThread.Create(aThreadName, &ThreadFunction, KDefaultStackSize, NULL, this);
+	TRequestStatus waitSchedulerInstallation;  		// Create a rendezvous to ensure that thread
+	iThread.Rendezvous(waitSchedulerInstallation);  // completes installation of scheduler before ConstructL finishes
+	iThread.Resume(); 
+	
+	User::WaitForRequest(waitSchedulerInstallation);
+	}
+
+CNotificationTester::~CNotificationTester()
+	{
+	Cancel();
+	iThread.Close();
+	}
+	
+void CNotificationTester::SetTester()
+	{
+	if(iThread.ExitReason() >0 )
+		{
+		iReason = iThread.ExitReason();
+		return;
+		}
+
+	iElement->RequestNotification(*iSession, iStatus);
+	SetActive();
+	}
+	
+	
+void CNotificationTester::LogOn(TRequestStatus &aStatus)
+	{
+	iThread.Logon(aStatus);
+	}
+
+void CNotificationTester::RunL()
+	{
+	CActiveScheduler::Stop();
+	}
+
+void CNotificationTester::DoCancel()
+	{
+	if((iElement != NULL) && (iSession != NULL))
+		iElement->CancelNotification(*iSession, iStatus);
+	}
+	
+void CNotificationTester::CancelNotification(TRequestStatus& /*aStatus*/)	
+	{
+	// Note: this method is not called in the same thread that originally created and
+	// registered the CNotificationTester.  Consequently, issuing Cancel() here will perform
+	// the DoCancel(), which will complete the CNotificationTester in the creating thread,
+	// but then erroneously perform a User::WaitForRequest() in the *current* thread, swallowing
+	// the next unsuspecting completion signal in the current thread.
+	DoCancel();
+	}
+
+TInt CNotificationTester::ThreadFunction(TAny *aPtr)
+	{
+	CTrapCleanup* cleanup=CTrapCleanup::New();
+	
+	TRAPD(errCode, DoThreadFunctionL(aPtr));
+	
+	delete cleanup;
+	return errCode;
+	}
+	
+TInt CNotificationTester::DoThreadFunctionL(TAny *aPtr)
+	{
+	
+	CActiveScheduler* scheduler=new (ELeave) CActiveScheduler;
+    CleanupStack::PushL(scheduler);
+    CActiveScheduler::Install(scheduler);
+    ((CNotificationTester *)aPtr)->iThreadRunning = ETrue;	
+	CActiveScheduler::Add((CActive *)aPtr);
+	
+	CNotificationTester *tester = (CNotificationTester*)(aPtr);
+	tester->SetTester();
+	
+	RThread::Rendezvous(KErrNone); // Signal the main thread that notification has been requested
+
+	CActiveScheduler::Start();
+	CleanupStack::PopAndDestroy(scheduler);	
+	
+	return KErrNone;
+	}
+