Remove "new (ELeave)".
[SDL.s60v3.git] / src / main / symbian / sdlexe.cpp
blob0bc6953bd212fb329bd23c56bae11e8285dd307e
1 #include <aknapp.h>
2 #include <aknappui.h>
3 #include <eikdoc.h>
4 #include <sdlepocapi.h>
5 #include <bautils.h>
6 #include <eikstart.h>
7 #include <badesca.h>
8 #include <bautils.h>
9 #include <apgcli.h>
10 #include <sdlmain.h>
11 #include <eikedwin.h>
12 #include <eiklabel.h>
13 #include <sdlexe.rsg>
14 #include <aknglobalmsgquery.h>
15 #include <apgwgnam.h>
17 class CApaDocument;
19 static void MakeCCmdLineL(const TDesC8& aParam, CDesC8Array& aArray)
21 const TChar dq('\"');
23 TLex8 lex(aParam);
24 TBool in = EFalse;
26 lex.SkipSpaceAndMark();
28 while(!lex.Eos())
30 TPtrC8 ptr;
31 if(in)
33 const TPtrC8 rem = lex.RemainderFromMark();
34 const int pos = rem.Locate(dq);
35 if(pos > 0)
37 lex.Inc(pos);
38 ptr.Set(lex.MarkedToken());
39 lex.SkipAndMark(1);
41 else
43 ptr.Set(rem);
45 in = EFalse;
47 else
49 ptr.Set(lex.NextToken());
50 const int pos = ptr.Locate(dq);
51 if(pos == 0)
53 lex.UnGetToMark();
54 lex.SkipAndMark(1);
55 in = ETrue;
56 continue; // back to in brace
58 else
59 lex.SkipSpaceAndMark();
62 aArray.AppendL(ptr);
66 class TSdlClass
68 public:
69 TSdlClass();
70 void SetMain(const TMainFunc& aFunc, int aFlags, MSDLMainObs* aObs, int aExeFlags);
71 int SdlFlags() const;
72 const TMainFunc& Main() const;
73 void SendEvent(int aEvent, int aParam, CSDL* aSDL);
74 int AppFlags() const;
75 void AppFlags(int aFlags);
77 private:
78 TMainFunc iFunc;
79 int iSdlFlags;
80 int iExeFlags;
81 MSDLMainObs* iObs;
85 void TSdlClass::AppFlags(int aFlags)
87 iExeFlags |= aFlags;
90 void TSdlClass::SendEvent(int aEvent, int aParam, CSDL* aSDL)
92 if(iObs != NULL)
93 iObs->SDLMainEvent(aEvent, aParam, aSDL);
96 int TSdlClass::AppFlags() const
98 return iExeFlags;
101 void TSdlClass::SetMain(const TMainFunc& aFunc, int aFlags, MSDLMainObs* aObs, int aExeFlags)
103 iFunc = aFunc;
104 iSdlFlags = aFlags;
105 iExeFlags = aExeFlags;
106 iObs = aObs;
109 const TMainFunc& TSdlClass::Main() const
111 return iFunc;
115 int TSdlClass::SdlFlags() const
117 return iSdlFlags;
120 TSdlClass::TSdlClass()
122 Mem::FillZ(this, sizeof(this));
125 TSdlClass gSDLClass;
127 ////////////////////////////////////////////////////////////////
129 class CExitWait : public CActive
131 public:
132 CExitWait(CAknAppUi& aWait);
133 ~CExitWait();
135 private:
136 void RunL();
137 void DoCancel();
139 CAknAppUi& iWait;
140 TRequestStatus* iStatusPtr;
143 ////////////////////////////////////////////////////////////////////////
145 class CSDLWin : public CCoeControl
147 public:
148 CSDLWin( const TRect& aRect );
149 RWindow& GetWindow() const { return Window(); }
150 void SetDraw(bool draw) { m_draw = draw; }
152 private:
153 void Draw(const TRect& aRect) const;
155 bool m_draw;
158 CSDLWin::CSDLWin( const TRect& aRect )
159 : m_draw(false)
161 CreateWindowL();
162 SetRect(aRect);
163 ActivateL();
167 void CSDLWin::Draw(const TRect& /*aRect*/) const
169 if(m_draw)
171 CWindowGc& gc = SystemGc();
172 gc.SetPenStyle(CGraphicsContext::ESolidPen);
173 gc.SetPenColor(KRgbGray);
174 gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
175 gc.SetBrushColor(0x000000);
176 gc.DrawRect(Rect());
180 ////////////////////////////////////////////////////////////////////////////
182 class CSDLAppUi : public CAknAppUi
184 public:
185 ~CSDLAppUi();
187 private:
188 void ConstructL();
189 void HandleCommandL(int aCommand);
190 void HandleWsEventL(const TWsEvent& aEvent, CCoeControl* aDestination);
191 void HandleResourceChangeL(int aType);
193 void StartL();
194 static TBool StartL(TAny* aThis);
196 TBool ParamEditorL(TDes& aCheat);
198 TBool ProcessCommandParametersL(CApaCommandLine &aCommandLine);
200 void HandleForegroundEventL(TBool aForeground);
202 CExitWait* iWait;
203 CSDLWin* iSDLWin;
204 CSDL* iSdl;
205 CIdle* iStarter;
206 CDesC8Array* iParams;
207 int iResOffset;
210 ////////////////////////////////////////////////////////////////////////////
212 class CSDLDocument : public CEikDocument
214 public:
215 CSDLDocument(CEikApplication& aApp) : CEikDocument(aApp) {}
217 private:
218 CEikAppUi* CreateAppUiL() { return new CSDLAppUi; }
221 ////////////////////////////////////////////////////////////////////////////
223 class CSDLApplication : public CAknApplication
225 public:
226 CSDLApplication();
228 private:
229 CApaDocument* CreateDocumentL() { return new CSDLDocument(*this); }
230 TUid AppDllUid() const { return iUid; }
232 TUid iUid;
235 ////////////////////////////////////////////////////////////////////////////////////////
237 CSDLApplication::CSDLApplication()
239 RApaLsSession apa;
240 User::LeaveIfError(apa.Connect());
241 CleanupClosePushL(apa);
242 User::LeaveIfError(apa.GetAllApps());
243 TFileName name = RProcess().FileName();
244 TApaAppInfo info;
245 while(apa.GetNextApp(info) == KErrNone)
247 if(info.iFullName.CompareF(name) == 0)
249 iUid = info.iUid;
250 break;
253 CleanupStack::PopAndDestroy();
256 ///////////////////////////////////////////////////////////////////////////////////////////
258 CExitWait::CExitWait(CAknAppUi& aWait) : CActive(CActive::EPriorityStandard), iWait(aWait)
260 CActiveScheduler::Add(this);
261 SetActive();
262 iStatusPtr = &iStatus;
265 CExitWait::~CExitWait()
267 Cancel();
270 void CExitWait::RunL()
272 if(iStatusPtr != NULL)
273 iWait.Exit();
276 void CExitWait::DoCancel()
278 if(iStatusPtr != NULL)
279 User::RequestComplete(iStatusPtr, KErrCancel);
282 /////////////////////////////////////////////////////////////////////////
284 CSDLAppUi::~CSDLAppUi()
286 if(iStarter)
287 iStarter->Cancel();
288 delete iStarter;
289 delete iWait;
290 delete iSdl;
291 delete iSDLWin;
292 delete iParams;
295 void CSDLAppUi::ConstructL()
297 BaseConstructL(ENoAppResourceFile|EAknEnableSkin);
299 RFs fs;
300 fs.Connect();
301 TFileName name;
302 fs.PrivatePath(name);
303 fs.Close();
304 name.Append( _L("sdlexe.rsc") );
305 name.Insert( 0, _L("C:") );
306 iResOffset = iCoeEnv->AddResourceFileL(name);
308 iSDLWin = new CSDLWin(ApplicationRect());
310 iSdl = CSDL::NewL(gSDLClass.SdlFlags());
312 gSDLClass.SendEvent(MSDLMainObs::ESDLCreated, 0, iSdl);
314 SetKeyBlockMode(ENoKeyBlock);
316 iSdl->SetContainerWindowL(iSDLWin->GetWindow(), iEikonEnv->WsSession(), *iEikonEnv->ScreenDevice());
318 iStarter = CIdle::NewL(CActive::EPriorityLow);
319 iStarter->Start(TCallBack(StartL, this));
322 TBool CSDLAppUi::StartL(TAny* aThis)
324 static_cast<CSDLAppUi*>(aThis)->StartL();
325 return EFalse;
328 TBool CSDLAppUi::ProcessCommandParametersL(CApaCommandLine &aCommandLine)
330 const TPtrC8 cmdLine = aCommandLine.TailEnd();
331 iParams = new CDesC8ArrayFlat(8);
332 MakeCCmdLineL(cmdLine, *iParams);
333 return EFalse;
336 TBool CSDLAppUi::ParamEditorL(TDes& aCheat)
338 CAknTextQueryDialog* query = CAknTextQueryDialog::NewL(aCheat);
339 CleanupStack::PushL(query);
340 query->SetPromptL(_L("Enter parameters"));
341 CleanupStack::Pop();
342 return query->ExecuteLD(R_PARAMEDITOR);
345 void CSDLAppUi::StartL()
347 if(gSDLClass.AppFlags() & SDLEnv::EParamQuery)
349 iSDLWin->SetDraw(true);
351 TBuf8<256> cmd;
352 RFile file;
353 int err = file.Open(iEikonEnv->FsSession(), _L("sdl_param.txt"),EFileRead);
354 if(err == KErrNone)
356 file.Read(cmd);
357 file.Close();
358 MakeCCmdLineL(cmd, *iParams);
360 if(err != KErrNone || gSDLClass.AppFlags() & (SDLEnv::EParamQueryDialog ^ SDLEnv::EParamQuery))
362 TBuf<256> buffer;
363 if(ParamEditorL(buffer))
365 cmd.Copy(buffer);
366 MakeCCmdLineL(cmd, *iParams);
370 iSDLWin->SetDraw(false);
372 iCoeEnv->DeleteResourceFile(iResOffset);
374 iWait = new CExitWait(*this);
375 iSdl->CallMainL(gSDLClass.Main(), &iWait->iStatus, iParams, 0xA000);
378 void CSDLAppUi::HandleCommandL(int aCommand)
380 switch(aCommand)
382 case EAknSoftkeyBack:
383 case EAknSoftkeyExit:
384 case EAknCmdExit:
385 case EEikCmdExit:
386 if(iWait == NULL || !iWait->IsActive() || iSdl == NULL)
388 Exit();
390 else
392 TWsEvent event;
393 event.SetType(EEventSwitchOff), event.SetTimeNow();
394 iSdl->AppendWsEvent(event);
396 break;
398 default:
399 break;
403 void CSDLAppUi::HandleWsEventL(const TWsEvent& aEvent, CCoeControl* aDestination)
405 if(aEvent.Type() == KAknUidValueEndKeyCloseEvent)
407 if(iWait != NULL && iWait->IsActive() && iSdl != NULL)
409 TWsEvent event;
410 event.SetType(EEventSwitchOff), event.SetTimeNow();
411 iSdl->AppendWsEvent(event);
412 return;
416 if(iSdl && iWait)
417 iSdl->AppendWsEvent(aEvent);
418 CAknAppUi::HandleWsEventL(aEvent, aDestination);
421 void CSDLAppUi::HandleResourceChangeL(int aType)
423 CAknAppUi::HandleResourceChangeL(aType);
424 if(aType == KEikDynamicLayoutVariantSwitch)
426 iSDLWin->SetRect(ApplicationRect());
427 iSdl->SetContainerWindowL(iSDLWin->GetWindow(), iEikonEnv->WsSession(), *iEikonEnv->ScreenDevice());
428 iSdl->Resize();
432 void CSDLAppUi::HandleForegroundEventL(TBool aForeground)
434 CAknAppUi::HandleForegroundEventL(aForeground);
437 ////////////////////////////////////////////////////////////////////////
439 CApaApplication* NewApplication()
441 return new CSDLApplication();
444 int SDLEnv::SetMain(const TMainFunc& aFunc, int aSdlFlags, MSDLMainObs* aObs, int aSdlExeFlags)
446 gSDLClass.SetMain(aFunc, aSdlFlags, aObs, aSdlExeFlags);
447 return EikStart::RunApplication(NewApplication);