multimediacommsengine/tsrc/MMCTestDriver/MCETester/src/TCmdGetStreamInfo.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/tsrc/MMCTestDriver/MCETester/src/TCmdGetStreamInfo.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,407 @@
+/*
+* 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:    Implementation
+*
+*/
+
+
+
+#include "MCEConstants.h"
+#include "TCmdGetStreamInfo.h"
+#include "CTcMCEContext.h"
+#include <MCEAudioStream.h>
+#include <MCEVideoStream.h>
+#include <MCERTPSource.h>
+#include <MCEMicSource.h>
+#include <MCECameraSource.h>
+#include <MCERTPSink.h>
+#include <MCESpeakerSink.h>
+#include <MCEDisplaySink.h>
+#include <mcefilesink.h>
+#include <MCEAudioCodec.h>
+#include <badesca.h>
+
+#include "mcefilesource.h"
+
+// -----------------------------------------------------------------------------
+// TCmdGetStreamInfo::ExecuteL
+// -----------------------------------------------------------------------------
+//
+void TCmdGetStreamInfo::ExecuteL()
+	{	
+	// ---------- Setup --------------------------------------------------------
+
+	// Get stream 
+	CMceSession* session= 
+		reinterpret_cast<CMceSession*>(GetObjectForIdL(KSessionId, ETrue));	
+	CDesC8Array* mediaStreams = new(ELeave)CDesC8ArraySeg(1);
+	CleanupStack::PushL( mediaStreams );
+	const RPointerArray<CMceMediaStream>& streamPtrs = session->Streams();
+	
+	for (TInt streamIndex=0; streamIndex < streamPtrs.Count(); streamIndex++)
+		{
+		// Add to registry by reference and fetch name
+		iContext.Registry().AddObjectL( *(streamPtrs[streamIndex]) );	
+		TBuf8< KTcMaxObjectName > streamId = 
+					iContext.Registry().ObjectNameL( streamPtrs[streamIndex] );	
+		mediaStreams->AppendL( streamId );
+		}
+	
+	// ---------- Execution ----------------------------------------------------
+
+	// ---------- Response creation --------------------------------------------
+	
+	AddIdResponseL(KSessionId, session); // uses CleanupStack internally
+
+	if ( mediaStreams->Count() > 0 )
+		{
+		AddArrayResponseL( KResponseStreams, *mediaStreams );	
+		
+		for (TInt streamIndex=0; streamIndex < streamPtrs.Count(); streamIndex++)
+			{
+			if ((streamPtrs[streamIndex])->Type()==KMceAudio)
+				{
+				CMceAudioStream* audioStream =reinterpret_cast<CMceAudioStream*>
+						(iContext.Registry().ObjectPtrL( mediaStreams->MdcaPoint(streamIndex) ));
+				//get the audio stream info
+				GetAudioStreamInfo( audioStream );
+				}
+			else if ((streamPtrs[streamIndex])->Type()==KMceVideo)
+				{
+				CMceVideoStream* videoStream =reinterpret_cast<CMceVideoStream*>
+						(iContext.Registry().ObjectPtrL( mediaStreams->MdcaPoint(streamIndex) ));
+				//get the video stream info
+				GetVideoStreamInfo( videoStream );
+				}
+			else
+				{
+				// Keep pc-lint happy
+				}
+			}
+		CleanupStack::PopAndDestroy( mediaStreams );
+		}
+	else
+		{
+		CleanupStack::PopAndDestroy( mediaStreams );
+		}
+
+	}
+
+// -----------------------------------------------------------------------------
+// TCmdGetStreamInfo::AddSourceToResponse
+// -----------------------------------------------------------------------------
+//
+void
+TCmdGetStreamInfo::AddSourceToResponseL( const TDesC8& aParamNameForSourceId,
+										 const TDesC8& aParamNameForSource,
+										 CMceMediaStream& aStream )
+	{
+	CMceMediaSource* source = aStream.Source();
+
+	iContext.Registry().AddObjectL( *source );
+	TBuf8< KTcMaxObjectName > sourceId =
+		iContext.Registry().ObjectNameL( source );
+	AddTextResponseL( aParamNameForSourceId, sourceId );
+	switch ( source->Type() )
+		{
+		case KMceRTPSource:
+			{
+			AddTextResponseL( aParamNameForSource, KValueSourceRTP );
+			break;
+			}
+		case KMceMicSource:
+			{
+			AddTextResponseL( aParamNameForSource, KValueSourceMic );
+			break;
+			}	
+		case KMceCameraSource:
+			{
+			AddTextResponseL( aParamNameForSource, KValueSourceCamera );
+			break;	
+			}		
+		case KMceFileSource:
+			{
+			AddTextResponseL( aParamNameForSource, KValueSourceFile );
+			break;	
+			}
+		default:
+			{
+			AddTextResponseL( aParamNameForSource, KValueSourceUnknown );
+			break;	
+			}
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// TCmdGetStreamInfo::AddSinksToResponse
+// -----------------------------------------------------------------------------
+//
+void TCmdGetStreamInfo::AddSinksToResponseL( const TDesC8& aParamNameForSinkIds,
+                                             const TDesC8& aParamNameForSinks,
+								             CMceMediaStream& aStream )
+	{
+	// Array for sink ids
+	CDesC8Array* sinkIds = new(ELeave)CDesC8ArraySeg(1);
+	CleanupStack::PushL( sinkIds );
+	
+	// Array for sink names
+	CDesC8Array* sinks = new(ELeave)CDesC8ArraySeg(1);
+	CleanupStack::PushL( sinks );
+
+	const RPointerArray<CMceMediaSink>& sinkPtrs = aStream.Sinks();
+	for ( TInt i = 0; i < sinkPtrs.Count(); i++ )
+		{
+		// Id
+		iContext.Registry().AddObjectL( *(sinkPtrs[i]) );	
+		TPtrC8 sinkId = iContext.Registry().ObjectNameL( sinkPtrs[i] );
+		sinkIds->AppendL( sinkId );
+		
+		// Name
+		switch ( sinkPtrs[i]->Type() )
+			{
+			case KMceRTPSink:
+				{
+				sinks->AppendL( KValueSinkRTP );
+				break;	
+				}
+			case KMceSpeakerSink:
+				{
+				sinks->AppendL( KValueSinkSpeaker );
+				break;	
+				}
+			case KMceDisplaySink:
+				{
+				sinks->AppendL( KValueSinkDisplay );
+				break;	
+				}
+			case KMceFileSink:
+				{
+				sinks->AppendL( KValueSinkFile );
+				break;	
+				}	
+			default:
+				{
+				sinks->AppendL( KValueSinkUnknown );
+				break;
+				}
+			}
+		}
+	
+	if ( sinks->Count() )
+		{	
+		AddArrayResponseL( aParamNameForSinkIds, *sinkIds );
+		AddArrayResponseL( aParamNameForSinks, *sinks );
+		}
+		
+	CleanupStack::PopAndDestroy( sinks );
+	CleanupStack::PopAndDestroy( sinkIds );	
+	}
+
+// -----------------------------------------------------------------------------
+// TCmdGetStreamInfo::AddAudioCodecsToResponse
+// -----------------------------------------------------------------------------
+//
+void TCmdGetStreamInfo::AddAudioCodecsToResponseL( const TDesC8& aName,
+											  	   CMceAudioStream& aStream )
+	{
+	CDesC8Array* codecs = new(ELeave)CDesC8ArraySeg(1);
+	CleanupStack::PushL( codecs );
+
+	const RPointerArray<CMceAudioCodec>& codecPtrs = aStream.Codecs();
+	for (TInt codecIndex = 0; codecIndex < codecPtrs.Count(); codecIndex++ )
+		{		
+		// Add codec to registry by reference and fetch name
+		iContext.Registry().AddObjectL( *(codecPtrs[codecIndex]) );	
+		TBuf8< KTcMaxObjectName > codecId = 
+					iContext.Registry().ObjectNameL( codecPtrs[codecIndex] );	
+		codecs->AppendL( codecId );
+		}
+
+	if ( codecs->Count() )
+		{
+		AddArrayResponseL( aName, *codecs );
+		}
+		
+	CleanupStack::PopAndDestroy( codecs );	
+	}
+
+// -----------------------------------------------------------------------------
+// TCmdGetStreamInfo::AddVideoCodecsToResponse
+// -----------------------------------------------------------------------------
+//
+void TCmdGetStreamInfo::AddVideoCodecsToResponseL( const TDesC8& aName,
+											  	   CMceVideoStream& aStream )
+	{
+	CDesC8Array* codecs = new(ELeave)CDesC8ArraySeg(1);
+	CleanupStack::PushL( codecs );
+
+	const RPointerArray<CMceVideoCodec>& codecPtrs = aStream.Codecs();
+	for (TInt codecIndex = 0; codecIndex < codecPtrs.Count(); codecIndex++ )
+		{
+		// Add codec to registry by reference and fetch name
+		iContext.Registry().AddObjectL( *(reinterpret_cast<CBase*>(codecPtrs[codecIndex]) ));
+
+		TBuf8< KTcMaxObjectName > codecId = 
+					iContext.Registry().ObjectNameL( codecPtrs[codecIndex] );	
+		codecs->AppendL( codecId );
+		}
+
+	if ( codecs->Count() )
+		{
+		AddArrayResponseL( aName, *codecs );
+		}
+		
+	CleanupStack::PopAndDestroy( codecs );	
+	}	
+
+void TCmdGetStreamInfo::GetAudioStreamInfo( CMceAudioStream* aAudioStream )
+	{
+	if (aAudioStream != NULL) 
+		{
+		AddTextResponseL( KResponseStreamType, KValueStreamTypeAudio );
+
+		AddTextualStreamStateL( aAudioStream->IsEnabled(), EFalse );
+
+		AddIntegerResponseL( KResponseLocalMediaPort, aAudioStream->LocalMediaPort() );
+
+		AddSourceToResponseL( KResponseSourceId,
+							  KResponseSource,
+							  *aAudioStream );
+
+		AddSinksToResponseL( KResponseSinkIds,
+							 KResponseSinks,
+							 *aAudioStream );
+
+		AddAudioCodecsToResponseL( KResponseAudioCodecs, *aAudioStream );
+
+		// Check boundStream
+		if ( aAudioStream->BoundStream() )
+			{
+			// Add to registry by reference and fetch name
+			iContext.Registry().AddObjectL( aAudioStream->BoundStreamL() );	
+			TBuf8< KTcMaxObjectName > boundStreamId = 
+				iContext.Registry().ObjectNameL( 
+					&(aAudioStream->BoundStreamL()) );
+			// Name is numeric, but adding is easier this way
+			AddTextResponseL( KResponseBoundStream, boundStreamId );
+			
+			if ( aAudioStream->BoundStreamL().Type() == KMceAudio )
+				{				
+				CMceAudioStream* boundAudioStream = 
+					static_cast<CMceAudioStream*>
+						(&(aAudioStream->BoundStreamL()));
+		
+				AddTextResponseL( KResponseBoundStreamType, 
+								  KValueStreamTypeAudio );	
+
+				/*AddIntegerResponseL( KResponseBoundStreamState, 
+									 boundAudioStream->State() );*/
+		
+				AddTextualStreamStateL( boundAudioStream->IsEnabled(), ETrue );
+
+				AddIntegerResponseL( KResponseBoundLocalMediaPort, 
+							 		 boundAudioStream->LocalMediaPort() );
+
+				AddSourceToResponseL( KResponseBoundStreamSourceId, 
+									  KResponseBoundStreamSource,
+									  *boundAudioStream );
+
+				AddSinksToResponseL( KResponseBoundStreamSinkIds,
+				                     KResponseBoundStreamSinks, 
+									 *boundAudioStream );
+				AddAudioCodecsToResponseL( KResponseBoundStreamCodecs,
+									  	   *boundAudioStream );
+				}
+			}
+		}
+
+	}
+	
+void TCmdGetStreamInfo::GetVideoStreamInfo( CMceVideoStream* aVideoStream )
+	{
+	if (aVideoStream != NULL) 
+		{
+		AddTextResponseL( KResponseStreamType, KValueStreamTypeVideo );
+		
+		AddTextualStreamStateL( aVideoStream->IsEnabled(), EFalse );
+		
+		AddIntegerResponseL( KResponseLocalMediaPort, aVideoStream->LocalMediaPort() );
+
+		AddSourceToResponseL( KResponseSourceId,
+							  KResponseSource,
+							  *aVideoStream );
+		
+		AddSinksToResponseL( KResponseSinkIds, KResponseSinks, *aVideoStream );
+
+		AddVideoCodecsToResponseL( KResponseVideoCodecs, *aVideoStream );
+		
+		// Check boundStream
+		
+		if ( aVideoStream->BoundStream() )
+			{
+			// Add to registry by reference and fetch name
+			iContext.Registry().AddObjectL( aVideoStream->BoundStreamL() );	
+			TBuf8< KTcMaxObjectName > boundStreamId = 
+				iContext.Registry().ObjectNameL( 
+					&(aVideoStream->BoundStreamL()) );
+			// Name is numeric, but adding is easier this way
+			AddTextResponseL( KResponseBoundStream, boundStreamId );
+			
+			if ( aVideoStream->BoundStreamL().Type() == KMceVideo )
+				{	
+			
+				CMceVideoStream* boundVideoStream = 
+					static_cast<CMceVideoStream*>
+						(&(aVideoStream->BoundStreamL()));
+		
+				AddTextResponseL( KResponseBoundStreamType, 
+								  KValueStreamTypeVideo );	
+		
+				AddTextualStreamStateL( boundVideoStream->IsEnabled(), ETrue );
+		
+				AddIntegerResponseL( KResponseBoundLocalMediaPort, 
+									 boundVideoStream->LocalMediaPort() );
+
+				AddSourceToResponseL( KResponseBoundStreamSourceId, 
+									  KResponseBoundStreamSource,
+									  *boundVideoStream );
+				
+				AddSinksToResponseL( KResponseBoundStreamSinkIds,
+									 KResponseBoundStreamSinks, 
+									 *boundVideoStream );
+	
+				AddVideoCodecsToResponseL( KResponseBoundStreamCodecs, 
+										   *boundVideoStream );	 
+				}
+			}
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// TCmdGetStreamInfo::Match
+// -----------------------------------------------------------------------------
+//	
+TBool TCmdGetStreamInfo::Match( const TTcIdentifier& aId )
+	{
+	return TTcMceCommandBase::Match( aId, _L8("GetStreamInfo") );
+	}
+
+// -----------------------------------------------------------------------------
+// TCmdGetStreamInfo::CreateL
+// -----------------------------------------------------------------------------
+//
+TTcCommandBase* TCmdGetStreamInfo::CreateL( MTcTestContext& aContext )
+	{
+	return new( ELeave ) TCmdGetStreamInfo( aContext );
+	}