diff -r 000000000000 -r 1bce908db942 multimediacommscontroller/tsrc/componenttests/src/test_dtmf.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommscontroller/tsrc/componenttests/src/test_dtmf.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,659 @@ +/* +* 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: +* +*/ + + + + +// INCLUDES +#include "test_dtmf.h" +#include "mccteststubs.h" +#include "mmccinterface.h" +#include "mmcccodecinformation.h" +#include "testdefinitions.hrh" + +// ======== MEMBER FUNCTIONS ================================================= + +// --------------------------------------------------------------------------- +// CTest::CTest +// C++ default constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------------------------- +// +CTestDtmf::CTestDtmf( CConsoleBase& aConsole, + const TMccNetSettings& aNetsettings ) + : iConsole( aConsole ), iNetsettings( aNetsettings ) + { + } + +// --------------------------------------------------------------------------- +// CTestDtmf::ConstructL +// Symbian 2nd phase constructor can leave. +// --------------------------------------------------------------------------- +// +void CTestDtmf::ConstructL() + { + } + +// --------------------------------------------------------------------------- +// CTestDtmf::NewL +// Static constructor. +// --------------------------------------------------------------------------- +// +CTestDtmf* CTestDtmf::NewL( CConsoleBase& aConsole, + const TMccNetSettings& aNetsettings ) + { + CTestDtmf* self = new ( ELeave ) CTestDtmf( aConsole, aNetsettings ); + CleanupStack::PushL( self ); + + self->ConstructL(); + + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CTestDtmf::~CTestDtmf +// Destructor. +// --------------------------------------------------------------------------- +// +CTestDtmf::~CTestDtmf() + { + } + +// --------------------------------------------------------------------------- +// CTestDtmf:: +// --------------------------------------------------------------------------- +// +void CTestDtmf::DoRunDtmfTestsL() + { + iConsole.Printf( _L("\n** DTMF TESTS **\n") ); + iConsole.Printf( _L("Stream creation\n") ); + + RDebug::Print( _L("Mcc_COM_TEST_START: TestStreamCreationL - INBAND") ); + __UHEAP_MARK; + TestStreamCreationL( EInbandSignal ); + __UHEAP_MARKEND; + RDebug::Print( _L("Mcc_COM_TEST_STOP: TestStreamCreationL - INBAND") ); + + RDebug::Print( _L("Mcc_COM_TEST_START: TestStreamCreationL - OUTBAND") ); + __UHEAP_MARK; + TestStreamCreationL( EOutbandSignal ); + __UHEAP_MARKEND; + RDebug::Print( _L("Mcc_COM_TEST_STOP: TestStreamCreationL - OUTBAND") ); + + iConsole.Printf( _L("Stream ctrl\n") ); + RDebug::Print( _L("Mcc_COM_TEST_START: TestStreamControlL - INBAND") ); + __UHEAP_MARK; + TestStreamControlL( EInbandSignal ); + __UHEAP_MARKEND; + RDebug::Print( _L("Mcc_COM_TEST_STOP: TestStreamControlL - INBAND") ); + + RDebug::Print( _L("Mcc_COM_TEST_START: TestStreamControlL - OUTBAND") ); + __UHEAP_MARK; + TestStreamControlL( EOutbandSignal ); + __UHEAP_MARKEND; + RDebug::Print( _L("Mcc_COM_TEST_STOP: TestStreamControlL - OUTBAND") ); + + iConsole.Printf( _L("DTMF digit sending - INBAND\n") ); + RDebug::Print( _L("Mcc_COM_TEST_START: TestManualDtmfSendingL - INBAND") ); + __UHEAP_MARK; + TestManualDtmfSendingL( EInbandSignal ); + __UHEAP_MARKEND; + RDebug::Print( _L("Mcc_COM_TEST_STOP: TestManualDtmfSendingL - INBAND") ); + + iConsole.Printf( _L("DTMF digit sending - OUTBAND\n") ); + RDebug::Print( _L("Mcc_COM_TEST_START: TestManualDtmfSendingL - OUTBAND") ); + __UHEAP_MARK; + TestManualDtmfSendingL( EOutbandSignal ); + __UHEAP_MARKEND; + RDebug::Print( _L("Mcc_COM_TEST_STOP: TestManualDtmfSendingL - OUTBAND") ); + + iConsole.Printf( _L("DTMF string sending - INBAND\n") ); + RDebug::Print( _L("Mcc_COM_TEST_START: TestAutomaticDtmfSendingL - INBAND") ); + __UHEAP_MARK; + TestAutomaticDtmfSendingL( EInbandSignal ); + __UHEAP_MARKEND; + RDebug::Print( _L("Mcc_COM_TEST_STOP: TestAutomaticDtmfSendingL - INBAND") ); + + iConsole.Printf( _L("DTMF STRING sending - OUTBAND\n") ); + RDebug::Print( _L("Mcc_COM_TEST_START: TestAutomaticDtmfSendingL - OUTBAND") ); + __UHEAP_MARK; + TestAutomaticDtmfSendingL( EOutbandSignal ); + __UHEAP_MARKEND; + RDebug::Print( _L("Mcc_COM_TEST_STOP: TestAutomaticDtmfSendingL - OUTBAND") ); + } + +// --------------------------------------------------------------------------- +// CTestDtmf::TestStreamCreationL +// --------------------------------------------------------------------------- +// +void CTestDtmf::TestStreamCreationL( TDtmfSignalType aSigType ) + { + TMccNetSettings tempSettings = iNetsettings; + + CMccInterfaceStub* stub = CMccInterfaceStub::NewL(); + CleanupStack::PushL( stub ); + CMccInterface* interface = CMccInterface::NewL( *stub ); + CleanupStack::PushL( interface ); + + TUint32 sessionId; + User::LeaveIfError( interface->CreateSession( sessionId ) ); + + TUint32 linkId; + TInt linkType( KMccLinkGeneral ); + User::LeaveIfError( interface->CreateLink( sessionId, linkType, linkId, + tempSettings ) ); + stub->WaitForEvent( sessionId, linkId, 0, KMccLinkCreated ); + + CMccCodecInformation* cInfo + = FetchCodecByMimeSubtypeNameL( *interface, KTxtDtmf ); + CleanupStack::PushL( cInfo ); + + if ( aSigType == EInbandSignal ) + { + cInfo->SetCodecMode( EDTMFModeInband ); + } + else + { + cInfo->SetCodecMode( EDTMFModeEvent ); + } + + TUint32 streamId( 0 ); + TUint32 endpointId1( 0 ), endpointId2( 0 ); + User::LeaveIfError( + interface->AddDataSink( KMccRtpSinkUid, KNullDesC8, endpointId1 ) ); + User::LeaveIfError( + interface->AddDataSource( KMccRtpSourceUid, KNullDesC8, endpointId2 ) ); + + User::LeaveIfError( interface->CreateStream( sessionId, linkId, streamId, + KMccDtmfStream, *cInfo ) ); + + User::LeaveIfError( interface->DeleteStream( sessionId, linkId, streamId ) ); + //interface->RemoveDataSink( endpointId1 ); + //interface->RemoveDataSource( endpointId1 ); + User::LeaveIfError( interface->CloseLink( sessionId, linkId ) ); + User::LeaveIfError( interface->CloseSession( sessionId ) ); + + CleanupStack::PopAndDestroy( cInfo ); + CleanupStack::PopAndDestroy( interface ); + CleanupStack::PopAndDestroy( stub ); + } + + +// --------------------------------------------------------------------------- +// CTestDtmf::TestStreamControlL +// --------------------------------------------------------------------------- +// +void CTestDtmf::TestStreamControlL( TDtmfSignalType aSigType ) + { + TMccNetSettings tempSettings = iNetsettings; + + CMccInterfaceStub* stub = CMccInterfaceStub::NewL(); + CleanupStack::PushL( stub ); + CMccInterface* interface = CMccInterface::NewL( *stub ); + CleanupStack::PushL( interface ); + + TUint32 sessionId; + User::LeaveIfError( interface->CreateSession( sessionId ) ); + + TUint32 linkId; + TInt linkType( KMccLinkGeneral ); + User::LeaveIfError( interface->CreateLink( sessionId, linkType, linkId, + tempSettings ) ); + stub->WaitForEvent( sessionId, linkId, 0, KMccLinkCreated ); + + CMccCodecInformation* cInfo + = FetchCodecByMimeSubtypeNameL( *interface, KTxtDtmf ); + CleanupStack::PushL( cInfo ); + + if ( aSigType == EInbandSignal ) + { + cInfo->SetCodecMode( EDTMFModeInband ); + } + else + { + cInfo->SetCodecMode( EDTMFModeEvent ); + } + + TUint32 streamId( 0 ); + TUint32 sinkId( 0 ), sourceId( 0 ); + interface->AddDataSink( KMccRtpSinkUid, KNullDesC8, sinkId ); + interface->AddDataSource( KMccRtpSourceUid, KNullDesC8, sourceId ); + + User::LeaveIfError( interface->CreateStream( sessionId, linkId, streamId, + KMccDtmfStream, *cInfo ) ); + + // TEST CORRECT CONTROL PATHS + User::LeaveIfError ( interface->PrepareStream( sessionId, linkId, streamId ) ); + stub->WaitForEvent( sessionId, linkId, streamId, KMccStreamPrepared ); + stub->WaitForEvent( sessionId, linkId, streamId, KMccStreamPrepared ); + + User::LeaveIfError ( interface->StartStream( sessionId, linkId, streamId ) ); + stub->WaitForEvent( sessionId, linkId, streamId, KMccStreamStarted ); + stub->WaitForEvent( sessionId, linkId, streamId, KMccStreamStarted ); + + User::LeaveIfError ( interface->PauseStream( sessionId, linkId, streamId ) ); + stub->WaitForEvent( sessionId, linkId, streamId, KMccStreamPaused ); + stub->WaitForEvent( sessionId, linkId, streamId, KMccStreamPaused ); + + User::LeaveIfError ( interface->ResumeStream( sessionId, linkId, streamId ) ); + stub->WaitForEvent( sessionId, linkId, streamId, KMccStreamResumed ); + stub->WaitForEvent( sessionId, linkId, streamId, KMccStreamResumed ); + + User::LeaveIfError ( interface->StopStream( sessionId, linkId, streamId ) ); + stub->WaitForEvent( sessionId, linkId, streamId, KMccStreamStopped ); + stub->WaitForEvent( sessionId, linkId, streamId, KMccStreamStopped ); + + // TBD: TEST INVALID CONTROL PATHS + + User::LeaveIfError( interface->DeleteStream( sessionId, linkId, streamId ) ); + User::LeaveIfError( interface->CloseLink( sessionId, linkId ) ); + User::LeaveIfError( interface->CloseSession( sessionId ) ); + + CleanupStack::PopAndDestroy( cInfo ); + CleanupStack::PopAndDestroy( interface ); + CleanupStack::PopAndDestroy( stub ); + } + +// --------------------------------------------------------------------------- +// CTestDtmf::TestManualDtmfSendingL +// --------------------------------------------------------------------------- +// +void CTestDtmf::TestManualDtmfSendingL( TDtmfSignalType aSigType ) + { + TMccNetSettings tempSettings = iNetsettings; + + CMccInterfaceStub* stub = CMccInterfaceStub::NewL(); + CleanupStack::PushL( stub ); + CMccInterface* interface = CMccInterface::NewL( *stub ); + CleanupStack::PushL( interface ); + + TUint32 sessionId; + User::LeaveIfError( interface->CreateSession( sessionId ) ); + + TUint32 linkId; + TInt linkType( KMccLinkGeneral ); + User::LeaveIfError( interface->CreateLink( sessionId, + linkType, linkId, tempSettings ) ); + + CMccCodecInformation* cInfo + = FetchCodecByMimeSubtypeNameL( *interface, KAMRSdpName ); + CleanupStack::PushL( cInfo ); + + CMccCodecInformation* cInfo2 + = FetchCodecByMimeSubtypeNameL( *interface, KTelephoneEvent ); + CleanupStack::PushL( cInfo2 ); + + if ( aSigType == EInbandSignal ) + { + cInfo2->SetCodecMode( EDTMFModeInband ); + } + else + { + cInfo2->SetCodecMode( EDTMFModeEvent ); + } + + TUint32 speakerSinkId( 0 ); + TUint32 rtpSourceId( 0 ); + TUint32 dlStreamId( 0 ); + User::LeaveIfError( + interface->AddDataSink( KUidMmfAudioOutput, KNullDesC8, speakerSinkId ) ); + User::LeaveIfError( + interface->AddDataSource( KMccRtpSourceUid, KNullDesC8, rtpSourceId ) ); + User::LeaveIfError( interface->CreateStream( sessionId, linkId, dlStreamId, + KMccAudioDownlinkStream, *cInfo ) ); + + TUint32 rtpSinkId( 0 ); + TUint32 micSourceId( 0 ); + TUint32 ulStreamId( 0 ); + User::LeaveIfError( + interface->AddDataSink( KMccRtpSinkUid, KNullDesC8, rtpSinkId ) ); + User::LeaveIfError( + interface->AddDataSource( KUidMmfAudioInput, KNullDesC8, micSourceId ) ); + User::LeaveIfError( interface->CreateStream( sessionId, linkId, ulStreamId, + KMccAudioUplinkStream, *cInfo ) ); + + TUint32 dtmfStreamId( 0 ); + User::LeaveIfError( + interface->Reuse( sessionId, linkId, dlStreamId, rtpSourceId ) ); + User::LeaveIfError( + interface->Reuse( sessionId, linkId, ulStreamId, rtpSinkId ) ); + User::LeaveIfError( interface->CreateStream( sessionId, linkId, + dtmfStreamId, KMccDtmfStream, *cInfo2 ) ); + + User::LeaveIfError( interface->SetRemoteAddress( sessionId, linkId, + iNetsettings.iRemoteAddress ) ); + + User::LeaveIfError ( interface->PrepareStream( sessionId, linkId, dlStreamId ) ); + stub->WaitForEvent( sessionId, linkId, dlStreamId, KMccStreamPrepared ); + stub->WaitForEvent( sessionId, linkId, dlStreamId, KMccStreamPrepared ); + + User::LeaveIfError ( interface->PrepareStream( sessionId, linkId, ulStreamId ) ); + stub->WaitForEvent( sessionId, linkId, ulStreamId, KMccStreamPrepared ); + stub->WaitForEvent( sessionId, linkId, ulStreamId, KMccStreamPrepared ); + + User::LeaveIfError ( interface->PrepareStream( sessionId, linkId, dtmfStreamId ) ); + stub->WaitForEvent( sessionId, linkId, dtmfStreamId, KMccStreamPrepared ); + stub->WaitForEvent( sessionId, linkId, dtmfStreamId, KMccStreamPrepared ); + +/* + User::LeaveIfError ( interface->StartStream( sessionId, linkId, dlStreamId ) ); + stub->WaitForEvent( sessionId, linkId, dlStreamId, KMccStreamStarted ); + stub->WaitForEvent( sessionId, linkId, dlStreamId, KMccStreamStarted ); + User::LeaveIfError ( interface->StartStream( sessionId, linkId, ulStreamId ) ); + stub->WaitForEvent( sessionId, linkId, ulStreamId, KMccStreamStarted ); + stub->WaitForEvent( sessionId, linkId, ulStreamId, KMccStreamStarted ); +*/ + User::LeaveIfError ( interface->StartStream( sessionId, linkId, dtmfStreamId ) ); + stub->WaitForEvent( sessionId, linkId, dtmfStreamId, KMccStreamStarted ); + stub->WaitForEvent( sessionId, linkId, dtmfStreamId, KMccStreamStarted ); + + TMccDtmfEventData dtmfSignal; + dtmfSignal.iDtmfEventType = KMccDtmfSigStartTone; + _LIT8( KDtmfDigit, "0" ); + dtmfSignal.iDtmfString.Copy( KDtmfDigit ); + TMccDtmfEventDataPackage signalPkg1( dtmfSignal ); + + TMccEvent event; + event.iSessionId = sessionId; + event.iLinkId = linkId; + event.iStreamId = dtmfStreamId; + event.iEventCategory = KMccEventCategoryDtmf; + event.iEventType = KMccDtmfControl; + event.iEventData.Copy( signalPkg1 ); + + interface->SendMediaSignalL( event ); + stub->WaitForEvent( + sessionId, linkId, dtmfStreamId, KMccDtmfControl, KMccDtmfManualStart ); + + if ( EOutbandSignal == aSigType ) + { + stub->WaitForEvent( sessionId, linkId, dtmfStreamId, KMccActivityEvent ); + } + + iConsole.Printf( _L("Press a key to stop digit send\n") ); + iConsole.Getch(); + + dtmfSignal.iDtmfEventType = KMccDtmfSigStopTone; + signalPkg1 = dtmfSignal; + event.iEventData.Copy( signalPkg1 ); + interface->SendMediaSignalL( event ); + stub->WaitForEvent( + sessionId, linkId, dtmfStreamId, KMccDtmfControl, KMccDtmfManualStop ); + + iConsole.Printf( _L("Press a key to delete streams\n") ); + iConsole.Getch(); + + User::LeaveIfError( interface->DeleteStream( sessionId, linkId, dlStreamId ) ); + User::LeaveIfError( interface->DeleteStream( sessionId, linkId, ulStreamId ) ); + User::LeaveIfError( interface->DeleteStream( sessionId, linkId, dtmfStreamId ) ); + User::LeaveIfError( interface->CloseLink( sessionId, linkId ) ); + User::LeaveIfError( interface->CloseSession( sessionId ) ); + CleanupStack::PopAndDestroy( cInfo2 ); + CleanupStack::PopAndDestroy( cInfo ); + CleanupStack::PopAndDestroy( interface ); + CleanupStack::PopAndDestroy( stub ); + } + +// --------------------------------------------------------------------------- +// CTestDtmf::TestAutomaticDtmfSendingL +// --------------------------------------------------------------------------- +// +void CTestDtmf::TestAutomaticDtmfSendingL( TDtmfSignalType aSigType ) + { + TMccNetSettings tempSettings = iNetsettings; + + CMccInterfaceStub* stub = CMccInterfaceStub::NewL(); + CleanupStack::PushL( stub ); + CMccInterface* interface = CMccInterface::NewL( *stub ); + CleanupStack::PushL( interface ); + + TUint32 sessionId; + User::LeaveIfError( interface->CreateSession( sessionId ) ); + + TUint32 linkId; + TInt linkType( KMccLinkGeneral ); + User::LeaveIfError( interface->CreateLink( sessionId, + linkType, linkId, tempSettings ) ); + + + CMccCodecInformation* cInfo = FetchCodecByMimeSubtypeNameL( *interface, + KAMRSdpName ); + CleanupStack::PushL( cInfo ); + + CMccCodecInformation* cInfo2 = FetchCodecByMimeSubtypeNameL( *interface, + KTelephoneEvent ); + CleanupStack::PushL( cInfo2 ); + + if ( aSigType == EInbandSignal ) + { + cInfo2->SetCodecMode( EDTMFModeInband ); + } + else + { + cInfo2->SetCodecMode( EDTMFModeEvent ); + } + + TUint32 speakerSinkId( 0 ); + TUint32 rtpSourceId( 0 ); + + TUint32 dlStreamId( 0 ); + User::LeaveIfError( + interface->AddDataSink( KUidMmfAudioOutput, KNullDesC8, speakerSinkId ) ); + User::LeaveIfError( + interface->AddDataSource( KMccRtpSourceUid, KNullDesC8, rtpSourceId ) ); + User::LeaveIfError( interface->CreateStream( sessionId, linkId, dlStreamId, + KMccAudioDownlinkStream, *cInfo ) ); + + TUint32 rtpSinkId( 0 ); + TUint32 micSourceId( 0 ); + TUint32 ulStreamId( 0 ); + User::LeaveIfError( + interface->AddDataSink( KMccRtpSinkUid, KNullDesC8, rtpSinkId ) ); + User::LeaveIfError( + interface->AddDataSource( KUidMmfAudioInput, KNullDesC8, micSourceId ) ); + User::LeaveIfError( interface->CreateStream( sessionId, linkId, ulStreamId, + KMccAudioUplinkStream, *cInfo ) ); + + TUint32 dtmfStreamId( 0 ); + User::LeaveIfError( + interface->Reuse( sessionId, linkId, dlStreamId, rtpSourceId ) ); + User::LeaveIfError( + interface->Reuse( sessionId, linkId, ulStreamId, rtpSinkId ) ); + User::LeaveIfError( interface->CreateStream( sessionId, linkId, + dtmfStreamId, KMccDtmfStream, *cInfo2 ) ); + + + User::LeaveIfError( interface->SetRemoteAddress( sessionId, linkId, + iNetsettings.iRemoteAddress ) ); + + + User::LeaveIfError ( interface->PrepareStream( sessionId, linkId, dlStreamId ) ); + stub->WaitForEvent( sessionId, linkId, dlStreamId, KMccStreamPrepared ); + stub->WaitForEvent( sessionId, linkId, dlStreamId, KMccStreamPrepared ); + User::LeaveIfError ( interface->PrepareStream( sessionId, linkId, ulStreamId ) ); + stub->WaitForEvent( sessionId, linkId, ulStreamId, KMccStreamPrepared ); + stub->WaitForEvent( sessionId, linkId, ulStreamId, KMccStreamPrepared ); + User::LeaveIfError ( interface->PrepareStream( sessionId, linkId, dtmfStreamId ) ); + stub->WaitForEvent( sessionId, linkId, dtmfStreamId, KMccStreamPrepared ); + stub->WaitForEvent( sessionId, linkId, dtmfStreamId, KMccStreamPrepared ); + +/* + User::LeaveIfError ( interface->StartStream( sessionId, linkId, dlStreamId ) ); + stub->WaitForEvent( sessionId, linkId, dlStreamId, KMccStreamStarted ); + stub->WaitForEvent( sessionId, linkId, dlStreamId, KMccStreamStarted ); + User::LeaveIfError ( interface->StartStream( sessionId, linkId, ulStreamId ) ); + stub->WaitForEvent( sessionId, linkId, ulStreamId, KMccStreamStarted ); + stub->WaitForEvent( sessionId, linkId, ulStreamId, KMccStreamStarted ); +*/ + User::LeaveIfError ( interface->StartStream( sessionId, linkId, dtmfStreamId ) ); + stub->WaitForEvent( sessionId, linkId, dtmfStreamId, KMccStreamStarted ); + stub->WaitForEvent( sessionId, linkId, dtmfStreamId, KMccStreamStarted ); + + TMccDtmfEventData dtmfSignal; + dtmfSignal.iDtmfEventType = KMccDtmfSigSendString; + dtmfSignal.iDtmfString.Copy( KTxtTestDtmfString1() ); + dtmfSignal.iContinue = ETrue; + TMccDtmfEventDataPackage signalPkg1( dtmfSignal ); + + // BASIC SENDING TEST WITH NORMAL DIGITS + // Encapsulate the signal in event + TMccEvent event; + event.iSessionId = sessionId; + event.iLinkId = linkId; + event.iStreamId = dtmfStreamId; + event.iEventCategory = KMccEventCategoryDtmf; + event.iEventType = KMccDtmfControl; + event.iEventData.Copy( signalPkg1 ); + + interface->SendMediaSignalL( event ); + if ( EOutbandSignal == aSigType ) + { + // Note: In loopback test activity event comes first due to delayed + // control event sending. + stub->WaitForEvent( sessionId, linkId, dtmfStreamId, KMccActivityEvent ); + } + + for ( TInt i = 0; i < KTxtTestDtmfString1().Length(); i++ ) + { + stub->WaitForEvent( + sessionId, linkId, dtmfStreamId, KMccDtmfControl, KMccDtmfSequenceStart ); + stub->WaitForEvent( + sessionId, linkId, dtmfStreamId, KMccDtmfControl, KMccDtmfSequenceStop ); + } + + stub->WaitForEvent( + sessionId, linkId, dtmfStreamId, KMccDtmfControl, KMccDtmfSendingComplete ); + + iConsole.Printf( _L("Media signal sent 1, press to continue\n") ); + iConsole.Getch(); + + // PAUSE CHARACTER HANDLING TEST + dtmfSignal.iDtmfString.Copy( KTxtTestDtmfStringWithPauseChars() ); + TMccDtmfEventDataPackage signalPkg2( dtmfSignal ); + event.iEventData.Copy( signalPkg2 ); + interface->SendMediaSignalL( event ); + for ( TInt i = 0; i < 3; i++ ) + { + stub->WaitForEvent( + sessionId, linkId, dtmfStreamId, KMccDtmfControl, KMccDtmfSequenceStart ); + stub->WaitForEvent( + sessionId, linkId, dtmfStreamId, KMccDtmfControl, KMccDtmfSequenceStop ); + } + + stub->WaitForEvent( + sessionId, linkId, dtmfStreamId, KMccDtmfControl, KMccDtmfSendingComplete ); + + iConsole.Printf( _L("Media signal sent 2, press to continue\n") ); + iConsole.Getch(); + + // STOP CHARACTER HANDLING TEST + _LIT( KTxtTestDtmfStringWithStopChars, "w12" ); + dtmfSignal.iDtmfString.Copy( KTxtTestDtmfStringWithStopChars() ); + TMccDtmfEventDataPackage signalPkg3( dtmfSignal ); + event.iEventData.Copy( signalPkg3 ); + interface->SendMediaSignalL( event ); + + stub->WaitForEvent( + sessionId, linkId, dtmfStreamId, KMccDtmfControl, KMccDtmfStopInDtmfString ); + + dtmfSignal.iDtmfEventType = KMccDtmfSigContinueSending; + dtmfSignal.iContinue = ETrue; + signalPkg3 = dtmfSignal; + event.iEventData.Copy( signalPkg3 ); + interface->SendMediaSignalL( event ); + for ( TInt i = 0; i < 2; i++ ) + { + stub->WaitForEvent( + sessionId, linkId, dtmfStreamId, KMccDtmfControl, KMccDtmfSequenceStart ); + stub->WaitForEvent( + sessionId, linkId, dtmfStreamId, KMccDtmfControl, KMccDtmfSequenceStop ); + } + + stub->WaitForEvent( + sessionId, linkId, dtmfStreamId, KMccDtmfControl, KMccDtmfSendingComplete ); + iConsole.Printf( _L("Media signal sent 3, press to continue\n") ); + iConsole.Getch(); + + // CANCEL DTMF STRING SENDING -TEST + dtmfSignal.iDtmfString.Copy( KTxtTestDtmfString1() ); + dtmfSignal.iDtmfEventType = KMccDtmfSigSendString; + + TMccDtmfEventDataPackage signalPkg4( dtmfSignal ); + event.iEventData.Copy( signalPkg4 ); + interface->SendMediaSignalL( event ); + stub->WaitForEvent( + sessionId, linkId, dtmfStreamId, KMccDtmfControl, KMccDtmfSequenceStart ); + + dtmfSignal.iDtmfEventType = KMccDtmfSigCancelSending; + signalPkg4 = dtmfSignal; + event.iEventData.Copy( signalPkg4 ); + interface->SendMediaSignalL( event ); + + iConsole.Printf( _L("Media signal sent 4, press to continue\n") ); + iConsole.Getch(); + + // TBD: which event should be sent when string sending is cancelled? + User::LeaveIfError ( interface->StopStream( sessionId, linkId, dlStreamId ) ); + stub->WaitForEvent( sessionId, linkId, dlStreamId, KMccStreamStopped ); + stub->WaitForEvent( sessionId, linkId, dlStreamId, KMccStreamStopped ); + + User::LeaveIfError ( interface->StopStream( sessionId, linkId, ulStreamId ) ); + stub->WaitForEvent( sessionId, linkId, ulStreamId, KMccStreamStopped ); + stub->WaitForEvent( sessionId, linkId, ulStreamId, KMccStreamStopped ); + + User::LeaveIfError ( interface->StopStream( sessionId, linkId, dtmfStreamId ) ); + stub->WaitForEvent( sessionId, linkId, dtmfStreamId, KMccStreamStopped ); + stub->WaitForEvent( sessionId, linkId, dtmfStreamId, KMccStreamStopped ); + + User::LeaveIfError( interface->DeleteStream( sessionId, linkId, dlStreamId ) ); + User::LeaveIfError( interface->DeleteStream( sessionId, linkId, ulStreamId ) ); + User::LeaveIfError( interface->DeleteStream( sessionId, linkId, dtmfStreamId ) ); + User::LeaveIfError( interface->CloseLink( sessionId, linkId ) ); + User::LeaveIfError( interface->CloseSession( sessionId ) ); + CleanupStack::PopAndDestroy( cInfo2 ); + CleanupStack::PopAndDestroy( cInfo ); + CleanupStack::PopAndDestroy( interface ); + CleanupStack::PopAndDestroy( stub ); + } + +// --------------------------------------------------------------------------- +// CTestDtmf::FetchCodecByMimeSubtypeNameL +// --------------------------------------------------------------------------- +// +CMccCodecInformation* CTestDtmf::FetchCodecByMimeSubtypeNameL( + const CMccInterface& aInterface, const TDesC8& aName ) const + { + RPointerArray codecArray; + CleanupResetAndDestroy< RPointerArray >::PushL( codecArray ); + User::LeaveIfError( aInterface.GetCapabilities( codecArray ) ); + + CMccCodecInformation* tmp = NULL; + TInt ind( codecArray.Count() ); + + while ( ( ind-- ) && ( NULL == tmp ) ) + { + if ( codecArray[ind]->SdpName().Compare( aName ) == 0 ) + { + tmp = codecArray[ind]->CloneDetailedL(); + } + } + + User::LeaveIfNull( tmp ); + CleanupStack::PopAndDestroy( &codecArray ); + return tmp; + }