graphicsapitest/graphicssvs/wserv/src/T_DataAnim.cpp
author Gareth Stockwell <gareth.stockwell@accenture.com>
Fri, 05 Nov 2010 17:31:20 +0000
branchbug235_bringup_0
changeset 215 097e92a68d68
parent 0 5d03bc08d59c
permissions -rw-r--r--
Added GLES 1.x spinning cube-rendering code to eglbringuptest The coordinate, color and index data are uploaded to server-side buffers by the CGLES1Cube::KhrSetup function. CGLES1Cube::KhrPaint just sets the view matrix and issues a draw command. Which demo to display can be selected by passing its name on the command line, e.g. eglbringuptest vgline eglbringuptest gles1cube If no name is provided, the application defaults to vgline.

/*
* Copyright (c) 2005-2009 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 "T_DataAnim.h"
#include "T_GraphicsUtil.h"
#include "T_AnimDef.h"

#define KMaxBufSize 250

/*@{*/
_LIT(KDataClassname,							"RAnim");

///	Fields
_LIT(KFldAnimDll,								"animdll");
_LIT(KFldWin,									"win");
_LIT(KFldSprite,								"sprite");
_LIT(KFldType,									"type");
_LIT(KFldParam,									"param");
_LIT(KFldIpcArgs,								"ipcargs");
_LIT(KFldOpcode,								"opcode");
_LIT(KFldArgs,									"args");
_LIT(KFldIpcArg,								"ipcargs%d");
_LIT(KFldExpectedIpcArg,						"expected_ipcargs%d");

// enum
_LIT(KEAnimWindows,								"EKWindowAnim");
_LIT(KEAnimSprite,								"EKSpriteAnim");
_LIT(KEAnimFreeTimer,							"EKFreeTimerWindowAnim");


_LIT(KEAnimCmdSync,								"ECmdSync");
_LIT(KEAnimCmdTestWithoutPara,					"ECmdTestWithoutPara");
_LIT(KEAnimCmdTestWithPara,						"ECmdTestWithPara");
_LIT(KEAnimCmdGetLast,							"ECmdGetLast");
_LIT(KEAnimCmdGetAnimInterval,					"ECmdGetAnimInterval");


// animate interval
_LIT(KFldCheckAnimateInterval,					"CheckAnimateInterval");
_LIT(KFldAnimIpcArgSlot,						"AnimIpcArgSlot");
_LIT(KFldAnimIntervalMin,						"AnimIntervalMin");
_LIT(KFldAnimIntervalMax,						"AnimIntervalMax");

_LIT(KIpcArgNothing,							"ENothing");

///	Commands
_LIT(KCmdnew,									"new");
_LIT(KCmdDestructorGeneral,						"~");
_LIT(KCmdDestructor,							"~RAnim");
_LIT(KCmdConstruct,								"Construct");
_LIT(KCmdCommandReply,							"CommandReply");
_LIT(KCmdCommand,								"Command");
_LIT(KCmdAsyncCommandReply,						"AsyncCommandReply");
_LIT(KCmdDestroy,								"Destroy");
_LIT(KCmdClose,									"Close");

///	Logging
_LIT(KLogErrNum,				"Error=%d");
_LIT(KLogErrMissingPara,		"Missing parameter '%S'");
_LIT(KLogInfoCmdnewL1,			"execute new RAnim(RAnimDll &)");
_LIT(KLogInfoCmdnewL2,			"execute new RAnim()");
_LIT(KLogErrConstruct,			"Construct return err = %d");
_LIT(KLogInfoCmdConstruct1,		"execute RAnim::Construct(const RWindowBase &, TInt, const TDesC8 &)");
_LIT(KLogInfoCmdConstruct2,		"execute RAnim::Construct(const RWindowBase &, TInt, const TDesC8 &, const TIpcArgs &)");
_LIT(KLogInfoCmdConstruct3,		"execute RAnim::Construct(const RWsSprite &, TInt, const TDesC8 &)");
_LIT(KLogInfoCmdConstruct4,		"execute RAnim::Construct(const RWsSprite &, TInt, const TDesC8 &, const TIpcArgs &)");
_LIT(KLogErrCommandReply,		"CommandReply return err = %d");
_LIT(KLogInfoCmdCommandReply1,	"execute RAnim::CommandReply(TInt)");
_LIT(KLogInfoCmdCommandReply2,	"execute RAnim::CommandReply(TInt, const TPtrC8 &)");
_LIT(KLogInfoCmdCommandReply3,	"execute RAnim::CommandReply(TInt, const TDesC8 &, const TIpcArgs &)");
_LIT(KLogErrCommand,			"Command return err = %d");
_LIT(KLogErrCheckIpcValue,		"Ipc arg compare fail expected=%S actual=%S");
_LIT(KLogErrIpcValue,			"Ipc arg return value err");

