Fix def files so that the implementation agnostic interface definition has no non-standards defined entry points, and change the eglrefimpl specific implementation to place its private entry points high up in the ordinal order space in the implementation region, not the standards based entrypoints region.
// 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:
// Keyboard repeat test
//
//
#include <e32std.h>
#include <e32svr.h>
#include "W32STD.H"
#include "../tlib/testbase.h"
#include "TMAN.H"
class CRKWindow;
class TKRepeatTest : public CTestBase
{
public:
TKRepeatTest();
~TKRepeatTest();
TestState DoTestL();
void ConstructL();
void TestKeyboardRepeatRateL(const TTimeIntervalMicroSeconds32 &aInitialTime, const TTimeIntervalMicroSeconds32 &aTime);
TBool CheckReportL();
public:
TBool iAbort;
private:
TTimeIntervalMicroSeconds32 iOldInitialTime;
TTimeIntervalMicroSeconds32 iOldTime;
CRKWindow *iWin;
TSize iWinSize;
TInt iState;
};
class CRKWindow : public CTWin
{
enum TRKStates {
EStateWaitingForKeyDown,
EStateWaitingForKeyCode,
EStateWaitingForFirstRepeat,
EStateWaitingForNthRepeat,
EStateWaitingForKeyUp,
EStateInactive,
EStateError,
};
public:
CRKWindow(TKRepeatTest *aTest);
void SetUpL(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc);
void SetState(TRKStates aState);
void SetKeyboardRepeatRate(const TTimeIntervalMicroSeconds32 &aInitialTime, const TTimeIntervalMicroSeconds32 &aTime);
void WinKeyL(const TKeyEvent &,const TTime &);
void KeyUpL(const TKeyEvent &aKey,const TTime &aTime);
void KeyDownL(const TKeyEvent &aKey,const TTime &aTime);
void Draw();
TDesC& Report();
TBool CheckResults();
protected:
TInt iConnIndex;
TKRepeatTest *iTest;
TRgb iBack;
TRKStates iState;
TInt iDownCode;
TInt iRepCount;
TTimeIntervalMicroSeconds32 iInitialRepeatSet;
TTimeIntervalMicroSeconds32 iRepeatSet;
TTime iPrevTime;
TTimeIntervalMicroSeconds32 iInitialGap;
TTimeIntervalMicroSeconds32 iTotalGap;
TTimeIntervalMicroSeconds32 iMinGap;
TTimeIntervalMicroSeconds32 iMaxGap;
TBuf<0x40> iReport;
};
GLDEF_C CTestBase *CreateKRepeatTest()
{
return(new(ELeave) TKRepeatTest());
}
//
// CRKWindow, class //
//
CRKWindow::CRKWindow(TKRepeatTest *aTest) : CTWin(), iTest(aTest)
{
}
void CRKWindow::SetUpL(TPoint pos,TSize size,CTWinBase *parent, CWindowGc &aGc)
{
ConstructExtLD(*parent,pos,size);
iWin.SetBackgroundColor(TRgb::Gray256(230));
Activate();
AssignGC(aGc);
}
void CRKWindow::Draw()
{
iGc->Clear();
switch(iState)
{
case EStateWaitingForKeyDown:
iGc->DrawText(_L("Press and hold the space bar"), TPoint(10,20));
break;
case EStateWaitingForFirstRepeat:
case EStateWaitingForNthRepeat:
{
TBuf<0x40> buf;
buf.Format(TRefByValue<const TDesC>(_L("Keep space bar down (%d repeats so far)")),iRepCount);
iGc->DrawText(buf, TPoint(10,20));
}
break;
case EStateWaitingForKeyUp:
iGc->DrawText(_L("Release space bar"), TPoint(10,20));
default:
break;
}
}
void CRKWindow::SetState(TRKStates aState)
{
iState=aState;
DrawNow();
}
TBool CRKWindow::CheckResults()
{
//
// Checks repeat results, first convert everything to 10th's as that what is actually used
// for the timer in the window server.
//
// Return ETrue if the inacuracy in the average time is greater than 1/10th either way
// Allow initial 2/10ths either
// Allow min 2/10ths below
// Allow max 2/10ths above
//
if (iState!=EStateInactive)
return(ETrue);
TInt initial=iInitialGap.Int()/100000;
TInt initialX=iInitialRepeatSet.Int()/100000;
if (initialX==0)
initialX=1;
TInt average=(iTotalGap.Int()/100000)/(iRepCount-1);
TInt repeatX=iRepeatSet.Int()/100000;
if (repeatX==0)
repeatX=1;
TInt min=iMinGap.Int()/100000;
TInt max=iMaxGap.Int()/100000;
if (average>(repeatX+1) || average<(repeatX-1))
return(ETrue);
if (initial>(initialX+2) || initial<(initialX-2))
return(ETrue);
if (min>(repeatX+1) || min<(repeatX-2))
return(ETrue);
if (max>(repeatX+3) || max<repeatX)
return(ETrue);
return(EFalse);
}
TDesC& CRKWindow::Report()
{
if (iState!=EStateInactive)
{
iReport.Format(_L("Error, test not completed"));
}
else
{
TInt initial=iInitialGap.Int()/10000;
TInt initialX=iInitialRepeatSet.Int()/10000;
TInt average=(iTotalGap.Int()/10000/(iRepCount-1));
TInt repeatX=iRepeatSet.Int()/10000;
TInt min=iMinGap.Int()/10000;
TInt max=iMaxGap.Int()/10000;
iReport.Format(TRefByValue<const TDesC>(_L("Initial=%d [%d], Av=%d [%d], Min=%d, Max=%d")),initial,initialX,average,repeatX,min,max);
}
return(iReport);
}
void CRKWindow::KeyDownL(const TKeyEvent &aKey,const TTime &)
{
switch(iState)
{
case EStateWaitingForKeyDown:
SetState(EStateWaitingForKeyCode);
iDownCode=aKey.iScanCode;
break;
default:;
}
}
void CRKWindow::KeyUpL(const TKeyEvent &aKey,const TTime &)
{
if (aKey.iScanCode==iDownCode)
{
switch(iState)
{
case EStateWaitingForKeyUp:
SetState(EStateInactive);
break;
default:
SetState(EStateError);
break;
}
CActiveScheduler::Stop();
}
}
void CRKWindow::WinKeyL(const TKeyEvent &aKey,const TTime &aTime)
{
if (aKey.iCode==EKeyEscape)
{
CActiveScheduler::Stop();
iTest->iAbort=ETrue;
}
if (aKey.iCode==32)
{
switch(iState)
{
case EStateWaitingForKeyCode:
SetState(EStateWaitingForFirstRepeat);
iPrevTime=aTime;
break;
case EStateWaitingForFirstRepeat:
iRepCount=1;
iInitialGap = I64LOW(aTime.MicroSecondsFrom(iPrevTime).Int64());
SetState(EStateWaitingForNthRepeat);
break;
case EStateWaitingForNthRepeat:
if (iRepCount==5)
SetState(EStateWaitingForKeyUp);
else
{
TTimeIntervalMicroSeconds32 gap(I64LOW(aTime.MicroSecondsFrom(iPrevTime).Int64()));
if (gap<iMinGap)
iMinGap=gap;
if (gap>iMaxGap)
iMaxGap=gap;
iTotalGap=iTotalGap.Int()+gap.Int(); // Horrible way to do a +=
iRepCount++;
SetState(EStateWaitingForNthRepeat);
}
case EStateWaitingForKeyUp: // Do nothing here
break;
default:
iTest->TestL(EFalse);
}
iPrevTime=aTime;
}
}
void CRKWindow::SetKeyboardRepeatRate(const TTimeIntervalMicroSeconds32 &aInitialTime, const TTimeIntervalMicroSeconds32 &aTime)
{
iInitialRepeatSet=aInitialTime;
iRepeatSet=aTime;
iMinGap=TTimeIntervalMicroSeconds32(100000000); // Any very big number will do
iMaxGap=TTimeIntervalMicroSeconds32(0);
iTotalGap=TTimeIntervalMicroSeconds32(0);
SetState(EStateWaitingForKeyDown);
Client()->iWs.Flush();
}
//
TKRepeatTest::TKRepeatTest() : CTestBase(_L("KRepeat"))
{}
TKRepeatTest::~TKRepeatTest()
{
CTWin::Delete(iWin);
Client()->iWs.SetKeyboardRepeatRate(iOldInitialTime, iOldTime);
}
void TKRepeatTest::ConstructL()
{
iWin=new(ELeave) CRKWindow(this);
TSize screenSize=Client()->iGroup->Size();
iWin->SetUpL(TPoint(5,5),TSize(screenSize.iWidth/2,screenSize.iHeight-10),Client()->iGroup,*Client()->iGc);
Client()->iGroup->SetCurrentWindow(iWin);
Client()->iWs.GetKeyboardRepeatRate(iOldInitialTime, iOldTime);
}
TInt TKRepeatTest::CheckReportL()
{
if (iWin->CheckResults())
{
CTDialog *dialog=new(ELeave) CTDialog();
dialog->SetTitle(_L("Keyboard repeat innacuracies"));
dialog->SetLine1(iWin->Report());
dialog->SetNumButtons(2);
dialog->SetButtonText(0,_L("Okay"));
dialog->SetButtonText(1,_L("Retest"));
dialog->SetButtonText(2,_L("Fail"));
dialog->ConstructLD(*Client()->iGroup,*Client()->iGc);
switch(dialog->Display())
{
case 0:
break;
case 1:
return(ETrue); // Redo test
case 2:
TestL(EFalse);
break;
}
}
return(EFalse);
}
void TKRepeatTest::TestKeyboardRepeatRateL(const TTimeIntervalMicroSeconds32 &aInitialTime, const TTimeIntervalMicroSeconds32 &aTime)
{
do
{
Client()->iWs.SetKeyboardRepeatRate(aInitialTime, aTime);
iWin->SetKeyboardRepeatRate(aInitialTime, aTime);
CActiveScheduler::Start();
if (iAbort)
AbortL();
} while(CheckReportL());
}
TestState TKRepeatTest::DoTestL()
{
switch(iState)
{
case 0:
LogSubTest(_L("Keyboard Repeat"),1);
TestKeyboardRepeatRateL(TTimeIntervalMicroSeconds32(1000000), TTimeIntervalMicroSeconds32(500000));
LogSubTest(_L("Keyboard Repeat"),2);
TestKeyboardRepeatRateL(TTimeIntervalMicroSeconds32(200000), TTimeIntervalMicroSeconds32(100000));
LogSubTest(_L("Keyboard Repeat"),3);
TestKeyboardRepeatRateL(TTimeIntervalMicroSeconds32(0), TTimeIntervalMicroSeconds32(100000));
LogSubTest(_L("Keyboard Repeat"),4);
TestKeyboardRepeatRateL(TTimeIntervalMicroSeconds32(100000), TTimeIntervalMicroSeconds32(100000));
iState++;
break;
default:
return(EFinished);
}
return(ENext);
}