kernel/eka/euser/us_func.cpp
changeset 0 a41df078684a
equal deleted inserted replaced
-1:000000000000 0:a41df078684a
       
     1 // Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of the License "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // e32\euser\us_func.cpp
       
    15 // 
       
    16 //
       
    17 
       
    18 #include "us_std.h"
       
    19 //#define __DEBUG_IMAGE__ 1
       
    20 #if defined(__DEBUG_IMAGE__) && defined (__EPOC32__)
       
    21 #include "e32svr.h" 
       
    22 #define __IF_DEBUG(t) {RDebug debug;debug.t;}
       
    23 #else
       
    24 #define __IF_DEBUG(t)
       
    25 #endif
       
    26 #ifdef _UNICODE
       
    27 #include <collate.h>
       
    28 #include "CompareImp.h"
       
    29 #endif
       
    30 
       
    31 #include "us_data.h"
       
    32 
       
    33 typedef union
       
    34 	{
       
    35 	TAny *tany;
       
    36 	TText8 *ttext8;
       
    37 	TText16 *ttext16;
       
    38 	TDesC8 *tdesc8;
       
    39 	TDesC16 *tdesc16;
       
    40 	TInt8 *tint8;
       
    41 	TInt16 *tint16;
       
    42 	TInt32 *tint32;
       
    43 	TInt64 *tint64;
       
    44 	TInt *tint;
       
    45 	TUint8 *tuint8;
       
    46 	TUint16 *tuint16;
       
    47 	TUint32 *tuint32;
       
    48 	TUint *tuint;
       
    49 	} UPTR;
       
    50 
       
    51 const TUint crcTab[256] =
       
    52     {
       
    53 	0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,0x8108,0x9129,0xa14a,
       
    54 	0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,
       
    55 	0x72f7,0x62d6,0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3de,0x2462,
       
    56 	0x3443,0x0420,0x1401,0x64e6,0x74c7,0x44a4,0x5485,0xa56a,0xb54b,0x8528,0x9509,
       
    57 	0xe5ee,0xf5cf,0xc5ac,0xd58d,0x3653,0x2672,0x1611,0x0630,0x76d7,0x66f6,0x5695,
       
    58 	0x46b4,0xb75b,0xa77a,0x9719,0x8738,0xf7df,0xe7fe,0xd79d,0xc7bc,0x48c4,0x58e5,
       
    59 	0x6886,0x78a7,0x0840,0x1861,0x2802,0x3823,0xc9cc,0xd9ed,0xe98e,0xf9af,0x8948,
       
    60 	0x9969,0xa90a,0xb92b,0x5af5,0x4ad4,0x7ab7,0x6a96,0x1a71,0x0a50,0x3a33,0x2a12,
       
    61 	0xdbfd,0xcbdc,0xfbbf,0xeb9e,0x9b79,0x8b58,0xbb3b,0xab1a,0x6ca6,0x7c87,0x4ce4,
       
    62 	0x5cc5,0x2c22,0x3c03,0x0c60,0x1c41,0xedae,0xfd8f,0xcdec,0xddcd,0xad2a,0xbd0b,
       
    63 	0x8d68,0x9d49,0x7e97,0x6eb6,0x5ed5,0x4ef4,0x3e13,0x2e32,0x1e51,0x0e70,0xff9f,
       
    64 	0xefbe,0xdfdd,0xcffc,0xbf1b,0xaf3a,0x9f59,0x8f78,0x9188,0x81a9,0xb1ca,0xa1eb,
       
    65 	0xd10c,0xc12d,0xf14e,0xe16f,0x1080,0x00a1,0x30c2,0x20e3,0x5004,0x4025,0x7046,
       
    66 	0x6067,0x83b9,0x9398,0xa3fb,0xb3da,0xc33d,0xd31c,0xe37f,0xf35e,0x02b1,0x1290,
       
    67 	0x22f3,0x32d2,0x4235,0x5214,0x6277,0x7256,0xb5ea,0xa5cb,0x95a8,0x8589,0xf56e,
       
    68 	0xe54f,0xd52c,0xc50d,0x34e2,0x24c3,0x14a0,0x0481,0x7466,0x6447,0x5424,0x4405,
       
    69 	0xa7db,0xb7fa,0x8799,0x97b8,0xe75f,0xf77e,0xc71d,0xd73c,0x26d3,0x36f2,0x0691,
       
    70 	0x16b0,0x6657,0x7676,0x4615,0x5634,0xd94c,0xc96d,0xf90e,0xe92f,0x99c8,0x89e9,
       
    71 	0xb98a,0xa9ab,0x5844,0x4865,0x7806,0x6827,0x18c0,0x08e1,0x3882,0x28a3,0xcb7d,
       
    72 	0xdb5c,0xeb3f,0xfb1e,0x8bf9,0x9bd8,0xabbb,0xbb9a,0x4a75,0x5a54,0x6a37,0x7a16,
       
    73 	0x0af1,0x1ad0,0x2ab3,0x3a92,0xfd2e,0xed0f,0xdd6c,0xcd4d,0xbdaa,0xad8b,0x9de8,
       
    74 	0x8dc9,0x7c26,0x6c07,0x5c64,0x4c45,0x3ca2,0x2c83,0x1ce0,0x0cc1,0xef1f,0xff3e,
       
    75 	0xcf5d,0xdf7c,0xaf9b,0xbfba,0x8fd9,0x9ff8,0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,
       
    76 	0x3eb2,0x0ed1,0x1ef0
       
    77     };
       
    78 
       
    79 const TInt KQDepth=150; // Maximum queue depth
       
    80 
       
    81 LOCAL_C TUint checkSum(const TAny *aPtr)
       
    82 //
       
    83 // Checksum every other byte
       
    84 //
       
    85 	{
       
    86 
       
    87 	const TUint8* pB=(const TUint8*)aPtr;
       
    88 	const TUint8* pE=pB+(KMaxCheckedUid*sizeof(TUid));
       
    89 	TUint8 buf[(KMaxCheckedUid*sizeof(TUid))>>1];
       
    90 	TUint8* pT=(&buf[0]);
       
    91 	while (pB<pE)
       
    92 		{
       
    93 		*pT++=(*pB);
       
    94 		pB+=2;
       
    95 		}
       
    96 	TUint16 crc=0;
       
    97 	Mem::Crc(crc,&buf[0],(KMaxCheckedUid*sizeof(TUid))>>1);
       
    98 	return(crc);
       
    99 	}
       
   100 	
       
   101 LOCAL_C TInt partit(TInt n,TInt m,const TKey &aKey,const TSwap &aSwap)
       
   102 //
       
   103 // Partition n elements of array stating from element m, 
       
   104 // return element no. of partition point. 
       
   105 //
       
   106 	{
       
   107 
       
   108 	TInt i=m-1;
       
   109 	TInt j=i+n;
       
   110 	TInt pivlin=j;
       
   111 	aSwap.Swap((j+m)>>1,j);
       
   112 	while (i<j) 
       
   113 		{
       
   114 		for (i++;aKey.Compare(i,pivlin)<0;i++)
       
   115 			{
       
   116 			}
       
   117 		for (--j;j>i;j--)
       
   118 			{
       
   119 			if (aKey.Compare(j,pivlin)<=0)
       
   120 				break;
       
   121 			}
       
   122 		if (i<j)
       
   123 			aSwap.Swap(i,j);
       
   124 		}
       
   125 	aSwap.Swap(i,m+n-1);
       
   126 	return(i);
       
   127 	}
       
   128 
       
   129 static const TCollationMethod TheCollationMethod[] =
       
   130 	{
       
   131 		{
       
   132 		KUidBasicCollationMethod,				// this is the standard unlocalised method
       
   133 		NULL,									// null means use the standard table
       
   134 		NULL,									// there's no override table
       
   135 		0										// the flags are standard
       
   136 		}
       
   137 	};
       
   138 
       
   139 static const TCollationDataSet TheCollationDataSet =
       
   140 	{
       
   141 	TheCollationMethod,
       
   142 	1
       
   143 	};
       
   144 
       
   145 // The one and only locale character set object.
       
   146 const LCharSet TheCharSet =
       
   147 	{
       
   148 	NULL,
       
   149 	&TheCollationDataSet
       
   150 	};
       
   151 
       
   152 const LCharSet* GetLocaleDefaultCharSet()
       
   153 	{
       
   154 	return &TheCharSet;
       
   155 	}
       
   156 
       
   157 const LCharSet* GetLocaleCharSet()
       
   158 	{
       
   159 	const LCharSet* charSet = (const LCharSet*)Exec::GetGlobalUserData(ELocaleDefaultCharSet);
       
   160 	if(charSet)
       
   161 		return charSet;
       
   162 	return &TheCharSet;
       
   163 	}
       
   164 
       
   165 const LCharSet* GetLocalePreferredCharSet()
       
   166 	{
       
   167 	const LCharSet* charSet = (const LCharSet*)Exec::GetGlobalUserData(ELocalePreferredCharSet);
       
   168 	if(charSet)
       
   169 		return charSet;
       
   170 	return &TheCharSet;
       
   171 	}
       
   172 
       
   173 EXPORT_C TCollationMethod TExtendedLocale::GetPreferredCollationMethod(TInt aIndex)
       
   174 /**
       
   175 Get the preferred collation method for the preferred charset.
       
   176 
       
   177 Note that some charsets may contain more than one collation
       
   178 method (e.g "dictionary" v "phonebook" ordering) so an optional
       
   179 index parameter can be used to select between them.
       
   180 
       
   181 @param aIndex Optional parameter specifying the index of the collation 
       
   182               method in the locale to get. This is the responsibility of 
       
   183 			  the caller to make sure that the index is less than the total 
       
   184 			  number of collation methods in the preferred charset in this locale.
       
   185 
       
   186 @return TCollationMethod representing the requested collation method.
       
   187 
       
   188 @panic USER 185 In both debug and release builds, if either the current charset 
       
   189        is not set up or aIndex is greater than or equal to the total number of 
       
   190 	   collation methods in the preferred charset in this locale.
       
   191 
       
   192 @see TCollationMethod
       
   193 */
       
   194 	{
       
   195 	__ASSERT_ALWAYS(iPreferredCharSet && (TUint(aIndex)<=TUint(iPreferredCharSet->iCollationDataSet->iMethods)), Panic(EBadLocaleParameter));
       
   196 	return iPreferredCharSet->iCollationDataSet->iMethod[aIndex];
       
   197 	}
       
   198 
       
   199 extern const TUint8 __FoldCollTab8[256];
       
   200 
       
   201 EXPORT_C TInt Mem::CompareF(const TUint8 *aLeft,TInt aLeftL,const TUint8 *aRight,TInt aRightL)
       
   202 /**
       
   203 Compares a block of data at one specified location with a block of data at 
       
   204 another specified location, using the standard folding method appropriate 
       
   205 to the current locale.
       
   206 
       
   207 @param aLeft   A pointer to the first (or left) block of 8 bit data to be
       
   208                compared.
       
   209 @param aLeftL  The length of the first (or left) block of data to be compared, 
       
   210                i.e. the number of bytes.
       
   211 @param aRight  A pointer to the second (or right) block of 8 bit data to be 
       
   212                compared.
       
   213 @param aRightL The length of the second (or right) block of data to be
       
   214                compared, i.e. the number of bytes.
       
   215 
       
   216 @return Positive, if the first (or left) block of data is greater than the 
       
   217         second (or right) block of data.
       
   218         Negative, if the first (or left) block of data is less than the second
       
   219         (or right) block of data.
       
   220         Zero, if both the first (or left) and second (or right) blocks of data
       
   221         have the same length and the same content. 
       
   222         
       
   223 @see Mem::Compare
       
   224 */
       
   225 	{
       
   226 
       
   227 	__ASSERT_DEBUG(aLeftL>=0,Panic(EMemLeftNegative));
       
   228 	__ASSERT_DEBUG(aRightL>=0,Panic(EMemRightNegative));
       
   229 	const TUint8 *pE=aLeft+Min(aLeftL,aRightL);
       
   230 	const TUint8* table=__FoldCollTab8;
       
   231     while (aLeft<pE)
       
   232 		{
       
   233 		TUint l=*aLeft++;
       
   234 		TUint r=*aRight++;
       
   235 		l = table[l];
       
   236 		r = table[r];
       
   237 		TInt d=l-r;
       
   238 		if (d!=0)
       
   239 		    return(d);
       
   240 		}
       
   241     return(aLeftL-aRightL);
       
   242 	}
       
   243 
       
   244 
       
   245 
       
   246 
       
   247 EXPORT_C TInt Mem::CompareC(const TUint8 *aLeft,TInt aLeftL,const TUint8 *aRight,TInt aRightL)
       
   248 /**
       
   249 Compares a block of data at one specified location with a block of data at 
       
   250 another specified location using the standard collation method appropriate 
       
   251 to the current locale.
       
   252 
       
   253 @param aLeft   A pointer to the first (or left) block of 8 bit data to be
       
   254                compared.
       
   255 @param aLeftL  The length of the first (or left) block of data to be compared 
       
   256                i.e. the number of bytes.
       
   257 @param aRight  A pointer to the second (or right) block of 8 bit data to be 
       
   258                compared.
       
   259 @param aRightL The length of the second (or right) block of data to be compared 
       
   260                i.e. the number of bytes.
       
   261 
       
   262 @return Positive, if the first (or left) block of data is greater than the 
       
   263         second (or right) block of data.
       
   264         Negative, if the first (or left) block of data is less than the second
       
   265         (or right) block of data.
       
   266         Zero, if both the first (or left) and second (or right) blocks of data
       
   267         have the same length and the same content.
       
   268         
       
   269 @see Mem::Compare
       
   270 @deprecated
       
   271 */
       
   272 	{
       
   273 	return Mem::CompareF(aLeft, aLeftL, aRight, aRightL);
       
   274 	}
       
   275 
       
   276 
       
   277 
       
   278 
       
   279 EXPORT_C TInt Mem::Compare(const TUint16 *aLeft,TInt aLeftL,const TUint16 *aRight,TInt aRightL)
       
   280 /**
       
   281 Compares a block of data at one specified location with a block of data at 
       
   282 another specified location.
       
   283 
       
   284 The comparison proceeds on a double-byte for double-byte basis, the result 
       
   285 of the comparison is based on the difference of the first pair of bytes to 
       
   286 disagree.
       
   287 
       
   288 The data at the two locations are equal if they have the same length and content. 
       
   289 Where the lengths are different and the shorter section of data is the same 
       
   290 as the first part of the longer section of data, the shorter is considered 
       
   291 to be less than the longer.
       
   292 
       
   293 @param aLeft   A pointer to the first (or left) block of 16 bit data to be
       
   294                compared.
       
   295 @param aLeftL  The length of the first (or left) block of data to be compared 
       
   296                i.e. the number of double-bytes. 
       
   297 @param aRight  A pointer to the second (or right) block of 16 bit data to be 
       
   298                compared.
       
   299 @param aRightL The length of the second (or right) block of data to be compared 
       
   300                i.e. the number of double-bytes.
       
   301 
       
   302 @return Positive, if the first (or left) block of data is greater than the 
       
   303         second (or right) block of data.
       
   304         Negative, if the first (or left) block of data is less than the second
       
   305         (or right) block of data.
       
   306         Zero, if both the first (or left) and second (or right) blocks of data
       
   307         have the same length and the same content.
       
   308 */
       
   309 	{
       
   310 
       
   311 	__ASSERT_DEBUG(aLeftL>=0,Panic(EMemLeftNegative));
       
   312 	__ASSERT_DEBUG(aRightL>=0,Panic(EMemRightNegative));
       
   313 	const TUint16 *pE=aLeft+Min(aLeftL,aRightL);
       
   314     while (aLeft<pE)
       
   315 		{
       
   316 		TInt d=(*aLeft++)-(*aRight++);
       
   317 		if (d!=0)
       
   318 		    return(d);
       
   319 		}
       
   320     return(aLeftL-aRightL);
       
   321 	}
       
   322 
       
   323 
       
   324 
       
   325 
       
   326 EXPORT_C TInt Mem::CompareF(const TUint16 *aLeft,TInt aLeftL,const TUint16 *aRight,TInt aRightL)
       
   327 /**
       
   328 Compares a block of data at one specified location with a block of data at 
       
   329 another specified location, using the standard folding method appropriate 
       
   330 to the current locale.
       
   331 
       
   332 @param aLeft   A pointer to the first (or left) block of 16 bit data to be
       
   333                compared.
       
   334 @param aLeftL  The length of the first (or left) block of data to be compared 
       
   335                i.e. the number of double-bytes.
       
   336 @param aRight  A pointer to the second (or right) block of 16 bit data to be 
       
   337                compared.
       
   338 @param aRightL The length of the second (or right) block of data to be compared 
       
   339                i.e the number of double-bytes.
       
   340 
       
   341 @return Positive, if the first (or left) block of data is greater than the 
       
   342         second (or right) block of data.
       
   343         Negative, if the first (or left) block of data is less than the second
       
   344         (or right) block of data.
       
   345         Zero, if both the first (or left) and second (or right) blocks of data
       
   346         have the same length and the same content.
       
   347         
       
   348 @see Mem::Compare
       
   349 */
       
   350 	{
       
   351 	__ASSERT_DEBUG(aLeftL >= 0,Panic(EMemLeftNegative));
       
   352 	__ASSERT_DEBUG(aRightL >= 0,Panic(EMemRightNegative));
       
   353 
       
   354 	const TText16* aLeftEnd = aLeft + aLeftL;
       
   355 	const TText16* aRightEnd = aRight + aRightL;
       
   356 	
       
   357 	const TUint8* table=__FoldCollTab8;
       
   358 
       
   359 	while (aLeft != aLeftEnd)
       
   360 		{
       
   361 		if (aRight == aRightEnd)
       
   362 			return 1;
       
   363 
       
   364 		TUint l = *aLeft;
       
   365 		TUint r = *aRight;
       
   366 
       
   367 		// check if character is Ascii, if so treat as Ascii
       
   368 		if (l < 128 && r < 128)
       
   369 			{
       
   370 			l = table[l];
       
   371 			r = table[r];
       
   372 
       
   373 			if (r != l)
       
   374 				return l-r;
       
   375 			
       
   376 			aLeft++;
       
   377 			aRight++;
       
   378 			}
       
   379 		// covers Unicode characters...
       
   380 		else
       
   381 			{
       
   382 			TUTF32Iterator leftIt(aLeft, aLeftEnd);
       
   383 			TUTF32Iterator rightIt(aRight, aRightEnd);
       
   384 			return ::CompareFolded(leftIt, rightIt);
       
   385 			}
       
   386 		}
       
   387 
       
   388 	return aRight == aRightEnd? 0:-1;
       
   389 	}
       
   390 	
       
   391 
       
   392 
       
   393 
       
   394 
       
   395 EXPORT_C TInt Mem::CompareC(const TUint16 *aLeft,TInt aLeftL,const TUint16 *aRight,TInt aRightL)
       
   396 /**
       
   397 Compares a block of data at one specified location with a block of data at 
       
   398 another specified location using the standard collation method appropriate 
       
   399 to the current locale.
       
   400 
       
   401 @param aLeft   A pointer to the first (or left) block of 16 bit data to be
       
   402                compared.
       
   403 @param aLeftL  The length of the first (or left) block of data to be compared 
       
   404                i.e. the number of double-bytes).
       
   405 @param aRight  A pointer to the second (or right) block of 16 bit data to be 
       
   406                compared.
       
   407 @param aRightL The length of the second (or right) block of data to be compared 
       
   408                i.e. the number of double-bytes. 
       
   409                
       
   410 @return Positive, if the first (or left) block of data is greater than the 
       
   411         second (or right) block of data.
       
   412         Negative, if the first (or left) block of data is less than the second
       
   413         (or right) block of data.
       
   414         Zero, if both the first (or left) and second (or right) blocks of data
       
   415         have the same length and the same content. 
       
   416         
       
   417 @see Mem::Compare
       
   418 */
       
   419 	{
       
   420 	__ASSERT_DEBUG(aLeftL>=0,Panic(EMemLeftNegative));
       
   421 	__ASSERT_DEBUG(aRightL>=0,Panic(EMemRightNegative));
       
   422 #ifdef _UNICODE
       
   423 	TCollate c(GetLocaleCharSet());
       
   424 	return c.Compare(aLeft,aLeftL,aRight,aRightL);
       
   425 #else
       
   426 	const TUint16 *pE=aLeft+Min(aLeftL,aRightL);
       
   427     while (aLeft<pE)
       
   428 		{
       
   429 		TInt d=User::Collate(*aLeft++)-User::Collate(*aRight++);
       
   430 		if (d!=0)
       
   431 		    return(d);
       
   432 		}
       
   433     return(aLeftL-aRightL);
       
   434 #endif
       
   435 	}
       
   436 
       
   437 
       
   438 
       
   439 
       
   440 #ifdef _UNICODE
       
   441 EXPORT_C TInt Mem::CompareC(const TUint16* aLeft,TInt aLeftL,const TUint16* aRight,TInt aRightL,
       
   442 							TInt aMaxLevel,const TCollationMethod* aCollationMethod)
       
   443 /**
       
   444 Compares a block of data at one location with a block of data at another location 
       
   445 using the specified collation method and collating to the specified maximum 
       
   446 collation level.
       
   447 
       
   448 If no collation method is supplied, a default method, appropriate to the current 
       
   449 locale, is used.
       
   450 
       
   451 This function is only defined for 16 bit (Unicode) build variants. This means 
       
   452 that the function is not defined for 8 bit build variants, even when an explicit 
       
   453 16 bit descriptor is used.
       
   454 
       
   455 @param aLeft            A pointer to the first (or left) block of 16 bit data
       
   456                         to be compared.
       
   457 @param aLeftL           The length of the first (or left) block of data to be
       
   458                         compared. This is the number of double-bytes. 
       
   459 @param aRight           A pointer to the second (or right) block of 16 bit data
       
   460                         to be compared.
       
   461 @param aRightL          The length of the second (or right) block of data to be
       
   462                         compared. This is the number of double-bytes. 
       
   463 @param aMaxLevel        The maximum collation level. 
       
   464 @param aCollationMethod A pointer to the collation method or NULL. 
       
   465 
       
   466 @return Positive, if this descriptor is greater than the specified descriptor. 
       
   467         Negative, if this descriptor is less than the specified descriptor.
       
   468         Zero, if both descriptors have the same length and their contents
       
   469         are the same.
       
   470 */
       
   471 	{
       
   472 	__ASSERT_DEBUG(aLeftL>=0,Panic(EMemLeftNegative));
       
   473 	__ASSERT_DEBUG(aRightL>=0,Panic(EMemRightNegative));
       
   474 	if (aCollationMethod == NULL)
       
   475 		{
       
   476 		TCollate c(GetLocaleCharSet());
       
   477 		return c.Compare(aLeft,aLeftL,aRight,aRightL,aMaxLevel);
       
   478 		}
       
   479 	else
       
   480 		{
       
   481 		TCollate c(*aCollationMethod);
       
   482 		return c.Compare(aLeft,aLeftL,aRight,aRightL,aMaxLevel);
       
   483 		}
       
   484 	}
       
   485 #endif
       
   486 
       
   487 
       
   488 
       
   489 
       
   490 #ifdef _UNICODE
       
   491 EXPORT_C TInt Mem::CollationMethods()
       
   492 /**
       
   493 Gets the number of collation methods in this locale.
       
   494 
       
   495 This function is only defined for 16 bit (Unicode) build variants. This means 
       
   496 that the function is not defined for 8 bit build variants, even when an
       
   497 explicit 16 bit descriptor is used.
       
   498 
       
   499 @return The number of collation methods.
       
   500 */
       
   501 	{
       
   502 	return GetLocaleCharSet()->iCollationDataSet->iMethods;
       
   503 	}
       
   504 #endif
       
   505 
       
   506 
       
   507 
       
   508 
       
   509 #ifdef _UNICODE
       
   510 EXPORT_C TUint Mem::CollationMethodId(TInt aIndex)
       
   511 /**
       
   512 Gets the Uid associated with the specified collation method.
       
   513 
       
   514 This function is only defined for 16 bit (Unicode) build variants. This means 
       
   515 that the function is not defined for 8 bit build variants, even when an
       
   516 explicit 16 bit descriptor is used.
       
   517 
       
   518 @param aIndex An index into the set of collation methods in thie locale. This 
       
   519               value is relative to zero; i.e. a zero value refers to the first
       
   520               collation method. This value must not be negative, and must be
       
   521               less than the total number of collation methods in this locale.
       
   522 
       
   523 @return The Uid of the collation method.
       
   524 
       
   525 @panic USER 132 In debug builds only, if aIndex is negative or is greater than
       
   526        or equal to the total number of collation methods in this locale.
       
   527 */
       
   528 	{
       
   529 	const TCollationDataSet* s = GetLocaleCharSet()->iCollationDataSet;
       
   530 	__ASSERT_DEBUG(aIndex >= 0 && aIndex < s->iMethods,Panic(EBadCollationRulesIndex));
       
   531 	return s->iMethod[aIndex].iId;
       
   532 	}
       
   533 #endif
       
   534 
       
   535 
       
   536 
       
   537 
       
   538 #ifdef _UNICODE
       
   539 EXPORT_C const TCollationMethod* Mem::CollationMethodByIndex(TInt aIndex)
       
   540 /**
       
   541 Gets the collation method identified by the specified index.
       
   542 
       
   543 This function is only defined for 16 bit (Unicode) build variants. This means 
       
   544 that the function is not defined for 8 bit build variants, even when an
       
   545 explicit 16 bit descriptor is used.
       
   546 
       
   547 @param aIndex An index into the set of collation methods in this locale. This 
       
   548               value is relative to zero; i.e. a zero value refers to the first
       
   549               collation method. This value must not be negative, and must be
       
   550               less than the total number of collation methods in this locale.
       
   551               
       
   552 @return A pointer to the collation method.
       
   553 
       
   554 @panic USER 132 In debug builds only, if aIndex is negative or is greater than
       
   555        or equal to the total number of collation methods in this locale.
       
   556 */
       
   557 	{
       
   558 	const TCollationDataSet* s = GetLocaleCharSet()->iCollationDataSet;
       
   559 	__ASSERT_DEBUG(aIndex >= 0 && aIndex < s->iMethods,Panic(EBadCollationRulesIndex));
       
   560 	return &s->iMethod[aIndex];
       
   561 	}
       
   562 #endif
       
   563 
       
   564 
       
   565 
       
   566 
       
   567 #ifdef _UNICODE
       
   568 EXPORT_C const TCollationMethod* Mem::CollationMethodById(TUint aId)
       
   569 /**
       
   570 Gets the collation method identified by the specified Uid.
       
   571 
       
   572 This function is only defined for 16 bit (Unicode) build variants. This means 
       
   573 that the function is not defined for 8 bit build variants, even when an
       
   574 explicit 16 bit descriptor is used.
       
   575 
       
   576 @param aId The Uid of a collation method in the set of collation methods in 
       
   577            this locale. 
       
   578            
       
   579 @return A pointer to the collation method.
       
   580 */
       
   581 	{
       
   582 	const TCollationDataSet* set = GetLocaleCharSet()->iCollationDataSet;
       
   583 	const TCollationMethod* method = set->iMethod;
       
   584 	const TCollationMethod* m = method;
       
   585 	int methods = set->iMethods;
       
   586 	for (int i = 0; i < methods; i++, m++)
       
   587 		if (m->iId == aId)
       
   588 			{
       
   589 			method = m;
       
   590 			break;
       
   591 			}
       
   592 	return method;
       
   593 	}
       
   594 #endif
       
   595 
       
   596 #ifdef _UNICODE
       
   597 EXPORT_C const TCollationMethod* Mem::GetDefaultMatchingTable()
       
   598 /**
       
   599 Gets the collation method specific for matching purpose.
       
   600 
       
   601 This function is only defined for 16 bit (Unicode) build variants. This means 
       
   602 that the function is not defined for 8 bit build variants, even when an
       
   603 explicit 16 bit descriptor is used.
       
   604 
       
   605 @return A pointer to the collation method
       
   606 */
       
   607 	{
       
   608 	const TCollationDataSet* set=GetLocaleCharSet()->iCollationDataSet;
       
   609 	const TCollationMethod* method=set->iMethod;
       
   610 	const TCollationMethod* m= method;
       
   611 	int methods = set->iMethods;
       
   612 	for (; methods-->0; m++)
       
   613 		if (m->iFlags & TCollationMethod::EMatchingTable)
       
   614 			{
       
   615 			method=m;
       
   616 			break;
       
   617 			}
       
   618 	return method;
       
   619 	}
       
   620 #endif
       
   621 
       
   622 
       
   623 #if !defined(__MEM_MACHINE_CODED__)
       
   624 EXPORT_C void Mem::Swap(TAny *aPtr1,TAny *aPtr2,TInt aLength)
       
   625 /**
       
   626 Swaps a number of bytes of data between two specified locations.
       
   627 
       
   628 The source and target areas can overlap.
       
   629 
       
   630 @param aPtr1   A pointer to the first location taking part in the swap. 
       
   631 @param aPtr2   A pointer to second location taking part in the swap. 
       
   632 @param aLength The number of bytes to be swapped between the two locations. 
       
   633                This value must not be negative.
       
   634 
       
   635 @panic USER 94 In debug builds only, if aLength is negative.
       
   636 */
       
   637 	{
       
   638 
       
   639 	__ASSERT_DEBUG(aLength>=0,Panic(EMemSwapLengthNegative));
       
   640 	if (aPtr1==aPtr2)
       
   641 		return;
       
   642 	TUint8 *pT=(TUint8 *)aPtr1;
       
   643 	TUint8 *pE=pT+aLength;
       
   644 	TUint8 *pS=(TUint8 *)aPtr2;
       
   645 	while (pT<pE)
       
   646 		{
       
   647 		TUint b=(*pT);
       
   648 		*pT++=(*pS);
       
   649 		*pS++=(TUint8)b;
       
   650 		}
       
   651 	}
       
   652 #endif
       
   653 
       
   654 
       
   655 
       
   656 
       
   657 EXPORT_C void Mem::Crc(TUint16& aCrc,const TAny* aPtr,TInt aLength)
       
   658 /**
       
   659 Performs a CCITT CRC checksum on the specified data.
       
   660 
       
   661 On return from this function, the referenced 16 bit integer contains the checksummed 
       
   662 value.
       
   663 
       
   664 @param aCrc    A reference to a 16 bit integer to contain the checksummed value. 
       
   665 @param aPtr    A pointer to the start of the data to be checksummed. 
       
   666 @param aLength The length of the data to be checksummed.
       
   667 */
       
   668 	{
       
   669 
       
   670 	const TUint8* pB=(const TUint8*)aPtr;
       
   671 	const TUint8* pE=pB+aLength;
       
   672 	TUint crc=aCrc;
       
   673     while (pB<pE)
       
   674 		crc=(crc<<8)^crcTab[((crc>>8)^*pB++)&0xff];
       
   675 	aCrc=(TUint16)crc;
       
   676 	}
       
   677 
       
   678 
       
   679 
       
   680 
       
   681 EXPORT_C TInt User::StringLength(const TUint8 *aString)
       
   682 /**
       
   683 Gets the length of a C style, null terminated, string of single-byte valued 
       
   684 characters.
       
   685 
       
   686 The length does not include the null terminator.
       
   687 
       
   688 @param aString A pointer to the single byte valued, null terminated, string.
       
   689 
       
   690 @return The length of the string.
       
   691 */
       
   692 	{
       
   693 
       
   694 	const TUint8 *pS=aString;
       
   695 	while (*pS)
       
   696 		pS++;
       
   697 	return(pS-aString);
       
   698 	}
       
   699 
       
   700 
       
   701 
       
   702 
       
   703 EXPORT_C TInt User::StringLength(const TUint16 *aString)
       
   704 /**
       
   705 Gets the length of a C style, null terminated, string of double-byte valued 
       
   706 characters.
       
   707 
       
   708 The length does not include the null terminator.
       
   709 
       
   710 @param aString A pointer to the double-byte valued, null terminated, string.
       
   711 
       
   712 @return The length of the string.
       
   713 */
       
   714 	{
       
   715 
       
   716 	const TUint16 *pS=aString;
       
   717 	while (*pS)
       
   718 		pS++;
       
   719 	return(pS-aString);
       
   720 	}
       
   721 
       
   722 
       
   723 
       
   724 
       
   725 EXPORT_C void User::Panic(const TDesC &aCategory,TInt aReason)
       
   726 /**
       
   727 Panics the current thread, specifying a category name and panic number.
       
   728 
       
   729 Keep the length of the category name small; it is limited to 16 characters.
       
   730 
       
   731 @param aCategory A reference to the descriptor containing the text that defines 
       
   732                  the category for this panic.
       
   733 @param aReason   The panic number.
       
   734 */
       
   735 	{
       
   736 
       
   737 	__IF_DEBUG(Print(_L("User::Panic %S %d\n"),&aCategory,aReason));
       
   738 	TPtrC cat16(aCategory.Ptr(),Min(KMaxExitCategoryName,aCategory.Length()));
       
   739 	TBuf8<KMaxExitCategoryName> cat;
       
   740 	cat.Copy(cat16);
       
   741 	ExitCurrentThread(EExitPanic,aReason,&cat);
       
   742 	}
       
   743 
       
   744 
       
   745 
       
   746 
       
   747 void CallStaticEntryPoints(TBool aInit)
       
   748 	{
       
   749 	TLinAddr ep[KMaxLibraryEntryPoints];
       
   750 	TInt numEps=KMaxLibraryEntryPoints;
       
   751 	TInt r=E32Loader::StaticCallList(numEps, ep);
       
   752 	if (r!=KErrNone)
       
   753 		return;
       
   754 	if (aInit)
       
   755 		{
       
   756 		for (TInt i=0; i<numEps-1; ++i)	// last EP is always process entry point
       
   757 			{
       
   758 			TLibraryEntry f=(TLibraryEntry)ep[i];
       
   759 			(*f)(KModuleEntryReasonProcessAttach);
       
   760 			}
       
   761 		}
       
   762 	else
       
   763 		{
       
   764 		for (TInt i=numEps-2; i>=0; --i)	// last EP is always process entry point
       
   765 			{
       
   766 			TLibraryEntry f=(TLibraryEntry)ep[i];
       
   767 			(*f)(KModuleEntryReasonProcessDetach);
       
   768 			}
       
   769 		}
       
   770 	}
       
   771 
       
   772 
       
   773 
       
   774 
       
   775 EXPORT_C void User::InitProcess()
       
   776 /**
       
   777 @internalAll
       
   778 */
       
   779 	{
       
   780 	CallStaticEntryPoints(ETrue);
       
   781 	}
       
   782 
       
   783 
       
   784 
       
   785 
       
   786 EXPORT_C void User::Exit(TInt aReason)
       
   787 /**
       
   788 Terminates the current thread, specifying a reason.
       
   789 All child threads are terminated and all resources are cleaned up.
       
   790 
       
   791 If the current thread is the main thread in a process, the process is also 
       
   792 terminated.
       
   793 
       
   794 @param aReason The reason code.
       
   795 */
       
   796 	{
       
   797 	// Notify kernel that thread is exiting
       
   798 	TBool lastThread = Exec::UserThreadExiting(aReason);
       
   799 	if (lastThread)
       
   800 		{
       
   801 		// Call global destructors if we're the last thread in the process
       
   802 		TGlobalDestructorFunc func = (TGlobalDestructorFunc)UserSvr::DllTls(KGlobalDestructorTlsKey, KDllUid_Special);
       
   803 		if (func)
       
   804 			{
       
   805 			func();
       
   806 			CallStaticEntryPoints(EFalse);
       
   807 			}
       
   808 		}
       
   809 	
       
   810 	FOREVER
       
   811 		{
       
   812 		TInt h=Exec::LastThreadHandle();
       
   813 		if (h==0)
       
   814 			break;
       
   815 		if (Exec::HandleClose(h)>0)
       
   816 			RHandleBase::DoExtendedClose();
       
   817 		}
       
   818 
       
   819 #ifdef __USERSIDE_THREAD_DATA__
       
   820 	LocalThreadData()->Close();
       
   821 #endif
       
   822 	
       
   823 	ExitCurrentThread(EExitKill,aReason,NULL);
       
   824 	}
       
   825 
       
   826 
       
   827 
       
   828 
       
   829 EXPORT_C TInt User::QuickSort(TInt aCount,const TKey &aKey,const TSwap &aSwap)
       
   830 //
       
   831 // Routine sorts a set of records into the order defined by the key aKey.
       
   832 // There are aCount records to sort, each record is numbered, the first is
       
   833 // record 0, the last record aCount-1.
       
   834 // Each time the quicksort algorithm needs to compare two records it calls
       
   835 //     aKey.Compare(TInt n,TInt m).
       
   836 // where n and m (both type TUint) are the record no.s of the two records to compare.
       
   837 // The compare routine should return
       
   838 //     >0 if record(n) > record(m)
       
   839 //      0 if record(n) == record(m)
       
   840 //     <0 if record(n) < record(m)
       
   841 // Each time the quicksort algorithm needs to exchange two records it calls
       
   842 //     aSwap.Swap(n,m)
       
   843 // where n and m (both type TUint) are the record numbers of the two records to 
       
   844 // exchange.
       
   845 // The swap routine should exchange the positions of records n and m so that
       
   846 // the value of record m becomes the former value of record n and visa versa.
       
   847 //
       
   848 /**
       
   849 Quick sorts array elements.
       
   850 
       
   851 It is used by the standard Symbian OS arrays having 
       
   852 CArrayFixBase, CArrayVarBase or CArrayPakBase in their class hierarchy in 
       
   853 the implementation of their sort functions. The function can be used by other 
       
   854 arrays. 
       
   855 
       
   856 The function returns KErrNone if the operation is successful otherwise it 
       
   857 returns KErrGeneral.
       
   858 
       
   859 @param aCount The number of elements in the array.
       
   860 @param aKey   A reference to a suitably initialised TKey derived object.
       
   861 @param aSwap  A reference to a suitably initialised TSwap derived object.
       
   862 
       
   863 @return KErrNone if the operation is successful; KErrGeneral otherwise.
       
   864 
       
   865 @panic USER 96, if aCount is negative.
       
   866 */
       
   867 	{
       
   868 	TInt *parts_sp; // Stack pointer for partitions todo
       
   869 	TInt m; // First element of partition
       
   870 	TInt n; // No. of elements in partition
       
   871 	TInt d1,d2; // Temporary variables
       
   872 	TInt division_point; // Seperation point of partitions
       
   873 	TInt parts_todo[KQDepth]; // Stack pairs are <n,base>
       
   874 
       
   875 	__ASSERT_ALWAYS(aCount>=0,::Panic(ESortCountNegative));
       
   876 	if (aCount<=1) 
       
   877 		return(KErrNone); // Discard trivial sorts
       
   878 	parts_sp=(&parts_todo[0]); // Reset partitions to do stack
       
   879 	m=0; // Initial limits, first element
       
   880 	n=aCount; // No_elm elements to do
       
   881 	do  {
       
   882 		while (n>1 && parts_sp<(&parts_todo[KQDepth-2]))
       
   883 			{
       
   884 			division_point=partit(n,m,aKey,aSwap);
       
   885 			d1=division_point-m;
       
   886 			d2=m+n-division_point-1;
       
   887 			if (d1<d2)
       
   888 				{
       
   889 				// Less elements in first partition, do it first
       
   890 				// Stack bigger partition for later
       
   891 				*(parts_sp++)=d2;
       
   892 				*(parts_sp++)=division_point+1;
       
   893 				n=d1;
       
   894 				}
       
   895 			else
       
   896 				{
       
   897 				// Less elements in second partition,do it first
       
   898 				// Stack bigger partition for later
       
   899 				*(parts_sp++)=d1;
       
   900 				*(parts_sp++)=m;                      
       
   901 				n=d2;
       
   902 				m=division_point+1;
       
   903 				}
       
   904 			}
       
   905 		if (parts_sp>=&parts_todo[KQDepth-2]) 
       
   906 			return(KErrGeneral); // Stack overflow
       
   907 		m=(*(--parts_sp));
       
   908 		n=(*(--parts_sp)); // Unstack next partit to do
       
   909 		} while (parts_sp>=(&parts_todo[0])); // Stop on stack underflow
       
   910 	return(KErrNone);
       
   911 	}
       
   912 
       
   913 
       
   914 
       
   915 
       
   916 EXPORT_C TInt User::BinarySearch(TInt aCount,const TKey &aKey,TInt &aPos)
       
   917 //
       
   918 // Perform a binary search on any array. aKey.Compare() will be
       
   919 // called to lexically compare a record in the array with the
       
   920 // value being searched for. The second index to aKey.Compare() will
       
   921 // always be KIndexPtr, meaning the value being compared. The result
       
   922 // returned will be 0 if a match is found and >0 if no match is found.
       
   923 // The index of the matching record or the index of the record logically
       
   924 // following the value being searched for will be returned in aPos.
       
   925 //
       
   926 /**
       
   927 Performs a binary search for an array element containing a specified key.
       
   928 
       
   929 It can be used on any kind of array where elements can be identified by key. 
       
   930 It is used by the standard Symbian OS arrays having CArrayFix, CArrayVar or 
       
   931 CArrayPak in their class hierarchy in the implementation of the various
       
   932 functions for inserting, deleting and finding elements by key. The function
       
   933 can be used by other arrays. 
       
   934 
       
   935 The function returns a zero value if the search is successful and a non-zero 
       
   936 value otherwise.
       
   937 
       
   938 If the search is successful, the function puts the position (i.e. the index) 
       
   939 of the element into aPos. If the search is unsuccessful, then the function 
       
   940 puts into aPos the position of the first element in the array whose key is 
       
   941 greater than the search key.
       
   942 
       
   943 If the array is empty, i.e. aCount is zero, then the search is unsuccessful 
       
   944 and aPos is not defined.
       
   945 
       
   946 @param aCount The number of elements in the array.
       
   947 @param aKey   A reference to a suitably initialised TKey derived object.
       
   948               In particular, the object will have been initialised with
       
   949               a pointer to a sample element containing the search key.
       
   950 @param aPos   If the element is found, the reference is set to the position of 
       
   951               that element within the array. The position is relative to zero,
       
   952               (i.e. the first element in the array is at position 0).
       
   953               If the element is not found and the array is not empty, then
       
   954               the reference is set to the position of the first element in
       
   955               the array with a key which is greater than the search key. 
       
   956               If the element is not found and the array is empty, then the
       
   957               reference is undefined.
       
   958 
       
   959 @return Zero, if the element with the specified key is found. Non-zero, if 
       
   960 the element with the specified key is not found.
       
   961 
       
   962 @panic USER 97, if aCount is negative.
       
   963 */
       
   964 	{
       
   965 
       
   966 	__ASSERT_ALWAYS(aCount>=0,::Panic(EBinarySearchCountNegative));
       
   967     TInt mid=0;
       
   968     TInt r=(-1);
       
   969     if (aCount)
       
   970         {
       
   971         TInt low=0;
       
   972         TInt high=aCount-1;
       
   973         while (low<=high)
       
   974             {
       
   975             mid=(low+high)>>1;
       
   976             if ((r=aKey.Compare(mid,KIndexPtr))==0)
       
   977                 break;
       
   978             if (r<0)
       
   979                 low=mid+1;
       
   980             else
       
   981                 high=mid-1;
       
   982             }
       
   983         }
       
   984 	if (r<0)
       
   985 		mid++;
       
   986     aPos=mid;
       
   987     return(r);
       
   988 	}
       
   989 
       
   990 
       
   991 
       
   992 
       
   993 EXPORT_C TVersion User::Version()
       
   994 /**
       
   995 Retrieves the E32 component version number, which is the kernel architecture version number.  
       
   996 For example for EKA2 the major part of the version number will be 2.
       
   997 
       
   998 @return  The E32 component version number.
       
   999 */
       
  1000 	{
       
  1001 
       
  1002 	return(TVersion(KE32MajorVersionNumber,KE32MinorVersionNumber,KE32BuildVersionNumber));
       
  1003 	}
       
  1004 
       
  1005 
       
  1006 
       
  1007 
       
  1008 EXPORT_C void User::Invariant()
       
  1009 /**
       
  1010 Panics the current thread with a USER 0 panic.
       
  1011 
       
  1012 Typically, this is called when a test for a class invariant fails, i.e. when
       
  1013 a test which checks that the internal data of an object is
       
  1014 self-consistent, fails.
       
  1015 
       
  1016 Such tests are almost always done in debug builds, commonly using
       
  1017 the __ASSERT_DEBUG macro.
       
  1018 */
       
  1019 	{
       
  1020 
       
  1021 	::Panic(EInvariantFalse);
       
  1022 	}
       
  1023 
       
  1024 
       
  1025 
       
  1026 
       
  1027 EXPORT_C TBool User::QueryVersionSupported(const TVersion &aCurrent,const TVersion &aRequested)
       
  1028 /**
       
  1029 Compares two version objects and returns true if the test version is less 
       
  1030 than the current version.
       
  1031 
       
  1032 Version information is encapsulated by a TVersion type object and consists
       
  1033 of a major version number, a minor version number and a build number.
       
  1034 
       
  1035 The function returns true if one of the following conditions is true:
       
  1036 
       
  1037 1. the test major version is strictly less than the current major version
       
  1038 
       
  1039 2. the test major version is equal to the current major version and the test 
       
  1040    minor version is less than or equal to the current minor version
       
  1041 
       
  1042 If neither condition is true, the function returns false.
       
  1043 
       
  1044 @param aCurrent   A reference to the current version against which aRequested 
       
  1045                   is compared.
       
  1046 @param aRequested A reference to the test version to be compared
       
  1047                   against aCurrent.
       
  1048                   
       
  1049 @return True, if one or both conditions are true. False otherwise.
       
  1050 */
       
  1051 	{
       
  1052 
       
  1053 	if (aRequested.iMajor<aCurrent.iMajor || (aRequested.iMajor==aCurrent.iMajor && aRequested.iMinor<=aCurrent.iMinor))
       
  1054 		return(ETrue);
       
  1055 	return(EFalse);
       
  1056 	}
       
  1057 
       
  1058 
       
  1059 
       
  1060 
       
  1061 EXPORT_C TKey::TKey()
       
  1062 /**
       
  1063 Protected default constructor.
       
  1064 
       
  1065 This constructor prevents TKey objects from being constructed directly.
       
  1066 */
       
  1067 	{}
       
  1068 
       
  1069 
       
  1070 
       
  1071 
       
  1072 EXPORT_C TKey::TKey(TInt anOffset,TKeyCmpText aType)
       
  1073 	: iKeyOffset(anOffset),iCmpType(ECmpCollated16+aType+1)
       
  1074 /**
       
  1075 Constructs the characteristics of a descriptor type key.
       
  1076 
       
  1077 This constructor should be called by the corresponding derived class
       
  1078 constructor that takes the same arguments. Typically, the derived class
       
  1079 constructor calls this constructor in its constructor initialization list.
       
  1080 
       
  1081 No length value is passed as this is implied by the type of key.
       
  1082 
       
  1083 Note that the constructor sets the offset value into the protected data member 
       
  1084 iKeyOffset.
       
  1085 
       
  1086 @param anOffset The offset of the key from the start of an array element.
       
  1087 @param aType    An enumeration which defines the type of comparison to be made 
       
  1088                 between two descriptor keys.
       
  1089                 
       
  1090 @panic USER 98, if anOffset is negative.
       
  1091                 
       
  1092 @see TKeyCmpText
       
  1093 */
       
  1094 	{
       
  1095 
       
  1096 	__ASSERT_ALWAYS(iKeyOffset>=0,Panic(EKeyOffsetNegative));
       
  1097 	}
       
  1098 
       
  1099 
       
  1100 
       
  1101 
       
  1102 EXPORT_C TKey::TKey(TInt anOffset,TKeyCmpText aType,TInt aLength)
       
  1103 	: iKeyOffset(anOffset),iKeyLength(aLength),iCmpType(aType)
       
  1104 /**
       
  1105 Constructs the characteristics of a text key.
       
  1106 
       
  1107 This constructor should be called by the corresponding derived class
       
  1108 constructor that takes the same arguments. Typically, the derived class
       
  1109 constructor calls this constructor in its constructor initialization list.
       
  1110 
       
  1111 Note that the constructor sets the offset value into the protected data member 
       
  1112 iKeyOffset.
       
  1113 
       
  1114 @param anOffset The offset of the key from the start of an array element.
       
  1115 @param aType    An enumeration which defines the type of comparison to be made 
       
  1116                 between two text keys.
       
  1117 @param aLength  The length of the text key.
       
  1118 
       
  1119 @panic USER 98, if anOffset is negative.
       
  1120 
       
  1121 @see TKeyCmpText
       
  1122 */
       
  1123 	{
       
  1124 
       
  1125 	__ASSERT_ALWAYS(iKeyOffset>=0,Panic(EKeyOffsetNegative));
       
  1126 	}
       
  1127 
       
  1128 
       
  1129 
       
  1130 
       
  1131 EXPORT_C TKey::TKey(TInt anOffset,TKeyCmpNumeric aType)
       
  1132 	: iKeyOffset(anOffset),iCmpType(aType)
       
  1133 /**
       
  1134 Constructs the characteristics of a numeric key.
       
  1135 
       
  1136 This constructor should be called by the corresponding derived class
       
  1137 constructor that takes the same arguments. Typically, the derived class
       
  1138 constructor calls this constructor in its constructor initialization list.
       
  1139 
       
  1140 No length value is passed as this is implied by the type of key.
       
  1141 
       
  1142 Note that the constructor sets the offset value into the protected data member 
       
  1143 iKeyOffset.
       
  1144 
       
  1145 @param anOffset The offset of the key from the start of an array element.
       
  1146 @param aType    An enumeration which defines the type of the numeric key.
       
  1147 
       
  1148 @panic USER 98, if anOffset is negative.
       
  1149 
       
  1150 @see TKeyCmpNumeric
       
  1151 */
       
  1152 	{
       
  1153 
       
  1154 	__ASSERT_ALWAYS(iKeyOffset>=0,Panic(EKeyOffsetNegative));
       
  1155 	}
       
  1156 
       
  1157 
       
  1158 
       
  1159 
       
  1160 EXPORT_C TInt TKey::Compare(TInt aLeft,TInt aRight) const
       
  1161 /**
       
  1162 Compares the keys of two array elements.
       
  1163 
       
  1164 This function is called by User::BinarySearch() and User::QuickSort().
       
  1165 
       
  1166 The position of the elements are identified by the specified index values. 
       
  1167 The default implementation uses the At() virtual function to convert the index 
       
  1168 values into pointers to the elements themselves.
       
  1169 
       
  1170 The default implementation also uses:
       
  1171 
       
  1172 1. the TDesC comparison functions to compare descriptor type keys
       
  1173 
       
  1174 2. the Mem functions to compare text type keys
       
  1175 
       
  1176 3. numeric comparison for numeric type keys.
       
  1177 
       
  1178 @param aLeft  The index of an array element participating in the comparison, 
       
  1179               designated the left element.
       
  1180 @param aRight The index of an array element participating in the comparison, 
       
  1181               designated the right element.
       
  1182               
       
  1183 @return Zero, if the two keys are equal;
       
  1184         negative, if the left key is less than the right key;
       
  1185         positive, if the left key is greater than the right key.
       
  1186         
       
  1187 @see User::BinarySearch()
       
  1188 @see User::QuickSort()
       
  1189 @see TDesC
       
  1190 @see Mem
       
  1191 */
       
  1192 	{
       
  1193 
       
  1194 	UPTR left;
       
  1195 	left.tany=At(aLeft);
       
  1196 	UPTR right;
       
  1197 	// coverity[returned_pointer]
       
  1198 	right.tany=At(aRight);
       
  1199 	TInt r=(-1);
       
  1200 	switch (iCmpType)
       
  1201 		{
       
  1202 #if !defined(_UNICODE)
       
  1203 	case ECmpNormal:
       
  1204 #endif
       
  1205 	case ECmpNormal8:
       
  1206 		r=Mem::Compare(left.ttext8,iKeyLength,right.ttext8,iKeyLength);
       
  1207 		break;
       
  1208 #if defined(_UNICODE)
       
  1209 	case ECmpNormal:
       
  1210 #endif
       
  1211 	case ECmpNormal16:
       
  1212 		r=Mem::Compare(left.ttext16,iKeyLength,right.ttext16,iKeyLength);
       
  1213 		break;
       
  1214 #if !defined(_UNICODE)
       
  1215 	case ECmpFolded:
       
  1216 #endif
       
  1217 	case ECmpFolded8:
       
  1218 		r=Mem::CompareF(left.ttext8,iKeyLength,right.ttext8,iKeyLength);
       
  1219 		break;
       
  1220 #if defined(_UNICODE)
       
  1221 	case ECmpFolded:
       
  1222 #endif
       
  1223 	case ECmpFolded16:
       
  1224 		r=Mem::CompareF(left.ttext16,iKeyLength,right.ttext16,iKeyLength);
       
  1225 		break;
       
  1226 #if !defined(_UNICODE)
       
  1227 	case ECmpCollated:
       
  1228 #endif
       
  1229 	case ECmpCollated8:
       
  1230 		r=Mem::CompareC(left.ttext8,iKeyLength,right.ttext8,iKeyLength);
       
  1231 		break;
       
  1232 #if defined(_UNICODE)
       
  1233 	case ECmpCollated:
       
  1234 #endif
       
  1235 	case ECmpCollated16:
       
  1236 		r=Mem::CompareC(left.ttext16,iKeyLength,right.ttext16,iKeyLength);
       
  1237 		break;
       
  1238 #if !defined(_UNICODE)
       
  1239 	case ECmpCollated16+ECmpNormal+1:
       
  1240 #endif
       
  1241 	case ECmpCollated16+ECmpNormal8+1:
       
  1242 		r=left.tdesc8->Compare(*right.tdesc8);
       
  1243 		break;
       
  1244 #if defined(_UNICODE)
       
  1245 	case ECmpCollated16+ECmpNormal+1:
       
  1246 #endif
       
  1247 	case ECmpCollated16+ECmpNormal16+1:
       
  1248 		r=left.tdesc16->Compare(*right.tdesc16);
       
  1249 		break;
       
  1250 #if !defined(_UNICODE)
       
  1251 	case ECmpCollated16+ECmpFolded+1:
       
  1252 #endif
       
  1253 	case ECmpCollated16+ECmpFolded8+1:
       
  1254 		r=left.tdesc8->CompareF(*right.tdesc8);
       
  1255 		break;
       
  1256 #if defined(_UNICODE)
       
  1257 	case ECmpCollated16+ECmpFolded+1:
       
  1258 #endif
       
  1259 	case ECmpCollated16+ECmpFolded16+1:
       
  1260 		r=left.tdesc16->CompareF(*right.tdesc16);
       
  1261 		break;
       
  1262 #if !defined(_UNICODE)
       
  1263 	case ECmpCollated16+ECmpCollated+1:
       
  1264 #endif
       
  1265 	case ECmpCollated16+ECmpCollated8+1:
       
  1266 		r=left.tdesc8->CompareC(*right.tdesc8);
       
  1267 		break;
       
  1268 #if defined(_UNICODE)
       
  1269 	case ECmpCollated16+ECmpCollated+1:
       
  1270 #endif
       
  1271 	case ECmpCollated16+ECmpCollated16+1:
       
  1272 		r=left.tdesc16->CompareC(*right.tdesc16);
       
  1273 		break;
       
  1274 	case ECmpTInt:
       
  1275 		if (*left.tint==*right.tint)
       
  1276 			r=0;
       
  1277 		else if (*left.tint>*right.tint)
       
  1278 			r=1;
       
  1279 		break;	   
       
  1280 	case ECmpTUint:
       
  1281 		if (*left.tuint==*right.tuint)
       
  1282 			r=0;
       
  1283 		else if (*left.tuint>*right.tuint)
       
  1284 			r=1;
       
  1285 		break;	   
       
  1286 	case ECmpTInt8:
       
  1287 		if (*left.tint8==*right.tint8)
       
  1288 			r=0;
       
  1289 		else if (*left.tint8>*right.tint8)
       
  1290 			r=1;
       
  1291 		break;	   
       
  1292 	case ECmpTUint8:
       
  1293 		if (*left.tuint8==*right.tuint8)
       
  1294 			r=0;
       
  1295 		else if (*left.tuint8>*right.tuint8)
       
  1296 			r=1;
       
  1297 		break;
       
  1298 	case ECmpTInt16:
       
  1299 		if (*left.tint16==*right.tint16)
       
  1300 			r=0;
       
  1301 		else if (*left.tint16>*right.tint16)
       
  1302 			r=1;
       
  1303 		break;	   
       
  1304 	case ECmpTUint16:
       
  1305 		if (*left.tuint16==*right.tuint16)
       
  1306 			r=0;
       
  1307 		else if (*left.tuint16>*right.tuint16)
       
  1308 			r=1;
       
  1309 		break;
       
  1310 	case ECmpTInt32:
       
  1311 		if (*left.tint32==*right.tint32) 
       
  1312 			r=0;
       
  1313 		else if (*left.tint32>*right.tint32) 
       
  1314 			r=1;
       
  1315 		break;	   
       
  1316 	case ECmpTUint32:
       
  1317 		if (*left.tuint32==*right.tuint32)
       
  1318 			r=0;
       
  1319 		else if (*left.tuint32>*right.tuint32)
       
  1320 			r=1;
       
  1321 		break;
       
  1322 	case ECmpTInt64:
       
  1323 		if (*left.tint64==*right.tint64) 
       
  1324 			r=0;
       
  1325 		else if (*left.tint64>*right.tint64) 
       
  1326 			r=1;
       
  1327 		break;	   
       
  1328 		}
       
  1329 	return(r);
       
  1330 	}
       
  1331 
       
  1332 
       
  1333 
       
  1334 
       
  1335 EXPORT_C TAny* TKey::At(TInt /*anIndex*/) const
       
  1336 /**
       
  1337 Gets a pointer to the key of a specified array element.
       
  1338 	
       
  1339 The default implementation raises a USER 35 panic.
       
  1340 	
       
  1341 The function is called by TKey::Compare() to compare the keys of two elements.
       
  1342 	
       
  1343 The implementation provided by a derived class must convert the index to a 
       
  1344 pointer to the key within the corresponding element. The implementation depends 
       
  1345 on the design of the array but, as general rule, use the index value to get 
       
  1346 a pointer to the corresponding element and then add the TKey protected data 
       
  1347 member iKeyOffset to this pointer to get a pointer to the key itself.
       
  1348 	
       
  1349 By convention, the index value is relative to zero; i.e. a zero value refers 
       
  1350 to the first element in the array. By this convention, the index can take 
       
  1351 any value between zero and the number of elements within the array minus one.
       
  1352 	
       
  1353 The function must also handle the special index value KIndexPtr. When this 
       
  1354 value is passed, the function should return a pointer to the key within the 
       
  1355 sample element. A pointer to the sample element is held in the protected data 
       
  1356 member iPtr and can be set up using SetPtr().
       
  1357 	
       
  1358 The implementation of this function also assumes that the derived class has 
       
  1359 a pointer to the array itself or has a function for finding it.
       
  1360 	
       
  1361 @param anIndex The index of the array element or the special index value KIndexPtr.
       
  1362 
       
  1363 @return An untyped pointer to the key within the specified array element or 
       
  1364         an untyped pointer to the key within the sample element, if KIndexPtr
       
  1365         is passed as an argument.
       
  1366 
       
  1367 @panic USER 35, if no replacement function has been provided by a derived class.
       
  1368         
       
  1369 @see TKey::Compare
       
  1370 @see TKey::SetPtr
       
  1371 @see KIndexPtr
       
  1372 */
       
  1373 	{
       
  1374 
       
  1375 	Panic(ETFuncTKeyVirtualAt);
       
  1376 	return(NULL);
       
  1377 	}
       
  1378 
       
  1379 
       
  1380 
       
  1381 
       
  1382 EXPORT_C TSwap::TSwap()
       
  1383 /**
       
  1384 Default constructor.
       
  1385 
       
  1386 The constructor has an empty implementation.
       
  1387 */
       
  1388 	{}
       
  1389 
       
  1390 
       
  1391 
       
  1392 
       
  1393 EXPORT_C void TSwap::Swap(TInt /*aLeft*/,TInt /*aRight*/) const
       
  1394 /**
       
  1395 Swaps two elements of an array.
       
  1396 	
       
  1397 This function is called by User::QuickSort().
       
  1398 	
       
  1399 The default implementation raises a USER 36 panic.
       
  1400 	
       
  1401 In general, the class must provide a way of translating the indexes representing 
       
  1402 the two elements into pointers to the elements themselves. The Mem::Swap() 
       
  1403 utility function can then be used to swap the two elements. This implies that 
       
  1404 the derived class must contain a pointer to the array itself and have access 
       
  1405 to other information about the array, such as the length of elements.
       
  1406 	
       
  1407 By convention, the index value is relative to zero; i.e. a zero value refers 
       
  1408 to the first element in the array.
       
  1409 	
       
  1410 @param aLeft  The index of an array element participating in the swap
       
  1411 @param aRight The index of an array element participating in the swap
       
  1412 
       
  1413 @panic USER 36, if no replacement function has been provided by a derived class.
       
  1414 
       
  1415 @see User::QuickSort
       
  1416 @see Mem::Swap
       
  1417 */
       
  1418 	{
       
  1419 
       
  1420 	Panic(ETFuncTSwapVirtualSwap);
       
  1421 	}
       
  1422 
       
  1423 
       
  1424 
       
  1425 
       
  1426 EXPORT_C TVersion::TVersion()
       
  1427 /**
       
  1428 Default constructor.
       
  1429 
       
  1430 It sets the major, minor and build numbers to zero.
       
  1431 */
       
  1432 	: iMajor(0),iMinor(0),iBuild(0)
       
  1433 	{}
       
  1434 
       
  1435 
       
  1436 
       
  1437 
       
  1438 EXPORT_C TVersion::TVersion(TInt aMajor,TInt aMinor,TInt aBuild)
       
  1439 /**
       
  1440 Constructs the object with the specified major version number, the minor
       
  1441 version number and the build number.
       
  1442 
       
  1443 Note that the constructor does not check that the values passed are within
       
  1444 the specified ranges. As the parameters are TInt types, care must be taken to
       
  1445 ensure that values passed do not exceed the specified maxima, otherwise they
       
  1446 will be interpreted as negative values.
       
  1447 
       
  1448 @param aMajor The major version number. This must be a number in the
       
  1449               range 0 to 127.
       
  1450 @param aMinor The minor version number. This must be a number in the
       
  1451               range 0 to 99.
       
  1452 @param aBuild The build number. This must be a number in the range 0 to 32,767.
       
  1453 
       
  1454 */
       
  1455 	: iMajor((TInt8)aMajor),iMinor((TInt8)aMinor),iBuild((TInt16)aBuild)
       
  1456 	{}
       
  1457 
       
  1458 
       
  1459 
       
  1460 
       
  1461 EXPORT_C TVersionName TVersion::Name() const
       
  1462 /**
       
  1463 Gets a descriptor buffer containing the formatted character representation
       
  1464 of the version information.
       
  1465 
       
  1466 The general format of the representation is: xxx.yy(zzzzz)
       
  1467 
       
  1468 where:
       
  1469 
       
  1470 1. xxx is the major version number; depending on the value, this may have
       
  1471    a length of one, two or three characters.
       
  1472 
       
  1473 2. yy is the minor version number; this is always two characters, padded
       
  1474    with a leading zero, if necessary. 
       
  1475 
       
  1476 3. zzzzz is the build number; depending on the value, this may have a length
       
  1477    of one to 5 characters.
       
  1478 
       
  1479 Note that if the object is constructed with values that exceed the permitted
       
  1480 range, they will appear negative in their formatted character representation.
       
  1481 
       
  1482 @return A buffer descriptor containing the formatted character representation.
       
  1483 */
       
  1484 	{
       
  1485 
       
  1486 	TVersionName v;
       
  1487 	v.AppendNum(iMajor);
       
  1488 	v.Append(TChar('.'));
       
  1489 	v.AppendNumFixedWidth(iMinor,EDecimal,2);
       
  1490 	v.Append(TChar('('));
       
  1491 	v.AppendNum(iBuild);
       
  1492 	v.Append(TChar(')'));
       
  1493 //	v.Format(_L("%d.%02d(%d)"),iMajor,iMinor,iBuild);
       
  1494 	return(v);
       
  1495 	}
       
  1496 
       
  1497 
       
  1498 
       
  1499 
       
  1500 /**
       
  1501 Signals the current thread that the asynchronous request associated with the 
       
  1502 specified request status object is complete.
       
  1503 
       
  1504 This function is used to complete an asynchronous request originating in the 
       
  1505 same thread as the code that is currently executing. If a request originates 
       
  1506 in another thread, then executing code must use RThread::RequestComplete() 
       
  1507 to signal the completion of that request.
       
  1508 
       
  1509 The request is completed with the completion code passed in aReason. This 
       
  1510 value is copied into the request status, pointed to by aStatus, before 
       
  1511 signalling the current thread's request semaphore.
       
  1512 
       
  1513 The meaning of the completion code passed in aReason is a matter of convention 
       
  1514 to be decided between the service requester and the service provider.
       
  1515 
       
  1516 @param aStatus A reference to a pointer to the request status object. This 
       
  1517                is a pointer into the current thread's address space. 
       
  1518                On return, the pointer to the request status is set to NULL.
       
  1519                Note that setting the pointer to NULL is a convenience, 
       
  1520                not all servers need it, and is done before 
       
  1521                the function returns.
       
  1522                
       
  1523 @param aReason The completion code of this request.
       
  1524 
       
  1525 @see  RThread::RequestComplete
       
  1526 */
       
  1527 EXPORT_C void User::RequestComplete(TRequestStatus * &aStatus,TInt aReason)
       
  1528 	{
       
  1529 	*aStatus=KRequestPending;
       
  1530 	RThread().RequestComplete(aStatus,aReason);
       
  1531 	}
       
  1532 
       
  1533 
       
  1534 
       
  1535 
       
  1536 EXPORT_C TLdrInfo::TLdrInfo()
       
  1537 //
       
  1538 // Constructor
       
  1539 //
       
  1540 	{
       
  1541 	memclr(this, sizeof(TLdrInfo));
       
  1542 	iRequestedVersion = KModuleVersionWild;
       
  1543 	}
       
  1544 
       
  1545 EXPORT_C TPtrC8 TCodeSegCreateInfo::RootName() const
       
  1546 	{
       
  1547 	return iFileName.Mid(iRootNameOffset,iRootNameLength);
       
  1548 	}
       
  1549 
       
  1550 EXPORT_C TBool TUid::operator==(const TUid& aUid) const
       
  1551 /**
       
  1552 Compares two UIDs for equality.
       
  1553 
       
  1554 @param aUid The UID to be compared with this UID.
       
  1555 
       
  1556 @return True, if the two UIDs are equal; false otherwise. 
       
  1557 */
       
  1558 	{
       
  1559 
       
  1560 	return(iUid==aUid.iUid);
       
  1561 	}
       
  1562 
       
  1563 
       
  1564 
       
  1565 
       
  1566 EXPORT_C TBool TUid::operator!=(const TUid& aUid) const
       
  1567 /**
       
  1568 Compares two UIDs for inequality.
       
  1569 
       
  1570 @param aUid The UID to be compared with this UID.
       
  1571 
       
  1572 @return True, if the two UIDs are unequal; false otherwise. 
       
  1573 */
       
  1574 	{
       
  1575 
       
  1576 	return(iUid!=aUid.iUid);
       
  1577 	}
       
  1578 
       
  1579 
       
  1580 
       
  1581 
       
  1582 EXPORT_C TUidName TUid::Name() const
       
  1583 /**
       
  1584 Generates and returns the standard text form of the UID.
       
  1585 
       
  1586 The resulting text has the form:
       
  1587 
       
  1588 @code
       
  1589 [12345678]
       
  1590 @endcode
       
  1591 
       
  1592 The function always generates 10 characters, where the first and last characters 
       
  1593 are open and close square brackets enclosing exactly 8 hexadecimal digits 
       
  1594 (padded to the left with zeroes, if necessary).
       
  1595 
       
  1596 @return A modifiable descriptor containing the standard text format of the 
       
  1597         UID.
       
  1598 */
       
  1599 	{
       
  1600 
       
  1601 	TUidName n;
       
  1602 	n.Append(TChar('['));
       
  1603 	n.AppendNumFixedWidth(iUid,EHex,8);
       
  1604 	n.Append(TChar(']'));
       
  1605 //	n.Format(_L("[%08x]"),iUid);
       
  1606 	return(n);
       
  1607 	}
       
  1608 
       
  1609 
       
  1610 
       
  1611 
       
  1612 EXPORT_C TUidType::TUidType()
       
  1613 /**
       
  1614 Default constructor.
       
  1615 
       
  1616 Creates a UID type, and sets all three component UIDs to KNullUid.
       
  1617 */
       
  1618     {
       
  1619 
       
  1620 	Mem::FillZ(this,sizeof(TUidType));
       
  1621     }
       
  1622 
       
  1623 
       
  1624 
       
  1625 
       
  1626 EXPORT_C TUidType::TUidType(TUid aUid1)
       
  1627 /**
       
  1628 Constructor that creates a UID type and sets the UID1 component
       
  1629 to the specified value.
       
  1630 
       
  1631 The UID2 and UID3 components are set to KNullUid.
       
  1632 
       
  1633 @param aUid1 Value for UID1.
       
  1634 */
       
  1635     {
       
  1636 
       
  1637 
       
  1638 	Mem::FillZ(this,sizeof(TUidType));
       
  1639     iUid[0]=aUid1;
       
  1640     }
       
  1641 
       
  1642 
       
  1643 
       
  1644 
       
  1645 EXPORT_C TUidType::TUidType(TUid aUid1,TUid aUid2)
       
  1646 /**
       
  1647 Constructor that creates a UID type and sets the UID1 and UID2 components
       
  1648 to the specified values. 
       
  1649 
       
  1650 The UID3 component is set to KNullUid.
       
  1651 
       
  1652 @param aUid1 Value for UID1. 
       
  1653 @param aUid2 Value for UID2.
       
  1654 */
       
  1655     {
       
  1656 
       
  1657     iUid[0]=aUid1;
       
  1658     iUid[1]=aUid2;
       
  1659     iUid[2]=KNullUid;
       
  1660     }
       
  1661 
       
  1662 
       
  1663 
       
  1664 
       
  1665 EXPORT_C TUidType::TUidType(TUid aUid1,TUid aUid2,TUid aUid3)
       
  1666 /**
       
  1667 Constructor that creates a UID type and sets all three UID components
       
  1668 to the specified values.
       
  1669 
       
  1670 @param aUid1 Value for UID1.
       
  1671 @param aUid2 Value for UID2.
       
  1672 @param aUid3 Value for UID3.
       
  1673 */
       
  1674     {
       
  1675 
       
  1676 
       
  1677     iUid[0]=aUid1;
       
  1678     iUid[1]=aUid2;
       
  1679     iUid[2]=aUid3;
       
  1680     }
       
  1681 
       
  1682 
       
  1683 
       
  1684 
       
  1685 EXPORT_C TBool TUidType::operator==(const TUidType& aUidType) const
       
  1686 /**
       
  1687 Compares this UID type for equality with the specified UID type.
       
  1688 
       
  1689 @param aUidType The UID type to be compared. 
       
  1690 
       
  1691 @return True, if each component UID is equal to the corresponding component 
       
  1692         UID in the specified UID type; false, otherwise.
       
  1693 */
       
  1694     {
       
  1695 
       
  1696     return(iUid[0]==aUidType.iUid[0] &&
       
  1697            iUid[1]==aUidType.iUid[1] &&
       
  1698            iUid[2]==aUidType.iUid[2]);
       
  1699     }
       
  1700 
       
  1701 
       
  1702 
       
  1703 
       
  1704 EXPORT_C TBool TUidType::operator!=(const TUidType& aUidType) const
       
  1705 /** 
       
  1706 Compares this UID type for inequality with the specified UID type.
       
  1707 
       
  1708 @param aUidType The UID type to be compared.
       
  1709 
       
  1710 @return True, if any component UID is not equal to the corresponding component 
       
  1711 UID in the specified UID type; false otherwise.
       
  1712 */
       
  1713     {
       
  1714 
       
  1715 
       
  1716     return(!(*this==aUidType));
       
  1717     }
       
  1718 
       
  1719 
       
  1720 
       
  1721 
       
  1722 EXPORT_C const TUid& TUidType::operator[](TInt aIndex) const
       
  1723 /**
       
  1724 Gets the UID component as identified by the specified index.
       
  1725 
       
  1726 @param aIndex Index value indicating which UID component to return.
       
  1727                0 specifies UID1,
       
  1728                1 specifies UID2,
       
  1729                2 specifies UID3.
       
  1730 
       
  1731 @return A reference to the required UID component.
       
  1732 
       
  1733 @panic USER 37 if aIndex is not in the range 0 to 2, inclusive.
       
  1734 */
       
  1735     {
       
  1736 
       
  1737 	__ASSERT_ALWAYS(aIndex>=0 && aIndex<KMaxCheckedUid,Panic(ETFuncUidTypeBadIndex));
       
  1738 	return(iUid[aIndex]);
       
  1739     }
       
  1740 
       
  1741 
       
  1742 
       
  1743 
       
  1744 EXPORT_C TUid TUidType::MostDerived() const
       
  1745 /**
       
  1746 Gets the most derived UID.
       
  1747 
       
  1748 Taking the three UID components as a hierarchy with UID1 being the most general, 
       
  1749 UID2 being more specific than UID1 and UID3 being more specific than UID2, 
       
  1750 then the function returns:
       
  1751 
       
  1752 UID3, if UID3 is not KNullUid.
       
  1753 
       
  1754 UID2, if UID2 is not KNullUid.
       
  1755 
       
  1756 UID1, otherwise
       
  1757 
       
  1758 @return The most derived UID.
       
  1759 
       
  1760 @see KNullUid
       
  1761 */
       
  1762     {
       
  1763 
       
  1764     if (iUid[2]!=KNullUid)
       
  1765         return(iUid[2]);
       
  1766     if (iUid[1]!=KNullUid)
       
  1767         return(iUid[1]);
       
  1768     return(iUid[0]);
       
  1769     }
       
  1770 
       
  1771 
       
  1772 
       
  1773 
       
  1774 EXPORT_C TBool TUidType::IsPresent(TUid aUid) const
       
  1775 /**
       
  1776 Tests if any of the component UIDs are equal to the specified UID.
       
  1777 
       
  1778 @param aUid The UID to be tested.
       
  1779 
       
  1780 @return True, if any one of the component UIDs are the same as the specified 
       
  1781         UID; false, if none of the component UIDs are the same.
       
  1782 */
       
  1783     {
       
  1784 
       
  1785 	return(iUid[0]==aUid || iUid[1]==aUid || iUid[2]==aUid);
       
  1786     }
       
  1787 
       
  1788 
       
  1789 
       
  1790 
       
  1791 EXPORT_C TBool TUidType::IsValid() const
       
  1792 /**
       
  1793 Tests the object for a valid (non-KNullUid) UID type.
       
  1794 
       
  1795 @return True, if at least one of the component UIDs is not KNullUid; false, 
       
  1796         if all component UIDs are KNullUid.
       
  1797 
       
  1798 @see KNullUid
       
  1799 */
       
  1800     {
       
  1801 
       
  1802     return(MostDerived()!=KNullUid);
       
  1803     }
       
  1804 
       
  1805 
       
  1806 
       
  1807 
       
  1808 EXPORT_C TCheckedUid::TCheckedUid()
       
  1809 /**
       
  1810 Default constructor.
       
  1811 
       
  1812 Initialises the object to binary zeroes.
       
  1813 */
       
  1814 	{
       
  1815 
       
  1816 	Mem::FillZ(this,sizeof(TCheckedUid));
       
  1817 	}
       
  1818 
       
  1819 
       
  1820 
       
  1821 
       
  1822 EXPORT_C TCheckedUid::TCheckedUid(const TUidType& aUidType)
       
  1823 /**
       
  1824 Constructor taking an existing Uid type.
       
  1825 
       
  1826 The constructor calculates a checksum.
       
  1827 
       
  1828 @param aUidType The Uid type to be packaged.
       
  1829 */
       
  1830 	{
       
  1831 
       
  1832     Set(aUidType);
       
  1833     }
       
  1834 
       
  1835 
       
  1836 
       
  1837 
       
  1838 EXPORT_C TCheckedUid::TCheckedUid(const TDesC8& aPtr)
       
  1839 /**
       
  1840 Constructor taking an existing TCheckedUid object encapsulated within
       
  1841 a descriptor.
       
  1842 
       
  1843 The checksum is recalculated and must match the checksum value passed in the 
       
  1844 encapsulated TCheckedUid object, otherwise the content of this object is reset 
       
  1845 to binary zeroes.
       
  1846 
       
  1847 @param aPtr A pointer to a descriptor containing an existing TCheckedUid object. 
       
  1848                         
       
  1849 @panic USER 38 If the length of the descriptor is not the same as the size 
       
  1850        of a TCheckedUid object.
       
  1851 */
       
  1852 	{
       
  1853 
       
  1854 	Set(aPtr);
       
  1855 	}
       
  1856 
       
  1857 
       
  1858 
       
  1859 
       
  1860 EXPORT_C void TCheckedUid::Set(const TUidType& aUidType)
       
  1861 /**
       
  1862 Sets the specified Uid type to be packaged, and recalculates the checksum.
       
  1863 
       
  1864 @param aUidType The Uid type to be packaged.
       
  1865 */
       
  1866 	{
       
  1867 
       
  1868     iType=aUidType;
       
  1869     iCheck=Check();
       
  1870     }
       
  1871 
       
  1872 
       
  1873 
       
  1874 
       
  1875 EXPORT_C void TCheckedUid::Set(const TDesC8& aPtr)
       
  1876 /**
       
  1877 Sets an existing TCheckedUid object encapsulated within a descriptor.
       
  1878 
       
  1879 The checksum is recalculated and must match the checksum value passed in the 
       
  1880 encapsulated TCheckedUid object, otherwise the content of this object is reset 
       
  1881 to binary zeroes.
       
  1882 
       
  1883 @param aPtr A pointer to a descriptor containing an existing
       
  1884             TCheckedUid object.
       
  1885 
       
  1886 @panic USER 38 If the length of the descriptor is not the same as the size 
       
  1887        of a TCheckedUid object.
       
  1888 */
       
  1889 	{
       
  1890 
       
  1891 	__ASSERT_ALWAYS(aPtr.Length()==sizeof(TCheckedUid),Panic(ETFuncCheckedUidBadSet));
       
  1892 	Mem::Move(this,aPtr.Ptr(),sizeof(TCheckedUid));
       
  1893 	if (iCheck!=Check())
       
  1894 		Mem::FillZ(this,sizeof(TCheckedUid));
       
  1895 	}
       
  1896 
       
  1897 
       
  1898 
       
  1899 
       
  1900 EXPORT_C TPtrC8 TCheckedUid::Des() const
       
  1901 /**
       
  1902 Gets a pointer descriptor to represent this object's data.
       
  1903 
       
  1904 @return The pointer descriptor for this object's data. The descriptor's length
       
  1905         is the same as the length of a TCheckedUid object.
       
  1906 */
       
  1907 	{
       
  1908 
       
  1909 	return(TPtrC8((const TUint8*)this,sizeof(TCheckedUid)));
       
  1910 	}
       
  1911 
       
  1912 
       
  1913 
       
  1914 
       
  1915 EXPORT_C TUint TCheckedUid::Check() const
       
  1916 /**
       
  1917 Calculates the checksum of the UIDs.
       
  1918 
       
  1919 @return The checksum.
       
  1920 */
       
  1921 	{
       
  1922 
       
  1923 	return((checkSum(((TUint8*)this)+1)<<16)|checkSum(this));
       
  1924 	}
       
  1925 
       
  1926 
       
  1927 
       
  1928 
       
  1929 EXPORT_C TInt User::InfoPrint(const TDesC& aDes)
       
  1930 /**
       
  1931 Invokes the notifier server to display a text message on the screen for a short 
       
  1932 time. 
       
  1933 
       
  1934 @param aDes A reference to the descriptor containing the text to be sent to 
       
  1935             the notifier server.
       
  1936             
       
  1937 @return KErrNone if successful, otherwise one of the system-wide error codes.
       
  1938 
       
  1939 @see RNotifier
       
  1940 */
       
  1941 	{
       
  1942 
       
  1943 	RNotifier notif;
       
  1944 	TInt r=notif.Connect();
       
  1945 	if (r!=KErrNone)
       
  1946 		return(KErrGeneral);
       
  1947 	r=notif.InfoPrint(aDes);
       
  1948 	notif.Close();
       
  1949 	return(r);
       
  1950 	}
       
  1951 
       
  1952 static const TUint32 CrcTab32[256] =
       
  1953 	{
       
  1954 	0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
       
  1955 	0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
       
  1956 	0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
       
  1957 	0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
       
  1958 	0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
       
  1959 	0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
       
  1960 	0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
       
  1961 	0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
       
  1962 	0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
       
  1963 	0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
       
  1964 	0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
       
  1965 	0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
       
  1966 	0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
       
  1967 	0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
       
  1968 	0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
       
  1969 	0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
       
  1970 	0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
       
  1971 	0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
       
  1972 	0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
       
  1973 	0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
       
  1974 	0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
       
  1975 	0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
       
  1976 	0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
       
  1977 	0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
       
  1978 	0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
       
  1979 	0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
       
  1980 	0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
       
  1981 	0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
       
  1982 	0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
       
  1983 	0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
       
  1984 	0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
       
  1985 	0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
       
  1986 	0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
       
  1987 	0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
       
  1988 	0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
       
  1989 	0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
       
  1990 	0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
       
  1991 	0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
       
  1992 	0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
       
  1993 	0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
       
  1994 	0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
       
  1995 	0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
       
  1996 	0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
       
  1997 	0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
       
  1998 	0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
       
  1999 	0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
       
  2000 	0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
       
  2001 	0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
       
  2002 	0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
       
  2003 	0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
       
  2004 	0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
       
  2005 	0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
       
  2006 	0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
       
  2007 	0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
       
  2008 	0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
       
  2009 	0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
       
  2010 	0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
       
  2011 	0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
       
  2012 	0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
       
  2013 	0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
       
  2014 	0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
       
  2015 	0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
       
  2016 	0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
       
  2017 	0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
       
  2018 	};
       
  2019 
       
  2020 /**
       
  2021 Performs a CCITT CRC-32 checksum on the specified data.
       
  2022 
       
  2023 On return from this function, the referenced 32 bit integer contains the CRC
       
  2024 value.
       
  2025 
       
  2026 @param aCrc		A reference to a 32 bit integer to contain the CRC value. 
       
  2027 @param aPtr		A pointer to the start of the data to be checksummed. 
       
  2028 @param aLength	The length of the data to be checksummed.
       
  2029 */
       
  2030 EXPORT_C void Mem::Crc32(TUint32& aCrc, const TAny* aPtr, TInt aLength)
       
  2031 	{
       
  2032 	const TUint8* p = (const TUint8*)aPtr;
       
  2033 	const TUint8* q = p + aLength;
       
  2034 	TUint32 crc = aCrc;
       
  2035 	while (p < q)
       
  2036 		crc = (crc >> 8) ^ CrcTab32[(crc ^ *p++) & 0xff];
       
  2037 	aCrc = crc;
       
  2038 	}