diff -r 000000000000 -r ff3b6d0fd310 convergedcallengine/cce/src/cccecallobserverasynchroniser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/convergedcallengine/cce/src/cccecallobserverasynchroniser.cpp Tue Feb 02 01:11:09 2010 +0200 @@ -0,0 +1,322 @@ +/* +* Copyright (c) 2006 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: Asynchronises cce call observer calls +* +*/ + + +// INCLUDE FILES + +#include "cccecallobserverasynchroniser.h" +#include "cccelogger.h" + +// ======== MEMBER FUNCTIONS ======== + +// ----------------------------------------------------------------------------- +// NewL() +// Two-phased constructor +// ----------------------------------------------------------------------------- + +CCCECallObserverAsynchroniser* CCCECallObserverAsynchroniser::NewL() + { + CCCECallObserverAsynchroniser* self = CCCECallObserverAsynchroniser::NewLC(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// NewLC() +// Two-phased constructor +// Leaves pointer in cleanup stack +// ----------------------------------------------------------------------------- + +CCCECallObserverAsynchroniser* CCCECallObserverAsynchroniser::NewLC() + { + CCCECallObserverAsynchroniser* self = new( ELeave ) CCCECallObserverAsynchroniser(); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +CCCECallObserverAsynchroniser::~CCCECallObserverAsynchroniser() + { + Cancel(); + iEvents.Close(); + } + +// ----------------------------------------------------------------------------- +// Set call observer +// ----------------------------------------------------------------------------- +void CCCECallObserverAsynchroniser::SetMCCECallObserver( MCCECallObserver* aObserver ) + { + CCELOGSTRING( "CCCECallObserverAsynchroniser::SetMCCECallObserver()" ); + iCCECallObserver = aObserver; + if ( iIsRuning && aObserver ) + { + if( !IsActive() ) + { + SetActive(); + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + } + } + else + { + Cancel(); + iEvents.Reset(); + } + } + +// ----------------------------------------------------------------------------- +// get call observer +// ----------------------------------------------------------------------------- +MCCECallObserver* CCCECallObserverAsynchroniser::GetMCCECallObserver() + { + return iCCECallObserver; + } + +// ----------------------------------------------------------------------------- +// CActive RunL +// ----------------------------------------------------------------------------- +void CCCECallObserverAsynchroniser::RunL() + { + CCELOGSTRING2( "CCCECallObserverAsynchroniser::RunL() events: %d", iEvents.Count() ); + + if ( !iCCECallObserver ) + { + CCELOGSTRING( "CCCECallObserverAsynchroniser::RunL() No observer!"); + return; + } + + while (iEvents.Count() > 0) + { + switch ( iEvents[0].iEventType ) + { + case EErrorOccurred: + { + CCELOGSTRING( "CCCECallObserverAsynchroniser::RunL() Event: EErrorOccurred"); + iCCECallObserver->ErrorOccurred( + (TCCPError)iEvents[0].iInt1 ); + break; + } + + case ECallStateChanged: + { + CCELOGSTRING( "CCCECallObserverAsynchroniser::RunL() Event: ECallStateChanged"); + iCCECallObserver->CallStateChanged( + (CCPCall::TCallState)iEvents[0].iInt1 ); + break; + } + + case ECallStateChangedWithInband: + { + CCELOGSTRING( "CCCECallObserverAsynchroniser::RunL() Event: ECallStateChangedWithInband"); + iCCECallObserver->CallStateChangedWithInband( + (CCPCall::TCallState)iEvents[0].iInt1 ); + break; + } + + case ECallEventOccurred: + { + CCELOGSTRING( "CCCECallObserverAsynchroniser::RunL() Event: ECallEventOccurredanged"); + iCCECallObserver->CallEventOccurred( + (MCCECallObserver::TCCECallEvent)iEvents[0].iInt1 ); + break; + } + + case ECallDurationChanged: + { + CCELOGSTRING( "CCCECallObserverAsynchroniser::RunL() Event: ECallDurationChanged"); + iCCECallObserver->CallDurationChanged(iEvents[0].iDuration ); + break; + } + + case ECallCapsChanged: + { + CCELOGSTRING( "CCCECallObserverAsynchroniser::RunL() Event: ECallCapsChanged"); + iCCECallObserver->CallCapsChanged( + (MCCECallObserver::TCCECallControlCaps)iEvents[0].iInt1 ); + break; + } + + case EHandleTransfer: + { + CCELOGSTRING( "CCCECallObserverAsynchroniser::RunL() Event: EHandleTransfer"); + iCCECallObserver->HandleTransfer(iEvents[0].iBoolean, *iEvents[0].iDescriptor ); + break; + } + } + + if( iEvents.Count() ) + { + iEvents.Remove( 0 ); + iEvents.Compress(); + } + } + + iIsRuning = EFalse; + } + +// ----------------------------------------------------------------------------- +// CActive RunError +// ----------------------------------------------------------------------------- +TInt CCCECallObserverAsynchroniser::RunError(TInt aError) + { + return aError; + } + +// ----------------------------------------------------------------------------- +// CActive DoCancel +// ----------------------------------------------------------------------------- +void CCCECallObserverAsynchroniser::DoCancel() + { + iEvents.Reset(); + iIsRuning = EFalse; + } + +// ----------------------------------------------------------------------------- +// MCCECallObserver ErrorOccurred +// ----------------------------------------------------------------------------- +void CCCECallObserverAsynchroniser::ErrorOccurred( const TCCPError aError ) + { + CCELOGSTRING( "CCCECallObserverAsynchroniser::ErrorOccurred"); + TEventStorage event; + event.iEventType = EErrorOccurred; + event.iInt1 = aError; + AddEvent(event); + + } + +// ----------------------------------------------------------------------------- +// MCCECallObserver CallStateChanged +// ----------------------------------------------------------------------------- +void CCCECallObserverAsynchroniser::CallStateChanged( + const CCPCall::TCallState aState ) + { + CCELOGSTRING( "CCCECallObserverAsynchroniser::CallStateChanged"); + TEventStorage event; + event.iEventType = ECallStateChanged; + event.iInt1 = aState; + AddEvent(event); + + } + +// ----------------------------------------------------------------------------- +// MCCECallObserver CallStateChangedWithInband +// ----------------------------------------------------------------------------- +void CCCECallObserverAsynchroniser::CallStateChangedWithInband( + const CCPCall::TCallState aState ) + { + CCELOGSTRING( "CCCECallObserverAsynchroniser::CallStateChangedWithInband"); + TEventStorage event; + event.iEventType = ECallStateChangedWithInband; + event.iInt1 = aState; + AddEvent(event); + + } + +// ----------------------------------------------------------------------------- +// MCCECallObserver CallEventOccurred +// ----------------------------------------------------------------------------- +void CCCECallObserverAsynchroniser::CallEventOccurred( + const MCCECallObserver::TCCECallEvent aEvent ) + { + CCELOGSTRING( "CCCECallObserverAsynchroniser::CallEventOccurred"); + TEventStorage event; + event.iEventType = ECallEventOccurred; + event.iInt1 = aEvent; + AddEvent(event); + + } + +// ----------------------------------------------------------------------------- +// MCCECallObserver CallDurationChanged +// ----------------------------------------------------------------------------- +void CCCECallObserverAsynchroniser::CallDurationChanged( + const TTimeIntervalSeconds aDuration ) + { + CCELOGSTRING( "CCCECallObserverAsynchroniser::CallDurationChanged"); + TEventStorage event; + event.iEventType = ECallDurationChanged; + event.iDuration = aDuration; + AddEvent(event); + } + +// ----------------------------------------------------------------------------- +// MCCECallObserver CallCapsChanged +// ----------------------------------------------------------------------------- +void CCCECallObserverAsynchroniser::CallCapsChanged( + const MCCECallObserver::TCCECallControlCaps aCaps ) + { + CCELOGSTRING( "CCCECallObserverAsynchroniser::CallCapsChanged"); + TEventStorage event; + event.iEventType = ECallCapsChanged; + event.iInt1 = aCaps; + AddEvent(event); + } + +// ----------------------------------------------------------------------------- +// MCCECallObserver HandleTransfer +// ----------------------------------------------------------------------------- +void CCCECallObserverAsynchroniser::HandleTransfer( const TBool aAttended, + const TDesC& aDestination ) + { + CCELOGSTRING( "CCCECallObserverAsynchroniser::HandleTransfer"); + TEventStorage event; + event.iEventType = EHandleTransfer; + event.iBoolean = aAttended; + event.iDescriptor = &aDestination; + AddEvent(event); + } + +// ----------------------------------------------------------------------------- +// Constructor +// ----------------------------------------------------------------------------- +CCCECallObserverAsynchroniser::CCCECallObserverAsynchroniser() + :CActive( EPriorityStandard ), iIsRuning( EFalse ) + { + } + + +// ----------------------------------------------------------------------------- +// Leaving stuff in constructor +// ----------------------------------------------------------------------------- +void CCCECallObserverAsynchroniser::ConstructL() + { + CActiveScheduler::Add( this ); + } + +// ----------------------------------------------------------------------------- +// Adding event to queue +// ----------------------------------------------------------------------------- +void CCCECallObserverAsynchroniser::AddEvent( TEventStorage aEvent ) + { + iEvents.Append(aEvent); + CCELOGSTRING( "CCCECallObserverAsynchroniser::AddEvent"); + if (!iIsRuning) + { + CCELOGSTRING( "CCCECallObserverAsynchroniser::AddEvent Activating..."); + iIsRuning = ETrue; + if (iCCECallObserver) + { + SetActive(); + TRequestStatus* status = &iStatus; + User::RequestComplete(status, KErrNone); + } + } + } +// end of file