19682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/*
29682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    SDL_Main.cpp
39682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    Symbian OS services for SDL
49682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
59682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    Markus Mertama
69682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall*/
79682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
89682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
99682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include "epoc_sdl.h"
109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include"sdlepocapi.h"
129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <e32base.h>
139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <estlib.h>
149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <stdio.h>
159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <badesca.h>
169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include "vectorbuffer.h"
189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <w32std.h>
199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <aknappui.h>
209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <aknapp.h>
219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include "SDL_epocevents_c.h"
229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include "SDL_keysym.h"
239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include "dsa.h"
249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#ifdef SYMBIANC
279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#include <reent.h>
289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif
299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall//Markus Mertama
319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallextern SDLKey* KeyMap();
349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallextern void ResetKeyMap();
359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallclass CCurrentAppUi;
379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall//const TUid KSDLUid =  { 0xF01F3D69 };
399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallNONSHARABLE_CLASS(EnvUtils)
419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	public:
439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	static void DisableKeyBlocking();
449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	static TBool Rendezvous(RThread& aThread, TRequestStatus& aStatus);
459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	};
469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTInt Panic(TInt aErr, TInt aLine)
489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TBuf<64> b;
509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	b.Format(_L("Main at %d"), aLine);
519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	User::Panic(b, aErr);
529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return 0;
539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallNONSHARABLE_CLASS(CCurrentAppUi) : public CAknAppUi
579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	public:
599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	static CCurrentAppUi* Cast(CEikAppUi* aUi);
609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	void DisableKeyBlocking();
619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	};
629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCCurrentAppUi* CCurrentAppUi::Cast(CEikAppUi* aUi)
659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return static_cast<CCurrentAppUi*>(aUi);
679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CCurrentAppUi::DisableKeyBlocking()
709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	SetKeyBlockMode(ENoKeyBlock);
729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallclass CEventQueue : public CBase, public MEventQueue
769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    public:
789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        static CEventQueue* NewL();
799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        ~CEventQueue();
809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    public:
819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        TInt Append(const TWsEvent& aEvent);
829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall       	const TWsEvent& Shift();
839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall       	void Lock();
849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall       	void Unlock();
859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        TBool HasData();
869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    private:
879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        TVector<TWsEvent, 64> iVector;
889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        RCriticalSection iCS;
899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    };
909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall CEventQueue* CEventQueue::NewL()
929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    CEventQueue* q = new (ELeave) CEventQueue();
949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    CleanupStack::PushL(q);
959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    User::LeaveIfError(q->iCS.CreateLocal());
969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    CleanupStack::Pop();
979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return q;
989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCEventQueue::~CEventQueue()
1019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
1029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    iCS.Close();
1039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
1049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTInt CEventQueue::Append(const TWsEvent& aEvent)
1069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
1079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    iCS.Wait();
1089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall   	const TInt err = iVector.Append(aEvent);
1099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    iCS.Signal();
1109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return err;
1119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
1129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTBool CEventQueue::HasData()
1159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
1169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return iVector.Size() > 0;
1179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
1189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CEventQueue::Lock()
1219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
1229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    iCS.Wait();
1239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
1249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CEventQueue::Unlock()
1269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
1279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iCS.Signal();
1289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
1299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallconst TWsEvent& CEventQueue::Shift()
1319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
1329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    const TWsEvent& event =  iVector.Shift();
1339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return event;
1349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
1359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTSdlCleanupItem::TSdlCleanupItem(TSdlCleanupOperation aOperation, TAny* aItem) :
1389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HalliOperation(aOperation), iItem(aItem), iThread(RThread().Id())
1399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
1409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
1419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallclass CEikonEnv;
1439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallclass CSdlAppServ;
1449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallNONSHARABLE_CLASS(EpocSdlEnvData)
1479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
1489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    public:
1499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    void Free();
1509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    CEventQueue*            iEventQueue;
1519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    TMainFunc				iMain;
1529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    TInt            		iEpocEnvFlags;
1539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int                     iArgc;
1549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    char**                  iArgv;
1559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    CDsa*                   iDsa;
1569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    CSdlAppServ*            iAppSrv;
1579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    TThreadId               iId;
1589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    CArrayFix<TSdlCleanupItem>* iCleanupItems;
1599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    CEikAppUi*				iAppUi;
1609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    CSDL*					iSdl;
1619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    };
1629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallEpocSdlEnvData* gEpocEnv;
1659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#define MAINFUNC(x) EXPORT_C TMainFunc::TMainFunc(mainfunc##x aFunc){Mem::FillZ(iMainFunc, sizeof(iMainFunc)); iMainFunc[x - 1] = (void*) aFunc;}
1679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallMAINFUNC(1)
1699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallMAINFUNC(2)
1709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallMAINFUNC(3)
1719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallMAINFUNC(4)
1729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallMAINFUNC(5)
1739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallMAINFUNC(6)
1749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallEXPORT_C TMainFunc::TMainFunc()
1769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
1779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	Mem::FillZ(iMainFunc, sizeof(iMainFunc));
1789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
1799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallconst void* TMainFunc::operator[](TInt aIndex) const
1829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
1839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return iMainFunc[aIndex];
1849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
1859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallNONSHARABLE_CLASS(CSdlAppServ) : public CActive
1889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
1899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    public:
1909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        enum
1919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            {
1929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            EAppSrvNoop = CDsa::ELastDsaRequest,
1939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            EAppSrvWindowWidth,
1949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            EAppSrvWindowHeight,
1959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            EAppSrvWindowDisplayMode,
1969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            EAppSrvWindowPointerCursorMode,
1979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            EAppSrvDsaStatus,
1989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            EAppSrvStopThread,
1999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            EAppSrvWaitDsa
2009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            };
2019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        CSdlAppServ();
2029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        void ConstructL();
2039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        ~CSdlAppServ();
2049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        TInt Request(TInt aService);
2059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        TInt RequestValue(TInt aService);
2069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        void Init();
2079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        void PanicMain(TInt aReason);
2089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        void PanicMain(const TDesC& aInfo, TInt aReason);
2099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        void SetObserver(MSDLObserver* aObserver);
2109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        TInt ObserverEvent(TInt aEvent, TInt aParam);
2119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        void SetParam(TInt aParam);
2129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        void HandleObserverValue(TInt aService, TInt aReturnValue, TBool aMainThread);
2139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        MSDLObserver* Observer();
2149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    private:
2159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        void RunL();
2169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        void DoCancel();
2179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    private:
2189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        const TThreadId iMainId;
2199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        RThread iAppThread;
2209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        TInt iService;
2219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        TInt iReturnValue;
2229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        RSemaphore iSema;
2239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        MSDLObserver* iObserver;
2249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        TRequestStatus* iStatusPtr;
2259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    };
2269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallCSdlAppServ::CSdlAppServ() : CActive(CActive::EPriorityHigh), iMainId(RThread().Id())
2289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
2299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
2309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallMSDLObserver* CSdlAppServ::Observer()
2349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
2359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return iObserver;
2369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
2379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CSdlAppServ::SetObserver(MSDLObserver* aObserver)
2409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
2419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iObserver = aObserver;
2429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
2439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTInt CSdlAppServ::ObserverEvent(TInt aEvent, TInt aParam)
2459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
2469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(iObserver != NULL)
2479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
2489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		if(RThread().Id() == gEpocEnv->iId)
2499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			{
2509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			return iObserver->SdlThreadEvent(aEvent, aParam);
2519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			}
2529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		else if(RThread().Id() == iMainId)
2539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			{
2549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			return iObserver->SdlEvent(aEvent, aParam);
2559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			}
2569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		PANIC(KErrNotSupported);
2579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
2589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return 0;
2599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
2609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CSdlAppServ::PanicMain(TInt aReason)
2629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
2639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    iAppThread.Panic(RThread().Name(), aReason);
2649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
2659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CSdlAppServ::PanicMain(const TDesC& aInfo, TInt aReason)
2679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
2689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    iAppThread.Panic(aInfo, aReason);
2699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
2709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CSdlAppServ::ConstructL()
2729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
2739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    CActiveScheduler::Add(this);
2749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    User::LeaveIfError(iSema.CreateLocal(1));
2759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    iStatus = KRequestPending;
2769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    iStatusPtr = &iStatus;
2779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    SetActive();
2789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
2799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall CSdlAppServ::~CSdlAppServ()
2819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
2829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    Cancel();
2839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if(iSema.Handle() != NULL)
2849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        iSema.Signal();
2859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    iSema.Close();
2869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    iAppThread.Close();
2879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
2889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
2899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTInt CSdlAppServ::Request(TInt aService)
2909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
2919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if(RThread().Id() != iAppThread.Id())
2929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	{
2939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	iSema.Wait();
2949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	iService = aService;
2959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	iAppThread.RequestComplete(iStatusPtr, KErrNone);
2969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	return KErrNone;
2979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	}
2989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return KErrBadHandle;
2999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
3009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTInt CSdlAppServ::RequestValue(TInt aService)
3029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
3039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    Request(aService);
3049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    Request(EAppSrvNoop);
3059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return iReturnValue;
3069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
3079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CSdlAppServ::Init()
3099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
3109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    PANIC_IF_ERROR(iAppThread.Open(iMainId));
3119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
3129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CSdlAppServ::SetParam(TInt aParam)
3149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
3159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	iReturnValue = aParam;
3169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
3179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CSdlAppServ::HandleObserverValue(TInt aService, TInt aReturnValue, TBool aMainThread)
3199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
3209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(iObserver != NULL && aMainThread)
3219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
3229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		switch(aService)
3239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			{
3249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			case MSDLObserver::EEventScreenSizeChanged:
3259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			if(aReturnValue == MSDLObserver::EScreenSizeChangedDefaultPalette)
3269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall				EpocSdlEnv::LockPalette(EFalse);
3279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			break;
3289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			}
3299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
3309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(!aMainThread && aService == MSDLObserver::EEventSuspend)
3319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
3329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		if(iObserver == NULL ||
3339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		(gEpocEnv->iDsa->Stopped() && aReturnValue != MSDLObserver::ESuspendNoSuspend))
3349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			{
3359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			EpocSdlEnv::Suspend();
3369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall			}
3379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
3389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
3399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CSdlAppServ::RunL()
3419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
3429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if(iStatus == KErrNone)
3439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        {
3449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        switch(iService)
3459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            {
3469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            case CSdlAppServ::EAppSrvWaitDsa:
3479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            	EpocSdlEnv::SetWaitDsa();
3489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            	iReturnValue = EpocSdlEnv::IsDsaAvailable();
3499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            //		}
3509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            //	gEpocEnv->iDsa->Stop();
3519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            //	gEpocEnv->iDsa->RestartL();
3529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            	break;
3539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall           	 case CSdlAppServ::EAppSrvStopThread:
3549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            	gEpocEnv->iDsa->SetSuspend();
3559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            	break;
3569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            case EpocSdlEnv::EDisableKeyBlocking:
3579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                EnvUtils::DisableKeyBlocking();
3589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                break;
3599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            case EAppSrvWindowPointerCursorMode:
3619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                iReturnValue = gEpocEnv->iDsa != NULL ?
3629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                 gEpocEnv->iDsa->Session().PointerCursorMode() : KErrNotReady;
3639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                break;
3649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            case EAppSrvDsaStatus:
3659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            	gEpocEnv->iDsa->Stop();
3669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                iReturnValue = KErrNone;
3679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                break;
3689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            case CDsa::ERequestUpdate:
3699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            	gEpocEnv->iDsa->UnlockHWSurfaceRequestComplete();
3709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            	break;
3719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            case EAppSrvNoop:
3729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                break;
3739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            case MSDLObserver::EEventResume:
3749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            case MSDLObserver::EEventSuspend:
3759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            case MSDLObserver::EEventScreenSizeChanged:
3769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            case MSDLObserver::EEventWindowReserved:
3779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            case MSDLObserver::EEventKeyMapInit:
3789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            case MSDLObserver::EEventWindowNotAvailable:
3799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            case MSDLObserver::EEventMainExit:
3809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            	iReturnValue = ObserverEvent(iService, iReturnValue);
3819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            	HandleObserverValue(iService, iReturnValue, ETrue);
3829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            	break;
3839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            default:
3849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                PANIC(KErrNotSupported);
3859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            }
3869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        iStatus = KRequestPending;
3879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        iStatusPtr = &iStatus;
3889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        SetActive();
3899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        }
3909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    iSema.Signal();
3919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
3929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
3939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid CSdlAppServ::DoCancel()
3949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
3959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    iSema.Wait();
3969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    TRequestStatus* s = &iStatus;
3979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    iAppThread.RequestComplete(s, KErrCancel);
3989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
3999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallMEventQueue& EpocSdlEnv::EventQueue()
4039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
4049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    __ASSERT_DEBUG(gEpocEnv != NULL, PANIC(KErrNotReady));
4059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return *gEpocEnv->iEventQueue;
4069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
4079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTBool EpocSdlEnv::Flags(TInt aFlag)
4109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
4119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TInt flag = gEpocEnv->iEpocEnvFlags & aFlag;
4129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return flag == aFlag;
4139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
4149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTInt EpocSdlEnv::Argc()
4169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
4179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    __ASSERT_DEBUG(gEpocEnv != NULL, PANIC(KErrNotReady));
4189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return gEpocEnv->iArgc;
4199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
4209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallchar** EpocSdlEnv::Argv()
4239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
4249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    __ASSERT_DEBUG(gEpocEnv != NULL, PANIC(KErrNotReady));
4259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return gEpocEnv->iArgv;
4269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
4279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTBool EpocSdlEnv::IsDsaAvailable()
4309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
4319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    __ASSERT_DEBUG(gEpocEnv != NULL, PANIC(KErrNotReady));
4329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return gEpocEnv->iDsa != NULL && gEpocEnv->iDsa->IsDsaAvailable();
4339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
4349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid EpocSdlEnv::WaitDsaAvailable()
4379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
4389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	EpocSdlEnv::ObserverEvent(MSDLObserver::EEventWindowNotAvailable, 0);
4399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	gEpocEnv->iAppSrv->Request(CSdlAppServ::EAppSrvStopThread);
4409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(EpocSdlEnv::Flags(CSDL::EEnableFocusStop))
4419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
4429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		EpocSdlEnv::ObserverEvent(MSDLObserver::EEventSuspend, 0);
4439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
4449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
4459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid EpocSdlEnv::Suspend()
4479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
4489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(gEpocEnv->iDsa->Stopped() || EpocSdlEnv::Flags(CSDL::EEnableFocusStop))
4499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
4509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	//	gEpocEnv->iDsa->ReleaseStop();
4519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		gEpocEnv->iDsa->SetSuspend();
4529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		RThread().Suspend();
4539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		EpocSdlEnv::ObserverEvent(MSDLObserver::EEventResume, 0);
4549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
4559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
4569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid EpocSdlEnv::SetWaitDsa()
4589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
4599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(!IsDsaAvailable())
4609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
4619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		RThread th;
4629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		th.Open(gEpocEnv->iId);
4639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		th.Suspend();
4649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		th.Close();
4659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		gEpocEnv->iDsa->SetSuspend();
4669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
4679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
4689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid EpocSdlEnv::Resume()
4709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
4719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	gEpocEnv->iDsa->Resume();
4729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	RThread th;
4739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	th.Open(gEpocEnv->iId);
4749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	th.Resume();
4759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	th.Close();
4769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TInt value = gEpocEnv->iAppSrv->ObserverEvent(MSDLObserver::EEventResume, 0);
4789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	gEpocEnv->iAppSrv->HandleObserverValue(MSDLObserver::EEventResume, value, ETrue);
4799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
4809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTInt EpocSdlEnv::AllocSwSurface(const TSize& aSize, TDisplayMode aMode)
4839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
4849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return gEpocEnv->iDsa->AllocSurface(EFalse, aSize, aMode);
4859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
4869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTInt EpocSdlEnv::AllocHwSurface(const TSize& aSize, TDisplayMode aMode)
4889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
4899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return gEpocEnv->iDsa->AllocSurface(ETrue, aSize, aMode);
4909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
4919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid EpocSdlEnv::UnlockHwSurface()
4949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
4959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	gEpocEnv->iDsa->UnlockHwSurface();
4969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
4979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
4989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTUint8* EpocSdlEnv::LockHwSurface()
4999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
5009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return gEpocEnv->iDsa->LockHwSurface();
5019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
5029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid EpocSdlEnv::UpdateSwSurface()
5059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
5069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	gEpocEnv->iDsa->UpdateSwSurface();
5079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
5089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTBool EpocSdlEnv::AddUpdateRect(TUint8* aAddress, const TRect& aUpdateRect, const TRect& aRect)
5109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
5119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return gEpocEnv->iDsa->AddUpdateRect(aAddress, aUpdateRect, aRect);
5129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
5139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid EpocSdlEnv::Request(TInt aService)
5159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
5169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    __ASSERT_DEBUG(gEpocEnv != NULL, PANIC(KErrNotReady));
5179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    gEpocEnv->iAppSrv->Request(aService);
5189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
5199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTSize EpocSdlEnv::WindowSize(const TSize& aRequestedSize)
5229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
5239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    __ASSERT_DEBUG(gEpocEnv != NULL, PANIC(KErrNotReady));
5249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if(EpocSdlEnv::Flags(CSDL::EAllowImageResize) && gEpocEnv->iDsa->WindowSize() != aRequestedSize)
5259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	{
5269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	TRAP_IGNORE(gEpocEnv->iDsa->CreateZoomerL(aRequestedSize));
5279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	}
5289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return gEpocEnv->iDsa->WindowSize();
5299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
5309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall TSize EpocSdlEnv::WindowSize()
5329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
5339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    __ASSERT_DEBUG(gEpocEnv != NULL, PANIC(KErrNotReady));
5349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return gEpocEnv->iDsa->WindowSize();
5359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
5369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTDisplayMode EpocSdlEnv::DisplayMode()
5389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
5399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return gEpocEnv->iDsa->DisplayMode();
5409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
5419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTPointerCursorMode EpocSdlEnv::PointerMode()
5439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
5449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return static_cast<TPointerCursorMode>
5459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    (gEpocEnv->iAppSrv->RequestValue(CSdlAppServ::EAppSrvWindowPointerCursorMode));
5469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
5479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTInt EpocSdlEnv::SetPalette(TInt aFirstcolor, TInt aColorCount, TUint32* aPalette)
5499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
5509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return 	gEpocEnv->iDsa->SetPalette(aFirstcolor, aColorCount, aPalette);
5519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
5529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid EpocSdlEnv::PanicMain(TInt aErr)
5549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
5559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    gEpocEnv->iAppSrv->PanicMain(aErr);
5569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
5579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTInt EpocSdlEnv::AppendCleanupItem(const TSdlCleanupItem& aItem)
5609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
5619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    TRAPD(err, gEpocEnv->iCleanupItems->AppendL(aItem));
5629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return err;
5639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
5649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid EpocSdlEnv::RemoveCleanupItem(TAny* aItem)
5669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
5679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    for(TInt i = 0; i < gEpocEnv->iCleanupItems->Count(); i++)
5689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        {
5699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        if(gEpocEnv->iCleanupItems->At(i).iItem == aItem)
5709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            gEpocEnv->iCleanupItems->Delete(i);
5719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        }
5729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
5739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid EpocSdlEnv::CleanupItems()
5759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
5769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TThreadId id = RThread().Id();
5779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TInt last = gEpocEnv->iCleanupItems->Count() - 1;
5789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TInt i;
5799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	for(i = last; i >= 0 ; i--)
5809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        {
5819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        TSdlCleanupItem& item = gEpocEnv->iCleanupItems->At(i);
5829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        if(item.iThread == id)
5839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        	{
5849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        	item.iThread = TThreadId(0);
5859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        	item.iOperation(item.iItem);
5869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        	}
5879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        }
5889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    last = gEpocEnv->iCleanupItems->Count() - 1;
5899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	for(i = last; i >= 0 ; i--)
5909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        {
5919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        TSdlCleanupItem& item = gEpocEnv->iCleanupItems->At(i);
5929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        if(item.iThread == TThreadId(0))
5939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        	{
5949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        	gEpocEnv->iCleanupItems->Delete(i);
5959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        	}
5969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        }
5979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
5989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
5999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid EpocSdlEnv::FreeSurface()
6009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
6019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	Request(CSdlAppServ::EAppSrvDsaStatus);
6029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	gEpocEnv->iDsa->Free();
6039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
6049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid EpocSdlEnv::LockPalette(TBool aLock)
6069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
6079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	gEpocEnv->iDsa->LockPalette(aLock);
6089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
6099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid EpocSdlEnv::ObserverEvent(TInt aService, TInt aParam)
6119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
6129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TBool sdlThread = RThread().Id() == gEpocEnv->iId;
6139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TInt valuea = gEpocEnv->iAppSrv->ObserverEvent(aService, aParam);
6149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	gEpocEnv->iAppSrv->HandleObserverValue(aService, valuea, !sdlThread);
6159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(sdlThread)
6169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
6179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		gEpocEnv->iAppSrv->SetParam(aParam);
6189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		const TInt valuet = gEpocEnv->iAppSrv->RequestValue(aService);
6199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		gEpocEnv->iAppSrv->HandleObserverValue(aService, valuet, EFalse);
6209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
6219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
6229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTPoint EpocSdlEnv::WindowCoordinates(const TPoint& aPoint)
6259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
6269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return gEpocEnv->iDsa->WindowCoordinates(aPoint);
6279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
6289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid EpocSdlEnv::PanicMain(const TDesC& aInfo, TInt aErr)
6309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
6319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    gEpocEnv->iAppSrv->PanicMain(aInfo, aErr);
6329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
6339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall//Dsa is a low priority ao, it has to wait if its pending event, but ws
6349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall//event has been prioritized before it
6359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall//this is not called from app thread!
6369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid EpocSdlEnv::WaitDeviceChange()
6379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
6389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall  	LockPalette(ETrue);
6399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    gEpocEnv->iAppSrv->RequestValue(CSdlAppServ::EAppSrvWaitDsa);
6409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    const TSize sz = WindowSize();
6419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    const TInt param = reinterpret_cast<TInt>(&sz);
6429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ObserverEvent(MSDLObserver::EEventScreenSizeChanged, param);
6439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall   // RThread().Suspend();
6459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
6469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallLOCAL_C TBool CheckSdl()
6489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
6499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    TInt isExit = ETrue;
6509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    RThread sdl;
6519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if(sdl.Open(gEpocEnv->iId) == KErrNone)
6529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        {
6539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        if(sdl.ExitType() == EExitPending)
6549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            {
6559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            isExit = EFalse;
6569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            }
6579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        sdl.Close();
6589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        }
6599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return isExit;
6609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
6619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid EpocSdlEnvData::Free()
6639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
6649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if(RThread().Id() == gEpocEnv->iId)
6659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	{
6669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	iDsa->Free();
6679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	return;
6689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	}
6699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    __ASSERT_ALWAYS(iArgv == NULL || CheckSdl(), PANIC(KErrNotReady));
6719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    for(TInt i = 0; i < iArgc; i++)
6739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        User::Free( iArgv[i] );
6749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    User::Free(iArgv);
6769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    delete iEventQueue;
6799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if(iDsa != NULL)
6819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	iDsa->Free();
6829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	delete iDsa;
6849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	delete iAppSrv;
6859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
6869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall_LIT(KSDLMain, "SDLMain");
6889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallLOCAL_C int MainL()
6909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
6919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    gEpocEnv->iCleanupItems = new (ELeave) CArrayFixFlat<TSdlCleanupItem>(8);
6929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
6939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    char** envp=0;
6949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall     /* !! process exits here if there is "exit()" in main! */
6959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int ret = 0;
6969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    for(TInt i = 0; i  < 6; i++)
6979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        {
6989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        void* f = (void*) gEpocEnv->iMain[i];
6999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        if(f != NULL)
7009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            {
7019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            switch(i)
7029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                {
7039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                case 0:
7049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                    ret = ((mainfunc1)f)();
7059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                    return ret;
7069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                case 3:
7079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                    ((mainfunc1)f)();
7089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                    return ret;
7099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                case 1:
7109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                    ret = ((mainfunc2)f)(EpocSdlEnv::Argc(), EpocSdlEnv::Argv());
7119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                    return ret;
7129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                case 4:
7139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                    ((mainfunc2)f)(EpocSdlEnv::Argc(), EpocSdlEnv::Argv());
7149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                    return ret;
7159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                case 2:
7169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                    ret = ((mainfunc3)f)(EpocSdlEnv::Argc(), EpocSdlEnv::Argv(), envp);
7179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                    return ret;
7189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                case 5:
7199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                    ((mainfunc3)f)(EpocSdlEnv::Argc(), EpocSdlEnv::Argv(), envp);
7209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                    return ret;
7219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall                }
7229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall            }
7239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        }
7249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    PANIC(KErrNotFound);
7259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return 0;
7269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
7279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallLOCAL_C TInt DoMain(TAny* /*aParam*/)
7299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
7309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    CTrapCleanup* cleanup = CTrapCleanup::New();
7339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TBool fbsconnected = EFalse;
7359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(RFbsSession::GetSession() == NULL)
7369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	    {
7379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	    PANIC_IF_ERROR(RFbsSession::Connect());
7389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	    fbsconnected = ETrue;
7399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	    }
7409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall 	gEpocEnv->iAppSrv->Init();
7429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#ifdef SYMBIANC
7449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    // Create stdlib
7459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    _REENT;
7469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif
7479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    // Call stdlib main
7499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    int ret = 0;
7509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    //completes waiting rendesvous
7529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    RThread::Rendezvous(KErrNone);
7539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    TRAPD(err, err = MainL());
7559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    EpocSdlEnv::ObserverEvent(MSDLObserver::EEventMainExit, err);
7579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    // Free resources and return
7599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall  	EpocSdlEnv::CleanupItems();
7619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    gEpocEnv->iCleanupItems->Reset();
7639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    delete gEpocEnv->iCleanupItems;
7649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    gEpocEnv->iCleanupItems = NULL;
7659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    gEpocEnv->Free(); //free up in thread resources
7679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#ifdef SYMBIANC
7699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    _cleanup(); //this is normally called at exit, I call it here
7709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif
7719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if(fbsconnected)
7739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        RFbsSession::Disconnect();
7749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#ifdef SYMBIANC
7769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    CloseSTDLIB();
7779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall#endif
7789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall //   delete as;
7809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall   	delete cleanup;
7819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return err == KErrNone ? ret : err;;
7839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
7849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallEXPORT_C CSDL::~CSDL()
7889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
7899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall   	gEpocEnv->Free();
7909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    User::Free(gEpocEnv);
7919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    gEpocEnv->iSdl = NULL;
7929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
7939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
7949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallEXPORT_C CSDL* CSDL::NewL(TInt aFlags)
7959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
7969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    __ASSERT_ALWAYS(gEpocEnv == NULL, PANIC(KErrAlreadyExists));
7979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    gEpocEnv = (EpocSdlEnvData*) User::AllocL(sizeof(EpocSdlEnvData));
7989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    Mem::FillZ(gEpocEnv, sizeof(EpocSdlEnvData));
7999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    gEpocEnv->iEpocEnvFlags = aFlags;
8019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    gEpocEnv->iEventQueue = CEventQueue::NewL();
8029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    gEpocEnv->iAppSrv = new (ELeave) CSdlAppServ();
8049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    gEpocEnv->iAppSrv->ConstructL();
8059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    CSDL* sdl = new (ELeave) CSDL();
8079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    gEpocEnv->iSdl = sdl;
8099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return sdl;
8119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
8129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall  /*
8149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallEXPORT_C void CSDL::ReInitL(TFlags aFlags)
8159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
8169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	const TFlags prevFlags = gEpocEnv->iEpocEnvFlags;
8179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	gEpocEnv->iEpocEnvFlags = aFlags;
8189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	TInt err = KErrNone;
8199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(((prevFlags & EDrawModeDSB) != (aFlags & EDrawModeDSB)) && gEpocEnv->iDsa)
8209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
8219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		delete gEpocEnv->iDsa;
8229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		gEpocEnv->iDsa = NULL;
8239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		gEpocEnv->iDsa = CDsa::RecreateL(EpocSdlEnv::Flags(CSDL::EDrawModeDSB));
8249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
8259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
8269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall */
8279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallEXPORT_C void CSDL::SetContainerWindowL(RWindow& aWindow, RWsSession& aSession, CWsScreenDevice& aDevice)
8309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
8319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if(gEpocEnv->iDsa == NULL)
8329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	gEpocEnv->iDsa = CDsa::CreateL(aSession);
8339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    gEpocEnv->iDsa->ConstructL(aWindow, aDevice);
8349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
8359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallEXPORT_C TThreadId CSDL::CallMainL(const TMainFunc& aFunc, TRequestStatus* const aStatus, const CDesC8Array* const aArg, TInt aFlags, TInt aStackSize)
8389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
8399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    ASSERT(gEpocEnv != NULL);
8409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    gEpocEnv->iMain = aFunc;
8419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    const TBool args = aArg != NULL;
8429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    gEpocEnv->iArgc = aArg->Count() + 1;
8449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    gEpocEnv->iArgv = (char**) User::AllocL(sizeof(char*) * (gEpocEnv->iArgc + 1));
8459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    TInt k = 0;
8479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    const TFileName processName = RProcess().FileName();
8489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    const TInt len = processName.Length();
8499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    gEpocEnv->iArgv[k] = (char*) User::AllocL(len + 1);
8509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    Mem::Copy(gEpocEnv->iArgv[k], processName.Ptr(), len);
8519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    gEpocEnv->iArgv[k][len] = 0;
8529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    for(TInt i =  0; args && (i < aArg->Count()); i++)
8549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        {
8559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        k++;
8569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        const TInt len = aArg->MdcaPoint(i).Length();
8579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        gEpocEnv->iArgv[k] = (char*) User::AllocL(len + 1);
8589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        Mem::Copy(gEpocEnv->iArgv[k], aArg->MdcaPoint(i).Ptr(), len);
8599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        gEpocEnv->iArgv[k][len] = 0;
8609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        }
8619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    gEpocEnv->iArgv[gEpocEnv->iArgc] = NULL;
8639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    RThread thread;
8659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    User::LeaveIfError(thread.Create(KSDLMain, DoMain, aStackSize, NULL, NULL));
8669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if(aStatus != NULL)
8689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	{
8699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	thread.Logon(*aStatus);
8709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    	}
8719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    gEpocEnv->iId = thread.Id();
8739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    thread.SetPriority(EPriorityLess);
8749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if((aFlags & CSDL::ERequestResume) == 0)
8759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        {
8769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        thread.Resume();
8779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        }
8789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    thread.Close();
8799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return gEpocEnv->iId;
8809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
8819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallEXPORT_C TInt CSDL::AppendWsEvent(const TWsEvent& aEvent)
8839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
8849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return EpocSdlEnv::EventQueue().Append(aEvent);
8859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
8869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallEXPORT_C void CSDL::SDLPanic(const TDesC& aInfo, TInt aErr)
8889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
8899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    EpocSdlEnv::PanicMain(aInfo, aErr);
8909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
8919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
8929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallEXPORT_C TInt CSDL::GetSDLCode(TInt aScanCode)
8939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
8949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if(aScanCode < 0)
8959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        return MAX_SCANCODE;
8969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if(aScanCode >= MAX_SCANCODE)
8979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        return -1;
8989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return KeyMap()[aScanCode];
8999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
9009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
9019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallEXPORT_C TInt CSDL::SDLCodesCount() const
9029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
9039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return MAX_SCANCODE;
9049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
9059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
9069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallEXPORT_C void CSDL::ResetSDLCodes()
9079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
9089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	ResetKeyMap();
9099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
9109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
9119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallEXPORT_C void CSDL::SetOrientation(TOrientationMode aMode)
9129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
9139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	gEpocEnv->iDsa->SetOrientation(aMode);
9149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
9159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
9169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallEXPORT_C TInt CSDL::SetSDLCode(TInt aScanCode, TInt aSDLCode)
9179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
9189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    const TInt current = GetSDLCode(aScanCode);
9199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    if(aScanCode >= 0 && aScanCode < MAX_SCANCODE)
9209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall        KeyMap()[aScanCode] = static_cast<SDLKey>(aSDLCode);
9219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return current;
9229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
9239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
9249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
9259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallEXPORT_C MSDLObserver* CSDL::Observer()
9269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
9279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return gEpocEnv->iAppSrv->Observer();
9289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
9299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
9309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallEXPORT_C void CSDL::SetObserver(MSDLObserver* aObserver)
9319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
9329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	gEpocEnv->iAppSrv->SetObserver(aObserver);
9339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
9349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
9359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallEXPORT_C void CSDL::Resume()
9369682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
9379682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	EpocSdlEnv::Resume();
9389682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
9399682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
9409682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallEXPORT_C void CSDL::Suspend()
9419682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
9429682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	gEpocEnv->iDsa->DoStop();
9439682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
9449682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
9459682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallEXPORT_C CSDL::CSDL()
9469682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
9479682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
9489682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
9499682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallEXPORT_C void CSDL::DisableKeyBlocking(CAknAppUi& aAppUi) const
9509682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
9519682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	gEpocEnv->iAppUi = &aAppUi;
9529682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	EnvUtils::DisableKeyBlocking();
9539682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
9549682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
9559682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallEXPORT_C TInt CSDL::SetBlitter(MBlitter* aBlitter)
9569682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
9579682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(gEpocEnv && gEpocEnv->iDsa)
9589682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
9599682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		gEpocEnv->iDsa->SetBlitter(aBlitter);
9609682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		return KErrNone;
9619682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
9629682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return KErrNotReady;
9639682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
9649682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
9659682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
9669682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallEXPORT_C TInt CSDL::AppendOverlay(MOverlay& aOverlay, TInt aPriority)
9679682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
9689682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(gEpocEnv && gEpocEnv->iDsa)
9699682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
9709682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		return gEpocEnv->iDsa->AppendOverlay(aOverlay, aPriority);
9719682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
9729682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return KErrNotReady;
9739682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
9749682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
9759682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallEXPORT_C TInt CSDL::RemoveOverlay(MOverlay& aOverlay)
9769682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
9779682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(gEpocEnv && gEpocEnv->iDsa)
9789682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
9799682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		return gEpocEnv->iDsa->RemoveOverlay(aOverlay);
9809682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
9819682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return KErrNotReady;
9829682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
9839682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
9849682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallEXPORT_C TInt CSDL::RedrawRequest()
9859682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
9869682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(gEpocEnv && gEpocEnv->iDsa)
9879682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		{
9889682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		return gEpocEnv->iDsa->RedrawRequest();
9899682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		}
9909682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	return KErrNotReady;
9919682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
9929682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
9939682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall/*
9949682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallEXPORT_C CSDL* CSDL::Current()
9959682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
9969682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return gEpocEnv != NULL ? gEpocEnv->iSdl : NULL;
9979682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
9989682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
9999682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
10009682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallEXPORT_C TInt CSDL::SetVolume(TInt aVolume)
10019682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
10029682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return EpocSdlEnv::SetVolume(aVolume);
10039682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
10049682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
10059682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallEXPORT_C TInt CSDL::Volume() const
10069682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
10079682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return EpocSdlEnv::Volume();
10089682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
10099682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
10109682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallEXPORT_C TInt CSDL::MaxVolume() const
10119682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    {
10129682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return EpocSdlEnv::MaxVolume();
10139682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    }
10149682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall*/
10159682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
10169682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hallvoid EnvUtils::DisableKeyBlocking()
10179682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
10189682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(gEpocEnv->iAppUi != NULL)
10199682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall		return CCurrentAppUi::Cast(gEpocEnv->iAppUi)->DisableKeyBlocking();
10209682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
10219682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
10229682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse HallTBool EnvUtils::Rendezvous(RThread& aThread, TRequestStatus& aStatus)
10239682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	{
10249682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	if(gEpocEnv->iId != TThreadId(0) &&
10259682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    		 	aThread.Open(gEpocEnv->iId) &&
10269682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    		  	aThread.ExitType() == EExitPending)
10279682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    			{
10289682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    			aThread.Rendezvous(aStatus);
10299682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    			return ETrue;
10309682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    			}
10319682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall    return EFalse;
10329682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall	}
10339682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
10349682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
10359682c8870b8ff5e4ac2e4c70b759f791c6f38c1fJesse Hall
1036