diff -r 7259cf1302ad -r 169364e7e4b4 stif/TestServer/src/Testexecution.cpp --- a/stif/TestServer/src/Testexecution.cpp Tue Jul 06 16:05:13 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4821 +0,0 @@ -/* -* Copyright (c) 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: This module contains implementation of CTestExecution -* class member functions. CTestExecution class handles a test -* execution subsession specific operations. -* -*/ - -// INCLUDE FILES -#include -#include -#include "TestEngineClient.h" -#include "StifTFwIfProt.h" -#include -#include "TestServer.h" -#include "TestServerModuleIf.h" -#include "TestServerCommon.h" -#include "PrintQueue.h" -#include "TestServerEvent.h" -#include "TestThreadContainer.h" -#include "STIFMeasurement.h" - -// EXTERNAL DATA STRUCTURES - -// EXTERNAL FUNCTION PROTOTYPES - -// CONSTANTS - -// MACROS - -// LOCAL CONSTANTS AND MACROS - -// MODULE DATA STRUCTURES - -// LOCAL FUNCTION PROTOTYPES - -// FORWARD DECLARATIONS - -// ==================== LOCAL FUNCTIONS ======================================= - -// ================= MEMBER FUNCTIONS ========================================= - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: NewL - - Description: Returns new CTestExecution instance. - - Parameters: CTestModule* aModuleSession :in: "Parent" module - TInt aCaseNumber :in: Test case number - const TFileName& aConfig :in: Configuration filename - - Return Values: CTestExecution* New instance - - Errors/Exceptions: Function leaves if memory allocation fails or - CTestExecution construction leaves. - Panics is aModuleSession is NULL. - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -CTestExecution* CTestExecution::NewL( CTestModule* aModuleSession, - TInt aCaseNumber, - const TFileName& aConfig ) - { - - __ASSERT_ALWAYS ( aModuleSession, - CTestServer::PanicServer( ENullModuleSession ) ); - - CTestExecution* self=new( ELeave ) CTestExecution; - CleanupClosePushL( *self ); - self->ConstructL( aModuleSession, aCaseNumber, aConfig ); - CleanupStack::Pop(); - - return self; - - } - - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: CTestExecution - - Description: Constructor. - Initialises member variables whose default state is not zero or NULL. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -CTestExecution::CTestExecution() : - iConfig( 0, 0 ), - iTestThreadOpen( EFalse ), - iTestThreadFailure( ETestThreadOk ) - { - - iPrintNotifyAvailable = EFalse; - iThreadState = ENotStarted; - iRemoteSendAvailable = EFalse; - iRemoteReceiveAvailable = EFalse; - iEventNotifyAvailable = EFalse; - iCommandNotifyAvailable = EFalse; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: ~CTestExecution - - Description: Destructor - - Parameters: None - - Return Values: None - - Errors/Exceptions: Panics is threadmutex is taken. - - Status: Approved - -------------------------------------------------------------------------------- -*/ -CTestExecution::~CTestExecution() - { - // Thread must be stopped before CTestExecution can be deleted - if( iThreadState == EOnGoing ) - { - if( iModuleContainer != NULL ) - { - iModuleContainer->KillThread( KErrCancel ); - } - delete iModuleContainer; - iModuleContainer = NULL; - CTestServer::PanicServer( EClosingWhileTestRunning ); - } - - delete iPrintHandler; - iPrintHandler = NULL; - delete iEventHandler; - iEventHandler = NULL; - delete iSndHandler; - iSndHandler = NULL; - delete iRcvHandler; - iRcvHandler = NULL; - delete iInterferenceHandler; - iInterferenceHandler = NULL; - delete iMeasurementHandler; - iMeasurementHandler = NULL; - delete iCommandHandler; - iCommandHandler = NULL; - - // Test interference array(Needed cases when test interference thread is - // needed to Kill()) - iSTIFTestInterferenceArray.Reset(); - iSTIFTestInterferenceArray.Close(); - - // Reset test measurement array - iMeasurementHandlingArray.Reset(); - iMeasurementHandlingArray.Close(); - - // iPrintQueue must be emptied here, because it items are allocated from server heap - delete iPrintQueue; - iPrintQueue = NULL; - - // Delete name buffer - delete iConfigNameBuffer; - iConfigNameBuffer = NULL; - - delete iTestCaseArgs; - iTestCaseArgs = NULL; - - iStateEvents.ResetAndDestroy(); - iStateEvents.Close(); - - iEventArray.ResetAndDestroy(); - iEventArray.Close(); - - // Close mutexes - if ( iPrintMutex.Handle() != 0 ) iPrintMutex.Close(); - if ( iEventMutex.Handle() != 0 ) iEventMutex.Close(); - if ( iSndMutex.Handle() != 0 ) iSndMutex.Close(); - if ( iRcvMutex.Handle() != 0 ) iRcvMutex.Close(); - if ( iInterferenceMutex.Handle() != 0 ) iInterferenceMutex.Close(); - if ( iMeasurementMutex.Handle() != 0 ) iMeasurementMutex.Close(); - if ( iCommandMutex.Handle() != 0 ) iCommandMutex.Close(); - - // Mutex for testcomplete and cancel operations. Close mutex - if ( iTestThreadMutex.Handle() != 0 ) iTestThreadMutex.Close(); - - // Close semaphores - if ( iPrintSem.Handle() != 0 ) iPrintSem.Close(); - if ( iEventSem.Handle() != 0 ) iEventSem.Close(); - if ( iSndSem.Handle() != 0 ) iSndSem.Close(); - if ( iRcvSem.Handle() != 0 ) iRcvSem.Close(); - if ( iInterferenceSem.Handle() != 0 ) iInterferenceSem.Close(); - if ( iMeasurementSem.Handle() != 0 ) iMeasurementSem.Close(); - //if ( iReceiverSem.Handle() != 0 ) iReceiverSem.Close(); - if ( iCommandSem.Handle() != 0 ) iCommandSem.Close(); - - iMessageQueue.Close(); - - iTestThread.Close(); - - delete iCommandDef; - iCommandDef = NULL; - } - - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: ConstructL - - Description: Second level constructor - - Parameters: CTestModule* aModuleSession :in: "Parent" module - TInt aCaseNumber :: :in: Test case number - const TFileName& aConfig :in: Configuration filename - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestExecution::ConstructL( CTestModule *aModuleSession, - TInt aCaseNumber, - const TFileName& aConfig ) - { - - // Get the parameters - iModuleSession = aModuleSession; - iCaseNumber = aCaseNumber; - - // Construct heap buffer for configuration file - iConfigNameBuffer = HBufC::NewL( aConfig.Length() ); - iConfig.Set ( iConfigNameBuffer->Des() ); - iConfig.Copy ( aConfig ); - - // Create mutexes - User::LeaveIfError( iPrintMutex.CreateLocal() ); - User::LeaveIfError( iEventMutex.CreateLocal() ); - User::LeaveIfError( iSndMutex.CreateLocal() ); - User::LeaveIfError( iRcvMutex.CreateLocal() ); - User::LeaveIfError( iInterferenceMutex.CreateLocal() ); - User::LeaveIfError( iMeasurementMutex.CreateLocal() ); - User::LeaveIfError( iCommandMutex.CreateLocal() ); - - // Mutex for testcomplete and cancel operations. Create mutex - User::LeaveIfError( iTestThreadMutex.CreateLocal() ); - - // Create semaphores - User::LeaveIfError( iPrintSem.CreateLocal( 0 ) ); - User::LeaveIfError( iEventSem.CreateLocal( 0 ) ); - User::LeaveIfError( iSndSem.CreateLocal( 0 ) ); - User::LeaveIfError( iRcvSem.CreateLocal( 0 ) ); - User::LeaveIfError( iInterferenceSem.CreateLocal( 0 ) ); - User::LeaveIfError( iMeasurementSem.CreateLocal( 0 ) ); - //User::LeaveIfError( iReceiverSem.CreateLocal( 0 ) ); - User::LeaveIfError( iCommandSem.CreateLocal( 0 ) ); - - // Create handlers - iPrintHandler = CPrintHandler::NewL( *this ); - iEventHandler = CEventHandler::NewL( *this ); - iSndHandler = CSndHandler::NewL( *this ); - iRcvHandler = CRcvHandler::NewL( *this ); - iInterferenceHandler = CInterferenceHandler::NewL( *this ); - iMeasurementHandler = CMeasurementHandler::NewL( *this ); - iCommandHandler = CCommandHandler::NewL( *this ); - - // Create print queue - iPrintQueue = CPrintQueue::NewL(); - - // Start print handler - iPrintHandler->StartL(); - - // Start rcv handler - iRcvHandler->StartL(); - - // Start interference handler - iInterferenceHandler->StartL(); - - // Start measurement handler - iMeasurementHandler->StartL(); - - iCommandDef = CCommandDef::NewL(); - } - - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: RunTestCase - - Description: Starts to execute test case in separate thread. - - Parameters: const RMessage& aMessage :in: Message from client. - - Return Values: TInt Error code - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CTestExecution::RunTestCase( const RMessage2& aMessage ) - { - - __TRACE ( KInit, ( _L( "CTestExecution::RunTestCase in" ) ) ); - - TInt ret = KErrNone; - - // Store message to be completed when case is finished - iTestExeMessage = aMessage; - - iFullResult.iStartTime.HomeTime(); - - delete iTestCaseArgs; - iTestCaseArgs = NULL; - - TInt testCaseArgsLength = iTestExeMessage.GetDesLength( 1 ); - if ( ( testCaseArgsLength != KErrArgument ) && ( testCaseArgsLength != KErrBadDescriptor ) ) - { - iTestCaseArgs = HBufC::New( testCaseArgsLength ); - if ( iTestCaseArgs == NULL ) - { - _LIT(KRunError,"Can't allocate memory for test case arguments"); - __TRACE ( KError, ( CStifLogger::ERed, KRunError() ) ); - CompleteTestExecution( KErrNone, - TFullTestResult::ECaseException, - KErrNoMemory, - KErrGeneral, - KRunError ); - return KErrNone; - } - - TPtr testCaseArgsPtr( iTestCaseArgs->Des() ); - TRAP( ret, iTestExeMessage.Read( 1, testCaseArgsPtr ) ); - if ( ret != KErrNone ) - { - _LIT(KRunError,"Can't read test case arguments"); - __TRACE ( KError, ( CStifLogger::ERed, KRunError() ) ); - CompleteTestExecution( KErrNone, - TFullTestResult::ECaseException, - ret, - KErrGeneral, - KRunError ); - return KErrNone; - } - } - - // Get a test module, which executes the test case. - // The test module will be freed either when the test case - // completes, or the test case is aborted. - ret = iModuleSession->GetTestModule( iModuleContainer, iConfig ); - if ( ret != KErrNone || iModuleContainer == NULL ) - { - _LIT(KRunError,"Can't get test module"); - __TRACE ( KError, ( CStifLogger::ERed, KRunError() ) ); - CompleteTestExecution( KErrNone, - TFullTestResult::ECaseException, - ret, - KErrGeneral, - KRunError ); - return KErrNone; - } - - - // Thread is created, so all thread specific operations are possible, - // even if thread is not yet resumed, so mark thread to be "Running" - SetThreadState ( EOnGoing ); - - // Start the test - iModuleContainer->SetExecutionSubSession( this ); - iModuleContainer->RunTestCase( iConfig, iCaseNumber, aMessage ); - - __TRACE ( KRunTestCase, ( _L( "CTestExecution::RunTestCase out. Case ongoing" ) ) ); - - return KErrNone; - - } - - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: NotifyPrint - - Description: Handles print request from engine. If print queue is empty, - message is stored to be used later when there is something to - print, otherwise the first queue item is returned and request - completes immediately. - - Parameters: const RMessage& aMessage :in: Message from client. - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CTestExecution::NotifyPrint( const RMessage2& aMessage ) - { - - __ASSERT_ALWAYS( iPrintNotifyAvailable == EFalse, - CTestServer::PanicServer( EPrintQueueBroken ) ); - - // Get first item from queue - TPrintQueueItem *item = iPrintQueue->Pop(); - - if ( item == NULL ) - { - - // If thread can't print anymore, and queue is empty, then - // complete with Eof, because there will not be any new prints - if ( iThreadState == EFinished || iThreadState == ECancelled ) - { - __TRACE ( KPrint, ( _L( "CTestExecution::NotifyPrint to finished thread" ) ) ); - aMessage.Complete ( KErrEof ); - } - else - { - // Print request available, do not complete request - iNotifyPrintMessage = aMessage; - iPrintNotifyAvailable = ETrue; - } - - } - else - { - // Construct message - TTestProgress progress; - progress.iPosition = item->iPriority; - progress.iDescription = item->iData1; - progress.iText = item->iData2; - - iNotifyPrintMessage = aMessage; - // Write message to client space and complete request - WritePrint( progress ); - - delete item; - } - - - return KErrNone; - - } -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: DoNotifyPrint - - Description: If print notification available, notification is copied to - client memory space and request is completed. - Else new print queue item is created and appended to print - queue. If queue is full or memory can't be allocated, - then message will be discarded. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CTestExecution::DoNotifyPrint() - { - - if ( iPrintNotifyAvailable ) - { - // Write message to client space - WritePrint( iProgress ); - } - else - { - - TPrintQueueItem *item = - new TPrintQueueItem( iProgress.iPosition, - iProgress.iDescription, - iProgress.iText ); - - if ( item != NULL ) - { - // Item constructed ok, add it to queue - if ( iPrintQueue->Push( *item ) != KErrNone ) - { - // Queue is full, clean-up - delete item; - } - } - // else: Could not construct TPrintQueueItem, no free memory. - // drop printing - } - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: DoNotifyInterference - - Description: Handles Test Interference thread append and remove operations. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CTestExecution::DoNotifyInterference() - { - // Information for this context => information is in this thread's heap and - // if CUndertaker::RunL is called then test interface thread can called - // with function call and kill() test interference thread - - // Take information from struct given in - // CTestThreadContainer::AddInterferenceThread or - // CTestThreadContainer::RemoveInterferenceThread - - RThread thread; - TInt ret = thread.Open ( iTestInterference.iThreadId ); - if( ret != KErrNone ) - { - RDebug::Print( _L("CTestExecution::DoNotifyInterference %d"), ret ); - User::Panic( _L("CTestExecution::DoNotifyInterference"), ret ); - } - - if ( iTestInterference.iOperation == TTestInterference::EAppend ) - { - iSTIFTestInterferenceArray.Append( thread ); - } - else if (iTestInterference.iOperation == TTestInterference::ERemove ) - { - // Remove thread from Array.Test interference thread is stopped and killed - // successfully - for( TInt i = 0; i < iSTIFTestInterferenceArray.Count(); i++ ) - { - if( iSTIFTestInterferenceArray[i].Id() == thread.Id() ) - { - iSTIFTestInterferenceArray.Remove( i ); - break; - } - } - } - else - { - return; - } - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: DoNotifyMeasurement - - Description: Handles test measurement operations: NewL, Start and Stop. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -TInt CTestExecution::DoNotifyMeasurement() - { - // Information for this context => information is in this thread's heap: - // From CUndertaker::RunL() or CTestModuleContainer::RunL() method can - // handle stop and clean operations if these operations are not done - // before. - // Erronous cases(CUndertaker::RunL will be called) or when test case is - // executed(CTestModuleContainer::RunL() will be called) there can handle - // test measurement stop and clean operation. - - if( iTestMeasurement.iMeasurementStruct.iMeasurementOperation == - CSTIFTestMeasurement::KMeasurementNew) - { - // Check that same measurement module don't try to create several times - // Only one measurement type per test is allowed - for( TInt i = 0; i < iMeasurementHandlingArray.Count(); i++ ) - { - if( iMeasurementHandlingArray[i]->iMeasurementModulePtr->MeasurementType() == - iTestMeasurement.iMeasurementStruct.iMeasurementType ) - { - return KErrAlreadyExists; - } - } - - TMeasurementHandling* measurementHandling = NULL; - measurementHandling = new TMeasurementHandling(); - - TBuf modulename; - if( iTestMeasurement.iMeasurementStruct.iMeasurementType == 1 ) - { - modulename.Copy( KStifMeasurement01 ); - } - else if( iTestMeasurement.iMeasurementStruct.iMeasurementType == 2 ) - { - modulename.Copy( KStifMeasurement02 ); - } - else if( iTestMeasurement.iMeasurementStruct.iMeasurementType == 3 ) - { - modulename.Copy( KStifMeasurement03 ); - } - else if( iTestMeasurement.iMeasurementStruct.iMeasurementType == 4 ) - { - modulename.Copy( KStifMeasurement04 ); - } - else if( iTestMeasurement.iMeasurementStruct.iMeasurementType == 5 ) - { - modulename.Copy( KStifMeasurement05 ); - } - else if( iTestMeasurement.iMeasurementStruct.iMeasurementType == 6 ) - { - modulename.Copy( KStifMeasurementBappea ); - } - else - { - __TRACE( KError, ( _L("CTestExecution::DoNotifyMeasurement(): unknown measurement type" ) ) ); - return KErrArgument; - } - - // Loading should work with and without '.dll' extension. - TInt r = measurementHandling->iMeasurementModule.Load( modulename ); - if ( r != KErrNone ) - { - __TRACE( KError, ( CStifLogger::EError, _L("Can't load test measurement module[%S], code = %d"), - &modulename, r ) ); - delete measurementHandling; - return KErrNotFound; - } - else - { - //Print test measururement module name - __TRACE( KInit, ( _L("Loaded test measurement module[%S]"), - &modulename ) ); - } - - // Get pointer to first exported function - // Verify that there is function - measurementHandling->iMeasurementLibEntry = (CTestMeasurementFactory) measurementHandling->iMeasurementModule.Lookup( 1 ); - if ( measurementHandling->iMeasurementLibEntry == NULL ) - { - // New instance can't be created - __TRACE( KInit, (_L( "Test measurement module instance cannot create." ) ) ); - measurementHandling->iMeasurementModule.Close(); - delete measurementHandling; - return KErrNotFound; - } - else - { - __TRACE ( KInit, ( _L("Pointer to 1st exported received"))); - } - - CSTIFTestMeasurementImplementation* measurement; - measurement = NULL; - - // initialize test measurement module - __TRACE ( KVerbose, (_L("Calling 1st exported at 0x%x"), (TUint32) measurementHandling->iMeasurementLibEntry )); - TRAPD ( err, measurement = (*measurementHandling->iMeasurementLibEntry)( - iTestMeasurement.iMeasurementStruct.iConfigurationInfo, iTestMeasurement.iMeasurementStruct.iMeasurementType ) ); - - // Handle leave from test module - if ( err != KErrNone ) - { - __TRACE (KError, ( CStifLogger::EError, _L( "Leave when calling 1st exported function, code %d"), err ) ); - delete measurementHandling; - return err; - } - else if ( measurementHandling->iMeasurementLibEntry == NULL ) // Handle NULL from test measurement - { - __TRACE (KError, ( CStifLogger::EError, _L( "NULL pointer received when constructing test measurement module" ) ) ); - delete measurementHandling; - // Set error codes - return KErrNoMemory; - } - else - { - measurementHandling->iMeasurementModulePtr = measurement; - __TRACE (KInit, (_L("Entrypoint successfully called, Measurement module instance at 0x%x"), - (TUint32)measurementHandling->iMeasurementLibEntry ) ); - } - iMeasurementHandlingArray.Append( measurementHandling ); - } // End of NewL operations - - else if( iTestMeasurement.iMeasurementStruct.iMeasurementOperation == - CSTIFTestMeasurement::KMeasurementStart) - { - for( TInt i = 0; i < iMeasurementHandlingArray.Count(); i++ ) - { - if( iMeasurementHandlingArray[i]->iMeasurementModulePtr->MeasurementType() == iTestMeasurement.iMeasurementStruct.iMeasurementType ) - { - return iMeasurementHandlingArray[i]->iMeasurementModulePtr->Start(); - } - } - - } - else if( iTestMeasurement.iMeasurementStruct.iMeasurementOperation == - CSTIFTestMeasurement::KMeasurementStop) - { - for( TInt i = 0; i < iMeasurementHandlingArray.Count(); i++ ) - { - if( iMeasurementHandlingArray[i]->iMeasurementModulePtr->MeasurementType() == iTestMeasurement.iMeasurementStruct.iMeasurementType ) - { - TInt stop_ret = iMeasurementHandlingArray[i]->iMeasurementModulePtr->Stop(); - delete iMeasurementHandlingArray[i]; - iMeasurementHandlingArray.Remove(i); - return stop_ret; - } - } - } - else - { - __TRACE (KError, ( CStifLogger::EError, _L("CTestExecution::DoNotifyMeasurement(): Not supported operation") ) ); - return KErrNotSupported; - } - - return KErrNone; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: WritePrint - - Description: Writes print notification to client memory space. - - Parameters: const TInt aPriority :in: Priority - const TStifInfoName& aDes :in: Description - const TName& aBuffer :in: Value - - Return Values: TInt Return value from message write - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CTestExecution::WritePrint( TTestProgress& aProgress ) - { - - TTestProgressPckg progressPckg( aProgress ); - - // Write message to client space - TRAPD( res, iNotifyPrintMessage.WriteL( 0, progressPckg ) ); - - iPrintNotifyAvailable = EFalse; - - // Complete request with possible error code - iNotifyPrintMessage.Complete( res ); - - return res; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: NotifyEvent - - Description: Handles event request from engine. - - ESetEvent and EUnsetEvent change event status. EEnable enables - event notify. - - Parameters: const RMessage& aMessage :in: Message from client. - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CTestExecution::NotifyEvent( const RMessage2& aMessage ) - { - - TEventIf event; - TEventIfPckg eventPckg( event ); - - TRAPD( res, aMessage.ReadL( 0, eventPckg ) ); - - if( res != KErrNone ) - { - __TRACE( KError, ( _L( "CTestExecution::NotifyEvent: ReadL failed" ) )); - return res; - } - - switch( event.Type() ) - { - case TEventIf::ESetEvent: - { - TInt ind = 0; - TInt count = iEventArray.Count(); - for( ind=0; ind < count; ind++ ) - { - if( iEventArray[ind]->Name() == event.Name() ) - { - __TRACE( KMessage, ( _L( "CTestExecution::NotifyEvent(%d): SetEvent %S ( count %i )" ), - this, &event.Name(), count ) ); - TEventIf::TEventType etype = TEventIf::EIndication; - // To get state events working with testcombiner - if( ( event.EventType() == TEventIf::EState ) || - ( iEventArray[ind]->EventType() == TEventIf::EState ) ) - { - etype = TEventIf::EState; - } - iEventArray[ind]->Set( etype ); - } - } - } - break; - case TEventIf::EUnsetEvent: - { - return UnsetEvent( event, aMessage ); - } - case TEventIf::EEnable: - { - // Store event message - iNotifyEventMessage = aMessage; - iEventNotifyAvailable = ETrue; - TInt errorFromPreviousCmd = aMessage.Int1(); - - __TRACE( KMessage, ( _L( "CTestExecution::NotifyEvent: enable (%d) notify %d" ), - errorFromPreviousCmd, this ) ); - - // Complete previous Event command - CompleteEvent( errorFromPreviousCmd ); - iEventHandler->StartL(); - - // iNotifyEventMessage is completed from DoNotifyEvent - return KErrNone; - } - - default: - __TRACE( KError, ( _L( "CTestExecution::NotifyEvent: Unknown command %i" ), - event.Type() )); - return KErrArgument; - } - - __TRACE( KMessage, ( _L( "CTestExecution::NotifyEvent(%d): Done" ), this ) ); - - aMessage.Complete( KErrNone ); - //User::After(1000); //Stif-95 This pause is needed to let Info::TestFrameworkEngine thread - //get some processor time and run exactly at this moment (by calling - //CTestEventController::EventCallBack). When Stif is focused on the screen, - //there is no problem if this line is absent, however when another - //application (like screen saver) is focused this is required. - return KErrNone; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: DoNotifyEvent - - Description: Forward event request. - - Parameters: None - - Return Values: None - - Errors/Exceptions: Panics if event array can't be created - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CTestExecution::DoNotifyEvent() - { - - TInt ret = KErrNone; - - switch( iEventDef.iEvent.Type() ) - { - case TEventIf::EReqEvent: - { - __TRACE( KMessage, - ( _L( "CTestExecution::DoNotifyEvent(%d): ReqEvent %S" ), - this, &iEventDef.iEvent.Name() ) ); - ret = RequestEvent( iEventDef.iEvent ); - // If error, return error, - // otherwise proceed with sending information to engine - if( ret != KErrNone ) - { - iEventHandler->StartL(); - return ret; - } - } - break; - case TEventIf::EWaitEvent: - case TEventIf::ESetWaitPending: - { - __TRACE( KMessage, - ( _L( "CTestExecution::DoNotifyEvent(%d): WaitEvent %S" ), - this, &iEventDef.iEvent.Name() ) ); - // We return from here, i.e. nothing is sent to engine - ret = WaitEvent( iEventDef.iEvent, iEventDef.iStatus ); - iEventHandler->StartL(); - return ret; - } - // Add state events to internal array - case TEventIf::ESetEvent: - case TEventIf::EUnsetEvent: - { - __TRACE( KMessage, - ( _L( "CTestExecution::DoNotifyEvent(%d): Set/UnsetEvent %S" ), - this, &iEventDef.iEvent.Name() ) ); - EventStateChange( iEventDef.iEvent ); - } - break; - case TEventIf::ERelEvent: - // This is handled later - __TRACE( KMessage, - ( _L( "CTestExecution::DoNotifyEvent(%d): RelEvent %S" ), - this, &iEventDef.iEvent.Name() ) ); - break; - default: - iEventHandler->StartL(); - return KErrArgument; - } - - // Construct message - TEventIfPckg eventPckg( iEventDef.iEvent ); - - // Write message to client space - TRAPD( res, iNotifyEventMessage.WriteL( 0, eventPckg ) ); - - if( res != KErrNone ) - { - __TRACE( KError, ( _L( "CTestExecution::DoNotifyEvent: WriteL failed" ) ) ); - ret = res; - } - // Complete request - // Complete with WriteL result - // MUST be done before ERelEvent - iEventNotifyAvailable = EFalse; - iNotifyEventMessage.Complete( res ); - User::After(1000); //Stif-95 This pause is needed to let Info::TestFrameworkEngine thread - //get some processor time and run exactly at this moment (by calling - //CTestEventNotifier::RunL). When Stif is focused on the screen, - //there is no problem if this line is absent, however when another - //application (like screen saver) is focused this is required. - - if( iEventDef.iEvent.Type() == TEventIf::ERelEvent ) - { - ret = ReleaseEvent( iEventDef.iEvent ); - if( ret != KErrNone ) - { - // If error, return immediately - return ret; - } - } - - __TRACE( KMessage, ( _L( "CTestExecution::DoNotifyEvent(%d): Done" ), this ) ); - - return ret; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: RequestEvent - - Description: Handles TestModule event requests. - - Parameters: const TEventIf& aEvent: in: Event requested - - Return Values: TInt: Success/Error code - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CTestExecution::RequestEvent( TEventIf& aEvent ) - { - - // Requested events are added to iEventArray - // There can be multiple simultaneous requests for the same event - TEvent* event = new TEvent( iTestThreadId ); - if( !event ) - { - return KErrNoMemory; - } - event->Copy( aEvent ); - if( iEventArray.Append( event ) != KErrNone ) - { - delete event; - return KErrNoMemory; - } - - __TRACE( KMessage,( _L( "CTestExecution::DoNotifyEvent: Req added %S ( count %i )" ), - &aEvent.Name(), iEventArray.Count() )); - - return KErrNone; - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: WaitEvent - - Description: Handles TestModule event waits. Waiting is implemented here - and completed in NotifyEvent - - - Parameters: const TEventIf& aEvent: in: Event wait - - Return Values: TInt: Success/Error code - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CTestExecution::WaitEvent( TEventIf& aEvent, TRequestStatus* aStatus ) - { - - // Get first "free" event entry from requested events - TInt ind = 0; - TInt count = iEventArray.Count(); - TEvent* event = NULL; - for( ind=0; ind < count; ind++ ) - { - if( ( iEventArray[ind]->Name() == aEvent.Name() ) && - ( iEventArray[ind]->WaitEventPending() == EFalse ) ) - { - // Found event with correct name and one that is still free - // i.e. nobody is waiting for it. - event = iEventArray[ind]; - if( aEvent.Type() == TEventIf::EWaitEvent ) - { - // For EWaitEvent we complete immediately if event is pending - if( event->EventPending() ) - { - // Event was already pending, so we may return immediately - if( aStatus ) - { - TestThreadRequestComplete( aStatus, KErrNone ); - } - return KErrNone; - } - } - } - } - if( event == NULL ) - { - // Event is not in the iEventArray, - // so event is not currently requested - return KErrNotFound; - } - - __TRACE( KMessage,( _L( "CTestExecution::DoNotifyEvent: Waiting %S ( count %i )" ), - &aEvent.Name(), count )); - - // Event is not pending so we have to wait for it - // Set wait pending - TInt ret = event->SetWaitPending( aStatus ); - // event cannot be freed by the test module, - // because it is waiting the event, - - if( ( aStatus == NULL ) && - ( ret == KErrNone ) && - ( aEvent.Type() == TEventIf::EWaitEvent ) ) - { - // This is synchronous wait - // Go waiting, completed from set event - event->Wait(); - } - - return ret; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: ReleaseEvent - - Description: Handles TestModule event releases. - - Parameters: const TEventIf& aEvent: in: Event released - - Return Values: TInt: Success/Error code - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CTestExecution::ReleaseEvent( TEventIf& aEvent ) - { - - // Get last event entry from requested events - TInt ind = 0; - TInt freeFound = 0; - TInt eventIndex = 0; - TInt count = iEventArray.Count(); - for( ind=0; ind < count; ind++ ) - { - if( iEventArray[ind]->Name() == aEvent.Name() ) - { - if( iEventArray[ind]->WaitEventPending() == EFalse ) - { - freeFound++; - eventIndex = ind; - } - } - } - - if( freeFound == 0 ) - { - return KErrNotFound; - } - __TRACE( KMessage,( - _L( "CTestExecution::DoNotifyEvent: Release event %S ( count %i )" ), - &aEvent.Name(), iEventArray.Count() )); - - TEvent* event = iEventArray[eventIndex]; - iEventArray.Remove( eventIndex ); - // Release and free event entry - event->Release(); - - // Delete used event entry - delete event; - - return KErrNone; -} - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: UnsetEvent - - Description: Handles TestModule event unsets. - - Parameters: const TEventIf& aEvent: in: Event unset - - Return Values: TInt: Success/Error code - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CTestExecution::UnsetEvent( TEventIf& aEvent, const RMessage2& aMessage ) - { - - TInt ret = KErrNone; - TInt ind = 0; - TInt count = iEventArray.Count(); - TBool activeEventReq = EFalse; - for( ind=0; ind < count; ind++ ) - { - if( iEventArray[ind]->Name() == aEvent.Name() ) - { - __TRACE( KMessage, ( - _L( "CTestExecution::NotifyEvent(%d): UnsetEvent %S ( count %i )" ), - this, &aEvent.Name(), count ) ); - - ret = iEventArray[ind]->Unset( aMessage, this ); - if( ret == KErrNone ) - { - activeEventReq = ETrue; - } - break; - } - } - if( activeEventReq ) - { - // Unset is completed by release - return KErrNone; - } - - // No pending requests or error from unset - aMessage.Complete( ret ); - - return KErrNone; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: EventStateChange - - Description: Handles event setting and unsetting. Saves status of - state events to enable unsetting of set state events when - killing the testcase abnormally. - - Parameters: const TEventIf& aEvent: in: Event set/unset - - Return Values: TInt: Success/Error code - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CTestExecution::EventStateChange( TEventIf& aEvent ) - { - - TInt ret = KErrNotFound; - if( aEvent.EventType() == TEventIf::EState ) - { - - TInt count = iStateEvents.Count(); - TInt index = 0; - for(; index < count; index++ ) - { - TPtrC name = *(iStateEvents[index]); - if( name == aEvent.Name() ) - { - break; - } - } - - - if( aEvent.Type() == TEventIf::ESetEvent ) - { - if( index < count ) - { - ret = KErrAlreadyExists; - } - else - { - // add event to iStateEvents - HBufC* name = aEvent.Name().Alloc(); - if( name == NULL ) - { - ret = KErrNoMemory; - } - else if( iStateEvents.Append( name ) != KErrNone ) - { - delete name; - ret = KErrNoMemory; - } - else - { - ret = KErrNone; - } - } - } - else if( aEvent.Type() == TEventIf::EUnsetEvent ) - { - if( index == count ) - { - ret = KErrNotFound; - } - else - { - ret = KErrNone; - delete iStateEvents[index]; - iStateEvents.Remove( index ); - } - } - } - - return ret; - - } -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: CancelEvent - - Description: Cancels pending event request. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CTestExecution::CancelEvent() - { - - TInt ret = KErrNotFound; - - __TRACE( KMessage, ( _L( "CTestThreadContainer::CancelEvent(%d): %S [%p]" ), - iEventDef.iEvent.Type(), &iEventDef.iEvent.Name(), iEventDef.iStatus ) ); - - switch( iEventDef.iEvent.Type() ) - { - case TEventIf::EReqEvent: - case TEventIf::ERelEvent: - case TEventIf::ESetEvent: - case TEventIf::EUnsetEvent: - CompleteEvent( KErrCancel ); - break; - case TEventIf::EWaitEvent: - case TEventIf::ESetWaitPending: - { - // Get waited event entry from requested events - TInt ind = 0; - TInt count = iEventArray.Count(); - for( ind=0; ind < count; ind++ ) - { - if( ( iEventArray[ind]->Name() == iEventDef.iEvent.Name() ) && - ( iEventArray[ind]->WaitEventPending() != EFalse ) && - ( iEventArray[ind]->RequestStatus() == iEventDef.iStatus ) ) - { - TEvent* event = iEventArray[ind]; - // Found event with correct name and one that is waited. - event->CompletePendingWait( KErrCancel ); - ret = KErrNone; - break; - } - } - if( ret != KErrNone ) - { - // Request has been already completed, not handled - // by ActiveScheduler yet. - // DoCancel will do the job, don't worry. - __TRACE( KError, ( _L( "CTestThreadContainer::CancelEvent(%d): %S, not found 2" ), - iEventDef.iEvent.Type(), &iEventDef.iEvent.Name() ) ); - } - } - break; - default: - CTestServer::PanicServer( EUnknownEventCmd ); - break; - } - - // Synchonize - iEventHandler->StartL(); - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: NotifyRemoteCmd - - Description: Handles the first phase of the RemoteCmd request from engine. - - Parameters: const RMessage& aMessage: in: Message from client. - - Return Values: Symbian OS error code. - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CTestExecution::NotifyRemoteCmd( const RMessage2& aMessage ) - { - - // Store RemoteCmd message - // and the length buffer address - iNotifyRemoteCmdMessage = aMessage; - iRemoteSendAvailable = ETrue; - iSndHandler->StartL(); - - return KErrNone; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: DoRemoteReceive - - Description: Enable remote receive. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CTestExecution::DoRemoteReceive() - { - - switch( iRcvCmdDef.iCommand ) - { - case EStifCmdReceive: // "Receive" - { - // @js If there's pointer in array, we'll send it down - if(iMessageQueue.Count() > 0) - { - HBufC8 * buf = iMessageQueue[0]; - iRcvCmdDef.iParam.aRemoteMsgRef->Copy( iMessageQueue[0]->Des() ); - iMessageQueue.Remove(0); - delete buf; - __TRACE( KMessage, - (_L("CTestExecution::ReadRemoteCmdInfo: complete receive 0x%x"), - iRcvCmdDef.iStatus )); - - // calls the TestCombiner's CRemoteReceiver::RunL() - TestThreadRequestComplete( iRcvCmdDef.iStatus, KErrNone ); - } - else - { - iRemoteReceiveAvailable = ETrue; - } - - break; - } - case EStifCmdReceiveCancel: - if( iRemoteReceiveAvailable ) - { - iRemoteReceiveAvailable = EFalse; - TestThreadRequestComplete( iRcvCmdDef.iStatus, KErrCancel ); - } - break; - default: - CTestServer::PanicServer( EUnknownRemoteCmd ); - break; - } - // Signal test thread - iRcvHandler->StartL(); - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: DoRemoteSend - - Description: Send remote messages. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CTestExecution::DoRemoteSend() - { - switch( iCmdDef.iCommand ) - { - case EStifCmdSend: // "Send" - case EStifCmdReboot: // "Send" - case EStifCmdStoreState: // "Send" - case EStifCmdGetStoredState: // "Receive, this must be done with two phase" - case EStifCmdMeasurement: // "Receive, this must be done with two phase" - { - if( iRemoteSendAvailable ) - { - TInt ret = KErrNone; - TPckg remoteCommandPckg( iCmdDef.iCommand ); - - // Start first phase of the writing message to client space - TRAP( ret, - iNotifyRemoteCmdMessage.WriteL( 0, remoteCommandPckg ) ); - - if( ret != KErrNone ) - { - __TRACE( KError, ( _L( "CTestExecution::DoRemoteSend: WriteL failed" ) ) ); - } - TPckg lenPckg( iCmdDef.iLen ); - - TRAP( ret, - iNotifyRemoteCmdMessage.WriteL( 1, lenPckg ) ); - - if( ret != KErrNone ) - { - __TRACE( KError, ( _L( "CTestExecution::DoRemoteSend: WriteL failed" ) ) ); - } - - // Complete request - // Complete with WriteL result - // CTestRemoteCmdNotifier::RunL() will called - iRemoteSendAvailable = EFalse; - iNotifyRemoteCmdMessage.Complete( ret ); - break; - } - } - TestThreadRequestComplete( iCmdDef.iStatus, KErrNotSupported ); - break; - default: - CTestServer::PanicServer( EUnknownRemoteCmd ); - break; - } - - } - - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: ReadRemoteCmdInfo - - Description: Handles the second phase of the RemoteCmd request from engine. - - Parameters: const RMessage& aMessage: in: Message from client. - - Return Values: Symbian OS error code. - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CTestExecution::ReadRemoteCmdInfo( const RMessage2& aMessage ) - { - - TInt ret( KErrNone ); - TInt completeSend = EFalse; - TInt returnedErrorCode = KErrNone; - TInt len = 0; - TInt value( aMessage.Int2() ); - if( value < 0 ) - { - returnedErrorCode = value; - } - else - { - len = value; - } - - switch( aMessage.Int1() ) - { - case EStifCmdReceive: // "Receive" - { - - if( len <= 0 ) - { - __TRACE( KError, - (_L("CTestExecution::ReadRemoteCmdInfo: empty message"))); - ret = KErrGeneral; - break; - } - if( iRcvCmdDef.iParam.aRemoteMsgRef->MaxLength() < len ) - { - __TRACE( KError, - (_L("CTestExecution::ReadRemoteCmdInfo: message overflow"))); - ret = KErrGeneral; - break; - } - - HBufC8* buf = HBufC8::New( len ); - if( buf == NULL ) - { - ret = KErrNoMemory; - break; - } - TPtr8 tmp = buf->Des(); - // Read message from client space - TRAP( ret, aMessage.ReadL( 0, tmp ) ); - - - if( ret != KErrNone ) - { - __TRACE( KError, - (_L("CTestExecution::ReadRemoteCmdInfo: ReadL failed"))); - break; - } - - if( iRemoteReceiveAvailable ) - // @js Checking moved here - { - iRcvCmdDef.iParam.aRemoteMsgRef->Copy( buf->Des() ); - delete buf; - - __TRACE( KMessage, - (_L("CTestExecution::ReadRemoteCmdInfo: complete receive 0x%x"), - iRcvCmdDef.iStatus )); - // calls the TestCombiner's CRemoteReceiver::RunL() - TestThreadRequestComplete( iRcvCmdDef.iStatus, ret ); - - iRemoteReceiveAvailable = EFalse; - } - else - // @js Adding buf to RPointerArray, handling it in DoRemoteReceive function - { - iMessageQueue.Append( buf ); - } - - break; - } - case EStifCmdSend: // "Send" - { - HBufC8* buf = HBufC8::New( iCmdDef.iParam.aRemoteMsgConstRef->Length() ); - if( buf == NULL ) - { - ret = KErrNoMemory; - break; - } - TPtr8 tmp = buf->Des(); - tmp.Copy( *iCmdDef.iParam.aRemoteMsgConstRef ); - // Second phase of the writing. Write information to the Engine. - TRAP( ret, aMessage.WriteL( 0, tmp ) ); - - delete buf; - - if( ret != KErrNone ) - { - __TRACE( KError, ( _L( "CTestExecution::ReadRemoteCmdInfo: WriteL failed" ) ) ); - } - completeSend = ETrue; - break; - } - case EStifCmdReboot: // "Send" - { - TRebootParamsPckg remoteTypePckg( *iCmdDef.iParam.aRebootType ); - - // Second phase of the writing. Write information to the Engine. - TRAP( ret, aMessage.WriteL( 0, remoteTypePckg ) ); - - if( ret != KErrNone ) - { - __TRACE( KError, ( _L( "CTestExecution::ReadRemoteCmdInfo: WriteL failed" ) ) ); - } - // Because Reboot must block...Don't complete, so now we wait for - // ever phone booting operation !!!!! - break; - } - case EStifCmdStoreState: // "Send" - { - TRebootStateParamsPckg remoteStatePckg( *iCmdDef.iParam.aRebootState ); - - // Second phase of the writing. Write information to the Engine. - TRAP( ret, aMessage.WriteL( 0, remoteStatePckg ) ); - - if( ret != KErrNone ) - { - __TRACE( KError, ( _L( "CTestExecution::ReadRemoteCmdInfo: WriteL failed" ) ) ); - } - // Completed from EStifCmdRebootProceed - break; - } - case EStifCmdMeasurement: // "Receive" - { - TGetMeasurementOptions getMeasurementOptions; - TGetMeasurementOptionsPckg measurementParamsPckg( getMeasurementOptions ); - - // Read message from client space - TRAP( ret, aMessage.ReadL( 0, measurementParamsPckg ) ); - - if( ret != KErrNone ) - { - __TRACE( KError, ( _L( "CTestExecution::ReadRemoteCmdInfo: ReadL failed" ) ) ); - } - iCmdDef.iParam.aMeasurementOption->iOptions = getMeasurementOptions.iOptions; - - completeSend = ETrue; - break; - } - case EStifCmdGetStoredState: // "Receive" - { - TGetRebootStoredParams getRebootStoredParams; - TGetRebootStoredParamsPckg rebootStoredParamsPckg( getRebootStoredParams ); - - // Read message from client space - TRAP( ret, aMessage.ReadL( 0, rebootStoredParamsPckg ) ); - - if( ret != KErrNone ) - { - __TRACE( KError, ( _L( "CTestExecution::ReadRemoteCmdInfo: ReadL failed" ) ) ); - } - iCmdDef.iParam.aRebootStoredRef->iCode = getRebootStoredParams.aCode; - iCmdDef.iParam.aRebootStoredRef->iName = getRebootStoredParams.aName; - - completeSend = ETrue; - break; - } - case EStifCmdRebootProceed: - { - completeSend = ETrue; // Complete EStifCmdStoreState - } - break; - default: - { - iModuleSession->PanicClient( EUnknownRemoteCmd, aMessage ); - break; - } - } - // Complete request with ret - aMessage.Complete( ret ); - - if( completeSend ) - { - // Calls the TestCombiner's CRemoteReceiver::RunL() and - // returns error code to test module. - TestThreadRequestComplete( iCmdDef.iStatus, returnedErrorCode ); - } - - return KErrNone; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: Pause - - Description: Pauses a test case - - Only ongoing tests can be paused. If test is not ongoing, then - function does nothing. - - Parameters: const RMessage& aMessage :in: Message from client. - - Return Values: TInt Always KErrNone - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CTestExecution::Pause( const RMessage2& aMessage ) - { - - __TRACE ( KThreadOperation, ( _L( "CTestExecution::Pause" ) ) ); - - TInt completionCode = KErrNone; - - // Note that it is allowed to suspend already suspended thread, so - // there is no need for states to verify that thread is really in - // resumed state. - switch ( iThreadState ) - { - case EOnGoing: - completionCode = iModuleContainer->PauseThread(); - break; - - case ENotStarted: - completionCode = KErrNotReady; - break; - - case EFinished: - case ECancelled: - completionCode = KErrCompletion; - break; - - default: - CTestServer::PanicServer( EInvalidThreadState ); - break; - } - - - // Complete the request - aMessage.Complete( completionCode ); - - return KErrNone; - - } - - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: Resume - - Description: Resumes a test case. If test is not ongoing, - then do not resume. - - Parameters: const RMessage& aMessage :in: Message from client. - - Return Values: TInt Always KErrNone - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CTestExecution::Resume( const RMessage2& aMessage ) - { - - __TRACE ( KThreadOperation, ( _L( "CTestExecution::Resume" ) ) ); - - TInt completionCode = KErrNone; - - // Note that it is allowed to resume already resumed thread, so - // there is no need for states to verify that thread is really in - // suspended state. - switch ( iThreadState ) - { - case EOnGoing: - completionCode = iModuleContainer->ResumeThread(); - break; - - case ENotStarted: - completionCode = KErrNotReady; - break; - - case EFinished: - case ECancelled: - completionCode = KErrCompletion; - break; - - default: - CTestServer::PanicServer( EInvalidThreadState ); - break; - } - - - // Complete the request - aMessage.Complete( completionCode ); - - return KErrNone; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: CloseTestExecution - - Description: Closes Test Execution subsession - - Parameters: const RMessage& aMessage :in: Message from client. - - Return Values: TInt Always KErrNone - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CTestExecution::CloseTestExecution( const RMessage2& aMessage ) - { - - // Cancel test request - CancelTestRequest(); - - // Cancel print request - CancelPrintRequest(); - - // Cancel event request - CancelEventRequest(); - - // Delete this subsession - const TUint subsession = aMessage.Int3(); - iModuleSession->DeleteTestExecution( subsession, aMessage ); - - // Complete the request - aMessage.Complete( KErrNone ); - - return KErrNone; - - } - - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: CancelPrintRequest - - Description: Cancel print request. Completes ongoing print request - with KErrCancel. - - Parameters: None - - Return Values: TInt Always KErrNone - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CTestExecution::CancelPrintRequest() - { - - if ( iPrintNotifyAvailable ) - { - iPrintHandler->Cancel(); - - iPrintNotifyAvailable = EFalse; - iNotifyPrintMessage.Complete ( KErrCancel ); - //@spe iPrintNotifyAvailable = EFalse; - } - - return KErrNone; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: CancelEventRequest - - Description: Cancel event request. Completes ongoing event request - with KErrCancel. - - Parameters: None - - Return Values: TInt Always KErrNone - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CTestExecution::CancelEventRequest() - { - iEventHandler->Cancel(); - - if( iEventNotifyAvailable ) - { - // Cancel request - iEventNotifyAvailable = EFalse; - iNotifyEventMessage.Complete ( KErrCancel ); - } - - return KErrNone; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: CancelInterferenceRequest - - Description: Cancel print request. Completes ongoing print request - with KErrCancel. - - Parameters: None - - Return Values: TInt: Always KErrNone - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CTestExecution::CancelInterferenceRequest() - { - - if ( iInterferenceNotifyAvailable ) - { - iInterferenceHandler->Cancel(); - - iInterferenceNotifyAvailable = EFalse; - iNotifyInterferenceMessage.Complete ( KErrCancel ); - } - - return KErrNone; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: CancelRemoteCmdRequest - - Description: Cancel RemoteCmd request. Completes ongoing RemoteCmd request - with KErrCancel. - - Parameters: None - - Return Values: TInt: Always KErrNone - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CTestExecution::CancelRemoteCmdRequest() - { - iSndHandler->Cancel(); - - // Cancel request - if( iRemoteSendAvailable ) - { - iRemoteSendAvailable = EFalse; - iNotifyRemoteCmdMessage.Complete ( KErrCancel ); - } - - return KErrNone; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: NotifyCommand - - Description: Handles the first phase of the Command request from engine. - - Parameters: const RMessage& aMessage: in: Message from client. - - Return Values: Symbian OS error code. - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CTestExecution::NotifyCommand( const RMessage2& aMessage ) - { - iNotifyCommandMessage = aMessage; - iCommandNotifyAvailable = ETrue; - iCommandHandler->StartL(); - - return KErrNone; - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: CancelCommandRequest - - Description: Cancel Command request. Completes ongoing Command request - with KErrCancel. - - Parameters: None - - Return Values: TInt: Always KErrNone - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CTestExecution::CancelCommandRequest() - { - iCommandHandler->Cancel(); - - // Cancel request - if(iCommandNotifyAvailable) - { - iCommandNotifyAvailable = EFalse; - iNotifyCommandMessage.Complete(KErrCancel); - } - - return KErrNone; - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: GetTestCaseArguments - - Description: Get test case arguments - - Parameters: None - - Return Values: Test case arguments - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -const TDesC& CTestExecution::GetTestCaseArguments() const - { - if ( iTestCaseArgs != NULL ) - { - return *iTestCaseArgs; - } - return KNullDesC; - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: CancelTestRequest - - Description: Cancel test execution request. - If thread is not in OnGoing state, function does not do anything. - - Otherwise following operations are done: - 1 ) Obtain access to both PrintMutex and EventMutex to make sure that - thread can't be accessing print queue or events. - 2 ) Kill the thread - 3 ) Complete original "RunTestCase" request with KErrCancel - 4 ) If print queue is empty, complete print request - 5 ) Give up mutexes - 6 ) Delete module container - - Parameters: None - - Return Values: TInt: Always KErrNone - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -TInt CTestExecution::CancelTestRequest() - { - // This mutex block and make sure that cancel operation is done succesfully - // and test case e.g. cannot complete at the same time. Get mutex. - iTestThreadMutex.Wait(); - - // iModuleContainer is an active object, check is active. - if ( iModuleContainer == NULL || ( iModuleContainer != NULL && !iModuleContainer->IsActive() ) ) - { - // Test case is already ready, return. - iTestThreadMutex.Signal(); - return KErrNone; - } - - if ( iThreadState == EOnGoing ) - { - // Print mutex access is required to make sure that the dying thread - // does not have access to print queue. Same is true for event queue. - - // NOTE: iEventArrayMutex is now taken, so the ongoing thread - // can't set any events so queue will be empty. - iPrintHandler->Cancel(); - iEventHandler->Cancel(); - iInterferenceHandler->Cancel(); - iCommandHandler->Cancel(); - - // Kill the thread - iModuleContainer->KillThread( KErrCancel ); - - // Complete the test execution request - CompleteTestExecution( KErrCancel, TFullTestResult::ECaseCancelled, - KErrCancel, KErrCancel, _L( "Cancelled" ) ); - iThreadState = ECancelled; - - - /** - * Removed, because may block in certain situations. Implemented now in - * TestCombiner instead. - // Unset all pending state events, - // because we have killed the testcase abnormally - // UnsetStateEvents(); - */ - - // Complete print request if queue is empty - CompletePrintRequestIfQueueEmpty(); - - // Delete the module containter - delete iModuleContainer; - iModuleContainer = NULL; - } - - // Relinquish mutex. - iTestThreadMutex.Signal(); - - return KErrNone; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: CancelRequestL - - Description: Cancel asynchronous request - - Parameters: const RMessage& aMessage :in: Message from client. - - Return Values: TInt Error code from CancelXXX- - function - - Errors/Exceptions: Function panics the client, if invalid message - received. - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CTestExecution::CancelRequestL( const RMessage2& aMessage ) - { - TInt r = KErrNone; - - switch ( aMessage.Int0() ) - { - case ETestExecutionRunTestCase: - { - r = CancelTestRequest(); - break; - } - case ETestExecutionNotifyProgress: - { - r = CancelPrintRequest(); - break; - } - case ETestExecutionNotifyEvent: - { - r = CancelEventRequest(); - break; - } - case ETestExecutionNotifyRemoteCmd: - { - r = CancelRemoteCmdRequest(); - break; - } - case ETestExecutionNotifyCommand: - { - r = CancelCommandRequest(); - break; - } - default: - iModuleSession->PanicClient( EInvalidRequestCancel, aMessage ); - break; - } - - aMessage.Complete( r ); - - return r; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: SetThreadState - - Description: A multithread safe thread state modification function - - Parameters: const TTestState aState :in: New state - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CTestExecution::SetThreadState( const TTestState aState ) - { - - iThreadState = aState; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: Complete event - - Description: Completes pending event request. Must be - called with iEventSem taken. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CTestExecution::CompleteEvent( TInt aError ) - { - if( iEventDef.iStatus ) - { - __TRACE( KMessage,(_L("Comp Stat %d, %x (error %d)"), - this, iEventDef.iStatus, aError)); - TestThreadRequestComplete( iEventDef.iStatus, aError ); - - iEventDef.iStatus = NULL; - - } - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: CompletePrintRequestIfQueueEmpty - - Description: Completes print request if queue is empty. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CTestExecution::CompletePrintRequestIfQueueEmpty() - { - - if ( iPrintNotifyAvailable && iPrintQueue->Count() == 0 ) - { - iNotifyPrintMessage.Complete ( KErrEof ); - iPrintNotifyAvailable = EFalse; - } - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: CleanupEvents - - Description: Cleanups Events. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CTestExecution::CleanupEvents() - { - - iEventArray.ResetAndDestroy(); - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: GetRq - - Description: Get request pointers. - - Parameters: None - - Return Values: TRequestStatus* - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -TRequestStatus* CTestExecution::GetRq( TRequestType aType ) - { - - TRequestStatus* status = NULL; - - switch( aType ) - { - case ERqPrint: - status = &iPrintHandler->iStatus; - break; - case ERqEvent: - status = &iEventHandler->iStatus; - break; - case ERqSnd: - status = &iSndHandler->iStatus; - break; - case ERqRcv: - status = &iRcvHandler->iStatus; - break; - case ERqInterference: - status = &iInterferenceHandler->iStatus; - break; - case ERqMeasurement: - status = &iMeasurementHandler->iStatus; - break; - case ERqCommand: - status = &iCommandHandler->iStatus; - break; - default: - break; - } - - return status; - - } - - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: CompleteTestExecution - - Description: Completes test execution - - Parameters: const TInt aCompletionCode :in: Request completion code - const TInt aCaseExecutionCode in: Case execution code - const TFullTestResult::TCaseExecutionResult aCaseExecutionType, - const TInt aCaseResult :in: Case result - const TDesC& aText :in: Completion text - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CTestExecution::CompleteTestExecution( const TInt aCompletionCode, - const TFullTestResult::TCaseExecutionResult aCaseExecutionType, - const TInt aCaseExecutionCode, - const TInt aCaseResult, - const TDesC& aText ) - { - - TInt completionCode = aCompletionCode; - - if( iModuleContainer != NULL ) - { - // Fill the description - iFullResult.iEndTime.HomeTime(); - iFullResult.iCaseExecutionResultType = aCaseExecutionType; - iFullResult.iCaseExecutionResultCode = aCaseExecutionCode; - iFullResult.iTestResult.iResult = aCaseResult; - iFullResult.iTestResult.iResultDes = aText; - CompleteTestExecution( aCompletionCode ); - return; - } - else - { - completionCode = KErrGeneral; - __TRACE ( KError, ( CStifLogger::ERed, - _L("CTestExecution::CompleteTestExecution: ModuleContainer NULL") ) ); - } - - iTestExeMessage.Complete ( completionCode ); - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: CompleteTestExecution - - Description: Completes test execution - - Parameters: const TInt aCompletionCode: in: completion code - TFullTestResult&: in: test case result - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CTestExecution::CompleteTestExecution( const TInt aCompletionCode ) - { - - TInt completionCode = aCompletionCode; - - TFullTestResultPckg fullResultPckg( iFullResult ); - TRAPD( res, iTestExeMessage.WriteL( 0, fullResultPckg ) ); - if ( res != KErrNone ) - { - completionCode = res; - } - - iTestExeMessage.Complete ( completionCode ); - - // @js Now it returns completionCode, used to return res - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: UnsetStateEvents - - Description: Unsets all state events. Must be done if testcase is exited - abnormally (i.e. aborted by the user). - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CTestExecution::UnsetStateEvents() - { - - - // Unset all state events that are set currently - TInt count = iStateEvents.Count(); - TEventIf event; - for( TInt i = 0; i < count; i++ ) - { - TPtrC name = *(iStateEvents[i]); - event.Set( TEventIf::EUnsetEvent, name, TEventIf::EState ); - - // Construct message - TEventIfPckg eventPckg( event ); - - // Write message to client space - TRAPD( res, iNotifyEventMessage.WriteL( 0, eventPckg ) ); - - // Complete with WriteL result - iEventNotifyAvailable = EFalse; - iNotifyEventMessage.Complete( res ); - if( res != KErrNone ) - { - __TRACE( KError,( _L( "CTestExecution::UnsetStateEvents: WriteL failed" ) )); - break; - } - } - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: TestThreadRequestComplete - - Description: Complete test thread request. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CTestExecution::TestThreadRequestComplete( TRequestStatus* aStatus, - TInt aCode) - { - - if( iThreadState != EOnGoing ) - { - __TRACE( KError, - ( _L( "CTestExecution::TestThreadRequestComplete: test thread killed" ) )); - return; - } - - if( iTestThreadOpen == EFalse ) - { - if( iTestThread.Open( iTestThreadId ) != KErrNone ) - { - __TRACE( KError, - ( _L( "CTestExecution::TestThreadRequestComplete: test thread cannot be opened" ) )); - return; - } - iTestThreadOpen = ETrue; - } - if( iTestThread.ExitType() != EExitPending ) - { - // test thread has died - __TRACE( KError, - ( _L( "CTestExecution::TestThreadRequestComplete: test thread has died" ) )); - return; - } - - iTestThread.RequestComplete( aStatus, aCode ); - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: CancelTestExecution - - Description: Cancels test(s) execution in special cases e.g. timeout, - exit etc. - - Parameters: None - - Return Values: TInt: Symbian error code. - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -TInt CTestExecution::CancelTestExecution() - { - TInt ret( KErrNone ); - ret = CancelTestRequest(); - - return ret; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: KillTestinterferenceThread - - Description: Make sure that any of the test interference thread's won't - stay to run if test case is crashed of test interference - object is not deleted. - - Parameters: None - - Return Values: TInt: Symbian OS error code. - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CTestExecution::KillTestinterferenceThread() - { - for( TInt i = 0; i < iSTIFTestInterferenceArray.Count(); i++ ) - { - RDebug::Print( - _L( "Test interference's thread[%x] killed by STIF" ), (TInt)iSTIFTestInterferenceArray[i].Id() ); - __TRACE( KInit, - ( _L( "Test interference's thread[%x] killed by STIF" ), (TInt)iSTIFTestInterferenceArray[i].Id() ) ); - iSTIFTestInterferenceArray[i].Kill( KErrCancel ); - //iSTIFTestInterferenceArray.Remove( i ); - } - - iSTIFTestInterferenceArray.Reset(); - iSTIFTestInterferenceArray.Close(); - - return KErrNone; - - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: DoNotifyCommand - - Description: Completes command message. - - Parameters: None. - - Return Values: Symbian OS error code. - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CTestExecution::DoNotifyCommand() - { - if(!iCommandNotifyAvailable) - { - __TRACE(KPrint, (_L("CTestExecution::DoNotifyCommand(): unable to complete notification"))) - return KErrNone; - } - - TInt ret = KErrNone; - - switch(iCommandDef->iCommand) - { - case EStopExecution: - { - //Unpack received parameters - TStopExecutionCommandParams par; - TStopExecutionCommandParamsPckg parPack(par); - parPack.Copy(iCommandDef->iParamsPckg); - - //Set test case handle - par.iTestCaseHandle = iNotifyCommandMessage.Int3(); - - __TRACE(KPrint, (_L("CTestExecution::DoNotifyCommand(): command [%d] type [%d] code [%d] test handle [%d]"), TInt(iCommandDef->iCommand), TInt(par.iType), TInt(par.iCode), par.iTestCaseHandle)); - iCommandDef->iParamsPckg.Copy(parPack); - break; - } - case ESendTestModuleVersion: - { - TSendTestModuleVesionCommandParams par; - TSendTestModuleVesionCommandParamsPckg parPack(par); - parPack.Copy(iCommandDef->iParamsPckg); - - __TRACE(KPrint, (_L("CTestExecution::DoNotifyCommand(): command ESendTestModuleVersion"))); - break; - } - default: - __TRACE(KError, (_L("CTestExecution::DoNotifyCommand(): Unknown command [%d]"), TInt(iCommandDef->iCommand))); - return KErrNotFound; - } - // Construct message - TPckg commandPckg(iCommandDef->iCommand); - - // Start first phase of the writing message to client space - TRAP(ret, iNotifyCommandMessage.WriteL(0, commandPckg)); - if(ret != KErrNone) - { - __TRACE(KError, (_L( "CTestExecution::DoNotifyCommand(): WriteL failed (0)"))); - } - - TRAP(ret, iNotifyCommandMessage.WriteL(1, iCommandDef->iParamsPckg)); - if(ret != KErrNone) - { - __TRACE(KError, (_L( "CTestExecution::DoNotifyCommand(): WriteL failed (1)"))); - } - - // Complete request with WriteL result - iCommandNotifyAvailable = EFalse; - iNotifyCommandMessage.Complete(ret); - - return KErrNone; - } - -/* -------------------------------------------------------------------------------- - - Class: CTestExecution - - Method: KillTestMeasurement - - Description: Make sure that any of the test measurement operations won't - stay to run if test case is crashed or test measurement object - is not stopped by user. - - Parameters: None - - Return Values: TInt: Symbian OS error code. - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -TInt CTestExecution::KillTestMeasurement() - { - for( TInt i = 0; i < iMeasurementHandlingArray.Count(); i++ ) - { - iMeasurementHandlingArray[i]->iMeasurementModulePtr->Stop(); - } - - iMeasurementHandlingArray.ResetAndDestroy(); - iMeasurementHandlingArray.Close(); - - return KErrNone; - - } - -/* -------------------------------------------------------------------------------- - - DESCRIPTION - - This module contains implementation of CPrintHandler class member functions. - CPrintHandler listens print notifications from test thread. - -------------------------------------------------------------------------------- -*/ - -// ================= MEMBER FUNCTIONS ========================================= - - -/* -------------------------------------------------------------------------------- - - Class: CPrintHandler - - Method: NewL - - Description: Constructs a new CPrintHandler object. - - Parameters: CTestExecution& aExecution: in: "Parent" - - Return Values: CPrintHandler*: New undertaker - - Errors/Exceptions: Leaves if memory allocation or ConstructL leaves. - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -CPrintHandler* CPrintHandler::NewL( CTestExecution& aExecution ) - { - - CPrintHandler* self = new( ELeave ) CPrintHandler( aExecution ); - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop( self ); - return self; - - } - -/* -------------------------------------------------------------------------------- - - Class: CPrintHandler - - Method: ConstructL - - Description: Second level constructor. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CPrintHandler::ConstructL() - { - - } - -/* -------------------------------------------------------------------------------- - - Class: CPrintHandler - - Method: CPrintHandler - - Description: Constructor - - Parameters: CTestModuleContainer& aExecution :in: "Parent" - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -CPrintHandler::CPrintHandler( CTestExecution& aExecution ) : - CActive( CActive::EPriorityStandard ), - iExecution( aExecution ) - { - - CActiveScheduler::Add ( this ); - - } - -/* -------------------------------------------------------------------------------- - - Class: CPrintHandler - - Method: ~CPrintHandler - - Description: Destructor. - Cancels active request. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -CPrintHandler::~CPrintHandler() - { - - Cancel(); - - } - - - - -/* -------------------------------------------------------------------------------- - - Class: CPrintHandler - - Method: StartL - - Description: Starts to monitor thread. - - Parameters: None - - Return Values: TInt Always KErrNone - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CPrintHandler::StartL() - { - - __TRACE( KPrint, ( _L( "CPrintHandler::StartL" ) ) ); - - if( IsActive() ) - { - CTestServer::PanicServer( EAlreadyActive ); - } - - iStatus = KRequestPending; - SetActive(); - - // Signal test thread - iExecution.iPrintSem.Signal(); - - } - -/* -------------------------------------------------------------------------------- - - Class: CPrintHandler - - Method: RunL - - Description: Handles thread death. - Function does: - 1 ) Stops monitoring thread - 1 ) Marks thread death - 2 ) Completes ongoing requests - 3 ) Cleans the memory - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CPrintHandler::RunL() - { - - __TRACE( KPrint, ( _L( "CPrintHandler::RunL [%d]" ), iStatus.Int() ) ); - - iExecution.DoNotifyPrint(); - - // enable print request - //@speiExecution.iPrintHandler->StartL(); - StartL(); - } - - -/* -------------------------------------------------------------------------------- - - Class: CPrintHandler - - Method: DoCancel - - Description: Stops print notification listening. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ - -void CPrintHandler::DoCancel() - { - - __TRACE( KPrint, ( _L( "CPrintHandler::DoCancel" ) ) ); - - iExecution.iPrintMutex.Wait(); // Take mutex and check test case print - // operation. If pending take print semaphore - // and complete - if( iStatus == KRequestPending ) - { - // Signal test thread - // @remove iExecution.iPrintSem.Wait(); - - TRequestStatus* status = &iStatus; - User::RequestComplete( status, KErrCancel ); - } - - iExecution.iPrintMutex.Signal(); - } - -/* -------------------------------------------------------------------------------- - - Class: CPrintHandler - - Method: RunError - - Description: Handle errors. RunL function does not leave, so one should - never come here. - - Print trace and let framework handle error( i.e to do Panic ) - - Parameters: TInt aError: :in: Error code - - Return Values: TInt Error code - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CPrintHandler::RunError( TInt aError ) - { - - __TRACE( KError,( _L( "CPrintHandler::RunError" ) ) ); - - return aError; - - } - -/* -------------------------------------------------------------------------------- - - DESCRIPTION - - This module contains implementation of CEventHandler class member functions. - CEventHandler listens print notifications from test thread. - -------------------------------------------------------------------------------- -*/ - -// ================= MEMBER FUNCTIONS ========================================= - - -/* -------------------------------------------------------------------------------- - - Class: CEventHandler - - Method: NewL - - Description: Constructs a new CEventHandler object. - - Parameters: CTestExecution& aExecution: in: "Parent" - - Return Values: CEventHandler*: New undertaker - - Errors/Exceptions: Leaves if memory allocation or ConstructL leaves. - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -CEventHandler* CEventHandler::NewL( CTestExecution& aExecution ) - { - - CEventHandler* self = new( ELeave ) CEventHandler( aExecution ); - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop( self ); - return self; - - } - -/* -------------------------------------------------------------------------------- - - Class: CEventHandler - - Method: ConstructL - - Description: Second level constructor. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CEventHandler::ConstructL() - { - - } - -/* -------------------------------------------------------------------------------- - - Class: CEventHandler - - Method: CEventHandler - - Description: Constructor - - Parameters: CTestModuleContainer& aExecution :in: "Parent" - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -CEventHandler::CEventHandler( CTestExecution& aExecution ) : - CActive( CActive::EPriorityStandard ), - iExecution( aExecution ) - { - - CActiveScheduler::Add ( this ); - - } - -/* -------------------------------------------------------------------------------- - - Class: CEventHandler - - Method: ~CEventHandler - - Description: Destructor. - Cancels active request. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -CEventHandler::~CEventHandler() - { - - Cancel(); - - } - - - - -/* -------------------------------------------------------------------------------- - - Class: CEventHandler - - Method: StartL - - Description: Starts to monitor thread. - - Parameters: None - - Return Values: TInt Always KErrNone - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CEventHandler::StartL() - { - - __TRACE( KPrint, ( _L( "CEventHandler::StartL" ) ) ); - - if( IsActive() ) - { - CTestServer::PanicServer( EAlreadyActive ); - } - - iStatus = KRequestPending; - SetActive(); - - // Signal test thread - iExecution.iEventSem.Signal(); - - } - -/* -------------------------------------------------------------------------------- - - Class: CEventHandler - - Method: RunL - - Description: Handles thread death. - Function does: - 1 ) Stops monitoring thread - 1 ) Marks thread death - 2 ) Completes ongoing requests - 3 ) Cleans the memory - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CEventHandler::RunL() - { - - __TRACE( KPrint, ( _L( "CEventHandler::RunL [%d]" ), iStatus.Int() ) ); - - switch( iExecution.EventDef().iType ) - { - case TEventDef::EEventCmd: - iExecution.DoNotifyEvent(); - break; - case TEventDef::EEventCmdCancel: - iExecution.CancelEvent(); - break; - default: - CTestServer::PanicServer( EUnknownEventCmd ); - break; - } - - } - - -/* -------------------------------------------------------------------------------- - - Class: CEventHandler - - Method: DoCancel - - Description: Stops print notification listening. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ - -void CEventHandler::DoCancel() - { - - __TRACE( KPrint, ( _L( "CEventHandler::DoCancel" ) ) ); - - iExecution.iEventMutex.Wait(); // Take mutex and check test case event - // operation. If pending take event - // semaphore and complete - if( iStatus == KRequestPending ) - { - // Signal test thread - // @remove iExecution.iEventSem.Wait(); - - TRequestStatus* status = &iStatus; - User::RequestComplete( status, KErrCancel ); - - } - - iExecution.iEventMutex.Signal(); - - } - -/* -------------------------------------------------------------------------------- - - Class: CEventHandler - - Method: RunError - - Description: Handle errors. RunL function does not leave, so one should - never come here. - - Print trace and let framework handle error( i.e to do Panic ) - - Parameters: TInt aError: :in: Error code - - Return Values: TInt Error code - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CEventHandler::RunError( TInt aError ) - { - - __TRACE( KError,( _L( "CEventHandler::RunError" ) ) ); - - return aError; - - } - -/* -------------------------------------------------------------------------------- - - DESCRIPTION - - This module contains implementation of CSndHandler class member functions. - CSndHandler listens print notifications from test thread. - -------------------------------------------------------------------------------- -*/ - -// ================= MEMBER FUNCTIONS ========================================= - - -/* -------------------------------------------------------------------------------- - - Class: CSndHandler - - Method: NewL - - Description: Constructs a new CSndHandler object. - - Parameters: CTestExecution& aExecution: in: "Parent" - - Return Values: CSndHandler*: New undertaker - - Errors/Exceptions: Leaves if memory allocation or ConstructL leaves. - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -CSndHandler* CSndHandler::NewL( CTestExecution& aExecution ) - { - - CSndHandler* self = new( ELeave ) CSndHandler( aExecution ); - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop( self ); - return self; - - } - -/* -------------------------------------------------------------------------------- - - Class: CSndHandler - - Method: ConstructL - - Description: Second level constructor. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CSndHandler::ConstructL() - { - - } - -/* -------------------------------------------------------------------------------- - - Class: CSndHandler - - Method: CSndHandler - - Description: Constructor - - Parameters: CTestModuleContainer& aExecution :in: "Parent" - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -CSndHandler::CSndHandler( CTestExecution& aExecution ) : - CActive( CActive::EPriorityStandard ), - iExecution( aExecution ) - { - - CActiveScheduler::Add ( this ); - - } - -/* -------------------------------------------------------------------------------- - - Class: CSndHandler - - Method: ~CSndHandler - - Description: Destructor. - Cancels active request. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -CSndHandler::~CSndHandler() - { - - Cancel(); - - } - - - - -/* -------------------------------------------------------------------------------- - - Class: CSndHandler - - Method: StartL - - Description: Starts to monitor thread. - - Parameters: None - - Return Values: TInt Always KErrNone - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CSndHandler::StartL() - { - - __TRACE( KPrint, ( _L( "CSndHandler::StartL" ) ) ); - - if( IsActive() ) - { - CTestServer::PanicServer( EAlreadyActive ); - } - - iStatus = KRequestPending; - SetActive(); - - // Signal test thread - iExecution.iSndSem.Signal(); - - } - -/* -------------------------------------------------------------------------------- - - Class: CSndHandler - - Method: RunL - - Description: Handles thread death. - Function does: - 1 ) Stops monitoring thread - 1 ) Marks thread death - 2 ) Completes ongoing requests - 3 ) Cleans the memory - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CSndHandler::RunL() - { - - __TRACE( KPrint, ( _L( "CSndHandler::RunL [%d]" ), iStatus.Int() ) ); - - iExecution.DoRemoteSend(); - - } - - -/* -------------------------------------------------------------------------------- - - Class: CSndHandler - - Method: DoCancel - - Description: Stops print notification listening. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ - -void CSndHandler::DoCancel() - { - - __TRACE( KPrint, ( _L( "CSndHandler::DoCancel" ) ) ); - - iExecution.iSndMutex.Wait(); // Take mutex and check test case send - // operation. If pending take send - // semaphore and complete - if( iStatus == KRequestPending ) - { - // Signal test thread - // @remove iExecution.iSndSem.Wait(); - - TRequestStatus* status = &iStatus; - User::RequestComplete( status, KErrCancel ); - - } - - iExecution.iSndMutex.Signal(); - - } - -/* -------------------------------------------------------------------------------- - - Class: CSndHandler - - Method: RunError - - Description: Handle errors. RunL function does not leave, so one should - never come here. - - Print trace and let framework handle error( i.e to do Panic ) - - Parameters: TInt aError: :in: Error code - - Return Values: TInt Error code - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CSndHandler::RunError( TInt aError ) - { - - __TRACE( KError,( _L( "CSndHandler::RunError" ) ) ); - - return aError; - - } - -/* -------------------------------------------------------------------------------- - - DESCRIPTION - - This module contains implementation of CSndHandler class member functions. - CRcvHandler listens print notifications from test thread. - -------------------------------------------------------------------------------- -*/ - -// ================= MEMBER FUNCTIONS ========================================= - - -/* -------------------------------------------------------------------------------- - - Class: CRcvHandler - - Method: NewL - - Description: Constructs a new CRcvHandler object. - - Parameters: CTestExecution& aExecution: in: "Parent" - - Return Values: CRcvHandler*: New undertaker - - Errors/Exceptions: Leaves if memory allocation or ConstructL leaves. - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -CRcvHandler* CRcvHandler::NewL( CTestExecution& aExecution ) - { - - CRcvHandler* self = new( ELeave ) CRcvHandler( aExecution ); - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop( self ); - return self; - - } - -/* -------------------------------------------------------------------------------- - - Class: CRcvHandler - - Method: ConstructL - - Description: Second level constructor. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CRcvHandler::ConstructL() - { - - } - -/* -------------------------------------------------------------------------------- - - Class: CRcvHandler - - Method: CRcvHandler - - Description: Constructor - - Parameters: CTestModuleContainer& aExecution :in: "Parent" - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -CRcvHandler::CRcvHandler( CTestExecution& aExecution ) : - CActive( CActive::EPriorityStandard ), - iExecution( aExecution ) - { - - CActiveScheduler::Add ( this ); - - } - -/* -------------------------------------------------------------------------------- - - Class: CRcvHandler - - Method: ~CRcvHandler - - Description: Destructor. - Cancels active request. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -CRcvHandler::~CRcvHandler() - { - - Cancel(); - - } - - - - -/* -------------------------------------------------------------------------------- - - Class: CRcvHandler - - Method: StartL - - Description: Starts to monitor thread. - - Parameters: None - - Return Values: TInt Always KErrNone - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CRcvHandler::StartL() - { - - __TRACE( KPrint, ( _L( "CRcvHandler::StartL" ) ) ); - - if( IsActive() ) - { - CTestServer::PanicServer( EAlreadyActive ); - } - iStatus = KRequestPending; - SetActive(); - - // Signal test thread - iExecution.iRcvSem.Signal(); - - } - -/* -------------------------------------------------------------------------------- - - Class: CRcvHandler - - Method: RunL - - Description: Handles thread death. - Function does: - 1 ) Stops monitoring thread - 1 ) Marks thread death - 2 ) Completes ongoing requests - 3 ) Cleans the memory - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CRcvHandler::RunL() - { - - __TRACE( KPrint, ( _L( "CRcvHandler::RunL [%d]" ), iStatus.Int() ) ); - - iExecution.DoRemoteReceive(); - - } - - -/* -------------------------------------------------------------------------------- - - Class: CRcvHandler - - Method: DoCancel - - Description: Stops print notification listening. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ - -void CRcvHandler::DoCancel() - { - - __TRACE( KPrint, ( _L( "CRcvHandler::DoCancel" ) ) ); - - iExecution.iRcvMutex.Wait(); // Take mutex and check test case receive - // operation. If pending take reveive - // semaphore and complete - if( iStatus == KRequestPending ) - { - // Signal test thread - // @remove iExecution.iRcvSem.Wait(); - - TRequestStatus* status = &iStatus; - User::RequestComplete( status, KErrCancel ); - } - - iExecution.iRcvMutex.Signal(); - - } - -/* -------------------------------------------------------------------------------- - - Class: CRcvHandler - - Method: RunError - - Description: Handle errors. RunL function does not leave, so one should - never come here. - - Print trace and let framework handle error( i.e to do Panic ) - - Parameters: TInt aError: :in: Error code - - Return Values: TInt Error code - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CRcvHandler::RunError( TInt aError ) - { - - __TRACE( KError,( _L( "CRcvHandler::RunError" ) ) ); - - return aError; - - } - - -/* -------------------------------------------------------------------------------- - - DESCRIPTION - - This module contains implementation of CTestInterferenceHandler class - member functions. CTestInterferenceHandler listens print notifications from - test thread. - -------------------------------------------------------------------------------- -*/ - -// ================= MEMBER FUNCTIONS ========================================= - - -/* -------------------------------------------------------------------------------- - - Class: CInterferenceHandler - - Method: NewL - - Description: Constructs a new CInterferenceHandler object. - - Parameters: CTestExecution& aExecution: in: "Parent" - - Return Values: CInterferenceHandler*: New undertaker - - Errors/Exceptions: Leaves if memory allocation or ConstructL leaves. - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -CInterferenceHandler* CInterferenceHandler::NewL( - CTestExecution& aExecution ) - { - CInterferenceHandler* self = - new( ELeave ) CInterferenceHandler( aExecution ); - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop( self ); - return self; - - } - -/* -------------------------------------------------------------------------------- - - Class: CInterferenceHandler - - Method: ConstructL - - Description: Second level constructor. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CInterferenceHandler::ConstructL() - { - - } - -/* -------------------------------------------------------------------------------- - - Class: CInterferenceHandler - - Method: CInterferenceHandler - - Description: Constructor - - Parameters: CTestModuleContainer& aExecution :in: "Parent" - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -CInterferenceHandler::CInterferenceHandler( CTestExecution& aExecution ) : - CActive( CActive::EPriorityStandard ), - iExecution( aExecution ) - { - CActiveScheduler::Add ( this ); - - } - -/* -------------------------------------------------------------------------------- - - Class: CInterferenceHandler - - Method: ~CInterferenceHandler - - Description: Destructor. - Cancels active request. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -CInterferenceHandler::~CInterferenceHandler() - { - Cancel(); - - } - -/* -------------------------------------------------------------------------------- - - Class: CInterferenceHandler - - Method: StartL - - Description: Starts to monitor thread. - - Parameters: None - - Return Values: TInt: Always KErrNone - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CInterferenceHandler::StartL() - { - __TRACE( KPrint, ( _L( "CInterferenceHandler::StartL" ) ) ); - - if( IsActive() ) - { - CTestServer::PanicServer( EAlreadyActive ); - } - - iStatus = KRequestPending; - SetActive(); - - // Signal test thread, Notify test thread that operation is done. - iExecution.iInterferenceSem.Signal(); - - } - -/* -------------------------------------------------------------------------------- - - Class: CInterferenceHandler - - Method: RunL - - Description: Handles thread death. - Function does: - 1 ) Stops monitoring thread - 1 ) Marks thread death - 2 ) Completes ongoing requests - 3 ) Cleans the memory - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CInterferenceHandler::RunL() - { - __TRACE( KPrint, ( _L( "CInterferenceHandler::RunL [%d]" ), iStatus.Int() ) ); - - iExecution.DoNotifyInterference(); - - StartL(); - - } - -/* -------------------------------------------------------------------------------- - - Class: CInterferenceHandler - - Method: DoCancel - - Description: Stops interference notification listening. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CInterferenceHandler::DoCancel() - { - __TRACE( KPrint, ( _L( "CInterferenceHandler::DoCancel" ) ) ); - - iExecution.iInterferenceMutex.Wait(); // Take mutex and check test - // interference operation. If - // pending take interference - // semaphore and complete - if( iStatus == KRequestPending ) - { - - TRequestStatus* status = &iStatus; - User::RequestComplete( status, KErrCancel ); - } - - iExecution.iInterferenceMutex.Signal(); - - } - -/* -------------------------------------------------------------------------------- - - Class: CInterferenceHandler - - Method: RunError - - Description: Handle errors. RunL function does not leave, so one should - never come here. - - Print trace and let framework handle error( i.e to do Panic ) - - Parameters: TInt aError: in: Error code - - Return Values: TInt: Error code - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CInterferenceHandler::RunError( TInt aError ) - { - __TRACE( KError,( _L( "CTestInterferenceHandler::RunError" ) ) ); - - return aError; - - } - -/* -------------------------------------------------------------------------------- - - DESCRIPTION - - This module contains implementation of CMeasurementHandler class - member functions. CMeasurementHandler handles test measurement operations - that comes from test execution side to TestServer side. - -------------------------------------------------------------------------------- -*/ - -// ================= MEMBER FUNCTIONS ========================================= - - -/* -------------------------------------------------------------------------------- - - Class: CMeasurementHandler - - Method: NewL - - Description: Constructs a new CMeasurementHandler object. - - Parameters: CTestExecution& aExecution: in: Pointer to test execution side. - - Return Values: CMeasurementHandler*: New undertaker - - Errors/Exceptions: Leaves if memory allocation or ConstructL leaves. - - Status: Approved - -------------------------------------------------------------------------------- -*/ -CMeasurementHandler* CMeasurementHandler::NewL( CTestExecution& aExecution ) - { - CMeasurementHandler* self = - new( ELeave ) CMeasurementHandler( aExecution ); - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop( self ); - return self; - - } - -/* -------------------------------------------------------------------------------- - - Class: CMeasurementHandler - - Method: ConstructL - - Description: Second level constructor. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CMeasurementHandler::ConstructL() - { - - } - -/* -------------------------------------------------------------------------------- - - Class: CMeasurementHandler - - Method: CMeasurementHandler - - Description: Constructor - - Parameters: CTestModuleContainer& aExecution :in: Pointer to test - execution side. - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -CMeasurementHandler::CMeasurementHandler( CTestExecution& aExecution ) : - CActive( CActive::EPriorityStandard ), - iExecution( aExecution ) - { - CActiveScheduler::Add ( this ); - - } - -/* -------------------------------------------------------------------------------- - - Class: CMeasurementHandler - - Method: ~CMeasurementHandler - - Description: Destructor. - Cancels active request. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -CMeasurementHandler::~CMeasurementHandler() - { - Cancel(); - - } - -/* -------------------------------------------------------------------------------- - - Class: CMeasurementHandler - - Method: StartL - - Description: Starts to monitor thread. - - Parameters: None - - Return Values: TInt: Always KErrNone - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CMeasurementHandler::StartL() - { - __TRACE( KPrint, ( _L( "CMeasurementHandler::StartL" ) ) ); - - if( IsActive() ) - { - CTestServer::PanicServer( EAlreadyActive ); - } - - iStatus = KRequestPending; - SetActive(); - - // Do not Signal here because synchronous operations will be executed and we - // don't want to signal at first time: iExecution.iMeasurementSem.Signal(); - // Signal() operation will be handled in RunL in this case. - - } - -/* -------------------------------------------------------------------------------- - - Class: CMeasurementHandler - - Method: RunL - - Description: Derived from CActive, handles test measurement execution. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CMeasurementHandler::RunL() - { - __TRACE( KPrint, ( _L( "CMeasurementHandler::RunL [%d]" ), iStatus.Int() ) ); - - TInt ret( 0 ); - ret = iExecution.DoNotifyMeasurement(); - - // ret value is copied to struct so it can be handled later. - iExecution.iTestMeasurement.iMeasurementStruct.iOperationResult = ret; - - // SetActive again - StartL(); - - // TestServer side operations are done, Signal that operation is done. - iExecution.iMeasurementSem.Signal(); - - } - -/* -------------------------------------------------------------------------------- - - Class: CMeasurementHandler - - Method: DoCancel - - Description: Stops measurement notification listening. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -void CMeasurementHandler::DoCancel() - { - __TRACE( KPrint, ( _L( "CMeasurementHandler::DoCancel" ) ) ); - - iExecution.iMeasurementMutex.Wait(); // Take mutex and check test - // measurement operation. If - // pending take measurement - // semaphore and complete - if( iStatus == KRequestPending ) - { - - TRequestStatus* status = &iStatus; - User::RequestComplete( status, KErrCancel ); - } - - iExecution.iMeasurementMutex.Signal(); - - } - -/* -------------------------------------------------------------------------------- - - Class: CMeasurementHandler - - Method: RunError - - Description: Handle errors. RunL function does not leave, so one should - never come here. - - Print trace and let framework handle error( i.e to do Panic ) - - Parameters: TInt aError: in: Error code - - Return Values: TInt: Error code - - Errors/Exceptions: None - - Status: Approved - -------------------------------------------------------------------------------- -*/ -TInt CMeasurementHandler::RunError( TInt aError ) - { - __TRACE( KError,( - _L( "CMeasurementHandler::RunError with error: %d" ), aError ) ); - - return aError; - - } - -/* -------------------------------------------------------------------------------- - - DESCRIPTION - - This module contains implementation of CCommandHandler class member functions. - CCommandHandler listens command notifications from test thread. - -------------------------------------------------------------------------------- -*/ - -// ================= MEMBER FUNCTIONS ========================================= - - -/* -------------------------------------------------------------------------------- - - Class: CCommandHandler - - Method: NewL - - Description: Constructs a new CCommandHandler object. - - Parameters: CTestExecution& aExecution: in: "Parent" - - Return Values: CCommandHandler*: New object - - Errors/Exceptions: Leaves if memory allocation or ConstructL leaves. - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -CCommandHandler* CCommandHandler::NewL(CTestExecution& aExecution) - { - CCommandHandler* self = new (ELeave) CCommandHandler(aExecution); - CleanupStack::PushL(self); - self->ConstructL(); - CleanupStack::Pop(self); - return self; - } - -/* -------------------------------------------------------------------------------- - - Class: CCommandHandler - - Method: ConstructL - - Description: Second level constructor. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CCommandHandler::ConstructL() - { - } - -/* -------------------------------------------------------------------------------- - - Class: CCommandHandler - - Method: CCommandHandler - - Description: Constructor - - Parameters: CTestExecution& aExecution :in: "Parent" - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -CCommandHandler::CCommandHandler(CTestExecution& aExecution): - CActive(CActive::EPriorityStandard), - iExecution(aExecution) - { - CActiveScheduler::Add (this); - } - -/* -------------------------------------------------------------------------------- - - Class: CCommandHandler - - Method: ~CCommandHandler - - Description: Destructor. - Cancels active request. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -CCommandHandler::~CCommandHandler() - { - Cancel(); - } - -/* -------------------------------------------------------------------------------- - - Class: CCommandHandler - - Method: StartL - - Description: Starts to monitor thread. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CCommandHandler::StartL() - { - __TRACE(KPrint, (_L( "CCommandHandler::StartL" ))); - - if(IsActive()) - { - CTestServer::PanicServer(EAlreadyActive); - } - iStatus = KRequestPending; - SetActive(); - - // Signal test thread - iExecution.iCommandSem.Signal(); - } - -/* -------------------------------------------------------------------------------- - - Class: CCommandHandler - - Method: RunL - - Description: - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -void CCommandHandler::RunL() - { - __TRACE(KPrint, (_L( "CCommandHandler::RunL [%d]"), iStatus.Int())); - - iExecution.DoNotifyCommand(); -// StartL(); - } - - -/* -------------------------------------------------------------------------------- - - Class: CCommandHandler - - Method: DoCancel - - Description: Stops command notification listening. - - Parameters: None - - Return Values: None - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ - -void CCommandHandler::DoCancel() - { - __TRACE(KPrint, (_L("CCommandHandler::DoCancel"))); - - iExecution.iCommandMutex.Wait(); // Take mutex and check test case receive - // operation. If pending take reveive - // semaphore and complete - if(iStatus == KRequestPending) - { - TRequestStatus* status = &iStatus; - User::RequestComplete(status, KErrCancel); - } - - iExecution.iCommandMutex.Signal(); - } - -/* -------------------------------------------------------------------------------- - - Class: CCommandHandler - - Method: RunError - - Description: Handle errors. RunL function does not leave, so one should - never come here. - - Print trace and let framework handle error( i.e to do Panic ) - - Parameters: TInt aError: :in: Error code - - Return Values: TInt Error code - - Errors/Exceptions: None - - Status: Proposal - -------------------------------------------------------------------------------- -*/ -TInt CCommandHandler::RunError(TInt aError) - { - __TRACE(KError, (_L("CCommandHandler::RunError"))); - - return aError; - } - -/* -------------------------------------------------------------------------------- - - Class: CCommandDef - - Method: CCommandDef - - Description: private constructor - - Return Values: void - -------------------------------------------------------------------------------- -*/ - -CCommandDef::CCommandDef() - { - } - -/* -------------------------------------------------------------------------------- - - Class: CCommandDef - - Method: ConstructL - - Description: Second phase constructor - - Return Values: void - -------------------------------------------------------------------------------- -*/ - -void CCommandDef::ConstructL() - { - - } - -/* -------------------------------------------------------------------------------- - - Class: CCommandDef - - Method: NewL - - Description: First phase constructor - - Return Values: void - -------------------------------------------------------------------------------- -*/ - -CCommandDef* CCommandDef::NewL() - { - CCommandDef* self = new(ELeave) CCommandDef; - CleanupStack::PushL(self); - self->ConstructL(); - CleanupStack::Pop(self); - return self; - } - -/* -------------------------------------------------------------------------------- - - Class: CCommandDef - - Method: ~CCommandDef - - Description: destructor - -------------------------------------------------------------------------------- -*/ - -CCommandDef::~CCommandDef() - { - - } - -// End of File