windowing/windowserver/tauto/tdirecta.h
author Faisal Memon <faisal.memon@nokia.com>
Thu, 06 May 2010 11:31:11 +0100
branchNewGraphicsArchitecture
changeset 47 48b924ae7197
parent 0 5d03bc08d59c
permissions -rw-r--r--
Applied patch 1, to provide a syborg specific minigui oby file. Need to compare this with the "stripped" version currently in the tree. This supplied version applies for Nokia builds, but need to repeat the test for SF builds to see if pruning is needed, or if the file needs to be device-specific.

// Copyright (c) 1996-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:
//

/**
 @file
 @test
 @internalComponent - Internal Symbian test code
*/

#ifndef __TDIRECTA_H__
#define __TDIRECTA_H__

#include "AUTO.H"
#include <e32msgqueue.h>
#include <time.h>
#include "TGraphicsHarness.h"

//#define LOGGING

class CColorAnimation;
class CScrollText;
class CScrollingTextDrawer;
class CDirectScreenAccessOld;


struct TDirectThreadParam
	{
	TRect iRect;
	TInt iScreenNumber;
	TBool iIsInFront;
	};

class MAnimCallBacks
	{
public:
	virtual void LogLeave(TInt aErr)=0;
	virtual void Fail()=0;
	virtual void Finished(TInt aId)=0;
	virtual TDisplayMode DisplayMode(TInt aId)=0;
	virtual TRgb BrushColorL(TInt aId,TInt& aColor,TBool& aFinished)=0;
	virtual TInt TimerInterval(TInt aId)=0;
	virtual void FailedReStart(TInt aId,TInt aReason)=0;
	virtual TInt SlowStopping(TInt aId,TInt aCount)=0;
	virtual void Log(const TText8* aFile, TInt aLine, TInt aSeverity,const TDesC& aString)=0;
public:
	CTBlankWindow* iCallBackWin;
	};