_LIT(KLogErrAnimInterval,		"Animate interval error expected min=%d max=%d");

_LIT(KLogInfoAnimInterval,		"Animate interval actual min=%d max=%d");

_LIT(KLogInfoCmdCommand1,		"execute RAnim::Command(TInt, const TPtrC8 &)");
_LIT(KLogInfoCmdCommand2,		"execute RAnim::Command(TInt)");
_LIT(KLogInfoCmdAsyncCommandReply1,	"execute RAnim::AsyncCommandReply(TRequestStatus &, TInt, const TIpcArgs &)");

_LIT(KLogInfoCmdClose1,			"execute RAnim::Close()");
_LIT(KLogInfoCmdDestroy1,		"execute RAnim::Destroy()");
_LIT(KLogInfoCmdDestructor1,	"execute ~RAnim()");
/*@}*/

CT_DataAnim* CT_DataAnim::NewL()
	{
	CT_DataAnim*	ret = new (ELeave) CT_DataAnim();
	CleanupStack::PushL(ret);
	ret->ConstructL();
	CleanupStack::Pop(ret);
	return ret;
	}

CT_DataAnim::CT_DataAnim()
:	iActiveCallback(NULL)
	,iAnim(NULL)
	{
	}

void CT_DataAnim::ConstructL()
	{
	iActiveCallback = CActiveCallback::NewL(*this);
	iSendBuf.CreateL(KMaxBufSize);
	
	for (TInt i=0;i<KIpcArgNum;i++)	
		iIpcBuf[i].CreateL(KMaxBufSize);
	}

CT_DataAnim::~CT_DataAnim()
	{
	DestroyData();
	delete iActiveCallback;
	iActiveCallback = NULL;
	
	iSendBuf.Close();
	
	for (TInt i=0;i<KIpcArgNum;i++)	
		iIpcBuf[i].Close();	
	}

TAny* CT_DataAnim::GetObject()
	{
	return iAnim;
	}

void CT_DataAnim::SetObjectL(TAny* aAny)
	{
	DestroyData();
	iAnim = static_cast<T_RAnimChild*> (aAny);
	}

void CT_DataAnim::DisownObjectL()
	{
	iAnim = NULL;
	}

void CT_DataAnim::DestroyData()
	{
	DoCmdDestructor();
	}

/**
* Process a command read from the ini file
*
* @param aCommand			the command to process
* @param aSection			the entry in the ini file requiring the command to be processed
* @param aAsyncErrorIndex	index of command. used for async calls
*
* @return ETrue if the command is processed
*/
TBool CT_DataAnim::DoCommandL(const TTEFFunction& aCommand, const TTEFSectionName& aSection, const TInt aAsyncErrorIndex)
	{
	TBool	ret = ETrue;

	if ( aCommand==KCmdDestructorGeneral || aCommand==KCmdDestructor )
		{
		DoCmdDestructor();
		}
	else if ( aCommand==KCmdnew || aCommand==KDataClassname )
		{
		DoCmdnewL(aSection);
		}
	else if ( aCommand==KCmdConstruct )
		{
		DoCmdConstructL(aSection);
		}
	else if ( aCommand==KCmdCommandReply )
		{
		DoCmdCommandReply(aSection);
		}
	else if ( aCommand==KCmdCommand )
		{
		DoCmdCommand(aSection);
		}
	else if ( aCommand==KCmdAsyncCommandReply )
		{
		DoCmdAsyncCommandReply(aSection, aAsyncErrorIndex);
		}
	else if ( aCommand==KCmdDestroy )
		{
		DoCmdDestroy();
		}
	else if ( aCommand==KCmdClose )
		{
		DoCmdClose();
		}
	else
		{
		ret=EFalse;
		}

	return ret;
	}

void CT_DataAnim::DoCmdnewL(const TDesC& aSection)
	{
	DestroyData();

	// Get test data for command input parameter(s)
	TPtrC		datDllName;
	RAnimDll*	animDll = NULL;
	if ( GetStringFromConfig(aSection, KFldAnimDll, datDllName) )
		{
		animDll = static_cast<RAnimDll*>(GetDataObjectL(datDllName));
		}

	TInt err = KErrNone;
	if ( animDll )
		{
		// Execute command and log parameters
		INFO_PRINTF1(KLogInfoCmdnewL1);
		iAnim = new (ELeave) T_RAnimChild(*animDll) ;
		}
	else
		{
		// Execute command and log parameters
		INFO_PRINTF1(KLogInfoCmdnewL2);
		iAnim = new (ELeave) T_RAnimChild();
		}
	}

