multimediacommsengine/tsrc/MMCTestDriver/MCETester/src/TTcMCECommandBase.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/tsrc/MMCTestDriver/MCETester/src/TTcMCECommandBase.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,343 @@
+/*
+* Copyright (c) 2004 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 "CTcMCEContext.h"
+#include "MCEConstants.h"
+#include "TTcMceCommandBase.h"
+#include "CTcMCEProfileContainer.h"
+#include <MCESession.h>
+#include <MCEEvent.h>
+#include <MCERefer.h>
+#include <MceMediaStream.h>
+
+
+TTcMceCommandBase::TTcMceCommandBase( MTcTestContext& aContext )
+	: TTcCommandBase( static_cast< CTcContextBase& >( aContext ) ),
+	  iContext( static_cast< CTcMCEContext& >( aContext ) ),
+	  iPushed( 0 )
+	{
+	}
+
+//
+// - Parameter extraction functions -------------------------------------------
+//
+
+TInt TTcMceCommandBase::ExtractProfileIdL()
+    {
+    TPtrC8 profileIdStr = ExtractIdL( KParamProfileId );
+	TInt profileId( 0 );
+	TLex8 lexer( profileIdStr );
+	User::LeaveIfError( lexer.Val( profileId ) );
+	return profileId;
+    }
+
+CSIPProfile& TTcMceCommandBase::GetProfileL( CTcMCEProfileContainer& aProfileContainer )
+	{
+	// Get profile from the registry
+    return aProfileContainer.GetProfileByIdL( ExtractProfileIdL() );
+	}
+	
+CTcMCEProfileContainer& TTcMceCommandBase::SelectProfileL()
+	{
+	TPtrC8 value = ExtractIdL( KRegistryId, EFalse );
+	if( value != KNullDesC8 )
+		{
+		CTcMCEProfileContainer* conn
+							= reinterpret_cast< CTcMCEProfileContainer* >(
+								iContext.Registry().ObjectPtrL( value ) );
+		return *conn;
+		}
+	else
+		{
+		return iContext.Profile();
+		}
+	}
+	
+CDesC8Array* TTcMceCommandBase::ExtractArrayL( const TDesC8& aName,
+											   TBool aIsMandatory ) 
+	{
+	CTcArray* tcArray = FindArrayL(aName, aIsMandatory);
+	if ( !tcArray )
+		{
+		return NULL;
+		}
+		
+	CDesC8Array* array = new(ELeave)CDesC8ArraySeg(1);
+	CleanupStack::PushL( array );
+	
+	const MDesC8Array& aItems = tcArray->AsMDesCArray(); 
+	TInt count = aItems.MdcaCount();
+
+	for( TInt i = 0; i < count; i++ )
+		{
+		array->AppendL( aItems.MdcaPoint( i ) );
+		}
+		
+	CleanupStack::Pop( array );	
+	return array;			
+	}
+	
+CDesC8Array* TTcMceCommandBase::ExtractHeadersL( TBool aIsMandatory ) 
+	{
+	CDesC8Array* array = ExtractArrayL(KParamSipHeaders, aIsMandatory );
+	if ( array )
+		{
+		if ( array->Count() > 0 )
+			{
+			return array;
+			}
+		}
+	delete array;
+	return NULL;
+	}
+
+HBufC8* TTcMceCommandBase::HBufCParameterL( TPtrC8 ptr )
+	{
+	HBufC8* buf = NULL;
+	// MCE API should accept null parameters, but as long as it does not,
+	// zero-length descriptors are used instead. When problem is corrected,
+	// remove comments.
+	//if (ptr != KNullDesC8 )
+	//	{
+		buf = ptr.AllocL();
+	//	}	
+	return buf;
+	}
+	
+//
+// - Response creation functions ----------------------------------------------
+//
+
+CTcStructure& TTcMceCommandBase::FindCreateTestClientIdsL()
+	{
+	// Find the TestClientIds structure, it may be in several places
+	// (there might already be a ReceivedMsg item in the return list)
+	// It may also be missing altogether, if this is the first time
+	// AddIdResponseL() is called.
+	TInt pos = iContext.ReturnList().FindParameter( KResponseTestClientIds,
+													MTcTyped::EStructure );
+	if( pos == KErrNotFound )
+		{
+		// Figure out the correct position for the structure: just
+		// after the ReceivedMsg if it exists.
+		pos = iContext.ReturnList().FindParameter( KResponseHeaders,
+												   MTcTyped::EArray );
+		if( pos == KErrNotFound )
+			{
+			pos = 0;	// no headers, insert at the beginning
+			}
+		else
+			{
+			pos++;	// insert after headers
+			}
+
+		// Add a structure to the response parameter list for TestClient Ids
+		CTcStructure* tcIDs = CTcStructure::NewLC();
+		tcIDs->SetName( KResponseTestClientIds );
+		iContext.ReturnList().InsertParameterL( tcIDs, pos );
+		CleanupStack::Pop( tcIDs);
+
+		// All IDs, in no spesific order (in alphabetical order in SIPTester)
+        // (this has to be function-local in order to compile for THUMB)
+		// Confirm that you don't have comma after last Id!
+		const TDesC8* const TIdNames[] = {
+			&KProfileObj, // Profile's name in TesterCores registry
+			&KSessionId,
+			&KEventId,
+			&KReferId,
+			&KStreamId,
+			&KCodecId,
+			&KSourceId,
+			&KSinkId
+			};
+
+		// Add an entry for ALL possible Ids. This is done to go around
+		// a Telelogic Tau logging problem related to template mismatches
+		TInt count = sizeof( TIdNames ) / sizeof( const TDesC8* );
+		for( TInt i = 0; i < count; i++ )
+			{
+			CTcNameValue* nameValue = CTcNameValue::NewLC();
+			nameValue->SetL( *TIdNames[ i ], 0 );
+			tcIDs->AddItemL( nameValue );
+			CleanupStack::Pop( nameValue );
+			}
+		}
+
+	return iContext.ReturnList().AsStructure( pos );
+	}
+
+void TTcMceCommandBase::AddIdResponseL( const TDesC8& aName,
+										const CBase* aObject )
+	{
+	// Register object and fetch its name
+	iContext.Registry().AddObjectL(	const_cast< CBase* >( aObject ) );
+	TPtrC8 idName = iContext.Registry().ObjectNameL( aObject );	
+	CTcStructure& tcIDs = FindCreateTestClientIdsL();
+	CTcNameValue* idNameValue = tcIDs.ItemL( aName );
+	idNameValue->SetValueL( idName );
+	}
+	
+void TTcMceCommandBase::AddIdResponseL( const TDesC8& aName,
+										const CBase& aObject )
+	{
+	// Register object and fetch its name
+	iContext.Registry().AddObjectL(	aObject );
+	TPtrC8 idName = iContext.Registry().ObjectNameL( &aObject );
+
+	CTcStructure& tcIDs = FindCreateTestClientIdsL();
+	CTcNameValue* idNameValue = tcIDs.ItemL( aName );
+	idNameValue->SetValueL( idName );
+	}
+
+void TTcMceCommandBase::AddHeadersL( const CDesC8Array* aHeaders ) 
+	{
+	if ( aHeaders ) 
+		{
+		if ( aHeaders->Count() > 0 )
+			{
+			AddArrayResponseL( KResponseHeaders, *aHeaders );
+			}
+		}
+	}
+
+void TTcMceCommandBase::AddTextualSessionStateL( TInt aState) 
+	{
+	switch( aState ) 
+		{
+		case CMceSession::EIdle: AddTextResponseL(KResponseStateText, KIdle); break;
+		case CMceSession::EOffering: AddTextResponseL(KResponseStateText, KOffering); break;
+		case CMceSession::EIncoming: AddTextResponseL(KResponseStateText, KIncoming); break;
+		case CMceSession::EAnswering: AddTextResponseL(KResponseStateText, KAnswering); break;
+		case CMceSession::EProceeding: AddTextResponseL(KResponseStateText, KProceeding); break;
+		case CMceSession::EEstablished: AddTextResponseL(KResponseStateText, KEstablished); break;
+		case CMceSession::EReserving: AddTextResponseL(KResponseStateText, KUpdating); break;
+		case CMceSession::ECancelling: AddTextResponseL(KResponseStateText, KCancelling); break;
+		case CMceSession::ETerminating: AddTextResponseL(KResponseStateText, KTerminating); break;
+		case CMceSession::ETerminated: AddTextResponseL(KResponseStateText, KTerminated); break;
+		//case CMceSession::EOnHold: AddTextResponseL(KResponseStateText, KOnHold); break;
+		//case CMceSession::EReferred: AddTextResponseL(KResponseStateText, KReferred); break;
+		default: AddTextResponseL(KResponseStateText, KUnknownState); break;
+		}
+	}
+
+
+void TTcMceCommandBase::AddTextualMediaStreamStateL( TInt aState) 
+	{
+	switch( aState ) 
+		{
+		case CMceMediaStream::EUninitialized: AddTextResponseL(KResponseMediaStreamStateText, KUninitialized); break;
+		case CMceMediaStream::EInitialized: AddTextResponseL(KResponseMediaStreamStateText, KInitialized); break;
+		case CMceMediaStream::EBuffering: AddTextResponseL(KResponseMediaStreamStateText, KBuffering); break;
+		//case CMceMediaStream::EIdle: AddTextResponseL(KResponseMediaStreamStateText, KIdle); break;
+		case CMceMediaStream::EIdle: AddTextResponseL(KResponseMediaStreamStateText, KmsIdle); break;
+		case CMceMediaStream::EStreaming: AddTextResponseL(KResponseMediaStreamStateText, KStreaming); break;
+		case CMceMediaStream::EDisabled: AddTextResponseL(KResponseMediaStreamStateText, KDisabled); break;
+		case CMceMediaStream::ENoResources: AddTextResponseL(KResponseMediaStreamStateText, KNoResources); break;
+		case CMceMediaStream::ETranscodingRequired: AddTextResponseL(KResponseMediaStreamStateText, KTranscodingRequired); break;
+		case CMceMediaStream::ETranscoding: AddTextResponseL(KResponseMediaStreamStateText, KTranscoding); break;
+		 
+		default: AddTextResponseL(KResponseMediaStreamStateText, KUnknownState); break;
+		}
+	}	
+	
+// MediaStream state is removed. There are only 2 state enable and disable
+void TTcMceCommandBase::AddTextualStreamStateL( TBool aState, TBool aBound ) 
+	{
+	TPtrC8 addedText;
+	
+	if ( aBound )
+	    {
+	    addedText.Set(KResponseBoundStreamStateText);
+	    }
+	else
+	    {
+	    addedText.Set(KResponseStreamStateText);
+	    }
+	
+	if ( aState)
+		{
+		AddTextResponseL( addedText, KStreamEnable);	
+		}
+	else
+		{
+		AddTextResponseL( addedText, KStreamDisable);		
+		}
+	}
+
+void TTcMceCommandBase::AddTextualEventStateL( TInt aState ) 
+	{
+	
+	switch( aState ) 
+		{
+		case CMceEvent::EIdle: 
+			{
+			AddTextResponseL(KResponseEventStateText, KIdle); 
+			break;
+			}
+		case CMceEvent::EPending: 
+			{
+			AddTextResponseL(KResponseEventStateText, KPending); 
+			break;
+			}
+		case CMceEvent::EActive: 
+			{	
+			AddTextResponseL(KResponseEventStateText, KActive); 
+			break;
+			}
+		case CMceEvent::ETerminated: 
+			{
+			AddTextResponseL(KResponseEventStateText, KTerminated); 
+			break;
+			}
+		default: 
+			{
+			AddTextResponseL(KResponseEventStateText, KUnknownState); 
+			break;
+			}
+		}
+	
+	}
+
+void TTcMceCommandBase::AddTextualReferStateL( TInt aState ) 
+	{
+	
+	switch( aState ) 
+		{
+		case CMceRefer::EIdle: 
+			{
+			AddTextResponseL(KResponseReferStateText, KIdle); 
+			break;
+			}
+		case CMceRefer::EAccepted: 
+			{	
+			AddTextResponseL(KResponseReferStateText, KAccepted); 
+			break;
+			}
+		case CMceRefer::ETerminated: 
+			{
+			AddTextResponseL(KResponseReferStateText, KTerminated); 
+			break;
+			}
+		default: 
+			{
+			AddTextResponseL(KResponseReferStateText, KUnknownState); 
+			break;
+			}
+		}
+
+	}