class CTDirect : public CTWsGraphicsBase, public MAbortDirectScreenAccess, public MAnimCallBacks
	{
public:
	enum
		{
		eDirectNumFrames=10
		};
	enum
		{
		eDirectControlSem=0x01,
		eDirectWindowSem=0x02,
		eFontSet=0x04,
		eMultiAnim=0x08,
		};
public:
	CTDirect(CTestStep* aStep);
	~CTDirect();
	void ConstructL();
	TBool DrawFrame();
	TBool Restart();
	void ChangeToNextScreenModeL();
	void ChangeScreenScale();
	//The Tests
	TestState AnimateWindowL();
	TestState AnimationDiesL();
	TestState PackagingClassL();
	TestState MultipleL();
	TestState FailCodesL();
	TestState ScrolingText1L();
	TestState RClassL();
	TestState ScrolingText2L();
	TestState ScrolingText3L();
	TestState ScrolingText4L();
	TestState DefectFix_KAA_5J3BLW_L();
	TestState KillAnimationL();
	TestState DSAWithScreenModeOffset1L();
	TestState DSAWithScreenModeOffset2L();
	TestState WindowPoistionRelativeToScreenL();
	TestState ScreenModeScalingTestL();
	TestState ScreenModeTestForScalingL();
	TestState MultipleDSAsOnSameWindowL();
	TestState TemporaryDeadlockL();
	TestState RegionTrackingOnlyNotificationsL(TUint aId);
	TestState MixDsaAndRegionTrackingOnlyL(TBool aWhoExitsLast);
	TestState TryDifferentSupportedModesL();
protected:
//from 	CTGraphicsStep
	virtual void RunTestCaseL(TInt aCurTestCase);
private:
	void ConstrucBlankWindowL();
	void ScanTypeFacesL();
	void InitialiseAnimationL();
	void DestroyAnimation();
	void ResetScreenSizeMode();
	void StartDirect();
	void SignalWindow();
	void ModeSwitch();
	void ScrolingTextL(TInt aId,TRect aWinRect,TBool aStartThread,TInt aScreenMode=0);
	void AnimTestL(TInt aId,TRect aWinRect,CTWinBase& aParent);
	//Pure virtual function from MAbortDirectScreenAccess
	void AbortNow(RDirectScreenAccess::TTerminationReasons aReason);
	//Pure virtual functions from MAnimCallBacks
	void LogLeave(TInt aErr);
	void Fail();
	void Finished(TInt aId);
	void DeleteMoveWindow();
	void DeleteScroll();
	TDisplayMode DisplayMode(TInt aId);
	TRgb BrushColorL(TInt aId,TInt& aColor,TBool& aFinished);
	TInt TimerInterval(TInt aId);
	void FailedReStart(TInt aId,TInt aReason);
	TInt SlowStopping(TInt aId,TInt aCount);
	void Log(const TText8* aFile, TInt aLine, TInt aSeverity,const TDesC& aString);
	void SetScreenMode(TInt aMode,TPixelsAndRotation& aPixelsAndRotation);
	void CreateAnimForScreenModeL(TInt aAnimIndex,CTWinBase& aParent,TRect aRect,TInt aId);
	void BlankTopClientWindowL(CTBlankWindow& aBlankWindow,TRect aRect);
	void TestDifferentOriginAndScaleL(TSizeMode &aMode,TPoint aOrigin);
	void CheckForTemporaryDeadlock();
private:
	CProcess* iProcess;
	CProcess* iMoveWin;
	RSemaphore iControlSem;
	RMsgQueueBase iControlQueue;
	RSemaphore iWinSem;
	TRequestStatus iThreadStatus;
	TUint iFlags;
	CTBlankWindow* iWin;
	CTBlankWindow* iWin2;
	CFbsScreenDevice* iScrDev;
	CFbsBitGc* iGc;
	CFont* iFont;
	CPeriodic* iTimer;
	CIdle* iRestart;
	CDirectScreenAccessOld* iDirect;
	RRegion* iDrawingRegion;
	TSize iScrSize;
	TRect iDrawRect;
	TInt iDrawHeight;
	TInt iFrameNo;
	TInt iLastTextWidth;
	TInt iLastMaxTextWidth;
	TInt iFrameToSignalAfter;
	TBool iDelay;
	TBool iCancelNext;
	TBool iWindowDead;
	CColorAnimation* iAnim;
	CColorAnimation* iAnims[13];
	TInt iCount;
	CScrollText* iScroll;
	TInt iCycles;
	TScreenModeEnforcement iModeBackup;
	TThreadStartUp iFirstFunction;
	TInt iNumThreadHandles;
	CTBlankWindow* iBlankTopClientWin1;
	CTBlankWindow* iBlankTopClientWin2;
	CPeriodic* iChangeScreenModeTimer;
	TInt iCurrentMode;
	TInt iNumOfModes;
	TPoint iCurrentScreenModeOrigin;
	TSize iCurrentScreenModeScale;
	TInt iNumAnimation;
	TSizeMode iModeData;
	CPeriodic* iScreenModeTimer;
	TInt iIsScalingSupported;
	TInt iNumOfCallBack;
	TBool iTestJustFailed;
	TBool iTestJustCompleted;
	TInt iState;
	TBool iNextFrameFinished;
	TBool iPackagingFinished;
	TBool iTimerRunning;
	};

class CDirectScreenAccessOld : public CActive
	{
public:
	static CDirectScreenAccessOld* NewL(RWsSession& aWs,MAbortDirectScreenAccess& aAborter);
	~CDirectScreenAccessOld();
	TInt Request(RRegion*& aRegion, RWindowBase& aWindow);
private:
	inline CDirectScreenAccessOld(RWsSession& aWs,MAbortDirectScreenAccess& aAborter)
		: CActive(RDirectScreenAccess::EPriorityVeryHigh), iDirectAccess(aWs), iAborter(aAborter) {}
	void ConstructL();
	//Pure virtual functions from CActive
	void DoCancel();
	void RunL();
private:
	RDirectScreenAccess iDirectAccess;
	MAbortDirectScreenAccess& iAborter;
	TBool iAborting;
	};