TBool CT_DataAnim::GetIpcArg(const TDesC& aSection)
	{
	TBool argexist=EFalse;
	
	TBuf <100> field;
	TPtrC    val;
	for (TInt i=0;i<KIpcArgNum;i++)	
		{
		field.Format(KFldIpcArg,i);
		if ( GetStringFromConfig(aSection, field, val))
			{
			if (val.Compare(KIpcArgNothing)==0)
				iIpcArgs.Set(i,TIpcArgs::ENothing);
			else
				{
				iIpcBuf[i].Copy(val);
				iIpcArgs.Set(i,&iIpcBuf[i]);
				}
			argexist=ETrue;
			}
		else
			break;
		
		}	
	return argexist;	
	}

// check is the time interval of CAnim::Animate() is in specified scope
TBool CT_DataAnim::CheckAnimateInterval(const TDesC& aSection)
	{
	TBool result=EFalse;	
			
	TInt slot,min,max,find;
	TInt amin,amax;

	_LIT(KSpace," ");
	
	// get IPC args slot index
	if ( GetIntFromConfig(aSection, KFldAnimIpcArgSlot,slot))
		{
		// get expected min/max interval of Animate()
		if ( GetIntFromConfig(aSection, KFldAnimIntervalMin,min) && 
				GetIntFromConfig(aSection, KFldAnimIntervalMax,max) )
			{
			find=iIpcBuf[slot].Find(KSpace); // get actual min/max interval of Animate()
			if (find>0 )
				{
				// get actual min interval 
				TPtrC val1=iIpcBuf[slot].Left(find);
				TLex lex1(val1);
				lex1.Val(amin);
				
				// get actual max interval 
				TPtrC val2=iIpcBuf[slot].Mid(find+1);
				TLex lex2(val2);
				lex2.Val(amax);
				
				INFO_PRINTF3(KLogInfoAnimInterval,amin,amax);
				
				// check is the interval in expected scope 
				if (amin<min || amax>max)
					{
					ERR_PRINTF3(KLogErrAnimInterval, min,max);
					}
				else
					result=ETrue;
				}			
			}
		}	

	return result;	
	}
TBool CT_DataAnim::CheckIpcArg(const TDesC& aSection)
	{
	TBool result=ETrue;	

	// check animate interval
	TInt checkanim=0;
	if ( GetIntFromConfig(aSection, KFldCheckAnimateInterval, checkanim) 
			&& checkanim)
		{
		return CheckAnimateInterval(aSection);
		}
			
	TBuf <100> field;
	TPtrC    val;
	
	// check ipc expected value
	for (TInt i=0;i<KIpcArgNum;i++)	
		{
		field.Format(KFldExpectedIpcArg,i);
		if ( GetStringFromConfig(aSection, field, val) && 
				val.Compare(iIpcBuf[i])!=0)
			{
			ERR_PRINTF3(KLogErrCheckIpcValue, &val, &iIpcBuf[i]);
			result=EFalse;
			break;
			}		
		}	
	return result;	
	}

