epoc32/include/e32std.h
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:27:01 +0100
branchSymbian2
changeset 3 e1b950c65cb4
parent 0 061f57f2323e
child 4 837f303aceeb
permissions -rw-r--r--
Attempt to represent the S^2->S^3 header reorganisation as a series of "hg rename" operations
     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 "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members
     5 // which accompanies this distribution, and is available
     6 // at the URL "http://www.symbianfoundation.org/legal/licencesv10.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,TInt64& aDl);
  1207 	void ScndigAfterPoint(TInt& aSig,TInt64& 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,TInt64& 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, 0 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 
  2299 	void SetDefaults(); /**< @internalComponent */
  2300 
  2301 private:
  2302 	friend class TExtendedLocale;
  2303 private:
  2304 	TInt iCountryCode;
  2305 	TTimeIntervalSeconds iUniversalTimeOffset;
  2306 	TDateFormat iDateFormat;
  2307 	TTimeFormat iTimeFormat;
  2308 	TLocalePos iCurrencySymbolPosition;
  2309 	TBool iCurrencySpaceBetween;
  2310 	TInt iCurrencyDecimalPlaces;
  2311 	TNegativeCurrencyFormat iNegativeCurrencyFormat; //	replaced TBool iCurrencyNegativeInBrackets
  2312 	TBool iCurrencyTriadsAllowed;
  2313 	TChar iThousandsSeparator;
  2314 	TChar iDecimalSeparator;
  2315 	TChar iDateSeparator[KMaxDateSeparators];
  2316 	TChar iTimeSeparator[KMaxTimeSeparators];
  2317 	TLocalePos iAmPmSymbolPosition;
  2318 	TBool iAmPmSpaceBetween;
  2319 	TUint iDaylightSaving;
  2320 	TDaylightSavingZone iHomeDaylightSavingZone;
  2321 	TUint iWorkDays;
  2322 	TDay iStartOfWeek;
  2323 	TClockFormat iClockFormat;
  2324 	TUnitsFormat iUnitsGeneral;
  2325 	TUnitsFormat iUnitsDistanceShort;
  2326 	TUnitsFormat iUnitsDistanceLong;
  2327 	TUint iExtraNegativeCurrencyFormatFlags;
  2328 	TUint16 iLanguageDowngrade[3];
  2329 	TUint16 iSpare16;
  2330 	TDigitType iDigitType;
  2331  	TDeviceTimeState iDeviceTimeState;
  2332  	TInt iSpare[0x1E];
  2333 	};
  2334 
  2335 
  2336 /**
  2337 @internalComponent
  2338 */
  2339 const TUint KLocaleLanguageKey = 0x10208903;
  2340 
  2341 /**
  2342 @internalComponent
  2343 */
  2344 const TUint KLocaleDataKey = 0x10208904;
  2345 
  2346 /**
  2347 @internalComponent
  2348 */
  2349 const TUint KLocaleDataExtraKey = 0x10208905;
  2350 
  2351 /**
  2352 @internalComponent
  2353 */
  2354 const TUint KLocaleTimeDateFormatKey = 0x10208907;
  2355 
  2356 /**
  2357 @internalComponent
  2358 */
  2359 const TUint KLocaleDefaultCharSetKey = 0x10208908;
  2360 
  2361 /**
  2362 @internalComponent
  2363 */
  2364 const TUint KLocalePreferredCharSetKey = 0x10208909;
  2365 
  2366 /**
  2367 @internalComponent
  2368 */
  2369 enum TLocaleFunctions
  2370 	{
  2371 	FnDummy,
  2372 	FnAmPmTable,
  2373 	FnCharSet,
  2374 	FnCollTable,
  2375 	FnCurrencySymbol,
  2376 	FnDateSuffixTable,
  2377 	FnDayAbbTable,
  2378 	FnDayTable,
  2379 	FnFoldTable,
  2380 	FnLanguage,
  2381 	FnLocaleData,
  2382 	FnLowerTable,
  2383 	FnMonthAbbTable,
  2384 	FnMonthTable,
  2385 	FnMsgTable,
  2386 	FnTypeTable,
  2387 	FnUniCode,
  2388 	FnUpperTable,
  2389 	FnShortDateFormatSpec,
  2390 	FnLongDateFormatSpec,
  2391 	FnTimeFormatSpec,
  2392 	FnFatUtilityFunctions
  2393 	};
  2394 
  2395 
  2396 /** 
  2397 @publishedAll
  2398 @released
  2399 
  2400 TLocaleAspect
  2401 
  2402 Enumeration used with TExtendedLocale::LoadLocaleAspect to select which
  2403 locale information is to be replaced from the contents of the Locale
  2404 DLL being loaded.
  2405 
  2406 ELocaleLanguageSettings - Replaces everything that should change with
  2407                           language selection e.g. Month names, Day names,
  2408                           etc,
  2409 
  2410 ELocaleLocaleSettings - Replaces the currently selected currency symbol,
  2411                         TLocale settings, and FAT utility functions
  2412 
  2413 ELocaleTimeAndDateSettings - Replaces the current time and date display
  2414                              format settings.
  2415 
  2416 ELocaleCollateSettings - Replaces the "system" preferred Charset
  2417                          (because that's where the collation table
  2418                          is!). The "Default" charset will remain
  2419                          unchanged until after the next power
  2420                          off/on cycle
  2421 */
  2422 enum TLocaleAspect
  2423 	{
  2424 	ELocaleLanguageSettings = 0x01,
  2425 	ELocaleCollateSetting = 0x02,
  2426 	ELocaleLocaleSettings = 0x04,
  2427 	ELocaleTimeDateSettings = 0x08,
  2428 	};
  2429 
  2430 /**
  2431 @internalComponent
  2432 */
  2433 struct SLocaleLanguage
  2434 	{
  2435 	TLanguage 		iLanguage;
  2436 	const TText*	iDateSuffixTable;
  2437 	const TText*	iDayTable;
  2438 	const TText*	iDayAbbTable;
  2439 	const TText*	iMonthTable;
  2440 	const TText*	iMonthAbbTable;
  2441 	const TText*	iAmPmTable;
  2442 	const TText16* const*	iMsgTable;
  2443 	};
  2444 
  2445 /**
  2446 @internalComponent
  2447 */
  2448 struct SLocaleLocaleSettings
  2449 	{
  2450 	TText	iCurrencySymbol[KMaxCurrencySymbol+1];
  2451 	TAny*	iLocaleExtraSettingsDllPtr;
  2452 	};
  2453 
  2454 /**
  2455 @internalComponent
  2456 */
  2457 struct SLocaleTimeDateFormat
  2458 	{
  2459 	TText	iShortDateFormatSpec[KMaxShortDateFormatSpec+1];
  2460 	TText	iLongDateFormatSpec[KMaxLongDateFormatSpec+1];
  2461 	TText	iTimeFormatSpec[KMaxTimeFormatSpec+1];
  2462 	TAny*	iLocaleTimeDateFormatDllPtr;
  2463 	};
  2464 
  2465 struct LCharSet;
  2466 
  2467 /**
  2468 @publishedAll
  2469 @released
  2470 
  2471 Extended locale class
  2472 
  2473 This class holds a collection of locale information. It contains a TLocale internally.
  2474 It has methods to load a locale DLL and to set the system wide locale information.
  2475 
  2476 */
  2477 class TExtendedLocale
  2478 	{
  2479 public:
  2480 
  2481 	// Default constructor, create an empty instance
  2482 	IMPORT_C TExtendedLocale();
  2483 
  2484 	// Initialise to (or restore from!) current system wide locale
  2485 	// settings
  2486 	IMPORT_C void LoadSystemSettings();
  2487 	
  2488 	// Overwrite current system wide locale settings with the current
  2489 	// contents of this TExtendedLocale
  2490 	IMPORT_C TInt SaveSystemSettings();
  2491 
  2492 	// Load a complete set of locale data from a named Locale DLL
  2493 	IMPORT_C TInt LoadLocale(const TDesC& aLocaleDllName);
  2494 
  2495 	// Load an additional Locale DLL and over-ride a selected subset
  2496 	// (currently ELocaleLanguageSettings to select an alternative set
  2497 	// of language specific text strings, ELocaleCollateSetting to
  2498 	// select a new system collation table,
  2499 	// ELocaleOverRideMatchCollationTable to locally select an
  2500 	// alternative collation order for matching text strings, or
  2501 	// ELocaleOverRideSortCollationTable for ordering text strings)
  2502 	// of settings with its contents
  2503 	IMPORT_C TInt LoadLocaleAspect(TUint aAspectGroup, const TDesC& aLocaleDllName);
  2504 
  2505 	// Set the currency Symbol
  2506 	IMPORT_C TInt SetCurrencySymbol(const TDesC &aSymbol);
  2507 
  2508 	// Get the name of the DLL holding the data for a particular set
  2509 	// of Locale properties
  2510 	IMPORT_C TInt GetLocaleDllName(TLocaleAspect aLocaleDataSet, TDes& aDllName);
  2511 
  2512 	// Get the preferred collation method.
  2513 	// Note that some Charsets may contain more than one Collation
  2514 	// method (e.g "dictionary" v "phonebook" ordering) so an optional
  2515 	// index parameter can be used to select between them
  2516 	IMPORT_C TCollationMethod GetPreferredCollationMethod(TInt index = 0) ;
  2517 	
  2518 	//Get the Currency Symbol
  2519 	IMPORT_C TPtrC GetCurrencySymbol();
  2520 	
  2521 	//Get the Long Date Format
  2522 	IMPORT_C TPtrC GetLongDateFormatSpec();
  2523 	
  2524 	//Get the Short Date Format
  2525 	IMPORT_C TPtrC GetShortDateFormatSpec();
  2526 	
  2527 	//Get the Time Format
  2528 	IMPORT_C TPtrC GetTimeFormatSpec();
  2529 
  2530 	// Retrieve a reference to the encapsulated TLocale
  2531 	inline TLocale*	GetLocale();
  2532 
  2533 private:
  2534 
  2535 	TInt DoLoadLocale(const TDesC& aLocaleDllName, TLibraryFunction* aExportList);
  2536 	void DoUpdateLanguageSettings(TLibraryFunction* aExportList);
  2537 	void DoUpdateLocaleSettings(TLibraryFunction* aExportList);
  2538 	void DoUpdateTimeDateFormat(TLibraryFunction* aExportList);
  2539 
  2540 private:
  2541 
  2542 	TLocale					iLocale;
  2543 	SLocaleLanguage			iLanguageSettings;
  2544 	SLocaleLocaleSettings	iLocaleExtraSettings;
  2545 	SLocaleTimeDateFormat	iLocaleTimeDateFormat;
  2546 	const LCharSet*			iDefaultCharSet;
  2547 	const LCharSet*			iPreferredCharSet;
  2548 	};
  2549 
  2550 
  2551 
  2552 
  2553 /**
  2554 @publishedAll
  2555 @released
  2556 
  2557 Geometric rectangle.
  2558 
  2559 The class represents a rectangle whose sides are parallel with the axes of 
  2560 the co-ordinate system. 
  2561 
  2562 The co-ordinates of the top-left and bottom-right corners are used to set 
  2563 the dimensions of the rectangle. The bottom right co-ordinate is outside the 
  2564 rectangle. Thus TRect(TPoint(2,2),TSize(4,4)) is equal
  2565 to TRect(TPoint(2,2),TPoint(6,6)), 
  2566 and in both cases you get a 4x4 pixel rectangle on the screen.
  2567 
  2568 Functions are provided to initialise and manipulate the rectangle and to extract 
  2569 information about it.
  2570 */
  2571 class TRect
  2572 	{
  2573 public:
  2574 	enum TUninitialized { EUninitialized };
  2575 	/**
  2576 	Constructs a default rectangle.
  2577 	
  2578 	This initialises the co-ordinates of its top 
  2579 	left and bottom right corners to (0,0).
  2580 	*/
  2581 	TRect(TUninitialized) {}
  2582 	IMPORT_C TRect();
  2583 	IMPORT_C TRect(TInt aAx,TInt aAy,TInt aBx,TInt aBy);
  2584 	IMPORT_C TRect(const TPoint& aPointA,const TPoint& aPointB);
  2585 	IMPORT_C TRect(const TPoint& aPoint,const TSize& aSize);
  2586 	IMPORT_C TRect(const TSize& aSize);
  2587 	IMPORT_C TBool operator==(const TRect& aRect) const;
  2588 	IMPORT_C TBool operator!=(const TRect& aRect) const;
  2589 	IMPORT_C void SetRect(TInt aAx,TInt aAy,TInt aBx,TInt aBy);
  2590 	IMPORT_C void SetRect(const TPoint& aPointTL,const TPoint& aPointBR);
  2591 	IMPORT_C void SetRect(const TPoint& aPoint,const TSize& aSize);
  2592 	IMPORT_C void Move(TInt aDx,TInt aDy);
  2593 	IMPORT_C void Move(const TPoint& aOffset);
  2594 	IMPORT_C void Resize(TInt aDx,TInt aDy);
  2595 	IMPORT_C void Resize(const TSize& aSize);
  2596 	IMPORT_C void Shrink(TInt aDx,TInt aDy);
  2597 	IMPORT_C void Shrink(const TSize& aSize);
  2598 	IMPORT_C void Grow(TInt aDx,TInt aDy);
  2599 	IMPORT_C void Grow(const TSize& aSize);
  2600 	IMPORT_C void BoundingRect(const TRect& aRect);
  2601 	IMPORT_C TBool IsEmpty() const;
  2602 	IMPORT_C TBool Intersects(const TRect& aRect) const;
  2603 	IMPORT_C void Intersection(const TRect& aRect);
  2604 	IMPORT_C void Normalize();
  2605 	IMPORT_C TBool Contains(const TPoint& aPoint) const;
  2606 	IMPORT_C TSize Size() const;
  2607 	IMPORT_C TInt Width() const;
  2608 	IMPORT_C TInt Height() const;
  2609 	IMPORT_C TBool IsNormalized() const;
  2610 	IMPORT_C TPoint Center() const;
  2611 	IMPORT_C void SetSize(const TSize& aSize);
  2612 	IMPORT_C void SetWidth(TInt aWidth);
  2613 	IMPORT_C void SetHeight(TInt aHeight);
  2614 private:
  2615 	void Adjust(TInt aDx,TInt aDy);
  2616 public:
  2617 	/**
  2618 	The x and y co-ordinates of the top left hand corner of the rectangle.
  2619 	*/
  2620 	TPoint iTl;
  2621 	
  2622 	/**
  2623 	The x and y co-ordinates of the bottom right hand corner of the rectangle.
  2624 	*/
  2625 	TPoint iBr;
  2626 	};
  2627 
  2628 
  2629 
  2630 
  2631 /**
  2632 @publishedAll
  2633 @released
  2634 
  2635 Clipping region - abstract base class. 
  2636 
  2637 This abstract base class represents a 2-dimensional area which is used by 
  2638 Graphics, the graphics window server, and the text window server to define 
  2639 regions of the display which need to be updated, or regions within which all 
  2640 operations must occur. 
  2641 
  2642 A TRegion is defined in terms of an array of TRects and the more complex the 
  2643 region, the more TRects are required to represent it.
  2644 
  2645 A clipping region initially has space allocated for five rectangles.
  2646 If manipulations result in a region which requires more than this, an attempt
  2647 is made to allocate more rectangles. If this cannot be done, an error flag
  2648 is set, and all subsequent operations involving the region have no effect
  2649 (except possibly to propagate the error flag to other regions).
  2650 The CheckError() member function allows 
  2651 the error flag to be tested; Clear() can be used to clear it.
  2652 
  2653 The redraw logic of application programs may use the TRegion in various ways:
  2654 
  2655 1. minimally, they pass it to the graphics context as the clipping region; when 
  2656    a graphics context is activated to a window, the clipping region is set up 
  2657    automatically
  2658 
  2659 2. if they wish to avoid redrawing objects which are outside the general area 
  2660    of the region, they may use TRegion::BoundingRect() to return the rectangle 
  2661    which bounds the clipping region, and draw only primitives that lie within 
  2662    that rectangle
  2663 
  2664 3. if they wish to exercise finer control, they may extract the individual rectangles 
  2665    that comprise the clipping region using Operator[]().
  2666 
  2667 Application programs may also manipulate clipping regions in order to constrain 
  2668 parts of their redrawing to narrower areas of the screen than the clipping 
  2669 region offered by the window server. To do this, functions that allow clipping 
  2670 region manipulation may be used; for example, adding or removing rectangles 
  2671 or finding the intersection or union of two regions.
  2672 */
  2673 class TRegion
  2674 	{
  2675 public:
  2676 	inline TInt Count() const;
  2677 	inline const TRect* RectangleList() const;
  2678 	inline TBool CheckError() const;
  2679 	IMPORT_C TBool IsEmpty() const;
  2680 	IMPORT_C TRect BoundingRect() const;
  2681 	IMPORT_C const TRect& operator[](TInt aIndex) const;
  2682 	IMPORT_C void Copy(const TRegion& aRegion);
  2683 	IMPORT_C void AddRect(const TRect& aRect);
  2684 	IMPORT_C void SubRect(const TRect& aRect,TRegion* aSubtractedRegion=NULL);
  2685 	IMPORT_C void Offset(TInt aXoffset,TInt aYoffset);
  2686 	IMPORT_C void Offset(const TPoint& aOffset);
  2687 	IMPORT_C void Union(const TRegion& aRegion);
  2688 	IMPORT_C void Intersection(const TRegion& aRegion,const TRegion& aRegion2);
  2689 	IMPORT_C void Intersect(const TRegion& aRegion);
  2690 	IMPORT_C void SubRegion(const TRegion& aRegion,TRegion* aSubtractedRegion=NULL);
  2691 	IMPORT_C void ClipRect(const TRect& aRect);
  2692 	IMPORT_C void Clear();
  2693 	IMPORT_C void Tidy();
  2694 	IMPORT_C TInt Sort();
  2695 	IMPORT_C TInt Sort(const TPoint& aOffset);
  2696 	IMPORT_C void ForceError();
  2697 	IMPORT_C TBool IsContainedBy(const TRect& aRect) const;
  2698 	IMPORT_C TBool Contains(const TPoint& aPoint) const;
  2699 	IMPORT_C TBool Intersects(const TRect& aRect) const;	
  2700 protected:
  2701 	IMPORT_C TRect* RectangleListW();
  2702 	IMPORT_C TRegion(TInt aAllocedRects);
  2703 	inline TRegion();
  2704 	TBool SetListSize(TInt aCount);
  2705 	void AppendRect(const TRect& aRect);
  2706 	void DeleteRect(TRect* aRect);
  2707 	void AppendRegion(TRegion& aRegion);
  2708 	void MergeRect(const TRect& aRect, TBool aEnclosed);
  2709 	void SubtractRegion(const TRegion &aRegion,TRegion *aSubtractedRegion=NULL);
  2710 	void ShrinkRegion();
  2711 	TRect* ExpandRegion(TInt aCount);
  2712 protected:
  2713 	TInt iCount;
  2714 	TBool iError;
  2715 	TInt iAllocedRects;
  2716 protected:
  2717 	enum {ERRegionBuf=0x40000000};
  2718 	};
  2719 
  2720 
  2721 
  2722 
  2723 /**
  2724 @publishedAll
  2725 @released
  2726 
  2727 Expandable region.
  2728 
  2729 This class provides for the construction and destruction of a TRegion, including 
  2730 a granularity for expanding the region. A region;s granularity represents 
  2731 the number of memory slots allocated when the object is created, and the number 
  2732 of new memory slots allocated each time an RRegion is expanded beyond the 
  2733 number of free slots. The default granularity is five.
  2734 */
  2735 class RRegion : public TRegion
  2736 	{
  2737 private:
  2738 	enum {EDefaultGranularity=5};
  2739 protected:
  2740 	IMPORT_C RRegion(TInt aBuf,TInt aGran);
  2741 public:
  2742 	IMPORT_C RRegion();
  2743 	IMPORT_C RRegion(TInt aGran);
  2744 	IMPORT_C RRegion(const RRegion& aRegion);
  2745 	IMPORT_C RRegion(const TRect& aRect,TInt aGran=EDefaultGranularity);
  2746 	IMPORT_C RRegion(TInt aCount,TRect* aRectangleList,TInt aGran=EDefaultGranularity);
  2747 	IMPORT_C void Close();
  2748 	IMPORT_C void Destroy();
  2749 	inline TInt CheckSpare() const;
  2750 private:
  2751 	TInt iGranularity;
  2752 	TRect* iRectangleList;
  2753 	friend class TRegion;
  2754 	};
  2755 
  2756 
  2757 
  2758 
  2759 /**
  2760 @publishedAll
  2761 @released
  2762 
  2763 Region with pre-allocated buffer. 
  2764 
  2765 This class provides the functionality of an RRegion, but in addition, for 
  2766 optimisation purposes, uses a buffer containing pre-allocated space for as 
  2767 many rectangles as are specified in the granularity. 
  2768 
  2769 When this buffer is full, cell allocation takes place as for an RRegion, and 
  2770 the RRegionBuf effectively becomes an RRegion. In this case, the region does 
  2771 not revert to using the buffer, even if the region were to shrink so that 
  2772 the buffer could, once again, contain the region. When the region is no longer 
  2773 required, call Close(), defined in the base class RRegion, to free up all 
  2774 memory.
  2775 */
  2776 template <TInt S>
  2777 class RRegionBuf : public RRegion
  2778 	{
  2779 public:
  2780 	inline RRegionBuf();
  2781 	inline RRegionBuf(const RRegion& aRegion);
  2782 	inline RRegionBuf(const RRegionBuf<S>& aRegion);
  2783 	inline RRegionBuf(const TRect& aRect);
  2784 private:
  2785 	TInt8 iRectangleBuf[S*sizeof(TRect)];
  2786 	};
  2787 
  2788 
  2789 
  2790 
  2791 /**
  2792 @publishedAll
  2793 @released
  2794 
  2795 A fixed size region.
  2796 
  2797 The region consists of a fixed number of rectangles; this number is specified 
  2798 in the templated argument. The region cannot be expanded to contain more than 
  2799 this number of rectangles. If an attempt is made to do so, the region's 
  2800 error flag is set, and the region is cleared.
  2801 
  2802 Note that when adding a rectangle to a region, if that rectangle overlaps 
  2803 an existing rectangle, the operation causes more than one rectangle to be 
  2804 created.
  2805 */
  2806 template <TInt S>
  2807 class TRegionFix : public TRegion
  2808 	{
  2809 public:
  2810 	inline TRegionFix();
  2811 	inline TRegionFix(const TRect& aRect);
  2812 	inline TRegionFix(const TRegionFix<S>& aRegion);
  2813 private:
  2814 	TInt8 iRectangleBuf[S*sizeof(TRect)];
  2815 	};
  2816 
  2817 
  2818 
  2819 
  2820 /**
  2821 @publishedAll
  2822 @released
  2823 
  2824 Base class for searching for global kernel objects.
  2825 
  2826 This is the base class for a number of classes which are used to find specific 
  2827 types of global kernel object such as semaphores, threads and mutexes;
  2828 TFindSemaphore, TFindThread and TFindMutex are typical examples of such
  2829 derived classes.
  2830 
  2831 The class implements the common behaviour, specifically, the storage of the 
  2832 match pattern which is used to search for object names.
  2833 
  2834 This class is not intended to be explicitly instantiated; it has public
  2835 constructors but they are part of the class implementation and are described
  2836 for information only.
  2837 */
  2838 class TFindHandleBase : public TFindHandle
  2839 	{
  2840 public:
  2841 	IMPORT_C TFindHandleBase();
  2842 	IMPORT_C TFindHandleBase(const TDesC& aMatch);
  2843 	IMPORT_C void Find(const TDesC& aMatch);
  2844 protected:
  2845 	TInt NextObject(TFullName& aResult,TInt aObjectType);
  2846 private:
  2847 	
  2848 	/**
  2849 	The full name of the last kernel side object found.
  2850 	*/
  2851 	TFullName iMatch;
  2852 	};
  2853 
  2854 
  2855 
  2856 
  2857 /**
  2858 @publishedAll
  2859 @released
  2860 
  2861 Finds all global semaphores whose full names match a specified pattern.
  2862 
  2863 The match pattern can be set into the TFindSemaphore object at construction; 
  2864 it can also be changed at any time after construction by using the Find() 
  2865 member function of the TFindHandleBase base class.
  2866 
  2867 After construction, the Next() member function can be used repeatedly to find 
  2868 successive global semaphores whose full names match the current pattern.
  2869 
  2870 A successful call to Next() means that a matching global semaphore has been 
  2871 found. To open a handle on this semaphore, call the RSemaphore::Open() function 
  2872 and pass a reference to this TFindSemaphore.
  2873 
  2874 Pattern matching is part of descriptor behaviour.
  2875 
  2876 @see TFindHandleBase::Find
  2877 @see TFindSemaphore::Next
  2878 @see RSemaphore::Open
  2879 @see TDesC16::Match
  2880 @see TDesC8::Match
  2881 */
  2882 class TFindSemaphore : public TFindHandleBase
  2883 	{
  2884 public:
  2885 	inline TFindSemaphore();
  2886 	inline TFindSemaphore(const TDesC& aMatch);
  2887 	IMPORT_C TInt Next(TFullName& aResult);
  2888 	};
  2889 
  2890 
  2891 
  2892 
  2893 /**
  2894 @publishedAll
  2895 @released
  2896 
  2897 Finds all global mutexes whose full names match a specified pattern.
  2898 
  2899 The match pattern can be set into the object at construction; it can also 
  2900 be changed at any time after construction by using the Find() member function 
  2901 of the base class.
  2902 
  2903 After construction, the Next() member function may be used repeatedly to find 
  2904 successive global mutexes whose full names match the current pattern.
  2905 
  2906 A successful call to Next() means that a matching global mutex has been found. 
  2907 To open a handle on this mutex, call the Open() member function of RMutex 
  2908 and pass a reference to this TFindMutex object.
  2909 
  2910 Pattern matching is part of descriptors behaviour.
  2911 
  2912 @see TFindHandleBase::Find
  2913 @see TFindMutex::Next
  2914 @see RMutex::Open
  2915 @see TDesC16::Match
  2916 @see TDesC8::Match
  2917 */
  2918 class TFindMutex : public TFindHandleBase
  2919 	{
  2920 public:
  2921 	inline TFindMutex();
  2922 	inline TFindMutex(const TDesC& aMatch);
  2923 	IMPORT_C TInt Next(TFullName& aResult);
  2924 	};
  2925 
  2926 
  2927 
  2928 
  2929 /**
  2930 @publishedAll
  2931 @released
  2932 
  2933 Searches for all global chunks by pattern matching against the names of (Kernel 
  2934 side) chunk objects.
  2935 
  2936 The match pattern can be set into this object at construction; it can also 
  2937 be changed at any time after construction by using TFindHandleBase::Find().
  2938 
  2939 After construction, call TFindChunk::Next() repeatedly to find successive 
  2940 chunks whose names match the current pattern. A successful call
  2941 to TFindChunk::Next() means that a matching chunk has been found.
  2942 
  2943 @see TFindHandleBase
  2944 */
  2945 class TFindChunk : public TFindHandleBase
  2946 	{
  2947 public:
  2948 	inline TFindChunk();
  2949 	inline TFindChunk(const TDesC& aMatch);
  2950 	IMPORT_C TInt Next(TFullName& aResult);
  2951 	};
  2952 
  2953 
  2954 
  2955 
  2956 
  2957 /**
  2958 @publishedAll
  2959 @released
  2960 
  2961 Searches for threads by pattern matching against the names
  2962 of thread objects.
  2963 
  2964 The match pattern can be set into this object at construction; it can also be
  2965 changed at any time after construction by using TFindHandleBase::Find().
  2966 
  2967 After construction, call TFindThread::Next() repeatedly to find successive
  2968 threads whose names match the current pattern.
  2969 A successful call to TFindThread::Next() means that a matching thread has
  2970 been found. To open a handle on this thread, call RThread::Open() and pass
  2971 a reference to this TFindThread.
  2972 
  2973 @see RThread
  2974 */
  2975 class TFindThread : public TFindHandleBase
  2976 	{
  2977 public:
  2978 	inline TFindThread();
  2979 	inline TFindThread(const TDesC& aMatch);
  2980 	IMPORT_C TInt Next(TFullName& aResult);
  2981 	};
  2982 
  2983 
  2984 
  2985 
  2986 /**
  2987 @publishedAll
  2988 @released
  2989 
  2990 Searches for processes by pattern matching against the names
  2991 of process objects.
  2992 
  2993 The match pattern can be set into this object at construction; it can also be
  2994 changed at any time after construction by using TFindHandleBase::Find().
  2995 
  2996 After construction, call TFindProcess::Next() repeatedly to find successive
  2997 processes whose names match the current pattern.
  2998 A successful call to TFindProcess::Next() means that a matching process has
  2999 been found. To open a handle on this process, call RProcess::Open() and pass
  3000 a reference to this TFindProcess.
  3001 
  3002 @see RProcess
  3003 */
  3004 class TFindProcess : public TFindHandleBase
  3005 	{
  3006 public:
  3007 	inline TFindProcess();
  3008 	inline TFindProcess(const TDesC& aMatch);
  3009 	IMPORT_C TInt Next(TFullName& aResult);
  3010 	};
  3011 
  3012 
  3013 
  3014 /**
  3015 @publishedAll
  3016 @released
  3017 
  3018 Searches for LDD factory objects by pattern matching against the names of 
  3019  LDD factory objects.
  3020 
  3021 An LDD factory object is an instance of a DLogicalDevice derived class. 
  3022 
  3023 The match pattern can be set into this object at construction; it can also 
  3024 be changed at any time after construction by using TFindHandleBase::Find().
  3025 
  3026 After construction, call TFindLogicalDevice::Next() repeatedly to find successive 
  3027 LDD factory objects whose names match the current pattern. A successful call to 
  3028 TFindLogicalDevice::Next() means that a matching LDD factory object has been found.
  3029 
  3030 The name of an LDD factory object is set by its Install() member function as 
  3031 part of the construction process.
  3032 */
  3033 class TFindLogicalDevice : public TFindHandleBase
  3034 	{
  3035 public:
  3036 	inline TFindLogicalDevice();
  3037 	inline TFindLogicalDevice(const TDesC& aMatch);
  3038 	IMPORT_C TInt Next(TFullName& aResult);
  3039 	};
  3040 
  3041 /**
  3042 @publishedAll
  3043 @released
  3044 
  3045 Searches for PDD factory objects by pattern matching against the names of
  3046 PDD factory objects.
  3047 
  3048 A PDD factory object is an instance of a DPhysicalDevice derived class. 
  3049 
  3050 The match pattern can be set into this object at construction; it can also be 
  3051 changed at any time after construction by using TFindHandleBase::Find().
  3052 
  3053 After construction, call TFindPhysicalDevice::Next() repeatedly to find successive 
  3054 PDD factory objects whose names match the current pattern. A successful call to 
  3055 TFindPhysicalDevice::Next() means that a matching PDD factory object has been found.
  3056 
  3057 The name of a PDD factory object is set by its Install() member function as part 
  3058 of the construction process.
  3059 */
  3060 class TFindPhysicalDevice : public TFindHandleBase
  3061 	{
  3062 public:
  3063 	inline TFindPhysicalDevice();
  3064 	inline TFindPhysicalDevice(const TDesC& aMatch);
  3065 	IMPORT_C TInt Next(TFullName& aResult);
  3066 	};
  3067 
  3068 
  3069 
  3070 
  3071 
  3072 /**
  3073 @publishedAll
  3074 @released
  3075 
  3076 Searches for servers by pattern matching against the names of kernel side
  3077 server objects.
  3078 
  3079 The match pattern can be set into this object at construction; it can also
  3080 be changed at any time after construction by using the TFindHandleBase::Find()
  3081 base class.
  3082 
  3083 After construction, call TFindServer::Next() repeatedly to find successive
  3084 servers whose names match the current pattern.
  3085 A successful call to TFindServer::Next() means that a matching server
  3086 has been found.
  3087 */
  3088 class TFindServer : public TFindHandleBase
  3089 	{
  3090 public:
  3091 	inline TFindServer();
  3092 	inline TFindServer(const TDesC& aMatch);
  3093 	IMPORT_C TInt Next(TFullName& aResult);
  3094 	};
  3095 
  3096 
  3097 
  3098 
  3099 /**
  3100 @publishedAll
  3101 @released
  3102 
  3103 Searches for DLLs whose full names match a specified pattern.
  3104 
  3105 The match pattern is set at construction but can also be changed at any time
  3106 after construction by using TFindHandleBase::Find().
  3107 
  3108 After construction, use TFindLibrary::Next() to repeatedly find successive DLLs
  3109 whose names match the current pattern. A successful call to
  3110 TFindLibrary::Next() means that a matching DLL has been found.
  3111 */
  3112 class TFindLibrary : public TFindHandleBase
  3113 	{
  3114 public:
  3115 	inline TFindLibrary();
  3116 	inline TFindLibrary(const TDesC& aMatch);
  3117 	IMPORT_C TInt Next(TFullName& aResult);
  3118 	};
  3119 
  3120 
  3121 
  3122 /**
  3123 @publishedAll
  3124 @released
  3125 
  3126 User side handle to an LDD factory object, an instance of a DLogicalDevice 
  3127 derived class.
  3128 
  3129 The LDD factory object is a Kernel side object which is constructed on the 
  3130 Kernel heap when the logical device is opened using User::LoadLogicalDevice(). 
  3131 The handle allows the User side to get information about the logical device.
  3132 
  3133 To use the device, a thread must create and use an instance of an 
  3134 RBusLogicalChannel derived class.
  3135 
  3136 */
  3137 class RDevice : public RHandleBase
  3138 	{
  3139 public:
  3140 	inline TInt Open(const TFindLogicalDevice& aFind,TOwnerType aType=EOwnerProcess);
  3141 	IMPORT_C TInt Open(const TDesC& aName,TOwnerType aType=EOwnerProcess);
  3142 	IMPORT_C void GetCaps(TDes8& aDes) const;
  3143 	IMPORT_C TBool QueryVersionSupported(const TVersion& aVer) const;
  3144 	IMPORT_C TBool IsAvailable(TInt aUnit, const TDesC* aPhysicalDevice, const TDesC8* anInfo) const;
  3145 	};
  3146 
  3147 /**
  3148 @publishedAll
  3149 @released
  3150 
  3151 Asynchronous timer services. 
  3152 
  3153 Five types of asynchronous request are supported by the class:
  3154 
  3155 1. Requesting an event after a specified interval
  3156 
  3157 2. Requesting an event at a specified system time
  3158 
  3159 3. Requesting a timer event on a specific second fraction
  3160 
  3161 4. Requesting an event if an interval elapses with no user activity.
  3162 
  3163 5. Requesting an event after a specified interval, to a resolution of 1ms.
  3164    
  3165 Each of these requests can be cancelled.
  3166 
  3167 The timer exists from its creation, following a call to RTimer::CreateLocal(),
  3168 until it is destroyed by a call to the Close() member function of the base
  3169 class RHandleBase.
  3170 
  3171 This class is ultimately implemented in terms of the nanokernel tick, and
  3172 therefore the granularity of the generated events is limited to the period of
  3173 this timer.  This is variant specific, but is usually 1 millisecond.
  3174 
  3175 Note that the CTimer active object uses an RTimer.
  3176 */
  3177 class RTimer : public RHandleBase
  3178 	{
  3179 public:
  3180 	IMPORT_C TInt CreateLocal();
  3181 	IMPORT_C void Cancel();
  3182 	IMPORT_C void After(TRequestStatus& aStatus,TTimeIntervalMicroSeconds32 anInterval);
  3183 	IMPORT_C void AfterTicks(TRequestStatus &aStatus, TInt aTicks);
  3184 	IMPORT_C void At(TRequestStatus& aStatus,const TTime& aTime);
  3185 	IMPORT_C void AtUTC(TRequestStatus& aStatus,const TTime& aUTCTime);
  3186 	IMPORT_C void Lock(TRequestStatus& aStatus,TTimerLockSpec aLock);
  3187 	IMPORT_C void Inactivity(TRequestStatus& aStatus, TTimeIntervalSeconds aSeconds);
  3188 	IMPORT_C void HighRes(TRequestStatus& aStatus,TTimeIntervalMicroSeconds32 anInterval);
  3189 	};
  3190 
  3191 
  3192 
  3193 
  3194 /**
  3195 @publishedAll
  3196 @released
  3197 
  3198 A handle to a dynamically loadable DLL.
  3199 
  3200 The class is not intended for user derivation.
  3201 */
  3202 class RLibrary : public RHandleBase
  3203 	{
  3204 public:
  3205 	IMPORT_C void Close();
  3206 	IMPORT_C TInt Load(const TDesC& aFileName, const TUidType& aType);
  3207 	IMPORT_C TInt Load(const TDesC& aFileName, const TDesC& aPath=KNullDesC);
  3208 	IMPORT_C TInt Load(const TDesC& aFileName, const TDesC& aPath, const TUidType& aType);
  3209 	IMPORT_C TInt Load(const TDesC& aFileName, const TDesC& aPath, const TUidType& aType, TUint32 aModuleVersion);
  3210 	IMPORT_C TInt LoadRomLibrary(const TDesC& aFileName, const TDesC& aPath);
  3211 	IMPORT_C TLibraryFunction Lookup(TInt anOrdinal) const;
  3212 	IMPORT_C TUidType Type() const;
  3213 	IMPORT_C TFileName FileName() const;
  3214 	IMPORT_C TInt GetRamSizes(TInt& aCodeSize, TInt& aConstDataSize);
  3215 	IMPORT_C TInt Init(); /**< @internalTechnology */
  3216 public:
  3217 	/**
  3218 	Class representing information about an executable binary, (DLL or EXE).
  3219 	@internalTechnology
  3220 	*/
  3221 	struct TInfo
  3222 		{
  3223 		TUint32 iModuleVersion;			/**< Version number */
  3224 		TUidType iUids;					/**< UIDs */
  3225 		TSecurityInfo iSecurityInfo;	/**< Security Info */
  3226 		};
  3227 
  3228 	/**
  3229 	Class representing information about an executable binary, (DLL or EXE), version 2.
  3230 	@internalTechnology
  3231 	*/
  3232 	struct TInfoV2 : public TInfo
  3233 		{
  3234 		TUint8 iHardwareFloatingPoint;	/**< Which hardware floating point used, from TFloatingPointType */
  3235 		enum TDebugAttributes
  3236 		{
  3237 			EDebugAllowed = 1<<0, ///< Flags set if executable may be debugged.
  3238 			ETraceAllowed = 1<<1 ///< Flags set if executable may be traced.
  3239 		};
  3240 		TUint8 iDebugAttributes; ///< Bitmask of values from enum TDebugAttributes
  3241 		TUint8 iSpare[6];
  3242 		};
  3243 
  3244 	/**
  3245 	Type representing a TInfo struct packaged as a descriptor.
  3246 	@internalTechnology
  3247 	*/
  3248 	typedef TPckgBuf<TInfo> TInfoBuf;
  3249 
  3250 	/**
  3251 	Type representing a TInfo struct packaged as a descriptor, version 2.
  3252 	@internalTechnology
  3253 	*/
  3254 	typedef TPckgBuf<TInfoV2> TInfoBufV2;
  3255 
  3256 	/**
  3257 	@internalTechnology
  3258 	*/
  3259 	enum TRequiredImageHeaderSize
  3260 		{
  3261 #ifdef __WINS__
  3262 		/**
  3263 		Size of header data which should be passed to GetInfoFromHeader()
  3264 		*/
  3265 		KRequiredImageHeaderSize = KMaxTInt
  3266 #else
  3267 		KRequiredImageHeaderSize = 9*1024
  3268 #endif
  3269 		};
  3270 
  3271 	IMPORT_C static TInt GetInfoFromHeader(const TDesC8& aHeader, TDes8& aInfoBuf);
  3272 
  3273 	/**
  3274 	@internalTechnology
  3275 	@deprecated Use TInfo
  3276 	*/
  3277 	struct SInfo
  3278 		{
  3279 		TUint32 iModuleVersion;
  3280 		TUidType iUids;
  3281 		SSecurityInfo iS;
  3282 		};
  3283 
  3284 	/**
  3285 	@internalTechnology
  3286 	@deprecated Use TInfoBuf
  3287 	*/
  3288 	typedef TPckgBuf<SInfo> SInfoBuf;
  3289 
  3290 	/**
  3291 	@internalTechnology
  3292 	*/
  3293 	IMPORT_C static TInt GetInfo(const TDesC& aFileName, TDes8& aInfoBuf);
  3294 private:
  3295 	TInt InitL();
  3296 	};
  3297 
  3298 
  3299 
  3300 
  3301 /**
  3302 @publishedAll
  3303 @released
  3304 
  3305 A handle to a critical section.
  3306 
  3307 A critical section itself is a kernel object, and is implemented using
  3308 a semaphore. The class RCriticalSection inherits privately from RSemaphore
  3309 as a matter of implementation and this is, in effect, equivalent to using
  3310 a semaphore.
  3311 
  3312 The public functions of RSemaphore are not part of the public API of this 
  3313 class.
  3314 
  3315 As with all handles, they should be closed after use. This class provides 
  3316 the necessary Close() function, which should be called when the handle is 
  3317 no longer required.
  3318 
  3319 @see RHandleBase::Close
  3320 */
  3321 class RCriticalSection : private RSemaphore
  3322 	{
  3323 public:
  3324 	IMPORT_C RCriticalSection();
  3325 	IMPORT_C TInt CreateLocal(TOwnerType aType=EOwnerProcess);
  3326 	IMPORT_C void Close();
  3327 	IMPORT_C void Wait();
  3328 	IMPORT_C void Signal();
  3329 	inline TBool IsBlocked() const;
  3330 private:
  3331 	TInt iBlocked;
  3332 	};
  3333 
  3334 
  3335 
  3336 /**
  3337 @publishedAll
  3338 @released
  3339 
  3340 A handle to a mutex.
  3341 
  3342 The mutex itself is a kernel side object.
  3343 
  3344 Handles should be closed after use. RHandleBase provides the necessary Close() 
  3345 function which should be called when the handle is no longer required.
  3346 
  3347 @see RHandleBase::Close
  3348 */
  3349 class RMutex : public RHandleBase
  3350 	{
  3351 public:
  3352 	inline TInt Open(const TFindMutex& aFind,TOwnerType aType=EOwnerProcess);
  3353 	IMPORT_C TInt CreateLocal(TOwnerType aType=EOwnerProcess);
  3354 	IMPORT_C TInt CreateGlobal(const TDesC& aName,TOwnerType aType=EOwnerProcess);
  3355 	IMPORT_C TInt OpenGlobal(const TDesC& aName,TOwnerType aType=EOwnerProcess);
  3356 	IMPORT_C TInt Open(RMessagePtr2 aMessage,TInt aParam,TOwnerType aType=EOwnerProcess);
  3357 	IMPORT_C TInt Open(TInt aArgumentIndex, TOwnerType aType=EOwnerProcess);
  3358 	IMPORT_C void Wait();
  3359 	IMPORT_C void Signal();
  3360 	IMPORT_C TBool IsHeld();
  3361 	};
  3362 
  3363 
  3364 
  3365 /**
  3366 @publishedAll
  3367 @released
  3368 
  3369 A handle to a condition variable.
  3370 
  3371 The condition variable itself is a kernel side object.
  3372 
  3373 Handles should be closed after use. RHandleBase provides the necessary Close() 
  3374 function which should be called when the handle is no longer required.
  3375 
  3376 @see RHandleBase::Close
  3377 */
  3378 class RCondVar : public RHandleBase
  3379 	{
  3380 public:
  3381 	IMPORT_C TInt CreateLocal(TOwnerType aType=EOwnerProcess);
  3382 	IMPORT_C TInt CreateGlobal(const TDesC& aName, TOwnerType aType=EOwnerProcess);
  3383 	IMPORT_C TInt OpenGlobal(const TDesC& aName, TOwnerType aType=EOwnerProcess);
  3384 	IMPORT_C TInt Open(RMessagePtr2 aMessage, TInt aParam, TOwnerType aType=EOwnerProcess);
  3385 	IMPORT_C TInt Open(TInt aArgumentIndex, TOwnerType aType=EOwnerProcess);
  3386 	IMPORT_C TInt Wait(RMutex& aMutex);
  3387 	IMPORT_C TInt TimedWait(RMutex& aMutex, TInt aTimeout);	// timeout in microseconds
  3388 	IMPORT_C void Signal();
  3389 	IMPORT_C void Broadcast();
  3390 	};
  3391 
  3392 
  3393 
  3394 class UserHeap;
  3395 class TChunkCreate;
  3396 struct TChunkCreateInfo;
  3397 /**
  3398 @publishedAll
  3399 @released
  3400 
  3401 A handle to a chunk.
  3402 
  3403 The chunk itself is a kernel side object.
  3404 */
  3405 class RChunk : public RHandleBase
  3406 	{
  3407 public:
  3408     /**
  3409     @internalComponent
  3410     */
  3411 	enum TAttribs
  3412 		{
  3413 		ENormal=0x00,
  3414 		EDoubleEnded=0x01,
  3415 		EDisconnected=0x02,
  3416 		ELocal=0x00,
  3417 		EGlobal=0x10,
  3418 		EData=0x00,
  3419 		ECode=0x20,
  3420 		};
  3421 
  3422 	/**	
  3423     Set of flags used by SetRestrictions().
  3424     
  3425     @see RChunk::SetRestrictions
  3426     */
  3427 	enum TRestrictions
  3428 		{
  3429 		EPreventAdjust = 0x01,  // Prevent Adjust, Commit, Allocate and Decommit
  3430 		};
  3431 public:
  3432 	inline TInt Open(const TFindChunk& aFind,TOwnerType aType=EOwnerProcess);
  3433 	IMPORT_C TInt CreateLocal(TInt aSize,TInt aMaxSize,TOwnerType aType=EOwnerProcess);
  3434 	IMPORT_C TInt CreateLocalCode(TInt aSize,TInt aMaxSize,TOwnerType aType=EOwnerProcess);
  3435 	IMPORT_C TInt CreateGlobal(const TDesC& aName,TInt aSize,TInt aMaxSize,TOwnerType aType=EOwnerProcess);
  3436 	IMPORT_C TInt CreateDoubleEndedLocal(TInt aInitialBottom, TInt aInitialTop,TInt aMaxSize,TOwnerType aType=EOwnerProcess);
  3437 	IMPORT_C TInt CreateDoubleEndedGlobal(const TDesC& aName,TInt aInitialBottom,TInt aInitialTop,TInt aMaxSize,TOwnerType aType=EOwnerProcess);
  3438 	IMPORT_C TInt CreateDisconnectedLocal(TInt aInitialBottom, TInt aInitialTop,TInt aMaxSize,TOwnerType aType=EOwnerProcess);
  3439 	IMPORT_C TInt CreateDisconnectedGlobal(const TDesC& aName,TInt aInitialBottom,TInt aInitialTop,TInt aMaxSize,TOwnerType aType=EOwnerProcess);
  3440 	IMPORT_C TInt Create(TChunkCreateInfo& aCreateInfo);
  3441 	IMPORT_C TInt SetRestrictions(TUint aFlags);
  3442 	IMPORT_C TInt OpenGlobal(const TDesC& aName,TBool isReadOnly,TOwnerType aType=EOwnerProcess);
  3443 	IMPORT_C TInt Open(RMessagePtr2 aMessage,TInt aParam,TBool isReadOnly,TOwnerType aType=EOwnerProcess);
  3444 	IMPORT_C TInt Open(TInt aArgumentIndex, TOwnerType aType=EOwnerProcess);
  3445 	IMPORT_C TInt Adjust(TInt aNewSize) const;
  3446 	IMPORT_C TInt AdjustDoubleEnded(TInt aBottom, TInt aTop) const;
  3447 	IMPORT_C TInt Commit(TInt anOffset, TInt aSize) const;
  3448 	IMPORT_C TInt Allocate(TInt aSize) const;
  3449 	IMPORT_C TInt Decommit(TInt anOffset, TInt aSize) const;
  3450 	IMPORT_C TInt Unlock(TInt aOffset, TInt aSize);	/**< @internalTechnology */
  3451 	IMPORT_C TInt Lock(TInt aOffset, TInt aSize);	/**< @internalTechnology */
  3452 	IMPORT_C TUint8* Base() const;
  3453 	IMPORT_C TInt Size() const;
  3454 	IMPORT_C TInt Bottom() const;
  3455 	IMPORT_C TInt Top() const;
  3456 	IMPORT_C TInt MaxSize() const;
  3457 	inline TBool IsReadable() const;
  3458 	inline TBool IsWritable() const;
  3459 private:
  3460 	friend class UserHeap;
  3461 	};
  3462 
  3463 
  3464 /**
  3465 This structure specifies the type and properties of the chunk to be created.  It
  3466 is passed as a parameter to the RChunk::Create() method.
  3467 
  3468 @publishedAll
  3469 @released
  3470 */
  3471 struct TChunkCreateInfo
  3472 	{
  3473 public :
  3474 	/**
  3475 	Currently supported version numbers
  3476 	@internalComponent
  3477 	*/
  3478 	enum TChunkCreateVersions
  3479 		{
  3480 		EVersion0,
  3481 		ESupportedVersions,
  3482 		};
  3483 
  3484 	friend class RChunk;
  3485 
  3486 	IMPORT_C TChunkCreateInfo();
  3487 	IMPORT_C void SetNormal(TInt aInitialSize, TInt aMaxSize);
  3488 	IMPORT_C void SetCode(TInt aInitialSize, TInt aMaxSize);
  3489 	IMPORT_C void SetDoubleEnded(TInt aInitialBottom, TInt aInitialTop, TInt aMaxSize);
  3490 	IMPORT_C void SetDisconnected(TInt aInitialBottom, TInt aInitialTop, TInt aMaxSize);
  3491 	IMPORT_C void SetOwner(TOwnerType aType);
  3492 	IMPORT_C void SetGlobal(const TDesC& aName);
  3493 	IMPORT_C void SetClearByte(TUint8 aClearByte);
  3494 	void SetThreadHeap(TInt aInitialSize, TInt aMaxSize, const TDesC& aName);
  3495 
  3496 protected :
  3497 	/** The version number of this TChunkCreateInfo.
  3498 	@internalComponent
  3499 	*/
  3500 	TUint iVersionNumber;
  3501 	/** The type of the chunk to be created.
  3502 	@internalComponent
  3503 	*/
  3504 	TUint iType;
  3505 	/** Specify if chunk is global or not.
  3506 	@internalComponent
  3507 	*/
  3508 	TBool iGlobal;
  3509 	/**	The maximum size in bytes of the chunk to be created.
  3510 	@internalComponent
  3511 	*/
  3512 	TInt iMaxSize;
  3513 	/** An enumeration whose enumerators define the ownership of this chunk 
  3514 		handle. If not explicitly specified, EOwnerProcess is taken as default.
  3515 	@internalComponent
  3516 	*/
  3517 	TOwnerType iOwnerType;
  3518 	/**	A pointer to a descriptor containing the name to be assigned to  
  3519 		global chunks. The length of the descriptor must be no greater than 
  3520 		that allowed for a TKName type.  Must be NULL for local chunks.
  3521 	@internalComponent
  3522 	*/
  3523 	const TDesC* iName;
  3524 	/** The offset of the bottom of the region to commit to the chunk on 
  3525 		creation from the base of the chunk's reserved region.
  3526 		This is only used for double ended and disconnected chunks.
  3527 	@internalComponent
  3528 	*/
  3529 	TInt iInitialBottom;
  3530 	/** The offset of the top of the region to commit to the chunk on 
  3531 		creation from the base of the chunk's reserved region.
  3532 		This is only used for double ended and disconnected chunks.
  3533 	@internalComponent
  3534 	*/
  3535 	TInt iInitialTop;
  3536 	/**	Attributes to the chunk to be created should have.
  3537 		Should be set from one or more the values in TChunkCreateAttributes.
  3538 	@internalComponent
  3539 	*/
  3540 	TUint iAttributes;
  3541 	/** The byte to clear all the memory committed to the chunk to.
  3542 	@internalComponent
  3543 	*/
  3544 	TUint8 iClearByte; 
  3545 	/** @internalComponent*/
  3546 	TUint8 iSpare1[3];
  3547 	/** @internalComponent*/
  3548 	TUint iSpare2;
  3549 	};
  3550 
  3551 
  3552 struct SStdEpocThreadCreateInfo;
  3553 /**
  3554 @publishedAll
  3555 @released
  3556 
  3557 A set of static functions for constructing fixed length heaps and local or 
  3558 global heaps.
  3559 
  3560 @see RHeap
  3561 @see RChunk
  3562 */
  3563 class UserHeap
  3564 	{
  3565 public:
  3566 	enum TChunkHeapCreateMode {EChunkHeapSwitchTo=1, EChunkHeapDuplicate=2};
  3567 	IMPORT_C static RHeap* FixedHeap(TAny* aBase, TInt aMaxLength, TInt aAlign=0, TBool aSingleThread=ETrue);
  3568 	IMPORT_C static RHeap* ChunkHeap(const TDesC* aName, TInt aMinLength, TInt aMaxLength, TInt aGrowBy=1, TInt aAlign=0, TBool aSingleThread=EFalse);
  3569 	IMPORT_C static RHeap* ChunkHeap(RChunk aChunk, TInt aMinLength, TInt aGrowBy=1, TInt aMaxLength=0, TInt aAlign=0, TBool aSingleThread=EFalse, TUint32 aMode=0);
  3570 	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);
  3571 	IMPORT_C static TInt SetupThreadHeap(TBool aNotFirst, SStdEpocThreadCreateInfo& aInfo);
  3572 	IMPORT_C static TInt CreateThreadHeap(SStdEpocThreadCreateInfo& aInfo, RHeap*& aHeap, TInt aAlign=0, TBool aSingleThread=EFalse);
  3573 	};
  3574 
  3575 
  3576 
  3577 
  3578 /**
  3579 @publishedAll
  3580 @released
  3581 
  3582 Encapsulates the Id of a kernel object.
  3583 */
  3584 class TObjectId
  3585 	{
  3586 public:
  3587 	inline TObjectId();
  3588 	inline TObjectId(TUint64 anId);
  3589 	inline TUint64 Id() const;
  3590 	inline operator TUint() const;
  3591 	inline TBool operator==(TObjectId aId) const;
  3592 	inline TBool operator!=(TObjectId aId) const;
  3593 private:
  3594 	TUint64 iId;
  3595 	};
  3596 
  3597 
  3598 
  3599 
  3600 /**
  3601 @publishedAll
  3602 @released
  3603 
  3604 Encapsulates the Id of a thread.
  3605 
  3606 An object of this type is not explicitly constructed in open code,
  3607 but is returned by the Id() member function of a thread handle,
  3608 an RThread type.
  3609 
  3610 @see RThread
  3611 */
  3612 class TThreadId : public TObjectId
  3613 	{
  3614 public:
  3615 	inline TThreadId();
  3616 	inline TThreadId(TUint64 anId);
  3617 	};
  3618 
  3619 
  3620 
  3621 
  3622 class RProcess;
  3623 
  3624 
  3625 /**
  3626 @publishedAll
  3627 @released
  3628 
  3629 A handle to a thread.
  3630 
  3631 The thread itself is a kernel object.
  3632 */
  3633 class RThread : public RHandleBase
  3634 	{
  3635 public:
  3636 	inline RThread();
  3637 	IMPORT_C TInt Create(const TDesC& aName, TThreadFunction aFunction, TInt aStackSize, TInt aHeapMinSize, TInt aHeapMaxSize, TAny *aPtr, TOwnerType aType=EOwnerProcess);
  3638 	IMPORT_C TInt Create(const TDesC& aName, TThreadFunction aFunction, TInt aStackSize, RAllocator* aHeap, TAny* aPtr, TOwnerType aType=EOwnerProcess);
  3639 	IMPORT_C TInt Open(const TDesC& aFullName, TOwnerType aType=EOwnerProcess);
  3640 	IMPORT_C TInt Open(TThreadId aID, TOwnerType aType=EOwnerProcess);
  3641 	IMPORT_C TThreadId Id() const;
  3642 	IMPORT_C void Resume() const;
  3643 	IMPORT_C void Suspend() const;
  3644 	/**
  3645 	@publishedAll
  3646 	@deprecated Use User::RenameThread() instead
  3647 	*/
  3648 	inline static TInt RenameMe(const TDesC& aName);
  3649 
  3650 	IMPORT_C void Kill(TInt aReason);
  3651 	IMPORT_C void Terminate(TInt aReason);
  3652 	IMPORT_C void Panic(const TDesC& aCategory,TInt aReason);
  3653 	IMPORT_C TInt Process(RProcess& aProcess) const;
  3654 	IMPORT_C TThreadPriority Priority() const;
  3655 	IMPORT_C void SetPriority(TThreadPriority aPriority) const;
  3656 	IMPORT_C TProcessPriority ProcessPriority() const;
  3657 	IMPORT_C void SetProcessPriority(TProcessPriority aPriority) const;
  3658 	IMPORT_C TInt RequestCount() const;
  3659 	IMPORT_C TExitType ExitType() const;
  3660 	IMPORT_C TInt ExitReason() const;
  3661 	IMPORT_C TExitCategoryName ExitCategory() const;
  3662 	IMPORT_C void RequestComplete(TRequestStatus*& aStatus,TInt aReason) const;
  3663 	IMPORT_C void RequestSignal() const;
  3664 	IMPORT_C void Logon(TRequestStatus& aStatus) const;
  3665 	IMPORT_C TInt LogonCancel(TRequestStatus& aStatus) const;
  3666 	IMPORT_C void HandleCount(TInt& aProcessHandleCount, TInt& aThreadHandleCount) const;
  3667 	IMPORT_C void Context(TDes8& aDes) const;
  3668 	IMPORT_C TInt StackInfo(TThreadStackInfo& aInfo) const;
  3669 	IMPORT_C TInt GetCpuTime(TTimeIntervalMicroSeconds& aCpuTime) const;
  3670 	inline TInt Open(const TFindThread& aFind,TOwnerType aType=EOwnerProcess);
  3671 	IMPORT_C void Rendezvous(TRequestStatus& aStatus) const;
  3672 	IMPORT_C TInt RendezvousCancel(TRequestStatus& aStatus) const;
  3673 	IMPORT_C static void Rendezvous(TInt aReason);
  3674 
  3675 	/**
  3676 	Return the Secure ID of the process to which the thread belongs.
  3677 
  3678 	If an intended use of this method is to check that the Secure ID is
  3679 	a given value, then the use of a TSecurityPolicy object should be
  3680 	considered. E.g. Instead of something like:
  3681 
  3682 	@code
  3683 		RThread& thread;
  3684 		TInt error = thread.SecureId()==KRequiredSecureId ? KErrNone : KErrPermissionDenied;
  3685 	@endcode
  3686 
  3687 	this could be used;
  3688 
  3689 	@code
  3690 		RThread& thread;
  3691 		static _LIT_SECURITY_POLICY_S0(mySidPolicy, KRequiredSecureId);
  3692 		TInt error = mySidPolicy().CheckPolicy(thread);
  3693 	@endcode
  3694 
  3695 	This has the benefit that the TSecurityPolicy::CheckPolicy methods are
  3696 	configured by the system wide Platform Security configuration. I.e. are
  3697 	capable of emitting diagnostic messages when a check fails and/or the
  3698 	check can be forced to always pass.
  3699 
  3700 	@see TSecurityPolicy::CheckPolicy(RThread aThread, const char* aDiagnostic) const
  3701 	@see _LIT_SECURITY_POLICY_S0
  3702 
  3703 	@return The Secure ID.
  3704 	@publishedAll
  3705 	@released
  3706 	*/
  3707 	IMPORT_C TSecureId SecureId() const;
  3708 
  3709 	/**
  3710 	Return the Vendor ID of the process to which the thread belongs.
  3711 
  3712 	If an intended use of this method is to check that the Vendor ID is
  3713 	a given value, then the use of a TSecurityPolicy object should be
  3714 	considered. E.g. Instead of something like:
  3715 
  3716 	@code
  3717 		RThread& thread;
  3718 		TInt error = thread.VendorId()==KRequiredVendorId ? KErrNone : KErrPermissionDenied;
  3719 	@endcode
  3720 
  3721 	this could be used;
  3722 
  3723 	@code
  3724 		RThread& thread;
  3725 		static _LIT_SECURITY_POLICY_V0(myVidPolicy, KRequiredVendorId);
  3726 		TInt error = myVidPolicy().CheckPolicy(thread);
  3727 	@endcode
  3728 
  3729 	This has the benefit that the TSecurityPolicy::CheckPolicy methods are
  3730 	configured by the system wide Platform Security configuration. I.e. are
  3731 	capable of emitting diagnostic messages when a check fails and/or the
  3732 	check can be forced to always pass.
  3733 
  3734 	@see TSecurityPolicy::CheckPolicy(RThread aThread, const char* aDiagnostic) const
  3735 	@see _LIT_SECURITY_POLICY_V0
  3736 
  3737 	@return The Vendor ID.
  3738 	@publishedAll
  3739     @released
  3740 	*/
  3741 	IMPORT_C TVendorId VendorId() const;
  3742 
  3743 	/**
  3744 	Check if the process to which the thread belongs has a given capability
  3745 
  3746 	When a check fails the action taken is determined by the system wide Platform Security
  3747 	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
  3748 	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
  3749 	check failed.
  3750 
  3751 	@param aCapability The capability to test.
  3752 	@param aDiagnostic A string that will be emitted along with any diagnostic message
  3753 								that may be issued if the test finds the capability is not present.
  3754 								This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
  3755 								which enables it to be easily removed from the system.
  3756 	@return ETrue if the process to which the thread belongs has the capability, EFalse otherwise.
  3757 	@publishedAll
  3758     @released
  3759 	*/
  3760 #ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
  3761 	inline TBool HasCapability(TCapability aCapability, const char* aDiagnostic=0) const;
  3762 #else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
  3763 	// Only available to NULL arguments
  3764 	inline TBool HasCapability(TCapability aCapability, OnlyCreateWithNull aDiagnostic=NULL) const;
  3765 #ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
  3766 	// For things using KSuppressPlatSecDiagnostic
  3767 	inline TBool HasCapability(TCapability aCapability, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
  3768 #endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
  3769 #endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
  3770 
  3771 	/**
  3772 	Check if the process to which the thread belongs has both of the given capabilities
  3773 
  3774 	When a check fails the action taken is determined by the system wide Platform Security
  3775 	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
  3776 	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
  3777 	check failed.
  3778 
  3779 	@param aCapability1 The first capability to test.
  3780 	@param aCapability2 The second capability to test.
  3781 	@param aDiagnostic A string that will be emitted along with any diagnostic message
  3782 								that may be issued if the test finds a capability is not present.
  3783 								This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
  3784 								which enables it to be easily removed from the system.
  3785 	@return ETrue if the process to which the thread belongs has both the capabilities, EFalse otherwise.
  3786 	@publishedAll
  3787 	@released
  3788 	*/
  3789 #ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
  3790 	inline TBool HasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic=0) const;
  3791 #else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
  3792 	// Only available to NULL arguments
  3793 	inline TBool HasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull aDiagnostic=NULL) const;
  3794 #ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
  3795 	// For things using KSuppressPlatSecDiagnostic
  3796 	inline TBool HasCapability(TCapability aCapability, TCapability aCapability2, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
  3797 #endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
  3798 #endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
  3799 
  3800 	/** Function only temporarily supported to aid migration to process emulation...
  3801 
  3802 	@publishedAll
  3803 	@deprecated Use process emulation instead
  3804 	*/
  3805 	inline TInt Create(const TDesC& aName,TThreadFunction aFunction,TInt aStackSize,TAny* aPtr,RLibrary* aLibrary,RHeap* aHeap, TInt aHeapMinSize,TInt aHeapMaxSize,TOwnerType aType);
  3806 
  3807 private:
  3808 	// Implementations of functions with diagnostics
  3809 	IMPORT_C TBool DoHasCapability(TCapability aCapability, const char* aDiagnostic) const;
  3810 	IMPORT_C TBool DoHasCapability(TCapability aCapability) const;
  3811 	IMPORT_C TBool DoHasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic) const;
  3812 	IMPORT_C TBool DoHasCapability(TCapability aCapability1, TCapability aCapability2) const;
  3813 	};
  3814 
  3815 /**
  3816 @publishedAll
  3817 @deprecated
  3818 */
  3819 inline TInt RThread::Create(const TDesC& /*aName*/,TThreadFunction /*aFunction*/,TInt /*aStackSize*/,TAny* /*aPtr*/,RLibrary* /*aLibrary*/,RHeap* /*aHeap*/, TInt /*aHeapMinSize*/,TInt /*aHeapMaxSize*/,TOwnerType /*aType*/)
  3820 	{return KErrNotSupported; }
  3821 
  3822 
  3823 
  3824 /**
  3825 @publishedAll
  3826 @released
  3827 
  3828 Encapsulates the Id of a process.
  3829 
  3830 An object of this type is not explicitly constructed in open code,
  3831 but is returned by the Id() member function of a process handle,
  3832 an RProcess type.
  3833 
  3834 @see RProcess
  3835 */
  3836 class TProcessId : public TObjectId
  3837 	{
  3838 public:
  3839 	inline TProcessId();
  3840 	inline TProcessId(TUint64 anId);
  3841 	};
  3842 
  3843 
  3844 
  3845 
  3846 class RSubSessionBase;
  3847 
  3848 /** 
  3849 @publishedAll
  3850 @released
  3851 
  3852 A handle to a process.
  3853 
  3854 The process itself is a kernel object.
  3855 */
  3856 class RProcess : public RHandleBase
  3857 	{
  3858 public:
  3859 	inline RProcess();
  3860 	IMPORT_C TInt Create(const TDesC& aFileName,const TDesC& aCommand,TOwnerType aType=EOwnerProcess);
  3861 	IMPORT_C TInt Create(const TDesC& aFileName,const TDesC& aCommand,const TUidType &aUidType, TOwnerType aType=EOwnerProcess);
  3862 	IMPORT_C TInt Open(const TDesC& aName,TOwnerType aType=EOwnerProcess);
  3863 	IMPORT_C TInt Open(TProcessId aId,TOwnerType aType=EOwnerProcess);
  3864 	IMPORT_C TUidType Type() const;
  3865 	IMPORT_C TProcessId Id() const;
  3866 	/**
  3867 	@publishedAll
  3868 	@deprecated Use User::RenameProcess() instead
  3869 	*/
  3870 	inline static TInt RenameMe(const TDesC& aName);
  3871 
  3872 	IMPORT_C void Kill(TInt aReason);
  3873 	IMPORT_C void Terminate(TInt aReason);
  3874 	IMPORT_C void Panic(const TDesC& aCategory,TInt aReason);
  3875 	IMPORT_C void Resume();
  3876 	IMPORT_C TFileName FileName() const;
  3877 	IMPORT_C TExitType ExitType() const;
  3878 	IMPORT_C TInt ExitReason() const;
  3879 	IMPORT_C TExitCategoryName ExitCategory() const;
  3880 	IMPORT_C TProcessPriority Priority() const;
  3881 	IMPORT_C void SetPriority(TProcessPriority aPriority) const;
  3882     IMPORT_C TBool JustInTime() const;
  3883     IMPORT_C void SetJustInTime(TBool aBoolean) const; 
  3884 	IMPORT_C void Logon(TRequestStatus& aStatus) const;
  3885 	IMPORT_C TInt LogonCancel(TRequestStatus& aStatus) const;
  3886 	IMPORT_C TInt GetMemoryInfo(TModuleMemoryInfo& aInfo) const;
  3887 	inline TInt Open(const TFindProcess& aFind,TOwnerType aType=EOwnerProcess);
  3888 	IMPORT_C void Rendezvous(TRequestStatus& aStatus) const;
  3889 	IMPORT_C TInt RendezvousCancel(TRequestStatus& aStatus) const;
  3890 	IMPORT_C static void Rendezvous(TInt aReason);
  3891 
  3892 	/**
  3893 	Return the Secure ID of the process.
  3894 
  3895 	If an intended use of this method is to check that the Secure ID is
  3896 	a given value, then the use of a TSecurityPolicy object should be
  3897 	considered. E.g. Instead of something like:
  3898 
  3899 	@code
  3900 		RProcess& process;
  3901 		TInt error = process.SecureId()==KRequiredSecureId ? KErrNone : KErrPermissionDenied;
  3902 	@endcode
  3903 
  3904 	this could be used;
  3905 
  3906 	@code
  3907 		RProcess& process;
  3908 		static _LIT_SECURITY_POLICY_S0(mySidPolicy, KRequiredSecureId);
  3909 		TInt error = mySidPolicy().CheckPolicy(process);
  3910 	@endcode
  3911 
  3912 	This has the benefit that the TSecurityPolicy::CheckPolicy methods are
  3913 	configured by the system wide Platform Security configuration. I.e. are
  3914 	capable of emitting diagnostic messages when a check fails and/or the
  3915 	check can be forced to always pass.
  3916 
  3917 	@see TSecurityPolicy::CheckPolicy(RProcess aProcess, const char* aDiagnostic) const
  3918 	@see _LIT_SECURITY_POLICY_S0
  3919 
  3920 	@return The Secure ID.
  3921 	@publishedAll
  3922 	@released
  3923 	*/
  3924 	IMPORT_C TSecureId SecureId() const;
  3925 
  3926 	/**
  3927 	Return the Vendor ID of the process.
  3928 
  3929 	If an intended use of this method is to check that the Vendor ID is
  3930 	a given value, then the use of a TSecurityPolicy object should be
  3931 	considered. E.g. Instead of something like:
  3932 
  3933 	@code
  3934 		RProcess& process;
  3935 		TInt error = process.VendorId()==KRequiredVendorId ? KErrNone : KErrPermissionDenied;
  3936 	@endcode
  3937 
  3938 	this could be used;
  3939 
  3940 	@code
  3941 		RProcess& process;
  3942 		static _LIT_SECURITY_POLICY_V0(myVidPolicy, KRequiredVendorId);
  3943 		TInt error = myVidPolicy().CheckPolicy(process);
  3944 	@endcode
  3945 
  3946 	This has the benefit that the TSecurityPolicy::CheckPolicy methods are
  3947 	configured by the system wide Platform Security configuration. I.e. are
  3948 	capable of emitting diagnostic messages when a check fails and/or the
  3949 	check can be forced to always pass.
  3950 
  3951 	@see TSecurityPolicy::CheckPolicy(RProcess aProcess, const char* aDiagnostic) const
  3952 	@see _LIT_SECURITY_POLICY_V0
  3953 
  3954 	@return The Vendor ID.
  3955 	@publishedAll
  3956     @released
  3957 	*/
  3958 	IMPORT_C TVendorId VendorId() const;
  3959 
  3960 	/**
  3961 	Check if the process has a given capability
  3962 
  3963 	When a check fails the action taken is determined by the system wide Platform Security
  3964 	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
  3965 	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
  3966 	check failed.
  3967 
  3968 	@param aCapability The capability to test.
  3969 	@param aDiagnostic A string that will be emitted along with any diagnostic message
  3970 								that may be issued if the test finds the capability is not present.
  3971 								This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
  3972 								which enables it to be easily removed from the system.
  3973 	@return ETrue if the process has the capability, EFalse otherwise.
  3974 	@publishedAll
  3975 	@released
  3976 	*/
  3977 #ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
  3978 	inline TBool HasCapability(TCapability aCapability, const char* aDiagnostic=0) const;
  3979 #else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
  3980 	// Only available to NULL arguments
  3981 	inline TBool HasCapability(TCapability aCapability, OnlyCreateWithNull aDiagnostic=NULL) const;
  3982 #ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
  3983 	// For things using KSuppressPlatSecDiagnostic
  3984 	inline TBool HasCapability(TCapability aCapability, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
  3985 #endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
  3986 #endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
  3987 
  3988 	/**
  3989 	Check if the process has both of the given capabilities
  3990 
  3991 	When a check fails the action taken is determined by the system wide Platform Security
  3992 	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
  3993 	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
  3994 	check failed.
  3995 
  3996 	@param aCapability1 The first capability to test.
  3997 	@param aCapability2 The second capability to test.
  3998 	@param aDiagnostic A string that will be emitted along with any diagnostic message
  3999 								that may be issued if the test finds a capability is not present.
  4000 								This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
  4001 								which enables it to be easily removed from the system.
  4002 	@return ETrue if the process has both the capabilities, EFalse otherwise.
  4003 	@publishedAll
  4004 	@released
  4005 	*/
  4006 #ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
  4007 	inline TBool HasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic=0) const;
  4008 #else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
  4009 	// Only available to NULL arguments
  4010 	inline TBool HasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull aDiagnostic=NULL) const;
  4011 #ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
  4012 	// For things using KSuppressPlatSecDiagnostic
  4013 	inline TBool HasCapability(TCapability aCapability, TCapability aCapability2, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress) const;
  4014 #endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
  4015 #endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
  4016 
  4017 	IMPORT_C TInt SetParameter(TInt aIndex,  RHandleBase aHandle);
  4018 	IMPORT_C TInt SetParameter(TInt aSlot, const RSubSessionBase& aSession);
  4019 	IMPORT_C TInt SetParameter(TInt aSlot, const TDesC16& aDes);
  4020 	IMPORT_C TInt SetParameter(TInt aSlot, const TDesC8& aDes);
  4021 	IMPORT_C TInt SetParameter(TInt aSlot, TInt aData);
  4022 	inline RProcess(TInt aHandle);
  4023 
  4024 	/**
  4025 	@deprecated Use RProcess::SecureId() instead
  4026 	*/
  4027 	inline TUid Identity() const { return SecureId(); }
  4028 
  4029 	/**
  4030 	Legacy Platform Security development and migration support
  4031 	@internalAll
  4032 	@deprecated No replacement
  4033 	*/
  4034 	enum TSecureApi { ESecureApiOff, ESecureApiOn, ESecureApiQuery }; // __SECURE_API__ remove this
  4035 
  4036 	/**
  4037 	Legacy Platform Security development and migration support
  4038 	@internalAll
  4039 	@deprecated No replacement
  4040 	*/
  4041 	IMPORT_C TInt SecureApi(TInt aState); // __SECURE_API__ remove this
  4042 
  4043 	/**
  4044 	Legacy Platform Security development and migration support
  4045 	@internalAll
  4046 	@deprecated No replacement
  4047 	*/
  4048 	enum TDataCaging { EDataCagingOff, EDataCagingOn, EDataCagingQuery}; // __DATA_CAGING__ __SECURE_API__ remove this
  4049 
  4050 	/**
  4051 	Legacy Platform Security development and migration support
  4052 	@internalAll
  4053 	@deprecated No replacement
  4054 	*/
  4055 	IMPORT_C TInt DataCaging(TInt aState); // __DATA_CAGING__ __SECURE_API__ remove this
  4056 	
  4057 	/** 
  4058 	
  4059 	CR0885
  4060 	
  4061 	*/
  4062 	IMPORT_C TInt CreateWithStackOverride(const TDesC& aFileName,const TDesC& aCommand, const TUidType &aUidType, TInt aMinStackSize, TOwnerType aType);
  4063 
  4064 	IMPORT_C static TAny* ExeExportData(void);
  4065 
  4066 private:
  4067 	// Implementations of functions with diagnostics
  4068 	IMPORT_C TBool DoHasCapability(TCapability aCapability, const char* aDiagnostic) const;
  4069 	IMPORT_C TBool DoHasCapability(TCapability aCapability) const;
  4070 	IMPORT_C TBool DoHasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic) const;
  4071 	IMPORT_C TBool DoHasCapability(TCapability aCapability1, TCapability aCapability2) const;
  4072 	};
  4073 
  4074 
  4075 
  4076 
  4077 
  4078 
  4079 
  4080 
  4081 
  4082 /**
  4083 @internalTechnology
  4084 */
  4085 class RServer2 : public RHandleBase
  4086 	{
  4087 public:
  4088 	IMPORT_C TInt CreateGlobal(const TDesC& aName);
  4089 	IMPORT_C TInt CreateGlobal(const TDesC& aName, TInt aMode);
  4090 	IMPORT_C void Receive(RMessage2& aMessage,TRequestStatus& aStatus);
  4091 	IMPORT_C void Receive(RMessage2& aMessage);
  4092 	IMPORT_C void Cancel();
  4093 	};
  4094 
  4095 
  4096 
  4097 
  4098 /**
  4099 @publishedAll
  4100 @released
  4101 
  4102 Client-side handle to a session with a server.
  4103 
  4104 This is the client-side interface through which communication with the server
  4105 is channelled.
  4106 
  4107 Clients normally define and implement a derived class to provide
  4108 a richer interface.
  4109 */
  4110 class RSessionBase : public RHandleBase
  4111 	{
  4112 	friend class RSubSessionBase;
  4113 public:
  4114     /**
  4115     Indicates whether or not threads in the process are automatically attached
  4116     to the session when passed as a parameter to the Share() function.
  4117     */
  4118 	enum TAttachMode {EExplicitAttach,EAutoAttach};
  4119 public:
  4120 	/**
  4121 	Creates a session that can be shared by other threads in the current
  4122     process.
  4123     
  4124     After calling this function the session object may be used by threads other
  4125     than than the one that created it.
  4126     
  4127     Note that this can only be done with servers that mark their sessions
  4128     as sharable.
  4129     
  4130     @return	KErrNone, if the session is successfully shared;
  4131 	        KErrNoMmemory, if the attempt fails for lack of memory.
  4132 
  4133     @panic	KERN-EXEC 23 The session cannot be shared.
  4134     
  4135     @see CServer2
  4136     @see RSessionBase::ShareProtected()
  4137     @see CServer2::TServerType
  4138 	*/
  4139 	inline TInt ShareAuto()	{ return DoShare(EAutoAttach); }
  4140 
  4141 
  4142     /**
  4143     Creates a session handle that can be be passed via IPC to another process
  4144     as well as being shared by other threads in the current process.
  4145     
  4146     After calling this function the session object may be used by threads other
  4147     than than the one that created it.
  4148 
  4149     Note that this can only be done with servers that mark their sessions
  4150     as globally sharable.
  4151     
  4152     @return	KErrNone, if the session is successfully shared;
  4153 	        KErrNoMmemory, if the attempt fails for lack of memory.
  4154    
  4155     @panic	KERN-EXEC 23 The session cannot be shared.
  4156     
  4157     @see CServer2
  4158     @see RSessionBase::ShareAuto()
  4159     @see CServer2::TServerType
  4160     */
  4161 	inline TInt ShareProtected() { return DoShare(EAutoAttach|KCreateProtectedObject); }
  4162 
  4163 
  4164 	IMPORT_C TInt Open(RMessagePtr2 aMessage,TInt aParam,TOwnerType aType=EOwnerProcess);
  4165 	IMPORT_C TInt Open(RMessagePtr2 aMessage,TInt aParam,const TSecurityPolicy& aServerPolicy,TOwnerType aType=EOwnerProcess);
  4166 	IMPORT_C TInt Open(TInt aArgumentIndex, TOwnerType aType=EOwnerProcess);
  4167 	IMPORT_C TInt Open(TInt aArgumentIndex, const TSecurityPolicy& aServerPolicy, TOwnerType aType=EOwnerProcess);
  4168 	inline TInt SetReturnedHandle(TInt aHandleOrError);
  4169 	IMPORT_C TInt SetReturnedHandle(TInt aHandleOrError,const TSecurityPolicy& aServerPolicy);
  4170 protected:
  4171 	inline TInt CreateSession(const TDesC& aServer,const TVersion& aVersion);
  4172 	IMPORT_C TInt CreateSession(const TDesC& aServer,const TVersion& aVersion,TInt aAsyncMessageSlots);
  4173 	IMPORT_C TInt CreateSession(const TDesC& aServer,const TVersion& aVersion,TInt aAsyncMessageSlots,TIpcSessionType aType,const TSecurityPolicy* aPolicy=0, TRequestStatus* aStatus=0);
  4174 	inline TInt CreateSession(RServer2 aServer,const TVersion& aVersion);
  4175 	IMPORT_C TInt CreateSession(RServer2 aServer,const TVersion& aVersion,TInt aAsyncMessageSlots);
  4176 	IMPORT_C TInt CreateSession(RServer2 aServer,const TVersion& aVersion,TInt aAsyncMessageSlots,TIpcSessionType aType,const TSecurityPolicy* aPolicy=0, TRequestStatus* aStatus=0);
  4177 	inline static TInt SetReturnedHandle(TInt aHandleOrError,RHandleBase& aHandle);
  4178 
  4179 	/**
  4180 	@deprecated Use CreateSession(const TDesC& aServer,const TVersion& aVersion,TInt aAsyncMessageSlots,TIpcSessionType aType,const TSecurityPolicy* aPolicy=0, TRequestStatus* aStatus=0);
  4181 	*/
  4182 	inline TInt CreateSession(const TDesC& aServer,const TVersion& aVersion,TInt aAsyncMessageSlots,TRequestStatus* aStatus)
  4183 		{ return CreateSession(aServer, aVersion, aAsyncMessageSlots, EIpcSession_Unsharable, (TSecurityPolicy*)0, aStatus); }
  4184 	inline TInt Send(TInt aFunction,const TIpcArgs& aArgs) const;
  4185 	inline void SendReceive(TInt aFunction,const TIpcArgs& aArgs,TRequestStatus& aStatus) const;
  4186 	inline TInt SendReceive(TInt aFunction,const TIpcArgs& aArgs) const;
  4187 	inline TInt Send(TInt aFunction) const;
  4188 	inline void SendReceive(TInt aFunction,TRequestStatus& aStatus) const;
  4189 	inline TInt SendReceive(TInt aFunction) const;
  4190 private:
  4191 	IMPORT_C TInt DoSend(TInt aFunction,const TIpcArgs* aArgs) const;
  4192 	IMPORT_C void DoSendReceive(TInt aFunction,const TIpcArgs* aArgs,TRequestStatus& aStatus) const;
  4193 	IMPORT_C TInt DoSendReceive(TInt aFunction,const TIpcArgs* aArgs) const;
  4194 	TInt SendAsync(TInt aFunction,const TIpcArgs* aArgs,TRequestStatus* aStatus) const;
  4195 	TInt SendSync(TInt aFunction,const TIpcArgs* aArgs) const;
  4196 	IMPORT_C TInt DoShare(TInt aAttachMode);
  4197 	TInt DoConnect(const TVersion &aVersion,TRequestStatus* aStatus);
  4198 	};
  4199 
  4200 
  4201 
  4202 
  4203 /**
  4204 @publishedAll
  4205 @released
  4206 
  4207 Client-side handle to a sub-session. 
  4208 
  4209 It represents a client-side sub-session, and has a corresponding sub-session
  4210 object on the server-side.
  4211 
  4212 Clients normally define and implement a derived class to provide a richer
  4213 interface. In particular, a derived class should:
  4214 
  4215 1. provide a function to create a new sub-session with the server;
  4216    this should call CreateSubSession().
  4217 
  4218 2. provide a function to close the current sub-session;
  4219    this should call CloseSubSession().
  4220 
  4221 A session must already exist with a server before a client can establish
  4222 any sub-sessions.
  4223 */
  4224 class RSubSessionBase
  4225 	{
  4226 public:
  4227 	inline TInt SubSessionHandle() const;
  4228 protected:
  4229 	inline RSubSessionBase();
  4230 	IMPORT_C const RSessionBase Session() const;
  4231 	inline TInt CreateSubSession(const RSessionBase& aSession,TInt aFunction,const TIpcArgs& aArgs);
  4232 	inline TInt CreateSubSession(const RSessionBase& aSession,TInt aFunction);
  4233 	IMPORT_C TInt CreateAutoCloseSubSession(RSessionBase& aSession,TInt aFunction,const TIpcArgs& aArgs);
  4234 	IMPORT_C void CloseSubSession(TInt aFunction);
  4235 	inline TInt Send(TInt aFunction,const TIpcArgs& aArgs) const;
  4236 	inline void SendReceive(TInt aFunction,const TIpcArgs& aArgs,TRequestStatus& aStatus) const;
  4237 	inline TInt SendReceive(TInt aFunction,const TIpcArgs& aArgs) const;
  4238 	inline TInt Send(TInt aFunction) const;
  4239 	inline void SendReceive(TInt aFunction,TRequestStatus& aStatus) const;
  4240 	inline TInt SendReceive(TInt aFunction) const;
  4241 private:
  4242 	IMPORT_C TInt DoCreateSubSession(const RSessionBase& aSession,TInt aFunction,const TIpcArgs* aArgs);
  4243 	IMPORT_C TInt DoSend(TInt aFunction,const TIpcArgs* aArgs) const;
  4244 	IMPORT_C void DoSendReceive(TInt aFunction,const TIpcArgs* aArgs,TRequestStatus& aStatus) const;
  4245 	IMPORT_C TInt DoSendReceive(TInt aFunction,const TIpcArgs* aArgs) const;
  4246 	TInt DoCreateSubSession(RSessionBase& aSession,TInt aFunction,const TIpcArgs* aArgs, TBool aAutoClose);
  4247 private:
  4248 	RSessionBase iSession;
  4249 	TInt iSubSessionHandle;
  4250 	};
  4251 
  4252 
  4253 
  4254 
  4255 /**
  4256 @publishedAll
  4257 @released
  4258 
  4259 Base class that provides an implementation for the templated
  4260 RRef class.
  4261 
  4262 @see RRef
  4263 */
  4264 class RRefBase
  4265 	{
  4266 public:
  4267 	IMPORT_C void Free();
  4268 protected:
  4269 	inline RRefBase();
  4270 	inline RRefBase(const RRefBase& aRef);
  4271 	IMPORT_C void DoAlloc(const TAny* aPtr,TInt aSize);
  4272 	IMPORT_C void DoAllocL(const TAny* aPtr,TInt aSize);
  4273 	IMPORT_C void Copy(const RRefBase& aRef);
  4274 private:
  4275 	IMPORT_C void operator=(const RRefBase& aRef);
  4276 protected:
  4277 	TInt* iPtr;
  4278 	};
  4279 
  4280 
  4281 
  4282 
  4283 /**
  4284 @publishedAll
  4285 @released
  4286 
  4287 Contains, or packages, a copy of an instance of another class.
  4288 
  4289 The template parameter defines the type of the contained object.
  4290 
  4291 The contained object is held in allocated memory, and can be accessed
  4292 through the member selection and dereference operators.
  4293 */
  4294 template <class T>
  4295 class RRef : public RRefBase
  4296 	{
  4297 public:
  4298 	inline RRef();
  4299 	inline RRef(const RRef<T>& anObject);
  4300 	inline void operator=(const RRef<T>& anObject);
  4301 	inline T* operator->();
  4302 	inline operator T*();
  4303 	inline void Alloc(const T& anObject);
  4304 	inline void Alloc(const T& anObject,TInt aSize);
  4305 	inline void AllocL(const T& anObject);
  4306 	inline void AllocL(const T& anObject,TInt aSize);
  4307 	};
  4308 
  4309 
  4310 
  4311 
  4312 /**
  4313 @publishedAll
  4314 @released
  4315 
  4316 A handle to a change notifier. 
  4317 
  4318 The change notifier itself is a kernel object.
  4319 */
  4320 class RChangeNotifier : public RHandleBase
  4321 	{
  4322 public:
  4323 	IMPORT_C TInt Create();
  4324 	IMPORT_C TInt Logon(TRequestStatus& aStatus) const;
  4325 	IMPORT_C TInt LogonCancel() const;
  4326 	};
  4327 
  4328 
  4329 
  4330 
  4331 /**
  4332 @publishedAll
  4333 @released
  4334 
  4335 Handle to a thread death notifier. 
  4336 
  4337 The notifier allows threads to be notified of the death of another thread. 
  4338 
  4339 The thread-death notifier itself is a kernel object.
  4340 */
  4341 class RUndertaker : public RHandleBase
  4342 	{
  4343 public:
  4344 	IMPORT_C TInt Create();
  4345 	IMPORT_C TInt Logon(TRequestStatus& aStatus,TInt& aThreadHandle) const;
  4346 	IMPORT_C TInt LogonCancel() const;
  4347 	};
  4348 
  4349 
  4350 
  4351 
  4352 
  4353 class HBufC16;
  4354 /**
  4355 @publishedAll
  4356 @released
  4357 
  4358 A handle to a session with the extended notifier server that provides support
  4359 for plug-in notifiers.
  4360 
  4361 The interface allows engines or other low level components
  4362 to communicate with the UI.
  4363 */
  4364 class RNotifier : public RSessionBase
  4365 	{
  4366 public:
  4367 	IMPORT_C RNotifier();
  4368 	IMPORT_C TInt Connect();
  4369 	IMPORT_C void Close();
  4370 	IMPORT_C TInt StartNotifier(TUid aNotifierUid,const TDesC8& aBuffer);
  4371 	IMPORT_C TInt StartNotifier(TUid aNotifierUid,const TDesC8& aBuffer,TDes8& aResponse);
  4372 	IMPORT_C TInt StartNotifier(TUid aNotifierDllUid,TUid aNotifierUid,const TDesC8& aBuffer,TDes8& aResponse);
  4373 	IMPORT_C TInt CancelNotifier(TUid aNotifierUid);
  4374 	IMPORT_C TInt UpdateNotifier(TUid aNotifierUid,const TDesC8& aBuffer,TDes8& aResponse);
  4375 	IMPORT_C void UpdateNotifierAndGetResponse(TRequestStatus& aRs,TUid aNotifierUid,const TDesC8& aBuffer,TDes8& aResponse);
  4376 	IMPORT_C void StartNotifierAndGetResponse(TRequestStatus& aRs,TUid aNotifierUid,const TDesC8& aBuffer,TDes8& aResponse);
  4377 	IMPORT_C void StartNotifierAndGetResponse(TRequestStatus& aRs,TUid aNotifierDllUid,TUid aNotifierUid,const TDesC8& aBuffer,TDes8& aResponse);
  4378 	IMPORT_C TInt UnloadNotifiers(TUid aNotifierUid);
  4379 	IMPORT_C TInt LoadNotifiers(TUid aNotifierUid);
  4380 	IMPORT_C void Notify(const TDesC& aLine1,const TDesC& aLine2,const TDesC& aBut1,const TDesC& aBut2,TInt& aButtonVal,TRequestStatus& aStatus);
  4381 	IMPORT_C void NotifyCancel();
  4382 	IMPORT_C TInt InfoPrint(const TDesC& aDes);
  4383 private:
  4384 	TPtr8 iButtonVal;
  4385 	HBufC16* iCombinedBuffer;
  4386 	};
  4387 
  4388 
  4389 
  4390 
  4391 
  4392 
  4393 
  4394 
  4395 /**
  4396 @internalAll
  4397 */
  4398 const TInt KMediaPasswordNotifyUid(0x10004c00);
  4399 
  4400 /**
  4401 @internalAll
  4402 */
  4403 enum TMediaPswdNotifyExitMode {EMPEMUnlock, EMPEMCancel, EMPEMUnlockAndStore};
  4404 
  4405 /**
  4406 @internalAll
  4407 */
  4408 struct TMediaPswdNotifyBase
  4409 	{
  4410 	enum TCardType {ECTMmcPassword} iCT;
  4411 	TVersion iVersion;
  4412 	};
  4413 
  4414 /**
  4415 @internalAll
  4416 */
  4417 struct TMediaPswdSendNotifyInfoV1 : public TMediaPswdNotifyBase
  4418 	{
  4419 	// empty.
  4420 	};
  4421 
  4422 /**
  4423 @internalAll
  4424 */
  4425 struct TMediaPswdSendNotifyInfoV1Debug : public TMediaPswdSendNotifyInfoV1
  4426 	{
  4427 	TInt iSleepPeriod;							// us, -ve means maximum range
  4428 	TMediaPswdNotifyExitMode iEM;
  4429 	TText8 iPW[KMaxMediaPassword];
  4430 	};
  4431 
  4432 /**
  4433 @internalAll
  4434 */
  4435 struct TMediaPswdReplyNotifyInfoV1 : public TMediaPswdNotifyBase
  4436 	{
  4437 	TText8 iPW[KMaxMediaPassword];
  4438 	TMediaPswdNotifyExitMode iEM;
  4439 	};
  4440 
  4441 
  4442 
  4443 
  4444 /**
  4445 @publishedAll
  4446 @released
  4447 
  4448 Abstract class that defines a handler to work with the TRAP mechanism.
  4449 
  4450 Symbian OS provides a trap handler and this class does not normally need to be
  4451 used or accessed directly by applications and third party code.
  4452 */
  4453 class TTrapHandler
  4454 	{
  4455 public:
  4456 	IMPORT_C TTrapHandler();
  4457 	
  4458 	/**
  4459 	Called when a TRAP is invoked.
  4460 	*/
  4461 	IMPORT_C virtual void Trap()=0;
  4462 	
  4463 	/**
  4464 	Called when a function exits a TRAP without leaving.
  4465     */
  4466 	IMPORT_C virtual void UnTrap()=0;
  4467 	
  4468 	/**
  4469 	Called when a function within a TRAP leaves.
  4470 
  4471     @param aValue The leave value.
  4472 	*/
  4473 	IMPORT_C virtual void Leave(TInt aValue)=0;
  4474 	};
  4475 
  4476 
  4477 
  4478 
  4479 struct TCollationMethod; // forward declaration
  4480 
  4481 
  4482 
  4483 
  4484 /**
  4485 @publishedAll
  4486 @released
  4487 
  4488 Contains a set of static functions which perform manipulation of
  4489 data in memory.
  4490 
  4491 The arguments passed to the functions of this class are pointers to memory 
  4492 locations and length values. These functions are, therefore, not normally 
  4493 used in open code but are suitable for implementing data manipulation for 
  4494 other classes. Typically the interface provided by such classes is typesafe 
  4495 and hides this direct memory to memory manipulation.
  4496 */
  4497 class Mem
  4498 	{
  4499 public:
  4500 	inline static TUint8* Copy(TAny* aTrg, const TAny* aSrc, TInt aLength);
  4501 	inline static TUint8* Move(TAny* aTrg, const TAny* aSrc, TInt aLength);
  4502 	inline static void Fill(TAny* aTrg, TInt aLength, TChar aChar);
  4503 	inline static void FillZ(TAny* aTrg, TInt aLength);
  4504 #ifndef __GCC32__
  4505 	inline static TInt Compare(const TUint8* aLeft, TInt aLeftL, const TUint8* aRight, TInt aRightL);
  4506 #else
  4507 	IMPORT_C static TInt Compare(const TUint8* aLeft, TInt aLeftL, const TUint8* aRight, TInt aRightL);
  4508 #endif
  4509 
  4510 	IMPORT_C static TInt Compare(const TUint16* aLeft, TInt aLeftL, const TUint16* aRight, TInt aRightL);
  4511 	IMPORT_C static TInt CompareF(const TUint8* aLeft, TInt aLeftL, const TUint8* aRight, TInt aRightL);
  4512 	IMPORT_C static TInt CompareF(const TUint16* aLeft, TInt aLeftL, const TUint16* aRight, TInt aRightL);
  4513 	IMPORT_C static TInt CompareC(const TUint8* aLeft, TInt aLeftL, const TUint8* aRight, TInt aRightL);
  4514 	IMPORT_C static TInt CompareC(const TUint16* aLeft, TInt aLeftL, const TUint16* aRight, TInt aRightL);
  4515 	IMPORT_C static TInt CompareC(const TUint16* aLeft, TInt aLeftL, const TUint16* aRight, TInt aRightL,
  4516 								  TInt aMaxLevel, const TCollationMethod* aCollationMethod);
  4517 	IMPORT_C static TInt CollationMethods();
  4518 	IMPORT_C static TUint CollationMethodId(TInt aIndex);
  4519 	IMPORT_C static const TCollationMethod* CollationMethodByIndex(TInt aIndex);
  4520 	IMPORT_C static const TCollationMethod* CollationMethodById(TUint aId);
  4521 	IMPORT_C static const TCollationMethod* GetDefaultMatchingTable();
  4522 	IMPORT_C static void Swap(TAny* aPtr1, TAny* aPtr2, TInt aLength);
  4523 	IMPORT_C static void Crc(TUint16& aCrc, const TAny* aPtr, TInt aLength);
  4524 	IMPORT_C static void Crc32(TUint32& aCrc, const TAny* aPtr, TInt aLength);
  4525 	};
  4526 
  4527 
  4528 
  4529 
  4530 
  4531 /**
  4532 @publishedAll
  4533 @released
  4534 
  4535 Set of static user functions.
  4536 
  4537 These functions are related to a number of System component APIs.
  4538 
  4539 The majority of the functions are related to either the current thread, or 
  4540 its heap. Examples in this category include User::Exit(), which causes the 
  4541 thread to terminate, and User::Alloc(), which allocates memory from the current 
  4542 thread's heap.
  4543 
  4544 Some of these functions are equivalent to functions in the RThread or RHeap 
  4545 classes. In these cases, the User function is a convenient way to access the 
  4546 function without first having to get a handle to the current thread.
  4547 
  4548 Functions are also provided to support debugging of memory leaks. These function 
  4549 calls can be written explicitly or can be generated using a corresponding 
  4550 macro - the advantage of using a macro is that the function call is only 
  4551 generated for debug builds.
  4552 
  4553 A final category of functions, which includes User::BinarySearch() and User::QuickSort(), 
  4554 are just useful functions which have no other natural home.
  4555 
  4556 @see RThread
  4557 @see RHeap
  4558 */
  4559 class User : public UserHeap
  4560     {
  4561 public:
  4562     // Execution control
  4563 	IMPORT_C static void InitProcess();			/**< @internalComponent */
  4564     IMPORT_C static void Exit(TInt aReason);
  4565     IMPORT_C static void Panic(const TDesC& aCategory,TInt aReason);
  4566     IMPORT_C static void HandleException(TAny* aInfo);	/**< @internalComponent */
  4567     // Cleanup support
  4568     IMPORT_C static void Leave(TInt aReason);
  4569     IMPORT_C static void LeaveNoMemory();
  4570     IMPORT_C static TInt LeaveIfError(TInt aReason);
  4571     IMPORT_C static TAny* LeaveIfNull(TAny* aPtr);
  4572     IMPORT_C static TTrapHandler* SetTrapHandler(TTrapHandler* aHandler);
  4573     IMPORT_C static TTrapHandler* TrapHandler();
  4574     IMPORT_C static TTrapHandler* MarkCleanupStack();   /**< @internalComponent */
  4575     IMPORT_C static void UnMarkCleanupStack(TTrapHandler* aHandler);   /**< @internalComponent */
  4576 	IMPORT_C static void LeaveEnd();	/**< @internalComponent */
  4577     // Infoprint
  4578     IMPORT_C static TInt InfoPrint(const TDesC& aDes);
  4579     // Asynchronous service support
  4580     IMPORT_C static void RequestComplete(TRequestStatus*& aStatus,TInt aReason);
  4581     IMPORT_C static void WaitForAnyRequest();
  4582     IMPORT_C static void WaitForRequest(TRequestStatus& aStatus); 
  4583     IMPORT_C static void WaitForRequest(TRequestStatus& aStatus1,TRequestStatus& aStatus2);
  4584     IMPORT_C static void WaitForNRequest(TRequestStatus *aStatusArray[], TInt aNum);
  4585     // User heap management
  4586     IMPORT_C static TInt AllocLen(const TAny* aCell); 
  4587     IMPORT_C static TAny* Alloc(TInt aSize);
  4588     IMPORT_C static TAny* AllocL(TInt aSize); 
  4589     IMPORT_C static TAny* AllocLC(TInt aSize);
  4590     IMPORT_C static TAny* AllocZ(TInt aSize);
  4591     IMPORT_C static TAny* AllocZL(TInt aSize); 
  4592     IMPORT_C static TInt AllocSize(TInt& aTotalAllocSize); 
  4593     IMPORT_C static TInt Available(TInt& aBiggestBlock); 
  4594     IMPORT_C static TInt CountAllocCells();
  4595     IMPORT_C static TInt CountAllocCells(TInt& aFreeCount); 
  4596     IMPORT_C static void Free(TAny* aCell);
  4597     IMPORT_C static void FreeZ(TAny*& aCell); 
  4598     IMPORT_C static RAllocator& Allocator();
  4599     inline static RHeap& Heap();
  4600     IMPORT_C static TAny* ReAlloc(TAny* aCell, TInt aSize, TInt aMode=0);
  4601     IMPORT_C static TAny* ReAllocL(TAny* aCell, TInt aSize, TInt aMode=0);
  4602     IMPORT_C static RAllocator* SwitchAllocator(RAllocator* aAllocator);
  4603 	inline static RHeap* SwitchHeap(RAllocator* aHeap);
  4604 	IMPORT_C static TInt CompressAllHeaps();
  4605     // Synchronous timer services
  4606     IMPORT_C static void After(TTimeIntervalMicroSeconds32 aInterval);
  4607     IMPORT_C static TInt At(const TTime& aTime);
  4608     IMPORT_C static void AfterHighRes(TTimeIntervalMicroSeconds32 aInterval);
  4609     // Set time and deal with timezones
  4610     IMPORT_C static TInt SetHomeTime(const TTime& aTime);
  4611     IMPORT_C static TInt SetHomeTimeSecure(const TTime& aTime);
  4612 	IMPORT_C static TInt SetUTCTime(const TTime& aUTCTime);
  4613 	IMPORT_C static TInt SetUTCTimeSecure(const TTime& aUTCTime);
  4614 	IMPORT_C static TTimeIntervalSeconds UTCOffset();
  4615 	IMPORT_C static void SetUTCOffset(TTimeIntervalSeconds aOffset);
  4616 	IMPORT_C static TInt SetUTCTimeAndOffset(const TTime& aUTCTime, TTimeIntervalSeconds aOffset);
  4617     // Set locale information
  4618     IMPORT_C static TInt SetCurrencySymbol(const TDesC& aSymbol);
  4619 	// Set floating point mode
  4620 	IMPORT_C static TInt SetFloatingPointMode(TFloatingPointMode aMode, TFloatingPointRoundingMode aRoundingMode=EFpRoundToNearest);
  4621 	// Timers
  4622 	IMPORT_C static TUint TickCount();
  4623 	IMPORT_C static TUint32 NTickCount();
  4624 	IMPORT_C static TTimerLockSpec LockPeriod();
  4625 	IMPORT_C static TTimeIntervalSeconds InactivityTime();
  4626 	IMPORT_C static void ResetInactivityTime();
  4627 	IMPORT_C static TUint32 FastCounter();
  4628 	// Atomic operations
  4629 	IMPORT_C static TInt LockedInc(TInt& aValue);
  4630 	IMPORT_C static TInt LockedDec(TInt& aValue);
  4631 	IMPORT_C static TInt SafeInc(TInt& aValue);
  4632 	IMPORT_C static TInt SafeDec(TInt& aValue);
  4633     // Beep
  4634     IMPORT_C static TInt Beep(TInt aFrequency,TTimeIntervalMicroSeconds32 aDuration); 
  4635     // Information
  4636     IMPORT_C static TInt IsRomAddress(TBool& aBool,TAny* aPtr);
  4637     // Algorithms
  4638     IMPORT_C static TInt BinarySearch(TInt aCount,const TKey& aKey,TInt& aPos);
  4639     IMPORT_C static TInt QuickSort(TInt aCount,const TKey& aKey,const TSwap& aSwap);
  4640     // Language-dependent character functions 
  4641     IMPORT_C static TLanguage Language();
  4642     IMPORT_C static TUint Collate(TUint aChar); 
  4643     IMPORT_C static TUint Fold(TUint aChar); 
  4644     IMPORT_C static TUint LowerCase(TUint aChar); 
  4645     IMPORT_C static TUint UpperCase(TUint aChar); 
  4646 	IMPORT_C static TUint Fold(TUint aChar,TInt aFlags);
  4647 	IMPORT_C static TUint TitleCase(TUint aChar);
  4648     // C-style string length
  4649     IMPORT_C static TInt StringLength(const TUint8* aString); 
  4650     IMPORT_C static TInt StringLength(const TUint16* aString);
  4651     // Device management
  4652     IMPORT_C static TInt FreeLogicalDevice(const TDesC& aDeviceName); 
  4653 	IMPORT_C static TInt FreePhysicalDevice(const TDesC& aDriverName); 
  4654     IMPORT_C static TInt LoadLogicalDevice(const TDesC& aFileName); 
  4655     IMPORT_C static TInt LoadPhysicalDevice(const TDesC& aFileName); 
  4656     // Version information
  4657     IMPORT_C static TBool QueryVersionSupported(const TVersion& aCurrent,const TVersion& aRequested);
  4658     IMPORT_C static TVersion Version();
  4659     // Machine configuration
  4660     IMPORT_C static TInt SetMachineConfiguration(const TDesC8& aConfig);
  4661     IMPORT_C static TInt MachineConfiguration(TDes8& aConfig,TInt& aSize);
  4662     // Debugging support
  4663     IMPORT_C static void SetDebugMask(TUint32 aVal);
  4664     IMPORT_C static void SetDebugMask(TUint32 aVal, TUint aIndex);
  4665     IMPORT_C static void SetJustInTime(const TBool aBoolean); 
  4666     IMPORT_C static void Check();
  4667     IMPORT_C static void Invariant();
  4668     IMPORT_C static TBool JustInTime();
  4669     IMPORT_C static void __DbgMarkStart(TBool aKernel);
  4670     IMPORT_C static void __DbgMarkCheck(TBool aKernel, TBool aCountAll, TInt aCount, const TUint8* aFileName, TInt aLineNum);
  4671     IMPORT_C static TUint32 __DbgMarkEnd(TBool aKernel, TInt aCount);
  4672     IMPORT_C static void __DbgSetAllocFail(TBool aKernel, RAllocator::TAllocFail aFail, TInt aRate);
  4673     IMPORT_C static void __DbgSetBurstAllocFail(TBool aKernel, RAllocator::TAllocFail aFail, TUint aRate, TUint aBurst);
  4674 	IMPORT_C static TUint __DbgCheckFailure(TBool aKernel);
  4675 	IMPORT_C static void PanicUnexpectedLeave(); /**< @internalComponent */
  4676     // Name Validation
  4677     IMPORT_C static TInt ValidateName(const TDesC& aName);
  4678 	// Instruction Memory Barrier
  4679 	IMPORT_C static void IMB_Range(TAny* aStart, TAny* aEnd);
  4680 	//
  4681 	IMPORT_C static TInt CommandLineLength();
  4682 	IMPORT_C static void CommandLine(TDes &aCommand);
  4683 	IMPORT_C static TExceptionHandler ExceptionHandler();
  4684 	IMPORT_C static TInt SetExceptionHandler(TExceptionHandler aHandler,TUint32 aMask);
  4685 	IMPORT_C static void ModifyExceptionMask(TUint32 aClearMask, TUint32 aSetMask);
  4686 	IMPORT_C static TInt RaiseException(TExcType aType);
  4687 	IMPORT_C static TBool IsExceptionHandled(TExcType aType);
  4688 
  4689 	/**
  4690 	A set of values that defines the effect that terminating a thread 
  4691 	has, either on its owning process or on the whole system.
  4692 	
  4693 	A thread is said to be critical if its owning process or the entire system
  4694 	terminates when the thread itself terminates. 
  4695 	
  4696 	You pass one of these values to the functions:
  4697 	- User::SetCritical()
  4698 	- User::SetProcessCritical()
  4699 	
  4700 	The meaning of a value when passed to one function is different to
  4701 	its meaning when passed the other function. See the description of each
  4702 	individual value.
  4703 			
  4704 	@see User::SetCritical()
  4705 	@see User::SetProcessCritical()
  4706 	*/
  4707 	enum TCritical {
  4708 	
  4709 	
  4710 	               /**
  4711                    This value can be passed to both:
  4712                    - User::SetCritical(), which means that the current thread
  4713                    is no longer critical, i.e. termination of the current
  4714                    thread will no longer cause termination of the current thread's
  4715                    owning process (i.e. the current process) or a reboot of the system.
  4716                    - User::SetProcessCritical(), which means that threads
  4717                    subsequently created in the current thread's owning
  4718                    process (i.e. the current process) will no longer cause termination of that
  4719                    process or a reboot of the system. Note, however, that existing
  4720                    threads are NOT affected when you call this function.
  4721                    
  4722                    @see User::SetCritical()
  4723                    @see User::SetProcessCritical()
  4724                    */
  4725                    ENotCritical, 
  4726                    
  4727                                       
  4728                    /**
  4729                    This value can only be passed to User::SetCritical() and
  4730                    affects the current thread only.
  4731                    
  4732                    It means that the owning process (i.e.the current process)
  4733                    terminates if:
  4734                    - the current thread is terminated.
  4735                    - the current thread panics.
  4736                    
  4737                    @see User::SetCritical()
  4738                    */	
  4739 	               EProcessCritical,
  4740 
  4741 	               
  4742 	               /**
  4743                    This value can only be passed to User::SetCritical() and
  4744                    affects the current thread only.
  4745                    
  4746                    It means that the owning process (i.e.the current process)
  4747                    terminates if the current thread terminates for any reason.
  4748                    
  4749                    @see User::SetCritical()
  4750                    */
  4751 	               EProcessPermanent,
  4752 	               
  4753 	               
  4754 	               /**
  4755 	               This value can only be passed to User::SetProcessCritical() and
  4756                    affects any new threads created in the current process.
  4757 	               
  4758 	               It means that the current process terminates if:
  4759 	               - any new thread subsequently created in the current process is terminated.
  4760 	               - any new thread subsequently created in the current process panics.
  4761 	               .
  4762 	               Note, however, that existing threads in the current process
  4763 	               are NOT affected when you call User::SetProcessCritical()
  4764 	               with this value.
  4765 	               	               
  4766 	               @see EProcessCritical
  4767                    @see User::SetProcessCritical()
  4768 	               */
  4769 	               EAllThreadsCritical,
  4770 	                	                
  4771 	                
  4772 	               /**
  4773 	               This value can be passed to both: User::SetCritical() and
  4774 	               User::SetProcessCritical().
  4775                    
  4776                    When passed to User::SetCritical(), it means that
  4777                    the entire system is rebooted if:
  4778                    - the current thread is terminated.
  4779                    - the current thread panics.
  4780                    
  4781                    When passed to User::SetProcessCritical(), it means that
  4782                    the entire system is rebooted if:
  4783                    - any new thread subsequently created in the current process is terminated.
  4784                    - any new thread subsequently created in the current process panics.
  4785                    - the process itself is terminated
  4786                    - the process itself panics
  4787 	               
  4788 	               Note:
  4789                    -# existing threads in the current process are NOT affected when you
  4790                    call User::SetProcessCritical() with this value.
  4791                    -# Only a process with 'Protected Server' capability can set a
  4792                    thread to system-critical.
  4793                    
  4794                    @see User::SetCritical()
  4795                    @see User::SetProcessCritical()
  4796 	               */
  4797 	               ESystemCritical,
  4798 	               
  4799 	               
  4800 	               /**
  4801 	               This value can be passed to both: User::SetCritical()
  4802 	               and User::SetProcessCritical().
  4803                    
  4804                    When passed to User::SetCritical(), it means that
  4805                    the entire system is rebooted if the current thread
  4806                    exits for any reason.
  4807                    
  4808                    When passed to User::SetProcessCritical(), it means that
  4809                    the entire system is rebooted if any new thread 
  4810                    subsequently created in the current process exits
  4811                    for any reason, or if the process itself exits for any reason.
  4812 	               
  4813 	               Note:
  4814                    -# existing threads in the current process are NOT affected when you
  4815                    call User::SetProcessCritical() with this value.
  4816                    -# Only a process with 'Protected Server' capability can set a
  4817                    thread to system-permanent.
  4818                    
  4819                    @see User::SetCritical()
  4820                    @see User::SetProcessCritical()
  4821 	               */
  4822 	               ESystemPermanent
  4823 	               };
  4824 	IMPORT_C static TCritical Critical();
  4825 	IMPORT_C static TCritical Critical(RThread aThread);
  4826 	IMPORT_C static TInt SetCritical(TCritical aCritical);
  4827 	IMPORT_C static TCritical ProcessCritical();
  4828 	IMPORT_C static TCritical ProcessCritical(RProcess aProcess);
  4829 	IMPORT_C static TInt SetProcessCritical(TCritical aCritical);
  4830 	IMPORT_C static TBool PriorityControl();
  4831 	IMPORT_C static void SetPriorityControl(TBool aEnable);
  4832 
  4833 	/**
  4834 	A threads realtime state.
  4835 	Some non-realtime behaviour can be detected by the kernel. When it does so,
  4836 	action is taken depending on the thread state:
  4837 	-	ERealtimeStateOff - no action.
  4838 	-	ERealtimeStateOn - the the thread will be panicked with KERN-EXEC 61 (EIllegalFunctionForRealtimeThread).
  4839 	-	ERealtimeStateWarn - no action. However, if the kernel trace flag KREALTIME is enabled
  4840 							 then tracing will be emitted as if the thread state was ERealtimeStateOn.
  4841 	@publishedPartner
  4842 	@prototype
  4843 	*/
  4844 	enum TRealtimeState
  4845 		{
  4846 		ERealtimeStateOff,	/**< Thread is not realtime */
  4847 		ERealtimeStateOn,	/**< Thread is realtime */
  4848 		ERealtimeStateWarn	/**< Thread is realtime but doesn't want this enforced */
  4849 		};
  4850 
  4851 	/**
  4852 	Set the current threads realtime state.
  4853 	@see TRealtimeState
  4854 	@param aState The state
  4855 	@return KErrNone if successful. KErrArgument if aState is invalid.
  4856 	@publishedPartner
  4857 	@prototype
  4858 	*/
  4859 	IMPORT_C static TInt SetRealtimeState(TRealtimeState aState);
  4860 
  4861 	/**
  4862 	Return the Secure ID of the process that created the current process.
  4863 	@return The Secure ID.
  4864 	@publishedAll
  4865 	@released
  4866 	*/
  4867 	IMPORT_C static TSecureId CreatorSecureId();
  4868 
  4869 	/**
  4870 	Return the Vendor ID of the process that created the current process.
  4871 	@return The Vendor ID.
  4872 	@publishedAll
  4873 	@released
  4874 	*/
  4875 	IMPORT_C static TVendorId CreatorVendorId();
  4876 
  4877 	/**
  4878 	Check if the process that created the current process has a given capability
  4879 
  4880 	When a check fails the action taken is determined by the system wide Platform Security
  4881 	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
  4882 	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
  4883 	check failed.
  4884 
  4885 	@param aCapability The capability to test.
  4886 	@param aDiagnostic A string that will be emitted along with any diagnostic message
  4887 								that may be issued if the test finds the capability is not present.
  4888 								This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
  4889 								which enables it to be easily removed from the system.
  4890 	@return ETrue if the creator process has the capability, EFalse otherwise.
  4891 	@publishedAll
  4892 	@released
  4893 	*/
  4894 #ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
  4895 	inline static TBool CreatorHasCapability(TCapability aCapability, const char* aDiagnostic=0);
  4896 #else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
  4897 	// Only available to NULL arguments
  4898 	inline static TBool CreatorHasCapability(TCapability aCapability, OnlyCreateWithNull aDiagnostic=NULL);
  4899 #ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
  4900 	// For things using KSuppressPlatSecDiagnostic
  4901 	inline static TBool CreatorHasCapability(TCapability aCapability, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress);
  4902 #endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
  4903 #endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
  4904 
  4905 	/**
  4906 	Check if the process that created the current process has both of the given capabilities
  4907 
  4908 	When a check fails the action taken is determined by the system wide Platform Security
  4909 	configuration. If PlatSecDiagnostics is ON, then a diagnostic message is emitted.
  4910 	If PlatSecEnforcement is OFF, then this function will return ETrue even though the
  4911 	check failed.
  4912 
  4913 	@param aCapability1 The first capability to test.
  4914 	@param aCapability2 The second capability to test.
  4915 	@param aDiagnostic A string that will be emitted along with any diagnostic message
  4916 								that may be issued if the test finds a capability is not present.
  4917 								This string must be enclosed in the __PLATSEC_DIAGNOSTIC_STRING macro
  4918 								which enables it to be easily removed from the system.
  4919 	@return ETrue if the creator process has both the capabilities, EFalse otherwise.
  4920 	@publishedAll
  4921 	@released
  4922 	*/
  4923 #ifndef __REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
  4924 	inline static TBool CreatorHasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic=0);
  4925 #else //__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
  4926 	// Only available to NULL arguments
  4927 	inline static TBool CreatorHasCapability(TCapability aCapability1, TCapability aCapability2, OnlyCreateWithNull aDiagnostic=NULL);
  4928 #ifndef __REMOVE_PLATSEC_DIAGNOSTICS__
  4929 	// For things using KSuppressPlatSecDiagnostic
  4930 	inline static TBool CreatorHasCapability(TCapability aCapability, TCapability aCapability2, OnlyCreateWithNull aDiagnostic, OnlyCreateWithNull aSuppress);
  4931 #endif // !__REMOVE_PLATSEC_DIAGNOSTICS__
  4932 #endif // !__REMOVE_PLATSEC_DIAGNOSTIC_STRINGS__
  4933 
  4934 	IMPORT_C static TInt ParameterLength(TInt aSlot);
  4935 	IMPORT_C static TInt GetTIntParameter(TInt aSlot, TInt& aData);
  4936 	IMPORT_C static TInt GetDesParameter(TInt aSlot, TDes8& aDes);
  4937 	IMPORT_C static TInt GetDesParameter(TInt aSlot, TDes16& aDes);
  4938 	IMPORT_C static TInt RenameThread(const TDesC &aName);
  4939 	IMPORT_C static TInt RenameProcess(const TDesC &aName);
  4940 	/*
  4941 	User::Identity() has been deprecated and is available for backward
  4942 	compatibility purposes only.
  4943 
  4944 	Use RProcess().SecureId() instead.
  4945     
  4946 	@deprecated
  4947 	*/
  4948 	inline static TUid Identity() { return RProcess().SecureId(); }
  4949 
  4950 	/*
  4951 	User::CreatorIdentity() has been deprecated and is available for backward
  4952 	compatibility purposes only.
  4953 
  4954 	Use CreatorSecureId() instead.
  4955 	
  4956 	@deprecated
  4957 	*/
  4958 	static inline TUid CreatorIdentity() { return CreatorSecureId(); }
  4959 
  4960 	IMPORT_C static void NotifyOnIdle(TRequestStatus& aStatus);			/**< @internalTechnology */
  4961 	IMPORT_C static void CancelMiscNotifier(TRequestStatus& aStatus);	/**< @internalTechnology */
  4962 private:
  4963 	// Implementations of functions with diagnostics
  4964 	IMPORT_C static TBool DoCreatorHasCapability(TCapability aCapability, const char* aDiagnostic);
  4965 	IMPORT_C static TBool DoCreatorHasCapability(TCapability aCapability);
  4966 	IMPORT_C static TBool DoCreatorHasCapability(TCapability aCapability1, TCapability aCapability2, const char* aDiagnostic);
  4967 	IMPORT_C static TBool DoCreatorHasCapability(TCapability aCapability1, TCapability aCapability2);
  4968 	};
  4969 
  4970 
  4971 
  4972 
  4973 class ExecHandler;
  4974 
  4975 /**
  4976 @internalComponent
  4977 @removed
  4978 */
  4979 typedef void (*TTlsCleanupHandler)(TAny*);		//don't use
  4980 
  4981 /**
  4982 @publishedAll
  4983 @released
  4984 
  4985 A collection of static functions involved in managing access to
  4986 thread-local storage. 
  4987 
  4988 Thread-local storage is a single machine word of static writable memory.
  4989 The scope of this machine word is the thread, which means that there is one
  4990 word per thread. The word is only accessible to code running in a DLL.
  4991 
  4992 In practice, this word is almost always used to hold a pointer to allocated
  4993 memory; this makes that memory available to all DLL code running on behalf
  4994 of the same thread.
  4995 
  4996 Note that DLL code running on behalf of one thread does not see the same word when
  4997 running on behalf of another thread. 
  4998 
  4999 The class in not intended for user derivation.
  5000 */
  5001 class Dll
  5002 	{
  5003 public:
  5004 	static TInt SetTls(TAny* aPtr);
  5005 	static TAny* Tls();
  5006 	static void FreeTls();
  5007 	static void FileName(TFileName &aFileName);
  5008 	};
  5009 
  5010 
  5011 
  5012 
  5013 #ifndef __TOOLS__
  5014 /**
  5015 @publishedAll
  5016 @released
  5017 
  5018 A thin wrapper class for C++ arrays allowing automatic checking of index values 
  5019 to ensure that all accesses are legal. 
  5020 
  5021 The class also supports the deletion of objects.
  5022 
  5023 The class is templated, based on a class type and an integer value. The class 
  5024 type defines the type of object contained in the array; the integer value 
  5025 defines the size (dimension) of the array.
  5026 
  5027 A wrapper object can be:
  5028 
  5029 1. embedded in objects allocated on the heap.
  5030 
  5031 2. used on the program stack.
  5032 */
  5033 template <class T,TInt S> 
  5034 class TFixedArray
  5035 	{
  5036 	typedef TFixedArray<T,S> ThisClass;
  5037 public:
  5038 	inline TFixedArray();
  5039 	inline TFixedArray(const T* aList, TInt aLength);
  5040 	//
  5041 	inline void Copy(const T* aList, TInt aLength);
  5042 	inline void Reset();		// zero fill
  5043 	inline void DeleteAll();
  5044 	//
  5045 	inline TInt Count() const;
  5046 	inline TInt Length() const;
  5047 	// Accessors - debug range checking
  5048 	inline T& operator[](TInt aIndex);
  5049 	inline const T& operator[] (TInt aIndex) const;
  5050 	// Accessors - always range checking
  5051 	inline T& At(TInt aIndex);
  5052 	inline const T& At(TInt aIndex) const;
  5053 	// Provides pointers to the beginning and end of the array
  5054 	inline T* Begin();
  5055 	inline T* End();
  5056 	inline const T* Begin() const;
  5057 	inline const T* End() const;
  5058 	//
  5059 	inline TArray<T> Array() const;
  5060 protected:
  5061 	inline static TBool InRange(TInt aIndex);
  5062 	inline static TInt CountFunctionR(const CBase* aThis);
  5063 	inline static const TAny* AtFunctionR(const CBase* aThis,TInt aIndex);
  5064 protected:
  5065 	T iRep[S];
  5066 	};
  5067 
  5068 
  5069 
  5070 
  5071 /**
  5072 @publishedAll
  5073 @released
  5074 */
  5075 #define DECLARE_ROM_ARRAY( AName, AData, AType ) \
  5076    	const TFixedArray<AType,(sizeof(AData)/sizeof((AData)[0]))>& \
  5077             AName = *(reinterpret_cast<const TFixedArray<AType, \
  5078                            (sizeof(AData)/sizeof((AData)[0]))>* > (AData))
  5079 #endif
  5080 
  5081 // Global leaving operator new
  5082 /**
  5083 @publishedAll
  5084 @released
  5085 */
  5086 inline TAny* operator new(TUint aSize, TLeave);
  5087 /**
  5088 @publishedAll
  5089 @released
  5090 */
  5091 inline TAny* operator new(TUint aSize, TLeave, TUint aExtraSize);
  5092 #if !defined(__VC32__) || defined (__MSVCDOTNET__)
  5093 /**
  5094 @publishedAll
  5095 @released
  5096 */
  5097 inline TAny* operator new[](TUint aSize, TLeave);
  5098 #endif
  5099 
  5100 
  5101 #ifdef __LEAVE_EQUALS_THROW__
  5102 /** Macro to assert in all builds that code does not leave
  5103 
  5104 @param	_s	C++ statements to be executed which should not leave
  5105 @panic	USER 194 if the code being checked does leave
  5106 
  5107 @publishedAll
  5108 @released
  5109 */
  5110 #define	__ASSERT_ALWAYS_NO_LEAVE(_s)	\
  5111 	{														\
  5112 	try	{													\
  5113 		TTrapHandler* ____t = User::MarkCleanupStack();		\
  5114 		_s;													\
  5115 		User::UnMarkCleanupStack(____t);					\
  5116 		}													\
  5117 	catch (XLeaveException& /*l*/)							\
  5118 		{													\
  5119 		User::PanicUnexpectedLeave();						\
  5120 		}													\
  5121 	catch (...)												\
  5122 		{													\
  5123 		User::Invariant();									\
  5124 		}													\
  5125 	}
  5126 
  5127 #else
  5128 /** Macro to assert in all builds that code does not leave
  5129 
  5130 @param	_s	C++ statements to be executed which should not leave
  5131 @panic	USER 194 if the code being checked does leave
  5132 
  5133 @publishedAll
  5134 @released
  5135 */
  5136 #define	__ASSERT_ALWAYS_NO_LEAVE(_s)	\
  5137 	{									\
  5138 	TInt _r;							\
  5139 	TTrap _t;							\
  5140 	if (_t.Trap(_r) == 0)				\
  5141 		{								\
  5142 		_s;								\
  5143 		TTrap::UnTrap();				\
  5144 		}								\
  5145 	else								\
  5146 		User::PanicUnexpectedLeave();	\
  5147 	}
  5148 #endif
  5149 
  5150 /** Macro to assert in debug builds that code does not leave
  5151 
  5152 @param	_s	C++ statements to be executed which should not leave
  5153 @panic	USER 194 if the code being checked does leave
  5154 
  5155 @publishedAll
  5156 @released
  5157 */
  5158 #ifdef _DEBUG
  5159 #define	__ASSERT_DEBUG_NO_LEAVE(_s)		__ASSERT_ALWAYS_NO_LEAVE(_s)
  5160 #else
  5161 #define	__ASSERT_DEBUG_NO_LEAVE(_s)		{ _s; }
  5162 #endif
  5163 
  5164 
  5165 
  5166 // Inline methods
  5167 #include <e32std.inl>
  5168 
  5169 #endif