class CColorAnimation : public CBase, public MDirectScreenAccess
	{
public:
	enum
		{
		eStopNow=EFalse,
		eStopDelayed=ETrue,
		eAbort=2,
		eAbortAll,
		};
public:
	static TInt DrawColorL(TAny* aAnimation);
	static TInt IdlingL(TAny* aAnimation);
	static CColorAnimation* NewL(TInt aScreenNumber,TInt aId,MAnimCallBacks& aCallBack,CTWinBase& aParent,TRect aExtent,TBool aStart,TBool aRegionTrackingOnly = EFalse);
	inline CColorAnimation(TInt aScreenNumber,TInt aId,MAnimCallBacks& aCallBack) :iId(aId), iCallBack(aCallBack), iScreenNumber(aScreenNumber) {}
	~CColorAnimation();
	void ConstructL(CTWinBase& aParent,TRect aExtent,TBool aRegionTrackingOnly,TInt aTypeWindow=0,TInt aSingleWinForMultipleDSA=0);
	void StartL(TBool aChildWindow=EFalse);
	void StartOrPanic();
	void Stop();
	void BringWindowToFront();
	void ChangeModeL(TDisplayMode aMode);
	TBool inline IsTimerActive() {return iTimer->IsActive();}
	inline MAnimCallBacks& CallBack() { return iCallBack; }
	TPoint AbsoluteWindowPosition(TInt aWindowId=0);
	inline CDirectScreenAccess* GetDrawer();
	void FinishTest();
	TBool TestGcAndScreenDeviceValues();
	//inline TBool IsReadyToAbort(){return (iDrawer->iStatus!=KRequestPending);}
protected:
	void DrawColorL();
	void IdlingL();
	/*pure virtual function from MAbortDirectScreenAccess*/
	void AbortNow(RDirectScreenAccess::TTerminationReasons aReason);
	/*pure virtual function from MDirectScreenAccess*/
	void Restart(RDirectScreenAccess::TTerminationReasons aReason);
private:
	TInt iId;
	CTBlankWindow* iWindow;
	CTBlankWindow* iWindow2;
	TSize iWinSize;
	CDirectScreenAccess* iDrawer;
	CPeriodic* iTimer;
	MAnimCallBacks& iCallBack;
	TInt iColor;
	TInt iCount;
	TUint iIdling;
	TInt iScreenNumber;
	TInt iSingleWinForMultipleDSA;
	TBool iRegionTrackingOnly;
	};

class CScrollingTextDrawer : public CBase
	{
public:
	static CScrollingTextDrawer* NewL(TInt aScreenNumber,CFbsScreenDevice*& aDevice,CFbsBitGc& aGc);
	~CScrollingTextDrawer();
	inline void SetScrollJump(TInt aJump) {iJump=aJump;}
	void SetBottomOfTest(TInt aBottom);
	void Scroll();
private:
	inline CScrollingTextDrawer(CFbsScreenDevice*& aDevice,CFbsBitGc& aGc) : iDevice(aDevice), iGc(&aGc) {}
	void ConstructL(TInt aScreenNumber);
	void CreateFontL();
private:
	CFbsScreenDevice*& iDevice;
	CFbsScreenDevice* iFontDevice;
	CFbsBitGc* iGc;
	CFont* iFont;
	TBuf<32> iText;
	TRect iDrawRect;
	TInt iDrawHeight;
	TInt iCharWidth;
	TInt iFirstChar;
	TInt iJump;
#if defined(LOGGING)
	RWsSession iWs;
#endif
	};