void CT_DataAnim::DoCmdConstructL(const TDesC& aSection)
	{
	TInt err = KErrNone;
	
	// Get test data for command input parameter(s)
	TBool dataOk = ETrue;

	// get "const RWindowBase &aDevice" or "const RWsSprite &aDevice"
	TPtrC        datWinName;
	RWindowBase* win = NULL;
	TPtrC        datSpriteName;
	RWsSprite*   sprite = NULL;
	if ( GetStringFromConfig(aSection, KFldWin, datWinName))
		{
		win = static_cast<RWindowBase*>(GetDataObjectL(datWinName));
		}
	else if ( GetStringFromConfig(aSection, KFldSprite, datSpriteName))
		{
		sprite = static_cast<RWsSprite*>(GetDataObjectL(datSpriteName));
		}
	if (!win && !sprite )
		{
		dataOk = EFalse;
		ERR_PRINTF2(KLogErrMissingPara, &KFldWin);
		ERR_PRINTF2(KLogErrMissingPara, &KFldSprite);
		}
	
	//get "TInt aType"
	TInt datType;
	if ( !ReadAnimType(aSection, KFldType, datType))
		{
		dataOk = EFalse;
		ERR_PRINTF2(KLogErrMissingPara, &KFldType);
		}
	
	// get "const TDesC8 &aArgs"
	TPtrC 	inputStr;
	TBool argexist=EFalse;
	if( GetStringFromConfig(aSection, KFldParam, inputStr))
		{
		CopyToSendBuf(inputStr);
		argexist=ETrue;
		}

	if (!argexist)
		{
		dataOk = EFalse;
		ERR_PRINTF2(KLogErrMissingPara, &KFldParam);
		}
	
	// get "const TIpcArgs &aIpcArgs"
	TBool ipcexist= EFalse;
	if ( GetIpcArg(aSection))
		ipcexist = ETrue;
	
	if ( !dataOk )
		{
		SetBlockResult(EFail);
		}
	else
		{
		// Execute command and log parameters
		if (win )
			{
			if (!ipcexist)
				{
				INFO_PRINTF1(KLogInfoCmdConstruct1);
				err = iAnim->Construct(*win, datType, iSendBuf);				
				}
			else
				{
				INFO_PRINTF1(KLogInfoCmdConstruct2);
				err = iAnim->Construct(*win, datType, iSendBuf, iIpcArgs);								
				}
			}
		else
			{
			if (!ipcexist )
				{
				INFO_PRINTF1(KLogInfoCmdConstruct3);
				err = iAnim->Construct(*sprite, datType, iSendBuf);				
				}
			else
				{
				INFO_PRINTF1(KLogInfoCmdConstruct4);
				err = iAnim->Construct(*sprite, datType, iSendBuf, iIpcArgs);
				}
			}
		
		// Check the command return code
		if(err != KErrNone)
			{
			ERR_PRINTF2(KLogErrConstruct, err);
			SetError(err);
			}
		else if (ipcexist && ! CheckIpcArg(aSection))
			{
			ERR_PRINTF1(KLogErrIpcValue);
			SetBlockResult(EFail);
			}			
		}
	}

TDesC8& CT_DataAnim::CopyToSendBuf(const TDesC& buf) 
	{
	TUint8 len=buf.Length();

	iSendBuf.Zero();
	iSendBuf.Copy(&len,sizeof(len));
	if (len>0)
		iSendBuf.Append(buf);
	return iSendBuf;
	}

void CT_DataAnim::DoCmdCommandReply(const TDesC& aSection)
	{
	TInt err = KErrNone;
	
	// Get test data for command input parameter(s)
	TBool dataOk = ETrue;

	// get "TInt aOpcode"
	TInt datOpcode;
	if ( !ReadAnimCommand(aSection, KFldOpcode, datOpcode))
		{
		dataOk = EFalse;
		ERR_PRINTF2(KLogErrMissingPara, &KFldOpcode);
		}

	// get "const TPtrC8 &aArgs" or "const TDesC8 &aArgs"
	TPtrC 	inputStr;
	TBool argexist=EFalse;
	if( GetStringFromConfig(aSection, KFldArgs, inputStr))
		{
		CopyToSendBuf(inputStr);
		argexist=ETrue;
		}
	
	// get "const TIpcArgs &aIpcArgs"
	TBool ipcexist= EFalse;
	if ( GetIpcArg(aSection))
		ipcexist = ETrue;
	

	if ( dataOk )
		{
		if (!argexist)
			{
			INFO_PRINTF1(KLogInfoCmdCommandReply1);
			err = iAnim->CommandReply(datOpcode);
			}
		else if (ipcexist)
			{
			INFO_PRINTF1(KLogInfoCmdCommandReply3);
			err = iAnim->CommandReply(datOpcode, iSendBuf, iIpcArgs);
			}			
		else
			{			
			INFO_PRINTF1(KLogInfoCmdCommandReply2);
			err = iAnim->CommandReply(datOpcode, iSendBuf);
			}	
		
		// Check the command return code
		if(err != KErrNone)
			{
			ERR_PRINTF2(KLogErrCommandReply, err);
			SetError(err);
			}
		else if (ipcexist && ! CheckIpcArg(aSection))
			{
			ERR_PRINTF1(KLogErrIpcValue);
			SetBlockResult(EFail);
			}			
		}
	else
		SetBlockResult(EFail);

	}

