19682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall//  INCLUDES
29682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <aknapp.h>
39682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <aknappui.h>
49682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <eikdoc.h>
59682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <sdlepocapi.h>
69682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <bautils.h>
79682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <eikstart.h>
89682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <badesca.h>
99682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <bautils.h>
109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <apgcli.h>
119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <sdlmain.h>
129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <eikedwin.h>
139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <eiklabel.h>
149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <sdlexe.rsg>
159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <aknglobalmsgquery.h>
169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <apgwgnam.h>
179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall//  FORWARD DECLARATIONS
219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallclass CApaDocument;
229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall//const TUid KSDLUID = { 0xF01F605E };
259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallLOCAL_C void MakeCCmdLineL(const TDesC8& aParam, CDesC8Array& aArray)
279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    const TChar dq('\"');
309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    TLex8 lex(aParam);
329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    TBool in = EFalse;
339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    lex.SkipSpaceAndMark();
359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    while(!lex.Eos())
379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        {
389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        TPtrC8 ptr;
399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        if(in)
409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            {
419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            const TPtrC8 rem = lex.RemainderFromMark();
429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            const TInt pos = rem.Locate(dq);
439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            if(pos > 0)
449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                {
459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                lex.Inc(pos);
469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                ptr.Set(lex.MarkedToken());
479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                lex.SkipAndMark(1);
489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                }
499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            else
509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                {
519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                ptr.Set(rem);
529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                }
539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            in = EFalse;
549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            }
559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        else
569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            {
579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            ptr.Set(lex.NextToken());
589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            const TInt pos = ptr.Locate(dq);
599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            if(pos == 0)
609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                {
619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                lex.UnGetToMark();
629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                lex.SkipAndMark(1);
639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                in = ETrue;
649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                continue; // back to in brace
659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                }
669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            else
679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                lex.SkipSpaceAndMark();
689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            }
699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        aArray.AppendL(ptr);
719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        }
739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallNONSHARABLE_CLASS(TVirtualCursor) : public MOverlay
769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	public:
789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		TVirtualCursor();
799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		void Set(const TRect& aRect, CFbsBitmap* aBmp, CFbsBitmap* aAlpha);
809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		void Move(TInt aX, TInt aY);
819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		void MakeEvent(TWsEvent& aEvent, const TPoint& aBasePos) const;
829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		void Toggle();
839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		TBool IsOn() const;
849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	private:
859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	void Draw(CBitmapContext& aGc, const TRect& aTargetRect, const TSize& aSize);
869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	private:
879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		TRect iRect;
889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		TPoint iInc;
899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		TPoint iPos;
909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		TBool iIsOn;
919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		CFbsBitmap* iCBmp;
929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		CFbsBitmap* iAlpha;
939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	};
949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTVirtualCursor::TVirtualCursor() :  iInc(0, 0), iIsOn(EFalse), iCBmp(NULL)
979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallconst TInt KMaxMove = 10;
1019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid TVirtualCursor::Move(TInt aX, TInt aY)
1039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
1049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(aX > 0 && iInc.iX > 0)
1059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			++iInc.iX;
1069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	else if(aX < 0 && iInc.iX < 0)
1079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			--iInc.iX;
1089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	else
1099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		iInc.iX = aX;
1109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(aY > 0 && iInc.iY > 0)
1129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			++iInc.iY;
1139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	else if(aY < 0 && iInc.iY < 0)
1149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			--iInc.iY;
1159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	else
1169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			iInc.iY = aY;
1179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iInc.iX = Min(KMaxMove, iInc.iX);
1199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iInc.iX = Max(-KMaxMove, iInc.iX);
1219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iInc.iY = Min(KMaxMove, iInc.iY);
1239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iInc.iY =Max(-KMaxMove, iInc.iY);
1259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TPoint pos = iPos + iInc;
1279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(iRect.Contains(pos))
1289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
1299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		iPos = pos;
1309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
1319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	else
1329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
1339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		iInc = TPoint(0, 0);
1349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
1359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
1369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid TVirtualCursor::Toggle()
1399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
1409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iIsOn = !iIsOn;
1419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
1429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTBool TVirtualCursor::IsOn() const
1459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
1469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return iIsOn;
1479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
1489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid TVirtualCursor::Set(const TRect& aRect, CFbsBitmap* aBmp, CFbsBitmap* aAlpha)
1509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
1519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iRect = aRect;
1529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iCBmp = aBmp;
1539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iAlpha = aAlpha;
1549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
1559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid TVirtualCursor::MakeEvent(TWsEvent& aEvent, const TPoint& aBasePos) const
1589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
1599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	aEvent.SetType(EEventPointer),
1609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	aEvent.SetTimeNow();
1619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TPointerEvent& pointer = *aEvent.Pointer();
1629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	pointer.iType = TPointerEvent::EButton1Down;
1639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	pointer.iPosition = iPos;
1649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	pointer.iParentPosition = aBasePos;
1659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
1669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid TVirtualCursor::Draw(CBitmapContext& aGc, const TRect& /*aTargetRect*/, const TSize& /*aSize*/)
1699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
1709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(iIsOn && iCBmp != NULL)
1719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
1729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		const TRect rect(TPoint(0, 0), iCBmp->SizeInPixels());
1739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		aGc.AlphaBlendBitmaps(iPos, iCBmp, rect, iAlpha, TPoint(0, 0));
1749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
1759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
1779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallNONSHARABLE_CLASS(TSdlClass)
1799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
1809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	public:
1819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		TSdlClass();
1829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		void SetMain(const TMainFunc& aFunc, TInt aFlags, MSDLMainObs* aObs, TInt aExeFlags);
1839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		TInt SdlFlags() const;
1849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		const TMainFunc& Main() const;
1859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		void SendEvent(TInt aEvent, TInt aParam, CSDL* aSDL);
1869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		TInt AppFlags() const;
1879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		void AppFlags(TInt aFlags);
1889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	private:
1899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		TMainFunc iFunc;
1909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		TInt iSdlFlags;
1919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		TInt iExeFlags;
1929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		MSDLMainObs* iObs;
1939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	};
1949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid TSdlClass::AppFlags(TInt aFlags)
1979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
1989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iExeFlags |= aFlags;
1999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
2009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid TSdlClass::SendEvent(TInt aEvent, TInt aParam, CSDL* aSDL)
2029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
2039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(iObs != NULL)
2049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		iObs->SDLMainEvent(aEvent, aParam, aSDL);
2059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
2069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTInt TSdlClass::AppFlags() const
2089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
2099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return iExeFlags;
2109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
2119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid TSdlClass::SetMain(const TMainFunc& aFunc, TInt aFlags, MSDLMainObs* aObs, TInt aExeFlags)
2139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
2149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iFunc = aFunc;
2159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iSdlFlags = aFlags;
2169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iExeFlags = aExeFlags;
2179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iObs = aObs;
2189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
2199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallconst TMainFunc& TSdlClass::Main() const
2219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
2229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return iFunc;
2239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
2249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TInt TSdlClass::SdlFlags() const
2279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	{
2289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	return iSdlFlags;
2299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	}
2309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTSdlClass::TSdlClass()
2349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
2359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	Mem::FillZ(this, sizeof(this));
2369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
2379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTSdlClass gSDLClass;
2399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall////////////////////////////////////////////////////////////////
2429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallNONSHARABLE_CLASS(CSDLApplication) : public CAknApplication
2449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
2459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    public:
2469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	CSDLApplication();
2479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    private:
2489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        CApaDocument* CreateDocumentL();
2499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        TFileName ResourceFileName() const;
2509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        TUid AppDllUid() const;
2519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall      		void FindMeL();
2529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall     		TUid iUid;
2539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    };
2549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallNONSHARABLE_CLASS(CSDLDocument)  : public CEikDocument
2569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
2579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    public:
2589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        CSDLDocument(CEikApplication& aApp);
2599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall     private:
2609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall     	CEikAppUi* CreateAppUiL();
2619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall     };
2639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall ////////////////////////////////////////////////////////////////////
2659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallNONSHARABLE_CLASS(MExitWait)
2689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	{
2699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	public:
2709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 		virtual void DoExit(TInt aErr) = 0;
2719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	};
2729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/////////////////////////////////////////////////////////////////////////
2749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallNONSHARABLE_CLASS(CExitWait) : public CActive
2769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	{
2779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	public:
2789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 		CExitWait(MExitWait& aWait);
2799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 		~CExitWait();
2809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	private:
2819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 		void RunL();
2829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 		void DoCancel();
2839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	private:
2849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 		MExitWait& iWait;
2859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 		TRequestStatus* iStatusPtr;
2869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	};
2879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall////////////////////////////////////////////////////////////////////////
2899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallNONSHARABLE_CLASS(CSDLWin) : public CCoeControl
2929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
2939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	public:
2949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		void ConstructL(const TRect& aRect);
2959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		RWindow& GetWindow() const;
2969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		void SetNoDraw();
2979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	private:
2989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		void Draw(const TRect& aRect) const;
2999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	private:
3009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		TBool iNoDraw;
3019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	};
3029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall////////////////////////////////////////////////////////////////////////////
3059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallNONSHARABLE_CLASS(CSDLAppUi) : public CAknAppUi, public MExitWait, MSDLObserver
3079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
3089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	public:
3099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		~CSDLAppUi();
3109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall   	private: // New functions
3119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 		void ConstructL();
3129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall   	void HandleCommandL(TInt aCommand);
3139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 		void HandleWsEventL(const TWsEvent& aEvent, CCoeControl* aDestination);
3149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 		void HandleResourceChangeL(TInt aType);
3159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall   		void DoExit(TInt aErr);
3179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall   		TInt SdlEvent(TInt aEvent, TInt aParam);
3199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	TInt SdlThreadEvent(TInt aEvent, TInt aParam);
3209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	void StartL();
3229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	static TBool StartL(TAny* aThis);
3239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	TBool ParamEditorL(TDes& aCheat);
3259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	TBool ProcessCommandParametersL(CApaCommandLine &aCommandLine);
3279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	void PrepareToExit();
3299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	void HandleConsoleWindowL();
3309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	void HandleConsoleWindow();
3319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	void HandleForegroundEventL(TBool aForeground);
3329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	static TBool IdleRequestL(TAny* aThis);
3349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	TBool HandleKeyL(const TWsEvent& aEvent);
3369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	private:
3399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		CExitWait* iWait;
3409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		CSDLWin* iSDLWin;
3419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		CSDL* iSdl;
3429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		CIdle* iStarter;
3439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		TBool iExitRequest;
3449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		CDesC8Array* iParams;
3459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		TInt iResOffset;
3469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		CIdle* iIdle;
3479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		TInt iStdOut;
3489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		TVirtualCursor iCursor;
3499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		CFbsBitmap*	iCBmp;
3509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		CFbsBitmap*	iAlpha;
3519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	//	TTime iLastPress;
3529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	//	CSDL::TOrientationMode iOrientation;
3539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	};
3549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall////////////////////////////////////////////////////////////////////////////////////////7
3569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCApaDocument* CSDLApplication::CreateDocumentL()
3589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
3599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return new (ELeave) CSDLDocument(*this);
3609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
3619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTUid CSDLApplication::AppDllUid() const
3639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
3649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return iUid;
3659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
3669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCSDLApplication::CSDLApplication()
3699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
3709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TRAPD(err, FindMeL());
3719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	ASSERT(err == KErrNone);
3729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
3739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CSDLApplication::FindMeL()
3759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
3769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	RApaLsSession apa;
3779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	User::LeaveIfError(apa.Connect());
3789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	CleanupClosePushL(apa);
3799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	User::LeaveIfError(apa.GetAllApps());
3809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TFileName name = RProcess().FileName();
3819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TApaAppInfo info;
3829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	while(apa.GetNextApp(info) == KErrNone)
3839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
3849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		if(info.iFullName.CompareF(name) == 0)
3859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			{
3869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			iUid = info.iUid;
3879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			break;
3889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			}
3899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
3909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	CleanupStack::PopAndDestroy();
3919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
3929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTFileName CSDLApplication::ResourceFileName() const
3949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
3959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return KNullDesC();
3969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
3979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall///////////////////////////////////////////////////////////////////////////////////////////
3999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCExitWait::CExitWait(MExitWait& aWait) : CActive(CActive::EPriorityStandard), iWait(aWait)
4019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
4029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	CActiveScheduler::Add(this);
4039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	SetActive();
4049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iStatusPtr = &iStatus;
4059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
4069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCExitWait::~CExitWait()
4089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
4099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	Cancel();
4109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
4119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CExitWait::RunL()
4139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
4149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(iStatusPtr != NULL )
4159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		iWait.DoExit(iStatus.Int());
4169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
4179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CExitWait::DoCancel()
4199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
4209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(iStatusPtr != NULL )
4219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		User::RequestComplete(iStatusPtr , KErrCancel);
4229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
4239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall//////////////////////////////////////////////////////////////////////////////////////////////
4269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCSDLDocument::CSDLDocument(CEikApplication& aApp) : CEikDocument(aApp)
4289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{}
4299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCEikAppUi* CSDLDocument::CreateAppUiL()
4319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
4329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return new (ELeave) CSDLAppUi;
4339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
4349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall///////////////////////////////////////////////////////////////////////////
4369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CSDLWin:: ConstructL(const TRect& aRect)
4389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
4399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	CreateWindowL();
4409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	SetRect(aRect);
4419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	ActivateL();
4429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
4439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallRWindow& CSDLWin::GetWindow() const
4469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
4479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return Window();
4489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
4499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CSDLWin::Draw(const TRect& /*aRect*/) const
4529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
4539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(!iNoDraw)
4549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
4559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		CWindowGc& gc = SystemGc();
4569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		gc.SetPenStyle(CGraphicsContext::ESolidPen);
4579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		gc.SetPenColor(KRgbGray);
4589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
4599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		gc.SetBrushColor(0xaaaaaa);
4609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		gc.DrawRect(Rect());
4619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
4629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
4639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CSDLWin::SetNoDraw()
4659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
4669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iNoDraw = ETrue;
4679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
4689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/////////////////////////////////////////////////////////////////////////
4709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCSDLAppUi::~CSDLAppUi()
4729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
4739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(iIdle)
4749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		iIdle->Cancel();
4759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	delete iIdle;
4769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(iStarter != NULL)
4779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		iStarter->Cancel();
4789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	delete iStarter;
4799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	delete iWait;
4809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	delete iSdl;
4819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	delete iSDLWin;
4829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	delete iParams;
4839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	delete iCBmp;
4849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	delete iAlpha;
4859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
4869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CSDLAppUi::ConstructL()
4899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	{
4909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	BaseConstructL(ENoAppResourceFile | ENoScreenFurniture);
4919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	RLibrary lib;
4949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	User::LeaveIfError(lib.Load(_L("sdlexe.dll")));
4959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	TFileName name = lib.FileName();
4969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	lib.Close();
4979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	name.Replace(3, name.Length() - 3, _L("resource\\apps\\sdlexe.rsc"));
4989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	BaflUtils::NearestLanguageFile(iEikonEnv->FsSession(), name);
4999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	iResOffset = iCoeEnv->AddResourceFileL(name);
5009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	name.Replace(name.Length() - 3, 3, _L("mbm"));
5029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TEntry e;
5049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TInt err = iEikonEnv->FsSession().Entry(name, e);
5059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iCBmp = iEikonEnv->CreateBitmapL(name, 0);
5079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iAlpha = iEikonEnv->CreateBitmapL(name, 1);
5089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	iIdle = CIdle::NewL(CActive::EPriorityIdle);
5109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	iSDLWin = new (ELeave) CSDLWin;
5129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	iSDLWin->ConstructL(ApplicationRect());
5139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	iSdl = CSDL::NewL(gSDLClass.SdlFlags());
5159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	gSDLClass.SendEvent(MSDLMainObs::ESDLCreated, 0, iSdl);
5179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	iSdl->SetObserver(this);
5199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	iSdl->DisableKeyBlocking(*this);
5209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	iSdl->SetContainerWindowL(
5219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 					iSDLWin->GetWindow(),
5229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        			iEikonEnv->WsSession(),
5239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        			*iEikonEnv->ScreenDevice());
5249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    iSdl->AppendOverlay(iCursor, 0);
5259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    iCursor.Set(TRect(TPoint(0, 0), iSDLWin->Size()), iCBmp, iAlpha);
5279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    iStarter = CIdle::NewL(CActive::EPriorityLow);
5299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    iStarter->Start(TCallBack(StartL, this));
5309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	}
5339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTBool CSDLAppUi::StartL(TAny* aThis)
5379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
5389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	static_cast<CSDLAppUi*>(aThis)->StartL();
5399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return EFalse;
5409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
5419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CSDLAppUi::PrepareToExit()
5449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
5459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	CAknAppUiBase::PrepareToExit(); //aknappu::PrepareToExit crashes
5469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iCoeEnv->DeleteResourceFile(iResOffset);
5479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
5489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTBool CSDLAppUi::ProcessCommandParametersL(CApaCommandLine &aCommandLine)
5509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
5519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TPtrC8 cmdLine = aCommandLine.TailEnd();
5529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iParams = new (ELeave) CDesC8ArrayFlat(8);
5539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	MakeCCmdLineL(cmdLine, *iParams);
5549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return EFalse;
5559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
5569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TBool CSDLAppUi::ParamEditorL(TDes& aCheat)
5599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
5609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	CAknTextQueryDialog* query = CAknTextQueryDialog::NewL(aCheat);
5619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	CleanupStack::PushL(query);
5629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	query->SetPromptL(_L("Enter parameters"));
5639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	CleanupStack::Pop();
5649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return query->ExecuteLD(R_PARAMEDITOR);
5659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
5669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall void CSDLAppUi::StartL()
5689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	{
5699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	if(gSDLClass.AppFlags() & SDLEnv::EParamQuery)
5709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 		{
5719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 		TBuf8<256> cmd;
5729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 		RFile file;
5739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 		TInt err = file.Open(iEikonEnv->FsSession(), _L("sdl_param.txt"),EFileRead);
5749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 		if(err == KErrNone)
5759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 			{
5769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 			file.Read(cmd);
5779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 			file.Close();
5789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 			MakeCCmdLineL(cmd, *iParams);
5799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 			}
5809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 		if(err != KErrNone || gSDLClass.AppFlags() & (SDLEnv::EParamQueryDialog ^ SDLEnv::EParamQuery))
5819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 			{
5829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 			TBuf<256> buffer;
5839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 			if(ParamEditorL(buffer))
5849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 				{
5859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 				cmd.Copy(buffer);
5869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 				MakeCCmdLineL(cmd, *iParams);
5879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 				}
5889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 			}
5899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 		}
5909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	iWait = new (ELeave) CExitWait(*this);
5919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	iSdl->CallMainL(gSDLClass.Main(), &iWait->iStatus, iParams, CSDL::ENoParamFlags, 0xA000);
5929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	}
5939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CSDLAppUi::HandleCommandL(TInt aCommand)
5959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
5969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	switch(aCommand)
5979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
5989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		case EAknSoftkeyBack:
5999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 		case EAknSoftkeyExit:
6009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		case EAknCmdExit:
6019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		case EEikCmdExit:
6029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			gSDLClass.AppFlags(SDLEnv::EAllowConsoleView);
6039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		    if(iWait == NULL || !iWait->IsActive() || iSdl == NULL)
6049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		    	{
6059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		    	Exit();
6069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		    	}
6079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			  else if(!iExitRequest)
6089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			  	{
6099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			  	iExitRequest = ETrue; //trick how SDL can be closed!
6109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			  	iSdl->Suspend();
6119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			  	}
6129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			break;
6139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
6149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
6159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTBool CSDLAppUi::HandleKeyL(const TWsEvent& aEvent)
6199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
6209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TInt type = aEvent.Type();
6219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(!(type == EEventKey || type == EEventKeyUp || type == EEventKeyDown))
6229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 			{
6239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 			return ETrue;
6249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 			}
6259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	const TKeyEvent& key = *aEvent.Key();
6269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if((key.iScanCode == EStdKeyYes) && (gSDLClass.AppFlags() & SDLEnv::EVirtualMouse))
6279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 		{
6289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 		if(type == EEventKeyUp)
6299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 			{
6309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 			iCursor.Toggle();
6319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 			iSdl->RedrawRequest();
6329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 			}
6339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 		return EFalse;
6349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
6359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(iCursor.IsOn())
6369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
6379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		switch(key.iScanCode)
6389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			{
6399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			case EStdKeyUpArrow:
6409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall				iCursor.Move(0, -1);
6419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall				break;
6429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			case EStdKeyDownArrow:
6439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall				iCursor.Move(0, 1);
6449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall				break;
6459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			case EStdKeyLeftArrow:
6469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall				iCursor.Move(-1, 0);
6479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall				break;
6489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			case EStdKeyRightArrow:
6499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall				iCursor.Move(1, 0);
6509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall				break;
6519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			case EStdKeyDevice3:
6529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall				if(type == EEventKeyUp)
6539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall					{
6549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall					TWsEvent event;
6559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall					iCursor.MakeEvent(event, iSDLWin->Position());
6569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall					iSdl->AppendWsEvent(event);
6579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall					}
6589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall				return EFalse;
6599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			default:
6609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall				return ETrue;
6619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			}
6629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		iSdl->RedrawRequest();
6639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		return EFalse;
6649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
6659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return ETrue;
6669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
6679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall void CSDLAppUi::HandleWsEventL(const TWsEvent& aEvent, CCoeControl* aDestination)
6699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	{
6709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	if(iSdl && iWait && HandleKeyL(aEvent))
6719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 		iSdl->AppendWsEvent(aEvent);
6729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	CAknAppUi::HandleWsEventL(aEvent, aDestination);
6739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	}
6749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall void CSDLAppUi::HandleResourceChangeL(TInt aType)
6769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	{
6779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    CAknAppUi::HandleResourceChangeL(aType);
6789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if(aType == KEikDynamicLayoutVariantSwitch)
6799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        {
6809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        iSDLWin->SetRect(ApplicationRect());
6819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall      	iSdl->SetContainerWindowL(
6829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall      				iSDLWin->GetWindow(),
6839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        			iEikonEnv->WsSession(),
6849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        			*iEikonEnv->ScreenDevice());
6859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        }
6869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	}
6879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CSDLAppUi::DoExit(TInt/*Err*/)
6909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall   	{
6919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall   	iExitRequest = ETrue;
6929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall   	Exit();
6939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall   	}
6949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TInt CSDLAppUi::SdlThreadEvent(TInt aEvent, TInt /*aParam*/)
6979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
6989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	switch(aEvent)
6999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
7009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		case MSDLObserver::EEventResume:
7019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			break;
7029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		case MSDLObserver::EEventSuspend:
7039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			if(iExitRequest)
7049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall				return MSDLObserver::ESuspendNoSuspend;
7059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			break;
7069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		case MSDLObserver::EEventWindowReserved:
7079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			break;
7089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		case MSDLObserver::EEventWindowNotAvailable:
7099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			break;
7109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		case MSDLObserver::EEventScreenSizeChanged:
7119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            break;
7129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
7139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return MSDLObserver::EParameterNone;
7149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
7159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTInt CSDLAppUi::SdlEvent(TInt aEvent, TInt /*aParam*/)
7179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
7189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	switch(aEvent)
7199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
7209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		case MSDLObserver::EEventResume:
7219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			break;
7229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		case MSDLObserver::EEventSuspend:
7239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			if(iExitRequest)
7249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall				return MSDLObserver::ESuspendNoSuspend;
7259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			break;
7269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		case MSDLObserver::EEventWindowReserved:
7279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			break;
7289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		case MSDLObserver::EEventWindowNotAvailable:
7299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			{
7309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			TRAP_IGNORE(HandleConsoleWindowL());
7319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			}
7329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			break;
7339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		case MSDLObserver::EEventScreenSizeChanged:
7349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall     		break;
7359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		case MSDLObserver::EEventKeyMapInit:
7369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			break;
7379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		case MSDLObserver::EEventMainExit:
7389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			if(iStdOut != 0)
7399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall				{
7409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall				gSDLClass.AppFlags(SDLEnv::EAllowConsoleView);
7419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall				iEikonEnv->WsSession().SetWindowGroupOrdinalPosition(iStdOut, 0);
7429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall				}
7439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			break;
7449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
7459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return MSDLObserver::EParameterNone;
7469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
7479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CSDLAppUi::HandleForegroundEventL(TBool aForeground)
7499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
7509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	CAknAppUi::HandleForegroundEventL(aForeground);
7519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(!aForeground)
7529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		HandleConsoleWindow();
7539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
7549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CSDLAppUi::HandleConsoleWindow()
7569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
7579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(!iIdle->IsActive())
7589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		iIdle->Start(TCallBack(IdleRequestL, this));
7599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
7609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTBool CSDLAppUi::IdleRequestL(TAny* aThis)
7629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
7639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	static_cast<CSDLAppUi*>(aThis)->HandleConsoleWindowL();
7649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return EFalse;
7659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
7669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CSDLAppUi::HandleConsoleWindowL()
7689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
7699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(gSDLClass.AppFlags() & SDLEnv::EAllowConsoleView)
7709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
7719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		return;
7729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
7739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	RWsSession& ses = iEikonEnv->WsSession();
7749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TInt focus = ses.GetFocusWindowGroup();
7759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	CApaWindowGroupName* name = CApaWindowGroupName::NewLC(ses, focus);
7769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TPtrC caption = name->Caption();
7779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(0 == caption.CompareF(_L("STDOUT")))
7789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
7799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		iStdOut = focus;
7809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		ses.SetWindowGroupOrdinalPosition(iEikonEnv->RootWin().Identifier(), 0);
7819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
7829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	CleanupStack::PopAndDestroy(); //name
7839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
7849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall////////////////////////////////////////////////////////////////////////
7879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCApaApplication* NewApplication()
7909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
7919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return new CSDLApplication();
7929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
7939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallEXPORT_C TInt SDLEnv::SetMain(const TMainFunc& aFunc, TInt aSdlFlags, MSDLMainObs* aObs, TInt aSdlExeFlags)
7969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
7979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	gSDLClass.SetMain(aFunc, aSdlFlags, aObs, aSdlExeFlags);
7989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall  	return EikStart::RunApplication(NewApplication);
7999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
8009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall//////////////////////////////////////////////////////////////////////
8029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTInt SDLUiPrint(const TDesC8& /*aInfo*/)
8049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
8059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return KErrNotFound;
8069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
8079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
810