diff -r 000000000000 -r a4daefaec16c callcontinuity/vcc/src/cvccdtmfprovider.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/callcontinuity/vcc/src/cvccdtmfprovider.cpp Mon Jan 18 20:12:36 2010 +0200 @@ -0,0 +1,263 @@ +/* +* Copyright (c) 2008 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: Sends and receives DTMF tones +* +*/ + +#include + +#include "cvccdtmfprovider.h" +#include "cvccdirector.h" +#include "rubydebug.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Symbian constructor +// --------------------------------------------------------------------------- +// +CVccDtmfProvider* CVccDtmfProvider::NewL( + RPointerArray& /*aProviders*/, + const MCCPDTMFObserver& aObserver, + CVccDirector& aDirector ) + { + RUBY_DEBUG_BLOCK( "CVccDtmfProvider::NewL" ); + CVccDtmfProvider* self; + self = new( ELeave ) CVccDtmfProvider( aObserver, aDirector ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CVccDtmfProvider::~CVccDtmfProvider() + { + iObservers.Close(); + iProviders.Close(); + } + +// --------------------------------------------------------------------------- +// CVccDtmfProvider::CVccDtmfProvider +// C++ default constructor can NOT contain any code, that might leave. +// --------------------------------------------------------------------------- +// +CVccDtmfProvider::CVccDtmfProvider( const MCCPDTMFObserver& aObserver, + CVccDirector& aDirector): + iDirector( &aDirector ) + { + RUBY_DEBUG_BLOCK( "CVccDtmfProvider::CVccDtmfProvider" ); + iObservers.InsertInAddressOrder( &aObserver ); + } + +// --------------------------------------------------------------------------- +// 2nd phase constructor +// --------------------------------------------------------------------------- +// +void CVccDtmfProvider::ConstructL() + { + RUBY_DEBUG_BLOCKL( "CVccDtmfProvider::ConstructL" ); + } + + +// --------------------------------------------------------------------------- +// @ see MCCPDTMFObserver::HandleDTMFEvent +// --------------------------------------------------------------------------- +// +void CVccDtmfProvider::HandleDTMFEvent( const MCCPDTMFObserver::TCCPDtmfEvent aEvent, + const TInt aError, + const TChar aTone ) const + { + RUBY_DEBUG_BLOCK( "CVccDtmfProvider::HandleDTMFEvent" ); + RUBY_DEBUG1( "CVccDtmfProvider::HandleDTMFEvent -- obs count: %d", + iObservers.Count() ); + for ( TInt i = 0; i < iObservers.Count(); i++ ) + { + iObservers[i]->HandleDTMFEvent( aEvent, aError, aTone ); + } + } + +// --------------------------------------------------------------------------- +// @see MCCPDTMFProvider::CancelDtmfStringSending +// --------------------------------------------------------------------------- +// +TInt CVccDtmfProvider::CancelDtmfStringSending() + { + RUBY_DEBUG_BLOCK( "CVccDtmfProvider::CancelDtmfStringSending" ); + RUBY_DEBUG1( "-- call type = %d (0 = cs, 4 = ps)", + iDirector->CurrentCallTypeForDTMF() ); + TInt err( KErrNotSupported ); + + CConvergedCallProvider* prov = iDirector->GetProvider(); + if( prov ) + { + MCCPDTMFProvider* dtmf = NULL; + TRAPD( err1, dtmf = prov->DTMFProviderL( *this ) ); + if( err1 == KErrNone ) + { + err = dtmf->CancelDtmfStringSending(); + } + else + { + err = err1; + } + + } + + RUBY_DEBUG1( "err = %d ", err ); + + return err; + } + +// --------------------------------------------------------------------------- +// @see MCCPDTMFProvider::StartDtmfTone +// --------------------------------------------------------------------------- +// +TInt CVccDtmfProvider::StartDtmfTone( const TChar aTone ) + { + RUBY_DEBUG_BLOCK( "CVccDtmfProvider::StartDtmfTone" ); + RUBY_DEBUG1( "-- call type = %d (0 = cs, 4 = ps)", + iDirector->CurrentCallTypeForDTMF() ); + TInt err( KErrNotSupported ); + + CConvergedCallProvider* prov = iDirector->GetProvider(); + if( prov ) + { + MCCPDTMFProvider* dtmf = NULL; + TRAPD( err1, dtmf = prov->DTMFProviderL( *this ) ); + if( err1 == KErrNone ) + { + err = dtmf->StartDtmfTone( aTone ); + } + else + { + err = err1; + } + } + return err; + } + +// --------------------------------------------------------------------------- +// @see MCCPDTMFProvider::StopDtmfTone +// --------------------------------------------------------------------------- +// +TInt CVccDtmfProvider::StopDtmfTone() + { + RUBY_DEBUG_BLOCK( "CVccDtmfProvider::StopDtmfTone" ); + RUBY_DEBUG1( "-- call type = %d (0 = cs, 4 = ps)", + iDirector->CurrentCallTypeForDTMF() ); + TInt err( KErrNotSupported ); + CConvergedCallProvider* prov = iDirector->GetProvider(); + if( prov ) + { + MCCPDTMFProvider* dtmf = NULL; + TRAPD( err1, dtmf = prov->DTMFProviderL( *this ) ); + if( err1 == KErrNone ) + { + err = dtmf->StopDtmfTone(); + } + else + { + err = err1; + } + } + return err; + } + +// --------------------------------------------------------------------------- +// @see MCCPDTMFProvider::SendDtmfToneString +// --------------------------------------------------------------------------- +// +TInt CVccDtmfProvider::SendDtmfToneString( const TDesC& aString ) + { + RUBY_DEBUG_BLOCK( "CVccDtmfProvider::SendDtmfToneString" ); + RUBY_DEBUG1( "-- call type = %d (0 = cs, 4 = ps)", + iDirector->CurrentCallTypeForDTMF() ); + TInt err( KErrNotSupported ); + + CConvergedCallProvider* prov = iDirector->GetProvider(); + if( prov ) + { + MCCPDTMFProvider* dtmf = NULL; + TRAPD( err1, dtmf = prov->DTMFProviderL( *this ) ); + if( err1 == KErrNone ) + { + err = dtmf->SendDtmfToneString( aString ); + } + else + { + err = err1; + } + } + RUBY_DEBUG1( "err = %d ", err ); + + return err; + } + +// --------------------------------------------------------------------------- +// @see MCCPDTMFProvider::ContinueDtmfStringSending +// --------------------------------------------------------------------------- +// +TInt CVccDtmfProvider::ContinueDtmfStringSending( const TBool aContinue ) + { + RUBY_DEBUG_BLOCK( "CVccDtmfProvider::ContinueDtmfStringSending" ); + RUBY_DEBUG1( "-- call type = %d (0 = cs, 4 = ps)", + iDirector->CurrentCallTypeForDTMF() ); + TInt err ( KErrNotSupported ); + + CConvergedCallProvider* prov = iDirector->GetProvider(); + if( prov ) + { + MCCPDTMFProvider* dtmf = NULL; + TRAPD( err1, dtmf = prov->DTMFProviderL( *this ) ); + if( err1 == KErrNone ) + { + err = dtmf->ContinueDtmfStringSending( aContinue ); + } + else + { + err = err1; + } + } + return err; + } + +// --------------------------------------------------------------------------- +// @see MCCPDTMFProvider::AddObserverL +// --------------------------------------------------------------------------- +// +void CVccDtmfProvider::AddObserverL( const MCCPDTMFObserver& aObserver ) + { + RUBY_DEBUG_BLOCK( "CVccDtmfProvider::AddObserverL" ); + iObservers.InsertInAddressOrderL( &aObserver ); + } + +// --------------------------------------------------------------------------- +// @see MCCPDTMFProvider::RemoveObserver +// --------------------------------------------------------------------------- +// +TInt CVccDtmfProvider::RemoveObserver( const MCCPDTMFObserver& aObserver ) + { + RUBY_DEBUG_BLOCK( "CVccDtmfProvider::RemoveObserver" ); + TInt res = iObservers.Find( &aObserver ); + if ( res != KErrNotFound ) + { + iObservers.Remove( res ); + res = KErrNone; + } + return res; + }