void CT_DataAnim::DoCmdCommand(const TDesC& aSection)
	{
	// Get test data for command input parameter(s)
	TBool dataOk = ETrue;

	// get "TInt aOpcode"
	TInt datOpcode;
	if ( !ReadAnimCommand(aSection, KFldOpcode, datOpcode))
		{
		dataOk = EFalse;
		ERR_PRINTF2(KLogErrMissingPara, &KFldOpcode);
		}

	// get "const TPtrC8 &aArgs" or "const TDesC8 &aArgs"
	TPtrC 	inputStr;
	TBool argexist=EFalse;
	if( GetStringFromConfig(aSection, KFldArgs, inputStr))
		{
		CopyToSendBuf(inputStr);
		argexist=ETrue;
		}
	
	if ( dataOk )
		{
		if (!argexist)
			{
			INFO_PRINTF1(KLogInfoCmdCommand2);
			iAnim->Command(datOpcode);
			}
		else
			{			
			INFO_PRINTF1(KLogInfoCmdCommand1);
			iAnim->Command(datOpcode, iSendBuf);
			}	
		}
	else
		SetBlockResult(EFail);

	}

void CT_DataAnim::DoCmdAsyncCommandReply(const TDesC& aSection, const TInt aAsyncErrorIndex)
	{
	// Get test data for command input parameter(s)
	TBool dataOk = ETrue;

	// get "TInt aOpcode"
	TInt datOpcode;
	if ( !ReadAnimCommand(aSection, KFldOpcode, datOpcode))
		{
		dataOk = EFalse;
		ERR_PRINTF2(KLogErrMissingPara, &KFldOpcode);
		}

	// get "const TIpcArgs &aIpcArgs"
	TBool ipcexist= EFalse;
	if ( GetIpcArg(aSection))
		ipcexist = ETrue;
	
	if (!ipcexist)
		{
		dataOk = EFalse;
		ERR_PRINTF2(KLogErrMissingPara, &KFldIpcArgs);		
		}
	
	if ( !dataOk )
		{
		SetBlockResult(EFail);
		}
	else
		{
		iAsyncCmdSection.Copy(aSection);
		// Execute command and log parameters
		INFO_PRINTF1(KLogInfoCmdAsyncCommandReply1);
		iAnim->AsyncCommandReply(iActiveCallback->iStatus, datOpcode, iIpcArgs);
	    iActiveCallback->Activate(aAsyncErrorIndex);
	    IncOutstanding();
		}

	}

void CT_DataAnim::RunL(CActive* aActive, TInt aIndex)
    {
    TInt err = aActive->iStatus.Int();  
    
    if (! CheckIpcArg(iAsyncCmdSection))
		{
		ERR_PRINTF1(KLogErrIpcValue);
		SetBlockResult(EFail);
		}   
    
    SetAsyncError(aIndex, err);
    DecOutstanding();
	}

void CT_DataAnim::DoCmdClose()
	{
	// Execute command and log parameters
	if (iAnim != NULL)
		{
		INFO_PRINTF1(KLogInfoCmdClose1);
		iAnim->Close();
		}
	}

void CT_DataAnim::DoCmdDestroy()
	{
	// Execute command and log parameters
	if (iAnim != NULL)
		{
		INFO_PRINTF1(KLogInfoCmdDestroy1);
		iAnim->Destroy();
		iAnim = NULL;
		}
	}

void CT_DataAnim::DoCmdDestructor()
	{
	// Execute command and log parameters
	INFO_PRINTF1(KLogInfoCmdDestructor1);
	delete iAnim;
	iAnim = NULL;
	}


TBool CT_DataAnim::ReadAnimCommand(const TDesC& aSectName, const TDesC& aKeyName, TInt& aCommand)
	{
	TPtrC	str;
	TBool	ret=GetStringFromConfig(aSectName, aKeyName, str);
	if ( ret )
		{
		if ( str==KEAnimCmdSync )
			{
			aCommand=ECmdSync;
			}
		else if ( str==KEAnimCmdTestWithoutPara )
			{
			aCommand=ECmdTestWithoutPara;
			}
		else if ( str==KEAnimCmdTestWithPara )
			{
			aCommand=ECmdTestWithPara;
			}
		else if ( str==KEAnimCmdGetLast )
			{
			aCommand=ECmdGetLast;
			}
		else if ( str==KEAnimCmdGetAnimInterval )
			{
			aCommand=ECmdGetAnimInterval;
			}
		else
			ret=EFalse;
		}

	return ret;
	}
TBool CT_DataAnim::ReadAnimType(const TDesC& aSectName, const TDesC& aKeyName, TInt& aType)
	{
	TPtrC	str;
	TBool	ret=GetStringFromConfig(aSectName, aKeyName, str);
	if ( ret )
		{
		if ( str==KEAnimWindows)
			{
			aType=EKWindowAnim;
			}
		else if ( str==KEAnimSprite )
			{
			aType=EKSpriteAnim;
			}
		else if ( str==KEAnimFreeTimer )
			{
			aType=EKFreeTimerWindowAnim;
			}
		else
			ret=EFalse;
		}

	return ret;	
	}