|
1 // Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). |
|
2 // All rights reserved. |
|
3 // This component and the accompanying materials are made available |
|
4 // under the terms of "Eclipse Public License v1.0" |
|
5 // which accompanies this distribution, and is available |
|
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
7 // |
|
8 // Initial Contributors: |
|
9 // Nokia Corporation - initial contribution. |
|
10 // |
|
11 // Contributors: |
|
12 // |
|
13 // Description: |
|
14 // |
|
15 |
|
16 /** |
|
17 @file |
|
18 @internalComponent - Internal Symbian test code |
|
19 */ |
|
20 |
|
21 |
|
22 #include <e32std.h> |
|
23 #include <e32base.h> |
|
24 #include <e32keys.h> |
|
25 #include <gdi.h> |
|
26 #include <w32std.h> |
|
27 #include <coedef.h> |
|
28 #include <coemain.h> |
|
29 #include <coeaui.h> |
|
30 #include <coecntrl.h> |
|
31 #include <apparc.h> |
|
32 #include <apgwgnam.h> |
|
33 #include <apaserverapp.h> |
|
34 #include <eikenv.h> |
|
35 #include <eikapp.h> |
|
36 #include <eikdoc.h> |
|
37 #include <eikappui.h> |
|
38 #include <eikstart.h> |
|
39 #include <eikserverapp.h> |
|
40 #include <uikon.hrh> |
|
41 #include "TNNApp1.h" |
|
42 #include "appfwk_test.h" |
|
43 |
|
44 TTstTransactionType gTransactionType=ETransactionType_null; |
|
45 TBool gCallMadeToNewOverload_ProcessCommandParametersL=EFalse; |
|
46 TInt gErrorWhenOpeningFile=KMinTInt; |
|
47 TBuf<50> gFileNameWithoutDriveOrPath; |
|
48 TBuf8<40> gBufferFromFile(KNullDesC8); |
|
49 |
|
50 // CTstAppService |
|
51 |
|
52 class CTstAppService : public CApaAppServiceBase |
|
53 { |
|
54 public: |
|
55 static CTstAppService* NewL(); |
|
56 private: |
|
57 inline CTstAppService() {} |
|
58 // from CApaAppServiceBase |
|
59 virtual void ServiceL(const RMessage2& aMessage); |
|
60 }; |
|
61 |
|
62 CTstAppService* CTstAppService::NewL() |
|
63 { |
|
64 return new(ELeave) CTstAppService; |
|
65 } |
|
66 |
|
67 void CTstAppService::ServiceL(const RMessage2& aMessage) |
|
68 { |
|
69 switch (aMessage.Function()) |
|
70 { |
|
71 case EOpcode_receiveTestResult: |
|
72 { |
|
73 CActiveScheduler::Stop(); |
|
74 const TBool passingFileByHandle=aMessage.Int0(); |
|
75 TBuf<50> fileNameWithoutDriveOrPath; |
|
76 aMessage.ReadL(1, fileNameWithoutDriveOrPath); |
|
77 TBool result=(gFileNameWithoutDriveOrPath.CompareF(fileNameWithoutDriveOrPath)==0) ? KCheckPass : KCheckFail; |
|
78 switch (gTransactionType) |
|
79 { |
|
80 case ETransactionType_filePassedByName: |
|
81 if (!gCallMadeToNewOverload_ProcessCommandParametersL) |
|
82 { |
|
83 result=KCheckFail; |
|
84 } |
|
85 if (passingFileByHandle) |
|
86 { |
|
87 result=KCheckFail; |
|
88 } |
|
89 if (gErrorWhenOpeningFile!=KErrPermissionDenied) |
|
90 { |
|
91 result=KCheckFail; |
|
92 } |
|
93 if (User::CreatorSecureId().iId!=0x101F289C) // uid of the creator app => apparctestserver! |
|
94 { |
|
95 result=KCheckFail; |
|
96 } |
|
97 break; |
|
98 |
|
99 case ETransactionType_filePassedByHandle: |
|
100 if (!gCallMadeToNewOverload_ProcessCommandParametersL) |
|
101 { |
|
102 result=KCheckFail; |
|
103 } |
|
104 if (!passingFileByHandle) |
|
105 { |
|
106 result=KCheckFail; |
|
107 } |
|
108 if (gErrorWhenOpeningFile!=KMinTInt) |
|
109 { |
|
110 result=KCheckFail; |
|
111 } |
|
112 if (User::CreatorSecureId().iId!=0x101F289C) // uid of the creator app => apparctestserver! |
|
113 { |
|
114 result=KCheckFail; |
|
115 } |
|
116 break; |
|
117 |
|
118 case ETransactionType_null: |
|
119 default: |
|
120 User::Invariant(); |
|
121 break; |
|
122 } |
|
123 aMessage.Complete(result); |
|
124 } |
|
125 break; |
|
126 |
|
127 default: |
|
128 User::Leave(KErrNotSupported); |
|
129 break; |
|
130 } |
|
131 } |
|
132 |
|
133 // CTstAppServer |
|
134 |
|
135 class CTstAppServer : public CEikAppServer |
|
136 { |
|
137 public: |
|
138 static CTstAppServer* NewL(); |
|
139 private: |
|
140 inline CTstAppServer() {} |
|
141 // from CApaAppServer |
|
142 virtual CApaAppServiceBase* CreateServiceL(TUid aServiceUid) const; |
|
143 virtual TCustomResult CreateServiceSecurityCheckL(TUid aServiceUid, const RMessage2& aMessage, TInt& aAction, TSecurityInfo& aMissingSecurityInfo); |
|
144 }; |
|
145 |
|
146 CTstAppServer* CTstAppServer::NewL() |
|
147 { // static |
|
148 CTstAppServer* const appServer=new(ELeave) CTstAppServer; |
|
149 CleanupStack::PushL(appServer); |
|
150 appServer->ConstructL(KLitServerName); |
|
151 CleanupStack::Pop(appServer); |
|
152 return appServer; |
|
153 } |
|
154 |
|
155 CApaAppServiceBase* CTstAppServer::CreateServiceL(TUid aServiceUid) const |
|
156 { |
|
157 if ((aServiceUid.iUid==KTstServiceUid_nonSecure.iUid) || |
|
158 (aServiceUid.iUid==KTstServiceUid_secure.iUid)) |
|
159 { |
|
160 return CTstAppService::NewL(); |
|
161 } |
|
162 User::Leave(KErrNotSupported); |
|
163 return NULL; |
|
164 } |
|
165 |
|
166 CPolicyServer::TCustomResult CTstAppServer::CreateServiceSecurityCheckL(TUid aServiceUid, const RMessage2& aMessage, TInt& aAction, TSecurityInfo& aMissingSecurityInfo) |
|
167 { |
|
168 if ((aServiceUid.iUid==KTstServiceUid_secure.iUid) && (aMessage.SecureId().iId!=0x101F289C)) // uid of the creator app => apparctestserver! |
|
169 { |
|
170 return EFail; |
|
171 } |
|
172 return CEikAppServer::CreateServiceSecurityCheckL(aServiceUid, aMessage, aAction, aMissingSecurityInfo); |
|
173 } |
|
174 |
|
175 // CTstControl |
|
176 |
|
177 class CTstControl : public CCoeControl |
|
178 { |
|
179 public: |
|
180 static CTstControl* NewL(); |
|
181 virtual ~CTstControl(); |
|
182 private: |
|
183 CTstControl(); |
|
184 void ConstructL(); |
|
185 // from CCoeControl |
|
186 virtual TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aEventCode); |
|
187 virtual void HandlePointerEventL(const TPointerEvent& aPointerEvent); |
|
188 virtual void Draw(const TRect& aRectangle) const; |
|
189 private: |
|
190 CTstAppServer* iAppServer; |
|
191 }; |
|
192 |
|
193 CTstControl* CTstControl::NewL() |
|
194 { // static |
|
195 CTstControl* const control=new(ELeave) CTstControl; |
|
196 CleanupStack::PushL(control); |
|
197 control->ConstructL(); |
|
198 CleanupStack::Pop(control); |
|
199 return control; |
|
200 } |
|
201 |
|
202 CTstControl::~CTstControl() |
|
203 { |
|
204 delete iAppServer; |
|
205 iEikonEnv->RemoveFromStack(this); |
|
206 } |
|
207 |
|
208 CTstControl::CTstControl() |
|
209 { |
|
210 } |
|
211 |
|
212 void CTstControl::ConstructL() |
|
213 { |
|
214 RWsSession& windowServerSession=iCoeEnv->WsSession(); |
|
215 windowServerSession.SetAutoFlush(ETrue); |
|
216 CreateWindowL(); |
|
217 EnableDragEvents(); |
|
218 ClaimPointerGrab(); |
|
219 RDrawableWindow& window=*DrawableWindow(); |
|
220 window.SetOrdinalPosition(0); |
|
221 window.SetShadowHeight(3); |
|
222 CWsScreenDevice& screenDevice=*iCoeEnv->ScreenDevice(); |
|
223 const TSize screenSize(screenDevice.SizeInPixels()); |
|
224 SetExtent(TPoint(20, 20), TSize(screenSize.iWidth-40, screenSize.iHeight-40)); |
|
225 iEikonEnv->AddDialogLikeControlToStackL(this); |
|
226 iAppServer=CTstAppServer::NewL(); |
|
227 ActivateL(); |
|
228 } |
|
229 |
|
230 TKeyResponse CTstControl::OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aEventCode) |
|
231 { |
|
232 if (aEventCode==EEventKey) |
|
233 { |
|
234 switch (aKeyEvent.iCode) |
|
235 { |
|
236 case EKeyEscape: |
|
237 iEikonEnv->EikAppUi()->HandleCommandL(EEikCmdExit); |
|
238 break; |
|
239 } |
|
240 } |
|
241 return EKeyWasConsumed; |
|
242 } |
|
243 |
|
244 void CTstControl::HandlePointerEventL(const TPointerEvent& aPointerEvent) |
|
245 { |
|
246 CCoeControl::HandlePointerEventL(aPointerEvent); |
|
247 } |
|
248 |
|
249 void CTstControl::Draw(const TRect&) const |
|
250 { |
|
251 CWindowGc& graphicsContext=SystemGc(); |
|
252 graphicsContext.SetPenStyle(CGraphicsContext::ESolidPen); |
|
253 graphicsContext.SetPenColor(KRgbRed); |
|
254 graphicsContext.SetBrushStyle(CGraphicsContext::ESolidBrush); |
|
255 graphicsContext.SetBrushColor(KRgbGray); |
|
256 TRect rectangle(TPoint(0, 0), Rect().Size()); |
|
257 graphicsContext.DrawRect(rectangle); |
|
258 rectangle.Shrink(1, 1); |
|
259 graphicsContext.SetPenColor(KRgbBlue); |
|
260 graphicsContext.SetBrushStyle(CGraphicsContext::ENullBrush); |
|
261 |
|
262 const TInt KGapAboveTop=40; |
|
263 const TInt KGapBetweenLines=5; |
|
264 const TInt KMaxLengthOfText=100; |
|
265 TBuf<KMaxLengthOfText> text; |
|
266 |
|
267 TInt gapLeft=5; |
|
268 const CFont* font=iCoeEnv->NormalFont(); |
|
269 graphicsContext.UseFont(font); |
|
270 TInt heightInPixelsPlusGapBetweenLines=font->HeightInPixels()+KGapBetweenLines; |
|
271 TPtrC transactionType; |
|
272 switch (gTransactionType) |
|
273 { |
|
274 case ETransactionType_null: |
|
275 transactionType.Set(_L("null")); |
|
276 break; |
|
277 case ETransactionType_filePassedByName: |
|
278 transactionType.Set(_L("file passed by name")); |
|
279 break; |
|
280 case ETransactionType_filePassedByHandle: |
|
281 transactionType.Set(_L("file passed by handle")); |
|
282 break; |
|
283 default: |
|
284 User::Invariant(); |
|
285 break; |
|
286 } |
|
287 text.Format(_L("Transaction type: %S"), &transactionType); |
|
288 TInt topOfText=KGapAboveTop+font->AscentInPixels(); |
|
289 graphicsContext.DrawText(text, rectangle, topOfText, CGraphicsContext::ELeft, gapLeft); |
|
290 |
|
291 topOfText+=heightInPixelsPlusGapBetweenLines; |
|
292 _LIT(KLit_yes, "yes"); |
|
293 _LIT(KLit_no, "no"); |
|
294 text.Format(_L("ProcessCommandParametersL(CApaCommandLine&) called: %S"), gCallMadeToNewOverload_ProcessCommandParametersL? &KLit_yes: &KLit_no); |
|
295 graphicsContext.DrawText(text, rectangle, topOfText, CGraphicsContext::ELeft, gapLeft); |
|
296 |
|
297 topOfText+=heightInPixelsPlusGapBetweenLines; |
|
298 text.Format(_L("Error when opening file: %d"), gErrorWhenOpeningFile); |
|
299 graphicsContext.DrawText(text, rectangle, topOfText, CGraphicsContext::ELeft, gapLeft); |
|
300 |
|
301 topOfText+=heightInPixelsPlusGapBetweenLines; |
|
302 text=_L("File contents: {"); |
|
303 const TInt bufferLength=gBufferFromFile.Length(); |
|
304 for (TInt i=0; i<bufferLength; ++i) |
|
305 { |
|
306 if (KMaxLengthOfText-text.Length()<5) |
|
307 { |
|
308 break; |
|
309 } |
|
310 text.AppendFormat(_L("\\x%02x"), gBufferFromFile[i]); |
|
311 } |
|
312 text.Append('}'); |
|
313 graphicsContext.DrawText(text, rectangle, topOfText, CGraphicsContext::ELeft, gapLeft); |
|
314 |
|
315 graphicsContext.DiscardFont(); |
|
316 } |
|
317 |
|
318 // CTstAppUi |
|
319 |
|
320 class CTstAppUi : public CEikAppUi |
|
321 { |
|
322 public: |
|
323 static CTstAppUi* NewL(); |
|
324 inline CTstControl* Control() {return iControl;} |
|
325 private: |
|
326 inline CTstAppUi() {} |
|
327 virtual ~CTstAppUi(); |
|
328 // from MEikCommandObserver |
|
329 virtual void ProcessCommandL(TInt); |
|
330 // from MEikMenuObserver |
|
331 virtual void RestoreMenuL(CCoeControl*, TInt, TMenuType); |
|
332 virtual void DynInitMenuPaneL(TInt, CEikMenuPane*); |
|
333 virtual void DynInitMenuBarL(TInt, CEikMenuBar*); |
|
334 // from CEikAppUi |
|
335 virtual void ConstructL(); |
|
336 virtual TBool ProcessCommandParametersL(TApaCommand, TFileName& aDocumentName, const TDesC8&); |
|
337 virtual TBool ProcessCommandParametersL(CApaCommandLine& aCommandLine); |
|
338 virtual void HandleCommandL(TInt aCommand); |
|
339 virtual void OpenFileL(const TDesC&); |
|
340 virtual void CreateFileL(const TDesC&); |
|
341 private: |
|
342 CTstControl* iControl; |
|
343 }; |
|
344 |
|
345 CTstAppUi* CTstAppUi::NewL() |
|
346 { // static |
|
347 return new(ELeave) CTstAppUi; |
|
348 } |
|
349 |
|
350 CTstAppUi::~CTstAppUi() |
|
351 { |
|
352 delete iControl; |
|
353 } |
|
354 |
|
355 void CTstAppUi::ProcessCommandL(TInt) |
|
356 { |
|
357 User::Invariant(); |
|
358 } |
|
359 |
|
360 void CTstAppUi::RestoreMenuL(CCoeControl*, TInt, TMenuType) |
|
361 { |
|
362 User::Invariant(); |
|
363 } |
|
364 |
|
365 void CTstAppUi::DynInitMenuPaneL(TInt, CEikMenuPane*) |
|
366 { |
|
367 User::Invariant(); |
|
368 } |
|
369 |
|
370 void CTstAppUi::DynInitMenuBarL(TInt, CEikMenuBar*) |
|
371 { |
|
372 User::Invariant(); |
|
373 } |
|
374 |
|
375 void CTstAppUi::ConstructL() |
|
376 { |
|
377 BaseConstructL(ENoAppResourceFile|ENoScreenFurniture); |
|
378 iControl=CTstControl::NewL(); |
|
379 } |
|
380 |
|
381 TBool CTstAppUi::ProcessCommandParametersL(TApaCommand, TFileName& aDocumentName, const TDesC8&) |
|
382 { |
|
383 aDocumentName.SetLength(0); |
|
384 return EFalse; |
|
385 } |
|
386 |
|
387 TBool CTstAppUi::ProcessCommandParametersL(CApaCommandLine&) |
|
388 { |
|
389 gCallMadeToNewOverload_ProcessCommandParametersL=ETrue; |
|
390 iControl->DrawNow(); |
|
391 return ETrue; |
|
392 } |
|
393 |
|
394 void CTstAppUi::HandleCommandL(TInt aCommand) |
|
395 { |
|
396 switch (aCommand) |
|
397 { |
|
398 case EEikCmdExit: |
|
399 Exit(); |
|
400 break; |
|
401 default: |
|
402 User::Invariant(); |
|
403 } |
|
404 } |
|
405 |
|
406 void CTstAppUi::OpenFileL(const TDesC&) |
|
407 { |
|
408 User::Invariant(); |
|
409 } |
|
410 |
|
411 void CTstAppUi::CreateFileL(const TDesC&) |
|
412 { |
|
413 User::Invariant(); |
|
414 } |
|
415 |
|
416 // CTstDocument |
|
417 |
|
418 class CTstDocument : public CEikDocument |
|
419 { |
|
420 public: |
|
421 static CTstDocument* NewL(CEikApplication& aApplication); |
|
422 inline CTstAppUi* TstAppUi() {return STATIC_CAST(CTstAppUi*, iAppUi);} |
|
423 private: |
|
424 inline CTstDocument(CEikApplication& aApplication) :CEikDocument(aApplication) {} |
|
425 // from CApaDocument |
|
426 virtual CFileStore* CreateFileStoreLC(RFs&, const TDesC&); |
|
427 virtual void EditL(MApaEmbeddedDocObserver*, TBool); |
|
428 virtual void PrintL(const CStreamStore&); |
|
429 virtual void SaveL(); |
|
430 virtual void StoreL(CStreamStore&, CStreamDictionary&) const; |
|
431 // from CEikDocument |
|
432 virtual CEikAppUi* CreateAppUiL(); |
|
433 virtual CFileStore* OpenFileL(TBool aDoOpen, const TDesC& aFileName, RFs& aFsSession); |
|
434 virtual void OpenFileL(CFileStore*& aFileStore, RFile& aFile); |
|
435 virtual void UpdateTaskNameL(CApaWindowGroupName* aWindowGroupName); |
|
436 }; |
|
437 |
|
438 CTstDocument* CTstDocument::NewL(CEikApplication& aApplication) |
|
439 { // static |
|
440 return new(ELeave) CTstDocument(aApplication); |
|
441 } |
|
442 |
|
443 CFileStore* CTstDocument::CreateFileStoreLC(RFs&, const TDesC&) |
|
444 { |
|
445 User::Invariant(); |
|
446 return NULL; |
|
447 } |
|
448 |
|
449 void CTstDocument::EditL(MApaEmbeddedDocObserver*, TBool) |
|
450 { |
|
451 User::Invariant(); |
|
452 } |
|
453 |
|
454 void CTstDocument::PrintL(const CStreamStore&) |
|
455 { |
|
456 User::Invariant(); |
|
457 } |
|
458 |
|
459 void CTstDocument::SaveL() |
|
460 { |
|
461 SetChanged(EFalse); |
|
462 } |
|
463 |
|
464 void CTstDocument::StoreL(CStreamStore&, CStreamDictionary&) const |
|
465 { |
|
466 User::Invariant(); |
|
467 } |
|
468 |
|
469 CEikAppUi* CTstDocument::CreateAppUiL() |
|
470 { |
|
471 return CTstAppUi::NewL(); |
|
472 } |
|
473 |
|
474 CFileStore* CTstDocument::OpenFileL(TBool aDoOpen, const TDesC& aFileName, RFs& aFsSession) |
|
475 { |
|
476 if (!aDoOpen) |
|
477 { |
|
478 User::Leave(KErrNotSupported); |
|
479 } |
|
480 gFileNameWithoutDriveOrPath=TParsePtrC(aFileName).NameAndExt(); |
|
481 RFile file; |
|
482 CleanupClosePushL(file); |
|
483 APPFWK_NEGATIVE_PLATSEC_START; |
|
484 gErrorWhenOpeningFile=file.Open(aFsSession, aFileName, EFileShareReadersOnly|EFileStream|EFileRead); |
|
485 APPFWK_NEGATIVE_PLATSEC_FINISH; |
|
486 if (gErrorWhenOpeningFile==KErrNone) |
|
487 { |
|
488 User::LeaveIfError(file.Read(gBufferFromFile)); |
|
489 } |
|
490 CleanupStack::PopAndDestroy(&file); |
|
491 gTransactionType=ETransactionType_filePassedByName; |
|
492 TstAppUi()->Control()->DrawNow(); |
|
493 return NULL; |
|
494 } |
|
495 |
|
496 void CTstDocument::OpenFileL(CFileStore*& aFileStore, RFile& aFile) |
|
497 { |
|
498 User::LeaveIfError(aFile.Name(gFileNameWithoutDriveOrPath)); |
|
499 User::LeaveIfError(aFile.Read(gBufferFromFile)); |
|
500 gTransactionType=ETransactionType_filePassedByHandle; |
|
501 TstAppUi()->Control()->DrawNow(); |
|
502 aFileStore=NULL; |
|
503 } |
|
504 |
|
505 void CTstDocument::UpdateTaskNameL(CApaWindowGroupName* aWindowGroupName) |
|
506 { |
|
507 CEikDocument::UpdateTaskNameL(aWindowGroupName); |
|
508 } |
|
509 |
|
510 // CTstApplication |
|
511 |
|
512 class CTstApplication : public CEikApplication |
|
513 { |
|
514 public: |
|
515 static CTstApplication* New(); |
|
516 private: |
|
517 inline CTstApplication() {} |
|
518 // from CApaApplication |
|
519 virtual TUid AppDllUid() const; |
|
520 virtual CDictionaryStore* OpenIniFileLC(RFs&) const; |
|
521 // from CEikApplication |
|
522 virtual void GetDefaultDocumentFileName(TFileName& aDocumentName) const; |
|
523 virtual TFileName BitmapStoreName() const; |
|
524 virtual TFileName ResourceFileName() const; |
|
525 virtual CApaDocument* CreateDocumentL(); |
|
526 virtual void NewAppServerL(CApaAppServer*& aAppServer); |
|
527 }; |
|
528 |
|
529 CTstApplication* CTstApplication::New() |
|
530 { // static |
|
531 return new CTstApplication; |
|
532 } |
|
533 |
|
534 TUid CTstApplication::AppDllUid() const |
|
535 { |
|
536 return TUid::Uid(0x10207f92); |
|
537 } |
|
538 |
|
539 CDictionaryStore* CTstApplication::OpenIniFileLC(RFs&) const |
|
540 { |
|
541 return NULL; // must not leave anything on the clean-up stack if it returns NULL |
|
542 } |
|
543 |
|
544 void CTstApplication::GetDefaultDocumentFileName(TFileName& aDocumentName) const |
|
545 { |
|
546 aDocumentName.SetLength(0); |
|
547 } |
|
548 |
|
549 TFileName CTstApplication::BitmapStoreName() const |
|
550 { |
|
551 return KNullDesC(); |
|
552 } |
|
553 |
|
554 TFileName CTstApplication::ResourceFileName() const |
|
555 { |
|
556 return KNullDesC(); |
|
557 } |
|
558 |
|
559 CApaDocument* CTstApplication::CreateDocumentL() // must return non-NULL |
|
560 { |
|
561 return CTstDocument::NewL(*this); |
|
562 } |
|
563 |
|
564 void CTstApplication::NewAppServerL(CApaAppServer*& aAppServer) |
|
565 { |
|
566 // this doesn't get called by the framework as we're not launching the server via the server-differentiator in CApaCommandLine, we launching the server as a fixed-name server so we have to call this function ourselves instead |
|
567 CEikApplication::NewAppServerL(aAppServer); |
|
568 } |
|
569 |
|
570 // stand-alone functions |
|
571 |
|
572 LOCAL_C CApaApplication* NewApplication() |
|
573 { |
|
574 return CTstApplication::New(); |
|
575 } |
|
576 |
|
577 GLDEF_C TInt E32Main() |
|
578 { |
|
579 return EikStart::RunApplication(NewApplication); |
|
580 } |
|
581 |