multimediacommsengine/mmcesrv/mmcemediamanager/src/mcedtmfhandler.cpp
changeset 0 1bce908db942
--- /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 <mmccinterface.h>
+
+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<KMceDtmfToneMaxLen> tone;
+            tone.Append( static_cast<TChar>( 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<KMceDtmfToneMaxLen> tone;
+            tone.Append( static_cast<TChar>( 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<const TMccDtmfEventDataPackage*>( 
+                        &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
+