diff -r 000000000000 -r 5d03bc08d59c windowing/windowserver/test/SHELL.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/windowing/windowserver/test/SHELL.CPP Tue Feb 02 01:47:50 2010 +0200 @@ -0,0 +1,1551 @@ +// Copyright (c) 1995-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: +// Shell to launch test code +// +// + +#include +#include +#include "W32STD.H" +#include "../SERVER/w32cmd.h" +#include +#include +#include "../tlib/testbase.h" +#include "../TClick/CLICK.H" + +#define __USING_PROCESS_ + +#if !defined(__USING_PROCESS_) +#define RP_FILENAME_SET _L(".DLL") +#endif + +#define THE_PASSWORD _L("pass") +#define INDEX_FOR_SHELL_TEST 0 +#define SHELL_TEST_NAME _L("ShellTest") +#define INDEX_FOR_RESTART_TEST 1 +#define RESTART_TEST_NAME _L("RestartTest") +#define INDEX_FOR_RESTART_EVENT_TEST 2 +#define RESTART_EVENT_TEST_NAME _L("RestartEventTest") + +const TInt EDoubleClickTime=500000; +const TInt EDoubleClickDistance=16; + +#ifndef __USING_PROCESS_ +LOCAL_D const TUint KHeapSize=0x400000; +#endif + +enum TShellPanic + { + EShellPanicRunningProcessCancel, + EShellPanicTemp, + EShellPanicRunningProcessNullPtr, + EShellPanicPassword, + }; + +typedef TInt (*DllTestAppEntryPoint)(TAny *aParam); + +class CShellClient; + +class RShellWsSession : public RWsSession + { +public: + static void Shutdown(); + void SendShutdown(); + }; + +class MProcessObserver + { +public: + virtual void ProcessDied()=0; + }; + +class CRunningProcess : public CActive + { +public: + CRunningProcess(MProcessObserver* aObserver); + ~CRunningProcess(); + void ConstructL(const TDesC& aName); + void ConstructTestExecuteL(const TDesC &aName); + void Link(CRunningProcess** aRpPtr); +#if defined(__USING_PROCESS_) + inline RProcess& Process() {return iProcess;} +#else + inline RThread& Process() {return iProcess;} +#endif +private: + virtual void DoCancel(); + virtual void RunL(); +private: +#if defined(__WINS__) + RLibrary iLib; +#endif +#if defined(__USING_PROCESS_) + RProcess iProcess; +#else + RThread iProcess; +#endif + CRunningProcess* iNext; + CRunningProcess** iPrevPtr; + TParse iFileName; + MProcessObserver* iObserver; + }; + +class CShellErrorDialog : public CTDialog + { +public: + CShellErrorDialog(CTWindowGroup *aGroupWin,CWindowGc *aGc); + void ButtonPressL(TInt aButton); + void ConstructLD(); +private: + CTWindowGroup *iGroupWin; + CWindowGc *iGc; + }; + +class CTCalibWindow : public CTWin + { +public: + CTCalibWindow(); + void InitWin(); + void DrawPoint(const TPoint &aPoint, const TDesC &aText); + void Draw(); + void PointerL(const TPointerEvent &aPointer,const TTime& aTime); +private: + TInt iCount; + TDigitizerCalibration iCalibPoints; + TDigitizerCalibration iReturnValues; + }; + + +class CListWindow : public CTTitledWindow + { +public: + CListWindow(); + void CloseWindow(); + void ConstructL(CTWinBase &parent, TBool aExitOnEscape); + void Draw(); + virtual void SelectedL(TInt aIndex)=0; + virtual void WinKeyL(const TKeyEvent &aKey,const TTime& aTime); + void SetExt(const TPoint &aPos, const TSize &aSize); + void SetSize(const TSize &); +protected: + virtual TPtrC GetText(TInt aLine)=0; + virtual TInt ListCount()=0; + void SetSize(); + void PointerL(const TPointerEvent &aPointer,const TTime& aTime); +private: + void Resized(const TSize &aSize); + void SetListPos(TInt aNewPos); + TInt TextRowHeight() const; + void RowBox(TRect &aRect, TInt aRow) const; +private: + TRgb iColorMap[4]; + TInt iListPos; + TTime iPrevTime; + TBool iExitOnEscape; + }; + +class CShellWindow : public CListWindow, public MProcessObserver + { +public: + CShellWindow(); + ~CShellWindow(); + void ConstructL(CTWinBase &parent); + TBool RunClientL(const TDesC &aName,TBool aTestExecute); + void SelectedL(TInt aIndex); + virtual void WinKeyL(const TKeyEvent &aKey,const TTime& aTime); + void ForegroundAppDialogL(); + void HeapCountDialogL(); + void SetPointerZone(TInt aZone); + void SetAutoLaunch(TBool aAutoLaunch); + // Virtual function defined in CTBaseWin and overriden in CListWindow + void PointerL(const TPointerEvent &aPointer,const TTime& aTime); + // Virtual function defined in CTBaseWin and overriden in CTTitledWindow + void FocusChanged(TBool aState); +private: + void DoShellTests(); + void BugHunt(); + void CheckTerminate(); + //Pure virtual functions defined in CListWindow + TPtrC GetText(TInt aLine); + TInt ListCount(); + //Pure virtual function defined in MProcessObserver + void ProcessDied(); + //Simulates SwitchOffEvent + void SimulateSwitchOffEvent(); +#ifdef SYMBIAN_PROCESS_MONITORING_AND_STARTUP + //Simulates RestartSystemEvent + void SimulateRestartEvent(); + //Simulates RestartSystemEvent and test the receiving of off event + void SimulateAndReceiveRestartEvent(); +#endif + +private: + TBool iFailModeEnabled; + TInt iPointerZone; + CRunningProcess *iProcessList; + CArrayFixFlat iFileNames; + CTPointerCursor *iPointerCursor; + RSoundPlugIn iClick; + TInt iCaptureKey; + TBool iAutoLaunch; + TInt iNumWindowGroups; + TBool iIsFocused; + }; + +class CTIconWindow : public CTBlankWindow + { +public: + CTIconWindow(TInt aType); + void InitWinL(); + void SetExtentL(); +private: + TInt iType; + }; + +class CTPasswordWindow: public CTTitledWindow + { +public: + CTPasswordWindow(); + void InitWin(); + void Draw(); +private: + TPoint iTextPos; + }; + +class CTaskListWindow : public CListWindow + { +public: + CTaskListWindow(); + void ConstructL(CTWinBase &parent); + void SelectedL(TInt aIndex); +private: + virtual TPtrC GetText(TInt aLine); + virtual TInt ListCount(); +private: + CArrayFixFlat iWindowHandles; + CArrayFixFlat iWindowThreadNames; + TBuf iLatestText; + }; + +class CShellWindowGroup : public CTWindowGroup + { +public: + CShellWindowGroup(CTClient *aClient); + ~CShellWindowGroup(); + void ConstructL(); + void KeyL(const TKeyEvent &aKey,const TTime& aTime); + void ErrorMessage(const TWsErrorMessage &aErrorMessage, const TTime &); + void ScreenDeviceChangedL(); +private: + TUint32 iCapHandle1; + TUint32 iCapHandle2; + TUint32 iCapHandle3; + TUint32 iCapHandle4; + }; + +class CIconWindowGroup : public CTWindowGroup + { +public: + CIconWindowGroup(CTClient *aClient); + void ConstructL(); + }; + +class CPasswordWindowGroup : public CTWindowGroup + { +public: + CPasswordWindowGroup(CTClient *aClient); + ~CPasswordWindowGroup(); + void ConstructL(); + void KeyL(const TKeyEvent &aKey,const TTime&aTime); + void Cancel(); + void PasswordL(const TTime &aTime); +private: + CTPasswordWindow *iWin; + TBool iPasswordMode; + }; + +class CShellClient : public CTClient + { +public: + CShellClient(); + ~CShellClient(); + void ConstructL(); + void KeyL(const TKeyEvent &aKey,const TTime& aTime); + void Exit(); + void CreateTestWindowL(CTWin *aWin, const TPoint &aPos); + void CreateTestWindowL(CTWin *win, const TPoint &aPos, CTWinBase *parent); + void ErrorDialog(const TDesC &aTitle, TInt aErr); + void ScreenDeviceChangedL(); +public: + RFs iFs; +private: + TInt iNum; + CTWindowGroup *iIconGroup; + CTIconWindow *iIconWin1; + CTIconWindow *iIconWin2; + CTPointerCursor *iPointerCursor; + CPasswordWindowGroup *iPasswordGroup; + }; + +class ROverrideProtectionInRSessionBase : public RWsSession + { +public: + inline TInt Send(TInt aFunction) const {return(RSessionBase::Send(aFunction,TIpcArgs()));}; + }; + +const TInt Xmove=8; +const TInt Ymove=6; + +const TInt ENumPointerCursors=2; + +void DrawShellDragCursor(CBitmapContext *aGc,TInt , const TSize &aSize, TBool aDoMask, TAny *aParam); +void DrawShellListCursor(CBitmapContext *aGc,TInt , const TSize &aSize, TBool aDoMask, TAny *aParam); + +TSpriteCreateParams spriteParams1(TSize(32,32),TPoint(-16,-16),DrawShellListCursor,NULL,EFalse,CGraphicsContext::EDrawModeXOR); +TSpriteCreateParams spriteParams2(TSize(32,32),TPoint(-16,-16),DrawShellDragCursor,NULL,ETrue,CGraphicsContext::EDrawModePEN); + +TSpriteCreateParams *PointerParams[ENumPointerCursors]={&spriteParams1,&spriteParams2}; + + +void Panic(TInt aPanic) + { + User::Panic(_L("Shell"),aPanic); + } + +void RShellWsSession::Shutdown() + { + RShellWsSession ShellSession; + ShellSession.Connect(); + ShellSession.SendShutdown(); + } + +void RShellWsSession::SendShutdown() + { + SendReceive(EWservMessShutdown,TIpcArgs(EWservShutdownCheck)); + } + +// +// Sprite drawing functions // +// + +void DrawPointerCursor(CBitmapContext *aGc,TInt , const TSize &aSize, TBool aDoMask, TAny *) + { + aGc->SetBrushColor(TRgb::Gray4(aDoMask ? 0 : 2)); + aGc->SetBrushStyle(CGraphicsContext::ESolidBrush); + aGc->SetPenStyle(CGraphicsContext::ENullPen); + aGc->DrawRect(TRect(aSize)); + aGc->SetPenStyle(CGraphicsContext::ESolidPen); + aGc->SetPenColor(TRgb::Gray4(3)); + aGc->SetBrushColor(TRgb::Gray4(3)); + aGc->DrawRect(TRect(0,aSize.iHeight/2-1,aSize.iWidth,aSize.iHeight/2+2)); + aGc->DrawRect(TRect(aSize.iWidth/2-1,0,aSize.iWidth/2+2,aSize.iHeight)); + if (!aDoMask) + { + aGc->SetPenColor(TRgb::Gray4(0)); + aGc->DrawLine(TPoint(0,aSize.iHeight/2),TPoint(aSize.iWidth,aSize.iHeight/2)); + aGc->DrawLine(TPoint(aSize.iWidth/2,0),TPoint(aSize.iWidth/2,aSize.iHeight)); + } + } + +void DrawShellDragCursor(CBitmapContext *aGc,TInt , const TSize &aSize, TBool aDoMask, TAny *) + { + aGc->SetBrushColor(TRgb::Gray4(aDoMask ? 0 : 2)); + aGc->SetBrushStyle(CGraphicsContext::ESolidBrush); + aGc->SetPenStyle(CGraphicsContext::ENullPen); + aGc->DrawRect(TRect(aSize)); + aGc->SetPenStyle(CGraphicsContext::ESolidPen); + aGc->SetPenColor(TRgb::Gray4(aDoMask ? 3 : 1)); + for(TInt y=0;yDrawLine(TPoint(xfact,y),TPoint(aSize.iWidth-xfact,y)); + } + } + +void DrawShellListCursor(CBitmapContext *aGc,TInt , const TSize &aSize, TBool , TAny *) + { + aGc->SetBrushColor(TRgb::Gray4(0)); + aGc->SetBrushStyle(CGraphicsContext::ESolidBrush); + aGc->SetPenStyle(CGraphicsContext::ENullPen); + aGc->DrawRect(TRect(aSize)); + aGc->SetBrushColor(TRgb::Gray4(3)); + aGc->DrawRect(TRect(0,aSize.iHeight/2-1,aSize.iWidth,aSize.iHeight/2+2)); + aGc->DrawRect(TRect(aSize.iWidth/2-1,0,aSize.iWidth/2+2,aSize.iHeight)); + } + +// +// Calibration window // +// + +CTCalibWindow::CTCalibWindow() + { + } + +void CTCalibWindow::InitWin() + { + UserHal::CalibrationPoints(iCalibPoints); + AssignGC(*Client()->iGc); + iWin.SetOrdinalPosition(0,1); + iWin.Activate(); + } + +void CTCalibWindow::DrawPoint(const TPoint &aPoint, const TDesC &aText) + { + iGc->MoveTo(aPoint); + iGc->MoveBy(TPoint(0,-20)); + iGc->DrawLineBy(TPoint(0,40)); + iGc->MoveBy(TPoint(-20,-20)); + iGc->DrawLineBy(TPoint(40,0)); + iGc->DrawText(aText, aPoint+TPoint(4,-4)); + } + +void CTCalibWindow::Draw() + { + iGc->Clear(); + DrawPoint(iCalibPoints.iTl,_L("1")); + DrawPoint(iCalibPoints.iBl,_L("2")); + DrawPoint(iCalibPoints.iTr,_L("3")); + DrawPoint(iCalibPoints.iBr,_L("4")); + } + +void CTCalibWindow::PointerL(const TPointerEvent &aPointer,const TTime& ) + { + if (aPointer.iType==TPointerEvent::EButton1Down) + { + switch(iCount++) + { + case 0: + iReturnValues.iTl=aPointer.iPosition; + break; + case 1: + iReturnValues.iBl=aPointer.iPosition; + break; + case 2: + iReturnValues.iTr=aPointer.iPosition; + break; + case 3: + iReturnValues.iBr=aPointer.iPosition; + UserHal::SetXYInputCalibration(iReturnValues); + delete this; + break; + } + } + } + +// +// Error dialog // +// + +CShellErrorDialog::CShellErrorDialog(CTWindowGroup *aGroupWin,CWindowGc *aGc) : CTDialog(), + iGroupWin(aGroupWin), + iGc(aGc) + { + } + +void CShellErrorDialog::ButtonPressL(TInt aButton) + { + if (aButton==0) + CTDialog::ButtonPressL(aButton); + } + +void CShellErrorDialog::ConstructLD() + { + CTDialog::ConstructLD(*iGroupWin, *iGc); + } + +// +// Offscreen icon->button window // +// + +CTIconWindow::CTIconWindow(TInt aType) : iType(aType) + { + } + +void CTIconWindow::InitWinL() + { + SetExtentL(); + iWin.SetShadowDisabled(ETrue); + Activate(); + } + +void CTIconWindow::SetExtentL() + { + enum {ENumYKeys=5}; + enum {ENumXKeys=9}; + TRect digRect(Client()->iScreen->PointerRect()); + TSize scrSize(Client()->iScreen->SizeInPixels()); + TInt ypos=0; + TInt count=0; + iWin.RemoveAllKeyRects(); + if (iType==0) + { + for (;count err; + err.Format(TRefByValue(_L("Error %d")),aErr); + DisplayDialog(this, aTitle, err,_L("")); + } + +CListWindow::CListWindow() : CTTitledWindow(), iPrevTime(0) + { + iColorMap[0]=TRgb::Gray4(0); + iColorMap[1]=TRgb::Gray4(3); + iColorMap[2]=TRgb::Gray4(3); + iColorMap[3]=TRgb::Gray4(0); + } + +void CListWindow::CloseWindow() + { + CTClient *client=((CShellClient *)Client()); + CTWin::Delete(this); + client->ResetFocus(); + } + +void CListWindow::SetExt(const TPoint &aPos, const TSize &) + { + SetPos(aPos); + } + +void CListWindow::SetSize(const TSize &) + { + } + +void CListWindow::SetSize() + { + iSize.iHeight=ListCount()*(iFont->HeightInPixels()+1)+iTitleHeight+2; + iSize.iWidth=iFont->TextWidthInPixels(*Client()->Title())+30; + for(TInt index=0;indexTextWidthInPixels(GetText(index)); + if (wid>iSize.iWidth) + iSize.iWidth=wid; + } + iSize.iWidth+=4; + iWin.SetSize(iSize); + Resized(iSize); + } + +void CListWindow::ConstructL(CTWinBase &parent, TBool aExitOnEscape) + { + iExitOnEscape=aExitOnEscape; + CTTitledWindow::ConstructL(parent); + } + +void CListWindow::SetListPos(TInt aNewPos) + { + if (aNewPos>=0 && aNewPosHeightInPixels()+1); + } + +void CListWindow::RowBox(TRect &aRect, TInt aRow) const + { + aRect.iTl.iX=2; + aRect.iTl.iY=iTitleHeight+TextRowHeight()*aRow; + aRect.iBr.iX=iSize.iWidth-2; + aRect.iBr.iY=aRect.iTl.iY+TextRowHeight(); + } + +void CListWindow::Draw() + { + CTTitledWindow::Draw(); + iGc->SetPenColor(TRgb::Gray16(0)); + TPoint pos(2,iTitleHeight+iFont->AscentInPixels()+2); + TInt gap=TextRowHeight(); + for(TInt index=0;indexDrawText(GetText(index), pos); + if (index==iListPos) + { + TRect rect; + RowBox(rect,index); + iGc->MapColors(rect,iColorMap); + } + } + } + +void CListWindow::Resized(const TSize &aSize) + { + SetDragRect(TRect(0,0,aSize.iWidth,iTitleHeight)); + } + +// +// CShellWindow class // +// + +CShellWindow::CShellWindow() : CListWindow(), iFileNames(4) + { + } + +CShellWindow::~CShellWindow() + { + if (iCaptureKey) + Client()->iGroup->GroupWin()->CancelCaptureKey(iCaptureKey); + delete iPointerCursor; + while(iProcessList) + delete iProcessList; + } + +void CShellWindow::SetPointerZone(TInt aZone) + { + TRAPD(err,iPointerCursor->UpdateL(0, PointerParams[aZone])); + if (err!=KErrNone) + ((CShellClient *)Client())->ErrorDialog(_L("Error Changing Pointer"), err); + else + iPointerZone=aZone; + } + +void CShellWindow::SetAutoLaunch(TBool aAutoLaunch) + { + iAutoLaunch=aAutoLaunch; + if (aAutoLaunch) + iNumWindowGroups=Client()->iWs.NumWindowGroups(); + } + +void CShellWindow::PointerL(const TPointerEvent &aPointer,const TTime& aTime) + { + TInt zone=(aPointer.iPosition.iYiFs,dllListFileName.FullName(),EFileShareReadersOnly|EFileStreamText)); +#else + User::LeaveIfError(dllList.Open(((CShellClient *)Client())->iFs,_L("Z:\\SYSTEM\\DATA\\DLL_LIST.TXT"),EFileShareReadersOnly|EFileStreamText)); +#endif + TBuf8<0x200> dllNames; + User::LeaveIfError(dllList.Read(dllNames)); + dllList.Close(); + TPtrC8 name(dllNames); + FOREVER + { + TInt pos=name.Locate('\r'); + if (pos==KErrNotFound) + break; + if (pos<=KMaxFileName) + { + TFileName buf; + buf.Copy(name.Left(pos)); + iFileNames.AppendL(buf); + } + name.Set(name.Mid(pos+2)); + }; + SetSize(); + BaseWin()->PointerFilter(EPointerFilterMove|EPointerFilterDrag,0); + iPointerCursor=new(ELeave) CTPointerCursor(Client()->iWs); + iPointerCursor->ConstructL(0); + SetPointerZone(0); + iWin.SetCustomPointerCursor(iPointerCursor->PointerCursor()); + iClick=RSoundPlugIn(Client()->iWs); + User::LeaveIfError(iClick.Construct(TUid::Uid(CLICK_THIRD_UID))); + TBool isChangeAble; + if (iClick.IsLoaded(isChangeAble)) + { + TInt ret=Client()->iGroup->GroupWin()->CaptureKey(3,EModifierCtrl|EModifierShift|EModifierFunc + ,EModifierCtrl|EModifierShift|EModifierFunc); //Ctrl-Alt-Shift-C + User::LeaveIfError(ret); + iCaptureKey=ret; + } + } + +TBool CShellWindow::RunClientL(const TDesC &aName,TBool aTestExecute) + { + if (aName.Length()!=0) + { + CRunningProcess* rp=new(ELeave) CRunningProcess(this); + rp->Link(&iProcessList); + CActiveScheduler::Add(rp); + TInt err=KErrNone; //To stop a warning + if (aTestExecute) + { + TRAP(err,rp->ConstructTestExecuteL(aName)); + } + else + { + TRAP(err,rp->ConstructL(aName)); + } + if (err!=KErrNone) + { + delete rp; + User::Leave(err); + } + return ETrue; + } + return EFalse; + } + +void CShellWindow::SelectedL(TInt aIndex) + { + TPtrC name=GetText(aIndex); + if (aIndex==INDEX_FOR_SHELL_TEST && name==SHELL_TEST_NAME) + { + DoShellTests(); + return; + } +#ifdef SYMBIAN_PROCESS_MONITORING_AND_STARTUP + else if (aIndex==INDEX_FOR_RESTART_TEST && name==RESTART_TEST_NAME) + { + SimulateRestartEvent(); + return; + } + else if (aIndex==INDEX_FOR_RESTART_EVENT_TEST && name==RESTART_EVENT_TEST_NAME) + { + SimulateAndReceiveRestartEvent(); + return; + } +#endif + TRAPD(err,RunClientL(GetText(aIndex),EFalse)); + if (err==KErrNotFound) + { + TRAP(err,RunClientL(GetText(aIndex),ETrue)); + } + if (err!=KErrNone) + ((CShellClient *)Client())->ErrorDialog(_L("Error launching process"), err); + } + +TPtrC CShellWindow::GetText(TInt aLine) + { + return(TPtrC(iFileNames[aLine])); + } + +TInt CShellWindow::ListCount() + { + return(iFileNames.Count()); + } + +void CShellWindow::ForegroundAppDialogL() + { + TInt focusGroup; + TName winName; + TThreadId threadId; + User::LeaveIfError(focusGroup=Client()->iWs.GetFocusWindowGroup()); + User::LeaveIfError(Client()->iWs.GetWindowGroupClientThreadId(focusGroup, threadId)); + User::LeaveIfError(Client()->iWs.GetWindowGroupNameFromIdentifier(focusGroup,winName)); + RThread thread; + User::LeaveIfError(thread.Open(threadId)); + CShellErrorDialog *dialog=new(ELeave) CShellErrorDialog(Client()->iGroup, iGc); + dialog->ConstructLD(); + dialog->SetTitle(_L("The Foreground App Is")); + dialog->SetLine1(thread.FullName()); + thread.Close(); + dialog->SetLine2(winName); + dialog->SetNumButtons(1); + dialog->SetButtonText(0,_L("Okay")); + if (dialog->Display()!=0) + Panic(0); + dialog=NULL; + } + +void CShellWindow::HeapCountDialogL() + { + CShellErrorDialog *dialog=new(ELeave) CShellErrorDialog(Client()->iGroup, iGc); + dialog->ConstructLD(); + dialog->SetTitle(_L("Wserv Heap Count")); + TBuf<0x20> line1; + line1.Format(TRefByValue(_L("Count=%d")),Client()->iWs.HeapCount()); + dialog->SetLine1(line1); + dialog->SetNumButtons(1); + dialog->SetButtonText(0,_L("Okay")); + if (dialog->Display()!=0) + Panic(0); + dialog=NULL; + } + +void CShellWindow::WinKeyL(const TKeyEvent &aKey,const TTime& aTime) + { + TBool funcKeyPressed=aKey.iModifiers&EModifierFunc; + if (aKey.iModifiers&EModifierCtrl) + { + switch(aKey.iCode) + { + case EKeyLeftArrow: + { + TInt col=Client()->iWs.GetBackgroundColor().Gray16(); + if (col>0) + Client()->iWs.SetBackgroundColor(TRgb::Gray16(col-1)); + } + break; + case EKeyRightArrow: + { + TInt col=Client()->iWs.GetBackgroundColor().Gray16(); + if (col<15) + Client()->iWs.SetBackgroundColor(TRgb::Gray16(col+1)); + } + break; + case EKeyTab: + if (funcKeyPressed) + ForegroundAppDialogL(); + else + { + Group()->GroupWin()->SetOrdinalPosition(0); + ((CShellClient *)Client())->CreateTestWindowL(new(ELeave) CTaskListWindow(), TPoint(50,30)); + Client()->ResetFocus(); + } + break; + case 1: //Ctrl-A + case 17: //Ctrl-Q + SetPos(TPoint(3,(Client()->iScreen->SizeInPixels().iHeight-Size().iHeight)/2)); + break; + case 2: //Ctrl-B + case 23: //Ctrl-W + SetPos(TPoint((Client()->iScreen->SizeInPixels().iWidth-Size().iWidth)/2,(Client()->iScreen->SizeInPixels().iHeight-Size().iHeight)/2)); + break; + case 3: //Ctrl-C + case 5: //Ctrl-E + if (funcKeyPressed && aKey.iModifiers&EModifierShift && aKey.iCode==3) //Ctrl-Alt-Sh-C + iClick.CommandReply(EClickCommandToggleOutput,TPtrC8(NULL,0)); + else + SetPos(TPoint(Client()->iScreen->SizeInPixels().iWidth-Size().iWidth-3,(Client()->iScreen->SizeInPixels().iHeight-Size().iHeight)/2)); + break; + case 18: //Ctrl-R + { + CWsScreenDevice* screen=Client()->iScreen; + TPixelsAndRotation sizeAndRotation; + screen->GetScreenModeSizeAndRotation(0,sizeAndRotation); + Client()->iWs.SetPointerCursorArea(0,TRect(sizeAndRotation.iPixelSize)); + screen->SetCurrentRotations(0,CFbsBitGc::EGraphicsOrientationNormal); + screen->SetScreenMode(0); + CArrayFixFlat *rotations=new(ELeave) CArrayFixFlat(1); + CleanupStack::PushL(rotations); + TInt numModes=screen->NumScreenModes(); + TInt ii,err; + for (ii=1;iiGetRotationsList(ii,rotations); + if (err==KErrNone) + screen->SetCurrentRotations(ii,REINTERPRET_CAST(CFbsBitGc::TGraphicsOrientation&,(*rotations)[0])); + } + CleanupStack::PopAndDestroy(); + } + break; + default: + goto not_used; + } + } + else if (funcKeyPressed) + { + switch(aKey.iCode) + { + case 'c': + { + CTCalibWindow *win=new(ELeave) CTCalibWindow(); + win->ConstructL(*Client()->iGroup); + } + break; + case 's': // Sleep + User::After(2000000); + break; + case 'd': + DisplayDialog(_L("Dialog test"),_L("Line of text"),_L("")); + break; + case 'o': + UserHal::SwitchOff(); + break; + case 'f': + if (iFailModeEnabled) + ((CShellClient *)Client())->iWs.HeapSetFail(RHeap::ENone,0); + else + ((CShellClient *)Client())->iWs.HeapSetFail(RHeap::ERandom,20); + iFailModeEnabled=!iFailModeEnabled; + break; + case 'x': + case 'X': + if (aKey.iModifiers&EModifierShift) + RShellWsSession::Shutdown(); + else + ((CShellClient *)Client())->Exit(); + break; + case 'l': + Client()->iWs.LogMessage(_L("Hello, this is log test")); + break; + case 'h': + HeapCountDialogL(); + break; + case 'b': + BugHunt(); + break; + case EKeyLeftArrow: + AdjustSize(-Xmove,0,aKey.iModifiers); + break; + case EKeyRightArrow: + AdjustSize(Xmove,0,aKey.iModifiers); + break; + case EKeyUpArrow: + AdjustSize(0,-Ymove,aKey.iModifiers); + break; + case EKeyDownArrow: + AdjustSize(0,Ymove,aKey.iModifiers); + break; + default: + goto not_used; + } + } + else + goto not_used; + return; +not_used: + CListWindow::WinKeyL(aKey,aTime); + } + +void CShellWindow::FocusChanged(TBool aState) + { + CListWindow::FocusChanged(aState); + iIsFocused=aState; + CheckTerminate(); + } + +void CShellWindow::DoShellTests() +// +//Doing testing that can only be done from the shell +// + { + /*Group()->GroupWin()->EnableReceiptOfFocus(EFalse); + BaseWin()->SetSizeErr(TSize(160,220)); + Group()->GroupWin()->EnableReceiptOfFocus(ETrue); + */ + SimulateSwitchOffEvent(); + } + +/** +Sends the raw events to the current registered window session. +Since no Window Group is allowed to request the off events, +WServ shall handle these raw events. +*/ +void CShellWindow::SimulateSwitchOffEvent() + { + TRawEvent rawEvent; + rawEvent.Set(TRawEvent::ESwitchOff); + Client()->iWs.SimulateRawEvent(rawEvent); + Client()->iWs.Flush(); + } + +#ifdef SYMBIAN_PROCESS_MONITORING_AND_STARTUP +/** +@SYMTestCaseID GRAPHICS-WSERV-0404 +@SYMTestCaseDesc Restart system event can be successfully sent through WServ +@SYMPREQ PREQ1089 +@SYMREQ REQ6883 +@SYMTestStatus Implemented +@SYMTestPriority High +@SYMTestPurpose Test restart system event in WServ +@SYMTestActions The test code will simulate a 'restart event'. +@SYMTestExpectedResults The system should restart (manually observed). +*/ +void CShellWindow::SimulateRestartEvent() + { + TRawEvent rawEvent; + rawEvent.Set(TRawEvent::ERestartSystem); + Client()->iWs.SimulateRawEvent(rawEvent); + Client()->iWs.Flush(); + } + +/** +@SYMTestCaseID GRAPHICS-WSERV-0405 +@SYMTestCaseDesc Restart system event can be received by client that have registered for off event +@SYMPREQ PREQ1089 +@SYMREQ REQ6883 +@SYMTestStatus Implemented +@SYMTestPriority High +@SYMTestPurpose Test restart system event in WServ with off event handler +@SYMTestActions The test code will register for off event, simulate a 'restart event' and then receive the restart event +@SYMTestExpectedResults Verify that the restart event is received and the testPass dialog displayed for this test (manually observed). +*/ +void CShellWindow::SimulateAndReceiveRestartEvent() + { + const TInt KEventWaitTimer = 5000000; // 5 sec, The wait time that this test will wait for the restart event before declaring this test fail + TInt err = Client()->iWs.RequestOffEvents(ETrue, Client()->iGroup->GroupWin()); + if (err != KErrNone) + { + static_cast(Client())->ErrorDialog(_L("Failed to request off event"),err); + } + + TRawEvent rawEvent; + rawEvent.Set(TRawEvent::ERestartSystem); + Client()->iWs.SimulateRawEvent(rawEvent); + + TRequestStatus status; + Client()->iWs.EventReady(&status); + Client()->iWs.Flush(); + User::WaitForRequest(status); + + TWsEvent event; + RTimer timer; + timer.CreateLocal(); + TRequestStatus timerStatus; + timer.After(timerStatus,KEventWaitTimer); + TBool testPass=EFalse; + while (timerStatus != KErrNone) // wait for the restart event until timer expire + { + Client()->iWs.GetEvent(event); + if (event.Type() == EEventRestartSystem) + { + timer.Cancel(); + User::WaitForRequest(timerStatus); // to receive the cancel event + + testPass = ETrue; + _LIT(KTestPass,"TestPassed"); + TWindowTitle winTitle(KTestPass); + DisplayDialog(Client(), winTitle, _L("Received Restart Event"), KNullDesC); + break; + } + + // probably got pointer event above instead of restart event, so try getting the next event until we see retart event + Client()->iWs.EventReady(&status); + User::WaitForRequest(status, timerStatus); + } + + if (testPass == EFalse) + { + // timer expired before getting restart event + _LIT(KTestPass,"TestFailed"); + TWindowTitle winTitle(KTestPass); + DisplayDialog(Client(), winTitle, _L("Did not receive Restart Event"), KNullDesC); + } + + timer.Close(); + + Client()->iWs.RequestOffEvents(EFalse); + } + +#endif + +void CShellWindow::BugHunt() +// +// Attempt to reproduce messaging issue while program exiting with message outstanding +// + { + RThread().SetPriority(EPriorityRealTime); + ((ROverrideProtectionInRSessionBase *)&(Client()->iWs))->Send(1); + RThread().Kill(0); + } + +void CShellWindow::CheckTerminate() + { + if (iIsFocused && iAutoLaunch && iProcessList==NULL && iNumWindowGroups==Client()->iWs.NumWindowGroups()) + { +#if defined(__WINS__) + delete this; + RShellWsSession::Shutdown(); +#else + // on hardware for automated test purposes cause board to crash to + // indicate the completion of test run + User::SetCritical(User::ESystemCritical); + User::Panic(_L("test"), KErrGeneral); +#endif + } + } + +void CShellWindow::ProcessDied() + { + CheckTerminate(); + } + +// +// End of CShellWindow class // +// + +// +// CTaskListWindow class // +// + +CTaskListWindow::CTaskListWindow() : CListWindow(), iWindowHandles(4), iWindowThreadNames(4) + { + } + +void CTaskListWindow::ConstructL(CTWinBase &parent) + { + CListWindow::ConstructL(parent,ETrue); + User::LeaveIfError(Client()->iWs.WindowGroupList(0,&iWindowHandles)); + for(TInt index=0;indexiWs.GetWindowGroupClientThreadId(iWindowHandles[index],id); + RThread thread; + User::LeaveIfError(thread.Open(id)); + iWindowThreadNames.AppendL(thread.FullName()); + thread.Close(); + } + SetSize(); + } + +void CTaskListWindow::SelectedL(TInt aIndex) + { + Client()->iWs.SetWindowGroupOrdinalPosition(iWindowHandles[aIndex], 0); + CloseWindow(); + } + +TPtrC CTaskListWindow::GetText(TInt aLine) + { + iLatestText=iWindowThreadNames[aLine]; + iLatestText.Append(_L("::")); + TName winName; + if (Client()->iWs.GetWindowGroupNameFromIdentifier(iWindowHandles[aLine],winName)==KErrNone) + iLatestText.Append(winName); + return(iLatestText); + } + +TInt CTaskListWindow::ListCount() + { + return(iWindowHandles.Count()); + } +// +// End of CTaskListWindow class // +// + +CShellWindowGroup::CShellWindowGroup(CTClient *aClient) : CTWindowGroup(aClient) + { + } + +CShellWindowGroup::~CShellWindowGroup() + { + iGroupWin.CancelCaptureKey(iCapHandle1); + iGroupWin.CancelCaptureKey(iCapHandle2); + iGroupWin.CancelCaptureKey(iCapHandle3); + iGroupWin.CancelCaptureKey(iCapHandle4); + } + +void CShellWindowGroup::ConstructL() + { + CTWindowGroup::ConstructL(); + iCapHandle1=User::LeaveIfError(iGroupWin.CaptureKey(EKeyTab, EModifierCtrl|EModifierShift|EModifierPureKeycode,EModifierCtrl|EModifierShift|EModifierPureKeycode)); + iGroupWin.DefaultOwningWindow(); + iGroupWin.EnableErrorMessages(EEventControlOnlyWithKeyboardFocus); + iGroupWin.EnableScreenChangeEvents(); + } + +void CShellWindowGroup::KeyL(const TKeyEvent &aKey,const TTime& aTime) + { + if (iCurWin) + iCurWin->WinKeyL(aKey,aTime); + } + +void CShellWindowGroup::ErrorMessage(const TWsErrorMessage &aErrorMessage, const TTime &) + { + TBuf<0x40> errorText; + switch(aErrorMessage.iErrorCategory) + { + case TWsErrorMessage::EDrawingRegion: + { + _LIT(Graphics,"Graphics %d"); + errorText.Format(Graphics,aErrorMessage.iError); + } + break; + case TWsErrorMessage::EBackLight: + { + _LIT(Backlight,"Backlight %d"); + errorText.Format(Backlight,aErrorMessage.iError); + } + break; + case TWsErrorMessage::ELogging: + { + _LIT(Logging,"Error Starting Logging: %d, Location: %d"); + // minus the error value is stored in the bottom 8 bits + // an indication of position in the code, that the error occured in, is stored in the top 24 bits + TInt line=(aErrorMessage.iError)&0xFFFFFF00; + errorText.Format(Logging,line-aErrorMessage.iError,line>>8); + } + break; + case TWsErrorMessage::EContrast: + { + _LIT(Contrast,"Contrast %d"); + errorText.Format(Contrast,aErrorMessage.iError); + } + break; + default: + { + _LIT(Unknown,"Unknown %d"); + errorText.Format(Unknown,aErrorMessage.iError); + } + break; + } + _LIT(WservError,"Wserv error"); + TWindowTitle winTitle(WservError); + DisplayDialog(Client(), winTitle, errorText, KNullDesC); + } + +void CShellWindowGroup::ScreenDeviceChangedL() + { + TPixelsTwipsAndRotation sizeAndRotation; + Client()->iScreen->GetDefaultScreenSizeAndRotation(sizeAndRotation); + Client()->iScreen->SetScreenSizeAndRotation(sizeAndRotation); + ((CShellClient *)Client())->ScreenDeviceChangedL(); + } + +// + +CIconWindowGroup::CIconWindowGroup(CTClient *aClient) : CTWindowGroup(aClient) + { + } + +void CIconWindowGroup::ConstructL() + { + CTWindowGroup::ConstructL(); + iGroupWin.EnableReceiptOfFocus(EFalse); + iGroupWin.SetOrdinalPosition(0,100); + } + +// +// password window // +// + +CTPasswordWindow::CTPasswordWindow() + { + } + +void CTPasswordWindow::InitWin() + { + TInt wid=iFont->TextWidthInPixels(_L("Press Enter")); + iTextPos.iX=(iWin.Size().iWidth-wid)/2; + iTextPos.iY=(iWin.Size().iHeight)/2; + } + +void CTPasswordWindow::Draw() + { + CTTitledWindow::Draw(); + iGc->DrawText(_L("Press Enter"),iTextPos); + } + +// + +CPasswordWindowGroup::CPasswordWindowGroup(CTClient *aClient) : CTWindowGroup(aClient) + { + } + +CPasswordWindowGroup::~CPasswordWindowGroup() + { + delete iWin; + } + +void CPasswordWindowGroup::PasswordL(const TTime &) + { + __ASSERT_DEBUG(!iPasswordMode,Panic(EShellPanicPassword)); + iPasswordMode=ETrue; + iWin->SetTitle(_L("Password Mode Enabled")); + } + +void CPasswordWindowGroup::Cancel() + { + iPasswordMode=EFalse; + iWin->SetVisible(EFalse); + iGroupWin.SetOrdinalPosition(0,-1000); + iWin->SetTitle(_L("Why am I here?")); + } + +void CPasswordWindowGroup::KeyL(const TKeyEvent &aKey,const TTime&) + { + if (iPasswordMode && aKey.iCode==EKeyEnter) + { + Client()->iWs.PasswordEntered(); + Cancel(); + } + } + +void CPasswordWindowGroup::ConstructL() + { + CTWindowGroup::ConstructL(); + iGroupWin.SetOrdinalPosition(-1); + iWin=new(ELeave) CTPasswordWindow(); + iWin->ConstructL(*this); + iWin->AssignGC(*Client()->iGc); + Cancel(); + iWin->Win()->PasswordWindow(EPasswordAlwaysTriggerNow); + iWin->Activate(); + SetCurrentWindow(iWin); + } + +// + +CShellClient::CShellClient() + { + } + +void CShellClient::CreateTestWindowL(CTWin *aWin, const TPoint &aPos,CTWinBase *parent) + { + TRAPD(err,aWin->ConstructL(*parent)); + if (err!=KErrNone) + { + delete aWin; + User::Leave(err); + } + aWin->SetInitialPos(aPos); + aWin->Activate(); + aWin->AssignGC(*iGc); + } + +void CShellClient::CreateTestWindowL(CTWin *aWin, const TPoint &aPos) + { + CreateTestWindowL(aWin, aPos, iGroup); + } + +CShellClient::~CShellClient() + { + delete iPointerCursor; + delete iIconWin1; + delete iIconWin2; + delete iIconGroup; + delete iPasswordGroup; + iWs.FreeSystemPointerCursorList(); + iFs.Close(); + } + + +void CShellClient::ConstructL() + { + User::LeaveIfError(iFs.Connect()); + CTClient::ConstructL(); + iWs.RequestOffEvents(EFalse); //To test this function + + TBool keyClicksSupported=EFalse; + HAL::Get(HALData::EKeyboardClick,keyClicksSupported); + if (keyClicksSupported) + { + HAL::Set(HALData::EKeyboardClickState,1); + TInt maxVol=1; + HAL::Get(HALData::EKeyboardClickVolumeMax,maxVol); + HAL::Set(HALData::EKeyboardClickVolume,maxVol); + } + + iWs.SetDoubleClick(TTimeIntervalMicroSeconds32(EDoubleClickTime), EDoubleClickDistance); + + User::LeaveIfError(iWs.SetHotKey(EHotKeyBacklightToggle, 2, EModifierFunc|EModifierCtrl|EModifierShift,EModifierFunc|EModifierCtrl|EModifierShift)); + User::LeaveIfError(iWs.SetHotKey(EHotKeyBacklightOn, 14, EModifierFunc|EModifierCtrl|EModifierShift,EModifierFunc|EModifierCtrl|EModifierShift)); + User::LeaveIfError(iWs.SetHotKey(EHotKeyBacklightOff, 13, EModifierFunc|EModifierCtrl|EModifierShift,EModifierFunc|EModifierCtrl|EModifierShift)); +// + iGroup=new(ELeave) CShellWindowGroup(this); + iGroup->ConstructL(); + iWs.RequestOffEvents(ETrue,iGroup->GroupWin()); //To test this function + iWs.RequestOffEvents(EFalse); + iIconGroup=new(ELeave) CIconWindowGroup(this); + iIconGroup->ConstructL(); + iIconWin1=new(ELeave) CTIconWindow(0); + iIconWin1->ConstructL(*iIconGroup); + iIconWin2=new(ELeave) CTIconWindow(1); + iIconWin2->ConstructL(*iIconGroup); + + CShellWindow *win=new(ELeave) CShellWindow(); + CreateTestWindowL(win, TPoint(330,10)); + TWinCommand command; + User::CommandLine(command); + win->SetAutoLaunch(win->RunClientL(command,EFalse)); + + iPointerCursor=new(ELeave) CTPointerCursor(iWs); + TSpriteCreateParams params(TSize(24,48),TPoint(-12,-24),DrawPointerCursor,NULL, ETrue,CGraphicsContext::EDrawModePEN); + iPointerCursor->ConstructL(1,¶ms,0); + iGroup->GroupWin()->SetCustomPointerCursor(iPointerCursor->PointerCursor()); + ResetFocus(); + } + +void CShellClient::ScreenDeviceChangedL() + { + iIconWin1->SetExtentL(); + iIconWin2->SetExtentL(); + } + +void CShellClient::Exit() + { + CActiveScheduler::Stop(); + } + +CRunningProcess::CRunningProcess(MProcessObserver* aObserver) : CActive(-5), iObserver(aObserver) + {} + +CRunningProcess::~CRunningProcess() + { + Cancel(); + if (iNext) + iNext->iPrevPtr=iPrevPtr; + *iPrevPtr=iNext; +#if defined(__WINS__) + iLib.Close(); +#endif +#if defined(__USING_PROCESS_) + iProcess.Close(); +#else + iProcess.Close(); +#endif + if (iObserver) + iObserver->ProcessDied(); + } + +void CRunningProcess::ConstructL(const TDesC &aName) + { +#if defined(__USING_PROCESS_) + TParse fileName; + fileName.Set(_L("E:\\.EXE"),&aName,NULL); + TInt error = iProcess.Create(fileName.FullName(),_L("")); + if(error != KErrNone) + { + fileName.Set(_L(""),&aName,NULL); + User::LeaveIfError(iProcess.Create(fileName.FullName(),_L(""))); + } +#else + User::LeaveIfError(iFileName.Set(RP_FILENAME_SET,&aName,NULL)); + User::LeaveIfError(iLib.Load(iFileName.FullName())); + DllTestAppEntryPoint libFunc=(DllTestAppEntryPoint)iLib.Lookup(1); + User::LeaveIfNull((TAny *)libFunc); + TBuf threadName; + TInt err; + TInt num=0; + do + { + threadName.Format(TRefByValue(_L("%S%02d")),&aName,num++); + err=iProcess.Create(threadName,libFunc,KDefaultStackSize,NULL,&iLib,NULL,KHeapSize,KHeapSize,EOwnerProcess); + } while(err==KErrAlreadyExists); + User::LeaveIfError(err); +#endif + iProcess.Logon(iStatus); + iProcess.Resume(); + SetActive(); + } + +void CRunningProcess::ConstructTestExecuteL(const TDesC &aName) + { + //testexecute z:\wstest\wstest_t_autotest.script + _LIT(KTestExecute,"testexecute"); + _LIT(KComandLinePrefix,"z:\\wstest\\wstest_t_"); + _LIT(KComandLinePostfix,"test.script"); +#if defined(__USING_PROCESS_) + TParse fileName; + fileName.Set(KNullDesC,&KTestExecute,NULL); + TBuf<128> commandLine; + commandLine.Append(KComandLinePrefix); + commandLine.Append(aName); + commandLine.Append(KComandLinePostfix); + User::LeaveIfError(iProcess.Create(fileName.FullName(),commandLine)); + iProcess.Logon(iStatus); + iProcess.Resume(); + SetActive(); +#endif + } + +void CRunningProcess::Link(CRunningProcess **aRpPtr) + { + iNext=*aRpPtr; + if (iNext) + iNext->iPrevPtr=&iNext; + *aRpPtr=this; + iPrevPtr=aRpPtr; + } + +void CRunningProcess::DoCancel() + { + iProcess.LogonCancel(iStatus); + } + +void CRunningProcess::RunL() + { + if (iStatus!=KErrNone) + { + TBuf<32> buf; + buf.Num(iStatus.Int()); + DisplayDialog(_L("Program exited with error"),iProcess.ExitCategory(),buf); + } + delete this; + } + +GLDEF_C CTClient *CreateClientL() + { + return(new(ELeave) CShellClient()); + } + +GLDEF_C TInt E32Main() + { + return(TestLibStartUp(CreateClientL)); + }