phonesrv_plat/call_information_api/tsrc/src/CPEMessageWaiter.cpp
changeset 0 ff3b6d0fd310
child 19 7d48bed6ce0c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonesrv_plat/call_information_api/tsrc/src/CPEMessageWaiter.cpp	Tue Feb 02 01:11:09 2010 +0200
@@ -0,0 +1,172 @@
+/*
+* 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:
+*
+*/
+#include "CPEMessageWaiter.h"
+
+#include <EUnitMacros.h>
+
+#include "talogger.h"
+#include "CActiveWait.h"
+
+
+_LIT( KPanic, "CPEMessageWaiter" );
+enum TPanic 
+    {
+    EArrivedMessagesOOM
+    };
+
+// Max time msg will be waited. If msg does not arrive in this time
+// test will fail.
+const TInt KDefaultMsgWaitingTimeout = 5000000; 
+
+CPEMessageWaiter* CPEMessageWaiter::NewL()
+    {
+    CPEMessageWaiter* self = new( ELeave )CPEMessageWaiter();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+    
+CPEMessageWaiter::~CPEMessageWaiter()
+    {
+    Cancel();
+    delete iWait;
+    iArrivedMsgs.Close();
+    }
+    
+CPEMessageWaiter::CPEMessageWaiter() : CTimer( CActive::EPriorityStandard )
+    {
+    CActiveScheduler::Add( this );
+    }
+    
+void CPEMessageWaiter::ConstructL()
+    {
+    CTimer::ConstructL();
+    iWait = new( ELeave )CActiveSchedulerWait();
+    }
+    
+void CPEMessageWaiter::WaitForMsg( 
+    MEngineMonitor::TPEMessagesFromPhoneEngine aMsg,
+    TInt aTimeoutInSeconds)
+    {
+    TEFLOGSTRING2( KTAREQEND, "CPEMessageWaiter::WaitForMsg, aMessage %d", aMsg );
+    
+    iWaitedMsgArrived = EFalse;
+    iWaitedMsg = aMsg;
+    
+    After( aTimeoutInSeconds * 1000000 ); // Start timeout 
+    iWait->Start();
+    Cancel(); // Cancel the timer.
+    
+    if( !iWaitedMsgArrived )
+        {
+        TEFLOGSTRING2( KTAREQEND, 
+           "CPEMessageWaiter::WaitForMsg, waited for message %d, and message did not arrive in timeout time", iWaitedMsg );
+        EUNIT_FAIL_TEST( "TIMEOUT: Did not receive waited PE message");      
+        }
+    }
+    
+void CPEMessageWaiter::WaitL(
+    TInt aTimeoutInSeconds )
+    {
+    RTimer timer;
+    User::LeaveIfError( timer.CreateLocal() ); 
+    CleanupClosePushL( timer );
+    CActiveWait* wait = CActiveWait::NewLC();
+    timer.After( wait->Status(), aTimeoutInSeconds * 1000000 );
+    wait->WaitForRequest();
+    CleanupStack::PopAndDestroy( 2 ); // timer, wait*/
+    }
+    
+TBool CPEMessageWaiter::HasMsgArrived( 
+    MEngineMonitor::TPEMessagesFromPhoneEngine aMsg )
+    {
+    return iArrivedMsgs.Find( aMsg ) != KErrNotFound;
+    }
+
+void CPEMessageWaiter::WaitForError( TInt aError )
+    {
+    TEFLOGSTRING2( KTAREQEND, "CPEMessageWaiter::WaitForError, aMessage %d", aError );
+    
+    iWaitedErrorCodeArrived = EFalse;
+    iWaitedErrorCode = aError;
+    
+    After( KDefaultMsgWaitingTimeout ); // Start timeout 
+    iWait->Start();
+    Cancel(); // Cancel the timer.
+    
+    if( !iWaitedErrorCodeArrived )
+        {
+        TEFLOGSTRING2( KTAREQEND, 
+           "CPEMessageWaiter::WaitForError, waited for Error %d, and Error did not arrive in timeout time", iWaitedMsg );
+        EUNIT_FAIL_TEST( "TIMEOUT: Did not receive waited PE Error");      
+        }
+    }
+
+void CPEMessageWaiter::HandleError( 
+    const TPEErrorInfo& aErrorInfo )
+    {
+    TEFLOGSTRING2( KTAREQEND, "CPEMessageWaiter::HandleMessage, aMessage %d", aErrorInfo.iErrorCode );
+    TEFLOGSTRING2( KTAREQEND, "CPEMessageWaiter::WaitForMsg, waited msg %d", iWaitedErrorCode );
+    
+    iLastErrorCode = aErrorInfo.iErrorCode;
+    
+    if( iWait->IsStarted() )
+        {
+        if( aErrorInfo.iErrorCode == iWaitedErrorCode && aErrorInfo.iErrorCode  )
+            {
+            TEFLOGSTRING( KTAREQEND, 
+                "CPEMessageWaiter::HandleError: Waited ErrorCode received );");
+            iWaitedErrorCodeArrived = ETrue;
+            iWait->AsyncStop();
+            }
+        }
+    }
+
+void CPEMessageWaiter::HandleMessage( 
+    const TInt aMessage, 
+    const TInt /*aCallId*/ )
+    {
+    TEFLOGSTRING2( KTAREQEND, "CPEMessageWaiter::HandleMessage, aMessage %d", aMessage );
+    TEFLOGSTRING2( KTAREQEND, "CPEMessageWaiter::WaitForMsg, waited msg %d", iWaitedMsg );
+    __ASSERT_ALWAYS( iArrivedMsgs.Append( static_cast<MEngineMonitor::TPEMessagesFromPhoneEngine>( aMessage ) ) == KErrNone, User::Panic( KPanic, EArrivedMessagesOOM ) );
+    
+    if( iWait->IsStarted() )
+        {
+        if( aMessage == iWaitedMsg )
+            {
+            TEFLOGSTRING( KTAREQEND, 
+                "CPEMessageWaiter::HandleMessage: Waited message received");
+            iWaitedMsgArrived = ETrue;
+            iWait->AsyncStop();
+            }
+        }
+    }
+
+void CPEMessageWaiter::RunL()
+    {
+    if( iWait->IsStarted() )
+        {
+        iWait->AsyncStop();
+        }     
+    }
+
+TInt CPEMessageWaiter::LastErrorCode()
+    {
+    return iLastErrorCode;
+    }
+