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