16 * |
16 * |
17 */ |
17 */ |
18 |
18 |
19 #include <AknQueryDialog.h> |
19 #include <AknQueryDialog.h> |
20 #include "secuicodequerydialog.h" |
20 #include "secuicodequerydialog.h" |
|
21 #include <eikseced.h> |
|
22 #include "SecUiCodeQueryControl.h" |
|
23 #include "secui.hrh" |
|
24 #include <SecUi.rsg> |
|
25 #include <aknsoundsystem.h> |
|
26 #include <aknappui.h> |
|
27 #include <AknIncallBubbleNotify.h> |
21 |
28 |
22 // ================= MEMBER FUNCTIONS ======================= |
29 // ================= MEMBER FUNCTIONS ======================= |
23 // |
30 // |
24 // ---------------------------------------------------------- |
31 // ---------------------------------------------------------- |
25 // CCodeQueryDialog::CCodeQueryDialog() |
32 // CCodeQueryDialog::CCodeQueryDialog() |
26 // C++ constructor |
33 // C++ constructor |
27 // ---------------------------------------------------------- |
34 // ---------------------------------------------------------- |
28 // |
35 // |
29 EXPORT_C CCodeQueryDialog::CCodeQueryDialog(TDes& aDataText,TInt aMinLength,TInt aMaxLength,TInt aMode, TBool aIsRemoteLockQuery) : CBase() |
36 EXPORT_C CCodeQueryDialog::CCodeQueryDialog(TDes& aDataText,TInt aMinLength,TInt aMaxLength,TInt aMode, TBool aIsRemoteLockQuery): |
|
37 CAknTextQueryDialog(aDataText,ENoTone), iMinLength(aMinLength), iMaxLength(aMaxLength), iMode(aMode), iIsRemoteLockQuery(aIsRemoteLockQuery) |
|
38 |
30 { |
39 { |
31 } |
40 } |
32 // |
41 // |
33 // ---------------------------------------------------------- |
42 // ---------------------------------------------------------- |
34 // CCodeQueryDialog::~CodeQueryDialog() |
43 // CCodeQueryDialog::~CodeQueryDialog() |
35 // Destructor |
44 // Destructor |
36 // ---------------------------------------------------------- |
45 // ---------------------------------------------------------- |
37 // |
46 // |
38 CCodeQueryDialog::~CCodeQueryDialog() |
47 CCodeQueryDialog::~CCodeQueryDialog() |
39 { |
48 { |
40 } |
49 #if defined(_DEBUG) |
|
50 RDebug::Print(_L("(SECUI)CCodeQueryDialog::~CCodeQueryDialog()")); |
|
51 #endif |
|
52 |
|
53 if ( AknLayoutUtils::PenEnabled() ) |
|
54 { |
|
55 TRAP_IGNORE ( SetIncallBubbleAllowedInUsualL( ETrue ) ); |
|
56 } |
|
57 |
|
58 if (iFront) |
|
59 { |
|
60 // uncapture keys |
|
61 if (iMode != ESecUiNone) |
|
62 { |
|
63 RWindowGroup& groupWin=iCoeEnv->RootWin(); |
|
64 groupWin.CancelCaptureKeyUpAndDowns(iAppKey); |
|
65 groupWin.CancelCaptureKeyUpAndDowns(iVoiceKey2); |
|
66 groupWin.CancelCaptureKey(iVoiceKey1); |
|
67 } |
|
68 |
|
69 CAknAppUi* aknappui =static_cast<CAknAppUi*>(iEikonEnv->EikAppUi()); |
|
70 |
|
71 if(!iIsRemoteLockQuery) |
|
72 { |
|
73 // return normal high-priority in case there are other notifiers active |
|
74 // and were are not going to lose foregroung right after following call |
|
75 if (!aknappui->IsFullScreenApp())//check that we are autolock and not a "normal" i.e. full screen application. |
|
76 iEikonEnv->RootWin().SetOrdinalPosition(0,ECoeWinPriorityAlwaysAtFront); |
|
77 } |
|
78 |
|
79 |
|
80 iEikonEnv->BringForwards(EFalse); |
|
81 iEikonEnv->EikAppUi()->RemoveFromStack(this); |
|
82 aknappui->KeySounds()->ReleaseContext(); |
|
83 aknappui->KeySounds()->PopContext(); |
|
84 iFront = EFalse; |
|
85 } |
|
86 #if defined(_DEBUG) |
|
87 RDebug::Print(_L("(SECUI)CCodeQueryDialog::~CCodeQueryDialog() END")); |
|
88 #endif |
|
89 } |
|
90 // |
|
91 // ---------------------------------------------------------- |
|
92 // CCodeQueryDialog::PreLayoutDynInitL() |
|
93 // Called by framework before dialog is shown |
|
94 // ---------------------------------------------------------- |
|
95 // |
|
96 void CCodeQueryDialog::PreLayoutDynInitL() |
|
97 { |
|
98 CAknTextQueryDialog::PreLayoutDynInitL(); |
|
99 |
|
100 //disable in call bubble. |
|
101 if ( AknLayoutUtils::PenEnabled() ) |
|
102 { |
|
103 SetIncallBubbleAllowedInUsualL( EFalse ); |
|
104 } |
|
105 |
|
106 SetMaxLength(iMaxLength); |
|
107 // Add this higher than the environment filter, otherwise |
|
108 // we cannot capture keys from the EikSrvUi KeyFilter. |
|
109 // Used because this query might be called from notifier |
|
110 if (iMode == ESecUiNone) |
|
111 { |
|
112 iEikonEnv->EikAppUi()->AddToStackL(this,ECoeStackPriorityEnvironmentFilter+100,ECoeStackFlagRefusesAllKeys); |
|
113 } |
|
114 else |
|
115 { |
|
116 iEikonEnv->EikAppUi()->AddToStackL(this,ECoeStackPriorityEnvironmentFilter+100,ECoeStackFlagRefusesFocus); |
|
117 } |
|
118 |
|
119 // capture app,voice and end keys if necessary |
|
120 if (iMode != ESecUiNone) |
|
121 { |
|
122 |
|
123 RWindowGroup& groupWin=iCoeEnv->RootWin(); |
|
124 // Capture app key |
|
125 iAppKey = groupWin.CaptureKeyUpAndDowns(EStdKeyApplication0, 0, 0); |
|
126 // capture voice key |
|
127 iVoiceKey1 = groupWin.CaptureKey(EKeySide,0,0); |
|
128 iVoiceKey2 = groupWin.CaptureKeyUpAndDowns(EStdKeyDevice6, 0, 0); |
|
129 } |
|
130 if (!iIsRemoteLockQuery) |
|
131 { |
|
132 MakeLeftSoftkeyVisible(EFalse); |
|
133 |
|
134 RWsSession& wsSession = iEikonEnv->WsSession(); |
|
135 TInt myWgId = iEikonEnv->RootWin().Identifier(); |
|
136 |
|
137 TInt wgPrio = wsSession.GetWindowGroupOrdinalPriority(myWgId); |
|
138 // we are already on forgeround, need to update priority differently |
|
139 /* |
|
140 if (wgPrio == ECoeWinPriorityAlwaysAtFront) |
|
141 { |
|
142 iEikonEnv->RootWin().SetOrdinalPosition(0,ECoeWinPriorityAlwaysAtFront+1); |
|
143 } |
|
144 */ |
|
145 |
|
146 // this must be done always to keep the reference count in synch |
|
147 // this does not have any effect if autoforwarding has not been set true (normal application.) |
|
148 iEikonEnv->BringForwards(ETrue, ECoeWinPriorityAlwaysAtFront + 1); |
|
149 |
|
150 /// -- Change Window Priority for dialog and CBA |
|
151 DrawableWindow()->SetOrdinalPosition(0, ECoeWinPriorityAlwaysAtFront); // |
|
152 ButtonGroupContainer().ButtonGroup()->AsControl()->DrawableWindow()->SetOrdinalPosition( |
|
153 0, ECoeWinPriorityAlwaysAtFront); |
|
154 } |
|
155 |
|
156 //key sounds |
|
157 static_cast<CAknAppUi*>(iEikonEnv->EikAppUi())->KeySounds()->PushContextL(R_AVKON_DEFAULT_SKEY_LIST); |
|
158 static_cast<CAknAppUi*>(iEikonEnv->EikAppUi())->KeySounds()->BringToForeground(); |
|
159 static_cast<CAknAppUi*>(iEikonEnv->EikAppUi())->KeySounds()->LockContext(); |
|
160 iFront = ETrue; |
|
161 |
|
162 } |
|
163 // |
|
164 // --------------------------------------------------------- |
|
165 // CCodeQueryDialog::OfferKeyEventL |
|
166 // called by framework when any key is pressed |
|
167 // --------------------------------------------------------- |
|
168 // |
|
169 TKeyResponse CCodeQueryDialog::OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType) |
|
170 { |
|
171 #if defined(_DEBUG) |
|
172 RDebug::Print(_L("(SECUI)CCodeQueryDialog::OfferKeyEventL")); |
|
173 TInt keycode = aKeyEvent.iCode; |
|
174 RDebug::Print(_L("(SECUI)CCodeQueryDialog::OfferKeyEventL keycode: %d"), keycode); |
|
175 TInt scancode = aKeyEvent.iScanCode; |
|
176 RDebug::Print(_L("(SECUI)CCodeQueryDialog::OfferKeyEventL scancode: %d"), scancode); |
|
177 #endif |
|
178 if(!iIsRemoteLockQuery) |
|
179 { |
|
180 // '#' key |
|
181 if( aKeyEvent.iScanCode == EStdKeyHash && aType == EEventKeyUp) |
|
182 { |
|
183 TryExitL(EEikBidOk); |
|
184 return EKeyWasConsumed; |
|
185 } |
|
186 |
|
187 // '*' key |
|
188 if (aKeyEvent.iCode == '*') |
|
189 { |
|
190 return EKeyWasConsumed; |
|
191 } |
|
192 |
|
193 } |
|
194 |
|
195 // app key |
|
196 if (aKeyEvent.iScanCode == EStdKeyApplication0) |
|
197 { |
|
198 if (iMode == ESecUiNone) |
|
199 { |
|
200 TryExitL(EAknSoftkeyCancel); |
|
201 return EKeyWasNotConsumed; |
|
202 } |
|
203 return EKeyWasConsumed; |
|
204 } |
|
205 |
|
206 // end key |
|
207 if (aKeyEvent.iCode == EKeyPhoneEnd) |
|
208 { |
|
209 #if defined(_DEBUG) |
|
210 RDebug::Print(_L("(SECUI)CCodeQueryDialog::OfferKeyEventL: EKeyPhoneEnd")); |
|
211 #endif |
|
212 TryExitL(EAknSoftkeyCancel); |
|
213 return EKeyWasConsumed; |
|
214 } |
|
215 if ((aKeyEvent.iScanCode == EStdKeyYes)) |
|
216 {//Since dialler listens to down/up event, |
|
217 //have to consume those to prevent it from opening |
|
218 if(AknLayoutUtils::PenEnabled()) |
|
219 { |
|
220 CCodeQueryControl* control = STATIC_CAST(CCodeQueryControl*,Control(EGeneralQuery)); |
|
221 if(!control->IsEmergencyCallSupportOn()) |
|
222 { //Only needed in dialogs where there is no emergency call support |
|
223 #if defined(_DEBUG) |
|
224 RDebug::Print(_L("(SECUI)CCodeQueryDialog::OfferKeyEventL: Send down/up event consumed.")); |
|
225 #endif |
|
226 return EKeyWasConsumed; |
|
227 } |
|
228 } |
|
229 } |
|
230 if (aKeyEvent.iCode == EKeyPhoneSend) |
|
231 { |
|
232 #if defined(_DEBUG) |
|
233 RDebug::Print(_L("(SECUI)CCodeQueryDialog::OfferKeyEventL: EKeyPhoneSend")); |
|
234 #endif |
|
235 if(AknLayoutUtils::PenEnabled()) |
|
236 { |
|
237 #if defined(_DEBUG) |
|
238 RDebug::Print(_L("(SECUI)CCodeQueryDialog::OfferKeyEventL: pen enabled")); |
|
239 #endif |
|
240 CCodeQueryControl* control = STATIC_CAST(CCodeQueryControl*,Control(EGeneralQuery)); |
|
241 if(control->IsEmergencyCallSupportOn()) |
|
242 { |
|
243 #if defined(_DEBUG) |
|
244 RDebug::Print(_L("(SECUI)CCodeQueryDialog::OfferKeyEventL: ECS on")); |
|
245 #endif |
|
246 if(!control->IsEmergencyNumber()) |
|
247 { |
|
248 #if defined(_DEBUG) |
|
249 RDebug::Print(_L("(SECUI)CCodeQueryDialog::OfferKeyEventL: Not E number!")); |
|
250 #endif |
|
251 |
|
252 ShowWarningNoteL(); |
|
253 |
|
254 #if defined(_DEBUG) |
|
255 RDebug::Print(_L("(SECUI)CCodeQueryDialog::OfferKeyEventL: send key consumed!")); |
|
256 #endif |
|
257 return EKeyWasConsumed; |
|
258 } |
|
259 } |
|
260 else //consume the key to prevent dialler from opening |
|
261 { |
|
262 #if defined(_DEBUG) |
|
263 RDebug::Print(_L("(SECUI)CCodeQueryDialog::OfferKeyEventL: No ECS. send key consumed!")); |
|
264 #endif |
|
265 return EKeyWasConsumed; |
|
266 } |
|
267 } |
|
268 } |
|
269 #if defined(_DEBUG) |
|
270 RDebug::Print(_L("(SECUI)CCodeQueryDialog::OfferKeyEventL: To AVKON")); |
|
271 #endif |
|
272 return CAknTextQueryDialog::OfferKeyEventL(aKeyEvent,aType); |
|
273 } |
|
274 // |
|
275 // --------------------------------------------------------- |
|
276 // CCodeQueryDialog::NeedToDismissQueryL() |
|
277 // Handles '#' key called by CAknTextQueryDialog::OfferKeyEventL() |
|
278 // --------------------------------------------------------- |
|
279 // |
|
280 TBool CCodeQueryDialog::NeedToDismissQueryL(const TKeyEvent& /*aKeyEvent*/) |
|
281 { |
|
282 return EFalse; |
|
283 } |
|
284 // |
|
285 // --------------------------------------------------------- |
|
286 // CCodeQueryDialog::OkToExitL() |
|
287 // called by framework when the Softkey is pressed |
|
288 // --------------------------------------------------------- |
|
289 // |
|
290 TBool CCodeQueryDialog::OkToExitL(TInt aButtonId) |
|
291 { |
|
292 #if defined(_DEBUG) |
|
293 RDebug::Print(_L("(SECUI)CCodeQueryDialog::OkToExitL:%d"), aButtonId); |
|
294 #endif |
|
295 CCodeQueryControl* control = STATIC_CAST(CCodeQueryControl*,Control(EGeneralQuery)); |
|
296 TInt lenght = 0; |
|
297 TBool returnvalue; |
|
298 switch(aButtonId) |
|
299 { |
|
300 case EAknSoftkeyOk: |
|
301 #if defined(_DEBUG) |
|
302 RDebug::Print(_L("(SECUI)CCodeQueryDialog::OkToExitL:EAknSoftkeyOk")); |
|
303 #endif |
|
304 if(control) |
|
305 { |
|
306 lenght = control->GetTextLength(); |
|
307 } |
|
308 if (lenght < iMinLength) |
|
309 { |
|
310 #if defined(_DEBUG) |
|
311 RDebug::Print(_L("(SECUI)CCodeQueryDialog::OkToExitL:length < MIN: %d"), lenght); |
|
312 #endif |
|
313 // code was too short -> play error tone & clear editor |
|
314 if (lenght != 0) |
|
315 { |
|
316 #if defined(_DEBUG) |
|
317 RDebug::Print(_L("(SECUI)CCodeQueryDialog::OkToExitL:length < MIN, Play Sound")); |
|
318 #endif |
|
319 if(control) |
|
320 { |
|
321 |
|
322 control->PlaySound(EAvkonSIDErrorTone); |
|
323 #if defined(_DEBUG) |
|
324 RDebug::Print(_L("(SECUI)CCodeQueryDialog::OkToExitL:length < MIN, Reset Editor")); |
|
325 #endif |
|
326 control->ResetEditorL(); |
|
327 } |
|
328 } |
|
329 returnvalue = EFalse; |
|
330 } |
|
331 else |
|
332 { |
|
333 #if defined(_DEBUG) |
|
334 RDebug::Print(_L("(SECUI)CCodeQueryDialog::OkToExitL:length >= MIN: %d"), lenght); |
|
335 #endif |
|
336 returnvalue = CAknTextQueryDialog::OkToExitL(aButtonId); |
|
337 } |
|
338 break; |
|
339 |
|
340 case EEikBidCancel: //Also includes EAknSoftkeyCancel as they have the same numerical value |
|
341 #if defined(_DEBUG) |
|
342 RDebug::Print(_L("(SECUI)CCodeQueryDialog::OkToExitL:EEikBidCancel")); |
|
343 #endif |
|
344 if(iMode != ESecUiNone) //PUK1 code or PIN1 in boot. Must not exit until code has been input. |
|
345 { |
|
346 #if defined(_DEBUG) |
|
347 RDebug::Print(_L("(SECUI)CCodeQueryDialog::OkToExitL:EEikBidCancel: get length.")); |
|
348 #endif |
|
349 if(control) |
|
350 { |
|
351 lenght = control->GetTextLength(); |
|
352 } |
|
353 returnvalue = EFalse; |
|
354 if (lenght > 0) //reset editor |
|
355 { |
|
356 #if defined(_DEBUG) |
|
357 RDebug::Print(_L("(SECUI)CCodeQueryDialog::OkToExitL:EEikBidCancel: length >0.")); |
|
358 #endif |
|
359 if (control) |
|
360 { |
|
361 #if defined(_DEBUG) |
|
362 RDebug::Print(_L("(SECUI)CCodeQueryDialog::OkToExitL:EEikBidCancel, reset editor")); |
|
363 #endif |
|
364 control->ResetEditorL(); |
|
365 } |
|
366 } |
|
367 } |
|
368 else |
|
369 returnvalue = ETrue; |
|
370 break; |
|
371 case ESecUiEmergencyCall: //user has called emergency number from dialog; exit. |
|
372 #if defined(_DEBUG) |
|
373 RDebug::Print(_L("(SECUI)CCodeQueryDialog::OkToExitL:Emergency Call")); |
|
374 #endif |
|
375 returnvalue = ETrue; |
|
376 break; |
|
377 case EAknSoftkeyEmergencyCall: |
|
378 returnvalue = ETrue; |
|
379 CAknTextQueryDialog::OkToExitL(aButtonId); |
|
380 break; |
|
381 case ESecUiDeviceLocked: //Dialog was left open when Device lock was activated by timer and must be closed. |
|
382 #if defined(_DEBUG) |
|
383 RDebug::Print(_L("(SECUI)CCodeQueryDialog::OkToExitL:Phone Locked")); |
|
384 #endif |
|
385 if(iMode == ESecUiNone) |
|
386 returnvalue = ETrue;//Not a PUK1 code query. |
|
387 else |
|
388 returnvalue = EFalse; |
|
389 break; |
|
390 default: |
|
391 #if defined(_DEBUG) |
|
392 RDebug::Print(_L("(SECUI)CCodeQueryDialog::OkToExitL:DEFAULT!")); |
|
393 #endif |
|
394 if(iMode == ESecUiNone) |
|
395 returnvalue = ETrue; |
|
396 else |
|
397 returnvalue = EFalse; |
|
398 break; |
|
399 } |
|
400 #if defined(_DEBUG) |
|
401 RDebug::Print(_L("(SECUI)CCodeQueryDialog::OkToExitL:END: %d"), returnvalue); |
|
402 #endif |
|
403 return returnvalue; |
|
404 } |
|
405 // |
|
406 // --------------------------------------------------------- |
|
407 // CCodeQueryDialog::HandleQueryEditorStateEventL() |
|
408 // Gets called when editor sends state event |
|
409 // --------------------------------------------------------- |
|
410 // |
|
411 TBool CCodeQueryDialog::HandleQueryEditorStateEventL(CAknQueryControl* aQueryControl, |
|
412 TQueryControlEvent aEventType, |
|
413 TQueryValidationStatus aStatus) |
|
414 { |
|
415 |
|
416 if (aEventType == MAknQueryControlObserver::EEmergencyCallAttempted) |
|
417 { |
|
418 TryExitL(ESecUiEmergencyCall); |
|
419 return EFalse; |
|
420 } |
|
421 else |
|
422 { |
|
423 return CAknQueryDialog::HandleQueryEditorStateEventL(aQueryControl, aEventType, aStatus ); |
|
424 } |
|
425 |
|
426 |
|
427 } |
|
428 // |
|
429 // --------------------------------------------------------- |
|
430 // CCodeQueryDialog::TryCancelQueryL() |
|
431 // Gets called when a client wishes to cancel the query |
|
432 // --------------------------------------------------------- |
|
433 // |
|
434 void CCodeQueryDialog::TryCancelQueryL(TInt aReason) |
|
435 { |
|
436 #if defined(_DEBUG) |
|
437 RDebug::Print(_L("(SECUI)CCodeQueryDialog::TryCancelQuery BEGIN")); |
|
438 #endif |
|
439 TryExitL(aReason); |
|
440 #if defined(_DEBUG) |
|
441 RDebug::Print(_L("(SECUI)CCodeQueryDialog::TryCancelQuery END")); |
|
442 #endif |
|
443 } |
|
444 |
|
445 // ----------------------------------------------------------------------------- |
|
446 // CCodeQueryDialog::CheckIfEntryTextOk() |
|
447 // ----------------------------------------------------------------------------- |
|
448 // |
|
449 TBool CCodeQueryDialog::CheckIfEntryTextOk() const |
|
450 { |
|
451 CCodeQueryControl* control = STATIC_CAST(CCodeQueryControl*,Control(EGeneralQuery)); |
|
452 if (control) |
|
453 { |
|
454 control->GetText(iDataText); |
|
455 } |
|
456 const TInt textLength = Text().Length(); |
|
457 return (textLength <= iMaxLength && textLength >= iMinLength); |
|
458 } |
|
459 |
|
460 // ----------------------------------------------------------------------------- |
|
461 // CCTPinQueryDialog::UpdateLeftSoftKeyL() |
|
462 // ----------------------------------------------------------------------------- |
|
463 // |
|
464 void CCodeQueryDialog::UpdateLeftSoftKeyL() |
|
465 { |
|
466 CAknTextQueryDialog::UpdateLeftSoftKeyL(); |
|
467 if(iIsRemoteLockQuery) |
|
468 MakeLeftSoftkeyVisible(CheckIfEntryTextOk()); |
|
469 } |
|
470 // ----------------------------------------------------------------------------- |
|
471 // CCodeQueryDialog::ShowWarningNoteL() |
|
472 // ----------------------------------------------------------------------------- |
|
473 // |
|
474 void CCodeQueryDialog::ShowWarningNoteL() |
|
475 { |
|
476 #if defined(_DEBUG) |
|
477 RDebug::Print(_L("(SECUI)CCodeQueryDialog::ShowWarningNoteL BEGIN")); |
|
478 #endif |
|
479 |
|
480 CAknNoteDialog* noteDlg = new (ELeave) CAknNoteDialog(); |
|
481 noteDlg->PrepareLC(R_EMERGENCY_CALLS_ONLY); |
|
482 noteDlg->SetTimeout(CAknNoteDialog::ELongTimeout); |
|
483 noteDlg->SetTone(CAknNoteDialog::EErrorTone); |
|
484 |
|
485 noteDlg->DrawableWindow()->SetOrdinalPosition(0,ECoeWinPriorityAlwaysAtFront+1); // |
|
486 noteDlg->ButtonGroupContainer().ButtonGroup()->AsControl()->DrawableWindow()->SetOrdinalPosition(0,ECoeWinPriorityAlwaysAtFront+1); |
|
487 |
|
488 noteDlg->RunLD(); |
|
489 #if defined(_DEBUG) |
|
490 RDebug::Print(_L("(SECUI)CCodeQueryDialog::ShowWarningNoteL END")); |
|
491 #endif |
|
492 } |
|
493 |
|
494 // ----------------------------------------------------------------------------- |
|
495 // CCodeQueryDialog::SetIncallBubbleAllowedInUsualL() |
|
496 // ----------------------------------------------------------------------------- |
|
497 // |
|
498 void CCodeQueryDialog::SetIncallBubbleAllowedInUsualL(TBool aAllowed) |
|
499 { |
|
500 CAknIncallBubble *incallBubble = CAknIncallBubble::NewL(); |
|
501 CleanupStack::PushL(incallBubble); |
|
502 incallBubble->SetIncallBubbleAllowedInUsualL( aAllowed ); |
|
503 CleanupStack::PopAndDestroy(); |
|
504 } |
41 |
505 |
42 // End of file |
506 // End of file |
43 |
507 |