class CScrollText : public CBase, public MDirectScreenAccess
	{
public:
	static TInt DrawText(TAny* aAnimation);
	static CScrollText* NewL(TInt aScreenNumber,TInt aId,CTWindowGroup& aParent,TInt aScrollJump,TBool aStart=EFalse);
	inline CScrollText(TInt aId,TInt aScrollJump,TInt aScreenNumber) :iId(aId), iScrollJump(aScrollJump), iScreenNumber(aScreenNumber) {}
	~CScrollText();
	void ConstructL(CTWindowGroup& aParent);
	void StartL();
	void Stop();
	void ContinueL();
	inline TBool IsRunning() {return iTimer->IsActive();}
	inline void SetCountDown(TInt aCountDown) {iAbortCountDown=aCountDown; iCounting=ETrue;}
	inline void SetBottomOfTest(TInt aBottom) {iTextDraw->SetBottomOfTest(aBottom);}
private:
	void ScrollText();
	void DoContinueL();
	/*pure virtual function from MAbortDirectScreenAccess*/
	void AbortNow(RDirectScreenAccess::TTerminationReasons aReason);
	/*pure virtual function from MDirectScreenAccess*/
	void Restart(RDirectScreenAccess::TTerminationReasons aReason);
private:
	TInt iId;
	CTBlankWindow* iWindow;
	TSize iWinSize;
	CDirectScreenAccess* iDrawer;
	CScrollingTextDrawer* iTextDraw;
	CPeriodic* iTimer;
	TInt iScrollJump;
	TBool iCounting;
	TInt iAbortCountDown;
	TInt iScreenNumber;
	};

	
/**
 A simple class based on CScrollText constructs a blank window that has
 a blank window child, used for functional coverage testing of CWsClientWindow
 */
class CWindowWithChild : public CBase, public MDirectScreenAccess
	{
public:
	static CWindowWithChild* NewL(TInt aScreenNumber, CTWindowGroup& aParent,TBool aStart=EFalse);
	inline CWindowWithChild(TInt aScreenNumber) : iScreenNumber(aScreenNumber) {}
	~CWindowWithChild();
	void ConstructL(CTWindowGroup& aParent);
	void StartL();
	void Stop();
	void ContinueL();
	inline TBool IsRunning() {return iRunning;}
	void PerformCoverageCalls();
	RWindow *ChildWindow()    {return iChildWindow->Win();}
private:
	void DoContinueL();
	/*pure virtual function from MAbortDirectScreenAccess*/
	void AbortNow(RDirectScreenAccess::TTerminationReasons aReason);
	/*pure virtual function from MDirectScreenAccess*/
	void Restart(RDirectScreenAccess::TTerminationReasons aReason);
private:
	CTBlankWindow* iWindow;
	CTWin * iChildWindow;
	TSize iWinSize;
	CDirectScreenAccess* iDrawer;
	TInt iScreenNumber;
	TBool iRunning;
	};
	
	
class CWsBase : public CBase
	{
public:
protected:
	~CWsBase();
	void ConstructL(TInt aScreenNumber,TInt aHandle);
	void CreateBlankWindowL(RBlankWindow& iWin,TInt aHandle);
protected:
	RWsSession iWs;
	CWsScreenDevice *iScrDev;
	RWindowGroup iGroup;
	};

class CAnimating : public CWsBase, public MAbortDirectScreenAccess
	{
public:
	static TInt StartLC(TAny* aScreenNumber);
	//static CAnimating* NewLC();
	void DrawFrame();
	/*pure virtual function from MAbortDirectScreenAccess*/
	void AbortNow(RDirectScreenAccess::TTerminationReasons aReason);
private:
	void ConstructL(TInt aScreenNumber);
	~CAnimating();
	void StartAnimatingL();
private:
	RSemaphore iControlSem;
	RMsgQueueBase iControlQueue;
	TBool iSemCreated;
	RBlankWindow iWindow;
	CFbsScreenDevice* iScrDev;
	CFbsBitGc* iGc;
	TSize iScrSize;
	CDirectScreenAccessOld* iDirect;
	RRegion* iDrawingRegion;
	CPeriodic* iTimer;
	TInt iColor;
	};

class CMoveWindow : public CWsBase
	{
public:
	static TInt StartLC(TAny* aScreenNumber);
	static TInt StateChange(TAny* aMoveWin);
	static TInt FlipChange(TAny*);
	//Call Backs
	void MoveWindow();
private:
	inline static CMoveWindow* Cast(TAny* aMoveWin) {return STATIC_CAST(CMoveWindow*,aMoveWin);}
	~CMoveWindow();
	void ConstructL(TInt aScreenNumber);
	void CreateTimerL();
	void StateChange();
	void ToggleDisplayMode();
	void FlipChange();
private:
	CPeriodic* iFlipTimer;
	CPeriodic* iStateTimer;
	CPeriodic* iTimer;
	CWsScreenDevice* iDevice;
	RBlankWindow iWindow;
	TDisplayMode iDisplayMode;
	RBackedUpWindow iBackUpWin;
	CWindowGc* iGc;
	TRect iBounceArea;
	TSize iScrSize;
	TPoint iTl;
	TSize iSize;
	TSize iDelta;
	TInt iStateCountDown;
	TInt iNumOfModes;
	TInt iCurrentMode;
	};

