|
1 // Copyright (c) 2006-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 // rscommon.h |
|
16 // |
|
17 |
|
18 #ifndef RSCOMMON_H_ |
|
19 #define RSCOMMON_H_ |
|
20 #include <e32base.h> |
|
21 #include <rserror.h> |
|
22 #include <startup.hrh> |
|
23 #include <cfshared.h> |
|
24 |
|
25 |
|
26 class CRootServer; |
|
27 class CCommsProviderModule; |
|
28 |
|
29 namespace CommsFW |
|
30 { |
|
31 class TCFMessage; |
|
32 } |
|
33 |
|
34 namespace RootServer |
|
35 { |
|
36 class TRSStartModuleParams; |
|
37 } |
|
38 |
|
39 struct TRootServerStartupInfo; |
|
40 typedef CRootServer* (*TRootServerCtor)(const TRootServerStartupInfo&); |
|
41 typedef CCommsProviderModule* (*TCommsProviderModuleCtor)(CRootServer*, const RootServer::TRSStartModuleParams&, HBufC8*); |
|
42 |
|
43 struct TRootServerStartupInfo |
|
44 { |
|
45 TName iServerName; |
|
46 TRootServerCtor iRootServerCtor; |
|
47 TInt iPriority; |
|
48 TUid iDeathKey; |
|
49 TUid iLeakKey; |
|
50 TUid iProcessKey; |
|
51 }; |
|
52 |
|
53 IMPORT_C TInt RunRootServer(const TRootServerStartupInfo& aRootServerStartupInfo); // Rootserver thread function |
|
54 |
|
55 class MRootServerNotify |
|
56 /** Mixin abstract interface class providing the bindmanager's up-call to the |
|
57 RootServer. |
|
58 */ |
|
59 { |
|
60 public: |
|
61 virtual void ReceivedMessage(const CommsFW::TCFModuleName& aModule, |
|
62 const CommsFW::TCFMessage& aNewMsg)=0; |
|
63 }; |
|
64 |
|
65 namespace RootServer |
|
66 /** Namespace encapsulating the Rootserver components |
|
67 @publishedPartner |
|
68 @released |
|
69 */ |
|
70 { |
|
71 |
|
72 #undef _DEBUG_ROOTSERVER_FUNCTIONS |
|
73 #if defined(_DEBUG) |
|
74 #define _DEBUG_ROOTSERVER_FUNCTIONS |
|
75 #endif |
|
76 |
|
77 // The RootServer API and internals extend subtly to support the requirements |
|
78 // of the multithreaded socket server |
|
79 #define SYMBIAN_C32ROOT_API_V3 |
|
80 |
|
81 |
|
82 |
|
83 /** Server entry ordinal. |
|
84 @internalComponent |
|
85 */ |
|
86 const TInt KRunRootServerOrd = 1; |
|
87 |
|
88 |
|
89 /** Debug logging codes |
|
90 @internalComponent |
|
91 */ |
|
92 _LIT8(KLogSubSysRSModule, "RSModule"); // major tag |
|
93 _LIT8(KLogRSLeakTag, "Leak"); // minor tag |
|
94 |
|
95 /** Rootserver panics |
|
96 @publishedPartner |
|
97 @released |
|
98 */ |
|
99 enum TRootServerPanic |
|
100 { |
|
101 /** The server did not manage to create a new thread, possibly |
|
102 because the thread already existed. |
|
103 */ |
|
104 KRSPanicDuplicateThreadCreation, |
|
105 |
|
106 /** When starting the system property signalling the existence |
|
107 of the server already was present. |
|
108 */ |
|
109 KRSPubSubFault, |
|
110 |
|
111 /** The server entered a bad state. |
|
112 */ |
|
113 KRSBadState, |
|
114 |
|
115 /** Unable to find a reference to the module although the module is know |
|
116 to exist. |
|
117 */ |
|
118 KRSModuleRefMissing, |
|
119 |
|
120 /** The Bind Manager had a critical error. |
|
121 */ |
|
122 KRSBindMgrError, |
|
123 |
|
124 /** The active scheduler could not be created or the server left. |
|
125 */ |
|
126 KRSSchedulerError, |
|
127 |
|
128 /** Out of memory when trying to initialize. |
|
129 */ |
|
130 KRSNoMemory, |
|
131 |
|
132 /** CFlogIf interface could not be created. |
|
133 */ |
|
134 KRSCFlogIfCreationFailed |
|
135 }; |
|
136 |
|
137 /** Major version number of the Rootserver. |
|
138 @publishedPartner |
|
139 @released |
|
140 */ |
|
141 const TUint KRProcRootMajorVersionNumber=1; |
|
142 |
|
143 /** Minor version number of the Rootserver |
|
144 @publishedPartner |
|
145 @released |
|
146 */ |
|
147 const TUint KRProcRootMinorVersionNumber=1; |
|
148 |
|
149 /** Build version number of the Rootserver. |
|
150 @publishedPartner |
|
151 @released |
|
152 */ |
|
153 const TUint KRProcRootBuildVersionNumber=1; |
|
154 |
|
155 |
|
156 |
|
157 /** |
|
158 @deprecated Obsolete, always use KUidCommsProviderModule. |
|
159 @internalComponent |
|
160 */ |
|
161 const TInt32 KUidCommsServerModule=0x101f7417; |
|
162 |
|
163 /** DLL type of a Comms Provider Module (2nd UID). |
|
164 @publishedPartner |
|
165 @released |
|
166 */ |
|
167 const TInt32 KUidCommsProviderModule=0x101f7418; |
|
168 /** The states which the Rootserver goes through while initialising. |
|
169 @publishedPartner |
|
170 @released |
|
171 */ |
|
172 |
|
173 /** This Key is incremented when a leak is detected on thread shutdown. |
|
174 The category used in NOT the system cateory but rather KUidCommsProcess |
|
175 As required by Platsec |
|
176 @internalComponent |
|
177 @released |
|
178 */ |
|
179 const TUint32 KUidCommsModuleLeakCounter = 0x102827D0; |
|
180 |
|
181 enum TRSStartState |
|
182 { |
|
183 /** The Rootserver is initialising. |
|
184 */ |
|
185 EInitialising = 0, |
|
186 /** Core system components such as the socket server are running and configured. |
|
187 */ |
|
188 ECoreComponentsStarted = 10, |
|
189 /** All configuration has been applied |
|
190 */ |
|
191 EConfigurationComplete = 32, |
|
192 /** The Rootserver is configured and ready for normal operation. |
|
193 @deprecated |
|
194 */ |
|
195 EConfigured = 1, |
|
196 /** The Rootserver should be reconfigured by the configurator (aka warm booting) |
|
197 */ |
|
198 EReset = -1 |
|
199 }; |
|
200 |
|
201 enum { |
|
202 /** Staged Start-up State values are expanded by this factor to allow fine control |
|
203 of start dependencies through .CMI files |
|
204 */ |
|
205 KC32StartupStateScalingFactor = 0x100, |
|
206 /** Start sequence values less than this ceiling are converted into SSA state values by adding |
|
207 them to KC32LowStartSequenceScaleBase. |
|
208 @see KC32LowStartSequenceScaleBase |
|
209 */ |
|
210 KC32LowStartSequenceCeiling = 5, |
|
211 /** Base for converting low start sequence values to Staged Start-up State values. |
|
212 @see KC32LowStartSequenceCeiling |
|
213 */ |
|
214 KC32LowStartSequenceScaleBase = (EStartupStateCriticalStatic * KC32StartupStateScalingFactor) + 0x40, |
|
215 /** Start sequence values greater than KC32LowStartSequenceCeiling and less than this ceiling are |
|
216 converted into SSA state values by adding them to KC32MidStartSequenceScaleBase. |
|
217 @see KC32MidStartSequenceScaleBase |
|
218 @see KC32LowStartSequenceCeiling |
|
219 */ |
|
220 KC32MidStartSequenceCeiling = 10, |
|
221 /** Base for converting mid start sequence values to Staged Start-up State values. |
|
222 @see KC32MidStartSequenceCeiling |
|
223 */ |
|
224 KC32MidStartSequenceScaleBase = (EStartupStateCriticalStatic * KC32StartupStateScalingFactor) + 0x80, |
|
225 /** KC32HighStartSequenceScaleBase. |
|
226 @see KC32HighStartSequenceScaleBase |
|
227 @see KC32MidStartSequenceCeiling |
|
228 */ |
|
229 /** Start sequence values greater than KC32MidStartSequenceCeiling are |
|
230 converted into SSA state values by adding them to this base. |
|
231 @see KC32MidStartSequenceCeiling |
|
232 */ |
|
233 KC32HighStartSequenceScaleBase = (EStartupStateNonCritical * KC32StartupStateScalingFactor) + 0x40, |
|
234 /** Scaled start sequence signalling that core Comms components have completed loading, used by some |
|
235 servers to release blocked client connections. |
|
236 @see TRSStartState::ECoreComponentsStarted |
|
237 */ |
|
238 KC32CoreComponentsStartedScaled = (EStartupStateCriticalStatic + 1) * KC32StartupStateScalingFactor - 1, |
|
239 }; |
|
240 |
|
241 /** The states of a Comms Provider Module. |
|
242 @publishedPartner |
|
243 @released |
|
244 */ |
|
245 enum TRSModuleState |
|
246 { |
|
247 /** Not running, probably just instantiated. |
|
248 */ |
|
249 EIdle = 1, |
|
250 /** Started, waiting for rendezvous. |
|
251 */ |
|
252 EStarting = 2, |
|
253 /** Running normally. |
|
254 */ |
|
255 ERunning = 3, |
|
256 /** In the process of shutting down but thread still alive. |
|
257 */ |
|
258 EStopping = 4, |
|
259 /** Thread suddenly died, in the process of cleaning up. |
|
260 */ |
|
261 EZombie = 5, |
|
262 /** Thread dead, in the process of being cleaned up. |
|
263 */ |
|
264 EDead = 6 |
|
265 }; |
|
266 |
|
267 /** RootServer IPC numbers/messages |
|
268 @internalComponent |
|
269 */ |
|
270 enum TRSMessages |
|
271 { |
|
272 RSIsCallerConfigurator = 1, |
|
273 RSLoadModule = 2, |
|
274 RSUnloadModule = 3, |
|
275 RSBind = 4, |
|
276 RSUnbind = 5, |
|
277 RSGetModuleInfo = 6, |
|
278 RSEnumerateModules = 7, |
|
279 RSEnumerateSubModules = 8, |
|
280 RSEnumerateBindings = 9, |
|
281 RSCancelLoadModule = 10, |
|
282 RSCancelUnloadModule = 11, |
|
283 RSCancelBind = 12, |
|
284 RSCancelUnbind = 13, |
|
285 RSCloseSession = 14, |
|
286 RSShutdown = 15, |
|
287 RSSendMessage = 16, |
|
288 RSDbgMarkHeap = 17, |
|
289 RSDbgCheckHeap = 18, |
|
290 RSDbgMarkEnd = 19, |
|
291 RSDbgFailNext = 20 |
|
292 }; |
|
293 |
|
294 /** Type of binding specified |
|
295 @publishedPartner |
|
296 @released |
|
297 */ |
|
298 enum TRSBindType |
|
299 { |
|
300 /** Standard top-bottom binding. that doesn't allow server |
|
301 modules to be the lower part of the binding. |
|
302 */ |
|
303 EHierarchical, |
|
304 /** Custom horizontal binding between Modules. |
|
305 */ |
|
306 ECustom |
|
307 }; |
|
308 |
|
309 /** Type of unload; send shutdown message or kill thread |
|
310 @publishedPartner |
|
311 @released |
|
312 */ |
|
313 typedef CommsFW::TCFShutdownType TRSUnLoadType; |
|
314 |
|
315 /** Type of heap; default is process wide shared heap. |
|
316 @publishedPartner |
|
317 @released |
|
318 */ |
|
319 enum TRSHeapType |
|
320 { |
|
321 /** Process wide shared heap. |
|
322 */ |
|
323 EDefaultHeap, |
|
324 /** A heap shared with another module. |
|
325 */ |
|
326 EShareHeap, |
|
327 /** A new heap for the module. |
|
328 */ |
|
329 ENewHeap |
|
330 }; |
|
331 |
|
332 // IPC Data holder |
|
333 class TRSStartModuleParamContainer |
|
334 /** Container for necessary parameters to start a CPM. |
|
335 @publishedPartner |
|
336 @released |
|
337 */ |
|
338 { |
|
339 public: |
|
340 inline TRSStartModuleParamContainer(); |
|
341 |
|
342 public: |
|
343 /** Name of the module and its thread. |
|
344 @see TCFModuleName |
|
345 */ |
|
346 CommsFW::TCFModuleName iName; |
|
347 /** Filename of the Comms Provider Module DLL. |
|
348 @see TFileName |
|
349 */ |
|
350 TFileName iFilename; |
|
351 /** Priority of the CPM thread. |
|
352 @see TThreadPriority |
|
353 */ |
|
354 TThreadPriority iPriority; |
|
355 /** Initial size of the stack. |
|
356 */ |
|
357 TInt iStackSize; |
|
358 /** Type of the heap for the module. |
|
359 @see TRSHeapType |
|
360 */ |
|
361 TRSHeapType iHeapType; |
|
362 /** Minimum size of the heap for the module. |
|
363 */ |
|
364 TInt iMinHeapSize; |
|
365 /** Maximum size of the heap for the module. |
|
366 */ |
|
367 TInt iMaxHeapSize; |
|
368 /** If the module are to share the heap with |
|
369 an existing module this must be the name |
|
370 of the other module. |
|
371 */ |
|
372 CommsFW::TCFModuleName iShareHeapWith; |
|
373 /** Ordinal of the CPM main thread function, |
|
374 or entrypoint, in the DLL. |
|
375 */ |
|
376 TInt iThreadFunctionOrdinal; |
|
377 /** If ETrue specifies that this module can ot be unloaded. |
|
378 */ |
|
379 TBool iIsSticky; |
|
380 /** Specifies that this module is a server, maening that |
|
381 it can only be on top in a EHierarchical binding. |
|
382 @see TRSBindType |
|
383 */ |
|
384 TBool iIsServer; |
|
385 /** Additional control flags, or'd together from the the KCF_ flags. All undefined bits |
|
386 are reserved for future need and MUST be set to zero |
|
387 */ |
|
388 TUint32 iControlFlags; |
|
389 /** Control flag masks; see individual bit descriptions. |
|
390 */ |
|
391 enum TControlFlags |
|
392 { |
|
393 /** Module thread is marked as System() - a panic will halt the device and launch the |
|
394 crash debugger or reboot. The decision of action following a panic is normally left |
|
395 to the configurator and so this flag should not be commonly set; its purpose is |
|
396 to make debugging easier by halting at the source of failure. |
|
397 */ |
|
398 KCF_ThreadAsSystem = 0x00000001 |
|
399 #ifdef SYMBIAN_C32ROOT_API_V3 |
|
400 , KCF_UnstableModule = 0x00000002, |
|
401 /** If we shut down a module with EImmediate og EUngraceful, this flag will cause |
|
402 the rootserver to not check for memory leaks in the heap belonging to the module. |
|
403 */ |
|
404 KCF_ModuleImmediateNoCheck = 0x00000004 |
|
405 #endif |
|
406 }; |
|
407 |
|
408 }; |
|
409 |
|
410 class TRSStartModuleParams : public TPckg<TRSStartModuleParamContainer> |
|
411 /** Descriptor encapsulating the TRSModParamContainer for |
|
412 IPC transfers. |
|
413 @publishedPartner |
|
414 @released |
|
415 */ |
|
416 { |
|
417 public: |
|
418 TRSStartModuleParams():TPckg<TRSStartModuleParamContainer>(iParams) {}; |
|
419 inline TRSStartModuleParams(const CommsFW::TCFModuleName& aName, const TFileName& aFileName, |
|
420 const TThreadPriority aPriority, TInt aStackSize, const TRSHeapType aHeapType, |
|
421 TInt aMinHeapSize, TInt aMaxHeapSize, const CommsFW::TCFModuleName& aShareHeapWith, |
|
422 TInt aThreadFunctionOrdinal=0, TBool aIsSticky=EFalse, TUint32 aControlFlags=0); |
|
423 |
|
424 inline TRSStartModuleParams(const CommsFW::TCFModuleName& aName, const TFileName& aFileName, |
|
425 const TThreadPriority aPriority, TInt aStackSize, const TRSHeapType aHeapType, |
|
426 TInt aMinHeapSize, TInt aMaxHeapSize, TInt aThreadFunctionOrdinal=0, |
|
427 TBool aIsSticky=EFalse, TUint32 aControlFlags=0); |
|
428 inline TRSStartModuleParams(const CommsFW::TCFModuleName& aName, const TFileName& aFileName, |
|
429 const TThreadPriority aPriority, TInt aStackSize, const TRSHeapType aHeapType, |
|
430 TInt aThreadFunctionOrdinal=0, TBool aIsSticky=EFalse, TUint32 aControlFlags=0); |
|
431 private: |
|
432 TRSStartModuleParams(const TRSStartModuleParams &aRef); //Never Implemented |
|
433 public: |
|
434 /** Structure containing the parameters for the request. |
|
435 */ |
|
436 TRSStartModuleParamContainer iParams; |
|
437 }; |
|
438 |
|
439 class TRSModuleInfoContainer |
|
440 /** Container for receiving information of a running CPM. |
|
441 @publishedPartner |
|
442 @released |
|
443 */ |
|
444 { |
|
445 public: |
|
446 /** Name of the module. |
|
447 */ |
|
448 CommsFW::TCFModuleName iName; |
|
449 /** Filename of the CPM DLL. |
|
450 */ |
|
451 TFileName iDll; |
|
452 /** State of the CPM. |
|
453 */ |
|
454 TRSModuleState iState; |
|
455 /** Number of submodules this module has reported. |
|
456 */ |
|
457 TInt iNumSubModules; |
|
458 }; |
|
459 |
|
460 class TRSModuleInfo : public TPckg<TRSModuleInfoContainer> |
|
461 /** Descriptor encapsulating the TRSModuleInfoContainer for |
|
462 IPC transfers. |
|
463 @publishedPartner |
|
464 @released |
|
465 */ |
|
466 { |
|
467 public: |
|
468 TRSModuleInfo():TPckg<TRSModuleInfoContainer>(iParams) {}; |
|
469 inline TRSModuleInfo(const CommsFW::TCFModuleName aName, const TFileName& aDll, |
|
470 const TRSModuleState aState, const TInt aNumSubModules); |
|
471 private: |
|
472 TRSModuleInfo(const TRSModuleInfo &aRef); //Never implemented |
|
473 public: |
|
474 /** Structure containing the parameters for the request. |
|
475 */ |
|
476 TRSModuleInfoContainer iParams; |
|
477 }; |
|
478 |
|
479 class TRSSubModuleAddress : public TPckg<CommsFW::TCFSubModuleAddress> |
|
480 /** Descriptor encapsulating a TCFSubModuleAddress for |
|
481 IPC transfers. |
|
482 @publishedPartner |
|
483 @released |
|
484 */ |
|
485 { |
|
486 public: |
|
487 TRSSubModuleAddress():TPckg<CommsFW::TCFSubModuleAddress>(iAddress) {}; |
|
488 inline TRSSubModuleAddress(const CommsFW::TCFSubModuleAddress& aAddress); |
|
489 inline TRSSubModuleAddress(const CommsFW::TCFModuleName& aModule, const CommsFW::TCFSubModuleName& aSubModule); |
|
490 |
|
491 private: |
|
492 TRSSubModuleAddress(const TRSSubModuleAddress &aRef); //Never implemented |
|
493 public: |
|
494 /** Structure containing the parameters for the request. |
|
495 */ |
|
496 CommsFW::TCFSubModuleAddress iAddress; |
|
497 }; |
|
498 |
|
499 class TRSBindingInfoContainer |
|
500 /** Container for receiving binding information. |
|
501 @publishedPartner |
|
502 @released |
|
503 */ |
|
504 { |
|
505 public: |
|
506 inline TRSBindingInfoContainer& operator=(const TRSBindingInfoContainer& aInfo); |
|
507 public: |
|
508 /** Type of binding. |
|
509 @see TRSBindType |
|
510 */ |
|
511 TRSBindType iType; |
|
512 /** Fully qualified address of the first submodule. |
|
513 @see TCFSubModuleAddress |
|
514 */ |
|
515 CommsFW::TCFSubModuleAddress iAddress1; |
|
516 /** Fully qualified address of the second submodule. |
|
517 @see TCFSubModuleAddress |
|
518 */ |
|
519 CommsFW::TCFSubModuleAddress iAddress2; |
|
520 /** Status of the binding in reference to the first submodule. |
|
521 */ |
|
522 TInt iState1; |
|
523 /** Status of the binding in reference to the seond submodule. |
|
524 */ |
|
525 TInt iState2; |
|
526 /** The number of channels on the message queue going forward. |
|
527 */ |
|
528 TInt iForwardQLength; |
|
529 /** The number of channels on the message queue going in the reverse direction. |
|
530 */ |
|
531 TInt iReverseQLength; |
|
532 }; |
|
533 |
|
534 class TRSBindingInfo : public TPckg<TRSBindingInfoContainer> |
|
535 /** Descriptor encapsulating a TRSBindingInfoContainer for |
|
536 IPC transfers. |
|
537 @publishedPartner |
|
538 @released |
|
539 */ |
|
540 { |
|
541 public: |
|
542 enum |
|
543 { |
|
544 EMaxQueueLength = KMaxTInt/2, |
|
545 EMinQueueLength = 1 |
|
546 }; |
|
547 |
|
548 public: |
|
549 TRSBindingInfo():TPckg<TRSBindingInfoContainer>(iParams) {}; |
|
550 inline TRSBindingInfo(const TRSBindType& aType, const CommsFW::TCFSubModuleAddress& aAddress1, |
|
551 const CommsFW::TCFSubModuleAddress& aAddress2, |
|
552 const TInt aForwardQLength = 1, const TInt aReverseQLength = 1); |
|
553 |
|
554 inline TRSBindingInfo& operator=(const TRSBindingInfo& aInfo); |
|
555 inline TRSBindingInfo(const TRSBindingInfo &aRef); |
|
556 |
|
557 public: |
|
558 /** Structure containing the parameters for the request. |
|
559 */ |
|
560 TRSBindingInfoContainer iParams; |
|
561 }; |
|
562 |
|
563 class TRSUnBindingInfoContainer |
|
564 /** Parameter container for unbinding request |
|
565 @publishedPartner. |
|
566 @released |
|
567 */ |
|
568 { |
|
569 public: |
|
570 /** Fully qualified address of the first submodule. |
|
571 @see TCFSubModuleAddress |
|
572 */ |
|
573 CommsFW::TCFSubModuleAddress iAddress1; |
|
574 /** Fully qualified address of the second submodule. |
|
575 @see TCFSubModuleAddress |
|
576 */ |
|
577 CommsFW::TCFSubModuleAddress iAddress2; |
|
578 /** Status of the binding in reference to the first submodule. |
|
579 */ |
|
580 TInt iState1; |
|
581 /** Status of the binding in reference to the second submodule. |
|
582 */ |
|
583 TInt iState2; |
|
584 }; |
|
585 |
|
586 class TRSUnBindingInfo : public TPckg<TRSUnBindingInfoContainer> |
|
587 /** Descriptor encapsulating a TRSUnBindingInfoContainer for |
|
588 IPC transfers. |
|
589 @publishedPartner |
|
590 @released |
|
591 */ |
|
592 { |
|
593 public: |
|
594 TRSUnBindingInfo():TPckg<TRSUnBindingInfoContainer>(iParams) {}; |
|
595 inline TRSUnBindingInfo(const CommsFW::TCFSubModuleAddress aAddress1, const CommsFW::TCFSubModuleAddress aAddress2); |
|
596 |
|
597 private: |
|
598 TRSUnBindingInfo(const TRSUnBindingInfo &aRef); //Never Implemented |
|
599 public: |
|
600 /** Structure containing the parameters for the request. |
|
601 */ |
|
602 TRSUnBindingInfoContainer iParams; |
|
603 }; |
|
604 |
|
605 class TRSIter |
|
606 /** Encapsulates the iterator position in a Root Server enumeration |
|
607 @publishedPartner. |
|
608 @released |
|
609 */ |
|
610 { |
|
611 public: |
|
612 inline TRSIter(); |
|
613 inline const TInt& operator()() const; |
|
614 inline TInt& operator()(); |
|
615 inline void Reset(); |
|
616 private: |
|
617 TInt iPosition; |
|
618 }; |
|
619 |
|
620 |
|
621 #include <rscommon.inl> |
|
622 |
|
623 } // namespace RootServer |
|
624 #endif /*RSCOMMON_H_*/ |
|
625 |