|
1 // Copyright (c) 2000-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 // T_PushEntry.CPP |
|
15 // |
|
16 // |
|
17 |
|
18 |
|
19 |
|
20 #include <e32std.h> |
|
21 #include <e32test.h> |
|
22 #include <msvstd.h> |
|
23 #include <msvids.h> |
|
24 #include <msvuids.h> |
|
25 #include <pushentry.h> |
|
26 #include "WPushUtils.h" |
|
27 #include "t_serviceutils.h" |
|
28 #include "pushservermtm.h" |
|
29 |
|
30 |
|
31 |
|
32 _LIT(KPushMtmDatFile, "z:\\system\\mtm\\WapPushMtmU.dat"); |
|
33 |
|
34 |
|
35 // |
|
36 // CTestScheduler: INTERFACE // |
|
37 // |
|
38 class CTestScheduler : public CActiveScheduler |
|
39 { |
|
40 public: |
|
41 void Error(TInt anError) const; |
|
42 }; |
|
43 |
|
44 // |
|
45 // MACRO DEFINTIONS |
|
46 // |
|
47 #define __LOG_ALWAYS(a) {_LIT(name,a); WPLPrintf(name);} |
|
48 |
|
49 #define __LOG_ALWAYS_FORMAT1(a,b) {_LIT(name,a); WPLPrintf(name,b);} |
|
50 #define __LOG_ALWAYS_FORMAT2(a,b,c) {_LIT(name,a); WPLPrintf(name,b,c);} |
|
51 |
|
52 #if defined(_DEBUG) |
|
53 #define __LOG_DEBUG(a) __LOG_ALWAYS(a) |
|
54 #define __LOG_DEBUG_FORMAT1(a,b) __LOG_ALWAYS_FORMAT1(a,b) |
|
55 #define __LOG_DEBUG_FORMAT2(a,b,c) __LOG_ALWAYS_FORMAT2(a,b,c) |
|
56 #define __LOG_MSG_DEBUG(a) iLog.WPLPrintf(a) |
|
57 #else |
|
58 #define __LOG_DEBUG(a) |
|
59 #define __LOG_DEBUG_FORMAT1(a,b) |
|
60 #define __LOG_DEBUG_FORMAT2(a,b,c) |
|
61 #define __LOG_MSG_DEBUG(a) |
|
62 #endif |
|
63 |
|
64 |
|
65 //********************************************************************************** |
|
66 // Global variables |
|
67 |
|
68 RTest gTest(_L("t_PushMessage Test Harness")); |
|
69 LOCAL_D CTestScheduler* gActivescheduler; |
|
70 CMsvSession* gMsvSession; |
|
71 CMsvEntry* gMsvEntry; |
|
72 |
|
73 |
|
74 // CWapPushLog* gWLog; |
|
75 |
|
76 //********************************************************************************** |
|
77 |
|
78 LOCAL_C void WPLPrintf(TRefByValue<const TDesC> aFmt,...) |
|
79 { |
|
80 VA_LIST list; |
|
81 VA_START(list, aFmt); |
|
82 |
|
83 // Print to log file |
|
84 const TInt KWatcherLogBuffer = 256; |
|
85 TBuf<KWatcherLogBuffer> buf; |
|
86 buf.FormatList(aFmt, list); |
|
87 |
|
88 _LIT(KPushLogDir, "push"); |
|
89 _LIT(KPushEntryLogFile, "PushMtmLogging.txt"); |
|
90 // Write to log file |
|
91 RFileLogger::Write(KPushLogDir, KPushEntryLogFile, EFileLoggingModeAppend, buf); |
|
92 |
|
93 // Write to console |
|
94 buf.Append('\n'); |
|
95 gTest.Printf(buf); |
|
96 } |
|
97 |
|
98 // |
|
99 // CExampleScheduler: Implementation // |
|
100 // |
|
101 void CTestScheduler::Error(TInt aError) const |
|
102 { |
|
103 CActiveScheduler::Stop(); |
|
104 gTest.Printf(_L("\nLeave signalled, reason=%d\n"),aError); |
|
105 } |
|
106 // end CExampleScheduler::Error |
|
107 |
|
108 |
|
109 const TInt KMaxEntries = 3; |
|
110 |
|
111 class CWapMtmTester:public CActive, public MMsvSessionObserver |
|
112 { |
|
113 public: |
|
114 enum TTestState{ |
|
115 ECreating, |
|
116 EChanging, |
|
117 EDeleting, |
|
118 EComplete |
|
119 }; |
|
120 static CWapMtmTester* NewL(); |
|
121 ~CWapMtmTester(); |
|
122 void Start(); |
|
123 TMsvId CreateEntryL(); |
|
124 void ChangeEntryL(TMsvId aId); |
|
125 void DeleteEntryL(TMsvId aId); |
|
126 void DisplayEntriesL(const CMsvEntrySelection& selection); |
|
127 void DisplayChildrenL(TMsvId aParent); |
|
128 |
|
129 inline void SetServiceId(TMsvId aID){iServiceId = aID;} |
|
130 |
|
131 |
|
132 void HandleSessionEventL(TMsvSessionEvent /*aEvent*/, TAny* /*aArg1*/, TAny* /*aArg2*/, TAny* /*aArg3*/) {} |
|
133 |
|
134 |
|
135 private: |
|
136 void ConstructL(); |
|
137 CWapMtmTester(); |
|
138 void DoCancel(); |
|
139 void RunL(); |
|
140 TInt RunError(TInt aError); |
|
141 void ReportError(TInt aError); |
|
142 void QueueOperationAsync(TInt aErr); |
|
143 |
|
144 TInt iEntryNo; |
|
145 TTestState iState; |
|
146 TMsvId iServiceId; |
|
147 TMsvEntry iEntry; |
|
148 CMsvSession* iMsvSession; |
|
149 CMsvEntry* iMsvEntry; |
|
150 CMsvEntrySelection* iSelection; |
|
151 CMsvOperation* iOperation; |
|
152 }; |
|
153 |
|
154 CWapMtmTester* CWapMtmTester::NewL() |
|
155 { |
|
156 CWapMtmTester* self =new (ELeave) CWapMtmTester; |
|
157 CleanupStack::PushL(self); |
|
158 self->ConstructL(); |
|
159 CleanupStack::Pop(); |
|
160 return self; |
|
161 } |
|
162 |
|
163 CWapMtmTester::~CWapMtmTester() |
|
164 { |
|
165 Cancel(); |
|
166 delete iSelection; |
|
167 delete iMsvEntry; |
|
168 delete iMsvSession; |
|
169 } |
|
170 |
|
171 |
|
172 void CWapMtmTester::ConstructL() |
|
173 { |
|
174 iSelection = new (ELeave) CMsvEntrySelection; |
|
175 iMsvSession = CMsvSession::OpenSyncL(*this); |
|
176 iMsvEntry = iMsvSession->GetEntryL(KMsvRootIndexEntryId); |
|
177 iEntryNo = 0; |
|
178 CActiveScheduler::Add(this); |
|
179 } |
|
180 |
|
181 CWapMtmTester::CWapMtmTester() |
|
182 :CActive(EPriorityLow) |
|
183 { |
|
184 } |
|
185 |
|
186 |
|
187 void CWapMtmTester::DoCancel() |
|
188 { |
|
189 } |
|
190 |
|
191 void CWapMtmTester::RunL() |
|
192 { |
|
193 if (iStatus.Int() != KErrNone) |
|
194 { |
|
195 ReportError(iStatus.Int()); |
|
196 } |
|
197 TPckgBuf<TPushMTMProgress> progressBuf; |
|
198 switch (iState) |
|
199 { |
|
200 case ECreating: |
|
201 { |
|
202 TInt error=KErrNone; |
|
203 if (iEntryNo != 0) |
|
204 { |
|
205 progressBuf.Copy(iOperation->ProgressL()); |
|
206 error = progressBuf().iError; |
|
207 |
|
208 if (error != KErrNone) |
|
209 { |
|
210 ReportError(error); |
|
211 User::Leave(error); |
|
212 } |
|
213 error = iStatus.Int(); |
|
214 if (error != KErrNone) |
|
215 { |
|
216 ReportError(error); |
|
217 User::Leave(error); |
|
218 } |
|
219 } |
|
220 else |
|
221 { |
|
222 if (iEntryNo <KMaxEntries) |
|
223 { |
|
224 iEntryNo++; |
|
225 CreateEntryL(); |
|
226 } |
|
227 else |
|
228 iState = EComplete; |
|
229 } |
|
230 QueueOperationAsync(error); |
|
231 break; |
|
232 } |
|
233 case EComplete: //finished |
|
234 User::After(10000); |
|
235 Cancel(); |
|
236 CActiveScheduler::Stop(); |
|
237 break; |
|
238 default: |
|
239 break; |
|
240 } |
|
241 |
|
242 } |
|
243 |
|
244 void CWapMtmTester::Start() |
|
245 { |
|
246 iState =ECreating; |
|
247 QueueOperationAsync(KErrNone); |
|
248 } |
|
249 |
|
250 |
|
251 void CWapMtmTester::QueueOperationAsync(TInt aErr) |
|
252 { |
|
253 TRequestStatus* pS = &iStatus; |
|
254 iStatus = KRequestPending; |
|
255 User::RequestComplete(pS, aErr); |
|
256 SetActive(); |
|
257 } |
|
258 |
|
259 |
|
260 TInt CWapMtmTester::RunError(TInt aError) |
|
261 { |
|
262 ReportError(aError); |
|
263 CActiveScheduler::Stop(); |
|
264 return KErrNone; |
|
265 } |
|
266 |
|
267 void CWapMtmTester::ReportError(TInt aError) |
|
268 { |
|
269 __LOG_DEBUG_FORMAT1("Active Scheduler Error %X", aError); |
|
270 } |
|
271 |
|
272 |
|
273 TMsvId CWapMtmTester::CreateEntryL() |
|
274 { |
|
275 iState = ECreating; |
|
276 |
|
277 |
|
278 switch (iEntryNo) |
|
279 { |
|
280 case 0: |
|
281 { |
|
282 iEntry.iType = KUidMsvMessageEntry; |
|
283 iEntry.iDate.HomeTime(); |
|
284 iEntry.iMtm = KUidMtmWapPush; |
|
285 iEntry.iBioType = KUidWapPushMsgSI.iUid; |
|
286 iEntry.iServiceId = iServiceId; |
|
287 iEntry.iDetails.Set( _L("Push MTM Test Msg 1")); |
|
288 iEntry.iDescription.Set(_L("Tests creatings, changing, deleting entries")); |
|
289 |
|
290 // if (iOperation) |
|
291 // { |
|
292 // delete iOperation; |
|
293 // iOperation = NULL; |
|
294 // } |
|
295 } |
|
296 break; |
|
297 case 1: |
|
298 iEntry.iBioType = KUidWapPushMsgSL.iUid; |
|
299 iEntry.iDetails.Set( _L("Push MTM Test Msg 2")); |
|
300 iEntry.iDescription.Set(_L("Second message to store")); |
|
301 // iOperation = iMsvEntry->CreateL(iEntry, iStatus); |
|
302 break; |
|
303 case 2: |
|
304 iEntry.iBioType = 0x000111; |
|
305 iEntry.iDetails.Set(_L("Push Mtm Test Msg 3")); |
|
306 iEntry.iDescription.Set(_L("Another message to store")); |
|
307 break; |
|
308 default: |
|
309 break; |
|
310 } |
|
311 iEntryNo++; |
|
312 iMsvEntry->SetEntryL(iServiceId); |
|
313 CMsvOperationWait* wait=CMsvOperationWait::NewLC(); |
|
314 CMsvOperation* op= iMsvEntry->CreateL(iEntry, wait->iStatus); |
|
315 CleanupStack::PushL(op); |
|
316 wait->Start(); |
|
317 CActiveScheduler::Start(); |
|
318 const TInt err=op->iStatus.Int(); |
|
319 |
|
320 TPckgBuf<TPushMTMProgress> progressBuf; |
|
321 progressBuf.Copy(op->ProgressL()); |
|
322 TPushMTMProgress progress = progressBuf(); |
|
323 TMsvId newEntry = progress.iMsgId; |
|
324 |
|
325 CleanupStack::PopAndDestroy(2); //op, wait |
|
326 User::LeaveIfError(err); |
|
327 User::LeaveIfError(progress.iError); |
|
328 |
|
329 __LOG_DEBUG("*************************************************"); |
|
330 __LOG_DEBUG_FORMAT1("Created Entry %X", newEntry); |
|
331 |
|
332 return newEntry; |
|
333 } |
|
334 |
|
335 |
|
336 void CWapMtmTester::ChangeEntryL(TMsvId aId) |
|
337 { |
|
338 iMsvEntry->SetEntryL(aId); |
|
339 TMsvEntry entry = iMsvEntry->Entry(); |
|
340 entry.iBioType = KUidWapPushMsgUnknown.iUid; |
|
341 TBuf<50> temp; |
|
342 temp.Format(_L("Some random words for %X"), aId); |
|
343 entry.iDetails.Set(temp); |
|
344 entry.iDescription.Set(_L("A changed Push Message ")); |
|
345 |
|
346 CMsvOperationWait* wait=CMsvOperationWait::NewLC(); |
|
347 CMsvOperation* op= iMsvEntry->ChangeL(entry, wait->iStatus); |
|
348 CleanupStack::PushL(op); |
|
349 wait->Start(); |
|
350 CActiveScheduler::Start(); |
|
351 const TInt err=op->iStatus.Int(); |
|
352 |
|
353 TPckgBuf<TPushMTMProgress> progressBuf; |
|
354 progressBuf.Copy(op->ProgressL()); |
|
355 |
|
356 User::LeaveIfError(err); |
|
357 User::LeaveIfError(progressBuf().iError); |
|
358 |
|
359 __LOG_DEBUG("*************************************************"); |
|
360 __LOG_DEBUG_FORMAT1("Changed Entry %X", aId ); |
|
361 CleanupStack::PopAndDestroy(2); //op, wait |
|
362 |
|
363 } |
|
364 |
|
365 |
|
366 void CWapMtmTester::DeleteEntryL(TMsvId aId) |
|
367 { |
|
368 |
|
369 CMsvOperationWait* wait=CMsvOperationWait::NewLC(); |
|
370 iMsvEntry->SetEntryL(aId); |
|
371 iMsvEntry->SetEntryL(iMsvEntry->Entry().Parent()); |
|
372 CMsvOperation* op= iMsvEntry->DeleteL(aId, wait->iStatus); |
|
373 CleanupStack::PushL(op); |
|
374 wait->Start(); |
|
375 CActiveScheduler::Start(); |
|
376 const TInt err=op->iStatus.Int(); |
|
377 |
|
378 TPckgBuf<TPushMTMProgress> progressBuf; |
|
379 progressBuf.Copy(op->ProgressL()); |
|
380 |
|
381 CleanupStack::PopAndDestroy(2); //op, wait |
|
382 User::LeaveIfError(err); |
|
383 User::LeaveIfError(progressBuf().iError); |
|
384 __LOG_DEBUG("*************************************************"); |
|
385 __LOG_DEBUG_FORMAT1("Deleted Entry %X", aId ); |
|
386 |
|
387 } |
|
388 void CWapMtmTester::DisplayEntriesL(const CMsvEntrySelection& selection) |
|
389 { |
|
390 TInt error= KErrNone; |
|
391 |
|
392 for (TInt count=0; count< selection.Count(); count++) |
|
393 { |
|
394 __LOG_DEBUG("*************************************************"); |
|
395 __LOG_DEBUG_FORMAT1("Details of Entry No %d", (count+1) ); |
|
396 |
|
397 TRAP(error, iMsvEntry->SetEntryL(selection.At(count)) ); |
|
398 |
|
399 if (error==KErrNone) |
|
400 { |
|
401 __LOG_DEBUG_FORMAT1("Entry Id %X", iMsvEntry->Entry().Id()); |
|
402 __LOG_DEBUG_FORMAT1("Entry Parent %X", iMsvEntry->Entry().Parent()); |
|
403 __LOG_DEBUG_FORMAT1("Entry Service Id %X", iMsvEntry->Entry().iServiceId); |
|
404 __LOG_DEBUG_FORMAT1("Entry Type %X", iMsvEntry->Entry().iType); |
|
405 __LOG_DEBUG_FORMAT1("Entry MTM %X", iMsvEntry->Entry().iMtm); |
|
406 __LOG_DEBUG_FORMAT1("Entry iBioType %X", iMsvEntry->Entry().iBioType); |
|
407 __LOG_DEBUG_FORMAT1("Entry Details %S", &(iMsvEntry->Entry().iDetails)); |
|
408 __LOG_DEBUG_FORMAT1("Entry Description %S", &(iMsvEntry->Entry().iDescription)); |
|
409 } |
|
410 else |
|
411 { |
|
412 if (error ==KErrNotFound) |
|
413 { |
|
414 __LOG_DEBUG_FORMAT1("Message details for entry %X not available - doesn't exist", selection.At(count)); |
|
415 } |
|
416 else |
|
417 { |
|
418 __LOG_DEBUG_FORMAT1("Server error %d occured ", error); |
|
419 } |
|
420 } |
|
421 } |
|
422 } |
|
423 |
|
424 |
|
425 |
|
426 void CWapMtmTester::DisplayChildrenL(TMsvId aParent) |
|
427 { |
|
428 iMsvEntry->SetEntryL(aParent); |
|
429 CMsvEntrySelection* selection = iMsvEntry->ChildrenL(); |
|
430 CleanupStack::PushL(selection); |
|
431 |
|
432 if (selection->Count() ==0) |
|
433 { |
|
434 __LOG_DEBUG("*************************************************"); |
|
435 __LOG_DEBUG_FORMAT1("No children for entry %d", aParent ); |
|
436 return; |
|
437 |
|
438 } |
|
439 __LOG_DEBUG("*************************************************"); |
|
440 __LOG_DEBUG_FORMAT1("Details for children for entry %X", aParent ); |
|
441 for (TInt count = 0; count<selection->Count(); count++) |
|
442 { |
|
443 iMsvEntry->SetEntryL(selection->At(count)); |
|
444 |
|
445 __LOG_DEBUG_FORMAT1("Details of Entry No %d", (count+1) ); |
|
446 __LOG_DEBUG_FORMAT1("Entry Id %d", iMsvEntry->Entry().Id()); |
|
447 __LOG_DEBUG_FORMAT1("Entry Parent %X", iMsvEntry->Entry().Parent()); |
|
448 __LOG_DEBUG_FORMAT1("Entry Service Id %X", iMsvEntry->Entry().iServiceId); |
|
449 __LOG_DEBUG_FORMAT1("Entry Type %X", iMsvEntry->Entry().iType); |
|
450 __LOG_DEBUG_FORMAT1("Entry MTM %X", iMsvEntry->Entry().iMtm); |
|
451 __LOG_DEBUG_FORMAT1("Entry iBioType %X", iMsvEntry->Entry().iBioType); |
|
452 __LOG_DEBUG_FORMAT1("Entry Details %S", &(iMsvEntry->Entry().iDetails)); |
|
453 __LOG_DEBUG_FORMAT1("Entry Description %S", &(iMsvEntry->Entry().iDescription)); |
|
454 } |
|
455 CleanupStack::PopAndDestroy(); |
|
456 } |
|
457 |
|
458 |
|
459 |
|
460 |
|
461 LOCAL_C void InitTestUtils() |
|
462 { |
|
463 // Setup test console |
|
464 gTest.Start(_L("CPushEntry classes")); |
|
465 gTest.Printf(_L("@SYMTestCaseID IWS-WAPBROWSER-PUSHMTM-T_PUSHMTM-0001 ")); |
|
466 |
|
467 gTest.Console()->ClearScreen(); |
|
468 |
|
469 gActivescheduler = new CTestScheduler; |
|
470 gTest(gActivescheduler!=NULL); |
|
471 CActiveScheduler::Install(gActivescheduler); |
|
472 |
|
473 |
|
474 // Set up CWatcherLog |
|
475 // gWLog = CWapPushLog::NewL(*gTest.Console()); |
|
476 } |
|
477 |
|
478 |
|
479 LOCAL_C void CloseTestUtils() |
|
480 { |
|
481 // delete gWLog; |
|
482 delete gActivescheduler; |
|
483 gTest.End(); |
|
484 gTest.Close(); |
|
485 } |
|
486 |
|
487 LOCAL_C void doMainL() |
|
488 { |
|
489 InitTestUtils(); |
|
490 __LOG_DEBUG("Getting Service Id"); |
|
491 CMsvEntrySelection* idArray = new (ELeave) CMsvEntrySelection(); |
|
492 CleanupStack::PushL(idArray); |
|
493 |
|
494 CWapPushTestMsgUtils* myTestUtils = CWapPushTestMsgUtils::NewL(); |
|
495 CleanupStack::PushL(myTestUtils); |
|
496 TMsvId pushService; |
|
497 |
|
498 // Uncomment this if you want to remove existing service entries |
|
499 myTestUtils->ClearExistingServiceEntriesL(KUidMtmWapPush); |
|
500 |
|
501 myTestUtils->PushServiceIdL(KUidMtmWapPush,pushService,idArray); |
|
502 if ((pushService == KMsvNullIndexEntryId) && (idArray->Count() ==0) ) // Found no service |
|
503 { |
|
504 __LOG_DEBUG("*************************************************"); |
|
505 __LOG_DEBUG("No Service found - creating new one"); |
|
506 pushService = myTestUtils->CreateServiceL(); |
|
507 __LOG_DEBUG_FORMAT1("Created New Service Entry Id %X", pushService); |
|
508 } |
|
509 else |
|
510 { |
|
511 __LOG_DEBUG("*************************************************"); |
|
512 __LOG_DEBUG_FORMAT1( "Found %d service entries\n", idArray->Count() ); |
|
513 for (TInt count=0; count < idArray->Count(); count++) |
|
514 { |
|
515 __LOG_DEBUG_FORMAT2("Entry %d - Service Id %X\n", count, idArray->At(count)); |
|
516 } |
|
517 } |
|
518 myTestUtils->InstallMtmGroupL(KPushMtmDatFile); |
|
519 __LOG_DEBUG("*************************************************"); |
|
520 __LOG_DEBUG("Installing Mtm Group"); |
|
521 |
|
522 CleanupStack::PopAndDestroy(); //myTestUtils |
|
523 CleanupStack::PopAndDestroy(); //idArray |
|
524 |
|
525 idArray = NULL; |
|
526 idArray = new (ELeave) CMsvEntrySelection(); // Create a new empty array |
|
527 CleanupStack::PushL(idArray); |
|
528 |
|
529 TMsvId myEntry; |
|
530 TInt count; |
|
531 CWapMtmTester* myTester=CWapMtmTester::NewL(); |
|
532 CleanupStack::PushL(myTester); |
|
533 myTester->SetServiceId(pushService); |
|
534 |
|
535 for (count =0; count <3; count++) |
|
536 { |
|
537 myEntry = myTester->CreateEntryL(); |
|
538 idArray->AppendL(myEntry); |
|
539 } |
|
540 myTester->DisplayChildrenL(pushService); |
|
541 |
|
542 myTester->DisplayEntriesL(*idArray); |
|
543 |
|
544 for (count = 0; count < idArray->Count(); count++) |
|
545 myTester->ChangeEntryL(idArray->At(count)); |
|
546 |
|
547 myTester->DisplayEntriesL(*idArray); |
|
548 myTester->DeleteEntryL(idArray->At(idArray->Count()-1)); |
|
549 myTester->DisplayEntriesL(*idArray); |
|
550 myTester->DeleteEntryL(idArray->At(idArray->Count()-2)); |
|
551 myTester->DisplayEntriesL(*idArray); |
|
552 |
|
553 CleanupStack::PopAndDestroy(2);//myTester |
|
554 |
|
555 |
|
556 gTest.Printf(_L("Press a key to continue\n")); |
|
557 gTest.Getch(); |
|
558 CloseTestUtils(); |
|
559 } |
|
560 |
|
561 |
|
562 GLDEF_C TInt E32Main() |
|
563 //---------------------------------------------------------------------------------------- |
|
564 { |
|
565 __UHEAP_MARK; |
|
566 CTrapCleanup* theCleanup = CTrapCleanup::New(); |
|
567 |
|
568 TRAPD(ret,doMainL()); |
|
569 gTest(ret==KErrNone); |
|
570 |
|
571 delete theCleanup; |
|
572 __UHEAP_MARKEND; |
|
573 return(KErrNone); |
|
574 } |