class CBugFixColorAnimation : public CColorAnimation
	{
public:
	static CBugFixColorAnimation* NewL(TInt aScreenNumber,TInt aId,MAnimCallBacks& aCallBack,CTWindowGroup& aParent,TRect aExtent,TBool aStart=EFalse);
	~CBugFixColorAnimation();
	inline void Started() { iSem.Signal(); }
private:
	CBugFixColorAnimation(TInt aScreenNumber,TInt aId,MAnimCallBacks& aCallBack);
	void ConstructL(CTWindowGroup& aParent,TRect aExtent);
private:
	/*pure virtual function from MAbortDirectScreenAccess*/
	void AbortNow(RDirectScreenAccess::TTerminationReasons aReason);
	/*pure virtual function from MDirectScreenAccess*/
	void Restart(RDirectScreenAccess::TTerminationReasons aReason);
private:
	CProcess* iThread;
	CIdle* iTestFailed;
	TRect iAnimRect;
	TDirectThreadParam iThreadParam;
	RSemaphore iSem;
	};

class CRegionTrackingOnly : public CColorAnimation
	{
public:
	static CRegionTrackingOnly* NewL(TInt aScreenNumber,TInt aId,MAnimCallBacks& aCallBack,CTWindowGroup& aParent,TRect aExtent,TBool aStart,TBool aOpenWindowInFrontDsa);
	void ConstructL(CTWindowGroup& aParent,TRect aExtent,TBool aOpenWindowInFrontDsa);
	~CRegionTrackingOnly();
	inline void Started() { iSem.Signal(); }
private:
	CRegionTrackingOnly(TInt aScreenNumber,TInt aId,MAnimCallBacks& aCallBack);
	/*Overriding of bases class virtual functions*/
	void AbortNow(RDirectScreenAccess::TTerminationReasons aReason);
	void Restart(RDirectScreenAccess::TTerminationReasons aReason);
private:
	CProcess* iThread;
	TRect iAnimRect;
	TBool iExpectedToAbort;	
	TDirectThreadParam iThreadParam;
	RSemaphore iSem;
	};

/*CPanicDirect*/
 class CPanicDirect : public CBase
 	{
 public:
	static TInt DoTestOnNewScheduler(TInt aInt, TAny* aPtr);
	static TInt DoTestOnNewSchedulerL(TInt aInt, TAny* aPtr);
 private:
 	inline CPanicDirect() {}
 	~CPanicDirect();
 	void ConstructL(TInt aScreenNumber, TInt aInt);
	static void DoTestNowL(TInt aInt, TAny* aPtr);
 	void TestL();
 	void DoDrawingL();
private:
	TInt iTestNo;
	RWsSession iWs;
	CWsScreenDevice* iWsScrDev;
	RWindowGroup iGroup;
	RBlankWindow iBlankWin;
	RDirectScreenAccess iDirect;
	TRequestStatus iDirectStatus;
	RRegion* iRegion;
	RTimer iTimer;
	TRequestStatus iTimerStatus;
	TBool iDrawingAllowed;
	CFbsScreenDevice* iScreenDevice;
	CFbsBitGc* iGc;
	TDisplayMode iDisplayMode;
	CScrollingTextDrawer* iTextDraw;
	TInt iCount;
	TInt iScreenNumber;
	};

class CTDirectStep : public CTGraphicsStep
	{
public:
	CTDirectStep();
protected:
	//from CTGraphicsStep
	virtual CTGraphicsBase* CreateTestL();
	};

_LIT(KTDirectStep,"TDirect");


#endif