kernel/eka/include/e32std.h
changeset 0 a41df078684a
child 31 56f325a607ea
equal deleted inserted replaced
-1:000000000000 0:a41df078684a
       
     1 // Copyright (c) 1994-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 the License "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 // e32\include\e32std.h
       
    15 // 
       
    16 //
       
    17 
       
    18 #ifndef __E32STD_H__
       
    19 #define __E32STD_H__
       
    20 
       
    21 #ifdef __KERNEL_MODE__
       
    22 #error !! Including e32std.h in kernel code !!
       
    23 #endif
       
    24 
       
    25 #include <e32cmn.h>
       
    26 
       
    27 /**
       
    28 @publishedAll
       
    29 @released
       
    30 */
       
    31 class TFunctor
       
    32 	{
       
    33 public:
       
    34 	IMPORT_C virtual void operator()() =0;
       
    35 	};
       
    36 
       
    37 /**
       
    38 @publishedAll
       
    39 @released
       
    40 
       
    41 Encapsulates a general call-back function.
       
    42 
       
    43 The class encapsulates:
       
    44 
       
    45 1. a pointer to a function which takes an argument of type TAny* and returns 
       
    46    a TInt.
       
    47 
       
    48 2. a pointer which is passed to the function every time it is called.
       
    49    The pointer can point to any object. It can also be NULL.
       
    50 
       
    51 The callback function can be a static function of a class,
       
    52 e.g. TInt X::Foo(TAny *) or it can be a function which is not a member of
       
    53 any class, e.g. TInt Foo(TAny *).
       
    54 
       
    55 When used with the CIdle and the CPeriodic classes, the callback function
       
    56 is intended to be called repeatedly; the encapsulated pointer is passed on
       
    57 each call. Typically, the pointer refers to an object which records the state
       
    58 of the task across each call. When used with CIdle, the callback function
       
    59 should also return a true (non-zero) value if it is intended to be called
       
    60 again, otherwise it should return a false (zero) value.
       
    61 
       
    62 @see CIdle
       
    63 @see CPeriodic
       
    64 */
       
    65 class TCallBack
       
    66 	{
       
    67 public:
       
    68 	inline TCallBack();
       
    69 	inline TCallBack(TInt (*aFunction)(TAny* aPtr));
       
    70 	inline TCallBack(TInt (*aFunction)(TAny* aPtr),TAny* aPtr);
       
    71 	inline TInt CallBack() const;
       
    72 public:
       
    73 	
       
    74 	/**
       
    75 	A pointer to the callback function.
       
    76 	*/
       
    77 	TInt (*iFunction)(TAny* aPtr);
       
    78 	
       
    79 	
       
    80 	/**
       
    81 	A pointer that is passed to the callback function when
       
    82 	the function is called.
       
    83 	*/
       
    84 	TAny* iPtr;
       
    85 	};
       
    86 
       
    87 
       
    88 
       
    89 
       
    90 /**
       
    91 @publishedAll
       
    92 @released
       
    93 
       
    94 An object embedded within a class T so that objects of type T can form part 
       
    95 of a singly linked list.
       
    96 
       
    97 A link object encapsulates a pointer to the next link object in the list.
       
    98 
       
    99 @see TSglQue
       
   100 */
       
   101 class TSglQueLink
       
   102 	{
       
   103 #if defined _DEBUG
       
   104 public:
       
   105 	inline TSglQueLink() : iNext(NULL)
       
   106 	/**
       
   107 	An explicitly coded default constructor that is only defined for DEBUG builds.
       
   108 	
       
   109 	It sets the pointer to the next link object to NULL.
       
   110 	
       
   111 	@see iNext
       
   112 	*/
       
   113 	{}
       
   114 #endif
       
   115 private:
       
   116 	IMPORT_C void Enque(TSglQueLink* aLink);
       
   117 public:
       
   118 	/**
       
   119 	A pointer to the next link object in the list.
       
   120 	*/
       
   121 	TSglQueLink* iNext;
       
   122 	friend class TSglQueBase;
       
   123 	};
       
   124 
       
   125 
       
   126 
       
   127 
       
   128 /**
       
   129 @publishedAll
       
   130 @released
       
   131 
       
   132 A base class that provides implementation for the link object of a doubly
       
   133 linked list.
       
   134 
       
   135 It also encapsulates pointers both to the next and the previous link 
       
   136 objects in the doubly linked list.
       
   137 
       
   138 The class is abstract and is not intended to be instantiated.
       
   139 
       
   140 @see TDblQueLink
       
   141 */
       
   142 class TDblQueLinkBase
       
   143 	{
       
   144 public:
       
   145 	inline TDblQueLinkBase() : iNext(NULL)
       
   146 	/**
       
   147 	Default constructor.
       
   148 	
       
   149 	It sets the pointer to the next link object to NULL.
       
   150 	
       
   151 	@see iNext
       
   152 	*/
       
   153 	{}
       
   154 	IMPORT_C void Enque(TDblQueLinkBase* aLink);
       
   155 	IMPORT_C void AddBefore(TDblQueLinkBase* aLink);
       
   156 public:
       
   157 	/**
       
   158 	A pointer to the next link object in the list.
       
   159 	*/
       
   160 	TDblQueLinkBase* iNext;
       
   161 	
       
   162 	/**
       
   163 	A pointer to the previous link object in the list.
       
   164 	*/
       
   165 	TDblQueLinkBase* iPrev;
       
   166 	};
       
   167 
       
   168 
       
   169 
       
   170 
       
   171 /**
       
   172 @publishedAll
       
   173 @released
       
   174 
       
   175 An object embedded within a class T so that objects of type T can form part 
       
   176 of a doubly linked list.
       
   177 */
       
   178 class TDblQueLink : public TDblQueLinkBase
       
   179 	{
       
   180 public:
       
   181 	IMPORT_C void Deque();
       
   182 	};
       
   183 
       
   184 
       
   185 
       
   186 
       
   187 /**
       
   188 @publishedAll
       
   189 @released
       
   190 
       
   191 An object embedded within a class T so that objects of type T can form part
       
   192 of an ordered doubly linked list.
       
   193 
       
   194 Objects are added to the doubly linked list in descending priority order.
       
   195 */
       
   196 class TPriQueLink : public TDblQueLink
       
   197 	{
       
   198 public:
       
   199 	/**
       
   200 	The priority value.
       
   201 
       
   202     Objects are added to the doubly linked list in descending order of this value.
       
   203 	*/
       
   204 	TInt iPriority;
       
   205 	};
       
   206 
       
   207 
       
   208 
       
   209 
       
   210 /**
       
   211 @publishedAll
       
   212 @released
       
   213 
       
   214 An object embedded within a class T so that objects of type T can form part 
       
   215 of a delta doubly linked list.
       
   216 */
       
   217 class TDeltaQueLink : public TDblQueLinkBase
       
   218 	{
       
   219 public:
       
   220 	/**
       
   221 	The delta value.
       
   222 	*/
       
   223 	TInt iDelta;
       
   224 	};
       
   225 
       
   226 
       
   227 
       
   228 
       
   229 /**
       
   230 @publishedAll
       
   231 @released
       
   232 
       
   233 An object embedded within a class T so that objects of type T can form part 
       
   234 of a doubly linked list sorted by tick count.
       
   235 */
       
   236 class TTickCountQueLink : public TDblQueLink
       
   237 	{
       
   238 public:
       
   239 	/**
       
   240 	The tick count.
       
   241 	*/
       
   242 	TUint iTickCount;
       
   243 	};
       
   244 
       
   245 
       
   246 
       
   247 
       
   248 /**
       
   249 @publishedAll
       
   250 @released
       
   251 
       
   252 A base class that provides implementation for the singly linked list header. 
       
   253 
       
   254 It also encapsulates the offset value of a link object.
       
   255 
       
   256 The class is abstract and is not intended to be instantiated.
       
   257 
       
   258 @see TSglQue
       
   259 */
       
   260 class TSglQueBase
       
   261 	{
       
   262 public:
       
   263 	IMPORT_C TBool IsEmpty() const;
       
   264 	IMPORT_C void SetOffset(TInt aOffset);
       
   265 	IMPORT_C void Reset();
       
   266 protected:
       
   267 	IMPORT_C TSglQueBase();
       
   268 	IMPORT_C TSglQueBase(TInt aOffset);
       
   269 	IMPORT_C void DoAddFirst(TAny* aPtr);
       
   270 	IMPORT_C void DoAddLast(TAny* aPtr);
       
   271 	IMPORT_C void DoRemove(TAny* aPtr);
       
   272 protected:
       
   273 	/**
       
   274 	A pointer to the first element in the list.
       
   275 	*/
       
   276 	TSglQueLink* iHead;
       
   277 	
       
   278 	/**
       
   279 	A pointer to the last element in the list.
       
   280 	*/
       
   281 	TSglQueLink* iLast;
       
   282 	
       
   283 	/**
       
   284 	The offset of a component link object within elements that form the list.
       
   285 	*/
       
   286 	TInt iOffset;
       
   287 private:
       
   288 	TSglQueBase(const TSglQueBase& aQue);
       
   289 	TSglQueBase &operator=(const TSglQueBase& aQue);
       
   290 	friend class TSglQueIterBase;
       
   291 	};
       
   292 
       
   293 
       
   294 
       
   295 
       
   296 /**
       
   297 @publishedAll
       
   298 @released
       
   299 
       
   300 A base class that provides implementation for the doubly linked list header. 
       
   301 
       
   302 It also encapsulates the offset value of a link object.
       
   303 
       
   304 The class is abstract and is not intended to be instantiated.
       
   305 
       
   306 @see TDblQue
       
   307 */
       
   308 class TDblQueBase
       
   309 	{
       
   310 public:
       
   311 	IMPORT_C TBool IsEmpty() const;
       
   312 	IMPORT_C void SetOffset(TInt aOffset);
       
   313 	IMPORT_C void Reset();
       
   314 protected:
       
   315 	IMPORT_C TDblQueBase();
       
   316 	IMPORT_C TDblQueBase(TInt aOffset);
       
   317 	IMPORT_C void DoAddFirst(TAny* aPtr);
       
   318 	IMPORT_C void DoAddLast(TAny* aPtr);
       
   319 	IMPORT_C void DoAddPriority(TAny* aPtr);
       
   320 	IMPORT_C void __DbgTestEmpty() const;
       
   321 protected:
       
   322 	/**
       
   323 	The head, or anchor point of the queue.
       
   324 	*/
       
   325 	TDblQueLink iHead;
       
   326 	
       
   327 	/**
       
   328 	The offset of a component link object within elements that form the list.
       
   329 	*/
       
   330 	TInt iOffset;
       
   331 private:
       
   332 	TDblQueBase(const TDblQueBase& aQue);
       
   333 	TDblQueBase& operator=(const TDblQueBase& aQue);
       
   334 	friend class TDblQueIterBase;
       
   335 	};
       
   336 
       
   337 
       
   338 
       
   339 
       
   340 /**
       
   341 @publishedAll
       
   342 @released
       
   343 
       
   344 A base class that provides implementation for the TDeltaQue template class.
       
   345 
       
   346 The class is abstract and is not intended to be instantiated.
       
   347 
       
   348 @see TDeltaQue
       
   349 */
       
   350 class TDeltaQueBase : public TDblQueBase
       
   351 	{
       
   352 public:
       
   353 	IMPORT_C TBool CountDown();
       
   354 	IMPORT_C TBool CountDown(TInt aValue);
       
   355 	IMPORT_C TBool FirstDelta(TInt& aValue);
       
   356 	IMPORT_C void Reset();
       
   357 protected:
       
   358 	IMPORT_C TDeltaQueBase();
       
   359 	IMPORT_C TDeltaQueBase(TInt aOffset);
       
   360 	IMPORT_C void DoAddDelta(TAny* aPtr,TInt aDelta);
       
   361 	IMPORT_C void DoRemove(TAny* aPtr);
       
   362 	IMPORT_C TAny* DoRemoveFirst();
       
   363 protected:
       
   364 	/**
       
   365 	Pointer to the delta value in the first link element.
       
   366 	*/
       
   367 	TInt* iFirstDelta;
       
   368 	};
       
   369 
       
   370 
       
   371 
       
   372 
       
   373 /**
       
   374 @publishedAll
       
   375 @released
       
   376 
       
   377 A templated class that provides the behaviour for managing a singly linked 
       
   378 list.
       
   379 
       
   380 It also acts as the head of the list, maintaining the pointers into the list.
       
   381 
       
   382 The template parameter defines the type of element that forms the singly linked 
       
   383 list and is the class that acts as host to the link object.
       
   384 
       
   385 @see TSglQueLink
       
   386 */
       
   387 template <class T>
       
   388 class TSglQue : public TSglQueBase
       
   389 	{
       
   390 public:
       
   391 	inline TSglQue();
       
   392 	inline explicit TSglQue(TInt aOffset);
       
   393 	inline void AddFirst(T& aRef);
       
   394 	inline void AddLast(T& aRef);
       
   395 	inline TBool IsFirst(const T* aPtr) const;
       
   396 	inline TBool IsLast(const T* aPtr) const;
       
   397 	inline T* First() const;
       
   398 	inline T* Last() const;
       
   399 	inline void Remove(T& aRef);
       
   400 	};
       
   401 
       
   402 
       
   403 
       
   404 
       
   405 /**
       
   406 @publishedAll
       
   407 @released
       
   408 
       
   409 A templated class that provides the behaviour for managing a doubly linked 
       
   410 list. 
       
   411 
       
   412 It also acts as the head of the list, maintaining the pointers into the list.
       
   413 
       
   414 The template parameter defines the type of element that forms the doubly linked 
       
   415 list and is the class that acts as host to the link object.
       
   416 
       
   417 @see TDblQueLink
       
   418 */
       
   419 template <class T>
       
   420 class TDblQue : public TDblQueBase
       
   421 	{
       
   422 public:
       
   423 	inline TDblQue();
       
   424 	inline explicit TDblQue(TInt aOffset);
       
   425 	inline void AddFirst(T& aRef);
       
   426 	inline void AddLast(T& aRef);
       
   427 	inline TBool IsHead(const T* aPtr) const;
       
   428 	inline TBool IsFirst(const T* aPtr) const;
       
   429 	inline TBool IsLast(const T* aPtr) const;
       
   430 	inline T* First() const;
       
   431 	inline T* Last() const;
       
   432 	};
       
   433 
       
   434 
       
   435 
       
   436 
       
   437 /**
       
   438 @publishedAll
       
   439 @released
       
   440 
       
   441 A templated class that provides the behaviour for managing a doubly linked
       
   442 list in which the elements are added in descending priority order.
       
   443 
       
   444 Priority is defined by the value of the TPriQueLink::iPriority member of
       
   445 the link element.
       
   446 
       
   447 The template parameter defines the type of element that forms the doubly linked
       
   448 list and is the class that acts as host to the link object.
       
   449 
       
   450 @see TPriQueLink
       
   451 @see TPriQueLink::iPriority
       
   452 */
       
   453 template <class T>
       
   454 class TPriQue : public TDblQueBase
       
   455 	{
       
   456 public:
       
   457 	inline TPriQue();
       
   458 	inline explicit TPriQue(TInt aOffset);
       
   459 	inline void Add(T& aRef);
       
   460 	inline TBool IsHead(const T* aPtr) const;
       
   461 	inline TBool IsFirst(const T* aPtr) const;
       
   462 	inline TBool IsLast(const T* aPtr) const;
       
   463 	inline T* First() const;
       
   464 	inline T* Last() const;
       
   465 	};
       
   466 
       
   467 
       
   468 
       
   469 
       
   470 /**
       
   471 @publishedAll
       
   472 @released
       
   473 
       
   474 A templated class that provides the behaviour for managing a doubly linked 
       
   475 list in which elements represent values which are increments, or deltas, on 
       
   476 the value represented by a preceding element.
       
   477 
       
   478 The list is ordered so that the head of the queue represents a nominal zero 
       
   479 point.
       
   480 
       
   481 The delta value of a new element represents its 'distance' from the nominal 
       
   482 zero point. The new element is added into the list, and the delta values of 
       
   483 adjacent elements (and of the new element, if necessary) are adjusted, so 
       
   484 that the sum of all deltas, up to and including the new element, is the same 
       
   485 as the new element's intended 'distance' from the nominal zero point.
       
   486 
       
   487 A common use for a list of this type is as a queue of timed events, where 
       
   488 the delta values represent the intervals between the events.
       
   489 
       
   490 The delta value is defined by the value of the TDeltaQueLink::iDelta member 
       
   491 of the link element.
       
   492 
       
   493 The template parameter defines the type of element that forms the doubly linked 
       
   494 list and is the class that acts as host to the link object.
       
   495 
       
   496 @see TDeltaQueLink
       
   497 @see TDeltaQueLink::iDelta
       
   498 */
       
   499 template <class T>
       
   500 class TDeltaQue : public TDeltaQueBase
       
   501 	{
       
   502 public:
       
   503 	inline TDeltaQue();
       
   504 	inline explicit TDeltaQue(TInt aOffset);
       
   505 	inline void Add(T& aRef,TInt aDelta);
       
   506 	inline void Remove(T& aRef);
       
   507 	inline T* RemoveFirst();
       
   508 	};
       
   509 
       
   510 
       
   511 
       
   512 
       
   513 // Forward declaration
       
   514 class TTickCountQueLink;
       
   515 
       
   516 /**
       
   517 @internalComponent
       
   518 @released
       
   519 
       
   520 A class that provides the behaviour for managing a doubly linked list
       
   521 in which elements are added in order of the time until their tick count.
       
   522 
       
   523 A common use for a list of this type is as a queue of timed events, where 
       
   524 the tick counts are the expiry times of the events.
       
   525 
       
   526 The tick count is defined by the value of the TTickCountQueLink::iTickCount
       
   527 member of the link element.
       
   528 
       
   529 @see TTickCountQueLink
       
   530 @see TTickCountQueLink::iTickCount
       
   531 */
       
   532 class TTickCountQue : public TDblQueBase
       
   533 	{
       
   534 public:
       
   535 	TTickCountQue();
       
   536 	void Add(TTickCountQueLink& aRef);
       
   537 	TTickCountQueLink* First() const;
       
   538 	TTickCountQueLink* RemoveFirst();
       
   539 	TTickCountQueLink* RemoveFirst(TUint aTickCount);
       
   540 	};
       
   541 
       
   542 
       
   543 
       
   544 
       
   545 /**
       
   546 @publishedAll
       
   547 @released
       
   548 
       
   549 A base class that provides implementation for the singly linked list iterator. 
       
   550 
       
   551 It also encapsulates a pointer to the current link link list element.
       
   552 
       
   553 The class is abstract and is not intended to be instantiated.
       
   554 */
       
   555 class TSglQueIterBase
       
   556 	{
       
   557 public:
       
   558 	IMPORT_C void SetToFirst();
       
   559 protected:
       
   560 	IMPORT_C TSglQueIterBase(TSglQueBase& aQue);
       
   561 	IMPORT_C TAny* DoPostInc();
       
   562 	IMPORT_C TAny* DoCurrent();
       
   563 	IMPORT_C void DoSet(TAny* aLink);
       
   564 protected:
       
   565 	TInt iOffset;
       
   566 	TSglQueLink* iHead;
       
   567 	TSglQueLink* iNext;
       
   568 	};
       
   569 
       
   570 
       
   571 
       
   572 
       
   573 /**
       
   574 @publishedAll
       
   575 @released
       
   576 
       
   577 A templated class that provides the behaviour for iterating through a set of 
       
   578 singly linked list elements.
       
   579 
       
   580 The template parameter defines the type of element that forms the singly linked 
       
   581 list. The class defined in the template parameter contains the link object.
       
   582 */
       
   583 template <class T>
       
   584 class TSglQueIter : public TSglQueIterBase
       
   585 	{
       
   586 public:
       
   587 	inline TSglQueIter(TSglQueBase& aQue);
       
   588 	inline void Set(T& aLink);
       
   589 	inline operator T*();
       
   590 	inline T* operator++(TInt);
       
   591 	};
       
   592 
       
   593 
       
   594 
       
   595 
       
   596 /**
       
   597 @publishedAll
       
   598 @released
       
   599 
       
   600 A base class that provides implementation for the doubly linked list iterator.
       
   601 
       
   602 It also encapsulates a pointer to the current link list element.
       
   603 
       
   604 The class is abstract and is not intended to be instantiated.
       
   605 */
       
   606 class TDblQueIterBase
       
   607 	{
       
   608 public:
       
   609 	IMPORT_C void SetToFirst();
       
   610 	IMPORT_C void SetToLast();
       
   611 protected:
       
   612 	IMPORT_C TDblQueIterBase(TDblQueBase& aQue);
       
   613 	IMPORT_C TAny* DoPostInc();
       
   614 	IMPORT_C TAny* DoPostDec();
       
   615 	IMPORT_C TAny* DoCurrent();
       
   616 	IMPORT_C void DoSet(TAny* aLink);
       
   617 protected:
       
   618 	/**
       
   619 	The offset of a component link object within elements that form the list.
       
   620 	*/
       
   621 	TInt iOffset;
       
   622 	
       
   623 	/**
       
   624 	Pointer to the anchor for the list.
       
   625 	*/
       
   626 	TDblQueLinkBase* iHead;
       
   627 	
       
   628 	/**
       
   629 	Pointer to the current element.
       
   630 	*/
       
   631 	TDblQueLinkBase* iNext;
       
   632 	};
       
   633 
       
   634 
       
   635 
       
   636 
       
   637 /**
       
   638 @publishedAll
       
   639 @released
       
   640 
       
   641 A templated class that provides the behaviour for iterating through a set of 
       
   642 doubly linked list elements.
       
   643 
       
   644 The template parameter defines the type of element that forms the doubly linked 
       
   645 list. The class defined in the template parameter contains the link object.
       
   646 */
       
   647 template <class T>
       
   648 class TDblQueIter : public TDblQueIterBase
       
   649 	{
       
   650 public:
       
   651 	inline TDblQueIter(TDblQueBase& aQue);
       
   652 	inline void Set(T& aLink);
       
   653 	inline operator T*();
       
   654 	inline T* operator++(TInt);
       
   655 	inline T* operator--(TInt);
       
   656 	};
       
   657 
       
   658 
       
   659 
       
   660 
       
   661 /**
       
   662 @publishedAll
       
   663 @released
       
   664 
       
   665 Governs the type of comparison to be made between descriptor keys or between 
       
   666 text keys.
       
   667 
       
   668 @see TKeyArrayFix
       
   669 @see TKeyArrayVar
       
   670 @see TKeyArrayPak
       
   671 */
       
   672 enum TKeyCmpText
       
   673 	{
       
   674 	/**
       
   675 	For a Unicode build, this is the same as ECmpNormal16.
       
   676 	For a non-Unicode build, this is the same as ECmpNormal8.
       
   677 	
       
   678 	Using the build independent names (i.e. TPtrC, TPtr, TBufC, TBuf or TText) 
       
   679 	allows the compiler to chose the correct variant according to the build.
       
   680 	*/
       
   681 	ECmpNormal,
       
   682 	
       
   683 	
       
   684 	/**
       
   685 	For descriptor keys, the key is assumed to be the 8 bit variant, derived
       
   686 	from TDesc8. A simple comparison is done between the content of the
       
   687 	descriptors; the data is not folded and collation rules are not applied for
       
   688 	the purpose of the comparison.
       
   689 	
       
   690 	For text keys, the key is assumed to be the 8 bit variant, of type TText8. 
       
   691 	A normal comparison is done between the text data; the data is not folded 
       
   692 	and collation rules are not applied for the purpose of the comparison.
       
   693 	*/
       
   694 	ECmpNormal8,
       
   695 	
       
   696 	
       
   697 	/**
       
   698 	For descriptor keys, the key is assumed to be the 16 bit variant, derived
       
   699 	from TDesc16. A simple comparison is done between the content of the
       
   700 	descriptors; the data is not folded and collation rules are not applied for
       
   701 	the purpose of the comparison.
       
   702 	
       
   703 	For text keys, the key is assumed to be the 16 bit variant, of type
       
   704 	TText16. A normal comparison is done between the text data; the data is
       
   705 	not folded 	and collation rules are not applied for the purpose of the
       
   706 	comparison.
       
   707 	*/
       
   708 	ECmpNormal16,
       
   709 	
       
   710 	
       
   711 	/**
       
   712 	For a Unicode build, this is the same as EcmpFolded16.
       
   713     For a non-Unicode build, this is the same as EcmpFolded8.
       
   714 
       
   715     Using the build independent names (i.e. TPtrC, TPtr, TBufC, TBuf or TText)
       
   716     allows the compiler to chose the correct variant according to the build. 
       
   717 	*/
       
   718 	ECmpFolded,
       
   719 	
       
   720 	
       
   721 	/**
       
   722 	For descriptor keys, the key is assumed to be the 8 bit variant,
       
   723 	derived from TDesc8. The descriptor contents are folded for the purpose
       
   724 	of the comparison.
       
   725 
       
   726     For text keys, the key is assumed to be the 8 bit variant, of type
       
   727     TText8. The text data is folded for the purpose of the comparison.
       
   728 	*/
       
   729 	ECmpFolded8,
       
   730 	
       
   731 	
       
   732 	/**
       
   733 	For descriptor keys, the key is assumed to be the 16 bit variant,
       
   734 	derived from TDesc16. The descriptor contents are folded for the purpose
       
   735 	of the comparison.
       
   736 
       
   737     For text keys, the key is assumed to be the 16 bit variant, of type
       
   738     TText16. The text data is folded for the purpose of the comparison.
       
   739 	*/
       
   740 	ECmpFolded16,
       
   741 	
       
   742 	
       
   743 	/**
       
   744 	For a Unicode build, this is the same as EcmpCollated16.
       
   745     For a non-Unicode build, this is the same as EcmpCollated8.
       
   746 
       
   747     Using the build independent names (i.e. TPtrC, TPtr, TBufC, TBuf or TText)
       
   748     allows the compiler to chose the correct variant according to the build.
       
   749 	*/
       
   750 	ECmpCollated,
       
   751 	
       
   752 	
       
   753 	/**
       
   754 	For descriptor keys, the key is assumed to be the 8 bit variant,
       
   755 	derived from TDesc8. Collation rules are applied for the purpose of
       
   756 	the comparison.
       
   757 
       
   758     For text keys, the key is assumed to be the 8 bit variant, of type 
       
   759     TText8. Collation rules are applied for the purpose of the comparison.
       
   760 	*/
       
   761 	ECmpCollated8,
       
   762 	
       
   763 	
       
   764 	/**
       
   765 	For descriptor keys, the key is assumed to be the 16 bit variant,
       
   766 	derived from TDesc16. Collation rules are applied for the purpose of
       
   767 	the comparison.
       
   768 
       
   769     For text keys, the key is assumed to be the 16 bit variant,
       
   770     of type TText16. Collation rules are applied for the purpose of
       
   771     the comparison.
       
   772 	*/
       
   773 	ECmpCollated16
       
   774 	};
       
   775 
       
   776 
       
   777 
       
   778 
       
   779 /**
       
   780 @publishedAll
       
   781 @released
       
   782 
       
   783 Governs the type of comparison to be made between numeric keys.
       
   784 
       
   785 @see TKeyArrayFix
       
   786 @see TKeyArrayVar
       
   787 @see TKeyArrayPak
       
   788 */
       
   789 enum TKeyCmpNumeric
       
   790 	{
       
   791 	/**
       
   792 	The key is assumed to be of type TInt8.
       
   793 	*/
       
   794 	ECmpTInt8=((ECmpCollated16+1)<<1),
       
   795 	
       
   796 	
       
   797 	/**
       
   798 	The key is assumed to be of type TInt16.
       
   799 	*/
       
   800 	ECmpTInt16,
       
   801 	
       
   802 	
       
   803 	/**
       
   804 	The key is assumed to be of type TInt32.
       
   805 	*/
       
   806 	ECmpTInt32,
       
   807 	
       
   808 	
       
   809 	/**
       
   810 	The key is assumed to be of type TInt.
       
   811 	*/
       
   812 	ECmpTInt,
       
   813 	
       
   814 	
       
   815 	/**
       
   816 	The key is assumed to be of type TUint8.
       
   817 	*/
       
   818 	ECmpTUint8,
       
   819 	
       
   820 	
       
   821 	/**
       
   822 	The key is assumed to be of type TUint16.
       
   823 	*/
       
   824 	ECmpTUint16,
       
   825 	
       
   826 	
       
   827 	/**
       
   828 	The key is assumed to be of type TUint32.
       
   829 	*/
       
   830 	ECmpTUint32,
       
   831 	
       
   832 	
       
   833 	/**
       
   834 	The key is assumed to be of type TUint.
       
   835 	*/
       
   836 	ECmpTUint,
       
   837 	
       
   838 	
       
   839 	/**
       
   840 	The key is assumed to be of type TInt64.
       
   841 	*/
       
   842 	ECmpTInt64
       
   843 	};
       
   844 
       
   845 
       
   846 
       
   847 
       
   848 /**
       
   849 @publishedAll
       
   850 @released
       
   851 
       
   852 Defines the characteristics of a key used to access the elements of an array.
       
   853 
       
   854 The class is abstract and cannot be instantiated. A derived class must be 
       
   855 defined and implemented.
       
   856 
       
   857 The classes TKeyArrayFix, TKeyArrayVar and TKeyArrayPak, derived from TKey, 
       
   858 are already supplied to implement keys for the fixed length element, variable 
       
   859 length element and packed arrays.
       
   860 
       
   861 A derived class would normally be written to define the characteristics of 
       
   862 a key for a non standard array.
       
   863 
       
   864 @see TKeyArrayFix
       
   865 @see TKeyArrayVar
       
   866 @see TKeyArrayPak
       
   867 */
       
   868 class TKey
       
   869 	{
       
   870 public:
       
   871 	inline void SetPtr(const TAny* aPtr);
       
   872 	IMPORT_C virtual TInt Compare(TInt aLeft,TInt aRight) const;
       
   873 	IMPORT_C virtual TAny* At(TInt anIndex) const;
       
   874 protected:
       
   875 	IMPORT_C TKey();
       
   876 	IMPORT_C TKey(TInt aOffset,TKeyCmpText aType);
       
   877 	IMPORT_C TKey(TInt aOffset,TKeyCmpText aType,TInt aLength);
       
   878 	IMPORT_C TKey(TInt aOffset,TKeyCmpNumeric aType);
       
   879 protected:
       
   880 	TInt iKeyOffset;
       
   881 	TInt iKeyLength;
       
   882 	TInt iCmpType;
       
   883 	const TAny* iPtr;
       
   884 	};
       
   885 
       
   886 /**
       
   887 @publishedAll
       
   888 @released
       
   889 
       
   890 Defines the basic behaviour for swapping two elements of an array.
       
   891 
       
   892 The class is abstract. A derived class must be defined and implemented to 
       
   893 use the functionality.
       
   894 
       
   895 A derived class can define how to swap two elements of an array. In practice, 
       
   896 this means providing an implementation for the virtual function Swap().
       
   897 
       
   898 To support this, the derived class is also likely to need a pointer to the 
       
   899 array itself and suitable constructors and/or other member functions to set 
       
   900 such a pointer.
       
   901 */
       
   902 class TSwap
       
   903 	{
       
   904 public:
       
   905 	IMPORT_C TSwap();
       
   906 	IMPORT_C virtual void Swap(TInt aLeft,TInt aRight) const;
       
   907 	};
       
   908 
       
   909 
       
   910 
       
   911 
       
   912 /**
       
   913 @publishedAll
       
   914 @released
       
   915 
       
   916 Folds a specified character and provides functions to fold additional
       
   917 characters after construction of the object.
       
   918 
       
   919 Folding converts the character to a form which can be used in tolerant
       
   920 comparisons without control over the operations performed. Tolerant comparisons
       
   921 are those which ignore character differences like case and accents. 
       
   922 
       
   923 Note that folding is locale-independent behaviour. It is also important to 
       
   924 note that there can be no guarantee that folding is in any way culturally 
       
   925 appropriate, and should not be used for matching characters in
       
   926 natural language.
       
   927 
       
   928 @see User::Fold
       
   929 */
       
   930 class TCharF : public TChar
       
   931 	{
       
   932 public:
       
   933 	inline TCharF(TUint aChar);
       
   934 	inline TCharF(const TChar& aChar);
       
   935 	inline TCharF& operator=(TUint aChar);
       
   936 	inline TCharF& operator=(const TChar& aChar);
       
   937 	};
       
   938 
       
   939 
       
   940 
       
   941 
       
   942 /**
       
   943 @publishedAll
       
   944 @released
       
   945 
       
   946 Converts a specified character to lower case and provides functions to convert 
       
   947 additional characters after construction of the object.
       
   948 */
       
   949 class TCharLC : public TChar
       
   950 	{
       
   951 public:
       
   952 	inline TCharLC(TUint aChar);
       
   953 	inline TCharLC(const TChar& aChar);
       
   954 	inline TCharLC& operator=(TUint aChar);
       
   955 	inline TCharLC& operator=(const TChar& aChar);
       
   956 	};
       
   957 
       
   958 
       
   959 
       
   960 
       
   961 /**
       
   962 @publishedAll
       
   963 @released
       
   964 
       
   965 Converts a specified character to upper case and provides functions to convert 
       
   966 additional characters after construction of the object.
       
   967 */
       
   968 class TCharUC : public TChar
       
   969 	{
       
   970 public:
       
   971 	inline TCharUC(TUint aChar);
       
   972 	inline TCharUC(const TChar& aChar);
       
   973 	inline TCharUC& operator=(TUint aChar);
       
   974 	inline TCharUC& operator=(const TChar& aChar);
       
   975 	};
       
   976 
       
   977 
       
   978 
       
   979 /**
       
   980 @publishedAll
       
   981 @released
       
   982 
       
   983 Defines the character representation of a real number type such
       
   984 as a TReal or a TRealX.
       
   985 
       
   986 An object of this type is used by functions that convert real values to
       
   987 character format, for example, the descriptor functions:
       
   988 Num(), AppendNum() and Format().
       
   989 
       
   990 There are three constructors for constructing a suitable object.
       
   991 The data members of the class, however, are public and can be
       
   992 explicitly set after construction.
       
   993 */
       
   994 class TRealFormat
       
   995 	{
       
   996 public:
       
   997 	IMPORT_C TRealFormat();
       
   998 	IMPORT_C TRealFormat(TInt aWidth);
       
   999 	IMPORT_C TRealFormat(TInt aWidth,TInt aDecimalPlaces);
       
  1000 public:
       
  1001     /**
       
  1002     Governs the format of the character representation of the real number.
       
  1003 
       
  1004     This is set to one of the defined format types.
       
  1005 
       
  1006     One or more of the defined format flags can subsequently be ORed into this member.
       
  1007     
       
  1008     @see KRealFormatFixed
       
  1009     @see KRealFormatExponent
       
  1010     @see KRealFormatGeneral
       
  1011     @see KRealFormatNoExponent
       
  1012     @see KRealFormatCalculator
       
  1013     @see KExtraSpaceForSign
       
  1014     @see KAllowThreeDigitExp
       
  1015     @see KDoNotUseTriads
       
  1016     @see KGeneralLimit
       
  1017     @see KUseSigFigs
       
  1018     */
       
  1019 	TInt iType;
       
  1020 	
       
  1021 	
       
  1022 	/**
       
  1023 	Defines the maximum number of characters required to represent the number.
       
  1024 	*/
       
  1025 	TInt iWidth;
       
  1026 	
       
  1027 	
       
  1028 	/**
       
  1029 	Defines either the number of characters to be used to represent the decimal
       
  1030 	portion of the number, or the maximum number of significant digits in
       
  1031 	the character representation of the number.
       
  1032 
       
  1033     The interpretation depends on the chosen format as defined by iType.
       
  1034     
       
  1035 	@see TRealFormat::iType
       
  1036 	*/
       
  1037 	TInt iPlaces;
       
  1038 	
       
  1039 	
       
  1040 	/**
       
  1041 	Defines the character to be used to separate the integer portion of
       
  1042 	a number representation from its decimal portion.
       
  1043 
       
  1044     In general, the character used for this purpose is a matter of local
       
  1045     convention. The TLocale::DecimalSeparator() function can supply the
       
  1046     desired character.
       
  1047 
       
  1048     @see TLocale
       
  1049 	*/
       
  1050 	TChar iPoint;
       
  1051 	
       
  1052 	
       
  1053 	/**
       
  1054 	Defines the character to be used to delimit groups of three digits in
       
  1055 	the integer part of the number.
       
  1056 
       
  1057     In general, the character used for this purpose is a matter of local
       
  1058     convention. The TLocale::ThousandsSeparator() function can supply the
       
  1059     desired character.
       
  1060 
       
  1061     @see TLocale
       
  1062 	*/
       
  1063 	TChar iTriad;
       
  1064 	
       
  1065 	
       
  1066 	/**
       
  1067 	Defines the threshold number of digits above which triad separation is to
       
  1068 	occur. A value of zero disables triad separation and no triad separation
       
  1069 	character (i.e. the character held in iTriad) is inserted into the
       
  1070 	resulting character representation regardless of the number of characters.
       
  1071 
       
  1072     For example, a value of 1 causes the number 1000 to be represented by the
       
  1073     characters "1,000" whereas a value of 4 causes the same number to be
       
  1074     represented by the characters "1000" (This assumes the ‘,’ triad separation
       
  1075     character).
       
  1076 
       
  1077     Note that no triad separation occurs if the flag KDoNotUseTriads is set in
       
  1078     the iType data member.
       
  1079 
       
  1080 	@see TRealFormat::iTriad
       
  1081 	@see KDoNotUseTriads
       
  1082 	*/
       
  1083 	TInt iTriLen;
       
  1084 	};
       
  1085 
       
  1086 
       
  1087 
       
  1088 
       
  1089 /**
       
  1090 @publishedAll
       
  1091 @released
       
  1092 
       
  1093 Defines the extraction mark used by the TLex8 class to indicate the current 
       
  1094 lexical element being analysed.
       
  1095 
       
  1096 In practice, objects of this type are accessed through the TLexMark typedef.
       
  1097 
       
  1098 @see TLexMark
       
  1099 @see TLex8
       
  1100 */
       
  1101 class TLexMark8
       
  1102 	{
       
  1103 public:
       
  1104 	inline TLexMark8();
       
  1105 private:
       
  1106 	inline TLexMark8(const TUint8* aString);
       
  1107 	const TUint8* iPtr;
       
  1108 	friend class TLex8;
       
  1109 	__DECLARE_TEST;
       
  1110 	};
       
  1111 
       
  1112 
       
  1113 
       
  1114 
       
  1115 class TRealX;
       
  1116 /**
       
  1117 @publishedAll
       
  1118 @released
       
  1119 
       
  1120 Provides general string-parsing functions suitable for numeric format
       
  1121 conversions and syntactical-element parsing.
       
  1122 
       
  1123 The class is the 8-bit variant for non-Unicode strings and 8-bit wide
       
  1124 characters.
       
  1125 
       
  1126 An instance of this class stores a string, maintaining an extraction mark 
       
  1127 to indicate the current lexical element being analysed and a pointer to the 
       
  1128 next character to be examined.
       
  1129 
       
  1130 Objects of this type are normally accessed through the build independent type 
       
  1131 TLex.
       
  1132 
       
  1133 @see TLex
       
  1134 */
       
  1135 class TLex8
       
  1136 	{
       
  1137 public:
       
  1138 	IMPORT_C TLex8();
       
  1139 	inline TLex8(const TUint8* aString);
       
  1140 	inline TLex8(const TDesC8& aDes);
       
  1141 	inline TLex8& operator=(const TUint8* aString);
       
  1142 	inline TLex8& operator=(const TDesC8& aDes);
       
  1143 	inline TBool Eos() const;
       
  1144 	inline void Mark(TLexMark8& aMark) const;
       
  1145 	inline void Mark();
       
  1146 	IMPORT_C void Inc();
       
  1147 	IMPORT_C void Inc(TInt aNumber);
       
  1148 	IMPORT_C TChar Get();
       
  1149 	IMPORT_C TChar Peek() const;
       
  1150 	IMPORT_C void UnGet();
       
  1151 	inline void UnGetToMark();
       
  1152 	IMPORT_C void UnGetToMark(const TLexMark8 aMark);
       
  1153 	IMPORT_C void SkipSpace();
       
  1154 	inline void SkipAndMark(TInt aNumber);
       
  1155 	IMPORT_C void SkipAndMark(TInt aNumber, TLexMark8& aMark);
       
  1156 	inline void SkipSpaceAndMark();
       
  1157 	IMPORT_C void SkipSpaceAndMark(TLexMark8& aMark);
       
  1158 	IMPORT_C void SkipCharacters();
       
  1159 	inline TInt TokenLength() const;
       
  1160 	IMPORT_C TInt TokenLength(const TLexMark8 aMark) const;
       
  1161 	IMPORT_C TPtrC8 MarkedToken() const;
       
  1162 	IMPORT_C TPtrC8 MarkedToken(const TLexMark8 aMark) const;
       
  1163 	IMPORT_C TPtrC8 NextToken();
       
  1164 	IMPORT_C TPtrC8 Remainder() const;
       
  1165 	IMPORT_C TPtrC8 RemainderFromMark() const;
       
  1166 	IMPORT_C TPtrC8 RemainderFromMark(const TLexMark8 aMark) const;
       
  1167 	IMPORT_C TInt Offset() const;
       
  1168 	inline TInt MarkedOffset() const;
       
  1169 	IMPORT_C TInt MarkedOffset(const TLexMark8 aMark) const;
       
  1170 	IMPORT_C TInt Val(TInt8& aVal);
       
  1171 	IMPORT_C TInt Val(TInt16& aVal);
       
  1172 	IMPORT_C TInt Val(TInt32& aVal);
       
  1173 	IMPORT_C TInt Val(TInt64& aVal);
       
  1174 	inline TInt Val(TInt& aVal);
       
  1175 	IMPORT_C TInt Val(TUint8& aVal,TRadix aRadix);
       
  1176 	IMPORT_C TInt Val(TUint16& aVal,TRadix aRadix);
       
  1177 	IMPORT_C TInt Val(TUint32& aVal,TRadix aRadix);
       
  1178 	IMPORT_C TInt Val(TInt64& aVal, TRadix aRadix);
       
  1179 	inline TInt Val(TUint& aVal,TRadix aRadix=EDecimal);
       
  1180 	IMPORT_C TInt BoundedVal(TInt32& aVal,TInt aLimit);
       
  1181 	IMPORT_C TInt BoundedVal(TInt64& aVal, const TInt64& aLimit);
       
  1182 	IMPORT_C TInt BoundedVal(TUint32& aVal,TRadix aRadix,TUint aLimit);
       
  1183 	IMPORT_C TInt BoundedVal(TInt64& aVal, TRadix aRadix, const TInt64& aLimit);
       
  1184 	IMPORT_C TInt Val(TReal32& aVal);
       
  1185 	IMPORT_C TInt Val(TReal32& aVal,TChar aPoint);
       
  1186 	IMPORT_C TInt Val(TReal64& aVal);
       
  1187 	IMPORT_C TInt Val(TReal64& aVal,TChar aPoint);
       
  1188 	inline void Assign(const TLex8& aLex);
       
  1189 	IMPORT_C void Assign(const TUint8* aString);
       
  1190 	IMPORT_C void Assign(const TDesC8& aDes);
       
  1191 	TInt Val(TRealX& aVal);
       
  1192 	TInt Val(TRealX& aVal, TChar aPoint);
       
  1193 
       
  1194 	/** @deprecated Use BoundedVal(TInt32& aVal,TInt aLimit) */
       
  1195 	inline TInt Val(TInt32& aVal,TInt aLimit) { return BoundedVal(aVal,aLimit); };
       
  1196 
       
  1197 	/** @deprecated Use BoundedVal(TInt64& aVal,const TInt64& aLimit) */
       
  1198 	inline TInt Val(TInt64& aVal,const TInt64& aLimit) { return BoundedVal(aVal,aLimit); };
       
  1199 
       
  1200 	/** @deprecated Use BoundedVal(TUint32& aVal,TRadix aRadix,TUint aLimit) */
       
  1201 	inline TInt Val(TUint32& aVal,TRadix aRadix,TUint aLimit) { return BoundedVal(aVal,aRadix,aLimit); };
       
  1202 
       
  1203 	/** @deprecated Use BoundedVal(TInt64& aVal,TRadix aRadix,const TInt64& aLimit) */
       
  1204 	inline TInt Val(TInt64& aVal,TRadix aRadix,const TInt64& aLimit) { return BoundedVal(aVal,aRadix,aLimit); };
       
  1205 private:
       
  1206 	void Scndig(TInt& aSig, TInt& aExp, TUint64& aDl);
       
  1207 	void ScndigAfterPoint(TInt& aSig, TUint64& aDl);
       
  1208 	void ValidateMark(const TLexMark8 aMark) const;
       
  1209 private:
       
  1210 	const TUint8* iNext;
       
  1211 	const TUint8* iBuf;
       
  1212 	const TUint8* iEnd;
       
  1213 	TLexMark8 iMark;
       
  1214 	__DECLARE_TEST;
       
  1215 	};
       
  1216 
       
  1217 
       
  1218 
       
  1219 
       
  1220 /**
       
  1221 @publishedAll
       
  1222 @released
       
  1223 
       
  1224 Defines the extraction mark used by the TLex16 class to indicate the current 
       
  1225 lexical element being analysed.
       
  1226 
       
  1227 In practice, objects of this type are accessed through the TLexMark typedef.
       
  1228 
       
  1229 @see TLexMark
       
  1230 @see TLex16
       
  1231 */
       
  1232 class TLexMark16
       
  1233 	{
       
  1234 public:
       
  1235 	inline TLexMark16();
       
  1236 private:
       
  1237 	inline TLexMark16(const TUint16* aString);
       
  1238 	const TUint16* iPtr;
       
  1239 	friend class TLex16;	
       
  1240 	__DECLARE_TEST;
       
  1241 	};
       
  1242 
       
  1243 
       
  1244 
       
  1245 
       
  1246 /**
       
  1247 @publishedAll
       
  1248 @released
       
  1249 
       
  1250 Provides general string-parsing functions suitable for numeric format
       
  1251 conversions and syntactical-element parsing. 
       
  1252 
       
  1253 The class is the 16-bit variant for Unicode strings and 16-bit wide
       
  1254 characters.
       
  1255 
       
  1256 An instance of this class stores a string, maintaining an extraction mark 
       
  1257 to indicate the current lexical element being analysed and a pointer to the 
       
  1258 next character to be examined.
       
  1259 
       
  1260 Objects of this type are normally accessed through the build independent type 
       
  1261 TLex.
       
  1262 
       
  1263 @see TLex
       
  1264 */
       
  1265 class TLex16
       
  1266 	{
       
  1267 public:
       
  1268 	IMPORT_C TLex16();
       
  1269 	inline TLex16(const TUint16* aString);
       
  1270 	inline TLex16(const TDesC16& aDes);
       
  1271 	inline TLex16& operator=(const TUint16* aString);
       
  1272 	inline TLex16& operator=(const TDesC16& aDes);
       
  1273 	inline TBool Eos() const;
       
  1274 	inline void Mark();
       
  1275 	inline void Mark(TLexMark16& aMark) const;
       
  1276 	IMPORT_C void Inc();
       
  1277 	IMPORT_C void Inc(TInt aNumber);
       
  1278 	IMPORT_C TChar Get();
       
  1279 	IMPORT_C TChar Peek() const;
       
  1280 	IMPORT_C void UnGet();
       
  1281 	inline void UnGetToMark();
       
  1282 	IMPORT_C void UnGetToMark(const TLexMark16 aMark);
       
  1283 	IMPORT_C void SkipSpace();
       
  1284 	inline void SkipAndMark(TInt aNumber);
       
  1285 	IMPORT_C void SkipAndMark(TInt aNumber, TLexMark16& aMark);
       
  1286 	IMPORT_C void SkipSpaceAndMark(TLexMark16& aMark);
       
  1287 	inline void SkipSpaceAndMark();
       
  1288 	IMPORT_C void SkipCharacters();
       
  1289 	inline TInt TokenLength() const;
       
  1290 	IMPORT_C TInt TokenLength(const TLexMark16 aMark) const;
       
  1291 	IMPORT_C TPtrC16 MarkedToken() const;
       
  1292 	IMPORT_C TPtrC16 MarkedToken(const TLexMark16 aMark) const;
       
  1293 	IMPORT_C TPtrC16 NextToken();
       
  1294 	IMPORT_C TPtrC16 Remainder() const;
       
  1295 	IMPORT_C TPtrC16 RemainderFromMark() const;
       
  1296 	IMPORT_C TPtrC16 RemainderFromMark(const TLexMark16 aMark) const;
       
  1297 	IMPORT_C TInt Offset() const;
       
  1298 	inline TInt MarkedOffset() const;
       
  1299 	IMPORT_C TInt MarkedOffset(const TLexMark16 aMark) const;
       
  1300 	IMPORT_C TInt Val(TInt8& aVal);
       
  1301 	IMPORT_C TInt Val(TInt16& aVal);
       
  1302 	IMPORT_C TInt Val(TInt32& aVal);
       
  1303 	IMPORT_C TInt Val(TInt64& aVal);
       
  1304 	inline TInt Val(TInt& aVal);
       
  1305 	IMPORT_C TInt Val(TUint8& aVal,TRadix aRadix);
       
  1306 	IMPORT_C TInt Val(TUint16& aVal,TRadix aRadix);
       
  1307 	IMPORT_C TInt Val(TUint32& aVal,TRadix aRadix);
       
  1308 	IMPORT_C TInt Val(TInt64& aVal, TRadix aRadix);
       
  1309 //	inline TInt Val(TInt64& aVal, TRadix aRadix) {return Val(aVal,aRadix);}
       
  1310 	inline TInt Val(TUint& aVal,TRadix aRadix=EDecimal);
       
  1311 	IMPORT_C TInt BoundedVal(TInt32& aVal,TInt aLimit);
       
  1312 	IMPORT_C TInt BoundedVal(TInt64& aVal, const TInt64& aLimit);
       
  1313 	IMPORT_C TInt BoundedVal(TUint32& aVal,TRadix aRadix,TUint aLimit);
       
  1314 	IMPORT_C TInt BoundedVal(TInt64& aVal, TRadix aRadix, const TInt64& aLimit);
       
  1315 	IMPORT_C TInt Val(TReal32& aVal);
       
  1316 	IMPORT_C TInt Val(TReal32& aVal,TChar aPoint);
       
  1317 	IMPORT_C TInt Val(TReal64& aVal);
       
  1318 	IMPORT_C TInt Val(TReal64& aVal,TChar aPoint);
       
  1319 	inline void Assign(const TLex16& aLex);
       
  1320 	IMPORT_C void Assign(const TUint16* aString);
       
  1321 	IMPORT_C void Assign(const TDesC16& aDes);		
       
  1322 	TInt Val(TRealX& aVal);
       
  1323 	TInt Val(TRealX& aVal, TChar aPoint);
       
  1324 
       
  1325 	/** @deprecated Use BoundedVal(TInt32& aVal,TInt aLimit) */
       
  1326 	inline TInt Val(TInt32& aVal,TInt aLimit) { return BoundedVal(aVal,aLimit); };
       
  1327 
       
  1328 	/** @deprecated Use BoundedVal(TInt64& aVal,const TInt64& aLimit) */
       
  1329 	inline TInt Val(TInt64& aVal,const TInt64& aLimit) { return BoundedVal(aVal,aLimit); };
       
  1330 
       
  1331 	/** @deprecated Use BoundedVal(TUint32& aVal,TRadix aRadix,TUint aLimit) */
       
  1332 	inline TInt Val(TUint32& aVal,TRadix aRadix,TUint aLimit) { return BoundedVal(aVal,aRadix,aLimit); };
       
  1333 
       
  1334 	/** @deprecated Use BoundedVal(TInt64& aVal,TRadix aRadix,const TInt64& aLimit) */
       
  1335 	inline TInt Val(TInt64& aVal,TRadix aRadix,const TInt64& aLimit) { return BoundedVal(aVal,aRadix,aLimit); };
       
  1336 private:
       
  1337 	void Scndig(TInt& aSig, TInt& aExp, TUint64& aDl);
       
  1338 	void ValidateMark(const TLexMark16 aMark) const;
       
  1339 private:
       
  1340 	const TUint16* iNext;
       
  1341 	const TUint16* iBuf;
       
  1342 	const TUint16* iEnd;
       
  1343 	TLexMark16 iMark;
       
  1344 	__DECLARE_TEST;
       
  1345 	};
       
  1346 
       
  1347 
       
  1348 
       
  1349 
       
  1350 #if defined(_UNICODE)
       
  1351 /**
       
  1352 @publishedAll
       
  1353 @released
       
  1354 
       
  1355 Provides access to general string-parsing functions suitable for numeric format 
       
  1356 conversions and syntactical-element parsing.
       
  1357 
       
  1358 It maps directly to either a TLex16 for a Unicode build or a TLex8 for a non-Unicode 
       
  1359 build.
       
  1360 
       
  1361 The build independent type should always be used unless an explicit 16 bit 
       
  1362 or 8 bit build variant is required.
       
  1363 
       
  1364 @see TLex16
       
  1365 @see TLex8
       
  1366 */
       
  1367 typedef TLex16 TLex;
       
  1368 
       
  1369 
       
  1370 
       
  1371 
       
  1372 /**
       
  1373 @publishedAll
       
  1374 @released
       
  1375 
       
  1376 Defines the extraction mark used by the TLex classes to indicate the current 
       
  1377 lexical element being analysed. 
       
  1378 
       
  1379 It maps directly to either a TLexMark16 for a Unicode build or a TLexMark8 
       
  1380 for a non-Unicode build.
       
  1381 
       
  1382 The build independent type should always be used unless an explicit 16 bit 
       
  1383 or 8 bit build variant is required.
       
  1384 */
       
  1385 typedef TLexMark16 TLexMark;
       
  1386 
       
  1387 
       
  1388 
       
  1389 
       
  1390 #else
       
  1391 
       
  1392 
       
  1393 
       
  1394 /**
       
  1395 @publishedAll
       
  1396 @released
       
  1397 
       
  1398 Provides access to general string-parsing functions suitable for numeric format 
       
  1399 conversions and syntactical-element parsing.
       
  1400 
       
  1401 It maps directly to either a TLex16 for a Unicode build or a TLex8 for a non-Unicode 
       
  1402 build.
       
  1403 
       
  1404 The build independent type should always be used unless an explicit 16 bit 
       
  1405 or 8 bit build variant is required.
       
  1406 
       
  1407 @see TLex16
       
  1408 @see TLex8
       
  1409 */
       
  1410 typedef TLex8 TLex;
       
  1411 
       
  1412 
       
  1413 
       
  1414 
       
  1415 /**
       
  1416 @publishedAll
       
  1417 @released
       
  1418 
       
  1419 Defines the extraction mark used by the TLex classes to indicate the current 
       
  1420 lexical element being analysed. 
       
  1421 
       
  1422 It maps directly to either a TLexMark16 for a Unicode build or a TLexMark8 
       
  1423 for a non-Unicode build.
       
  1424 
       
  1425 The build independent type should always be used unless an explicit 16 bit 
       
  1426 or 8 bit build variant is required.
       
  1427 */
       
  1428 typedef TLexMark8 TLexMark;
       
  1429 #endif
       
  1430 
       
  1431 
       
  1432 
       
  1433 
       
  1434 /**
       
  1435 @publishedAll
       
  1436 @released
       
  1437 
       
  1438 Packages a Uid type together with a checksum.
       
  1439 
       
  1440 @see TUidType
       
  1441 */
       
  1442 class TCheckedUid
       
  1443 	{
       
  1444 public:
       
  1445 	IMPORT_C TCheckedUid();
       
  1446 	IMPORT_C TCheckedUid(const TUidType& aUidType);
       
  1447 	IMPORT_C TCheckedUid(const TDesC8& aPtr);
       
  1448 	IMPORT_C void Set(const TUidType& aUidType);
       
  1449 	IMPORT_C void Set(const TDesC8& aPtr);
       
  1450 	IMPORT_C TPtrC8 Des() const;
       
  1451 	inline const TUidType& UidType() const;
       
  1452 protected:
       
  1453 	IMPORT_C TUint Check() const;
       
  1454 private:
       
  1455 	TUidType iType;
       
  1456 	TUint iCheck;
       
  1457 	};
       
  1458 
       
  1459 
       
  1460 
       
  1461 
       
  1462 /**
       
  1463 @publishedAll
       
  1464 @released
       
  1465 
       
  1466 A date and time object in which the individual components are accessible in
       
  1467 human-readable form.
       
  1468 
       
  1469 The individual components are: year, month, day, hour, minute,
       
  1470 second and microsecond.
       
  1471 
       
  1472 These components are stored as integers and all except the year are checked for
       
  1473 validity when a TDateTime is constructed or assigned new values.
       
  1474 
       
  1475 This class only supports getting and setting the entire date/time or any component 
       
  1476 of it. It does not support adding or subtracting intervals to or from a time. 
       
  1477 For functions which manipulate times, use class TTime.
       
  1478 
       
  1479 @see TTime
       
  1480 */
       
  1481 class TDateTime
       
  1482 	{
       
  1483 public:
       
  1484 	inline TDateTime();
       
  1485 	IMPORT_C TDateTime(TInt aYear,TMonth aMonth,TInt aDay,TInt aHour,TInt aMinute, TInt aSecond,TInt aMicroSecond);
       
  1486 	IMPORT_C TInt Set(TInt aYear,TMonth aMonth,TInt aDay,TInt aHour,TInt aMinute, TInt aSecond,TInt aMicroSecond);
       
  1487 	IMPORT_C TInt SetYear(TInt aYear);
       
  1488 	IMPORT_C TInt SetYearLeapCheck(TInt aYear);
       
  1489 	IMPORT_C TInt SetMonth(TMonth aMonth);
       
  1490 	IMPORT_C TInt SetDay(TInt aDay);
       
  1491 	IMPORT_C TInt SetHour(TInt aHour);
       
  1492 	IMPORT_C TInt SetMinute(TInt aMinute);
       
  1493 	IMPORT_C TInt SetSecond(TInt aSecond);
       
  1494 	IMPORT_C TInt SetMicroSecond(TInt aMicroSecond);
       
  1495 	inline TInt Year() const;
       
  1496 	inline TMonth Month() const;
       
  1497 	inline TInt Day() const;
       
  1498 	inline TInt Hour() const;
       
  1499 	inline TInt Minute() const;
       
  1500 	inline TInt Second() const;
       
  1501 	inline TInt MicroSecond() const;
       
  1502 private:
       
  1503 	TInt iYear;
       
  1504 	TMonth iMonth;
       
  1505 	TInt iDay;
       
  1506 	TInt iHour;
       
  1507 	TInt iMinute;
       
  1508 	TInt iSecond;
       
  1509 	TInt iMicroSecond;
       
  1510 	};
       
  1511 
       
  1512 
       
  1513 
       
  1514 
       
  1515 /**
       
  1516 @publishedAll
       
  1517 @released
       
  1518 
       
  1519 Represents a time interval of a millionth of a second stored as
       
  1520 a 64-bit integer. 
       
  1521 
       
  1522 It supports the initialisation, setting and getting of an interval and provides
       
  1523 standard comparison operations. Objects of this class can be added to and
       
  1524 subtracted from TTime objects.
       
  1525 
       
  1526 @see TTime
       
  1527 */
       
  1528 class TTimeIntervalMicroSeconds
       
  1529 	{
       
  1530 public:
       
  1531 	inline TTimeIntervalMicroSeconds();
       
  1532 	inline TTimeIntervalMicroSeconds(const TInt64& aInterval);
       
  1533 	inline TTimeIntervalMicroSeconds& operator=(const TInt64& aInterval);
       
  1534 	inline TBool operator==(const TTimeIntervalMicroSeconds& aInterval) const;
       
  1535 	inline TBool operator!=(const TTimeIntervalMicroSeconds& aInterval) const;
       
  1536 	inline TBool operator>=(const TTimeIntervalMicroSeconds& aInterval) const;
       
  1537 	inline TBool operator<=(const TTimeIntervalMicroSeconds& aInterval) const;
       
  1538 	inline TBool operator>(const TTimeIntervalMicroSeconds& aInterval) const;
       
  1539 	inline TBool operator<(const TTimeIntervalMicroSeconds& aInterval) const;
       
  1540 	inline const TInt64& Int64() const;
       
  1541 private:
       
  1542 	TInt64 iInterval;
       
  1543 	};
       
  1544 
       
  1545 
       
  1546 
       
  1547 
       
  1548 /**
       
  1549 @publishedAll
       
  1550 @released
       
  1551 
       
  1552 Provides a base class for all time interval classes using
       
  1553 a 32-bit representation. 
       
  1554 
       
  1555 It supports retrieving the interval and provides various operations for
       
  1556 comparing intervals. Its concrete derived classes can be added to and
       
  1557 subtracted from a TTime.
       
  1558 
       
  1559 The comparison operators simply compare the integer representations of the 
       
  1560 two intervals. They do not take account of different time interval units. 
       
  1561 So, for example, when comparing for equality an interval of three hours with 
       
  1562 an interval of three days, the result is true.
       
  1563 
       
  1564 @see TTime
       
  1565 */
       
  1566 class TTimeIntervalBase
       
  1567 	{
       
  1568 public:
       
  1569 	inline TBool operator==(TTimeIntervalBase aInterval) const;
       
  1570 	inline TBool operator!=(TTimeIntervalBase aInterval) const;
       
  1571 	inline TBool operator>=(TTimeIntervalBase aInterval) const;
       
  1572 	inline TBool operator<=(TTimeIntervalBase aInterval) const;
       
  1573 	inline TBool operator>(TTimeIntervalBase aInterval) const;
       
  1574 	inline TBool operator<(TTimeIntervalBase aInterval) const;
       
  1575 	inline TInt Int() const;
       
  1576 protected:
       
  1577 	inline TTimeIntervalBase();
       
  1578 	inline TTimeIntervalBase(TInt aInterval);
       
  1579 protected:
       
  1580 	TInt iInterval;
       
  1581 	};
       
  1582 
       
  1583 
       
  1584 
       
  1585 
       
  1586 /**
       
  1587 @publishedAll
       
  1588 @released
       
  1589 
       
  1590 Represents a microsecond time interval stored in 32 rather than 64 bits.
       
  1591 
       
  1592 Its range is +-2147483647, which is +-35 minutes, 47 seconds. Comparison and 
       
  1593 interval retrieval functions are provided by the base class TTimeIntervalBase.
       
  1594 */
       
  1595 class TTimeIntervalMicroSeconds32 : public TTimeIntervalBase
       
  1596 	{
       
  1597 public:
       
  1598 	inline TTimeIntervalMicroSeconds32();
       
  1599 	inline TTimeIntervalMicroSeconds32(TInt aInterval);
       
  1600 	inline TTimeIntervalMicroSeconds32& operator=(TInt aInterval);
       
  1601 	};
       
  1602 
       
  1603 
       
  1604 
       
  1605 
       
  1606 /**
       
  1607 @publishedAll
       
  1608 @released
       
  1609 
       
  1610 Represents a time interval in seconds.
       
  1611 
       
  1612 Comparison and interval retrieval functions 
       
  1613 are provided by the base class TTimeIntervalBase.
       
  1614 
       
  1615 The range of values which it can represent is +-2147483647, which is equal to
       
  1616 +-24855 days (approximately 68 years).
       
  1617 */
       
  1618 class TTimeIntervalSeconds : public TTimeIntervalBase
       
  1619 	{
       
  1620 public:
       
  1621 	inline TTimeIntervalSeconds();
       
  1622 	inline TTimeIntervalSeconds(TInt aInterval);
       
  1623 	inline TTimeIntervalSeconds& operator=(TInt aInterval);
       
  1624 	};
       
  1625 
       
  1626 
       
  1627 
       
  1628 
       
  1629 /**
       
  1630 @publishedAll
       
  1631 @released
       
  1632 
       
  1633 Represents a time interval in minutes.
       
  1634 
       
  1635 Comparison and interval retrieval functions 
       
  1636 are provided by the base class TTimeIntervalBase.
       
  1637 */
       
  1638 class TTimeIntervalMinutes : public TTimeIntervalBase
       
  1639 	{
       
  1640 public:
       
  1641 	inline TTimeIntervalMinutes();
       
  1642 	inline TTimeIntervalMinutes(TInt aInterval);
       
  1643 	inline TTimeIntervalMinutes& operator=(TInt aInterval);
       
  1644 	};
       
  1645 
       
  1646 
       
  1647 
       
  1648 
       
  1649 /**
       
  1650 @publishedAll
       
  1651 @released
       
  1652 
       
  1653 Represents a time interval in hours.
       
  1654 
       
  1655 Comparison and interval retrieval functions 
       
  1656 are provided by the base class TTimeIntervalBase.
       
  1657 */
       
  1658 class TTimeIntervalHours : public TTimeIntervalBase
       
  1659 	{
       
  1660 public:
       
  1661 	inline TTimeIntervalHours();
       
  1662 	inline TTimeIntervalHours(TInt aInterval);
       
  1663 	inline TTimeIntervalHours& operator=(TInt aInterval);
       
  1664 	};
       
  1665 
       
  1666 
       
  1667 
       
  1668 
       
  1669 /**
       
  1670 @publishedAll
       
  1671 @released
       
  1672 
       
  1673 Represents a time interval in days.
       
  1674 
       
  1675 Comparison and interval retrieval functions 
       
  1676 are provided by the base class TTimeIntervalBase.
       
  1677 */
       
  1678 class TTimeIntervalDays : public TTimeIntervalBase
       
  1679 	{
       
  1680 public:
       
  1681 	inline TTimeIntervalDays();
       
  1682 	inline TTimeIntervalDays(TInt aInterval);
       
  1683 	inline TTimeIntervalDays& operator=(TInt aInterval);
       
  1684 	};
       
  1685 
       
  1686 
       
  1687 
       
  1688 
       
  1689 /**
       
  1690 @publishedAll
       
  1691 @released
       
  1692 
       
  1693 Represents a time interval in months.
       
  1694 
       
  1695 Comparison and interval retrieval functions 
       
  1696 are provided by the base class TTimeIntervalBase.
       
  1697 */
       
  1698 class TTimeIntervalMonths : public TTimeIntervalBase
       
  1699 	{
       
  1700 public:
       
  1701 	inline TTimeIntervalMonths();
       
  1702 	inline TTimeIntervalMonths(TInt aInterval);
       
  1703 	inline TTimeIntervalMonths& operator=(TInt aInterval);
       
  1704 	};
       
  1705 
       
  1706 
       
  1707 
       
  1708 
       
  1709 /**
       
  1710 @publishedAll
       
  1711 @released
       
  1712 
       
  1713 Represents a time interval in years.
       
  1714 
       
  1715 Comparison and interval retrieval functions 
       
  1716 are provided by the base class TTimeIntervalBase.
       
  1717 */
       
  1718 class TTimeIntervalYears : public TTimeIntervalBase
       
  1719 	{
       
  1720 public:
       
  1721 	inline TTimeIntervalYears();
       
  1722 	inline TTimeIntervalYears(TInt aInterval);
       
  1723 	inline TTimeIntervalYears& operator=(TInt aInterval);
       
  1724 	};
       
  1725 	
       
  1726 	
       
  1727 	
       
  1728 /**
       
  1729 @publishedAll
       
  1730 @released
       
  1731 
       
  1732 An enumeration one or both of whose enumerator values may be returned
       
  1733 by TTime::Parse().
       
  1734 
       
  1735 @see TTime::Parse
       
  1736 */
       
  1737 enum {
       
  1738      /**
       
  1739      Indicates that a time is present.
       
  1740      
       
  1741      @see TTime::Parse
       
  1742      */
       
  1743      EParseTimePresent=0x1,
       
  1744      /**
       
  1745      Indicates that a date is present.
       
  1746      
       
  1747      @see TTime::Parse
       
  1748      */
       
  1749      EParseDatePresent=0x2
       
  1750      };
       
  1751 
       
  1752 
       
  1753 
       
  1754 class TLocale;
       
  1755 /**
       
  1756 @publishedAll
       
  1757 @released
       
  1758 
       
  1759 Stores and manipulates the date and time. 
       
  1760 
       
  1761 It represents a date and time as a number of microseconds since midnight, 
       
  1762 January 1st, 1 AD nominal Gregorian. BC dates are represented by negative 
       
  1763 TTime values. A TTime object may be constructed from a TInt64, a TDateTime 
       
  1764 a string literal, or by default, which initialises the time to an arbitrary 
       
  1765 value. To access human-readable time information, the TTime may be converted 
       
  1766 from a TInt64 into a TDateTime, which represents the date and time as seven 
       
  1767 numeric fields and provides functions to extract these fields. Alternatively, 
       
  1768 to display the time as text, the time may be formatted and placed into a
       
  1769 descriptor using a variety of formatting commands and which may or may not
       
  1770 honour the system's locale settings. The conversion between time and text may
       
  1771 be performed the other way around, so that a descriptor can be parsed and
       
  1772 converted into a TTime value.
       
  1773 
       
  1774 In addition to setting and getting the date and time and converting between 
       
  1775 text and time, TTime provides functions to get intervals between times and 
       
  1776 standard comparison and arithmetic operators which enable time intervals to 
       
  1777 be added or subtracted to or from the time.
       
  1778 
       
  1779 @see TInt64
       
  1780 @see TDateTime
       
  1781 */
       
  1782 class TTime
       
  1783 	{
       
  1784 public:
       
  1785 	inline TTime();
       
  1786 	inline TTime(const TInt64& aTime);
       
  1787 	IMPORT_C TTime(const TDesC& aString);
       
  1788 	IMPORT_C TTime(const TDateTime& aDateTime);
       
  1789 	inline TTime& operator=(const TInt64& aTime);
       
  1790 	IMPORT_C TTime& operator=(const TDateTime& aDateTime);
       
  1791 	IMPORT_C void HomeTime();
       
  1792 	IMPORT_C void UniversalTime();
       
  1793 	IMPORT_C TInt Set(const TDesC& aString);
       
  1794 	IMPORT_C TInt HomeTimeSecure();
       
  1795 	IMPORT_C TInt UniversalTimeSecure();
       
  1796 
       
  1797 	IMPORT_C TDateTime DateTime() const;
       
  1798 	IMPORT_C TTimeIntervalMicroSeconds MicroSecondsFrom(TTime aTime) const;
       
  1799 	IMPORT_C TInt SecondsFrom(TTime aTime,TTimeIntervalSeconds& aInterval) const;
       
  1800 	IMPORT_C TInt MinutesFrom(TTime aTime,TTimeIntervalMinutes& aInterval) const;
       
  1801 	IMPORT_C TInt HoursFrom(TTime aTime,TTimeIntervalHours& aInterval) const;
       
  1802 	IMPORT_C TTimeIntervalDays DaysFrom(TTime aTime) const;
       
  1803 	IMPORT_C TTimeIntervalMonths MonthsFrom(TTime aTime) const;
       
  1804 	IMPORT_C TTimeIntervalYears YearsFrom(TTime aTime) const;
       
  1805 
       
  1806 	IMPORT_C TInt DaysInMonth() const;
       
  1807 	IMPORT_C TDay DayNoInWeek() const;
       
  1808 	IMPORT_C TInt DayNoInMonth() const;
       
  1809 	IMPORT_C TInt DayNoInYear() const;
       
  1810 	IMPORT_C TInt DayNoInYear(TTime aStartDate) const;
       
  1811 	IMPORT_C TInt WeekNoInYear() const;
       
  1812 	IMPORT_C TInt WeekNoInYear(TTime aStartDate) const;
       
  1813 	IMPORT_C TInt WeekNoInYear(TFirstWeekRule aRule) const;
       
  1814 	IMPORT_C TInt WeekNoInYear(TTime aStartDate,TFirstWeekRule aRule) const;
       
  1815 	IMPORT_C void FormatL(TDes& aDes,const TDesC& aFormat) const;
       
  1816 	IMPORT_C void FormatL(TDes& aDes,const TDesC& aFormat,const TLocale& aLocale) const;
       
  1817 	IMPORT_C void RoundUpToNextMinute();
       
  1818 	IMPORT_C TInt Parse(const TDesC& aDes,TInt aCenturyOffset=0);
       
  1819 
       
  1820 	IMPORT_C TTime operator+(TTimeIntervalYears aYear) const;
       
  1821 	IMPORT_C TTime operator+(TTimeIntervalMonths aMonth) const;
       
  1822 	IMPORT_C TTime operator+(TTimeIntervalDays aDay) const;
       
  1823 	IMPORT_C TTime operator+(TTimeIntervalHours aHour) const;
       
  1824 	IMPORT_C TTime operator+(TTimeIntervalMinutes aMinute) const;
       
  1825 	IMPORT_C TTime operator+(TTimeIntervalSeconds aSecond) const;  	
       
  1826 	IMPORT_C TTime operator+(TTimeIntervalMicroSeconds aMicroSecond) const;
       
  1827 	IMPORT_C TTime operator+(TTimeIntervalMicroSeconds32 aMicroSecond) const;
       
  1828 	IMPORT_C TTime operator-(TTimeIntervalYears aYear) const;
       
  1829 	IMPORT_C TTime operator-(TTimeIntervalMonths aMonth) const;
       
  1830 	IMPORT_C TTime operator-(TTimeIntervalDays aDay) const;
       
  1831 	IMPORT_C TTime operator-(TTimeIntervalHours aHour) const;
       
  1832 	IMPORT_C TTime operator-(TTimeIntervalMinutes aMinute) const;
       
  1833 	IMPORT_C TTime operator-(TTimeIntervalSeconds aSecond) const;  	
       
  1834 	IMPORT_C TTime operator-(TTimeIntervalMicroSeconds aMicroSecond) const;
       
  1835 	IMPORT_C TTime operator-(TTimeIntervalMicroSeconds32 aMicroSecond) const;
       
  1836 	IMPORT_C TTime& operator+=(TTimeIntervalYears aYear);
       
  1837 	IMPORT_C TTime& operator+=(TTimeIntervalMonths aMonth);
       
  1838 	IMPORT_C TTime& operator+=(TTimeIntervalDays aDay);
       
  1839 	IMPORT_C TTime& operator+=(TTimeIntervalHours aHour);
       
  1840 	IMPORT_C TTime& operator+=(TTimeIntervalMinutes aMinute);
       
  1841 	IMPORT_C TTime& operator+=(TTimeIntervalSeconds aSecond);	
       
  1842 	IMPORT_C TTime& operator+=(TTimeIntervalMicroSeconds aMicroSecond);
       
  1843 	IMPORT_C TTime& operator+=(TTimeIntervalMicroSeconds32 aMicroSecond);
       
  1844 	IMPORT_C TTime& operator-=(TTimeIntervalYears aYear);
       
  1845 	IMPORT_C TTime& operator-=(TTimeIntervalMonths aMonth);
       
  1846 	IMPORT_C TTime& operator-=(TTimeIntervalDays aDay);
       
  1847 	IMPORT_C TTime& operator-=(TTimeIntervalHours aHour);
       
  1848 	IMPORT_C TTime& operator-=(TTimeIntervalMinutes aMinute);
       
  1849 	IMPORT_C TTime& operator-=(TTimeIntervalSeconds aSecond);	
       
  1850 	IMPORT_C TTime& operator-=(TTimeIntervalMicroSeconds aMicroSecond);
       
  1851 	IMPORT_C TTime& operator-=(TTimeIntervalMicroSeconds32 aMicroSecond);
       
  1852 	inline TBool operator==(TTime aTime) const;
       
  1853 	inline TBool operator!=(TTime aTime) const;
       
  1854 	inline TBool operator>=(TTime aTime) const;
       
  1855 	inline TBool operator<=(TTime aTime) const;
       
  1856 	inline TBool operator>(TTime aTime) const;
       
  1857 	inline TBool operator<(TTime aTime) const;
       
  1858 	inline const TInt64& Int64() const;
       
  1859 private:
       
  1860 	static TTime Convert(const TDateTime& aDateTime);
       
  1861 private:
       
  1862 	TInt64 iTime;
       
  1863 	__DECLARE_TEST;
       
  1864 	};
       
  1865 
       
  1866 
       
  1867 
       
  1868 
       
  1869 /**
       
  1870 @publishedAll
       
  1871 @released
       
  1872 
       
  1873 A utility class whose functions may be used by the other date/time related 
       
  1874 classes.
       
  1875 */
       
  1876 class Time
       
  1877 	{
       
  1878 public:
       
  1879 	IMPORT_C static TTime NullTTime();
       
  1880 	IMPORT_C static TTime MaxTTime();
       
  1881 	IMPORT_C static TTime MinTTime();
       
  1882 	IMPORT_C static TInt DaysInMonth(TInt aYear, TMonth aMonth);
       
  1883 	IMPORT_C static TBool IsLeapYear(TInt aYear);
       
  1884 	IMPORT_C static TInt LeapYearsUpTo(TInt aYear);
       
  1885 	};
       
  1886 
       
  1887 
       
  1888 
       
  1889 
       
  1890 /**
       
  1891 @publishedAll
       
  1892 @released
       
  1893 
       
  1894 Gets a copy of the current locale's full text name for a day of the week.
       
  1895 
       
  1896 After construction or after a call to Set(), the copy of the text can be accessed 
       
  1897 and manipulated using the standard descriptor member functions provided by 
       
  1898 the base class.
       
  1899 
       
  1900 @see KMaxDayName
       
  1901 */
       
  1902 class TDayName : public TBuf<KMaxDayName>
       
  1903 	{
       
  1904 public:
       
  1905 	IMPORT_C TDayName();
       
  1906 	IMPORT_C TDayName(TDay aDay);
       
  1907 	IMPORT_C void Set(TDay aDay);
       
  1908 	};
       
  1909 
       
  1910 
       
  1911 
       
  1912 
       
  1913 /**
       
  1914 @publishedAll
       
  1915 @released
       
  1916 
       
  1917 Gets a copy of the current locale's abbreviated text name for a day of the 
       
  1918 week.
       
  1919 
       
  1920 After construction or after a call to Set(), the copy of the abbreviated text 
       
  1921 can be accessed and manipulated using the standard descriptor member functions 
       
  1922 provided by the base class.
       
  1923 
       
  1924 The abbreviated day name cannot be assumed to be one character. In English, 
       
  1925 it is 3 characters (Mon, Tue, Wed etc.), but the length can vary from locale 
       
  1926 to locale, with a maximum length of KMaxDayNameAbb.
       
  1927 
       
  1928 @see KMaxDayNameAbb
       
  1929 */
       
  1930 class TDayNameAbb : public TBuf<KMaxDayNameAbb>
       
  1931 	{
       
  1932 public:
       
  1933 	IMPORT_C TDayNameAbb();
       
  1934 	IMPORT_C TDayNameAbb(TDay aDay);
       
  1935 	IMPORT_C void Set(TDay aDay);
       
  1936 	};
       
  1937 
       
  1938 
       
  1939 
       
  1940 
       
  1941 /**
       
  1942 @publishedAll
       
  1943 @released
       
  1944 
       
  1945 Gets a copy of the current locale's full text name for a month.
       
  1946 
       
  1947 After construction or after a call to Set(), the copy of the text can be accessed 
       
  1948 and manipulated using the standard descriptor member functions provided by 
       
  1949 the base class.
       
  1950 
       
  1951 @see KMaxMonthName
       
  1952 */
       
  1953 class TMonthName : public TBuf<KMaxMonthName>
       
  1954 	{
       
  1955 public:
       
  1956 	IMPORT_C TMonthName();
       
  1957 	IMPORT_C TMonthName(TMonth aMonth);
       
  1958 	IMPORT_C void Set(TMonth aMonth);
       
  1959 	};
       
  1960 
       
  1961 
       
  1962 
       
  1963 
       
  1964 /**
       
  1965 @publishedAll
       
  1966 @released
       
  1967 
       
  1968 Gets a copy of the current locale's abbreviated text name for a month.
       
  1969 
       
  1970 After construction or after a call to Set(), the copy of the abbreviated text 
       
  1971 can be accessed and manipulated using the standard descriptor member functions 
       
  1972 provided by the base class.
       
  1973 
       
  1974 @see KMaxMonthNameAbb
       
  1975 */
       
  1976 class TMonthNameAbb : public TBuf<KMaxMonthNameAbb>
       
  1977 	{
       
  1978 public:
       
  1979 	IMPORT_C TMonthNameAbb();
       
  1980 	IMPORT_C TMonthNameAbb(TMonth aMonth);
       
  1981 	IMPORT_C void Set(TMonth aMonth);
       
  1982 	};
       
  1983 
       
  1984 
       
  1985 
       
  1986 
       
  1987 /**
       
  1988 @publishedAll
       
  1989 @released
       
  1990 
       
  1991 Gets a copy of the current locale's date suffix text for a specific day in 
       
  1992 the month.
       
  1993 
       
  1994 The text is the set of characters which can be appended to dates of the month 
       
  1995 (e.g. in English, st for 1st, nd for 2nd etc).
       
  1996 
       
  1997 After construction or after a call to Set(), the copy of the suffix text can 
       
  1998 be accessed and manipulated using the standard descriptor member functions 
       
  1999 provided by the base class.
       
  2000 */
       
  2001 class TDateSuffix : public TBuf<KMaxSuffix>
       
  2002 	{
       
  2003 public:
       
  2004 	IMPORT_C TDateSuffix();
       
  2005 	IMPORT_C TDateSuffix(TInt aDateSuffix);
       
  2006 	IMPORT_C void Set(TInt aDateSuffix);
       
  2007 	};
       
  2008 
       
  2009 
       
  2010 
       
  2011 
       
  2012 /**
       
  2013 @publishedAll
       
  2014 @released
       
  2015 
       
  2016 Current locale's am/pm text
       
  2017 
       
  2018 This class retrieves a copy of the current locale's text identifying time 
       
  2019 before and after noon. In English, this is am and pm.
       
  2020 
       
  2021 After construction or after a call to Set(), the copy of the text can be accessed 
       
  2022 and manipulated using the standard descriptor member functions provided by 
       
  2023 the base class.
       
  2024 */
       
  2025 class TAmPmName : public TBuf<KMaxAmPmName>
       
  2026 	{
       
  2027 public:
       
  2028 	IMPORT_C TAmPmName();
       
  2029 	IMPORT_C TAmPmName(TAmPm aSelector);
       
  2030 	IMPORT_C void Set(TAmPm aSelector);
       
  2031 	};
       
  2032 
       
  2033 
       
  2034 
       
  2035 
       
  2036 /**
       
  2037 @publishedAll
       
  2038 @released
       
  2039 
       
  2040 Gets a copy of the currency symbol(s) in use by the current locale.
       
  2041 
       
  2042 After construction or after a call to TCurrencySymbol::Set(), the copy of 
       
  2043 the currency symbol(s) can be accessed and manipulated using the standard 
       
  2044 descriptor member functions provided by the base class.
       
  2045 */
       
  2046 class TCurrencySymbol : public TBuf<KMaxCurrencySymbol>
       
  2047 	{
       
  2048 public:
       
  2049 	IMPORT_C TCurrencySymbol();
       
  2050 	IMPORT_C void Set();
       
  2051 	};
       
  2052 
       
  2053 
       
  2054 
       
  2055 
       
  2056 /**
       
  2057 @publishedAll
       
  2058 @released
       
  2059 
       
  2060 Contains a format list that defines the short date format.
       
  2061 
       
  2062 An instance of this class should be passed as the second argument
       
  2063 to TTime::FormatL().
       
  2064 The string does not include any time components. The content of the long 
       
  2065 date format specification is taken from the system-wide settings.
       
  2066 
       
  2067 For example, in the English locale, the short date format would be something
       
  2068 like 14/1/2000.
       
  2069 
       
  2070 This class is used as follows:
       
  2071 
       
  2072 @code
       
  2073 TTime now;
       
  2074 now.HomeTime();
       
  2075 TBuf<KMaxShortDateFormatSpec*2> buffer;
       
  2076 now.FormatL(buffer,TShortDateFormatSpec());
       
  2077 @endcode
       
  2078 
       
  2079 @see KMaxShortDateFormatSpec
       
  2080 @see TTime::FormatL
       
  2081 */
       
  2082 class TShortDateFormatSpec : public TBuf<KMaxShortDateFormatSpec> // to be passed into TTime::FormatL
       
  2083 	{
       
  2084 public:
       
  2085 	IMPORT_C TShortDateFormatSpec();
       
  2086 	IMPORT_C void Set();
       
  2087 	};
       
  2088 
       
  2089 
       
  2090 
       
  2091 
       
  2092 /**
       
  2093 @publishedAll
       
  2094 @released
       
  2095 
       
  2096 Contains a format list that defines the long date format.
       
  2097 
       
  2098 An instance of this class should be passed as the second argument
       
  2099 to TTime::FormatL(). 
       
  2100 The string does not include any time components. The content of the long 
       
  2101 date format specification is taken from the system-wide settings.
       
  2102 
       
  2103 For example, in the English locale, the long date format would be
       
  2104 something like 14th January 2000.
       
  2105 
       
  2106 This class is used as follows:
       
  2107 
       
  2108 @code
       
  2109 TTime now;
       
  2110 now.HomeTime();
       
  2111 TBuf<KMaxLongDateFormatSpec*2> buffer;
       
  2112 now.FormatL(buffer,TLongDateFormatSpec());
       
  2113 @endcode
       
  2114 
       
  2115 @see KMaxLongDateFormatSpec
       
  2116 @see TTime::FormatL
       
  2117 */
       
  2118 class TLongDateFormatSpec : public TBuf<KMaxLongDateFormatSpec> // to be passed into TTime::FormatL
       
  2119 	{
       
  2120 public:
       
  2121 	IMPORT_C TLongDateFormatSpec();
       
  2122 	IMPORT_C void Set();
       
  2123 	};
       
  2124 
       
  2125 
       
  2126 
       
  2127 
       
  2128 /**
       
  2129 @publishedAll
       
  2130 @released
       
  2131 
       
  2132 Contains a format list that defines the time string format. 
       
  2133 
       
  2134 An instance of this class should be passed as the second argument
       
  2135 to TTime::FormatL().
       
  2136 The string does not include any time components. The content of the time format 
       
  2137 specification is taken from the system-wide settings.
       
  2138 
       
  2139 This class is used as follows:
       
  2140 
       
  2141 @code
       
  2142 TTime now;
       
  2143 now.HomeTime();
       
  2144 TBuf<KMaxTimeFormatSpec*2> buffer;
       
  2145 now.FormatL(buffer,TTimeFormatSpec());
       
  2146 @endcode
       
  2147 
       
  2148 @see KMaxTimeFormatSpec
       
  2149 @see TTime::FormatL
       
  2150 */
       
  2151 class TTimeFormatSpec : public TBuf<KMaxTimeFormatSpec> // to be passed into TTime::FormatL
       
  2152 	{
       
  2153 public:
       
  2154 	IMPORT_C TTimeFormatSpec();
       
  2155 	IMPORT_C void Set();
       
  2156 	};
       
  2157 
       
  2158 
       
  2159 
       
  2160 
       
  2161 /**
       
  2162 @publishedAll
       
  2163 @released
       
  2164 
       
  2165 Sets and gets the system's locale settings.
       
  2166 
       
  2167 Symbian OS maintains the locale information internally. On
       
  2168 construction, this object is initialized with the system information
       
  2169 for all locale items.
       
  2170 */
       
  2171 class TLocale
       
  2172 	{
       
  2173 public:
       
  2174 		
       
  2175     /**
       
  2176     Indicates how negative currency values are formatted.
       
  2177     */
       
  2178 	enum TNegativeCurrencyFormat
       
  2179 		{
       
  2180 	    /**
       
  2181 	    A minus sign is inserted before the currency symbol and value.
       
  2182 	    */
       
  2183 		ELeadingMinusSign,
       
  2184 
       
  2185 		/**
       
  2186 		The currency value and symbol are enclosed in brackets (no minus sign
       
  2187 		is used).
       
  2188 		*/
       
  2189 		EInBrackets, //this one must be non-zero for binary compatibility with the old TBool TLocale::iCurrencyNegativeInBrackets which was exposed in the binary interface because it was accessed via *inline* functions
       
  2190 			
       
  2191 	    /**
       
  2192 	    A minus sign is inserted after the currency symbol and value.
       
  2193         */
       
  2194 		ETrailingMinusSign,
       
  2195 		
       
  2196         /**
       
  2197         A minus sign is inserted between the currency symbol and the value.
       
  2198         */
       
  2199 		EInterveningMinusSign
       
  2200 		};
       
  2201 		
       
  2202 	/**
       
  2203 	Flags for negative currency values formatting
       
  2204 	*/
       
  2205 	enum 
       
  2206 		{
       
  2207 		/** 
       
  2208 		If this flag is set and the currency value being formatted is negative,
       
  2209 		if there is a space between the currency symbol and the value,
       
  2210 		that space is lost. 
       
  2211 		*/
       
  2212 		EFlagNegativeLoseSpace = 0x00000001,
       
  2213 		
       
  2214 		/**   
       
  2215 		If this flag is set and the currency value being formatted is negative,
       
  2216 		the position of the currency symbol is placed in the opposite direction 
       
  2217 		from the position set for the positive currency value. 
       
  2218 		*/
       
  2219 		EFlagNegativeCurrencySymbolOpposite=0x00000002
       
  2220 		};
       
  2221 	/** Indicates how the device universal time is maintained */
       
  2222 	enum TDeviceTimeState
       
  2223 		{
       
  2224 		/** Universal time is maintained by the device RTC and the user selection 
       
  2225 		of the locale of the device indicating offset from GMT and daylight saving*/
       
  2226 		EDeviceUserTime,
       
  2227 
       
  2228 		/** Universal time and offset from GMT is supplied by the mobile network
       
  2229 		and maintained by device RTC */
       
  2230 		ENITZNetworkTimeSync
       
  2231 		};
       
  2232 public:
       
  2233 	IMPORT_C TLocale();
       
  2234 	inline TLocale(TInt);
       
  2235 	IMPORT_C void Refresh();
       
  2236 	IMPORT_C TInt Set() const;
       
  2237 	IMPORT_C void FormatCurrency(TDes& aText, TInt aAmount);
       
  2238 	IMPORT_C void FormatCurrency(TDes& aText, TInt64 aAmount);
       
  2239 	IMPORT_C void FormatCurrency(TDes& aText, TDesOverflow& aOverflowHandler, TInt aAmount); 
       
  2240 	IMPORT_C void FormatCurrency(TDes& aText, TDesOverflow& aOverflowHandler, TInt64 aAmount); 
       
  2241 	
       
  2242 	inline TInt CountryCode() const;
       
  2243 	inline void SetCountryCode(TInt aCode);
       
  2244 	inline TTimeIntervalSeconds UniversalTimeOffset() const;
       
  2245 	inline TDateFormat DateFormat() const;
       
  2246 	inline void SetDateFormat(TDateFormat aFormat);
       
  2247 	inline TTimeFormat TimeFormat() const;
       
  2248 	inline void SetTimeFormat(TTimeFormat aFormat);
       
  2249 	inline TLocalePos CurrencySymbolPosition() const;
       
  2250 	inline void SetCurrencySymbolPosition(TLocalePos aPos);
       
  2251 	inline TBool CurrencySpaceBetween() const;
       
  2252 	inline void SetCurrencySpaceBetween(TBool aSpace);
       
  2253 	inline TInt CurrencyDecimalPlaces() const;
       
  2254 	inline void SetCurrencyDecimalPlaces(TInt aPlaces);
       
  2255 	inline TBool CurrencyNegativeInBrackets() const;        // These two functions are deprecated
       
  2256 	inline void SetCurrencyNegativeInBrackets(TBool aBool); // They are here to maintain compatibility. Use the New functions -> NegativeCurrencyFormat setter/getter. 
       
  2257  	inline TBool CurrencyTriadsAllowed() const;  
       
  2258 	inline void SetCurrencyTriadsAllowed(TBool aBool);
       
  2259 	inline TChar ThousandsSeparator() const;
       
  2260 	inline void SetThousandsSeparator(const TChar& aChar);
       
  2261 	inline TChar DecimalSeparator() const;
       
  2262 	inline void SetDecimalSeparator(const TChar& aChar);
       
  2263 	inline TChar DateSeparator(TInt aIndex) const;
       
  2264 	inline void SetDateSeparator(const TChar& aChar,TInt aIndex);
       
  2265 	inline TChar TimeSeparator(TInt aIndex) const;
       
  2266 	inline void SetTimeSeparator(const TChar& aChar,TInt aIndex);
       
  2267 	inline TBool AmPmSpaceBetween() const;
       
  2268 	inline void SetAmPmSpaceBetween(TBool aSpace);
       
  2269 	inline TLocalePos AmPmSymbolPosition() const;
       
  2270 	inline void SetAmPmSymbolPosition(TLocalePos aPos);
       
  2271 	inline TUint DaylightSaving() const;
       
  2272 	inline TBool QueryHomeHasDaylightSavingOn() const;
       
  2273 	inline TDaylightSavingZone HomeDaylightSavingZone() const;
       
  2274 	inline TUint WorkDays() const;
       
  2275 	inline void SetWorkDays(TUint aMask);
       
  2276 	inline TDay StartOfWeek() const;
       
  2277 	inline void SetStartOfWeek(TDay aDay);
       
  2278 	inline TClockFormat ClockFormat() const;
       
  2279 	inline void SetClockFormat(TClockFormat aFormat);
       
  2280 	inline TUnitsFormat UnitsGeneral() const;
       
  2281 	inline void SetUnitsGeneral(TUnitsFormat aFormat);
       
  2282 	inline TUnitsFormat UnitsDistanceShort() const;
       
  2283 	inline void SetUnitsDistanceShort(TUnitsFormat aFormat);
       
  2284 	inline TUnitsFormat UnitsDistanceLong() const;
       
  2285 	inline void SetUnitsDistanceLong(TUnitsFormat aFormat);
       
  2286 	inline TNegativeCurrencyFormat NegativeCurrencyFormat() const;
       
  2287 	inline void SetNegativeCurrencyFormat(TNegativeCurrencyFormat aNegativeCurrencyFormat);
       
  2288 	inline TBool NegativeLoseSpace() const;
       
  2289 	inline void SetNegativeLoseSpace(TBool aBool);
       
  2290 	inline TBool NegativeCurrencySymbolOpposite() const;
       
  2291 	inline void SetNegativeCurrencySymbolOpposite(TBool aBool);
       
  2292 	inline TLanguage LanguageDowngrade(TInt aIndex) const;	 // 0 <= aIndex < 3
       
  2293 	inline void SetLanguageDowngrade(TInt aIndex, TLanguage aLanguage);
       
  2294 	inline TDigitType DigitType() const;
       
  2295 	inline void SetDigitType(TDigitType aDigitType);
       
  2296 	inline TDeviceTimeState DeviceTime() const;
       
  2297  	inline void SetDeviceTime(TDeviceTimeState aState);
       
  2298  	inline TInt RegionCode() const;
       
  2299 
       
  2300 	void SetDefaults(); /**< @internalComponent */
       
  2301 
       
  2302 private:
       
  2303 	friend class TExtendedLocale;
       
  2304 private:
       
  2305 	TInt iCountryCode;
       
  2306 	TTimeIntervalSeconds iUniversalTimeOffset;
       
  2307 	TDateFormat iDateFormat;
       
  2308 	TTimeFormat iTimeFormat;
       
  2309 	TLocalePos iCurrencySymbolPosition;
       
  2310 	TBool iCurrencySpaceBetween;
       
  2311 	TInt iCurrencyDecimalPlaces;
       
  2312 	TNegativeCurrencyFormat iNegativeCurrencyFormat; //	replaced TBool iCurrencyNegativeInBrackets
       
  2313 	TBool iCurrencyTriadsAllowed;
       
  2314 	TChar iThousandsSeparator;
       
  2315 	TChar iDecimalSeparator;
       
  2316 	TChar iDateSeparator[KMaxDateSeparators];
       
  2317 	TChar iTimeSeparator[KMaxTimeSeparators];
       
  2318 	TLocalePos iAmPmSymbolPosition;
       
  2319 	TBool iAmPmSpaceBetween;
       
  2320 	TUint iDaylightSaving;
       
  2321 	TDaylightSavingZone iHomeDaylightSavingZone;
       
  2322 	TUint iWorkDays;
       
  2323 	TDay iStartOfWeek;
       
  2324 	TClockFormat iClockFormat;
       
  2325 	TUnitsFormat iUnitsGeneral;
       
  2326 	TUnitsFormat iUnitsDistanceShort;
       
  2327 	TUnitsFormat iUnitsDistanceLong;
       
  2328 	TUint iExtraNegativeCurrencyFormatFlags;
       
  2329 	TUint16 iLanguageDowngrade[3];
       
  2330 	TUint16 iRegionCode;
       
  2331 	TDigitType iDigitType;
       
  2332  	TDeviceTimeState iDeviceTimeState;
       
  2333  	TInt iSpare[0x1E];
       
  2334 	};
       
  2335 
       
  2336 /** 
       
  2337 @publishedAll
       
  2338 @released
       
  2339 
       
  2340 TLocaleAspect
       
  2341 
       
  2342 Enumeration used with TExtendedLocale::LoadLocaleAspect to select which
       
  2343 locale information is to be replaced from the contents of the Locale
       
  2344 DLL being loaded.
       
  2345 
       
  2346 ELocaleLanguageSettings - Replaces everything that should change with
       
  2347                           language selection e.g. Month names, Day names,
       
  2348                           etc,
       
  2349 
       
  2350 ELocaleLocaleSettings - Replaces the currently selected currency symbol,
       
  2351                         TLocale settings, and FAT utility functions
       
  2352 
       
  2353 ELocaleTimeAndDateSettings - Replaces the current time and date display
       
  2354                              format settings.
       
  2355 
       
  2356 ELocaleCollateSettings - Replaces the "system" preferred Charset
       
  2357                          (because that's where the collation table
       
  2358                          is!). The "Default" charset will remain
       
  2359                          unchanged until after the next power
       
  2360                          off/on cycle
       
  2361 */
       
  2362 enum TLocaleAspect
       
  2363 	{
       
  2364 	ELocaleLanguageSettings = 0x01,
       
  2365 	ELocaleCollateSetting = 0x02,
       
  2366 	ELocaleLocaleSettings = 0x04,
       
  2367 	ELocaleTimeDateSettings = 0x08,
       
  2368 	};
       
  2369 
       
  2370 /**
       
  2371 @internalComponent
       
  2372 */
       
  2373 struct SLocaleLanguage
       
  2374 	{
       
  2375 	TLanguage 		iLanguage;
       
  2376 	const TText*	iDateSuffixTable;
       
  2377 	const TText*	iDayTable;
       
  2378 	const TText*	iDayAbbTable;
       
  2379 	const TText*	iMonthTable;
       
  2380 	const TText*	iMonthAbbTable;
       
  2381 	const TText*	iAmPmTable;
       
  2382 	const TText16* const*	iMsgTable;
       
  2383 	};
       
  2384 
       
  2385 /**
       
  2386 @internalComponent
       
  2387 */
       
  2388 struct SLocaleLocaleSettings
       
  2389 	{
       
  2390 	TText	iCurrencySymbol[KMaxCurrencySymbol+1];
       
  2391 	TAny*	iLocaleExtraSettingsDllPtr;
       
  2392 	};
       
  2393 
       
  2394 /**
       
  2395 @internalComponent
       
  2396 */
       
  2397 struct SLocaleTimeDateFormat
       
  2398 	{
       
  2399 	TText	iShortDateFormatSpec[KMaxShortDateFormatSpec+1];
       
  2400 	TText	iLongDateFormatSpec[KMaxLongDateFormatSpec+1];
       
  2401 	TText	iTimeFormatSpec[KMaxTimeFormatSpec+1];
       
  2402 	TAny*	iLocaleTimeDateFormatDllPtr;
       
  2403 	};
       
  2404 
       
  2405 struct LCharSet;
       
  2406 
       
  2407 /**
       
  2408 @publishedAll
       
  2409 @released
       
  2410 
       
  2411 Extended locale class
       
  2412 
       
  2413 This class holds a collection of locale information. It contains a TLocale internally.
       
  2414 It has methods to load a locale DLL and to set the system wide locale information.
       
  2415 
       
  2416 */
       
  2417 class TExtendedLocale
       
  2418 	{
       
  2419 public:
       
  2420 
       
  2421 	// Default constructor, create an empty instance
       
  2422 	IMPORT_C TExtendedLocale();
       
  2423 
       
  2424 	// Initialise to (or restore from!) current system wide locale
       
  2425 	// settings
       
  2426 	IMPORT_C void LoadSystemSettings();
       
  2427 	
       
  2428 	// Overwrite current system wide locale settings with the current
       
  2429 	// contents of this TExtendedLocale
       
  2430 	IMPORT_C TInt SaveSystemSettings();
       
  2431 
       
  2432 	//load a complete locale data from a single locale dll
       
  2433 	IMPORT_C TInt LoadLocale(const TDesC& aLocaleDllName);
       
  2434 	
       
  2435 	//load a complete locale data from three locale dlls, which are language lcoale dll, region locale dll, and collation locale dll.
       
  2436 	IMPORT_C TInt LoadLocale(const TDesC& aLanguageLocaleDllName, const TDesC& aRegionLocaleDllName, const TDesC& aCollationLocaleDllName);	
       
  2437 	
       
  2438 	// Load an additional Locale DLL and over-ride a selected subset
       
  2439 	// (currently ELocaleLanguageSettings to select an alternative set
       
  2440 	// of language specific text strings, ELocaleCollateSetting to
       
  2441 	// select a new system collation table,
       
  2442 	// ELocaleOverRideMatchCollationTable to locally select an
       
  2443 	// alternative collation order for matching text strings, or
       
  2444 	// ELocaleOverRideSortCollationTable for ordering text strings)
       
  2445 	// of settings with its contents
       
  2446 	IMPORT_C TInt LoadLocaleAspect(TUint aAspectGroup, const TDesC& aLocaleDllName);
       
  2447 	
       
  2448 	//load a locale aspect from a locale dll. 
       
  2449 	//Such as load language locale aspect from locale language dll; 
       
  2450 	//load region locale aspect from locale region dll; 
       
  2451 	//load collation locale aspect from locale collation dll. 
       
  2452 	//There are in all three aspect, which are langauge, region, and collation.
       
  2453 	IMPORT_C TInt LoadLocaleAspect(const TDesC& aLocaleDllName);
       
  2454 
       
  2455 	// Set the currency Symbol
       
  2456 	IMPORT_C TInt SetCurrencySymbol(const TDesC &aSymbol);
       
  2457 
       
  2458 	// Get the name of the DLL holding the data for a particular set
       
  2459 	// of Locale properties
       
  2460 	IMPORT_C TInt GetLocaleDllName(TLocaleAspect aLocaleDataSet, TDes& aDllName);
       
  2461 
       
  2462 	// Get the preferred collation method.
       
  2463 	// Note that some Charsets may contain more than one Collation
       
  2464 	// method (e.g "dictionary" v "phonebook" ordering) so an optional
       
  2465 	// index parameter can be used to select between them
       
  2466 	IMPORT_C TCollationMethod GetPreferredCollationMethod(TInt index = 0) ;
       
  2467 	
       
  2468 	//Get the Currency Symbol
       
  2469 	IMPORT_C TPtrC GetCurrencySymbol();
       
  2470 	
       
  2471 	//Get the Long Date Format
       
  2472 	IMPORT_C TPtrC GetLongDateFormatSpec();
       
  2473 	
       
  2474 	//Get the Short Date Format
       
  2475 	IMPORT_C TPtrC GetShortDateFormatSpec();
       
  2476 	
       
  2477 	//Get the Time Format
       
  2478 	IMPORT_C TPtrC GetTimeFormatSpec();
       
  2479 
       
  2480 	// Retrieve a reference to the encapsulated TLocale
       
  2481 	inline TLocale*	GetLocale();
       
  2482 
       
  2483 private:
       
  2484 
       
  2485 	TInt DoLoadLocale(const TDesC& aLocaleDllName, TLibraryFunction* aExportList);
       
  2486 	void DoUpdateLanguageSettings(TLibraryFunction* aExportList);
       
  2487 	void DoUpdateLocaleSettings(TLibraryFunction* aExportList);
       
  2488 	void DoUpdateTimeDateFormat(TLibraryFunction* aExportList);
       
  2489 	
       
  2490 #ifdef SYMBIAN_DISTINCT_LOCALE_MODEL	
       
  2491 	void DoUpdateLanguageSettingsV2(TLibraryFunction* aExportList);
       
  2492 	void DoUpdateLocaleSettingsV2(TLibraryFunction* aExportList);		
       
  2493 	TInt CheckLocaleDllName(const TDesC& aLocaleDllName, TInt& languageID);
       
  2494 	void AddExtension(TDes& aFileName, TInt aExtension);	
       
  2495 #endif
       
  2496 
       
  2497 private:
       
  2498 
       
  2499 	TLocale					iLocale;
       
  2500 	SLocaleLanguage			iLanguageSettings;
       
  2501 	SLocaleLocaleSettings	iLocaleExtraSettings;
       
  2502 	SLocaleTimeDateFormat	iLocaleTimeDateFormat;
       
  2503 	const LCharSet*			iDefaultCharSet;
       
  2504 	const LCharSet*			iPreferredCharSet;
       
  2505 	};
       
  2506 
       
  2507 
       
  2508 
       
  2509 
       
  2510 /**
       
  2511 @publishedAll
       
  2512 @released
       
  2513 
       
  2514 Geometric rectangle.
       
  2515 
       
  2516 The class represents a rectangle whose sides are parallel with the axes of 
       
  2517 the co-ordinate system. 
       
  2518 
       
  2519 The co-ordinates of the top-left and bottom-right corners are used to set 
       
  2520 the dimensions of the rectangle. The bottom right co-ordinate is outside the 
       
  2521 rectangle. Thus TRect(TPoint(2,2),TSize(4,4)) is equal
       
  2522 to TRect(TPoint(2,2),TPoint(6,6)), 
       
  2523 and in both cases you get a 4x4 pixel rectangle on the screen.
       
  2524 
       
  2525 Functions are provided to initialise and manipulate the rectangle and to extract 
       
  2526 information about it.
       
  2527 */
       
  2528 class TRect
       
  2529 	{
       
  2530 public:
       
  2531 	enum TUninitialized { EUninitialized };
       
  2532 	/**
       
  2533 	Constructs a default rectangle.
       
  2534 	
       
  2535 	This initialises the co-ordinates of its top 
       
  2536 	left and bottom right corners to (0,0).
       
  2537 	*/
       
  2538 	TRect(TUninitialized) {}
       
  2539 	IMPORT_C TRect();
       
  2540 	IMPORT_C TRect(TInt aAx,TInt aAy,TInt aBx,TInt aBy);
       
  2541 	IMPORT_C TRect(const TPoint& aPointA,const TPoint& aPointB);
       
  2542 	IMPORT_C TRect(const TPoint& aPoint,const TSize& aSize);
       
  2543 	IMPORT_C TRect(const TSize& aSize);
       
  2544 	IMPORT_C TBool operator==(const TRect& aRect) const;
       
  2545 	IMPORT_C TBool operator!=(const TRect& aRect) const;
       
  2546 	IMPORT_C void SetRect(TInt aAx,TInt aAy,TInt aBx,TInt aBy);
       
  2547 	IMPORT_C void SetRect(const TPoint& aPointTL,const TPoint& aPointBR);
       
  2548 	IMPORT_C void SetRect(const TPoint& aPoint,const TSize& aSize);
       
  2549 	IMPORT_C void Move(TInt aDx,TInt aDy);
       
  2550 	IMPORT_C void Move(const TPoint& aOffset);
       
  2551 	IMPORT_C void Resize(TInt aDx,TInt aDy);
       
  2552 	IMPORT_C void Resize(const TSize& aSize);
       
  2553 	IMPORT_C void Shrink(TInt aDx,TInt aDy);
       
  2554 	IMPORT_C void Shrink(const TSize& aSize);
       
  2555 	IMPORT_C void Grow(TInt aDx,TInt aDy);
       
  2556 	IMPORT_C void Grow(const TSize& aSize);
       
  2557 	IMPORT_C void BoundingRect(const TRect& aRect);
       
  2558 	IMPORT_C TBool IsEmpty() const;
       
  2559 	IMPORT_C TBool Intersects(const TRect& aRect) const;
       
  2560 	IMPORT_C void Intersection(const TRect& aRect);
       
  2561 	IMPORT_C void Normalize();
       
  2562 	IMPORT_C TBool Contains(const TPoint& aPoint) const;
       
  2563 	IMPORT_C TSize Size() const;
       
  2564 	IMPORT_C TInt Width() const;
       
  2565 	IMPORT_C TInt Height() const;
       
  2566 	IMPORT_C TBool IsNormalized() const;
       
  2567 	IMPORT_C TPoint Center() const;
       
  2568 	IMPORT_C void SetSize(const TSize& aSize);
       
  2569 	IMPORT_C void SetWidth(TInt aWidth);
       
  2570 	IMPORT_C void SetHeight(TInt aHeight);
       
  2571 private:
       
  2572 	void Adjust(TInt aDx,TInt aDy);
       
  2573 public:
       
  2574 	/**
       
  2575 	The x and y co-ordinates of the top left hand corner of the rectangle.
       
  2576 	*/
       
  2577 	TPoint iTl;
       
  2578 	
       
  2579 	/**
       
  2580 	The x and y co-ordinates of the bottom right hand corner of the rectangle.
       
  2581 	*/
       
  2582 	TPoint iBr;
       
  2583 	};
       
  2584 
       
  2585 
       
  2586 
       
  2587 
       
  2588 /**
       
  2589 @publishedAll
       
  2590 @released
       
  2591 
       
  2592 Clipping region - abstract base class. 
       
  2593 
       
  2594 This abstract base class represents a 2-dimensional area which is used by 
       
  2595 Graphics, the graphics window server, and the text window server to define 
       
  2596 regions of the display which need to be updated, or regions within which all 
       
  2597 operations must occur. 
       
  2598 
       
  2599 A TRegion is defined in terms of an array of TRects and the more complex the 
       
  2600 region, the more TRects are required to represent it.
       
  2601 
       
  2602 A clipping region initially has space allocated for five rectangles.
       
  2603 If manipulations result in a region which requires more than this, an attempt
       
  2604 is made to allocate more rectangles. If this cannot be done, an error flag
       
  2605 is set, and all subsequent operations involving the region have no effect
       
  2606 (except possibly to propagate the error flag to other regions).
       
  2607 The CheckError() member function allows 
       
  2608 the error flag to be tested; Clear() can be used to clear it.
       
  2609 
       
  2610 The redraw logic of application programs may use the TRegion in various ways:
       
  2611 
       
  2612 1. minimally, they pass it to the graphics context as the clipping region; when 
       
  2613    a graphics context is activated to a window, the clipping region is set up 
       
  2614    automatically
       
  2615 
       
  2616 2. if they wish to avoid redrawing objects which are outside the general area 
       
  2617    of the region, they may use TRegion::BoundingRect() to return the rectangle 
       
  2618    which bounds the clipping region, and draw only primitives that lie within 
       
  2619    that rectangle
       
  2620 
       
  2621 3. if they wish to exercise finer control, they may extract the individual rectangles 
       
  2622    that comprise the clipping region using Operator[]().
       
  2623 
       
  2624 Application programs may also manipulate clipping regions in order to constrain 
       
  2625 parts of their redrawing to narrower areas of the screen than the clipping 
       
  2626 region offered by the window server. To do this, functions that allow clipping 
       
  2627 region manipulation may be used; for example, adding or removing rectangles 
       
  2628 or finding the intersection or union of two regions.
       
  2629 */
       
  2630 class TRegion
       
  2631 	{
       
  2632 public:
       
  2633 	inline TInt Count() const;
       
  2634 	inline const TRect* RectangleList() const;
       
  2635 	inline TBool CheckError() const;
       
  2636 	IMPORT_C TBool IsEmpty() const;
       
  2637 	IMPORT_C TRect BoundingRect() const;
       
  2638 	IMPORT_C const TRect& operator[](TInt aIndex) const;
       
  2639 	IMPORT_C void Copy(const TRegion& aRegion);
       
  2640 	IMPORT_C void AddRect(const TRect& aRect);
       
  2641 	IMPORT_C void SubRect(const TRect& aRect,TRegion* aSubtractedRegion=NULL);
       
  2642 	IMPORT_C void Offset(TInt aXoffset,TInt aYoffset);
       
  2643 	IMPORT_C void Offset(const TPoint& aOffset);
       
  2644 	IMPORT_C void Union(const TRegion& aRegion);
       
  2645 	IMPORT_C void Intersection(const TRegion& aRegion,const TRegion& aRegion2);
       
  2646 	IMPORT_C void Intersect(const TRegion& aRegion);
       
  2647 	IMPORT_C void SubRegion(const TRegion& aRegion,TRegion* aSubtractedRegion=NULL);
       
  2648 	IMPORT_C void ClipRect(const TRect& aRect);
       
  2649 	IMPORT_C void Clear();
       
  2650 	IMPORT_C void Tidy();
       
  2651 	IMPORT_C TInt Sort();
       
  2652 	IMPORT_C TInt Sort(const TPoint& aOffset);
       
  2653 	IMPORT_C void ForceError();
       
  2654 	IMPORT_C TBool IsContainedBy(const TRect& aRect) const;
       
  2655 	IMPORT_C TBool Contains(const TPoint& aPoint) const;
       
  2656 	IMPORT_C TBool Intersects(const TRect& aRect) const;	
       
  2657 protected:
       
  2658 	IMPORT_C TRect* RectangleListW();
       
  2659 	IMPORT_C TRegion(TInt aAllocedRects);
       
  2660 	inline TRegion();
       
  2661 	TBool SetListSize(TInt aCount);
       
  2662 	void AppendRect(const TRect& aRect);
       
  2663 	void DeleteRect(TRect* aRect);
       
  2664 	void AppendRegion(TRegion& aRegion);
       
  2665 	void MergeRect(const TRect& aRect, TBool aEnclosed);
       
  2666 	void SubtractRegion(const TRegion &aRegion,TRegion *aSubtractedRegion=NULL);
       
  2667 	void ShrinkRegion();
       
  2668 	TRect* ExpandRegion(TInt aCount);
       
  2669 protected:
       
  2670 	TInt iCount;
       
  2671 	TBool iError;
       
  2672 	TInt iAllocedRects;
       
  2673 protected:
       
  2674 	enum {ERRegionBuf=0x40000000};
       
  2675 	};
       
  2676 
       
  2677 
       
  2678 
       
  2679 
       
  2680 /**
       
  2681 @publishedAll
       
  2682 @released
       
  2683 
       
  2684 Expandable region.
       
  2685 
       
  2686 This class provides for the construction and destruction of a TRegion, including 
       
  2687 a granularity for expanding the region. A region;s granularity represents 
       
  2688 the number of memory slots allocated when the object is created, and the number 
       
  2689 of new memory slots allocated each time an RRegion is expanded beyond the 
       
  2690 number of free slots. The default granularity is five.
       
  2691 */
       
  2692 class RRegion : public TRegion
       
  2693 	{
       
  2694 private:
       
  2695 	enum {EDefaultGranularity=5};
       
  2696 protected:
       
  2697 	IMPORT_C RRegion(TInt aBuf,TInt aGran);
       
  2698 public:
       
  2699 	IMPORT_C RRegion();
       
  2700 	IMPORT_C RRegion(TInt aGran);
       
  2701 	IMPORT_C RRegion(const RRegion& aRegion);
       
  2702 	IMPORT_C RRegion(const TRect& aRect,TInt aGran=EDefaultGranularity);
       
  2703 	IMPORT_C RRegion(TInt aCount,TRect* aRectangleList,TInt aGran=EDefaultGranularity);
       
  2704 	IMPORT_C void Close();
       
  2705 	IMPORT_C void Destroy();
       
  2706 	inline TInt CheckSpare() const;
       
  2707 private:
       
  2708 	TInt iGranularity;
       
  2709 	TRect* iRectangleList;
       
  2710 	friend class TRegion;
       
  2711 	};
       
  2712 
       
  2713 
       
  2714 
       
  2715 
       
  2716 /**
       
  2717 @publishedAll
       
  2718 @released
       
  2719 
       
  2720 Region with pre-allocated buffer. 
       
  2721 
       
  2722 This class provides the functionality of an RRegion, but in addition, for 
       
  2723 optimisation purposes, uses a buffer containing pre-allocated space for as 
       
  2724 many rectangles as are specified in the granularity. 
       
  2725 
       
  2726 When this buffer is full, cell allocation takes place as for an RRegion, and 
       
  2727 the RRegionBuf effectively becomes an RRegion. In this case, the region does 
       
  2728 not revert to using the buffer, even if the region were to shrink so that 
       
  2729 the buffer could, once again, contain the region. When the region is no longer 
       
  2730 required, call Close(), defined in the base class RRegion, to free up all 
       
  2731 memory.
       
  2732 */
       
  2733 template <TInt S>
       
  2734 class RRegionBuf : public RRegion
       
  2735 	{
       
  2736 public:
       
  2737 	inline RRegionBuf();
       
  2738 	inline RRegionBuf(const RRegion& aRegion);
       
  2739 	inline RRegionBuf(const RRegionBuf<S>& aRegion);
       
  2740 	inline RRegionBuf(const TRect& aRect);
       
  2741 private:
       
  2742 	TInt8 iRectangleBuf[S*sizeof(TRect)];
       
  2743 	};
       
  2744 
       
  2745 
       
  2746 
       
  2747 
       
  2748 /**
       
  2749 @publishedAll
       
  2750 @released
       
  2751 
       
  2752 A fixed size region.
       
  2753 
       
  2754 The region consists of a fixed number of rectangles; this number is specified 
       
  2755 in the templated argument. The region cannot be expanded to contain more than 
       
  2756 this number of rectangles. If an attempt is made to do so, the region's 
       
  2757 error flag is set, and the region is cleared.
       
  2758 
       
  2759 Note that when adding a rectangle to a region, if that rectangle overlaps 
       
  2760 an existing rectangle, the operation causes more than one rectangle to be 
       
  2761 created.
       
  2762 */
       
  2763 template <TInt S>
       
  2764 class TRegionFix : public TRegion
       
  2765 	{
       
  2766 public:
       
  2767 	inline TRegionFix();
       
  2768 	inline TRegionFix(const TRect& aRect);
       
  2769 	inline TRegionFix(const TRegionFix<S>& aRegion);
       
  2770 private:
       
  2771 	TInt8 iRectangleBuf[S*sizeof(TRect)];
       
  2772 	};
       
  2773 
       
  2774 
       
  2775 
       
  2776 
       
  2777 /**
       
  2778 @publishedAll
       
  2779 @released
       
  2780 
       
  2781 Base class for searching for global kernel objects.
       
  2782 
       
  2783 This is the base class for a number of classes which are used to find specific 
       
  2784 types of global kernel object such as semaphores, threads and mutexes;
       
  2785 TFindSemaphore, TFindThread and TFindMutex are typical examples of such
       
  2786 derived classes.
       
  2787 
       
  2788 The class implements the common behaviour, specifically, the storage of the 
       
  2789 match pattern which is used to search for object names.
       
  2790 
       
  2791 This class is not intended to be explicitly instantiated; it has public
       
  2792 constructors but they are part of the class implementation and are described
       
  2793 for information only.
       
  2794 */
       
  2795 class TFindHandleBase : public TFindHandle
       
  2796 	{
       
  2797 public:
       
  2798 	IMPORT_C TFindHandleBase();
       
  2799 	IMPORT_C TFindHandleBase(const TDesC& aMatch);
       
  2800 	IMPORT_C void Find(const TDesC& aMatch);
       
  2801 protected:
       
  2802 	TInt NextObject(TFullName& aResult,TInt aObjectType);
       
  2803 private:
       
  2804 	
       
  2805 	/**
       
  2806 	The full name of the last kernel side object found.
       
  2807 	*/
       
  2808 	TFullName iMatch;
       
  2809 	};
       
  2810 
       
  2811 
       
  2812 
       
  2813 
       
  2814 /**
       
  2815 @publishedAll
       
  2816 @released
       
  2817 
       
  2818 Finds all global semaphores whose full names match a specified pattern.
       
  2819 
       
  2820 The match pattern can be set into the TFindSemaphore object at construction; 
       
  2821 it can also be changed at any time after construction by using the Find() 
       
  2822 member function of the TFindHandleBase base class.
       
  2823 
       
  2824 After construction, the Next() member function can be used repeatedly to find 
       
  2825 successive global semaphores whose full names match the current pattern.
       
  2826 
       
  2827 A successful call to Next() means that a matching global semaphore has been 
       
  2828 found. To open a handle on this semaphore, call the RSemaphore::Open() function 
       
  2829 and pass a reference to this TFindSemaphore.
       
  2830 
       
  2831 Pattern matching is part of descriptor behaviour.
       
  2832 
       
  2833 @see TFindHandleBase::Find
       
  2834 @see TFindSemaphore::Next
       
  2835 @see RSemaphore::Open
       
  2836 @see TDesC16::Match
       
  2837 @see TDesC8::Match
       
  2838 */
       
  2839 class TFindSemaphore : public TFindHandleBase
       
  2840 	{
       
  2841 public:
       
  2842 	inline TFindSemaphore();
       
  2843 	inline TFindSemaphore(const TDesC& aMatch);
       
  2844 	IMPORT_C TInt Next(TFullName& aResult);
       
  2845 	};
       
  2846 
       
  2847 
       
  2848 
       
  2849 
       
  2850 /**
       
  2851 @publishedAll
       
  2852 @released
       
  2853 
       
  2854 Finds all global mutexes whose full names match a specified pattern.
       
  2855 
       
  2856 The match pattern can be set into the object at construction; it can also 
       
  2857 be changed at any time after construction by using the Find() member function 
       
  2858 of the base class.
       
  2859 
       
  2860 After construction, the Next() member function may be used repeatedly to find 
       
  2861 successive global mutexes whose full names match the current pattern.
       
  2862 
       
  2863 A successful call to Next() means that a matching global mutex has been found. 
       
  2864 To open a handle on this mutex, call the Open() member function of RMutex 
       
  2865 and pass a reference to this TFindMutex object.
       
  2866 
       
  2867 Pattern matching is part of descriptors behaviour.
       
  2868 
       
  2869 @see TFindHandleBase::Find
       
  2870 @see TFindMutex::Next
       
  2871 @see RMutex::Open
       
  2872 @see TDesC16::Match
       
  2873 @see TDesC8::Match
       
  2874 */
       
  2875 class TFindMutex : public TFindHandleBase
       
  2876 	{
       
  2877 public:
       
  2878 	inline TFindMutex();
       
  2879 	inline TFindMutex(const TDesC& aMatch);
       
  2880 	IMPORT_C TInt Next(TFullName& aResult);
       
  2881 	};
       
  2882 
       
  2883 
       
  2884 
       
  2885 
       
  2886 /**
       
  2887 @publishedAll
       
  2888 @released
       
  2889 
       
  2890 Searches for all global chunks by pattern matching against the names of (Kernel 
       
  2891 side) chunk objects.
       
  2892 
       
  2893 The match pattern can be set into this object at construction; it can also 
       
  2894 be changed at any time after construction by using TFindHandleBase::Find().
       
  2895 
       
  2896 After construction, call TFindChunk::Next() repeatedly to find successive 
       
  2897 chunks whose names match the current pattern. A successful call
       
  2898 to TFindChunk::Next() means that a matching chunk has been found.
       
  2899 
       
  2900 @see TFindHandleBase
       
  2901 */
       
  2902 class TFindChunk : public TFindHandleBase
       
  2903 	{
       
  2904 public:
       
  2905 	inline TFindChunk();
       
  2906 	inline TFindChunk(const TDesC& aMatch);
       
  2907 	IMPORT_C TInt Next(TFullName& aResult);
       
  2908 	};
       
  2909 
       
  2910 
       
  2911 
       
  2912 
       
  2913 
       
  2914 /**
       
  2915 @publishedAll
       
  2916 @released
       
  2917 
       
  2918 Searches for threads by pattern matching against the names
       
  2919 of thread objects.
       
  2920 
       
  2921 The match pattern can be set into this object at construction; it can also be
       
  2922 changed at any time after construction by using TFindHandleBase::Find().
       
  2923 
       
  2924 After construction, call TFindThread::Next() repeatedly to find successive
       
  2925 threads whose names match the current pattern.
       
  2926 A successful call to TFindThread::Next() means that a matching thread has
       
  2927 been found. To open a handle on this thread, call RThread::Open() and pass
       
  2928 a reference to this TFindThread.
       
  2929 
       
  2930 @see RThread
       
  2931 */
       
  2932 class TFindThread : public TFindHandleBase
       
  2933 	{
       
  2934 public:
       
  2935 	inline TFindThread();
       
  2936 	inline TFindThread(const TDesC& aMatch);
       
  2937 	IMPORT_C TInt Next(TFullName& aResult);
       
  2938 	};
       
  2939 
       
  2940 
       
  2941 
       
  2942 
       
  2943 /**
       
  2944 @publishedAll
       
  2945 @released
       
  2946 
       
  2947 Searches for processes by pattern matching against the names
       
  2948 of process objects.
       
  2949 
       
  2950 The match pattern can be set into this object at construction; it can also be
       
  2951 changed at any time after construction by using TFindHandleBase::Find().
       
  2952 
       
  2953 After construction, call TFindProcess::Next() repeatedly to find successive
       
  2954 processes whose names match the current pattern.
       
  2955 A successful call to TFindProcess::Next() means that a matching process has
       
  2956 been found. To open a handle on this process, call RProcess::Open() and pass
       
  2957 a reference to this TFindProcess.
       
  2958 
       
  2959 @see RProcess
       
  2960 */
       
  2961 class TFindProcess : public TFindHandleBase
       
  2962 	{
       
  2963 public:
       
  2964 	inline TFindProcess();
       
  2965 	inline TFindProcess(const TDesC& aMatch);
       
  2966 	IMPORT_C TInt Next(TFullName& aResult);
       
  2967 	};
       
  2968 
       
  2969 
       
  2970 
       
  2971 /**
       
  2972 @publishedAll
       
  2973 @released
       
  2974 
       
  2975 Searches for LDD factory objects by pattern matching against the names of 
       
  2976  LDD factory objects.
       
  2977 
       
  2978 An LDD factory object is an instance of a DLogicalDevice derived class. 
       
  2979 
       
  2980 The match pattern can be set into this object at construction; it can also 
       
  2981 be changed at any time after construction by using TFindHandleBase::Find().
       
  2982 
       
  2983 After construction, call TFindLogicalDevice::Next() repeatedly to find successive 
       
  2984 LDD factory objects whose names match the current pattern. A successful call to 
       
  2985 TFindLogicalDevice::Next() means that a matching LDD factory object has been found.
       
  2986 
       
  2987 The name of an LDD factory object is set by its Install() member function as 
       
  2988 part of the construction process.
       
  2989 */
       
  2990 class TFindLogicalDevice : public TFindHandleBase
       
  2991 	{
       
  2992 public:
       
  2993 	inline TFindLogicalDevice();
       
  2994 	inline TFindLogicalDevice(const TDesC& aMatch);
       
  2995 	IMPORT_C TInt Next(TFullName& aResult);
       
  2996 	};
       
  2997 
       
  2998 /**
       
  2999 @publishedAll
       
  3000 @released
       
  3001 
       
  3002 Searches for PDD factory objects by pattern matching against the names of
       
  3003 PDD factory objects.
       
  3004 
       
  3005 A PDD factory object is an instance of a DPhysicalDevice derived class. 
       
  3006 
       
  3007 The match pattern can be set into this object at construction; it can also be 
       
  3008 changed at any time after construction by using TFindHandleBase::Find().
       
  3009 
       
  3010 After construction, call TFindPhysicalDevice::Next() repeatedly to find successive 
       
  3011 PDD factory objects whose names match the current pattern. A successful call to 
       
  3012 TFindPhysicalDevice::Next() means that a matching PDD factory object has been found.
       
  3013 
       
  3014 The name of a PDD factory object is set by its Install() member function as part 
       
  3015 of the construction process.
       
  3016 */
       
  3017 class TFindPhysicalDevice : public TFindHandleBase
       
  3018 	{
       
  3019 public:
       
  3020 	inline TFindPhysicalDevice();
       
  3021 	inline TFindPhysicalDevice(const TDesC& aMatch);
       
  3022 	IMPORT_C TInt Next(TFullName& aResult);
       
  3023 	};
       
  3024 
       
  3025 
       
  3026 
       
  3027 
       
  3028 
       
  3029 /**
       
  3030 @publishedAll
       
  3031 @released
       
  3032 
       
  3033 Searches for servers by pattern matching against the names of kernel side
       
  3034 server objects.
       
  3035 
       
  3036 The match pattern can be set into this object at construction; it can also
       
  3037 be changed at any time after construction by using the TFindHandleBase::Find()
       
  3038 base class.
       
  3039 
       
  3040 After construction, call TFindServer::Next() repeatedly to find successive
       
  3041 servers whose names match the current pattern.
       
  3042 A successful call to TFindServer::Next() means that a matching server
       
  3043 has been found.
       
  3044 */
       
  3045 class TFindServer : public TFindHandleBase
       
  3046 	{
       
  3047 public:
       
  3048 	inline TFindServer();
       
  3049 	inline TFindServer(const TDesC& aMatch);
       
  3050 	IMPORT_C TInt Next(TFullName& aResult);
       
  3051 	};
       
  3052 
       
  3053 
       
  3054 
       
  3055 
       
  3056 /**
       
  3057 @publishedAll
       
  3058 @released
       
  3059 
       
  3060 Searches for DLLs whose full names match a specified pattern.
       
  3061 
       
  3062 The match pattern is set at construction but can also be changed at any time
       
  3063 after construction by using TFindHandleBase::Find().
       
  3064 
       
  3065 After construction, use TFindLibrary::Next() to repeatedly find successive DLLs
       
  3066 whose names match the current pattern. A successful call to
       
  3067 TFindLibrary::Next() means that a matching DLL has been found.
       
  3068 */
       
  3069 class TFindLibrary : public TFindHandleBase
       
  3070 	{
       
  3071 public:
       
  3072 	inline TFindLibrary();
       
  3073 	inline TFindLibrary(const TDesC& aMatch);
       
  3074 	IMPORT_C TInt Next(TFullName& aResult);
       
  3075 	};
       
  3076 
       
  3077 
       
  3078 
       
  3079 /**
       
  3080 @publishedAll
       
  3081 @released
       
  3082 
       
  3083 User side handle to an LDD factory object, an instance of a DLogicalDevice 
       
  3084 derived class.
       
  3085 
       
  3086 The LDD factory object is a Kernel side object which is constructed on the 
       
  3087 Kernel heap when the logical device is opened using User::LoadLogicalDevice(). 
       
  3088 The handle allows the User side to get information about the logical device.
       
  3089 
       
  3090 To use the device, a thread must create and use an instance of an 
       
  3091 RBusLogicalChannel derived class.
       
  3092 
       
  3093 */
       
  3094 class RDevice : public RHandleBase
       
  3095 	{
       
  3096 public:
       
  3097 	inline TInt Open(const TFindLogicalDevice& aFind,TOwnerType aType=EOwnerProcess);
       
  3098 	IMPORT_C TInt Open(const TDesC& aName,TOwnerType aType=EOwnerProcess);
       
  3099 	IMPORT_C void GetCaps(TDes8& aDes) const;
       
  3100 	IMPORT_C TBool QueryVersionSupported(const TVersion& aVer) const;
       
  3101 	IMPORT_C TBool IsAvailable(TInt aUnit, const TDesC* aPhysicalDevice, const TDesC8* anInfo) const;
       
  3102 	};
       
  3103 
       
  3104 /**
       
  3105 @publishedAll
       
  3106 @released
       
  3107 
       
  3108 Asynchronous timer services. 
       
  3109 
       
  3110 Five types of asynchronous request are supported by the class:
       
  3111 
       
  3112 1. Requesting an event after a specified interval
       
  3113 
       
  3114 2. Requesting an event at a specified system time
       
  3115 
       
  3116 3. Requesting a timer event on a specific second fraction
       
  3117 
       
  3118 4. Requesting an event if an interval elapses with no user activity.
       
  3119 
       
  3120 5. Requesting an event after a specified interval, to a resolution of 1ms.
       
  3121    
       
  3122 Each of these requests can be cancelled.
       
  3123 
       
  3124 The timer exists from its creation, following a call to RTimer::CreateLocal(),
       
  3125 until it is destroyed by a call to the Close() member function of the base
       
  3126 class RHandleBase.
       
  3127 
       
  3128 This class is ultimately implemented in terms of the nanokernel tick, and
       
  3129 therefore the granularity of the generated events is limited to the period of
       
  3130 this timer.  This is variant specific, but is usually 1 millisecond.
       
  3131 
       
  3132 Note that the CTimer active object uses an RTimer.
       
  3133 */
       
  3134 class RTimer : public RHandleBase
       
  3135 	{
       
  3136 public:
       
  3137 	IMPORT_C TInt CreateLocal();
       
  3138 	IMPORT_C void Cancel();
       
  3139 	IMPORT_C void After(TRequestStatus& aStatus,TTimeIntervalMicroSeconds32 anInterval);
       
  3140 	IMPORT_C void AfterTicks(TRequestStatus &aStatus, TInt aTicks);
       
  3141 	IMPORT_C void At(TRequestStatus& aStatus,const TTime& aTime);
       
  3142 	IMPORT_C void AtUTC(TRequestStatus& aStatus,const TTime& aUTCTime);
       
  3143 	IMPORT_C void Lock(TRequestStatus& aStatus,TTimerLockSpec aLock);
       
  3144 	IMPORT_C void Inactivity(TRequestStatus& aStatus, TTimeIntervalSeconds aSeconds);
       
  3145 	IMPORT_C void HighRes(TRequestStatus& aStatus,TTimeIntervalMicroSeconds32 anInterval);
       
  3146 	};
       
  3147 
       
  3148 
       
  3149 
       
  3150 
       
  3151 /**
       
  3152 @publishedAll
       
  3153 @released
       
  3154 
       
  3155 A handle to a dynamically loadable DLL.
       
  3156 
       
  3157 The class is not intended for user derivation.
       
  3158 */
       
  3159 class RLibrary : public RHandleBase
       
  3160 	{
       
  3161 public:
       
  3162 	IMPORT_C void Close();
       
  3163 	IMPORT_C TInt Load(const TDesC& aFileName, const TUidType& aType);
       
  3164 	IMPORT_C TInt Load(const TDesC& aFileName, const TDesC& aPath=KNullDesC);
       
  3165 	IMPORT_C TInt Load(const TDesC& aFileName, const TDesC& aPath, const TUidType& aType);
       
  3166 	IMPORT_C TInt Load(const TDesC& aFileName, const TDesC& aPath, const TUidType& aType, TUint32 aModuleVersion);
       
  3167 	IMPORT_C TInt LoadRomLibrary(const TDesC& aFileName, const TDesC& aPath);
       
  3168 	IMPORT_C TLibraryFunction Lookup(TInt anOrdinal) const;
       
  3169 	IMPORT_C TUidType Type() const;
       
  3170 	IMPORT_C TFileName FileName() const;
       
  3171 	IMPORT_C TInt GetRamSizes(TInt& aCodeSize, TInt& aConstDataSize);
       
  3172 	IMPORT_C TInt Init(); /**< @internalTechnology */
       
  3173 public:
       
  3174 	/**
       
  3175 	Class representing information about an executable binary, (DLL or EXE).
       
  3176 	@internalTechnology
       
  3177 	*/
       
  3178 	struct TInfo
       
  3179 		{
       
  3180 		TUint32 iModuleVersion;			/**< Version number */
       
  3181 		TUidType iUids;					/**< UIDs */
       
  3182 		TSecurityInfo iSecurityInfo;	/**< Security Info */
       
  3183 		};
       
  3184 
       
  3185 	/**
       
  3186 	Class representing information about an executable binary, (DLL or EXE), version 2.
       
  3187 	@internalTechnology
       
  3188 	*/
       
  3189 	struct TInfoV2 : public TInfo
       
  3190 		{
       
  3191 		TUint8 iHardwareFloatingPoint;	/**< Which hardware floating point used, from TFloatingPointType */
       
  3192 		enum TDebugAttributes
       
  3193 		{
       
  3194 			EDebugAllowed = 1<<0, ///< Flags set if executable may be debugged.
       
  3195 			ETraceAllowed = 1<<1 ///< Flags set if executable may be traced.
       
  3196 		};
       
  3197 		TUint8 iDebugAttributes; ///< Bitmask of values from enum TDebugAttributes
       
  3198 		TUint8 iSpare[6];
       
  3199 		};
       
  3200 
       
  3201 	/**
       
  3202 	Type representing a TInfo struct packaged as a descriptor.
       
  3203 	@internalTechnology
       
  3204 	*/
       
  3205 	typedef TPckgBuf<TInfo> TInfoBuf;
       
  3206 
       
  3207 	/**
       
  3208 	Type representing a TInfo struct packaged as a descriptor, version 2.
       
  3209 	@internalTechnology
       
  3210 	*/
       
  3211 	typedef TPckgBuf<TInfoV2> TInfoBufV2;
       
  3212 
       
  3213 	/**
       
  3214 	@internalTechnology
       
  3215 	*/
       
  3216 	enum TRequiredImageHeaderSize
       
  3217 		{
       
  3218 #ifdef __WINS__
       
  3219 		/**
       
  3220 		Size of header data which should be passed to GetInfoFromHeader()
       
  3221 		*/
       
  3222 		KRequiredImageHeaderSize = KMaxTInt
       
  3223 #else
       
  3224 		KRequiredImageHeaderSize = 9*1024
       
  3225 #endif
       
  3226 		};
       
  3227 
       
  3228 	IMPORT_C static TInt GetInfoFromHeader(const TDesC8& aHeader, TDes8& aInfoBuf);
       
  3229 
       
  3230 	/**
       
  3231 	@internalTechnology
       
  3232 	@deprecated Use TInfo
       
  3233 	*/
       
  3234 	struct SInfo
       
  3235 		{
       
  3236 		TUint32 iModuleVersion;
       
  3237 		TUidType iUids;
       
  3238 		SSecurityInfo iS;
       
  3239 		};
       
  3240 
       
  3241 	/**
       
  3242 	@internalTechnology
       
  3243 	@deprecated Use TInfoBuf
       
  3244 	*/
       
  3245 	typedef TPckgBuf<SInfo> SInfoBuf;
       
  3246 
       
  3247 	/**
       
  3248 	@internalTechnology
       
  3249 	*/
       
  3250 	IMPORT_C static TInt GetInfo(const TDesC& aFileName, TDes8& aInfoBuf);
       
  3251 private:
       
  3252 	TInt InitL();
       
  3253 	};
       
  3254 
       
  3255 
       
  3256 
       
  3257 
       
  3258 /**
       
  3259 @publishedAll
       
  3260 @released
       
  3261 
       
  3262 A handle to a critical section.
       
  3263 
       
  3264 A critical section itself is a kernel object, and is implemented using
       
  3265 a semaphore. The class RCriticalSection inherits privately from RSemaphore
       
  3266 as a matter of implementation and this is, in effect, equivalent to using
       
  3267 a semaphore.
       
  3268 
       
  3269 The public functions of RSemaphore are not part of the public API of this 
       
  3270 class.
       
  3271 
       
  3272 As with all handles, they should be closed after use. This class provides 
       
  3273 the necessary Close() function, which should be called when the handle is 
       
  3274 no longer required.
       
  3275 
       
  3276 @see RHandleBase::Close
       
  3277 */
       
  3278 class RCriticalSection : private RSemaphore
       
  3279 	{
       
  3280 public:
       
  3281 	IMPORT_C RCriticalSection();
       
  3282 	IMPORT_C TInt CreateLocal(TOwnerType aType=EOwnerProcess);
       
  3283 	IMPORT_C void Close();
       
  3284 	IMPORT_C void Wait();
       
  3285 	IMPORT_C void Signal();
       
  3286 	inline TBool IsBlocked() const;
       
  3287 private:
       
  3288 	TInt iBlocked;
       
  3289 	};
       
  3290 
       
  3291 
       
  3292 
       
  3293 /**
       
  3294 @publishedAll
       
  3295 @released
       
  3296 
       
  3297 A handle to a mutex.
       
  3298 
       
  3299 The mutex itself is a kernel side object.
       
  3300 
       
  3301 Handles should be closed after use. RHandleBase provides the necessary Close() 
       
  3302 function which should be called when the handle is no longer required.
       
  3303 
       
  3304 @see RHandleBase::Close
       
  3305 */
       
  3306 class RMutex : public RHandleBase
       
  3307 	{
       
  3308 public:
       
  3309 	inline TInt Open(const TFindMutex& aFind,TOwnerType aType=EOwnerProcess);
       
  3310 	IMPORT_C TInt CreateLocal(TOwnerType aType=EOwnerProcess);
       
  3311 	IMPORT_C TInt CreateGlobal(const TDesC& aName,TOwnerType aType=EOwnerProcess);
       
  3312 	IMPORT_C TInt OpenGlobal(const TDesC& aName,TOwnerType aType=EOwnerProcess);
       
  3313 	IMPORT_C TInt Open(RMessagePtr2 aMessage,TInt aParam,TOwnerType aType=EOwnerProcess);
       
  3314 	IMPORT_C TInt Open(TInt aArgumentIndex, TOwnerType aType=EOwnerProcess);
       
  3315 	IMPORT_C void Wait();
       
  3316 	IMPORT_C void Signal();
       
  3317 	IMPORT_C TBool IsHeld();
       
  3318 	};
       
  3319 
       
  3320 
       
  3321 
       
  3322 /**
       
  3323 @publishedAll
       
  3324 @released
       
  3325 
       
  3326 A handle to a condition variable.
       
  3327 
       
  3328 The condition variable itself is a kernel side object.
       
  3329 
       
  3330 Handles should be closed after use. RHandleBase provides the necessary Close() 
       
  3331 function which should be called when the handle is no longer required.
       
  3332 
       
  3333 @see RHandleBase::Close
       
  3334 */
       
  3335 class RCondVar : public RHandleBase
       
  3336 	{
       
  3337 public:
       
  3338 	IMPORT_C TInt CreateLocal(TOwnerType aType=EOwnerProcess);
       
  3339 	IMPORT_C TInt CreateGlobal(const TDesC& aName, TOwnerType aType=EOwnerProcess);
       
  3340 	IMPORT_C TInt OpenGlobal(const TDesC& aName, TOwnerType aType=EOwnerProcess);
       
  3341 	IMPORT_C TInt Open(RMessagePtr2 aMessage, TInt aParam, TOwnerType aType=EOwnerProcess);
       
  3342 	IMPORT_C TInt Open(TInt aArgumentIndex, TOwnerType aType=EOwnerProcess);
       
  3343 	IMPORT_C TInt Wait(RMutex& aMutex);
       
  3344 	IMPORT_C TInt TimedWait(RMutex& aMutex, TInt aTimeout);	// timeout in microseconds
       
  3345 	IMPORT_C void Signal();
       
  3346 	IMPORT_C void Broadcast();
       
  3347 	};
       
  3348 
       
  3349 
       
  3350 
       
  3351 class UserHeap;
       
  3352 class TChunkCreate;
       
  3353 struct TChunkCreateInfo;
       
  3354 /**
       
  3355 @publishedAll
       
  3356 @released
       
  3357 
       
  3358 A handle to a chunk.
       
  3359 
       
  3360 The chunk itself is a kernel side object.
       
  3361 */
       
  3362 class RChunk : public RHandleBase
       
  3363 	{
       
  3364 public:
       
  3365 	/**	
       
  3366     Set of flags used by SetRestrictions().
       
  3367     
       
  3368     @see RChunk::SetRestrictions
       
  3369     */
       
  3370 	enum TRestrictions
       
  3371 		{
       
  3372 		EPreventAdjust = 0x01,  // Prevent Adjust, Commit, Allocate and Decommit
       
  3373 		};
       
  3374 public:
       
  3375 	inline TInt Open(const TFindChunk& aFind,TOwnerType aType=EOwnerProcess);
       
  3376 	IMPORT_C TInt CreateLocal(TInt aSize,TInt aMaxSize,TOwnerType aType=EOwnerProcess);
       
  3377 	IMPORT_C TInt CreateLocalCode(TInt aSize,TInt aMaxSize,TOwnerType aType=EOwnerProcess);
       
  3378 	IMPORT_C TInt CreateGlobal(const TDesC& aName,TInt aSize,TInt aMaxSize,TOwnerType aType=EOwnerProcess);
       
  3379 	IMPORT_C TInt CreateDoubleEndedLocal(TInt aInitialBottom, TInt aInitialTop,TInt aMaxSize,TOwnerType aType=EOwnerProcess);
       
  3380 	IMPORT_C TInt CreateDoubleEndedGlobal(const TDesC& aName,TInt aInitialBottom,TInt aInitialTop,TInt aMaxSize,TOwnerType aType=EOwnerProcess);
       
  3381 	IMPORT_C TInt CreateDisconnectedLocal(TInt aInitialBottom, TInt aInitialTop,TInt aMaxSize,TOwnerType aType=EOwnerProcess);
       
  3382 	IMPORT_C TInt CreateDisconnectedGlobal(const TDesC& aName,TInt aInitialBottom,TInt aInitialTop,TInt aMaxSize,TOwnerType aType=EOwnerProcess);
       
  3383 	IMPORT_C TInt Create(TChunkCreateInfo& aCreateInfo);
       
  3384 	IMPORT_C TInt SetRestrictions(TUint aFlags);
       
  3385 	IMPORT_C TInt OpenGlobal(const TDesC& aName,TBool isReadOnly,TOwnerType aType=EOwnerProcess);
       
  3386 	IMPORT_C TInt Open(RMessagePtr2 aMessage,TInt aParam,TBool isReadOnly,TOwnerType aType=EOwnerProcess);
       
  3387 	IMPORT_C TInt Open(TInt aArgumentIndex, TOwnerType aType=EOwnerProcess);
       
  3388 	IMPORT_C TInt Adjust(TInt aNewSize) const;
       
  3389 	IMPORT_C TInt AdjustDoubleEnded(TInt aBottom, TInt aTop) const;
       
  3390 	IMPORT_C TInt Commit(TInt anOffset, TInt aSize) const;
       
  3391 	IMPORT_C TInt Allocate(TInt aSize) const;
       
  3392 	IMPORT_C TInt Decommit(TInt anOffset, TInt aSize) const;
       
  3393 	IMPORT_C TInt Unlock(TInt aOffset, TInt aSize);	/**< @internalTechnology */
       
  3394 	IMPORT_C TInt Lock(TInt aOffset, TInt aSize);	/**< @internalTechnology */
       
  3395 	IMPORT_C TUint8* Base() const;
       
  3396 	IMPORT_C TInt Size() const;
       
  3397 	IMPORT_C TInt Bottom() const;
       
  3398 	IMPORT_C TInt Top() const;
       
  3399 	IMPORT_C TInt MaxSize() const;
       
  3400 	inline TBool IsReadable() const;
       
  3401 	inline TBool IsWritable() const;
       
  3402 	IMPORT_C TBool IsPaged() const;
       
  3403 private:
       
  3404 	friend class UserHeap;
       
  3405 	};
       
  3406 
       
  3407 
       
  3408 /**
       
  3409 This structure specifies the type and properties of the chunk to be created.  It
       
  3410 is passed as a parameter to the RChunk::Create() method.
       
  3411 
       
  3412 @publishedAll
       
  3413 @released
       
  3414 */
       
  3415 struct TChunkCreateInfo
       
  3416 	{
       
  3417 public :
       
  3418 	/**
       
  3419 	Currently supported version numbers
       
  3420 	@internalComponent
       
  3421 	*/
       
  3422 	enum TChunkCreateVersions
       
  3423 		{
       
  3424 		EVersion0,
       
  3425 		ESupportedVersions,
       
  3426 		};
       
  3427 
       
  3428 	friend class RChunk;
       
  3429 
       
  3430 	/**
       
  3431 	Attributes that specify whether the chunk to be created	is data paged or not.
       
  3432 	*/
       
  3433 	enum TChunkPagingAtt
       
  3434 		{
       
  3435 		EUnspecified,	/**< The chunk will use the creating process's paging attributes.*/
       
  3436 		EPaged,			/**< The chunk will be data paged.*/
       
  3437 		EUnpaged,		/**< The chunk will not be data paged.*/
       
  3438 		};
       
  3439 
       
  3440 	IMPORT_C TChunkCreateInfo();
       
  3441 	IMPORT_C void SetNormal(TInt aInitialSize, TInt aMaxSize);
       
  3442 	IMPORT_C void SetCode(TInt aInitialSize, TInt aMaxSize);
       
  3443 	IMPORT_C void SetDoubleEnded(TInt aInitialBottom, TInt aInitialTop, TInt aMaxSize);
       
  3444 	IMPORT_C void SetDisconnected(TInt aInitialBottom, TInt aInitialTop, TInt aMaxSize);
       
  3445 	IMPORT_C void SetOwner(TOwnerType aType);
       
  3446 	IMPORT_C void SetGlobal(const TDesC& aName);
       
  3447 	IMPORT_C void SetClearByte(TUint8 aClearByte);
       
  3448 	IMPORT_C void SetPaging(const TChunkPagingAtt aPaging);
       
  3449 	void SetThreadHeap(TInt aInitialSize, TInt aMaxSize, const TDesC& aName);
       
  3450 
       
  3451 	/**
       
  3452 	For use by file server only.
       
  3453 	@internalTechnology
       
  3454 	*/
       
  3455 	IMPORT_C void SetCache(TInt aMaxSize);
       
  3456 protected :
       
  3457 	/** The version number of this TChunkCreateInfo.
       
  3458 	@internalComponent
       
  3459 	*/
       
  3460 	TUint iVersionNumber;
       
  3461 	/** The type of the chunk to be created.
       
  3462 	@internalComponent
       
  3463 	*/
       
  3464 	TUint iType;
       
  3465 	/** Specify if chunk is global or not.
       
  3466 	@internalComponent
       
  3467 	*/
       
  3468 	TBool iGlobal;
       
  3469 	/**	The maximum size in bytes of the chunk to be created.
       
  3470 	@internalComponent
       
  3471 	*/
       
  3472 	TInt iMaxSize;
       
  3473 	/** An enumeration whose enumerators define the ownership of this chunk 
       
  3474 		handle. If not explicitly specified, EOwnerProcess is taken as default.
       
  3475 	@internalComponent
       
  3476 	*/
       
  3477 	TOwnerType iOwnerType;
       
  3478 	/**	A pointer to a descriptor containing the name to be assigned to  
       
  3479 		global chunks. The length of the descriptor must be no greater than 
       
  3480 		that allowed for a TKName type.  Must be NULL for local chunks.
       
  3481 	@internalComponent
       
  3482 	*/
       
  3483 	const TDesC* iName;
       
  3484 	/** The offset of the bottom of the region to commit to the chunk on 
       
  3485 		creation from the base of the chunk's reserved region.
       
  3486 		This is only used for double ended and disconnected chunks.
       
  3487 	@internalComponent
       
  3488 	*/
       
  3489 	TInt iInitialBottom;
       
  3490 	/** The offset of the top of the region to commit to the chunk on 
       
  3491 		creation from the base of the chunk's reserved region.
       
  3492 		This is only used for double ended and disconnected chunks.
       
  3493 	@internalComponent
       
  3494 	*/
       
  3495 	TInt iInitialTop;
       
  3496 	/**	Attributes to the chunk to be created should have.
       
  3497 		Should be set from one or more the values in TChunkCreate::TChunkCreateAtt.
       
  3498 	@internalComponent
       
  3499 	*/
       
  3500 	TUint iAttributes;
       
  3501 	/** The byte to clear all the memory committed to the chunk to.
       
  3502 	@internalComponent
       
  3503 	*/
       
  3504 	TUint8 iClearByte; 
       
  3505 	/** @internalComponent*/
       
  3506 	TUint8 iSpare1[3];
       
  3507 	/** @internalComponent*/
       
  3508 	TUint iSpare2;
       
  3509 	};
       
  3510 
       
  3511 /**
       
  3512 This structure specifies the type and properties of the user heap to be created.  It
       
  3513 is passed as a parameter to the UserHeap::Create() method.
       
  3514 
       
  3515 @publishedAll
       
  3516 @released
       
  3517 */
       
  3518 struct TChunkHeapCreateInfo
       
  3519 	{
       
  3520 public:
       
  3521 	/**
       
  3522 	Currently supported version numbers
       
  3523 	@internalComponent
       
  3524 	*/
       
  3525 	enum TChunkHeapCreateVersions
       
  3526 		{
       
  3527 		EVersion0,
       
  3528 		ESupportedVersions,
       
  3529 		};
       
  3530 
       
  3531 	/**
       
  3532 	Attributes that specify whether the chunk heap to be created is data paged or not.
       
  3533 	*/
       
  3534 	enum TChunkHeapPagingAtt
       
  3535 		{
       
  3536 		EUnspecified,	/**< The chunk heap will use the creating process's paging attributes.*/
       
  3537 		EPaged,			/**< The chunk heap will be data paged.*/
       
  3538 		EUnpaged,		/**< The chunk heap will not be data paged.*/
       
  3539 		};
       
  3540 
       
  3541 	friend class UserHeap;
       
  3542 
       
  3543 	IMPORT_C TChunkHeapCreateInfo(TInt aMinLength, TInt aMaxLength);
       
  3544 	IMPORT_C void SetCreateChunk(const TDesC* aName);
       
  3545 	IMPORT_C void SetUseChunk(const RChunk aChunk);
       
  3546 	inline void SetSingleThread(TBool aSingleThread);
       
  3547 	inline void SetAlignment(TInt aAlign);
       
  3548 	inline void SetGrowBy(TInt aGrowBy);
       
  3549 	inline void SetOffset(TInt aOffset);
       
  3550 	inline void SetMode(TUint aMode);
       
  3551 	inline void SetPaging(const TChunkHeapPagingAtt aPaging);
       
  3552 
       
  3553 protected:
       
  3554 	/** The version number of this TChunkHeapCreateInfo.
       
  3555 	@internalComponent
       
  3556 	*/
       
  3557 	TUint iVersionNumber;
       
  3558 	/** The minimum size for the heap.
       
  3559 	@internalConponent
       
  3560 	*/
       
  3561 	TInt iMinLength;
       
  3562 	/** The maximum size for the heap.
       
  3563 	@internalConponent
       
  3564 	*/
       
  3565 	TInt iMaxLength;
       
  3566 	/** The alignment of the heap.
       
  3567 	@internalComponent
       
  3568 	*/
       
  3569 	TInt iAlign;
       
  3570 	/** The grow by value of the heap.
       
  3571 	@internalComponent
       
  3572 	*/
       
  3573 	TInt iGrowBy;
       
  3574 	/** The single thread value of the heap.
       
  3575 	@internalComponent
       
  3576 	*/
       
  3577 	TBool iSingleThread;
       
  3578 	/** The offset from the base of the chunk to the start of the heap.
       
  3579 	@internalComponent
       
  3580 	*/
       
  3581 	TInt iOffset;
       
  3582 	/** The paging attributes of the chunk.
       
  3583 	@internalComponent
       
  3584 	*/
       
  3585 	TChunkHeapPagingAtt iPaging;
       
  3586 	/** The mode flags for the heap.
       
  3587 	@internalComponent
       
  3588 	*/
       
  3589 	TUint iMode;
       
  3590 	/** The name of the chunk to be created for the heap.
       
  3591 	@internalComponent
       
  3592 	*/
       
  3593 	TDesC* iName;
       
  3594 	/** The chunk to use for the heap.
       
  3595 	@internalComponent
       
  3596 	*/
       
  3597 	RChunk iChunk;
       
  3598 	/**@internalComponent*/
       
  3599 	TInt iSpare[5];
       
  3600 	};
       
  3601 
       
  3602 struct SStdEpocThreadCreateInfo;
       
  3603 /**
       
  3604 @publishedAll
       
  3605 @released
       
  3606 
       
  3607 A set of static functions for constructing fixed length heaps and local or 
       
  3608 global heaps.
       
  3609 
       
  3610 @see RHeap
       
  3611 @see RChunk
       
  3612 */
       
  3613 class UserHeap
       
  3614 	{
       
  3615 public:
       
  3616 	/**
       
  3617 	Flags to control the heap creation.
       
  3618 	*/
       
  3619 	enum TChunkHeapCreateMode
       
  3620 		{
       
  3621 		/** On successful creation of the heap this switches the calling thread to
       
  3622 			use the new heap.
       
  3623 		*/
       
  3624 		EChunkHeapSwitchTo	= 0x1,
       
  3625 		/** On successful creation of the heap this causes the handle to the heap
       
  3626 			to be duplicated.
       
  3627 		*/ 
       
  3628 		EChunkHeapDuplicate	= 0x2,
       
  3629 
       
  3630 		/** @internalComponent*/
       
  3631 		EChunkHeapMask = EChunkHeapSwitchTo | EChunkHeapDuplicate,
       
  3632 		};
       
  3633 	IMPORT_C static RHeap* FixedHeap(TAny* aBase, TInt aMaxLength, TInt aAlign=0, TBool aSingleThread=ETrue);
       
  3634 	IMPORT_C static RHeap* ChunkHeap(const TDesC* aName, TInt aMinLength, TInt aMaxLength, TInt aGrowBy=1, TInt aAlign=0, TBool aSingleThread=EFalse);
       
  3635 	IMPORT_C static RHeap* ChunkHeap(RChunk aChunk, TInt aMinLength, TInt aGrowBy=1, TInt aMaxLength=0, TInt aAlign=0, TBool aSingleThread=EFalse, TUint32 aMode=0);
       
  3636 	IMPORT_C static RHeap* OffsetChunkHeap(RChunk aChunk, TInt aMinLength, TInt aOffset, TInt aGrowBy=1, TInt aMaxLength=0, TInt aAlign=0, TBool aSingleThread=EFalse, TUint32 aMode=0);
       
  3637 	IMPORT_C static RHeap* ChunkHeap(const TChunkHeapCreateInfo& aCreateInfo);
       
  3638 	IMPORT_C static TInt SetupThreadHeap(TBool aNotFirst, SStdEpocThreadCreateInfo& aInfo);
       
  3639 	IMPORT_C static TInt CreateThreadHeap(SStdEpocThreadCreateInfo& aInfo, RHeap*& aHeap, TInt aAlign=0, TBool aSingleThread=EFalse);
       
  3640 	};
       
  3641 
       
  3642 
       
  3643 
       
  3644 
       
  3645 /**
       
  3646 @publishedAll
       
  3647 @released
       
  3648 
       
  3649 Encapsulates the Id of a kernel object.
       
  3650 */
       
  3651 class TObjectId
       
  3652 	{
       
  3653 public:
       
  3654 	inline TObjectId();
       
  3655 	inline TObjectId(TUint64 anId);
       
  3656 	inline TUint64 Id() const;
       
  3657 	inline operator TUint() const;
       
  3658 	inline TBool operator==(TObjectId aId) const;
       
  3659 	inline TBool operator!=(TObjectId aId) const;
       
  3660 private:
       
  3661 	TUint64 iId;
       
  3662 	};
       
  3663 
       
  3664 
       
  3665 
       
  3666 
       
  3667 /**
       
  3668 @publishedAll
       
  3669 @released
       
  3670 
       
  3671 Encapsulates the Id of a thread.
       
  3672 
       
  3673 An object of this type is not explicitly constructed in open code,
       
  3674 but is returned by the Id() member function of a thread handle,
       
  3675 an RThread type.
       
  3676 
       
  3677 @see RThread
       
  3678 */
       
  3679 class TThreadId : public TObjectId
       
  3680 	{
       
  3681 public:
       
  3682 	inline TThreadId();
       
  3683 	inline TThreadId(TUint64 anId);
       
  3684 	};
       
  3685 
       
  3686 
       
  3687 
       
  3688 
       
  3689 /**
       
  3690 This structure specifies the type and properties of the thread to be created.  It
       
  3691 is passed as a parameter to the RThread::Create() method.
       
  3692 
       
  3693 @publishedAll
       
  3694 @released
       
  3695 */
       
  3696 struct TThreadCreateInfo
       
  3697 	{
       
  3698 public :
       
  3699 	/**
       
  3700 	Currently supported version numbers
       
  3701 	@internalComponent
       
  3702 	*/
       
  3703 	enum TThreadCreateVersions
       
  3704 		{
       
  3705 		EVersion0,
       
  3706 		ESupportedVersions,
       
  3707 		};
       
  3708 
       
  3709 	/**
       
  3710 	Attributes that specify whether the stack and heap of the thread to be created
       
  3711 	are data paged or not.
       
  3712 	*/
       
  3713 	enum TThreadPagingAtt
       
  3714 		{
       
  3715 		EUnspecified,	/**< The thread will use the creating process's paging attributes.*/
       
  3716 		EPaged,			/**< The thread will data page its stack and heap.*/
       
  3717 		EUnpaged,		/**< The thread will not data page its stack and heap.*/
       
  3718 		};
       
  3719 
       
  3720 	friend class RThread;
       
  3721 
       
  3722 	IMPORT_C TThreadCreateInfo(	const TDesC &aName, TThreadFunction aFunction, 
       
  3723 								TInt aStackSize, TAny* aPtr);
       
  3724 	IMPORT_C void SetCreateHeap(TInt aHeapMinSize, TInt aHeapMaxSize);
       
  3725 	IMPORT_C void SetUseHeap(const RAllocator* aHeap);
       
  3726 	IMPORT_C void SetOwner(const TOwnerType aOwner);
       
  3727 	IMPORT_C void SetPaging(const TThreadPagingAtt aPaging);
       
  3728 
       
  3729 protected:
       
  3730 	/**	The version number of this TChunkCreateInfo.
       
  3731 		@internalComponent
       
  3732 	*/
       
  3733 	TUint iVersionNumber;
       
  3734 	/**	The Name to be given to the thread to be created
       
  3735 		@internalComponent
       
  3736 	*/
       
  3737 	const TDesC* iName;
       
  3738 	/**	The function this thread will execute.
       
  3739 		@internalComponent
       
  3740 	*/
       
  3741 	TThreadFunction iFunction;
       
  3742 	/**	The size of the stack of the thread to be created.
       
  3743 		@internalComponent
       
  3744 	*/
       
  3745 	TInt iStackSize;
       
  3746 	/** The parameter to be passed to the function of the thread to be created.
       
  3747 		@internalComponent
       
  3748 	*/
       
  3749 	TAny* iParameter;
       
  3750 	/** The owner of the thread to be created.
       
  3751 		@internalComponent
       
  3752 	*/
       
  3753 	TOwnerType iOwner;
       
  3754 	/**	The heap for the thread to be created to use.
       
  3755 		NULL if a new heap is to be created.
       
  3756 		@internalComponent
       
  3757 	*/
       
  3758 	RAllocator* iHeap;
       
  3759 	/**	Minimum size of any heap to be created for the thread.
       
  3760 		@internalComponent*/
       
  3761 	TInt iHeapMinSize;
       
  3762 	/**	Maximum size of any heap to be created for the thread.
       
  3763 		@internalComponent
       
  3764 	*/
       
  3765 	TInt iHeapMaxSize;
       
  3766 	/** The attributes of the thread
       
  3767 		@internalComponent
       
  3768 	*/
       
  3769 	TUint iAttributes;
       
  3770 	/**@internalComponent*/
       
  3771 	TUint32 iSpare[6];
       
  3772 	};
       
  3773 
       
  3774 class RProcess;
       
  3775 
       
  3776 
       
  3777 /**
       
  3778 @publishedAll
       
  3779 @released
       
  3780 
       
  3781 A handle to a thread.
       
  3782 
       
  3783 The thread itself is a kernel object.
       
  3784 */
       
  3785 class RThread : public RHandleBase
       
  3786 	{
       
  3787 public:
       
  3788 	inline RThread();
       
  3789 	IMPORT_C TInt Create(const TDesC& aName, TThreadFunction aFunction, TInt aStackSize, TInt aHeapMinSize, TInt aHeapMaxSize, TAny *aPtr, TOwnerType aType=EOwnerProcess);
       
  3790 	IMPORT_C TInt Create(const TDesC& aName, TThreadFunction aFunction, TInt aStackSize, RAllocator* aHeap, TAny* aPtr, TOwnerType aType=EOwnerProcess);
       
  3791 	IMPORT_C TInt Create(const TThreadCreateInfo& aCreateInfo);
       
  3792 	IMPORT_C TInt Open(const TDesC& aFullName, TOwnerType aType=EOwnerProcess);
       
  3793 	IMPORT_C TInt Open(TThreadId aID, TOwnerType aType=EOwnerProcess);
       
  3794 	IMPORT_C TThreadId Id() const;
       
  3795 	IMPORT_C void Resume() const;
       
  3796 	IMPORT_C void Suspend() const;
       
  3797 	/**
       
  3798 	@publishedAll
       
  3799 	@deprecated Use User::RenameThread() instead
       
  3800 	*/
       
  3801 	inline static TInt RenameMe(const TDesC& aName);
       
  3802 
       
  3803 	IMPORT_C void Kill(TInt aReason);
       
  3804 	IMPORT_C void Terminate(TInt aReason);
       
  3805 	IMPORT_C void Panic(const TDesC& aCategory,TInt aReason);
       
  3806 	IMPORT_C TInt Process(RProcess& aProcess) const;
       
  3807 	IMPORT_C TThreadPriority Priority() const;
       
  3808 	IMPORT_C void SetPriority(TThreadPriority aPriority) const;
       
  3809 	IMPORT_C TProcessPriority ProcessPriority() const;
       
  3810 	IMPORT_C void SetProcessPriority(TProcessPriority aPriority) const;
       
  3811 	IMPORT_C TInt RequestCount() const;
       
  3812 	IMPORT_C TExitType ExitType() const;
       
  3813 	IMPORT_C TInt ExitReason() const;
       
  3814 	IMPORT_C TExitCategoryName ExitCategory() const;
       
  3815 	IMPORT_C void RequestComplete(TRequestStatus*& aStatus,TInt aReason) const;
       
  3816 	IMPORT_C void RequestSignal() const;
       
  3817 	IMPORT_C void Logon(TRequestStatus& aStatus) const;
       
  3818 	IMPORT_C TInt LogonCancel(TRequestStatus& aStatus) const;
       
  3819 	IMPORT_C void HandleCount(TInt& aProcessHandleCount, TInt& aThreadHandleCount) const;
       
  3820 	IMPORT_C void Context(TDes8& aDes) const;
       
  3821 	IMPORT_C TInt StackInfo(TThreadStackInfo& aInfo) const;
       
  3822 	IMPORT_C TInt GetCpuTime(TTimeIntervalMicroSeconds& aCpuTime) const;
       
  3823 	inline TInt Open(const TFindThread& aFind,TOwnerType aType=EOwnerProcess);
       
  3824 	IMPORT_C void Rendezvous(TRequestStatus& aStatus) const;
       
  3825 	IMPORT_C TInt RendezvousCancel(TRequestStatus& aStatus) const;
       
  3826 	IMPORT_C static void Rendezvous(TInt aReason);
       
  3827 
       
  3828 	/**
       
  3829 	Return the Secure ID of the process to which the thread belongs.
       
  3830 
       
  3831 	If an intended use of this method is to check that the Secure ID is
       
  3832 	a given value, then the use of a TSecurityPolicy object should be
       
  3833 	considered. E.g. Instead of something like:
       
  3834 
       
  3835 	@code
       
  3836 		RThread& thread;
       
  3837 		TInt error = thread.SecureId()==KRequiredSecureId ? KErrNone : KErrPermissionDenied;
       
  3838 	@endcode
       
  3839 
       
  3840 	this could be used;
       
  3841 
       
  3842 	@code
       
  3843 		RThread& thread;
       
  3844 		static _LIT_SECURITY_POLICY_S0(mySidPolicy, KRequiredSecureId);
       
  3845 		TBool pass = mySidPolicy().CheckPolicy(thread);
       
  3846 	@endcode
       
  3847 
       
  3848 	This has the benefit that the TSecurityPolicy::CheckPolicy methods are
       
  3849 	configured by the system wide Platform Security configuration. I.e. are
       
  3850 	capable of emitting diagnostic messages when a check fails and/or the
       
  3851 	check can be forced to always pass.
       
  3852 
       
  3853 	@see TSecurityPolicy::CheckPolicy(RThread aThread, const char* aDiagnostic) const
       
  3854 	@see _LIT_SECURITY_POLICY_S0
       
  3855 
       
  3856 	@return The Secure ID.
       
  3857 	@publishedAll
       
  3858 	@released
       
  3859 	*/
       
  3860 	IMPORT_C TSecureId SecureId() const;
       
  3861 
       
  3862 	/**
       
  3863 	Return the Vendor ID of the process to which the thread belongs.
       
  3864 
       
  3865 	If an intended use of this method is to check that the Vendor ID is
       
  3866 	a given value, then the use of a TSecurityPolicy object should be
       
  3867 	considered. E.g. Instead of something like:
       
  3868 
       
  3869 	@code
       
  3870 		RThread& thread;
       
  3871 		TInt error = thread.VendorId()==KRequiredVendorId ? KErrNone : KErrPermissionDenied;
       
  3872 	@endcode
       
  3873 
       
  3874 	this could be used;
       
  3875 
       
  3876 	@code
       
  3877 		RThread& thread;
       
  3878 		static _LIT_SECURITY_POLICY_V0(myVidPolicy, KRequiredVendorId);
       
  3879 		TBool pass = myVidPolicy().CheckPolicy(thread);
       
  3880 	@endcode
       
  3881 
       
  3882 	This has the benefit that the TSecurityPolicy::CheckPolicy methods are
       
  3883 	configured by the system wide Platform Security configuration. I.e. are
       
  3884 	capable of emitting diagnostic messages when a check fails and/or the
       
  3885 	check can be forced to always pass.
       
  3886 
       
  3887 	@see TSecurityPolicy::CheckPolicy(RThread aThread, const char* aDiagnostic) const
       
  3888 	@see _LIT_SECURITY_POLICY_V0
       
  3889 
       
  3890 	@return The Vendor ID.
       
  3891 	@publishedAll
       
  3892     @released
       
  3893 	*/
       
  3894 	IMPORT_C TVendorId VendorId() const;
       
  3895 
       
  3896 	/**
       
  3897 	Check if the process to which the thread belongs has a given capability
       
  3898 
       
  3899 	When a check fails the action taken is determined by the system wide Platform Security
       
  3900 	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
       
  3901 	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
       
  3902 	check failed.
       
  3903 
       
  3904 	@param aCapability The capability to test.
       
  3905 	@param aDiagnostic A string that will be emitted along with any diagnostic message
       
  3906 								that may be issued if the test finds the capability is not present.
       
  3907 								This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
       
  3908 								which enables it to be easily removed from the system.
       
  3909 	@return ETrue if the process to which the thread belongs has the capability, EFalse otherwise.
       
  3910 	@publishedAll
       
  3911     @released
       
  3912 	*/
       
  3913 #ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
       
  3914 	inline TBool HasCapability(TCapability aCapability, const char* aDiagnostic=0) const;
       
  3915 #else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
       
  3916 	// Only available to NULL arguments
       
  3917 	inline TBool HasCapability(TCapability aCapability, OnlyCreateWithNull aDiagnostic=NULL) const;
       
  3918 #ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
       
  3919 	// For things using KSuppressPlatSecDiagnostic
       
  3920 	inline TBool HasCapability(TCapability aCapability, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
       
  3921 #endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
       
  3922 #endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
       
  3923 
       
  3924 	/**
       
  3925 	Check if the process to which the thread belongs has both of the given capabilities
       
  3926 
       
  3927 	When a check fails the action taken is determined by the system wide Platform Security
       
  3928 	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
       
  3929 	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
       
  3930 	check failed.
       
  3931 
       
  3932 	@param aCapability1 The first capability to test.
       
  3933 	@param aCapability2 The second capability to test.
       
  3934 	@param aDiagnostic A string that will be emitted along with any diagnostic message
       
  3935 								that may be issued if the test finds a capability is not present.
       
  3936 								This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
       
  3937 								which enables it to be easily removed from the system.
       
  3938 	@return ETrue if the process to which the thread belongs has both the capabilities, EFalse otherwise.
       
  3939 	@publishedAll
       
  3940 	@released
       
  3941 	*/
       
  3942 #ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
       
  3943 	inline TBool HasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic=0) const;
       
  3944 #else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
       
  3945 	// Only available to NULL arguments
       
  3946 	inline TBool HasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull aDiagnostic=NULL) const;
       
  3947 #ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
       
  3948 	// For things using KSuppressPlatSecDiagnostic
       
  3949 	inline TBool HasCapability(TCapability aCapability, TCapability aCapability2, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
       
  3950 #endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
       
  3951 #endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
       
  3952 
       
  3953 	/** Function only temporarily supported to aid migration to process emulation...
       
  3954 
       
  3955 	@publishedAll
       
  3956 	@deprecated Use process emulation instead
       
  3957 	*/
       
  3958 	inline TInt Create(const TDesC& aName,TThreadFunction aFunction,TInt aStackSize,TAny* aPtr,RLibrary* aLibrary,RHeap* aHeap, TInt aHeapMinSize,TInt aHeapMaxSize,TOwnerType aType);
       
  3959 
       
  3960 private:
       
  3961 	// Implementations of functions with diagnostics
       
  3962 	IMPORT_C TBool DoHasCapability(TCapability aCapability, const char* aDiagnostic) const;
       
  3963 	IMPORT_C TBool DoHasCapability(TCapability aCapability) const;
       
  3964 	IMPORT_C TBool DoHasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic) const;
       
  3965 	IMPORT_C TBool DoHasCapability(TCapability aCapability1, TCapability aCapability2) const;
       
  3966 	};
       
  3967 
       
  3968 /**
       
  3969 @publishedAll
       
  3970 @deprecated
       
  3971 */
       
  3972 inline TInt RThread::Create(const TDesC& /*aName*/,TThreadFunction /*aFunction*/,TInt /*aStackSize*/,TAny* /*aPtr*/,RLibrary* /*aLibrary*/,RHeap* /*aHeap*/, TInt /*aHeapMinSize*/,TInt /*aHeapMaxSize*/,TOwnerType /*aType*/)
       
  3973 	{return KErrNotSupported; }
       
  3974 
       
  3975 
       
  3976 
       
  3977 /**
       
  3978 @publishedAll
       
  3979 @released
       
  3980 
       
  3981 Encapsulates the Id of a process.
       
  3982 
       
  3983 An object of this type is not explicitly constructed in open code,
       
  3984 but is returned by the Id() member function of a process handle,
       
  3985 an RProcess type.
       
  3986 
       
  3987 @see RProcess
       
  3988 */
       
  3989 class TProcessId : public TObjectId
       
  3990 	{
       
  3991 public:
       
  3992 	inline TProcessId();
       
  3993 	inline TProcessId(TUint64 anId);
       
  3994 	};
       
  3995 
       
  3996 
       
  3997 
       
  3998 
       
  3999 class RSubSessionBase;
       
  4000 
       
  4001 /** 
       
  4002 @publishedAll
       
  4003 @released
       
  4004 
       
  4005 A handle to a process.
       
  4006 
       
  4007 The process itself is a kernel object.
       
  4008 */
       
  4009 class RProcess : public RHandleBase
       
  4010 	{
       
  4011 public:
       
  4012 	inline RProcess();
       
  4013 	IMPORT_C TInt Create(const TDesC& aFileName,const TDesC& aCommand,TOwnerType aType=EOwnerProcess);
       
  4014 	IMPORT_C TInt Create(const TDesC& aFileName,const TDesC& aCommand,const TUidType &aUidType, TOwnerType aType=EOwnerProcess);
       
  4015 	IMPORT_C TInt Open(const TDesC& aName,TOwnerType aType=EOwnerProcess);
       
  4016 	IMPORT_C TInt Open(TProcessId aId,TOwnerType aType=EOwnerProcess);
       
  4017 	IMPORT_C TUidType Type() const;
       
  4018 	IMPORT_C TProcessId Id() const;
       
  4019 	/**
       
  4020 	@publishedAll
       
  4021 	@deprecated Use User::RenameProcess() instead
       
  4022 	*/
       
  4023 	inline static TInt RenameMe(const TDesC& aName);
       
  4024 
       
  4025 	IMPORT_C void Kill(TInt aReason);
       
  4026 	IMPORT_C void Terminate(TInt aReason);
       
  4027 	IMPORT_C void Panic(const TDesC& aCategory,TInt aReason);
       
  4028 	IMPORT_C void Resume();
       
  4029 	IMPORT_C TFileName FileName() const;
       
  4030 	IMPORT_C TExitType ExitType() const;
       
  4031 	IMPORT_C TInt ExitReason() const;
       
  4032 	IMPORT_C TExitCategoryName ExitCategory() const;
       
  4033 	IMPORT_C TProcessPriority Priority() const;
       
  4034 	IMPORT_C TInt SetPriority(TProcessPriority aPriority) const;
       
  4035     IMPORT_C TBool JustInTime() const;
       
  4036     IMPORT_C void SetJustInTime(TBool aBoolean) const; 
       
  4037 	IMPORT_C void Logon(TRequestStatus& aStatus) const;
       
  4038 	IMPORT_C TInt LogonCancel(TRequestStatus& aStatus) const;
       
  4039 	IMPORT_C TInt GetMemoryInfo(TModuleMemoryInfo& aInfo) const;
       
  4040 	inline TInt Open(const TFindProcess& aFind,TOwnerType aType=EOwnerProcess);
       
  4041 	IMPORT_C void Rendezvous(TRequestStatus& aStatus) const;
       
  4042 	IMPORT_C TInt RendezvousCancel(TRequestStatus& aStatus) const;
       
  4043 	IMPORT_C static void Rendezvous(TInt aReason);
       
  4044 	IMPORT_C TBool DefaultDataPaged() const;
       
  4045 
       
  4046 	/**
       
  4047 	Return the Secure ID of the process.
       
  4048 
       
  4049 	If an intended use of this method is to check that the Secure ID is
       
  4050 	a given value, then the use of a TSecurityPolicy object should be
       
  4051 	considered. E.g. Instead of something like:
       
  4052 
       
  4053 	@code
       
  4054 		RProcess& process;
       
  4055 		TInt error = process.SecureId()==KRequiredSecureId ? KErrNone : KErrPermissionDenied;
       
  4056 	@endcode
       
  4057 
       
  4058 	this could be used;
       
  4059 
       
  4060 	@code
       
  4061 		RProcess& process;
       
  4062 		static _LIT_SECURITY_POLICY_S0(mySidPolicy, KRequiredSecureId);
       
  4063 		TBool pass = mySidPolicy().CheckPolicy(process);
       
  4064 	@endcode
       
  4065 
       
  4066 	This has the benefit that the TSecurityPolicy::CheckPolicy methods are
       
  4067 	configured by the system wide Platform Security configuration. I.e. are
       
  4068 	capable of emitting diagnostic messages when a check fails and/or the
       
  4069 	check can be forced to always pass.
       
  4070 
       
  4071 	@see TSecurityPolicy::CheckPolicy(RProcess aProcess, const char* aDiagnostic) const
       
  4072 	@see _LIT_SECURITY_POLICY_S0
       
  4073 
       
  4074 	@return The Secure ID.
       
  4075 	@publishedAll
       
  4076 	@released
       
  4077 	*/
       
  4078 	IMPORT_C TSecureId SecureId() const;
       
  4079 
       
  4080 	/**
       
  4081 	Return the Vendor ID of the process.
       
  4082 
       
  4083 	If an intended use of this method is to check that the Vendor ID is
       
  4084 	a given value, then the use of a TSecurityPolicy object should be
       
  4085 	considered. E.g. Instead of something like:
       
  4086 
       
  4087 	@code
       
  4088 		RProcess& process;
       
  4089 		TInt error = process.VendorId()==KRequiredVendorId ? KErrNone : KErrPermissionDenied;
       
  4090 	@endcode
       
  4091 
       
  4092 	this could be used;
       
  4093 
       
  4094 	@code
       
  4095 		RProcess& process;
       
  4096 		static _LIT_SECURITY_POLICY_V0(myVidPolicy, KRequiredVendorId);
       
  4097 		TBool pass = myVidPolicy().CheckPolicy(process);
       
  4098 	@endcode
       
  4099 
       
  4100 	This has the benefit that the TSecurityPolicy::CheckPolicy methods are
       
  4101 	configured by the system wide Platform Security configuration. I.e. are
       
  4102 	capable of emitting diagnostic messages when a check fails and/or the
       
  4103 	check can be forced to always pass.
       
  4104 
       
  4105 	@see TSecurityPolicy::CheckPolicy(RProcess aProcess, const char* aDiagnostic) const
       
  4106 	@see _LIT_SECURITY_POLICY_V0
       
  4107 
       
  4108 	@return The Vendor ID.
       
  4109 	@publishedAll
       
  4110     @released
       
  4111 	*/
       
  4112 	IMPORT_C TVendorId VendorId() const;
       
  4113 
       
  4114 	/**
       
  4115 	Check if the process has a given capability
       
  4116 
       
  4117 	When a check fails the action taken is determined by the system wide Platform Security
       
  4118 	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
       
  4119 	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
       
  4120 	check failed.
       
  4121 
       
  4122 	@param aCapability The capability to test.
       
  4123 	@param aDiagnostic A string that will be emitted along with any diagnostic message
       
  4124 								that may be issued if the test finds the capability is not present.
       
  4125 								This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
       
  4126 								which enables it to be easily removed from the system.
       
  4127 	@return ETrue if the process has the capability, EFalse otherwise.
       
  4128 	@publishedAll
       
  4129 	@released
       
  4130 	*/
       
  4131 #ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
       
  4132 	inline TBool HasCapability(TCapability aCapability, const char* aDiagnostic=0) const;
       
  4133 #else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
       
  4134 	// Only available to NULL arguments
       
  4135 	inline TBool HasCapability(TCapability aCapability, OnlyCreateWithNull aDiagnostic=NULL) const;
       
  4136 #ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
       
  4137 	// For things using KSuppressPlatSecDiagnostic
       
  4138 	inline TBool HasCapability(TCapability aCapability, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
       
  4139 #endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
       
  4140 #endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
       
  4141 
       
  4142 	/**
       
  4143 	Check if the process has both of the given capabilities
       
  4144 
       
  4145 	When a check fails the action taken is determined by the system wide Platform Security
       
  4146 	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
       
  4147 	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
       
  4148 	check failed.
       
  4149 
       
  4150 	@param aCapability1 The first capability to test.
       
  4151 	@param aCapability2 The second capability to test.
       
  4152 	@param aDiagnostic A string that will be emitted along with any diagnostic message
       
  4153 								that may be issued if the test finds a capability is not present.
       
  4154 								This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
       
  4155 								which enables it to be easily removed from the system.
       
  4156 	@return ETrue if the process has both the capabilities, EFalse otherwise.
       
  4157 	@publishedAll
       
  4158 	@released
       
  4159 	*/
       
  4160 #ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
       
  4161 	inline TBool HasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic=0) const;
       
  4162 #else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
       
  4163 	// Only available to NULL arguments
       
  4164 	inline TBool HasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull aDiagnostic=NULL) const;
       
  4165 #ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
       
  4166 	// For things using KSuppressPlatSecDiagnostic
       
  4167 	inline TBool HasCapability(TCapability aCapability, TCapability aCapability2, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
       
  4168 #endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
       
  4169 #endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
       
  4170 
       
  4171 	IMPORT_C TInt SetParameter(TInt aIndex,  RHandleBase aHandle);
       
  4172 	IMPORT_C TInt SetParameter(TInt aSlot, const RSubSessionBase& aSession);
       
  4173 	IMPORT_C TInt SetParameter(TInt aSlot, const TDesC16& aDes);
       
  4174 	IMPORT_C TInt SetParameter(TInt aSlot, const TDesC8& aDes);
       
  4175 	IMPORT_C TInt SetParameter(TInt aSlot, TInt aData);
       
  4176 	inline RProcess(TInt aHandle);
       
  4177 
       
  4178 	/**
       
  4179 	@deprecated Use RProcess::SecureId() instead
       
  4180 	*/
       
  4181 	inline TUid Identity() const { return SecureId(); }
       
  4182 
       
  4183 	/**
       
  4184 	Legacy Platform Security development and migration support
       
  4185 	@internalAll
       
  4186 	@deprecated No replacement
       
  4187 	*/
       
  4188 	enum TSecureApi { ESecureApiOff, ESecureApiOn, ESecureApiQuery }; // __SECURE_API__ remove this
       
  4189 
       
  4190 	/**
       
  4191 	Legacy Platform Security development and migration support
       
  4192 	@internalAll
       
  4193 	@deprecated No replacement
       
  4194 	*/
       
  4195 	IMPORT_C TInt SecureApi(TInt aState); // __SECURE_API__ remove this
       
  4196 
       
  4197 	/**
       
  4198 	Legacy Platform Security development and migration support
       
  4199 	@internalAll
       
  4200 	@deprecated No replacement
       
  4201 	*/
       
  4202 	enum TDataCaging { EDataCagingOff, EDataCagingOn, EDataCagingQuery}; // __DATA_CAGING__ __SECURE_API__ remove this
       
  4203 
       
  4204 	/**
       
  4205 	Legacy Platform Security development and migration support
       
  4206 	@internalAll
       
  4207 	@deprecated No replacement
       
  4208 	*/
       
  4209 	IMPORT_C TInt DataCaging(TInt aState); // __DATA_CAGING__ __SECURE_API__ remove this
       
  4210 	
       
  4211 
       
  4212 	IMPORT_C TInt CreateWithStackOverride(const TDesC& aFileName,const TDesC& aCommand, const TUidType &aUidType, TInt aMinStackSize, TOwnerType aType);
       
  4213 
       
  4214 	IMPORT_C static TAny* ExeExportData(void);
       
  4215 
       
  4216 private:
       
  4217 	// Implementations of functions with diagnostics
       
  4218 	IMPORT_C TBool DoHasCapability(TCapability aCapability, const char* aDiagnostic) const;
       
  4219 	IMPORT_C TBool DoHasCapability(TCapability aCapability) const;
       
  4220 	IMPORT_C TBool DoHasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic) const;
       
  4221 	IMPORT_C TBool DoHasCapability(TCapability aCapability1, TCapability aCapability2) const;
       
  4222 	};
       
  4223 
       
  4224 
       
  4225 
       
  4226 
       
  4227 
       
  4228 
       
  4229 
       
  4230 
       
  4231 
       
  4232 /**
       
  4233 @internalTechnology
       
  4234 */
       
  4235 class RServer2 : public RHandleBase
       
  4236 	{
       
  4237 public:
       
  4238 	IMPORT_C TInt CreateGlobal(const TDesC& aName);
       
  4239 	IMPORT_C TInt CreateGlobal(const TDesC& aName, TInt aMode);
       
  4240 	IMPORT_C TInt CreateGlobal(const TDesC& aName, TInt aMode, TInt aRole, TInt aOpts);
       
  4241 	IMPORT_C void Receive(RMessage2& aMessage,TRequestStatus& aStatus);
       
  4242 	IMPORT_C void Receive(RMessage2& aMessage);
       
  4243 	IMPORT_C void Cancel();
       
  4244 	};
       
  4245 
       
  4246 
       
  4247 
       
  4248 
       
  4249 /**
       
  4250 @publishedAll
       
  4251 @released
       
  4252 
       
  4253 Client-side handle to a session with a server.
       
  4254 
       
  4255 This is the client-side interface through which communication with the server
       
  4256 is channelled.
       
  4257 
       
  4258 Clients normally define and implement a derived class to provide
       
  4259 a richer interface.
       
  4260 */
       
  4261 class RSessionBase : public RHandleBase
       
  4262 	{
       
  4263 	friend class RSubSessionBase;
       
  4264 public:
       
  4265     /**
       
  4266     Indicates whether or not threads in the process are automatically attached
       
  4267     to the session when passed as a parameter to the Share() function.
       
  4268     */
       
  4269 	enum TAttachMode {EExplicitAttach,EAutoAttach};
       
  4270 public:
       
  4271 	/**
       
  4272 	Creates a session that can be shared by other threads in the current
       
  4273     process.
       
  4274     
       
  4275     After calling this function the session object may be used by threads other
       
  4276     than than the one that created it.
       
  4277     
       
  4278     Note that this can only be done with servers that mark their sessions
       
  4279     as sharable.
       
  4280     
       
  4281     @return	KErrNone, if the session is successfully shared;
       
  4282 	        KErrNoMmemory, if the attempt fails for lack of memory.
       
  4283 
       
  4284     @panic	KERN-EXEC 23 The session cannot be shared.
       
  4285     
       
  4286     @see CServer2
       
  4287     @see RSessionBase::ShareProtected()
       
  4288     @see CServer2::TServerType
       
  4289 	*/
       
  4290 	inline TInt ShareAuto()	{ return DoShare(EAutoAttach); }
       
  4291 
       
  4292 
       
  4293     /**
       
  4294     Creates a session handle that can be be passed via IPC to another process
       
  4295     as well as being shared by other threads in the current process.
       
  4296     
       
  4297     After calling this function the session object may be used by threads other
       
  4298     than than the one that created it.
       
  4299 
       
  4300     Note that this can only be done with servers that mark their sessions
       
  4301     as globally sharable.
       
  4302     
       
  4303     @return	KErrNone, if the session is successfully shared;
       
  4304 	        KErrNoMmemory, if the attempt fails for lack of memory.
       
  4305    
       
  4306     @panic	KERN-EXEC 23 The session cannot be shared.
       
  4307     
       
  4308     @see CServer2
       
  4309     @see RSessionBase::ShareAuto()
       
  4310     @see CServer2::TServerType
       
  4311     */
       
  4312 	inline TInt ShareProtected() { return DoShare(EAutoAttach|KCreateProtectedObject); }
       
  4313 
       
  4314 
       
  4315 	IMPORT_C TInt Open(RMessagePtr2 aMessage,TInt aParam,TOwnerType aType=EOwnerProcess);
       
  4316 	IMPORT_C TInt Open(RMessagePtr2 aMessage,TInt aParam,const TSecurityPolicy& aServerPolicy,TOwnerType aType=EOwnerProcess);
       
  4317 	IMPORT_C TInt Open(TInt aArgumentIndex, TOwnerType aType=EOwnerProcess);
       
  4318 	IMPORT_C TInt Open(TInt aArgumentIndex, const TSecurityPolicy& aServerPolicy, TOwnerType aType=EOwnerProcess);
       
  4319 	inline TInt SetReturnedHandle(TInt aHandleOrError);
       
  4320 	IMPORT_C TInt SetReturnedHandle(TInt aHandleOrError,const TSecurityPolicy& aServerPolicy);
       
  4321 protected:
       
  4322 	inline TInt CreateSession(const TDesC& aServer,const TVersion& aVersion);
       
  4323 	IMPORT_C TInt CreateSession(const TDesC& aServer,const TVersion& aVersion,TInt aAsyncMessageSlots);
       
  4324 	IMPORT_C TInt CreateSession(const TDesC& aServer,const TVersion& aVersion,TInt aAsyncMessageSlots,TIpcSessionType aType,const TSecurityPolicy* aPolicy=0, TRequestStatus* aStatus=0);
       
  4325 	inline TInt CreateSession(RServer2 aServer,const TVersion& aVersion);
       
  4326 	IMPORT_C TInt CreateSession(RServer2 aServer,const TVersion& aVersion,TInt aAsyncMessageSlots);
       
  4327 	IMPORT_C TInt CreateSession(RServer2 aServer,const TVersion& aVersion,TInt aAsyncMessageSlots,TIpcSessionType aType,const TSecurityPolicy* aPolicy=0, TRequestStatus* aStatus=0);
       
  4328 	inline static TInt SetReturnedHandle(TInt aHandleOrError,RHandleBase& aHandle);
       
  4329 
       
  4330 	/**
       
  4331 	@deprecated Use CreateSession(const TDesC& aServer,const TVersion& aVersion,TInt aAsyncMessageSlots,TIpcSessionType aType,const TSecurityPolicy* aPolicy=0, TRequestStatus* aStatus=0);
       
  4332 	*/
       
  4333 	inline TInt CreateSession(const TDesC& aServer,const TVersion& aVersion,TInt aAsyncMessageSlots,TRequestStatus* aStatus)
       
  4334 		{ return CreateSession(aServer, aVersion, aAsyncMessageSlots, EIpcSession_Unsharable, (TSecurityPolicy*)0, aStatus); }
       
  4335 	inline TInt Send(TInt aFunction,const TIpcArgs& aArgs) const;
       
  4336 	inline void SendReceive(TInt aFunction,const TIpcArgs& aArgs,TRequestStatus& aStatus) const;
       
  4337 	inline TInt SendReceive(TInt aFunction,const TIpcArgs& aArgs) const;
       
  4338 	inline TInt Send(TInt aFunction) const;
       
  4339 	inline void SendReceive(TInt aFunction,TRequestStatus& aStatus) const;
       
  4340 	inline TInt SendReceive(TInt aFunction) const;
       
  4341 private:
       
  4342 	IMPORT_C TInt DoSend(TInt aFunction,const TIpcArgs* aArgs) const;
       
  4343 	IMPORT_C void DoSendReceive(TInt aFunction,const TIpcArgs* aArgs,TRequestStatus& aStatus) const;
       
  4344 	IMPORT_C TInt DoSendReceive(TInt aFunction,const TIpcArgs* aArgs) const;
       
  4345 	TInt SendAsync(TInt aFunction,const TIpcArgs* aArgs,TRequestStatus* aStatus) const;
       
  4346 	TInt SendSync(TInt aFunction,const TIpcArgs* aArgs) const;
       
  4347 	IMPORT_C TInt DoShare(TInt aAttachMode);
       
  4348 	TInt DoConnect(const TVersion &aVersion,TRequestStatus* aStatus);
       
  4349 	};
       
  4350 
       
  4351 
       
  4352 
       
  4353 
       
  4354 /**
       
  4355 @publishedAll
       
  4356 @released
       
  4357 
       
  4358 Client-side handle to a sub-session. 
       
  4359 
       
  4360 It represents a client-side sub-session, and has a corresponding sub-session
       
  4361 object on the server-side.
       
  4362 
       
  4363 Clients normally define and implement a derived class to provide a richer
       
  4364 interface. In particular, a derived class should:
       
  4365 
       
  4366 1. provide a function to create a new sub-session with the server;
       
  4367    this should call CreateSubSession().
       
  4368 
       
  4369 2. provide a function to close the current sub-session;
       
  4370    this should call CloseSubSession().
       
  4371 
       
  4372 A session must already exist with a server before a client can establish
       
  4373 any sub-sessions.
       
  4374 */
       
  4375 class RSubSessionBase
       
  4376 	{
       
  4377 public:
       
  4378 	inline TInt SubSessionHandle() const;
       
  4379 protected:
       
  4380 	inline RSubSessionBase();
       
  4381 	IMPORT_C const RSessionBase Session() const;
       
  4382 	inline TInt CreateSubSession(const RSessionBase& aSession,TInt aFunction,const TIpcArgs& aArgs);
       
  4383 	inline TInt CreateSubSession(const RSessionBase& aSession,TInt aFunction);
       
  4384 	IMPORT_C TInt CreateAutoCloseSubSession(RSessionBase& aSession,TInt aFunction,const TIpcArgs& aArgs);
       
  4385 	IMPORT_C void CloseSubSession(TInt aFunction);
       
  4386 	inline TInt Send(TInt aFunction,const TIpcArgs& aArgs) const;
       
  4387 	inline void SendReceive(TInt aFunction,const TIpcArgs& aArgs,TRequestStatus& aStatus) const;
       
  4388 	inline TInt SendReceive(TInt aFunction,const TIpcArgs& aArgs) const;
       
  4389 	inline TInt Send(TInt aFunction) const;
       
  4390 	inline void SendReceive(TInt aFunction,TRequestStatus& aStatus) const;
       
  4391 	inline TInt SendReceive(TInt aFunction) const;
       
  4392 private:
       
  4393 	IMPORT_C TInt DoCreateSubSession(const RSessionBase& aSession,TInt aFunction,const TIpcArgs* aArgs);
       
  4394 	IMPORT_C TInt DoSend(TInt aFunction,const TIpcArgs* aArgs) const;
       
  4395 	IMPORT_C void DoSendReceive(TInt aFunction,const TIpcArgs* aArgs,TRequestStatus& aStatus) const;
       
  4396 	IMPORT_C TInt DoSendReceive(TInt aFunction,const TIpcArgs* aArgs) const;
       
  4397 	TInt DoCreateSubSession(RSessionBase& aSession,TInt aFunction,const TIpcArgs* aArgs, TBool aAutoClose);
       
  4398 private:
       
  4399 	RSessionBase iSession;
       
  4400 	TInt iSubSessionHandle;
       
  4401 	};
       
  4402 
       
  4403 
       
  4404 
       
  4405 
       
  4406 /**
       
  4407 @publishedAll
       
  4408 @released
       
  4409 
       
  4410 Base class that provides an implementation for the templated
       
  4411 RRef class.
       
  4412 
       
  4413 @see RRef
       
  4414 */
       
  4415 class RRefBase
       
  4416 	{
       
  4417 public:
       
  4418 	IMPORT_C void Free();
       
  4419 protected:
       
  4420 	inline RRefBase();
       
  4421 	inline RRefBase(const RRefBase& aRef);
       
  4422 	IMPORT_C void DoAlloc(const TAny* aPtr,TInt aSize);
       
  4423 	IMPORT_C void DoAllocL(const TAny* aPtr,TInt aSize);
       
  4424 	IMPORT_C void Copy(const RRefBase& aRef);
       
  4425 private:
       
  4426 	IMPORT_C void operator=(const RRefBase& aRef);
       
  4427 protected:
       
  4428 	TInt* iPtr;
       
  4429 	};
       
  4430 
       
  4431 
       
  4432 
       
  4433 
       
  4434 /**
       
  4435 @publishedAll
       
  4436 @released
       
  4437 
       
  4438 Contains, or packages, a copy of an instance of another class.
       
  4439 
       
  4440 The template parameter defines the type of the contained object.
       
  4441 
       
  4442 The contained object is held in allocated memory, and can be accessed
       
  4443 through the member selection and dereference operators.
       
  4444 */
       
  4445 template <class T>
       
  4446 class RRef : public RRefBase
       
  4447 	{
       
  4448 public:
       
  4449 	inline RRef();
       
  4450 	inline RRef(const RRef<T>& anObject);
       
  4451 	inline void operator=(const RRef<T>& anObject);
       
  4452 	inline T* operator->();
       
  4453 	inline operator T*();
       
  4454 	inline void Alloc(const T& anObject);
       
  4455 	inline void Alloc(const T& anObject,TInt aSize);
       
  4456 	inline void AllocL(const T& anObject);
       
  4457 	inline void AllocL(const T& anObject,TInt aSize);
       
  4458 	};
       
  4459 
       
  4460 
       
  4461 
       
  4462 
       
  4463 /**
       
  4464 @publishedAll
       
  4465 @released
       
  4466 
       
  4467 A handle to a change notifier. 
       
  4468 
       
  4469 The change notifier itself is a kernel object.
       
  4470 */
       
  4471 class RChangeNotifier : public RHandleBase
       
  4472 	{
       
  4473 public:
       
  4474 	IMPORT_C TInt Create();
       
  4475 	IMPORT_C TInt Logon(TRequestStatus& aStatus) const;
       
  4476 	IMPORT_C TInt LogonCancel() const;
       
  4477 	};
       
  4478 
       
  4479 
       
  4480 
       
  4481 
       
  4482 /**
       
  4483 @publishedAll
       
  4484 @released
       
  4485 
       
  4486 Handle to a thread death notifier. 
       
  4487 
       
  4488 The notifier allows threads to be notified of the death of another thread. 
       
  4489 
       
  4490 The thread-death notifier itself is a kernel object.
       
  4491 */
       
  4492 class RUndertaker : public RHandleBase
       
  4493 	{
       
  4494 public:
       
  4495 	IMPORT_C TInt Create();
       
  4496 	IMPORT_C TInt Logon(TRequestStatus& aStatus,TInt& aThreadHandle) const;
       
  4497 	IMPORT_C TInt LogonCancel() const;
       
  4498 	};
       
  4499 
       
  4500 
       
  4501 
       
  4502 
       
  4503 
       
  4504 class HBufC16;
       
  4505 /**
       
  4506 @publishedAll
       
  4507 @released
       
  4508 
       
  4509 A handle to a session with the extended notifier server that provides support
       
  4510 for plug-in notifiers.
       
  4511 
       
  4512 The interface allows engines or other low level components
       
  4513 to communicate with the UI.
       
  4514 */
       
  4515 class RNotifier : public RSessionBase
       
  4516 	{
       
  4517 public:
       
  4518 	IMPORT_C RNotifier();
       
  4519 	IMPORT_C TInt Connect();
       
  4520 	IMPORT_C void Close();
       
  4521 	IMPORT_C TInt StartNotifier(TUid aNotifierUid,const TDesC8& aBuffer);
       
  4522 	IMPORT_C TInt StartNotifier(TUid aNotifierUid,const TDesC8& aBuffer,TDes8& aResponse);
       
  4523 	IMPORT_C TInt StartNotifier(TUid aNotifierDllUid,TUid aNotifierUid,const TDesC8& aBuffer,TDes8& aResponse);
       
  4524 	IMPORT_C TInt CancelNotifier(TUid aNotifierUid);
       
  4525 	IMPORT_C TInt UpdateNotifier(TUid aNotifierUid,const TDesC8& aBuffer,TDes8& aResponse);
       
  4526 	IMPORT_C void UpdateNotifierAndGetResponse(TRequestStatus& aRs,TUid aNotifierUid,const TDesC8& aBuffer,TDes8& aResponse);
       
  4527 	IMPORT_C void StartNotifierAndGetResponse(TRequestStatus& aRs,TUid aNotifierUid,const TDesC8& aBuffer,TDes8& aResponse);
       
  4528 	IMPORT_C void StartNotifierAndGetResponse(TRequestStatus& aRs,TUid aNotifierDllUid,TUid aNotifierUid,const TDesC8& aBuffer,TDes8& aResponse);
       
  4529 	IMPORT_C TInt UnloadNotifiers(TUid aNotifierUid);
       
  4530 	IMPORT_C TInt LoadNotifiers(TUid aNotifierUid);
       
  4531 	IMPORT_C void Notify(const TDesC& aLine1,const TDesC& aLine2,const TDesC& aBut1,const TDesC& aBut2,TInt& aButtonVal,TRequestStatus& aStatus);
       
  4532 	IMPORT_C void NotifyCancel();
       
  4533 	IMPORT_C TInt InfoPrint(const TDesC& aDes);
       
  4534 private:
       
  4535 	TPtr8 iButtonVal;
       
  4536 	HBufC16* iCombinedBuffer;
       
  4537 	};
       
  4538 
       
  4539 /**
       
  4540 @publishedAll
       
  4541 @released
       
  4542 
       
  4543 Abstract class that defines a handler to work with the TRAP mechanism.
       
  4544 
       
  4545 Symbian OS provides a trap handler and this class does not normally need to be
       
  4546 used or accessed directly by applications and third party code.
       
  4547 */
       
  4548 class TTrapHandler
       
  4549 	{
       
  4550 public:
       
  4551 	IMPORT_C TTrapHandler();
       
  4552 	
       
  4553 	/**
       
  4554 	Called when a TRAP is invoked.
       
  4555 	*/
       
  4556 	IMPORT_C virtual void Trap()=0;
       
  4557 	
       
  4558 	/**
       
  4559 	Called when a function exits a TRAP without leaving.
       
  4560     */
       
  4561 	IMPORT_C virtual void UnTrap()=0;
       
  4562 	
       
  4563 	/**
       
  4564 	Called when a function within a TRAP leaves.
       
  4565 
       
  4566     @param aValue The leave value.
       
  4567 	*/
       
  4568 	IMPORT_C virtual void Leave(TInt aValue)=0;
       
  4569 	};
       
  4570 
       
  4571 
       
  4572 
       
  4573 
       
  4574 struct TCollationMethod; // forward declaration
       
  4575 
       
  4576 
       
  4577 
       
  4578 
       
  4579 /**
       
  4580 @publishedAll
       
  4581 @released
       
  4582 
       
  4583 Contains a set of static functions which perform manipulation of
       
  4584 data in memory.
       
  4585 
       
  4586 The arguments passed to the functions of this class are pointers to memory 
       
  4587 locations and length values. These functions are, therefore, not normally 
       
  4588 used in open code but are suitable for implementing data manipulation for 
       
  4589 other classes. Typically the interface provided by such classes is typesafe 
       
  4590 and hides this direct memory to memory manipulation.
       
  4591 */
       
  4592 class Mem
       
  4593 	{
       
  4594 public:
       
  4595 	inline static TUint8* Copy(TAny* aTrg, const TAny* aSrc, TInt aLength);
       
  4596 	inline static TUint8* Move(TAny* aTrg, const TAny* aSrc, TInt aLength);
       
  4597 	inline static void Fill(TAny* aTrg, TInt aLength, TChar aChar);
       
  4598 	inline static void FillZ(TAny* aTrg, TInt aLength);
       
  4599 #ifndef __GCC32__
       
  4600 	inline static TInt Compare(const TUint8* aLeft, TInt aLeftL, const TUint8* aRight, TInt aRightL);
       
  4601 #else
       
  4602 	IMPORT_C static TInt Compare(const TUint8* aLeft, TInt aLeftL, const TUint8* aRight, TInt aRightL);
       
  4603 #endif
       
  4604 
       
  4605 	IMPORT_C static TInt Compare(const TUint16* aLeft, TInt aLeftL, const TUint16* aRight, TInt aRightL);
       
  4606 	IMPORT_C static TInt CompareF(const TUint8* aLeft, TInt aLeftL, const TUint8* aRight, TInt aRightL);
       
  4607 	IMPORT_C static TInt CompareF(const TUint16* aLeft, TInt aLeftL, const TUint16* aRight, TInt aRightL);
       
  4608 	IMPORT_C static TInt CompareC(const TUint8* aLeft, TInt aLeftL, const TUint8* aRight, TInt aRightL);
       
  4609 	IMPORT_C static TInt CompareC(const TUint16* aLeft, TInt aLeftL, const TUint16* aRight, TInt aRightL);
       
  4610 	IMPORT_C static TInt CompareC(const TUint16* aLeft, TInt aLeftL, const TUint16* aRight, TInt aRightL,
       
  4611 								  TInt aMaxLevel, const TCollationMethod* aCollationMethod);
       
  4612 	IMPORT_C static TInt CollationMethods();
       
  4613 	IMPORT_C static TUint CollationMethodId(TInt aIndex);
       
  4614 	IMPORT_C static const TCollationMethod* CollationMethodByIndex(TInt aIndex);
       
  4615 	IMPORT_C static const TCollationMethod* CollationMethodById(TUint aId);
       
  4616 	IMPORT_C static const TCollationMethod* GetDefaultMatchingTable();
       
  4617 	IMPORT_C static void Swap(TAny* aPtr1, TAny* aPtr2, TInt aLength);
       
  4618 	IMPORT_C static void Crc(TUint16& aCrc, const TAny* aPtr, TInt aLength);
       
  4619 	IMPORT_C static void Crc32(TUint32& aCrc, const TAny* aPtr, TInt aLength);
       
  4620 	};
       
  4621 
       
  4622 
       
  4623 
       
  4624 
       
  4625 
       
  4626 /**
       
  4627 @publishedAll
       
  4628 @released
       
  4629 
       
  4630 Set of static user functions.
       
  4631 
       
  4632 These functions are related to a number of System component APIs.
       
  4633 
       
  4634 The majority of the functions are related to either the current thread, or 
       
  4635 its heap. Examples in this category include User::Exit(), which causes the 
       
  4636 thread to terminate, and User::Alloc(), which allocates memory from the current 
       
  4637 thread's heap.
       
  4638 
       
  4639 Some of these functions are equivalent to functions in the RThread or RHeap 
       
  4640 classes. In these cases, the User function is a convenient way to access the 
       
  4641 function without first having to get a handle to the current thread.
       
  4642 
       
  4643 Functions are also provided to support debugging of memory leaks. These function 
       
  4644 calls can be written explicitly or can be generated using a corresponding 
       
  4645 macro - the advantage of using a macro is that the function call is only 
       
  4646 generated for debug builds.
       
  4647 
       
  4648 A final category of functions, which includes User::BinarySearch() and User::QuickSort(), 
       
  4649 are just useful functions which have no other natural home.
       
  4650 
       
  4651 @see RThread
       
  4652 @see RHeap
       
  4653 */
       
  4654 class User : public UserHeap
       
  4655     {
       
  4656 public:
       
  4657     // Execution control
       
  4658 	IMPORT_C static void InitProcess();			/**< @internalComponent */
       
  4659     IMPORT_C static void Exit(TInt aReason);
       
  4660     IMPORT_C static void Panic(const TDesC& aCategory,TInt aReason);
       
  4661     IMPORT_C static void HandleException(TAny* aInfo);	/**< @internalComponent */
       
  4662     // Cleanup support
       
  4663     IMPORT_C static void Leave(TInt aReason);
       
  4664     IMPORT_C static void LeaveNoMemory();
       
  4665     IMPORT_C static TInt LeaveIfError(TInt aReason);
       
  4666     IMPORT_C static TAny* LeaveIfNull(TAny* aPtr);
       
  4667     inline static const TAny* LeaveIfNull(const TAny* aPtr);
       
  4668     IMPORT_C static TTrapHandler* SetTrapHandler(TTrapHandler* aHandler);
       
  4669     IMPORT_C static TTrapHandler* TrapHandler();
       
  4670     IMPORT_C static TTrapHandler* MarkCleanupStack();   /**< @internalComponent */
       
  4671     IMPORT_C static void UnMarkCleanupStack(TTrapHandler* aHandler);   /**< @internalComponent */
       
  4672 	IMPORT_C static void LeaveEnd();	/**< @internalComponent */
       
  4673     // Infoprint
       
  4674     IMPORT_C static TInt InfoPrint(const TDesC& aDes);
       
  4675     // Asynchronous service support
       
  4676     IMPORT_C static void RequestComplete(TRequestStatus*& aStatus,TInt aReason);
       
  4677     IMPORT_C static void WaitForAnyRequest();
       
  4678     IMPORT_C static void WaitForRequest(TRequestStatus& aStatus); 
       
  4679     IMPORT_C static void WaitForRequest(TRequestStatus& aStatus1,TRequestStatus& aStatus2);
       
  4680     IMPORT_C static void WaitForNRequest(TRequestStatus *aStatusArray[], TInt aNum);
       
  4681     // User heap management
       
  4682     IMPORT_C static TInt AllocLen(const TAny* aCell); 
       
  4683     IMPORT_C static TAny* Alloc(TInt aSize);
       
  4684     IMPORT_C static TAny* AllocL(TInt aSize); 
       
  4685     IMPORT_C static TAny* AllocLC(TInt aSize);
       
  4686     IMPORT_C static TAny* AllocZ(TInt aSize);
       
  4687     IMPORT_C static TAny* AllocZL(TInt aSize); 
       
  4688     IMPORT_C static TInt AllocSize(TInt& aTotalAllocSize); 
       
  4689     IMPORT_C static TInt Available(TInt& aBiggestBlock); 
       
  4690     IMPORT_C static TInt CountAllocCells();
       
  4691     IMPORT_C static TInt CountAllocCells(TInt& aFreeCount); 
       
  4692     IMPORT_C static void Free(TAny* aCell);
       
  4693     IMPORT_C static void FreeZ(TAny*& aCell); 
       
  4694     IMPORT_C static RAllocator& Allocator();
       
  4695     inline static RHeap& Heap();
       
  4696     IMPORT_C static TAny* ReAlloc(TAny* aCell, TInt aSize, TInt aMode=0);
       
  4697     IMPORT_C static TAny* ReAllocL(TAny* aCell, TInt aSize, TInt aMode=0);
       
  4698     IMPORT_C static RAllocator* SwitchAllocator(RAllocator* aAllocator);
       
  4699 	inline static RHeap* SwitchHeap(RAllocator* aHeap);
       
  4700 	IMPORT_C static TInt CompressAllHeaps();
       
  4701     // Synchronous timer services
       
  4702     IMPORT_C static void After(TTimeIntervalMicroSeconds32 aInterval);
       
  4703     IMPORT_C static TInt At(const TTime& aTime);
       
  4704     IMPORT_C static void AfterHighRes(TTimeIntervalMicroSeconds32 aInterval);
       
  4705     // Set time and deal with timezones
       
  4706     IMPORT_C static TInt SetHomeTime(const TTime& aTime);
       
  4707     IMPORT_C static TInt SetHomeTimeSecure(const TTime& aTime);
       
  4708 	IMPORT_C static TInt SetUTCTime(const TTime& aUTCTime);
       
  4709 	IMPORT_C static TInt SetUTCTimeSecure(const TTime& aUTCTime);
       
  4710 	IMPORT_C static TTimeIntervalSeconds UTCOffset();
       
  4711 	IMPORT_C static void SetUTCOffset(TTimeIntervalSeconds aOffset);
       
  4712 	IMPORT_C static TInt SetUTCTimeAndOffset(const TTime& aUTCTime, TTimeIntervalSeconds aOffset);
       
  4713     // Set locale information
       
  4714     IMPORT_C static TInt SetCurrencySymbol(const TDesC& aSymbol);
       
  4715 	// Set floating point mode
       
  4716 	IMPORT_C static TInt SetFloatingPointMode(TFloatingPointMode aMode, TFloatingPointRoundingMode aRoundingMode=EFpRoundToNearest);
       
  4717 	// Timers
       
  4718 	IMPORT_C static TUint TickCount();
       
  4719 	IMPORT_C static TUint32 NTickCount();
       
  4720 	IMPORT_C static TTimerLockSpec LockPeriod();
       
  4721 	IMPORT_C static TTimeIntervalSeconds InactivityTime();
       
  4722 	IMPORT_C static void ResetInactivityTime();
       
  4723 	IMPORT_C static TUint32 FastCounter();
       
  4724 	// Atomic operations
       
  4725 	IMPORT_C static TInt LockedInc(TInt& aValue);
       
  4726 	IMPORT_C static TInt LockedDec(TInt& aValue);
       
  4727 	IMPORT_C static TInt SafeInc(TInt& aValue);
       
  4728 	IMPORT_C static TInt SafeDec(TInt& aValue);
       
  4729     // Beep
       
  4730     IMPORT_C static TInt Beep(TInt aFrequency,TTimeIntervalMicroSeconds32 aDuration); 
       
  4731     // Information
       
  4732     IMPORT_C static TInt IsRomAddress(TBool& aBool,TAny* aPtr);
       
  4733     // Algorithms
       
  4734     IMPORT_C static TInt BinarySearch(TInt aCount,const TKey& aKey,TInt& aPos);
       
  4735     IMPORT_C static TInt QuickSort(TInt aCount,const TKey& aKey,const TSwap& aSwap);
       
  4736     // Language-dependent character functions 
       
  4737     IMPORT_C static TLanguage Language();
       
  4738     IMPORT_C static TRegionCode RegionCode();
       
  4739     IMPORT_C static TUint Collate(TUint aChar); 
       
  4740     IMPORT_C static TUint Fold(TUint aChar); 
       
  4741     IMPORT_C static TUint LowerCase(TUint aChar); 
       
  4742     IMPORT_C static TUint UpperCase(TUint aChar); 
       
  4743 	IMPORT_C static TUint Fold(TUint aChar,TInt aFlags);
       
  4744 	IMPORT_C static TUint TitleCase(TUint aChar);
       
  4745     // C-style string length
       
  4746     IMPORT_C static TInt StringLength(const TUint8* aString); 
       
  4747     IMPORT_C static TInt StringLength(const TUint16* aString);
       
  4748     // Device management
       
  4749     IMPORT_C static TInt FreeLogicalDevice(const TDesC& aDeviceName); 
       
  4750 	IMPORT_C static TInt FreePhysicalDevice(const TDesC& aDriverName); 
       
  4751     IMPORT_C static TInt LoadLogicalDevice(const TDesC& aFileName); 
       
  4752     IMPORT_C static TInt LoadPhysicalDevice(const TDesC& aFileName); 
       
  4753     // Version information
       
  4754     IMPORT_C static TBool QueryVersionSupported(const TVersion& aCurrent,const TVersion& aRequested);
       
  4755     IMPORT_C static TVersion Version();
       
  4756     // Machine configuration
       
  4757     IMPORT_C static TInt SetMachineConfiguration(const TDesC8& aConfig);
       
  4758     IMPORT_C static TInt MachineConfiguration(TDes8& aConfig,TInt& aSize);
       
  4759     // Debugging support
       
  4760     IMPORT_C static void SetDebugMask(TUint32 aVal);
       
  4761     IMPORT_C static void SetDebugMask(TUint32 aVal, TUint aIndex);
       
  4762     IMPORT_C static void SetJustInTime(const TBool aBoolean); 
       
  4763     IMPORT_C static void Check();
       
  4764     IMPORT_C static void Invariant();
       
  4765     IMPORT_C static TBool JustInTime();
       
  4766     IMPORT_C static void __DbgMarkStart(TBool aKernel);
       
  4767     IMPORT_C static void __DbgMarkCheck(TBool aKernel, TBool aCountAll, TInt aCount, const TUint8* aFileName, TInt aLineNum);
       
  4768     IMPORT_C static TUint32 __DbgMarkEnd(TBool aKernel, TInt aCount);
       
  4769     IMPORT_C static void __DbgSetAllocFail(TBool aKernel, RAllocator::TAllocFail aFail, TInt aRate);
       
  4770     IMPORT_C static void __DbgSetBurstAllocFail(TBool aKernel, RAllocator::TAllocFail aFail, TUint aRate, TUint aBurst);
       
  4771 	IMPORT_C static TUint __DbgCheckFailure(TBool aKernel);
       
  4772 	IMPORT_C static void PanicUnexpectedLeave(); /**< @internalComponent */
       
  4773     // Name Validation
       
  4774     IMPORT_C static TInt ValidateName(const TDesC& aName);
       
  4775 	// Instruction Memory Barrier
       
  4776 	IMPORT_C static void IMB_Range(TAny* aStart, TAny* aEnd);
       
  4777 	//
       
  4778 	IMPORT_C static TInt CommandLineLength();
       
  4779 	IMPORT_C static void CommandLine(TDes &aCommand);
       
  4780 	IMPORT_C static TExceptionHandler ExceptionHandler();
       
  4781 	IMPORT_C static TInt SetExceptionHandler(TExceptionHandler aHandler,TUint32 aMask);
       
  4782 	IMPORT_C static void ModifyExceptionMask(TUint32 aClearMask, TUint32 aSetMask);
       
  4783 	IMPORT_C static TInt RaiseException(TExcType aType);
       
  4784 	IMPORT_C static TBool IsExceptionHandled(TExcType aType);
       
  4785 
       
  4786 	/**
       
  4787 	A set of values that defines the effect that terminating a thread 
       
  4788 	has, either on its owning process or on the whole system.
       
  4789 	
       
  4790 	A thread is said to be critical if its owning process or the entire system
       
  4791 	terminates when the thread itself terminates. 
       
  4792 	
       
  4793 	You pass one of these values to the functions:
       
  4794 	- User::SetCritical()
       
  4795 	- User::SetProcessCritical()
       
  4796 	
       
  4797 	The meaning of a value when passed to one function is different to
       
  4798 	its meaning when passed the other function. See the description of each
       
  4799 	individual value.
       
  4800 			
       
  4801 	@see User::SetCritical()
       
  4802 	@see User::SetProcessCritical()
       
  4803 	*/
       
  4804 	enum TCritical {
       
  4805 	
       
  4806 	
       
  4807 	               /**
       
  4808                    This value can be passed to both:
       
  4809                    - User::SetCritical(), which means that the current thread
       
  4810                    is no longer critical, i.e. termination of the current
       
  4811                    thread will no longer cause termination of the current thread's
       
  4812                    owning process (i.e. the current process) or a reboot of the system.
       
  4813                    - User::SetProcessCritical(), which means that threads
       
  4814                    subsequently created in the current thread's owning
       
  4815                    process (i.e. the current process) will no longer cause termination of that
       
  4816                    process or a reboot of the system. Note, however, that existing
       
  4817                    threads are NOT affected when you call this function.
       
  4818                    
       
  4819                    @see User::SetCritical()
       
  4820                    @see User::SetProcessCritical()
       
  4821                    */
       
  4822                    ENotCritical, 
       
  4823                    
       
  4824                                       
       
  4825                    /**
       
  4826                    This value can only be passed to User::SetCritical() and
       
  4827                    affects the current thread only.
       
  4828                    
       
  4829                    It means that the owning process (i.e.the current process)
       
  4830                    terminates if:
       
  4831                    - the current thread is terminated.
       
  4832                    - the current thread panics.
       
  4833                    
       
  4834                    @see User::SetCritical()
       
  4835                    */	
       
  4836 	               EProcessCritical,
       
  4837 
       
  4838 	               
       
  4839 	               /**
       
  4840                    This value can only be passed to User::SetCritical() and
       
  4841                    affects the current thread only.
       
  4842                    
       
  4843                    It means that the owning process (i.e.the current process)
       
  4844                    terminates if the current thread terminates for any reason.
       
  4845                    
       
  4846                    @see User::SetCritical()
       
  4847                    */
       
  4848 	               EProcessPermanent,
       
  4849 	               
       
  4850 	               
       
  4851 	               /**
       
  4852 	               This value can only be passed to User::SetProcessCritical() and
       
  4853                    affects any new threads created in the current process.
       
  4854 	               
       
  4855 	               It means that the current process terminates if:
       
  4856 	               - any new thread subsequently created in the current process is terminated.
       
  4857 	               - any new thread subsequently created in the current process panics.
       
  4858 	               .
       
  4859 	               Note, however, that existing threads in the current process
       
  4860 	               are NOT affected when you call User::SetProcessCritical()
       
  4861 	               with this value.
       
  4862 	               	               
       
  4863 	               @see EProcessCritical
       
  4864                    @see User::SetProcessCritical()
       
  4865 	               */
       
  4866 	               EAllThreadsCritical,
       
  4867 	                	                
       
  4868 	                
       
  4869 	               /**
       
  4870 	               This value can be passed to both: User::SetCritical() and
       
  4871 	               User::SetProcessCritical().
       
  4872                    
       
  4873                    When passed to User::SetCritical(), it means that
       
  4874                    the entire system is rebooted if:
       
  4875                    - the current thread is terminated.
       
  4876                    - the current thread panics.
       
  4877                    
       
  4878                    When passed to User::SetProcessCritical(), it means that
       
  4879                    the entire system is rebooted if:
       
  4880                    - any new thread subsequently created in the current process is terminated.
       
  4881                    - any new thread subsequently created in the current process panics.
       
  4882                    - the process itself is terminated
       
  4883                    - the process itself panics
       
  4884 	               
       
  4885 	               Note:
       
  4886                    -# existing threads in the current process are NOT affected when you
       
  4887                    call User::SetProcessCritical() with this value.
       
  4888                    -# Only a process with 'Protected Server' capability can set a
       
  4889                    thread to system-critical.
       
  4890                    
       
  4891                    @see User::SetCritical()
       
  4892                    @see User::SetProcessCritical()
       
  4893 	               */
       
  4894 	               ESystemCritical,
       
  4895 	               
       
  4896 	               
       
  4897 	               /**
       
  4898 	               This value can be passed to both: User::SetCritical()
       
  4899 	               and User::SetProcessCritical().
       
  4900                    
       
  4901                    When passed to User::SetCritical(), it means that
       
  4902                    the entire system is rebooted if the current thread
       
  4903                    exits for any reason.
       
  4904                    
       
  4905                    When passed to User::SetProcessCritical(), it means that
       
  4906                    the entire system is rebooted if any new thread 
       
  4907                    subsequently created in the current process exits
       
  4908                    for any reason, or if the process itself exits for any reason.
       
  4909 	               
       
  4910 	               Note:
       
  4911                    -# existing threads in the current process are NOT affected when you
       
  4912                    call User::SetProcessCritical() with this value.
       
  4913                    -# Only a process with 'Protected Server' capability can set a
       
  4914                    thread to system-permanent.
       
  4915                    
       
  4916                    @see User::SetCritical()
       
  4917                    @see User::SetProcessCritical()
       
  4918 	               */
       
  4919 	               ESystemPermanent
       
  4920 	               };
       
  4921 	IMPORT_C static TCritical Critical();
       
  4922 	IMPORT_C static TCritical Critical(RThread aThread);
       
  4923 	IMPORT_C static TInt SetCritical(TCritical aCritical);
       
  4924 	IMPORT_C static TCritical ProcessCritical();
       
  4925 	IMPORT_C static TCritical ProcessCritical(RProcess aProcess);
       
  4926 	IMPORT_C static TInt SetProcessCritical(TCritical aCritical);
       
  4927 	IMPORT_C static TBool PriorityControl();
       
  4928 	IMPORT_C static void SetPriorityControl(TBool aEnable);
       
  4929 
       
  4930 	/**
       
  4931 	A threads realtime state.
       
  4932 	Some non-realtime behaviour can be detected by the kernel. When it does so,
       
  4933 	action is taken depending on the thread state:
       
  4934 	-	ERealtimeStateOff - no action.
       
  4935 	-	ERealtimeStateOn - the the thread will be panicked with KERN-EXEC 61 (EIllegalFunctionForRealtimeThread).
       
  4936 	-	ERealtimeStateWarn - no action. However, if the kernel trace flag KREALTIME is enabled
       
  4937 							 then tracing will be emitted as if the thread state was ERealtimeStateOn.
       
  4938 	@publishedPartner
       
  4939 	@released
       
  4940 	*/
       
  4941 	enum TRealtimeState
       
  4942 		{
       
  4943 		ERealtimeStateOff,	/**< Thread is not realtime */
       
  4944 		ERealtimeStateOn,	/**< Thread is realtime */
       
  4945 		ERealtimeStateWarn	/**< Thread is realtime but doesn't want this enforced */
       
  4946 		};
       
  4947 
       
  4948 	/**
       
  4949 	Set the current threads realtime state.
       
  4950 	@see TRealtimeState
       
  4951 	@param aState The state
       
  4952 	@return KErrNone if successful. KErrArgument if aState is invalid.
       
  4953 	@publishedPartner
       
  4954 	@released
       
  4955 	*/
       
  4956 	IMPORT_C static TInt SetRealtimeState(TRealtimeState aState);
       
  4957 
       
  4958 	/**
       
  4959 	Return the Secure ID of the process that created the current process.
       
  4960 	@return The Secure ID.
       
  4961 	@publishedAll
       
  4962 	@released
       
  4963 	*/
       
  4964 	IMPORT_C static TSecureId CreatorSecureId();
       
  4965 
       
  4966 	/**
       
  4967 	Return the Vendor ID of the process that created the current process.
       
  4968 	@return The Vendor ID.
       
  4969 	@publishedAll
       
  4970 	@released
       
  4971 	*/
       
  4972 	IMPORT_C static TVendorId CreatorVendorId();
       
  4973 
       
  4974 	/**
       
  4975 	Check if the process that created the current process has a given capability
       
  4976 
       
  4977 	When a check fails the action taken is determined by the system wide Platform Security
       
  4978 	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
       
  4979 	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
       
  4980 	check failed.
       
  4981 
       
  4982 	@param aCapability The capability to test.
       
  4983 	@param aDiagnostic A string that will be emitted along with any diagnostic message
       
  4984 								that may be issued if the test finds the capability is not present.
       
  4985 								This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
       
  4986 								which enables it to be easily removed from the system.
       
  4987 	@return ETrue if the creator process has the capability, EFalse otherwise.
       
  4988 	@publishedAll
       
  4989 	@released
       
  4990 	*/
       
  4991 #ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
       
  4992 	inline static TBool CreatorHasCapability(TCapability aCapability, const char* aDiagnostic=0);
       
  4993 #else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
       
  4994 	// Only available to NULL arguments
       
  4995 	inline static TBool CreatorHasCapability(TCapability aCapability, OnlyCreateWithNull aDiagnostic=NULL);
       
  4996 #ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
       
  4997 	// For things using KSuppressPlatSecDiagnostic
       
  4998 	inline static TBool CreatorHasCapability(TCapability aCapability, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress);
       
  4999 #endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
       
  5000 #endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
       
  5001 
       
  5002 	/**
       
  5003 	Check if the process that created the current process has both of the given capabilities
       
  5004 
       
  5005 	When a check fails the action taken is determined by the system wide Platform Security
       
  5006 	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
       
  5007 	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
       
  5008 	check failed.
       
  5009 
       
  5010 	@param aCapability1 The first capability to test.
       
  5011 	@param aCapability2 The second capability to test.
       
  5012 	@param aDiagnostic A string that will be emitted along with any diagnostic message
       
  5013 								that may be issued if the test finds a capability is not present.
       
  5014 								This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
       
  5015 								which enables it to be easily removed from the system.
       
  5016 	@return ETrue if the creator process has both the capabilities, EFalse otherwise.
       
  5017 	@publishedAll
       
  5018 	@released
       
  5019 	*/
       
  5020 #ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
       
  5021 	inline static TBool CreatorHasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic=0);
       
  5022 #else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
       
  5023 	// Only available to NULL arguments
       
  5024 	inline static TBool CreatorHasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull aDiagnostic=NULL);
       
  5025 #ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
       
  5026 	// For things using KSuppressPlatSecDiagnostic
       
  5027 	inline static TBool CreatorHasCapability(TCapability aCapability, TCapability aCapability2, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress);
       
  5028 #endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
       
  5029 #endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
       
  5030 
       
  5031 	IMPORT_C static TInt ParameterLength(TInt aSlot);
       
  5032 	IMPORT_C static TInt GetTIntParameter(TInt aSlot, TInt& aData);
       
  5033 	IMPORT_C static TInt GetDesParameter(TInt aSlot, TDes8& aDes);
       
  5034 	IMPORT_C static TInt GetDesParameter(TInt aSlot, TDes16& aDes);
       
  5035 	IMPORT_C static TInt RenameThread(const TDesC &aName);
       
  5036 	IMPORT_C static TInt RenameProcess(const TDesC &aName);
       
  5037 	/*
       
  5038 	User::Identity() has been deprecated and is available for backward
       
  5039 	compatibility purposes only.
       
  5040 
       
  5041 	Use RProcess().SecureId() instead.
       
  5042     
       
  5043 	@deprecated
       
  5044 	*/
       
  5045 	inline static TUid Identity() { return RProcess().SecureId(); }
       
  5046 
       
  5047 	/*
       
  5048 	User::CreatorIdentity() has been deprecated and is available for backward
       
  5049 	compatibility purposes only.
       
  5050 
       
  5051 	Use CreatorSecureId() instead.
       
  5052 	
       
  5053 	@deprecated
       
  5054 	*/
       
  5055 	static inline TUid CreatorIdentity() { return CreatorSecureId(); }
       
  5056 
       
  5057 	IMPORT_C static void NotifyOnIdle(TRequestStatus& aStatus);			/**< @internalTechnology */
       
  5058 	IMPORT_C static void CancelMiscNotifier(TRequestStatus& aStatus);	/**< @internalTechnology */
       
  5059 private:
       
  5060 	// Implementations of functions with diagnostics
       
  5061 	IMPORT_C static TBool DoCreatorHasCapability(TCapability aCapability, const char* aDiagnostic);
       
  5062 	IMPORT_C static TBool DoCreatorHasCapability(TCapability aCapability);
       
  5063 	IMPORT_C static TBool DoCreatorHasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic);
       
  5064 	IMPORT_C static TBool DoCreatorHasCapability(TCapability aCapability1, TCapability aCapability2);
       
  5065 	};
       
  5066 
       
  5067 
       
  5068 
       
  5069 
       
  5070 class ExecHandler;
       
  5071 
       
  5072 /**
       
  5073 @internalComponent
       
  5074 @removed
       
  5075 */
       
  5076 typedef void (*TTlsCleanupHandler)(TAny*);		//don't use
       
  5077 
       
  5078 /**
       
  5079 @publishedAll
       
  5080 @released
       
  5081 
       
  5082 A collection of static functions involved in managing access to
       
  5083 thread-local storage. 
       
  5084 
       
  5085 Thread-local storage is a single machine word of static writable memory.
       
  5086 The scope of this machine word is the thread, which means that there is one
       
  5087 word per thread. The word is only accessible to code running in a DLL.
       
  5088 
       
  5089 In practice, this word is almost always used to hold a pointer to allocated
       
  5090 memory; this makes that memory available to all DLL code running on behalf
       
  5091 of the same thread.
       
  5092 
       
  5093 Note that DLL code running on behalf of one thread does not see the same word when
       
  5094 running on behalf of another thread. 
       
  5095 
       
  5096 The class in not intended for user derivation.
       
  5097 */
       
  5098 class Dll
       
  5099 	{
       
  5100 public:
       
  5101 	static TInt SetTls(TAny* aPtr);
       
  5102 	static TAny* Tls();
       
  5103 	static void FreeTls();
       
  5104 	static void FileName(TFileName &aFileName);
       
  5105 	};
       
  5106 
       
  5107 
       
  5108 
       
  5109 
       
  5110 #ifndef __TOOLS__
       
  5111 /**
       
  5112 @publishedAll
       
  5113 @released
       
  5114 
       
  5115 A thin wrapper class for C++ arrays allowing automatic checking of index values 
       
  5116 to ensure that all accesses are legal. 
       
  5117 
       
  5118 The class also supports the deletion of objects.
       
  5119 
       
  5120 The class is templated, based on a class type and an integer value. The class 
       
  5121 type defines the type of object contained in the array; the integer value 
       
  5122 defines the size (dimension) of the array.
       
  5123 
       
  5124 A wrapper object can be:
       
  5125 
       
  5126 1. embedded in objects allocated on the heap.
       
  5127 
       
  5128 2. used on the program stack.
       
  5129 */
       
  5130 template <class T,TInt S> 
       
  5131 class TFixedArray
       
  5132 	{
       
  5133 	typedef TFixedArray<T,S> ThisClass;
       
  5134 public:
       
  5135 	inline TFixedArray();
       
  5136 	inline TFixedArray(const T* aList, TInt aLength);
       
  5137 	//
       
  5138 	inline void Copy(const T* aList, TInt aLength);
       
  5139 	inline void Reset();		// zero fill
       
  5140 	inline void DeleteAll();
       
  5141 	//
       
  5142 	inline TInt Count() const;
       
  5143 	inline TInt Length() const;
       
  5144 	// Accessors - debug range checking
       
  5145 	inline T& operator[](TInt aIndex);
       
  5146 	inline const T& operator[] (TInt aIndex) const;
       
  5147 	// Accessors - always range checking
       
  5148 	inline T& At(TInt aIndex);
       
  5149 	inline const T& At(TInt aIndex) const;
       
  5150 	// Provides pointers to the beginning and end of the array
       
  5151 	inline T* Begin();
       
  5152 	inline T* End();
       
  5153 	inline const T* Begin() const;
       
  5154 	inline const T* End() const;
       
  5155 	//
       
  5156 	inline TArray<T> Array() const;
       
  5157 protected:
       
  5158 	inline static TBool InRange(TInt aIndex);
       
  5159 	inline static TInt CountFunctionR(const CBase* aThis);
       
  5160 	inline static const TAny* AtFunctionR(const CBase* aThis,TInt aIndex);
       
  5161 protected:
       
  5162 	T iRep[S];
       
  5163 	};
       
  5164 
       
  5165 
       
  5166 
       
  5167 
       
  5168 /**
       
  5169 @publishedAll
       
  5170 @released
       
  5171 */
       
  5172 #define DECLARE_ROM_ARRAY( AName, AData, AType ) \
       
  5173    	const TFixedArray<AType,(sizeof(AData)/sizeof((AData)[0]))>& \
       
  5174             AName = *(reinterpret_cast<const TFixedArray<AType, \
       
  5175                            (sizeof(AData)/sizeof((AData)[0]))>* > (AData))
       
  5176 #endif
       
  5177 
       
  5178 // Global leaving operator new
       
  5179 /**
       
  5180 @publishedAll
       
  5181 @released
       
  5182 */
       
  5183 inline TAny* operator new(TUint aSize, TLeave);
       
  5184 /**
       
  5185 @publishedAll
       
  5186 @released
       
  5187 */
       
  5188 inline TAny* operator new(TUint aSize, TLeave, TUint aExtraSize);
       
  5189 #if !defined(__VC32__) || defined (__MSVCDOTNET__)
       
  5190 /**
       
  5191 @publishedAll
       
  5192 @released
       
  5193 */
       
  5194 inline TAny* operator new[](TUint aSize, TLeave);
       
  5195 #endif
       
  5196 
       
  5197 
       
  5198 #ifdef __LEAVE_EQUALS_THROW__
       
  5199 /** Macro to assert in all builds that code does not leave
       
  5200 
       
  5201 @param	_s	C++ statements to be executed which should not leave
       
  5202 @panic	USER 194 if the code being checked does leave
       
  5203 
       
  5204 @publishedAll
       
  5205 @released
       
  5206 */
       
  5207 #define	__ASSERT_ALWAYS_NO_LEAVE(_s)	\
       
  5208 	{														\
       
  5209 	try	{													\
       
  5210 		TTrapHandler* ____t = User::MarkCleanupStack();		\
       
  5211 		_s;													\
       
  5212 		User::UnMarkCleanupStack(____t);					\
       
  5213 		}													\
       
  5214 	catch (XLeaveException& /*l*/)							\
       
  5215 		{													\
       
  5216 		User::PanicUnexpectedLeave();						\
       
  5217 		}													\
       
  5218 	catch (...)												\
       
  5219 		{													\
       
  5220 		User::Invariant();									\
       
  5221 		}													\
       
  5222 	}
       
  5223 
       
  5224 #else
       
  5225 /** Macro to assert in all builds that code does not leave
       
  5226 
       
  5227 @param	_s	C++ statements to be executed which should not leave
       
  5228 @panic	USER 194 if the code being checked does leave
       
  5229 
       
  5230 @publishedAll
       
  5231 @released
       
  5232 */
       
  5233 #define	__ASSERT_ALWAYS_NO_LEAVE(_s)	\
       
  5234 	{									\
       
  5235 	TInt _r;							\
       
  5236 	TTrap _t;							\
       
  5237 	if (_t.Trap(_r) == 0)				\
       
  5238 		{								\
       
  5239 		_s;								\
       
  5240 		TTrap::UnTrap();				\
       
  5241 		}								\
       
  5242 	else								\
       
  5243 		User::PanicUnexpectedLeave();	\
       
  5244 	}
       
  5245 #endif
       
  5246 
       
  5247 /** Macro to assert in debug builds that code does not leave
       
  5248 
       
  5249 @param	_s	C++ statements to be executed which should not leave
       
  5250 @panic	USER 194 if the code being checked does leave
       
  5251 
       
  5252 @publishedAll
       
  5253 @released
       
  5254 */
       
  5255 #ifdef _DEBUG
       
  5256 #define	__ASSERT_DEBUG_NO_LEAVE(_s)		__ASSERT_ALWAYS_NO_LEAVE(_s)
       
  5257 #else
       
  5258 #define	__ASSERT_DEBUG_NO_LEAVE(_s)		{ _s; }
       
  5259 #endif
       
  5260 
       
  5261 
       
  5262 
       
  5263 // Inline methods
       
  5264 #include <e32std.inl>
       
  5265 
       
  5266 #ifndef SYMBIAN_ENABLE_SPLIT_HEADERS
       
  5267 #include <e32std_private.h>
       
  5268 #endif
       
  5269 
       
  5270 #endif
       
  5271