diff -r 000000000000 -r 1bce908db942 multimediacommsengine/mmcesrv/mmcemediamanager/src/mcedtmfhandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommsengine/mmcesrv/mmcemediamanager/src/mcedtmfhandler.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,323 @@ +/* +* Copyright (c) 2005 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 "mcedtmfhandler.h" +#include "mcemmlogs.h" +#include "mceevents.h" +#include "mcesrvstream.h" +#include "mcesrvsource.h" +#include "mcecomsession.h" +#include "mcecommediasource.h" +#include "mcesrvstreamiterator.h" +#include + +const TInt KMceDtmfToneMaxLen = 2; +MCEIDS_DEFINE_SPARE_INDEX_1( KMceDtmfToneIndex ); +MCEIDS_DEFINE_SPARE_INDEX_2( KMceDtmfToneDurationIndex ); + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CMceDtmfHandler::NewL +// ----------------------------------------------------------------------------- +// +CMceDtmfHandler* CMceDtmfHandler::NewL( + CMceSrvStream& aStream, + CMccInterface& aMccInterface ) + { + CMceDtmfHandler* self = + new ( ELeave ) CMceDtmfHandler( aStream, aMccInterface ); + return self; + } + +// ----------------------------------------------------------------------------- +// CMceDtmfHandler::DtmfL +// ----------------------------------------------------------------------------- +// +void CMceDtmfHandler::DtmfL( + CMceComMediaSource& aSource, + TMceComEvent& aEvent, + const TDesC8& aSequence ) + { + MCEMM_DEBUG( "CMceDtmfHandler::DtmfL, Entry" ) + + // Store source and stream ids, since multiple sources can use the same + // dtmf stream.Received dtmf events will be routed to last one who has + // used the stream. + + TMceSrvStreamIterator streams( aSource.MediaStream()->Session()->MccStreams(), + *aSource.MediaStream() ); + CMceSrvStream* stream = NULL; + __ASSERT_ALWAYS( streams.Next( stream ), User::Leave( KErrNotSupported ) ); + iCurrentUserStreamId = stream->Id(); + iCurrentUserSourceId = stream->Source().Id(); + + MCEMM_DEBUG_DVALUE( "CMceDtmfHandler::DtmfL, current streamId", + iCurrentUserStreamId ) + MCEMM_DEBUG_DVALUE( "CMceDtmfHandler::DtmfL, current sourceId", + iCurrentUserSourceId ) + + TMceIds& ids = aEvent.Id(); + + switch( aEvent.Action() ) + { + case EMceItcIsDtmfActive: + { + ids.iSpare1 = IsDtmfActive(); + break; + } + case EMceItcStartDtmfTone: + { + TBuf8 tone; + tone.Append( static_cast( ids.Get( KMceDtmfToneIndex ) ) ); + SendDtmfStringL( KMccDtmfSigStartTone, tone ); + SetDtmfActive( ETrue ); + break; + } + case EMceItcStopDtmfTone: + { + StopDtmfL(); + break; + } + case EMceItcSendDtmfTone: + { + TUint32 duration = ids.Get( KMceDtmfToneDurationIndex ); + TMccDtmfEventType eventType = + ( duration > 0 ) ? KMccDtmfSigStartTone : KMccDtmfSigSendString; + TBuf8 tone; + tone.Append( static_cast( ids.Get( KMceDtmfToneIndex ) ) ); + SendDtmfStringL( eventType, + tone, + duration ); + break; + } + case EMceItcSendDtmfToneSequence: + { + __ASSERT_ALWAYS( aSequence.Length() > 0, User::Leave( KErrArgument ) ); + SendDtmfStringL( KMccDtmfSigSendString, aSequence ); + break; + } + case EMceItcCancelSendDtmfToneSequence: + { + // Will need checking if some other actions need to be taken here. + SendDtmfStringL( KMccDtmfSigCancelSending ); + break; + } + default: + { + break; + } + } + + MCEMM_DEBUG( "CMceDtmfHandler::DtmfL, Exit" ) + } + +// ----------------------------------------------------------------------------- +// CMceDtmfHandler::DtmfReceivedL +// ----------------------------------------------------------------------------- +// +void CMceDtmfHandler::DtmfReceivedL( + const TMccEvent& aMccEvent, + TMceMccComEvent& aEvent ) + { + const TMccDtmfEventData& dtmfEvent = + (*reinterpret_cast( + &aMccEvent.iEventData ))(); + + if ( dtmfEvent.iDtmfEventType == KMccDtmfSequenceStop ) + { + // This event can be ignored, it just means that one tone of the + // seuence was completed, KMccDtmfSendingComplete will tell that + // whole sequence was completed (client will receive as many started + // events as there is tones but only one completed event). + aEvent.iEvent = KMccEventNone; + } + else + { + aEvent.iEventSubType = dtmfEvent.iDtmfEventType; + aEvent.iStreamId = iCurrentUserStreamId; + aEvent.iEndpointId = iCurrentUserSourceId; + + if ( aEvent.iEventSubType == KMccDtmfManualAbort || + aEvent.iEventSubType == KMccDtmfSequenceAbort ) + { + // Error occured, no need to send stop dtmf event + SetDtmfActive( EFalse ); + Cancel(); + } + + MCEMM_DEBUG_DVALUE( "CMceDtmfHandler::DtmfReceivedL, subtype:", aEvent.iEventSubType ) + } + } + +// ----------------------------------------------------------------------------- +// CMceDtmfHandler::RunL +// ----------------------------------------------------------------------------- +// +void CMceDtmfHandler::RunL() + { + MCEMM_DEBUG( "CMceDtmfHandler::RunL, tone expired" ) + StopDtmfL(); + } + +// ----------------------------------------------------------------------------- +// CMceDtmfHandler::DoCancel +// ----------------------------------------------------------------------------- +// +void CMceDtmfHandler::DoCancel() + { + MCEMM_DEBUG( "CMceDtmfHandler::DoCancel, stopping dtmf sending" ) + iTimer.Cancel(); + if ( IsDtmfActive() ) + { + SetDtmfActive( EFalse ); + TRAP_IGNORE( SendDtmfStringL( KMccDtmfSigStopTone ) ) + } + } + +// ----------------------------------------------------------------------------- +// CMceDtmfHandler::RunError +// ----------------------------------------------------------------------------- +// +TInt CMceDtmfHandler::RunError( TInt aError ) + { + MCEMM_DEBUG_DVALUE( "CMceDtmfHandler::RunError, error:", aError ) + if ( aError != KErrNoMemory ) + { + aError = KErrNone; + } + return aError; + } + +// ----------------------------------------------------------------------------- +// CMceDtmfHandler::SendDtmfStringL +// ----------------------------------------------------------------------------- +// +void CMceDtmfHandler::SendDtmfStringL( + TMccDtmfEventType aDtmfEventType, + const TDesC8& aDtmfString, + TUint32 aDurationInMicroSecs ) + { + MCEMM_DEBUG_DVALUE( "CMceDtmfHandler::SendDtmfString, type:", aDtmfEventType ) + MCEMM_DEBUG_SVALUE( "CMceDtmfHandler::SendDtmfString, string:", aDtmfString ) + + __ASSERT_ALWAYS( aDtmfString.Length() <= KMccMaxDtmfStringLength, + User::Leave( KErrArgument ) ); + __ASSERT_ALWAYS( !IsDtmfActive(), User::Leave( KErrInUse ) ); + + TMccEvent* event = new ( ELeave ) TMccEvent; + CleanupStack::PushL( event ); + + event->iEventCategory = KMccEventCategoryDtmf; + event->iEventType = KMccDtmfControl; + event->iSessionId = iStream.SessionId(); + event->iLinkId = iStream.LinkId(); + event->iStreamId = iStream.Id(); + + { + TMccDtmfEventData eventData; + eventData.iDtmfEventType = aDtmfEventType; + eventData.iDtmfString.Copy( aDtmfString ); + TMccDtmfEventDataPackage eventDataBuf( eventData ); + event->iEventData.Copy( eventDataBuf ); + } + + iMccInterface.SendMediaSignalL( *event ); + + CleanupStack::PopAndDestroy( event ); + + if ( aDurationInMicroSecs > 0 ) + { + MCEMM_DEBUG( "CMceDtmfHandler::SendDtmfString, activate stop timer" ) + iTimer.After( iStatus, TTimeIntervalMicroSeconds32( aDurationInMicroSecs ) ); + SetActive(); + SetDtmfActive( ETrue ); + } + + MCEMM_DEBUG( "CMceDtmfHandler::SendDtmfString, Exit" ) + } + +// ----------------------------------------------------------------------------- +// CMceDtmfHandler::StopDtmfL +// ----------------------------------------------------------------------------- +// +void CMceDtmfHandler::StopDtmfL() + { + MCEMM_DEBUG( "CMceDtmfHandler::StopDtmfL" ) + + Cancel(); + + if ( IsDtmfActive() ) + { + MCEMM_DEBUG( "CMceDtmfHandler::StopDtmfL, stopping dtmf sending" ) + + SetDtmfActive( EFalse ); + SendDtmfStringL( KMccDtmfSigStopTone ); + } + } + +// ----------------------------------------------------------------------------- +// CMceDtmfHandler::SetDtmfActive +// ----------------------------------------------------------------------------- +// +void CMceDtmfHandler::SetDtmfActive( TBool aIsActive ) + { + iSendingDtmf = aIsActive; + } + +// ----------------------------------------------------------------------------- +// CMceDtmfHandler::IsDtmfActive +// ----------------------------------------------------------------------------- +// +TBool CMceDtmfHandler::IsDtmfActive() const + { + return iSendingDtmf; + } + +// ----------------------------------------------------------------------------- +// CMceDtmfHandler::~CMceDtmfHandler +// ----------------------------------------------------------------------------- +// +CMceDtmfHandler::~CMceDtmfHandler() + { + MCEMM_DEBUG( "CMceDtmfHandler::~CMceDtmfHandler, Entry" ) + TRAP_IGNORE( StopDtmfL() ); + iTimer.Close(); + MCEMM_DEBUG( "CMceDtmfHandler::~CMceDtmfHandler, Exit" ) + } + +// ----------------------------------------------------------------------------- +// CMceDtmfHandler::CMceDtmfHandler +// ----------------------------------------------------------------------------- +// +CMceDtmfHandler::CMceDtmfHandler( + CMceSrvStream& aStream, + CMccInterface& aMccInterface ) : + CActive( EPriorityStandard ), + iStream( aStream ), + iMccInterface( aMccInterface ) + { + CActiveScheduler::Add( this ); + + iTimer.CreateLocal(); + } + +// End of file +