diff -r 000000000000 -r dfb7c4ff071f commsfwtools/preparedefaultcommsdatabase/te_commsdat/src/notificationtester.cpp --- /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; + } +