os/kernelhwsrv/kernel/eka/common/des8.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     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\common\des8.cpp
    15 // 
    16 //
    17 
    18 #include "common.h"
    19 #include <e32des8_private.h>
    20 #ifndef __KERNEL_MODE__
    21 #include <collate.h>
    22 #else
    23 #include <kernel/kern_priv.h>
    24 #endif
    25 #include <unicode.h>
    26 
    27 // Folding/Collation for 8 bit characters
    28 
    29 extern const TUint8 __FoldCollTab8[256];
    30 
    31 const TUint8 __FoldCollTab8[256] =
    32 	{
    33 	0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, // 0x00
    34 	0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
    35 	0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, // 0x10
    36 	0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
    37 	0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, // 0x20
    38 	0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
    39 	0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, // 0x30
    40 	0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,
    41 	0x40,0x61,0x62,0x63,0x64,0x65,0x66,0x67, // 0x40
    42 	0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
    43 	0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, // 0x50
    44 	0x78,0x79,0x7a,0x5b,0x5c,0x5d,0x5e,0x5f,
    45 	0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, // 0x60
    46 	0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
    47 	0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, // 0x70
    48 	0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,
    49 	0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, // 0x80
    50 	0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
    51 	0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, // 0x90
    52 	0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,
    53 	0x20,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7, // 0xa0
    54 	0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,
    55 	0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7, // 0xb0
    56 	0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf,
    57 	0x61,0x61,0x61,0x61,0x61,0x61,0xe6,0x63, // 0xc0
    58 	0x65,0x65,0x65,0x65,0x69,0x69,0x69,0x69,
    59 	0xf0,0x6e,0x6f,0x6f,0x6f,0x6f,0x6f,0xd7, // 0xd0
    60 	0xf8,0x75,0x75,0x75,0x75,0x79,0xfe,0xdf,
    61 	0x61,0x61,0x61,0x61,0x61,0x61,0xe6,0x63, // 0xe0
    62 	0x65,0x65,0x65,0x65,0x69,0x69,0x69,0x69,
    63 	0xf0,0x6e,0x6f,0x6f,0x6f,0x6f,0x6f,0xf7, // 0xf0
    64 	0xf8,0x75,0x75,0x75,0x75,0x79,0xfe,0x79
    65 	};
    66 
    67 #ifndef __KERNEL_MODE__
    68 inline TUint8* memCopy(TUint8* aPtr, const TUint8* aSrc, TInt aLength)
    69 //
    70 // Copy 8 bit values.
    71 //
    72 	{
    73 
    74 	return Mem::Copy(aPtr, aSrc, aLength);
    75 	}
    76 #endif
    77 
    78 #if (defined(__KERNEL_MODE__) && !defined(__DES8_MACHINE_CODED__)) | defined(__EABI_CTORS__)
    79 inline TInt StringLength(const TUint8* aPtr)
    80 	{
    81 	const TUint8* p = aPtr;
    82 	while (*p)
    83 		++p;
    84 	return p-aPtr;
    85 	}
    86 #endif
    87 
    88 inline TDesC8::TDesC8(TInt aType,TInt aLength)
    89 	:iLength(aLength|(aType<<KShiftDesType8))
    90 	{}
    91 inline TInt TDesC8::Type() const
    92 //
    93 // Return the descriptor type
    94 //
    95 	{
    96 	return(iLength>>KShiftDesType8);
    97 	}
    98 
    99 inline TDes8::TDes8(TInt aType,TInt aLength,TInt aMaxLength)
   100 	: TDesC8(aType,aLength),iMaxLength(aMaxLength)
   101 	{}
   102 
   103 // Class TBufCBase8
   104 inline TBufCBase8::TBufCBase8(TInt aLength)
   105 	:TDesC8(EBufC,aLength)
   106 	{}
   107 
   108 inline TUint8* TBufCBase8::WPtr() const
   109 	{return const_cast<TUint8*>(Ptr());}
   110 
   111 
   112 #ifndef __DES8_MACHINE_CODED__
   113 EXPORT_C const TUint8* TDesC8::Ptr() const
   114 /**
   115 Gets a pointer to the data represented by the descriptor.
   116 
   117 The data cannot be changed through the returned pointer.
   118 
   119 @return A pointer to the data
   120 */
   121 	{
   122 
   123 	switch (Type())
   124 		{
   125 	case EBufC:
   126 		return(&((SBufC8 *)this)->buf[0]);
   127 	case EPtrC:
   128 		return(((SPtrC8 *)this)->ptr);
   129 	case EPtr:
   130 		return(((SPtr8 *)this)->ptr);
   131 	case EBuf:
   132 		return(&((SBuf8 *)this)->buf[0]);
   133 	case EBufCPtr:
   134 		return(&((SBufCPtr8 *)this)->ptr->buf[0]);
   135 		}
   136 	Panic(ETDes8BadDescriptorType);
   137 	return(NULL);
   138 	}
   139 
   140 EXPORT_C const TUint8 &TDesC8::AtC(TInt anIndex) const
   141 //
   142 // Return a reference to the character in the buffer.
   143 //
   144 	{
   145 
   146 	__ASSERT_ALWAYS(anIndex>=0 && anIndex<Length(),Panic(ETDes8IndexOutOfRange));
   147 	return(Ptr()[anIndex]);
   148 	}
   149 
   150 EXPORT_C TInt TDesC8::Compare(const TDesC8 &aDes) const
   151 /**
   152 Compares this descriptor's data with the specified descriptor's data.
   153 
   154 The comparison proceeds on a byte for byte basis. The result of the comparison 
   155 is based on the difference of the first bytes to disagree.
   156 
   157 Two descriptors are equal if they have the same length and content. Where 
   158 two descriptors have different lengths and the shorter descriptor's data
   159 matches the first part of the longer descriptor's data, the shorter is
   160 considered to be less than the longer.
   161 
   162 @param aDes The 8-bit non-modifable descriptor whose data is to be compared 
   163             with this descriptor's data.
   164              
   165 @return Positive, if this descriptor is greater than the specified descriptor. 
   166         Negative, if this descriptor is less than the specified descriptor.
   167         Zero, if both descriptors have the same length and the their contents
   168         are the same.
   169 */
   170 	{
   171 
   172 	return memcompare(Ptr(), Length(), aDes.Ptr(), aDes.Length());
   173 	}
   174 
   175 #ifndef __KERNEL_MODE__
   176 EXPORT_C TInt TDesC8::CompareF(const TDesC8 &aDes) const
   177 /**
   178 Compares this descriptor's folded data with the specified descriptor's folded 
   179 data. 
   180 
   181 Note that folding is locale-independent behaviour. It is also important to 
   182 note that there can be no guarantee that folding is in any way culturally 
   183 appropriate, and should not be used for comparing strings in natural language; 
   184 use CompareC() for this.
   185 
   186 @param aDes The 8-bit non modifable descriptor whose data is to be compared 
   187             with this descriptor's data. 
   188             
   189 @return Positive, if this descriptor is greater than the specified descriptor. 
   190         Negative, if this descriptor is less than the specified descriptor.
   191         Zero, if both descriptors have the same length and the their contents
   192         are the same.
   193         
   194 @see TDesC8::Compare()
   195 */
   196 	{
   197 
   198 	return(Mem::CompareF(Ptr(),Length(),aDes.Ptr(),aDes.Length()));
   199 	}
   200 
   201 EXPORT_C TInt TDesC8::CompareC(const TDesC8 &aDes) const
   202 /**
   203 Compares this descriptor's data with the specified descriptor's data using 
   204 the standard collation method for narrow text appropriate to the current locale.
   205 
   206 @param aDes The 8-bit non modifable descriptor whose data is to be compared 
   207             with this descriptor's data. 
   208             
   209 @return Positive, if this descriptor is greater than the specified descriptor. 
   210         Negative, if this descriptor is less than the specified descriptor.
   211         Zero, if both descriptors have the same length and the their contents
   212         are the same.
   213         
   214 @see TDesC8::Compare()
   215 @deprecated
   216 */
   217 	{
   218 
   219 	return(Mem::CompareC(Ptr(),Length(),aDes.Ptr(),aDes.Length()));
   220 	}
   221 #endif
   222 #endif
   223 
   224 EXPORT_C TInt TDesC8::Find(const TUint8 *pS,TInt aLenS) const
   225 /**
   226 Searches for the first occurrence of the specified data sequence within this 
   227 descriptor.
   228 
   229 Searching always starts at the beginning of this descriptor's data.
   230 
   231 @param pS    A pointer to a location containing the data sequence to be searched 
   232              for.
   233 @param aLenS The length of the data sequence to be searched for. This value 
   234              must not be negative, otherwise the function raises a panic.
   235              
   236 @return The offset of the data sequence from the beginning of this descriptor's 
   237         data. KErrNotFound, if the data sequence cannot be found.
   238        
   239 @panic  USER 29 if aLenS is negative. 
   240 */
   241 	{
   242 
   243 	if (!aLenS)
   244 		return(0);
   245 	__ASSERT_ALWAYS(aLenS>0,Panic(ETDes8LengthNegative));
   246 	const TUint8 *pB=Ptr();
   247 	TInt aLenB=Length();
   248 	const TUint8 *pC=pB-1;			// using pre-increment addressing
   249 	TInt i=aLenB-aLenS;
   250 	if (i>=0)
   251 		{
   252 		const TUint8* pEndS=pS+aLenS-1;		// using pre-increment addressing
   253 		const TUint8 *pEndB=pB+i;			// using pre-increment addressing
   254 		TUint s=*pS;
   255 		for (;;)
   256 			{
   257 			do
   258 				{
   259 				if (pC==pEndB)
   260 					return KErrNotFound;
   261 				} while (*++pC!=s);
   262 			const TUint8 *p1=pC;
   263 			const TUint8 *p2=pS;
   264 			do
   265 				{
   266 				if (p2==pEndS)
   267 					return (pC-pB);
   268 				} while (*++p1==*++p2);
   269 			}
   270 		}
   271 	return(KErrNotFound);
   272 	}
   273 
   274 EXPORT_C TInt TDesC8::Find(const TDesC8 &aDes) const
   275 /**
   276 Searches for the first occurrence of the specified data sequence within this 
   277 descriptor.
   278 
   279 Searching always starts at the beginning of this descriptor's data.
   280 
   281 @param aDes The 8-bit non modifable descriptor containing the data sequence 
   282             to be searched for. 
   283             
   284 @return The offset of the data sequence from the beginning of this descriptor's 
   285         data. KErrNotFound, if the data sequence cannot be found.
   286 */
   287 	{
   288 
   289 	return(Find(aDes.Ptr(),aDes.Length()));
   290 	}
   291 
   292 const TUint8* convTable(TMatchType aType)
   293 	{
   294 	switch (aType)
   295 		{
   296 		case EMatchFolded:
   297 		case EMatchCollated: return __FoldCollTab8;
   298 		default: return NULL;
   299 		}
   300 	}
   301 
   302 inline TUint conv(const TUint8* aStr,const TUint8* aConv)
   303 	{
   304 	TUint c=*aStr;
   305 	return aConv ? aConv[c] : c;
   306 	}
   307 
   308 
   309 inline TUint lookup(const TUint8* aStr,const TUint8* aConv)
   310 	{
   311 	return aConv[*aStr];
   312 	}
   313 
   314 TInt DoMatch8(const TDesC8 &aLeftD,const TDesC8 &aRightD,TMatchType aType)
   315 	{
   316 	const TUint8* table=convTable(aType);
   317 	const TUint8* pRight=aRightD.Ptr();
   318 	const TUint8* pM=pRight-1;				// pre-increment addressing
   319 	const TUint8* pP=pM+aRightD.Length();
   320 	const TUint8* pLeft=aLeftD.Ptr()-1;		// pre-increment addressing
   321 	const TUint8* pB=pLeft;	
   322 	const TUint8* pE=pB+aLeftD.Length();
   323 
   324 	// Match any pattern up to the first star
   325 	TUint c;
   326 	for (;;)
   327 		{
   328 		if (pM==pP)		// exhausted the pattern
   329 			return pB==pE ? 0 : KErrNotFound;
   330 		TUint c=conv(++pM,table);
   331 		if (c==KMatchAny)
   332 			break;
   333 		if (pB==pE)			// no more input
   334 			return KErrNotFound;
   335 		if (c!=conv(++pB,table) && c!=KMatchOne)	// match failed
   336 			return KErrNotFound;
   337 		}
   338 	// reached a star
   339 	if (pM==pP)
   340 		return 0;
   341 	TInt r=pM==pRight ? -1 : 0;
   342 	for (;;)
   343 		{
   344 		c=conv(++pM,table);
   345 		if (c==KMatchAny)
   346 			{
   347 star:		if (pM==pP)		// star at end of pattern, always matches
   348 				return Max(r,0);
   349 			if (r<-1)		// skipped some '?', matches at beginning
   350 				r=0;
   351 			continue;
   352 			}
   353 		if (pB==pE)			// no more input
   354 			return KErrNotFound;
   355 		if (c==KMatchOne)
   356 			{				// skip a character in the input
   357 			if (pM==pP)
   358 				return r+((r>=0) ? 0 : (pE-pLeft));
   359 			++pB;
   360 			if (r<0)
   361 				--r;
   362 			continue;
   363 			}
   364 	// Matching a non-wild character
   365 		for (;;)
   366 			{
   367 			if (table)	// pull this test out of the tight loop (10-20% faster)
   368 				{
   369 				while (lookup(++pB,table)!=c)
   370 					{
   371 					if (pB==pE)				// no more input
   372 						return KErrNotFound;
   373 					}
   374 				}
   375 			else
   376 				{
   377 				while (*++pB!=c)
   378 					{
   379 					if (pB==pE)				// no more input
   380 						return KErrNotFound;
   381 					}
   382 				}
   383 			// Try to match up to the next star
   384 			const TUint8* pb=pB;
   385 			const TUint8* pm=pM;
   386 			for (;;)
   387 				{
   388 				if (pm<pP)
   389 					{
   390 					TUint cc=conv(++pm,table);
   391 					if (cc==KMatchAny)
   392 						{	// sub-match successful, back to main loop
   393 						r+=(r>=0 ? 0 : pB-pLeft);
   394 						pB=pb;
   395 						pM=pm;
   396 						goto star;
   397 						}
   398 					if (pb==pE)
   399 						return KErrNotFound;	// no more input
   400 					if (cc!=conv(++pb,table) && cc!=KMatchOne)
   401 						break;	// sub-match failed, try next input character
   402 					}
   403 				else if (pb==pE)	// end of matching pattern
   404 					return r+(r>=0 ? 0 : pB-pLeft);	// end of input, so have a match
   405 				else
   406 					break;		// try next input character
   407 				}
   408 			}
   409 		}
   410 	}
   411 
   412 EXPORT_C TInt TDesC8::Match(const TDesC8 &aDes) const
   413 /**
   414 Searches this descriptor's data for a match with the match pattern supplied 
   415 in the specified descriptor.
   416 
   417 The match pattern can contain the wildcard characters "*" and "?", where "*" 
   418 matches zero or more consecutive occurrences of any character and "?" matches 
   419 a single occurrence of any character.
   420 
   421 Note that there is no 'escape character', which means that it is not possible
   422 to match either the "*" character itself or the "?" character itself using
   423 this function.
   424 
   425 @param aDes An 8-bit non-modifable descriptor containing the match pattern.
   426 
   427 @return If a match is found, the offset within this descriptor's data where 
   428         the match first occurs. KErrNotFound, if there is no match.
   429 */
   430 	{
   431 
   432 	return DoMatch8(*this,aDes,EMatchNormal);
   433 	}
   434 
   435 EXPORT_C TInt TDesC8::MatchF(const TDesC8 &aDes) const
   436 /**
   437 Searches this descriptor's folded data for a match with the folded match 
   438 pattern supplied in the specified descriptor.
   439 
   440 The match pattern can contain the wildcard characters "*" and "?", where "*" 
   441 matches zero or more consecutive occurrences of any character and "?" matches 
   442 a single occurrence of any character.
   443 
   444 Note that folding is locale-independent behaviour. It is also important to 
   445 note that there can be no guarantee that folding is in any way culturally 
   446 appropriate, and should not be used for matching strings in natural language; 
   447 use MatchC() for this.
   448 
   449 Note that there is no 'escape character', which means that it is not possible
   450 to match either the "*" character itself or the "?" character itself using
   451 this function.
   452 
   453 @param aDes An 8-bit non-modifable descriptor containing the match pattern. 
   454 
   455 @return If a match is found, the offset within this descriptor's data where 
   456         the match first occurs. KErrNotFound, if there is no match. 
   457 
   458 @see TDesC8::MatchC()
   459 */
   460 	{
   461 
   462 	return DoMatch8(*this,aDes,EMatchFolded);
   463 	}
   464 
   465 EXPORT_C TInt TDesC8::MatchC(const TDesC8 &aPattern) const
   466 /**
   467 Searches this descriptor's collated data for a match with the collated match 
   468 pattern supplied in the specified descriptor.
   469 
   470 The function uses the standard collation method for narrow text appropriate to 
   471 the current locale.
   472 	
   473 The match pattern can contain the wildcard characters "*" and "?", where "*" 
   474 matches zero or more consecutive occurrences of any character and "?" matches 
   475 a single occurrence of any character.
   476 
   477 Note that there is no 'escape character', which means that it is not possible
   478 to match either the "*" character itself or the "?" character itself using
   479 this function.
   480 	
   481 @param aPattern An 8-bit non-modifable descriptor containing the match pattern. 
   482 
   483 @return If a match is found, the offset within this descriptor's data where 
   484         the match first occurs. KErrNotFound, if there is no match.
   485 @deprecated
   486 */
   487 	{
   488 #ifndef __KERNEL_MODE__
   489 	return MatchF(aPattern);
   490 #else
   491 	return DoMatch8(*this,aPattern,EMatchCollated);
   492 #endif
   493 	}
   494 
   495 #ifndef __KERNEL_MODE__
   496 
   497 EXPORT_C TInt TDesC8::FindF(const TUint8 *pS,TInt aLenS) const
   498 /**
   499 Searches for the first occurrence of the specified folded data sequence within 
   500 this descriptor's folded data.
   501 
   502 Searching always starts at the beginning of this descriptor's data.
   503 
   504 Note that folding is locale-independent behaviour. It is also important to 
   505 note that there can be no guarantee that folding is in any way culturally 
   506 appropriate, and should not be used for finding strings in natural language; 
   507 use FindC() for this.
   508 
   509 @param pS    A pointer to a location containing the data sequence to be
   510              searched for.
   511 @param aLenS The length of the data sequence to be searched for. This value 
   512              must not be negative, otherwise the function raises a panic.
   513              
   514 @return The offset of the data sequence from the beginning of this descriptor's 
   515         data. KErrNotFound, if the data sequence cannot be found. Zero, if the
   516         length of the search data sequence is zero.
   517 
   518 @panic USER 29 if aLenS is negative
   519 
   520 @see TDesC8::FindC()
   521 */
   522 	{
   523 	if (!aLenS)
   524 		return(0);
   525 	const TUint8* table=convTable(EMatchFolded);
   526 	const TUint8 *pB=Ptr();
   527 	TInt aLenB=Length();
   528 	const TUint8 *pC=pB-1;			// using pre-increment addressing
   529 	TInt i=aLenB-aLenS;
   530 	if (i>=0)
   531 		{
   532 		const TUint8* pEndS=pS+aLenS-1;		// using pre-increment addressing
   533 		const TUint8 *pEndB=pB+i;			// using pre-increment addressing
   534 		TUint s=lookup(pS,table);
   535 		for (;;)
   536 			{
   537 			do
   538 				{
   539 				if (pC==pEndB)
   540 					return KErrNotFound;
   541 				} while (lookup(++pC,table)!=s);
   542 			const TUint8 *p1=pC;
   543 			const TUint8 *p2=pS;
   544 			do
   545 				{
   546 				if (p2==pEndS)
   547 					return (pC-pB);
   548 				} while (lookup(++p1,table)==lookup(++p2,table));
   549 			}
   550 		}
   551 	return(KErrNotFound);
   552 	}
   553 
   554 EXPORT_C TInt TDesC8::FindF(const TDesC8 &aDes) const
   555 /**
   556 Searches for the first occurrence of the specified folded data sequence within 
   557 this descriptor's folded data. 
   558 
   559 Searching always starts at the beginning of this descriptor's data.
   560 
   561 Note that folding is locale-independent behaviour. It is also important to 
   562 note that there can be no guarantee that folding is in any way culturally 
   563 appropriate, and should not be used for finding strings in natural language; 
   564 use FindC() for this.
   565 
   566 @param aDes The 8-bit non-modifable descriptor containing the data sequence 
   567             to be searched for. 
   568             
   569 @return The offset of the data sequence from the beginning of this descriptor's 
   570         data. KErrNotFound, if the data sequence cannot be found. Zero, if the 
   571         length of the search data sequence is zero.
   572 
   573 @see TDesC8::FindC()
   574 */
   575 	{
   576 
   577 	return(FindF(aDes.Ptr(),aDes.Length()));
   578 	}
   579 
   580 EXPORT_C TInt TDesC8::FindC(const TUint8* aText,TInt aLength) const
   581 /**
   582 Searches for the first occurrence of the specified collated data sequence within 
   583 this descriptor's collated data.
   584 	
   585 Searching always starts at the beginning of this descriptor's data. The function 
   586 uses the standard collation method for narrow text appropriate to the current 
   587 locale.
   588 	
   589 @param aText   A pointer to a location containing the data sequence to be
   590                searched for.
   591 @param aLength The length of the data sequence to be searched for.
   592              
   593 @return The offset of the data sequence from the beginning of this descriptor's 
   594         data. KErrNotFound, if the data sequence cannot be found.
   595       
   596 @panic USER 29 if aLength is negative.
   597 @deprecated
   598 */
   599 	{
   600 	return FindF(aText, aLength);
   601 	}
   602 
   603 EXPORT_C TInt TDesC8::FindC(const TDesC8 &aDes) const
   604 /**
   605 Searches for the first occurrence of the specified collated data sequence within 
   606 this descriptor's collated data.
   607 
   608 Searching always starts at the beginning of this descriptor's data. The function 
   609 uses the standard collation method for narrow text appropriate to the current 
   610 locale.
   611 
   612 @param aDes The 8-bit non-modifable descriptor containing the data sequence 
   613             to be searched for. 
   614             
   615 @return The offset of the data sequence from the beginning of this descriptor's 
   616         data. KErrNotFound, if the data sequence cannot be found.
   617 @deprecated
   618 */
   619 	{
   620 
   621 	return(FindC(aDes.Ptr(),aDes.Length()));
   622 	}
   623 
   624 EXPORT_C TInt TDesC8::LocateF(TChar aChar) const
   625 /**
   626 Searches for the first occurrence of a folded character within this
   627 descriptor's folded data.
   628 
   629 The search starts at the beginning of the data,i.e. at the leftmost position.
   630 
   631 Note that folding is locale-independent behaviour. It is also important to 
   632 note that there can be no guarantee that folding is in any way culturally 
   633 appropriate, and should not be used for searching strings in natural language.
   634 
   635 @param aChar The character to be found.
   636 
   637 @return The offset of the character position from the beginning of the data.
   638         KErrNotFound, if no matching character can be found.
   639 */
   640 	{
   641 	TUint c = User::Fold(aChar);
   642 	if(c>=0x100)
   643 		return KErrNotFound;
   644 	const TUint8 *pBuf=Ptr();
   645 	const TUint8 *pB=pBuf-1;
   646 	const TUint8 *pE=pB+Length();
   647 	const TUint8* table=__FoldCollTab8;
   648 	do
   649 		{
   650 		if (pB==pE)
   651 			return KErrNotFound;
   652 		} while (table[*++pB]!=c);
   653 	return pB-pBuf;
   654 	}
   655 #endif	// __KERNEL_MODE__
   656 
   657 #ifndef __DES8_MACHINE_CODED__
   658 EXPORT_C TInt TDesC8::Locate(TChar aChar) const
   659 /**
   660 Searches for the first occurrence of a character within this descriptor's
   661 data.
   662 
   663 The search starts at the beginning of the data, i.e. at the leftmost position.
   664 
   665 @param aChar The character to be found. 
   666 
   667 @return The offset of the character position from the beginning of the data.
   668         KErrNotFound, if no matching character can be found.
   669 */
   670 	{
   671 
   672 	const TUint8 *pBuf=Ptr();
   673 	const TUint8 *pB=pBuf-1;
   674 	const TUint8 *pE=pB+Length();
   675 	do
   676 		{
   677 		if (pB==pE)
   678 			return KErrNotFound;
   679 		} while (*++pB!=aChar);
   680 	return pB-pBuf;
   681 	}
   682 #endif
   683 
   684 #ifndef __DES8_MACHINE_CODED__
   685 EXPORT_C TInt TDesC8::LocateReverse(TChar aChar) const
   686 /**
   687 Searches for the first occurrence of a character within this descriptor's data, 
   688 searching from the end of the data.
   689 
   690 The search starts at the rightmost position.
   691 
   692 @param aChar The character to be found.
   693 
   694 @return The offset of the character position from the beginning of the data.
   695         KErrNotFound, if no matching character can be found.
   696 */
   697 	{
   698 
   699 	TInt len=Length();
   700 	if (len==0)
   701 		return(KErrNotFound);
   702 	const TUint8 *pB=Ptr();
   703 	const TUint8 *pE=pB+len-1;
   704 	while (pE>=pB)
   705 		{
   706 		if (*pE==aChar)
   707 			break;
   708 		pE--;
   709 		}
   710 	return(pE<pB ? KErrNotFound : pE-pB);
   711 	}
   712 #endif
   713 
   714 #ifndef __KERNEL_MODE__
   715 EXPORT_C TInt TDesC8::LocateReverseF(TChar aChar) const
   716 /**
   717 Searches for the first occurrence of a folded character within this descriptor's 
   718 folded data, searching from the end of the data.
   719 
   720 The search starts at the rightmost position. 
   721 
   722 Note that folding is locale-independent behaviour. It is also important to 
   723 note that there can be no guarantee that folding is in any way culturally 
   724 appropriate, and should not be used for searching strings in natural language.
   725 
   726 @param aChar The character to be found 
   727 
   728 @return The offset of the character position from the beginning of the data.
   729         KErrNotFound, if no matching character can be found
   730 */
   731 	{
   732 
   733 	TInt len=Length();
   734 	if (len==0)
   735 		return(KErrNotFound);
   736 	const TUint8 *pB=Ptr();
   737 	const TUint8 *pE=pB+len-1;
   738 	const TUint8* table=__FoldCollTab8;
   739 	TUint c = table[aChar];
   740 	while (pE>=pB)
   741 		{
   742 		if (table[*pE]==c)
   743 			break;
   744 		pE--;
   745 		}
   746 	return(pE<pB ? KErrNotFound : pE-pB);
   747 	}
   748 
   749 EXPORT_C HBufC8 *TDesC8::Alloc() const
   750 /**
   751 Creates a new 8-bit heap descriptor and initialises it with a copy of this 
   752 descriptor's data.
   753 
   754 @return A pointer to the new 8 bit heap descriptor, if creation is successful. 
   755         NULL, if creation of the descriptor fails.
   756 */
   757 	{
   758 
   759 	HBufC8 *pH=HBufC8::New(Length());
   760 	if (pH)
   761 		*pH=(*this);
   762 	return(pH);
   763 	}
   764 
   765 EXPORT_C HBufC8 *TDesC8::AllocL() const
   766 /**
   767 Creates a new 8-bit heap descriptor and initialises it with a copy of this 
   768 descriptor's data.
   769 
   770 The function leaves, if creation of the descriptor fails.
   771 
   772 @return A pointer to the 8-bit heap descriptor, if creation is successful.
   773 */
   774 	{
   775 
   776 	HBufC8 *pH=HBufC8::NewL(Length());
   777 	*pH=(*this);
   778 	return(pH);
   779 	}
   780 
   781 EXPORT_C HBufC8 *TDesC8::AllocLC() const
   782 /**
   783 Creates a new 8-bit heap descriptor, initialises it with a copy of this 
   784 descriptor's data, and puts a pointer to the descriptor onto the cleanup stack.
   785 
   786 The function leaves, if creation of the descriptor fails.
   787 
   788 @return A pointer to the 8 bit heap descriptor, if creation is successful. 
   789         The pointer is also put onto the cleanup stack.
   790 */
   791 	{
   792 
   793 	HBufC8 *pH=HBufC8::NewLC(Length());
   794 	*pH=(*this);
   795 	return(pH);
   796 	}
   797 #endif	// __KERNEL_MODE__
   798 
   799 #if !defined(__DES8_MACHINE_CODED__)
   800 
   801 EXPORT_C TPtrC8 TDesC8::Left(TInt aLength) const
   802 /**
   803 Extracts the leftmost part of the data. 
   804 
   805 The function does not cut or remove any data but constructs a non-modifiable 
   806 pointer descriptor to represent the leftmost part of the data.
   807 
   808 @param aLength The length of the data to be extracted. If this value
   809                is greater than the length of the descriptor, the function
   810                extracts the whole of the descriptor.
   811 
   812 @return The 8-bit non-modifiable pointer descriptor representing the leftmost 
   813         part of the data.
   814 
   815 @panic USER 22 if aLength is negative. 
   816 */
   817 	{
   818 
   819 	__ASSERT_ALWAYS(aLength>=0,Panic(ETDes8PosOutOfRange));
   820 	return(TPtrC8(Ptr(),Min(aLength,Length())));
   821 	}
   822 
   823 EXPORT_C TPtrC8 TDesC8::Right(TInt aLength) const
   824 /**
   825 Extracts the rightmost part of the data.
   826 
   827 The function does not cut or remove any data but constructs a non-modifiable 
   828 pointer descriptor to represent the rightmost part of the data.
   829 
   830 @param aLength The length of data to be extracted. If this value
   831                is greater than the length of the descriptor, the function 
   832                extracts the whole of the descriptor. 
   833                
   834 @return The 8 bit non-modifiable pointer descriptor representing the rightmost 
   835         part of the data.
   836 
   837 @panic USER 22 if aLength is negative. 
   838 */
   839 	{
   840 
   841 	__ASSERT_ALWAYS(aLength>=0,Panic(ETDes8PosOutOfRange));
   842 	TInt len=Length();
   843 	if (aLength>len)
   844 		aLength=len;
   845     return(TPtrC8(Ptr()+len-aLength,aLength));
   846 	}
   847 
   848 EXPORT_C TPtrC8 TDesC8::Mid(TInt aPos) const
   849 /**
   850 Extracts a portion of the data.
   851 
   852 The function does not cut or remove any data but constructs a non-modifiable 
   853 pointer descriptor to represent the defined portion.
   854 
   855 The portion is identified by its starting position and by the length of the 
   856 remainder of the data starting from the specified position.
   857 
   858 @param aPos The starting position of the data to be extracted. This is an 
   859             offset value; a zero value refers to the leftmost data position. 
   860             
   861 @return The 8-bit non-modifiable pointer descriptor representing the specified 
   862         portion of the data.
   863         
   864 @panic USER 22  if aPos is negative or aPos is greater than the
   865                 length of the descriptor.       
   866 */
   867 	{
   868 
   869 	TInt len=Length();
   870 	__ASSERT_ALWAYS(aPos>=0 && aPos<=len,Panic(ETDes8PosOutOfRange));
   871     return(TPtrC8(Ptr()+aPos,len-aPos));
   872 	}
   873 
   874 EXPORT_C TPtrC8 TDesC8::Mid(TInt aPos,TInt aLength) const
   875 /**
   876 Extracts a portion of the data.
   877 
   878 The function does not cut or remove any data but constructs a non-modifiable 
   879 pointer descriptor to represent the defined portion.
   880 
   881 The portion is identified by its starting position and by its length.
   882 
   883 @param aPos    The starting position of the data to be extracted. This is an 
   884                offset value; a zero value refers to the leftmost data position. 
   885 @param aLength The length of data to be extracted.
   886 
   887 @return The 8 bit non-modifiable pointer descriptor representing the specified 
   888         portion of the data.
   889 
   890 @panic USER 22  if aPos is negative or aPos plus aLength is greater than the
   891                 length of the descriptor.
   892 */
   893 	{
   894 
   895 	__ASSERT_ALWAYS(aPos>=0 && (aPos+aLength)<=Length(),Panic(ETDes8PosOutOfRange));
   896     return(TPtrC8(Ptr()+aPos,aLength));
   897 	}
   898 
   899 #endif  // !defined(__DES8_MACHINE_CODED__)
   900 
   901 #if !defined( __DES8_MACHINE_CODED__) | defined(__EABI_CTORS__)
   902 EXPORT_C TBufCBase8::TBufCBase8()
   903 //
   904 // Constructor
   905 //
   906 	: TDesC8(EBufC,0)
   907 	{}
   908 
   909 EXPORT_C TBufCBase8::TBufCBase8(const TUint8 *aString,TInt aMaxLength)
   910 //
   911 // Constructor
   912 //
   913 	: TDesC8(EBufC,0)
   914 	{
   915 	Copy(aString,aMaxLength);
   916 	}
   917 
   918 EXPORT_C TBufCBase8::TBufCBase8(const TDesC8 &aDes,TInt aMaxLength)
   919 //
   920 // Constructor
   921 //
   922 	: TDesC8(EBufC,0)
   923 	{
   924 	Copy(aDes,aMaxLength);
   925 	}
   926 #endif 
   927 
   928 #ifndef __DES8_MACHINE_CODED__
   929 EXPORT_C void TBufCBase8::Copy(const TUint8 *aString,TInt aMaxLength)
   930 //
   931 // Copy from a string.
   932 //
   933 	{
   934 
   935 	TInt len=STRING_LENGTH(aString);
   936 	__ASSERT_ALWAYS(len<=aMaxLength,Panic(ETDes8Overflow));
   937 	memmove(WPtr(), aString, len);
   938 	DoSetLength(len);
   939 	}
   940 
   941 EXPORT_C void TBufCBase8::Copy(const TDesC8 &aDes,TInt aMaxLength)
   942 //
   943 // Copy from a descriptor.
   944 //
   945 	{
   946 
   947 	TInt len=aDes.Length();
   948 	__ASSERT_ALWAYS(len<=aMaxLength,Panic(ETDes8Overflow));
   949 	memmove(WPtr(), aDes.Ptr(), len);
   950 	DoSetLength(len);
   951 	}
   952 #endif
   953 
   954 #ifndef __KERNEL_MODE__
   955 inline HBufC8::HBufC8(TInt aLength)
   956 	:TBufCBase8(aLength)
   957 	{}
   958 
   959 EXPORT_C HBufC8 *HBufC8::New(TInt aMaxLength)
   960 /**
   961 Creates, and returns a pointer to, a new 8-bit heap descriptor.
   962 
   963 The heap descriptor is empty and its length is zero.
   964 
   965 Data can, subsequently, be assigned into it using the assignment operators.
   966 
   967 @param aMaxLength The requested maximum length of the descriptor. Note that 
   968                   the resulting heap cell size and, therefore, the resulting
   969                   maximum length of the descriptor may be larger
   970                   than requested.
   971 
   972 @return A pointer to the new 8-bit heap descriptor. NULL, if the 8-bit heap 
   973         descriptor cannot be created.
   974 
   975 @panic USER 30 if aMaxLength is negative.
   976 
   977 @see HBufC8::operator=()
   978 */
   979 	{
   980 	__ASSERT_ALWAYS(aMaxLength>=0,Panic(ETDes8MaxLengthNegative));
   981 	return new(STD_CLASS::Alloc(_FOFF(HBufC8,iBuf[aMaxLength]))) HBufC8(0);
   982 	}
   983 
   984 EXPORT_C HBufC8 *HBufC8::NewL(TInt aMaxLength)
   985 /** 
   986 Creates, and returns a pointer to, a new 8-bit heap descriptor, and leaves 
   987 on failure.
   988 
   989 The heap descriptor is empty and its length is zero.
   990 
   991 Data can, subsequently, be assigned into it using the assignment operators.
   992 
   993 @param aMaxLength The requested maximum length of the descriptor. Note that 
   994                   the resulting heap cell size and, therefore, the resulting
   995                   maximum length of the descriptor may be larger
   996                   than requested.
   997 
   998 @return A pointer to the new 8 bit heap descriptor. The function leaves, if 
   999         the new 8-bit heap descriptor cannot be created.
  1000 
  1001 @panic USER 30 if aMaxLength is negative.
  1002 
  1003 @see HBufC8::operator=()
  1004 */
  1005 	{
  1006 	return static_cast<HBufC8*>(User::LeaveIfNull(New(aMaxLength)));
  1007 	}
  1008 
  1009 EXPORT_C HBufC8 *HBufC8::NewLC(TInt aMaxLength)
  1010 /**
  1011 Creates, adds a pointer onto the cleanup stack, and returns a pointer to, a 
  1012 new 8 bit heap descriptor; leaves on failure.
  1013 
  1014 The heap descriptor is empty and its length is zero.
  1015 
  1016 Data can, subsequently, be assigned into it using the assignment operators.
  1017 
  1018 @param aMaxLength The requested maximum length of the descriptor. Note that 
  1019                   the resulting heap cell size and, therefore, the resulting
  1020                   maximum length of the descriptor may be larger
  1021                   than requested.
  1022                   
  1023 @return A pointer to the new 8-bit heap descriptor. The function leaves, if 
  1024         the new 8-bit heap descriptor cannot be created.
  1025 
  1026 @panic USER 30 if aMaxLength is negative.
  1027 
  1028 @see HBufC8::operator=()
  1029 */
  1030 	{
  1031 	HBufC8* buf=NewL(aMaxLength);
  1032 	CleanupStack::PushL(buf);
  1033 	return buf;
  1034 	}
  1035 
  1036 EXPORT_C HBufC8 *HBufC8::NewMax(TInt aMaxLength)
  1037 /**
  1038 Creates, and returns a pointer to, a new 8-bit heap descriptor.
  1039 
  1040 No data is assigned into the new descriptor but its length
  1041 is set to aMaxLength.
  1042 
  1043 Data can, subsequently, be assigned into it using the assignment operators.
  1044 
  1045 @param aMaxLength The requested maximum length of the descriptor. Note that 
  1046                   the resulting heap cell size and, therefore, the resulting
  1047                   maximum length of the descriptor may be larger
  1048                   than requested. This also means that the resulting maximum
  1049                   length of the descriptor may be greater than its length.
  1050 
  1051 @return A pointer to the new 8-bit heap descriptor. NULL, if the new 8-bit 
  1052         heap descriptor cannot be created.
  1053 
  1054 @panic USER 30 if aMaxLength is negative.
  1055 
  1056 @see HBufC8::operator=()
  1057 */
  1058 	{
  1059 	__ASSERT_ALWAYS(aMaxLength>=0,Panic(ETDes8MaxLengthNegative));
  1060 	return new(STD_CLASS::Alloc(_FOFF(HBufC8,iBuf[aMaxLength]))) HBufC8(aMaxLength);
  1061 	}
  1062 
  1063 EXPORT_C HBufC8 *HBufC8::NewMaxL(TInt aMaxLength)
  1064 /**
  1065 Creates, and returns a pointer to, a new 8-bit heap descriptor;
  1066 leaves on failure.
  1067 
  1068 No data is assigned into the new descriptor but its length
  1069 is set to aMaxLength.
  1070 
  1071 Data can, subsequently, be assigned into it using the assignment operators.
  1072 
  1073 @param aMaxLength The requested maximum length of the descriptor. Note that 
  1074                   the resulting heap cell size and, therefore, the resulting
  1075                   maximum length of the descriptor may be larger
  1076                   than requested. This also means that the resulting maximum
  1077                   length of the descriptor may be greater than its length.
  1078                   
  1079 @return A pointer to the new 8-bit heap descriptor. The function leaves, if 
  1080         the new 8-bit heap descriptor cannot be created.
  1081 
  1082 @panic USER 30 if aMaxLength is negative.
  1083 
  1084 @see HBufC8::operator=()
  1085 */
  1086 	{
  1087 	return static_cast<HBufC8*>(User::LeaveIfNull(NewMax(aMaxLength)));
  1088 	}
  1089 
  1090 EXPORT_C HBufC8 *HBufC8::NewMaxLC(TInt aMaxLength)
  1091 /**
  1092 Creates, adds a pointer onto the cleanup stack and returns a pointer to, a 
  1093 new 8-bit heap descriptor; leaves on failure.
  1094 
  1095 No data is assigned into the new descriptor but its length
  1096 is set to aMaxLength.
  1097 
  1098 Data can, subsequently, be assigned into it using the assignment operators.
  1099 
  1100 @param aMaxLength The requested maximum length of the descriptor. Note that 
  1101                   the resulting heap cell size and, therefore, the resulting
  1102                   maximum length of the descriptor may be larger than requested.
  1103                   This also means that the resulting maximum
  1104                   length of the descriptor may be greater than its length.
  1105                   
  1106 @return A pointer to the new 8-bit heap descriptor. This is also put onto the 
  1107         cleanup stack. The function leaves, if the new 8-bit heap descriptor
  1108         cannot be created.
  1109 
  1110 @panic USER 30 if aMaxLength is negative.
  1111 
  1112 @see HBufC8::operator=()
  1113 */
  1114 	{
  1115 	HBufC8* buf=NewMaxL(aMaxLength);
  1116 	CleanupStack::PushL(buf);
  1117 	return buf;
  1118 	}
  1119 
  1120 EXPORT_C HBufC8 &HBufC8::operator=(const TUint8 *aString)
  1121 /**
  1122 Copies data into this 8-bit heap descriptor replacing any existing data.
  1123 
  1124 The length of this descriptor is set to reflect the new data.
  1125 
  1126 Note that the maximum length of this (target) descriptor is the length
  1127 of the descriptor buffer in the allocated host heap cell; this may be greater
  1128 than the maximum length specified when this descriptor was created or
  1129 last re-allocated.
  1130 
  1131 @param aString A pointer to a zero-terminated string. 
  1132                  
  1133 @return A reference to this 8 bit heap descriptor.
  1134 
  1135 @panic USER 23  if the length of the string, excluding the zero terminator,
  1136                 is greater than the maximum length of this (target) descriptor,
  1137 */
  1138 	{
  1139 
  1140 	Copy(aString,(STD_CLASS::AllocLen(this)-sizeof(TDesC8))/sizeof(TUint8));
  1141 	return(*this);
  1142 	}
  1143 
  1144 EXPORT_C HBufC8 &HBufC8::operator=(const TDesC8 &aDes)
  1145 /**
  1146 Copies data into this 8-bit heap descriptor replacing any existing data.
  1147 
  1148 The length of this descriptor is set to reflect the new data.
  1149 
  1150 Note that the maximum length of this (target) descriptor is the length
  1151 of the descriptor buffer in the allocated host heap cell; this may be greater
  1152 than the maximum length specified when this descriptor was created or last
  1153 re-allocated.
  1154 
  1155 @param aDes An 8-bit non-modifiable descriptor.
  1156             
  1157 @return A reference to this 8-bit heap descriptor.
  1158 
  1159 @panic USER 23  if the length of the descriptor aDes is greater than the
  1160                 maximum length of this (target) descriptor
  1161 */
  1162 	{
  1163 
  1164 	Copy(aDes,(STD_CLASS::AllocLen(this)-sizeof(TDesC8))/sizeof(TUint8));
  1165 	return(*this);
  1166 	}
  1167 
  1168 EXPORT_C HBufC8 *HBufC8::ReAlloc(TInt aMaxLength)
  1169 /**
  1170 Expands or contracts the heap descriptor.
  1171 
  1172 This is done by:
  1173 
  1174 1. creating a new heap descriptor.
  1175 
  1176 2. copying the original data into the new descriptor.
  1177 
  1178 3. deleting the original descriptor.
  1179 
  1180 @param aMaxLength The new requested maximum length of the descriptor. 
  1181                   Note that the resulting heap cell size and, therefore,
  1182                   the resulting maximum length of the descriptor may be
  1183                   larger than requested.
  1184 
  1185 @return A pointer to the new expanded or contracted 8 bit heap descriptor -  
  1186         the original descriptor is deleted. NULL, if the new 8-bit heap descriptor 
  1187         cannot be created - the original descriptor remains unchanged
  1188 
  1189 @panic USER 26  if aMaxLength is less than the length of the existing data.
  1190 @panic USER 30  if aMaxLength is negative.
  1191 */
  1192 	{
  1193 
  1194 	__ASSERT_ALWAYS(aMaxLength>=0,Panic(ETDes8MaxLengthNegative));
  1195 	__ASSERT_ALWAYS(Length()<=aMaxLength,Panic(ETDes8ReAllocTooSmall));
  1196 	return((HBufC8 *)STD_CLASS::ReAlloc(this,(aMaxLength*sizeof(TUint8))+sizeof(TDesC8)));
  1197 	}
  1198 
  1199 EXPORT_C HBufC8 *HBufC8::ReAllocL(TInt aMaxLength)
  1200 /**
  1201 Expands or contracts the descriptor; leaves on failure.
  1202 
  1203 This is done by:
  1204 
  1205 1. creating a new heap descriptor.
  1206 
  1207 2. copying the original data into the new descriptor.
  1208 
  1209 3. deleting the original descriptor.
  1210 
  1211 @param aMaxLength The new requested maximum length of the descriptor. 
  1212                   Note that the resulting heap cell size and, therefore,
  1213                   the resulting maximum length of the descriptor may be
  1214                   larger than requested.
  1215 
  1216 @return A pointer to the new expanded or contracted 8 bit heap descriptor -  
  1217         the original descriptor is deleted. NULL, if the new 8-bit heap descriptor 
  1218         cannot be created - the original descriptor remains unchanged
  1219 
  1220 @panic USER 26  if aMaxLength is less than the length of the existing data.
  1221 @panic USER 30  if aMaxLength is negative.
  1222 */
  1223 	{
  1224 
  1225 	__ASSERT_ALWAYS(aMaxLength>=0,Panic(ETDes8MaxLengthNegative));
  1226 	__ASSERT_ALWAYS(Length()<=aMaxLength,Panic(ETDes8ReAllocTooSmall));
  1227 	return((HBufC8 *)STD_CLASS::ReAllocL(this,(aMaxLength*sizeof(TUint8))+sizeof(TDesC8)));
  1228 	}
  1229 
  1230 EXPORT_C TPtr8 HBufC8::Des()
  1231 /**
  1232 Creates and returns an 8-bit modifiable pointer descriptor for the data
  1233 represented by this 8-bit heap descriptor.
  1234 
  1235 The content of a heap descriptor normally cannot be altered, other than by 
  1236 complete replacement of the data. Creating a modifiable pointer descriptor 
  1237 provides a way of changing the data.
  1238 
  1239 The modifiable pointer descriptor is set to point to this heap descriptor's 
  1240 data.
  1241 
  1242 The length of the modifiable pointer descriptor is set to the length of this 
  1243 heap descriptor.
  1244 
  1245 The maximum length of the modifiable pointer descriptor is set to the length 
  1246 of the heap descriptor's buffer. Note that the maximum length is the length 
  1247 of the descriptor buffer in the allocated host heap cell; this may be greater 
  1248 than the maximum length requested when this descriptor was originally created 
  1249 or last re-allocated.
  1250 
  1251 When data is modified through this new pointer descriptor, the lengths of 
  1252 both it and this heap descriptor are changed.
  1253 
  1254 Note that it is a common mistake to use Des() to create a TDesC8& reference. 
  1255 While not incorrect, it is simpler and much more efficient to simply dereference 
  1256 the heap descriptor.
  1257 
  1258 @return An 8-bit modifiable pointer descriptor representing the data in this 
  1259         8-bit heap descriptor.
  1260 */
  1261 	{
  1262 	return DoDes((STD_CLASS::AllocLen(this)-sizeof(TDesC8))/sizeof(TUint8));
  1263 	}
  1264 #endif	// __KERNEL_MODE__
  1265 
  1266 #ifndef __DES8_MACHINE_CODED__
  1267 EXPORT_C void TDes8::SetLength(TInt aLength)
  1268 /**
  1269 Sets the length of the data represented by the descriptor to the
  1270 specified value.
  1271 
  1272 @param aLength The new length of the descriptor.
  1273 
  1274 @panic USER 23  if alength is negative or is greater than the maximum length of
  1275                 this (target) descriptor.
  1276 */
  1277 	{
  1278 
  1279 	__ASSERT_ALWAYS(TUint(aLength)<=TUint(MaxLength()),Panic(ETDes8Overflow));
  1280 	DoSetLength(aLength);
  1281 	if (Type()==EBufCPtr)
  1282 		((SBufCPtr8 *)this)->ptr->length=aLength; // Relies on iType==0 for an TBufC
  1283   	}
  1284 
  1285 EXPORT_C void TDes8::SetMax()
  1286 /**
  1287 Sets the length of the data to the maximum length of the descriptor.
  1288 */
  1289 	{
  1290 
  1291 	SetLength(iMaxLength);
  1292 	}
  1293 
  1294 EXPORT_C void TDes8::Copy(const TUint8 *aString)
  1295 /**
  1296 Copies data into this descriptor replacing any existing data.
  1297 
  1298 The length of this descriptor is set to reflect the new data.
  1299 
  1300 @param aString A pointer to a zero-terminated string.
  1301                
  1302 @panic USER 23  if the length of aString, excluding the zero terminator, is
  1303                 greater than the maximum length of this (target) descriptor.
  1304 */
  1305 	{
  1306 
  1307 	TInt len=STRING_LENGTH(aString);
  1308 	SetLength(len);
  1309     memmove(WPtr(), aString, len);
  1310 	}
  1311 
  1312 EXPORT_C void TDes8::Copy(const TUint8 *aBuf,TInt aLength)
  1313 /**
  1314 Copies data into this descriptor replacing any existing data.
  1315 
  1316 The length of this descriptor is set to reflect the new data.
  1317 
  1318 @param aBuf    The start address of data to be copied.
  1319 @param aLength The length of data to be copied.
  1320 
  1321 @panic USER 23  if aLength is greater than the maximum length of
  1322                 this (target) descriptor.
  1323 */
  1324 	{
  1325 
  1326 	SetLength(aLength);
  1327     memmove(WPtr(), aBuf, aLength);
  1328 	}
  1329 
  1330 EXPORT_C void TDes8::Copy(const TDesC8 &aDes)
  1331 /**
  1332 Copies data into this descriptor replacing any existing data.
  1333 
  1334 The length of this descriptor is set to reflect the new data.
  1335 
  1336 @param aDes An 8-bit non-modifiable descriptor. The length of the data cannot 
  1337             be greater than the maximum length of the target descriptor.
  1338 
  1339 @panic USER 23  if the length of aDes is greater than the maximum length of
  1340                 this (target) descriptor.
  1341 */
  1342 	{
  1343 
  1344 	TInt len=aDes.Length();
  1345 	SetLength(len);
  1346     memmove(WPtr(), aDes.Ptr(), len);
  1347 	}
  1348 #endif
  1349 
  1350 #ifndef __KERNEL_MODE__
  1351 EXPORT_C void TDes8::Copy(const TDesC16 &aDes)
  1352 /**
  1353 Copies data into this descriptor replacing any existing data.
  1354 
  1355 The length of this descriptor is set to reflect the new data.
  1356 
  1357 @param aDes A 16-bit non-modifiable descriptor. Each double-byte value can 
  1358             only be copied into the corresponding single byte when the
  1359             double-byte value is less than decimal 256. A double-byte value of
  1360             256 or greater cannot be  copied and the corresponding single byte
  1361             is set to a value of decimal 1.
  1362             
  1363 @panic USER 23  if the length of the aDes is greater than the maximum length
  1364                 of this (target) descriptor.
  1365 */
  1366 	{
  1367 
  1368 	TInt len=aDes.Length();
  1369 	SetLength(len);
  1370 	const TUint16 *pS=aDes.Ptr();
  1371 	const TUint16 *pE=pS+len;
  1372 	TUint8 *pT=WPtr();
  1373 	while (pS<pE)
  1374 		{
  1375 		TUint c=(*pS++);
  1376 		if (c>=0x100)
  1377 			c=1;
  1378 		*pT++=(TUint8)c;
  1379 		}
  1380 	}
  1381 #endif
  1382 
  1383 #ifndef __DES8_MACHINE_CODED__
  1384 EXPORT_C void TDes8::Append(TChar aChar)
  1385 /**
  1386 Appends a character onto the end of this descriptor's data.
  1387 
  1388 The length of this descriptor is incremented to reflect the new content.
  1389 
  1390 @param aChar The single character to be appended. The length of the descriptor 
  1391              is incremented by one. The function assumes that the character
  1392              is non-Unicode and that it can be represented by a single byte.
  1393 
  1394 @panic USER 23  if the resulting new length of this descriptor is greater than
  1395                 its maximum length.
  1396 */
  1397 	{
  1398 
  1399 	TInt len=Length();
  1400 	TUint8 *pB=WPtr()+len;
  1401 	SetLength(len+1);
  1402 	*pB++=(TUint8)aChar;
  1403 	}
  1404 
  1405 EXPORT_C void TDes8::Append(const TUint8 *aBuf,TInt aLength)
  1406 /**
  1407 Appends data onto the end of this descriptor's data.
  1408 
  1409 The length of this descriptor is incremented to reflect the new content.
  1410 
  1411 @param aBuf    A pointer to the data to be copied.
  1412 @param aLength The length of the data to be copied.
  1413 
  1414 @panic USER 23  if the resulting new length of this descriptor is greater than
  1415                 its maximum length.
  1416 @panic USER 29  if aLength is negative.
  1417 */
  1418 	{
  1419 
  1420 	__ASSERT_ALWAYS(aLength>=0,Panic(ETDes8LengthNegative));
  1421 	TInt len=Length();
  1422 	SetLength(len+aLength);
  1423     memmove(WPtr()+len, aBuf, aLength);
  1424 	}
  1425 
  1426 EXPORT_C void TDes8::Append(const TDesC8 &aDes)
  1427 /**
  1428 Appends data onto the end of this descriptor's data.
  1429 
  1430 The length of this descriptor is incremented to reflect the new content.
  1431 
  1432 @param aDes An 8-bit non-modifiable descriptor whose data is to be appended.
  1433 
  1434 @panic USER 23  if the resulting new length of this descriptor is greater than
  1435                 its maximum length.
  1436 */
  1437 	{
  1438 
  1439 	TInt len=Length();
  1440     TInt n=aDes.Length();
  1441 	SetLength(len+n);
  1442     memmove(WPtr()+len, aDes.Ptr(), n);
  1443 	}
  1444 #endif
  1445 
  1446 #ifndef __KERNEL_MODE__
  1447 EXPORT_C void TDes8::Append(const TDesC16 &aDes)
  1448 /**
  1449 Appends data onto the end of this descriptor's data.
  1450 
  1451 The length of this descriptor is incremented to reflect the new content.
  1452 
  1453 @param aDes A 16-bit non-modifiable descriptor whose data is to be appended. 
  1454             Each double-byte value can only be appended as a single byte when
  1455             the double-byte value is less than decimal 256. A double-byte value
  1456             of 256 or greater cannot be appended and the corresponding single
  1457             byte is set to a value of decimal 1.
  1458 
  1459 @panic USER 23  if the resulting new length of this descriptor is greater than
  1460                 its maximum length.
  1461 */
  1462 	{
  1463 
  1464 	TInt len=Length();
  1465 	TInt n=aDes.Length();
  1466 	const TUint16* pS=aDes.Ptr();
  1467 	const TUint16* pE=pS+n;
  1468 	TUint8 *pT=WPtr()+len;
  1469 	SetLength(len+n);
  1470 	while (pS<pE)
  1471 		{
  1472 		TUint c=(*pS++);
  1473 		if (c>=0x100)
  1474 			c=1;
  1475 		*pT++=(TUint8)c;
  1476 		}
  1477 	}
  1478 #endif
  1479 
  1480 #ifndef __KERNEL_MODE__
  1481 EXPORT_C void TDes8::Swap(TDes8 &aDes)
  1482 /**
  1483 Swaps the data represented by this descriptor with the data represented by 
  1484 the specified descriptor.
  1485 
  1486 The lengths of both descriptors are swapped to reflect the change.
  1487 
  1488 Note that each descriptor must be capable of accommodating the contents of
  1489 the other descriptor.
  1490 
  1491 @param aDes The 8-bit modifiable descriptor whose data is to be swapped with 
  1492             the data of this descriptor.
  1493             
  1494 @panic USER 23  if the maximum length of either descriptor is smaller than the 
  1495                 length of the other descriptor.
  1496 */
  1497 	{
  1498 
  1499 	TInt l=Length();
  1500 	TInt r=aDes.Length();
  1501 	aDes.SetLength(l);
  1502 	SetLength(r);
  1503 	TInt s=Min(l,r);
  1504 	l-=s;
  1505 	r-=s;
  1506 	TUint8 *pL=WPtr();
  1507 	TUint8 *pR=aDes.WPtr();
  1508 	while (s--)
  1509 		{
  1510 		TChar a=(*pL);
  1511 		*pL++=(*pR);
  1512 		*pR++=(TUint8)a;
  1513 		}
  1514 	while (l--)
  1515 		*pR++=(*pL++);
  1516 	while (r--)
  1517 		*pL++=(*pR++);
  1518 	}
  1519 #endif
  1520 
  1521 #ifndef __DES8_MACHINE_CODED__
  1522 EXPORT_C void TDes8::Fill(TChar aChar)
  1523 /**
  1524 Fills the descriptor's data area with the specified character, replacing any 
  1525 existing data.
  1526 
  1527 The descriptor is filled from the beginning up to its current length. The 
  1528 descriptor's length does not change. It is not filled to its maximum length.
  1529 
  1530 @param aChar The fill character. The function assumes that the character is 
  1531              non-Unicode, and that it can be represented by a single byte.
  1532 */
  1533 	{
  1534 
  1535     memset(WPtr(), (TInt)(aChar.operator TUint()), Length());
  1536 	}
  1537 #endif
  1538 
  1539 EXPORT_C void TDes8::Fill(TChar aChar,TInt aLength)
  1540 /**
  1541 Fills the descriptor's data area with the specified character, replacing any 
  1542 existing data.
  1543 
  1544 The descriptor is filled with the specified number of characters.
  1545 and its length is changed to reflect this.
  1546 
  1547 @param aChar   The fill character. The function assumes that the character is 
  1548                non-Unicode, and that it can be represented by a single byte. 
  1549 @param aLength The new length of the descriptor and the number of fill
  1550                characters to be copied into it.
  1551                
  1552 @panic USER 23  if aLength is negative or is greater than the maximum length
  1553                 of this descriptor.
  1554 */
  1555 	{
  1556 
  1557 	SetLength(aLength);
  1558     memset(WPtr(), (TInt)(aChar.operator TUint()), aLength);
  1559 	}
  1560 
  1561 #ifndef __KERNEL_MODE__
  1562 EXPORT_C void TDes8::AppendFill(TChar aChar,TInt aLength)
  1563 /**
  1564 Appends and fills this descriptor with the specified character.
  1565 
  1566 The descriptor is appended with the specified number of characters.
  1567 and its length is changed to reflect this.
  1568 
  1569 @param aChar   The fill character. The function assumes that the character
  1570                is non-Unicode and that it can be represented by a single byte.
  1571 @param aLength The number of fill characters to be appended.
  1572 
  1573 @panic USER 23  if aLength is negative, or the resulting length of this
  1574                 descriptor is greater than its maximum length.
  1575 */
  1576 	{
  1577 
  1578 	TInt len=Length();
  1579 	SetLength(len+aLength);
  1580     memset(WPtr()+len, (TInt)(aChar.operator TUint()), aLength);
  1581 	}
  1582 #endif
  1583 
  1584 #ifndef __DES8_MACHINE_CODED__
  1585 #ifndef __KERNEL_MODE__
  1586 EXPORT_C void TDes8::ZeroTerminate()
  1587 /**
  1588 Appends a zero terminator onto the end of this descriptor's data.
  1589 
  1590 The length of the descriptor is not changed. It must, however, be strictly
  1591 less than the descriptor's maximum length. 
  1592 This condition guarantees that there is sufficient space for the
  1593 zero terminator.
  1594 
  1595 @panic USER 23  if the descriptor's length is not strictly less than its
  1596                 maximum length.
  1597 */
  1598 	{
  1599 
  1600 	TInt len=Length();
  1601 	__ASSERT_ALWAYS(len<MaxLength(),Panic(ETDes8Overflow));
  1602 	WPtr()[len]=0;
  1603 	}
  1604 
  1605 EXPORT_C const TUint8 *TDes8::PtrZ()
  1606 /**
  1607 Appends a zero terminator onto the end of this descriptor's data and returns 
  1608 a pointer to the data.
  1609 
  1610 The length of the descriptor is not changed. It must, however, be strictly
  1611 less than the descriptor's maximum length.
  1612 This condition guarantees that there is sufficient space for the
  1613 zero terminator.
  1614 
  1615 @return A pointer to the descriptor's zero terminated data.
  1616 
  1617 @panic USER 23  if the descriptor's length is not strictly less than its
  1618                 maximum length.
  1619 */
  1620 	{
  1621 
  1622 	ZeroTerminate();
  1623 	return(Ptr());
  1624 	}
  1625 #endif
  1626 
  1627 EXPORT_C void TDes8::Zero()
  1628 /**
  1629 Sets the length of the data to zero.
  1630 */
  1631 	{
  1632 
  1633 	SetLength(0);
  1634 	}
  1635 
  1636 EXPORT_C void TDes8::FillZ()
  1637 /**
  1638 Fills the descriptor's data area with binary zeroes, i.e. 0x00, replacing any 
  1639 existing data.
  1640 
  1641 The descriptor is filled from the beginning up to its current length. The 
  1642 descriptor's length does not change. It is not filled to its maximum length.
  1643 */
  1644 	{
  1645 
  1646     memclr(WPtr(), Length());
  1647 	}
  1648 #endif
  1649 
  1650 EXPORT_C void TDes8::FillZ(TInt aLength)
  1651 /**
  1652 Fills the descriptor's data area with binary zeroes, i.e. 0x00, replacing any 
  1653 existing data, and changes its length.
  1654 
  1655 The descriptor is filled with the specified number of binary zeroes.
  1656 The descriptor's length is changed to reflect this.
  1657 
  1658 @param aLength The new length of the descriptor and the number of binary zeroes
  1659                to be copied into it. 
  1660                
  1661 @panic USER 23  if aLength is negative, or is greater than the maximum length
  1662                 of this descriptor.
  1663 */
  1664 	{
  1665 
  1666 	SetLength(aLength);
  1667     memclr(WPtr(), aLength);
  1668 	}
  1669 
  1670 #ifndef __KERNEL_MODE__
  1671 EXPORT_C void TDes8::Fold()
  1672 /**
  1673 Performs folding on the content of this descriptor.
  1674 
  1675 Note that folding is locale-independent behaviour. It is also important to 
  1676 note that there can be no guarantee that folding is in any way culturally 
  1677 appropriate, and should not be used when dealing with strings in natural
  1678 language.
  1679 */
  1680 	{
  1681 
  1682 	TUint8 *pB=WPtr();
  1683 	TInt len=Length();
  1684 	const TUint8* table=__FoldCollTab8;
  1685 	while (len--)
  1686 		{
  1687 		*pB=table[*pB];
  1688 		pB++;
  1689 		}
  1690 	}
  1691 
  1692 EXPORT_C void TDes8::Collate()
  1693 /**
  1694 Performs collation on the content of this descriptor.
  1695 @deprecated
  1696 */
  1697 	{
  1698 
  1699 	TUint8 *pB=WPtr();
  1700 	TInt len=Length();
  1701 	while (len--)
  1702 		{
  1703 		TChar c=User::Collate(*pB);
  1704 		*pB++=(TUint8)c;
  1705 		}
  1706 	}
  1707 
  1708 EXPORT_C void TDes8::LowerCase()
  1709 /**
  1710 Converts the content of this descriptor to lower case.
  1711 
  1712 Conversion is implemented as appropriate to the current locale.
  1713 */
  1714 	{
  1715 
  1716 	TUint8 *pB=WPtr();
  1717 	TInt len=Length();
  1718 	while (len--)
  1719 		{
  1720 		TCharLC c(*pB);
  1721 		*pB++=(TUint8)c;
  1722 		}
  1723 	}
  1724 
  1725 EXPORT_C void TDes8::UpperCase()
  1726 /**
  1727 Converts the content of this descriptor to upper case.
  1728 
  1729 Conversion is implemented as appropriate to the current locale.
  1730 */
  1731 	{
  1732 
  1733 	TUint8 *pB=WPtr();
  1734 	TInt len=Length();
  1735 	while (len--)
  1736 		{
  1737 		TCharUC c(*pB);
  1738 		*pB++=(TUint8)c;
  1739 		}
  1740 	}
  1741 
  1742 EXPORT_C void TDes8::Capitalize()
  1743 /**
  1744 Capitalises the content of this descriptor.
  1745 
  1746 Capitalisation is implemented as appropriate to the current locale.
  1747 */
  1748 	{
  1749 
  1750 	TUint8 *pB=WPtr();
  1751 	TInt len=Length();
  1752 	if (len--)
  1753 		{
  1754 		*pB=(TUint8)User::TitleCase(*pB);
  1755 		++pB;
  1756 		while (len--)
  1757 			{
  1758 			*pB=(TUint8)User::LowerCase(*pB);
  1759 			++pB;
  1760 			}
  1761 		}
  1762 	}
  1763 
  1764 EXPORT_C void TDes8::CopyF(const TDesC8 &aDes)
  1765 /**
  1766 Copies and folds data from the specified descriptor into this descriptor
  1767 replacing any existing data.
  1768 
  1769 The length of this descriptor is set to reflect the new 
  1770 data.
  1771 
  1772 Note that folding is locale-independent behaviour. It is also important to 
  1773 note that there can be no guarantee that folding is in any way culturally 
  1774 appropriate, and should not be used when dealing with strings in natural
  1775 language.
  1776 
  1777 @param aDes An 8-bit non-modifiable descriptor.
  1778 
  1779 @panic USER 23  if the length of aDes is greater than the maximum length of
  1780                 this target descriptor.
  1781 */
  1782 	{
  1783 
  1784 	TInt len=aDes.Length();
  1785 	SetLength(len);
  1786 	const TUint8 *pS=aDes.Ptr();
  1787 	TUint8 *pT=WPtr();
  1788 	const TUint8* table=__FoldCollTab8;
  1789 	while (len--)
  1790 		{
  1791 		*pT++=table[*pS++];
  1792 		}
  1793 	}
  1794 
  1795 EXPORT_C void TDes8::CopyC(const TDesC8 &aDes)
  1796 /**
  1797 Copies and collates data from the specified descriptor 
  1798 into this descriptor replacing any existing data.
  1799 
  1800 The length of this descriptor is set to reflect the new data.
  1801 
  1802 @param aDes An 8 bit non-modifiable descriptor.
  1803 
  1804 @panic USER 23  if the length of aDes is greater than the maximum length of
  1805                 this target descriptor.
  1806 @deprecated
  1807 */
  1808 	{
  1809 
  1810 	TInt len=aDes.Length();
  1811 	SetLength(len);
  1812 	const TUint8 *pS=aDes.Ptr();
  1813 	TUint8 *pT=WPtr();
  1814 	while (len--)
  1815 		{
  1816 		TChar c=User::Collate(*pS++);
  1817 		*pT++=(TUint8)c;
  1818 		}
  1819 	}
  1820 
  1821 EXPORT_C void TDes8::CopyLC(const TDesC8 &aDes)
  1822 /**
  1823 Copies text from the specified descriptor and converts it to lower case before 
  1824 putting it into this descriptor, replacing any existing data.
  1825 
  1826 The length of this descriptor is set to reflect the new data.
  1827 
  1828 Conversion to lower case is implemented as appropriate to the current locale.
  1829 
  1830 @param aDes An 8-bit non-modifiable descriptor.
  1831 
  1832 @panic USER 23  if the length of aDes is greater than the maximum length of
  1833                 this target descriptor.
  1834 */
  1835 	{
  1836 
  1837 	TInt len=aDes.Length();
  1838 	SetLength(len);
  1839 	const TUint8 *pS=aDes.Ptr();
  1840 	TUint8 *pT=WPtr();
  1841 	while (len--)
  1842 		{
  1843 		TCharLC c(*pS++);
  1844 		*pT++=(TUint8)c;
  1845 		}
  1846 	}
  1847 
  1848 EXPORT_C void TDes8::CopyUC(const TDesC8 &aDes)
  1849 /**
  1850 Copies text from the specified descriptor and converts it to upper case before 
  1851 putting it into this descriptor, replacing any existing data.
  1852 
  1853 The length of this descriptor is set to reflect the new data.
  1854 
  1855 Conversion to upper case is implemented as appropriate to the current locale.
  1856 
  1857 @param aDes An 8-bit non-modifiable descriptor.
  1858 
  1859 @panic USER 23  if the length of aDes is greater than the maximum length of
  1860                 this target descriptor.
  1861 */
  1862 	{
  1863 
  1864 	TInt len=aDes.Length();
  1865 	SetLength(len);
  1866 	const TUint8 *pS=aDes.Ptr();
  1867 	TUint8 *pT=WPtr();
  1868 	while (len--)
  1869 		{
  1870 		TCharUC c(*pS++);
  1871 		*pT++=(TUint8)c;
  1872 		}
  1873 	}
  1874 
  1875 EXPORT_C void TDes8::CopyCP(const TDesC8 &aDes)
  1876 /**
  1877 Copies text from the specified descriptor and capitalises it before putting 
  1878 it into this descriptor, replacing any existing data.
  1879 
  1880 The length of this descriptor is set to reflect the new data.
  1881 
  1882 Capitalisation is implemented as appropriate to the current locale.
  1883 
  1884 @param aDes An 8-bit non-modifiable descriptor.
  1885 
  1886 @panic USER 23  if the length of aDes is greater than the maximum length of
  1887                 this target descriptor.
  1888 */
  1889 	{
  1890 
  1891 	TInt len=aDes.Length();
  1892 	SetLength(len);
  1893 	const TUint8 *pS=aDes.Ptr();
  1894 	TUint8 *pT=WPtr();
  1895 	if (len--)
  1896 		{
  1897 		TChar c(*pS++);
  1898 #ifdef _UNICODE
  1899 		c.TitleCase();
  1900 #else
  1901 		c.UpperCase();
  1902 #endif
  1903 		*pT++=(TUint8)c;
  1904 		while (len--)
  1905 			{
  1906 			TCharLC c=(*pS++);
  1907 			*pT++=(TUint8)c;
  1908 			}
  1909 		}
  1910 	}
  1911 
  1912 EXPORT_C void TDes8::Repeat(const TUint8 *aBuf,TInt aLength)
  1913 /**
  1914 Copies data with repetition into this descriptor, from a memory location
  1915 specified by pointer, replacing any existing data.
  1916 
  1917 Copying proceeds until this descriptor is filled up to its current length. 
  1918 If it cannot contain a whole number of copies of the source data, then the 
  1919 last copy is truncated.
  1920 
  1921 @param aBuf    A pointer to data to be repeatedly copied. 
  1922 @param aLength The length of data to be copied.
  1923 
  1924 @panic USER 29  if aLength is negative.
  1925 */
  1926 	{
  1927 
  1928 	__ASSERT_ALWAYS(aLength>=0,Panic(ETDes8LengthNegative));
  1929 	TUint8 *pB=WPtr();
  1930 	TInt len=Length();
  1931 	if (len && aLength)
  1932 		{
  1933 		while (len)
  1934 			{
  1935 			TInt i=Min(len,aLength);
  1936 			pB=memCopy(pB,aBuf,i);
  1937 			len-=i;
  1938 			}
  1939 		}
  1940 	}
  1941 
  1942 EXPORT_C void TDes8::Repeat(const TDesC8 &aDes)
  1943 /**
  1944 Copies data with repetition into this descriptor, from another descriptor,
  1945 replacing any existing data.
  1946 
  1947 Copying proceeds until this descriptor is filled up to its current length. 
  1948 If it cannot contain a whole number of copies of the source data, then the 
  1949 last copy is truncated.
  1950 
  1951 @param aDes An 8-bit non-modifiable descriptor whose data is to be repeatedly 
  1952             copied.
  1953 */
  1954 	{
  1955 
  1956 	Repeat(aDes.Ptr(),aDes.Length());
  1957 	}
  1958 
  1959 EXPORT_C void TDes8::Trim()
  1960 /**
  1961 Deletes leading and trailing whitespace characters from the descriptor's data.
  1962 
  1963 The length of the descriptor is reduced to reflect the loss of the whitespace characters.
  1964 
  1965 @see TDes8::TrimLeft()
  1966 @see TDes8::TrimRight()
  1967 */
  1968 	{
  1969 
  1970 	TrimLeft();
  1971 	TrimRight();
  1972 	}
  1973 
  1974 EXPORT_C void TDes8::TrimAll()
  1975 /**
  1976 Deletes leading and trailing whitespace characters from the descriptor's data and 
  1977 replaces each contiguous set of whitespace characters within the data by one whitespace 
  1978 character.
  1979 
  1980 The length of the descriptor is reduced to reflect the loss of the whitespace 
  1981 characters.
  1982 
  1983 @see TDes8::Trim()
  1984 */
  1985 	{
  1986 
  1987 	TrimLeft();
  1988 	TrimRight();
  1989 	TUint8 *pBuf=(TUint8 *)Ptr();
  1990 	TUint8 *pSrc=pBuf;
  1991 	TUint8 *pDst=pBuf;
  1992 	TInt len=Length();
  1993 	TInt spaces=0;
  1994 	while (len--)
  1995 		{
  1996 		TChar c=*pSrc;
  1997 		if (c.IsSpace())
  1998 			{
  1999 			if (spaces++==0)
  2000 				{
  2001 				if (pDst!=pSrc)
  2002 					*pDst=*pSrc;
  2003 				pDst++;
  2004 				}
  2005 			}
  2006 		else
  2007 			{
  2008 			spaces=0;
  2009 			if (pDst!=pSrc)
  2010 				*pDst=*pSrc;
  2011 			pDst++;
  2012 			}
  2013 		pSrc++;
  2014 		}
  2015 	Delete(pDst-pBuf, pSrc-pDst);
  2016 	}
  2017 
  2018 EXPORT_C void TDes8::TrimLeft()
  2019 /**
  2020 Deletes leading whitespace characters from the descriptor's data.
  2021 
  2022 All whitespace characters up to, but not including the first non-whitespace
  2023 character, are deleted.
  2024 
  2025 The length of the descriptor is reduced to reflect the loss of the
  2026 whitespace characters.
  2027 */
  2028 	{
  2029 
  2030 	const TUint8 *pBuf=Ptr();
  2031 	const TUint8 *pB=pBuf;
  2032 	TInt len=Length();
  2033 	while (len--)
  2034 		{
  2035 		TChar c=(*pB);
  2036 		if (!c.IsSpace())
  2037 			break;
  2038 		pB++;
  2039 		}
  2040 	Delete(0,pB-pBuf);
  2041 	}
  2042 
  2043 EXPORT_C void TDes8::TrimRight()
  2044 /**
  2045 Deletes trailing whitespace characters from the descriptor's data.
  2046 
  2047 The process starts on the right hand side of the descriptor's data
  2048 and proceeds to the left. 
  2049 
  2050 All whitespace characters up to, but not including the first non-whitespace character, 
  2051 are deleted.
  2052 
  2053 The length of the descriptor is reduced to reflect the loss of the whitespace
  2054 characters.
  2055 */
  2056 	{
  2057 
  2058 	TInt len=Length();
  2059 	if (len==0)
  2060 		return;
  2061 	const TUint8 *pB=Ptr()+len-1;
  2062 	TInt s=len;
  2063 	while (s)
  2064 		{
  2065 		TChar c=(*pB--);
  2066 		if (!c.IsSpace())
  2067 			break;
  2068 		s--;
  2069 		}
  2070 	Delete(s,len-s);
  2071 	}
  2072 
  2073 EXPORT_C void TDes8::Insert(TInt aPos,const TDesC8 &aDes)
  2074 /**
  2075 Inserts data into this descriptor.
  2076 
  2077 The length of this descriptor is changed to reflect the extra data.
  2078 
  2079 @param aPos The position within the data where insertion is to start. This 
  2080             is an offset value; a zero value refers to the leftmost data
  2081             position.
  2082             
  2083 @param aDes An 8 bit non modifiable descriptor whose data is to be inserted.
  2084 
  2085 @panic USER 22  if aPos is negative or is greater than the length of this
  2086                 descriptor.
  2087 @panic USER 23  if the resulting length of this descriptor is greater than its
  2088                 maximum length.
  2089 */
  2090 	{
  2091 
  2092 	TInt len=Length();
  2093 	__ASSERT_ALWAYS(aPos>=0 && aPos<=len,Panic(ETDes8PosOutOfRange));
  2094 	TInt s=aDes.Length();
  2095 	__ASSERT_ALWAYS((len+s)<=MaxLength(),Panic(ETDes8Overflow));
  2096 	TUint8 *pB=WPtr();
  2097 	memmove(pB+aPos+s,pB+aPos,len-aPos);
  2098 	memmove(pB+aPos,aDes.Ptr(),aDes.Length());
  2099 	SetLength(len+s);
  2100 	}
  2101 
  2102 EXPORT_C void TDes8::Delete(TInt aPos,TInt aLength)
  2103 /**
  2104 Deletes data from this descriptor.
  2105 
  2106 The length of this descriptor is changed to reflect the loss of data.
  2107 
  2108 @param aPos    The position within the data where deletion is to start. This 
  2109                is an offset value; a zero value refers to the leftmost data
  2110                position.
  2111                
  2112 @param aLength The length of data to be deleted. If necessary, the function 
  2113                adjusts this value to ensure that no data beyond the end of the
  2114                descriptor data area is deleted.
  2115 
  2116 @panic USER 22  if aPos is negative or is greater than the length of this
  2117                 descriptor.
  2118 */
  2119 	{
  2120 
  2121 	TInt len=Length();
  2122 	__ASSERT_ALWAYS(aPos>=0 && aPos<=len,Panic(ETDes8PosOutOfRange));
  2123 	TInt d=Min(len-aPos,aLength);
  2124 	TUint8 *pB=WPtr();
  2125 	memmove(pB+aPos,pB+aPos+d,len-aPos-d);
  2126 	SetLength(len-d);
  2127 	}
  2128 
  2129 EXPORT_C void TDes8::Replace(TInt aPos,TInt aLength,const TDesC8 &aDes)
  2130 /**
  2131 Replaces data in this descriptor.
  2132 
  2133 The specified length can be different to the length of the replacement data.
  2134 The length of this descriptor changes to reflect the change of data.
  2135 
  2136 @param aPos    The position within the data where replacement is to start.
  2137                This is an offset value; a zero value refers to the leftmost
  2138                data position.
  2139                
  2140 @param aLength The length of data to be replaced.
  2141 
  2142 @param aDes    The source 8-bit non-modifiable descriptor whose data is to
  2143                replace the target descriptor's data at aPos.
  2144 
  2145 @panic USER 20  if aLength is negative or the sum of aLength and aPos is
  2146                 greater than the length of this descriptor.
  2147                 
  2148 @panic USER 22  if aPos is negative or is greater than the length of this
  2149                 descriptor.
  2150                 
  2151 @panic USER 23  if the resulting length of this descriptor is greater than its
  2152                 maximum length.
  2153 
  2154 @panic USER 28  if the length of the source descriptor aDes is negative or is
  2155                 greater than the maximum length of this target descriptor,
  2156 */
  2157 	{
  2158 
  2159 	TInt len=Length();
  2160 	__ASSERT_ALWAYS(aPos>=0 && aPos<=len,Panic(ETDes8PosOutOfRange));
  2161 	__ASSERT_ALWAYS(aLength>=0 && aPos+aLength<=len,Panic(ETDes8LengthOutOfRange));
  2162 	TInt s=aDes.Length();
  2163 	TInt maxlen=MaxLength();
  2164 	__ASSERT_ALWAYS(s>=0 && s<=maxlen,Panic(ETDes8RemoteLengthOutOfRange));
  2165 	__ASSERT_ALWAYS((len+s-aLength)<=maxlen,Panic(ETDes8Overflow));
  2166 	TUint8 *pB=WPtr();
  2167 	memmove(pB+aPos+s,pB+aPos+aLength,len-aPos-aLength);
  2168 	memmove(pB+aPos,aDes.Ptr(),s);
  2169 	SetLength(len+s-aLength);
  2170 	}
  2171 
  2172 EXPORT_C void TDes8::Justify(const TDesC8 &aDes,TInt aWidth,TAlign anAlignment,TChar aFill)
  2173 /**
  2174 Copies data into this descriptor and justifies it, replacing any existing data.
  2175 
  2176 The length of this descriptor is set to reflect the new data.
  2177 
  2178 The target area is considered to be an area of specified width positioned at
  2179 the beginning of this descriptor's data area. Source data is copied into, and
  2180 aligned within this target area according to the specified alignment
  2181 instruction.
  2182 
  2183 If the length of the target area is larger than the length of the source, then
  2184 spare space within the target area is padded with the fill character.
  2185 
  2186 @param aDes        An 8-bit non-modifiable descriptor containing the source data.
  2187                    The length of the data to be copied is the smaller of:
  2188                    the length of the source descriptor, and 
  2189                    the width of the target area (only if this is not the
  2190                    explicit negative value KDefaultJustifyWidth).
  2191 
  2192 @param aWidth      The width of the target area. If this has the specific
  2193                    negative value KDefaultJustifyWidth, then the width is
  2194                    re-set to the length of the data source.
  2195 
  2196 @param anAlignment The alignment of the data within the target area
  2197 
  2198 @param aFill       The fill character used to pad the target area. 
  2199 
  2200 @panic USER 23  if the resulting length of this descriptor is greater than
  2201                 its maximum length or aWidth has a negative value other 
  2202                 than KDefaultJustifyWidth.
  2203 */
  2204 	{
  2205 
  2206     Zero();
  2207     AppendJustify(aDes.Ptr(),aDes.Length(),aWidth,anAlignment,aFill);
  2208     }
  2209 
  2210 EXPORT_C void TDes8::AppendJustify(const TDesC8 &aDes,TInt aWidth,TAlign anAlignment,TChar aFill)
  2211 /**
  2212 Appends data onto the end of this descriptor's data and justifies it.
  2213 	
  2214 The source of the appended data is an existing descriptor.
  2215 	
  2216 The target area is considered to be an area of specified width, immediately 
  2217 following this descriptor's existing data. Source data is copied into, and 
  2218 aligned within this target area according to the specified alignment instruction.
  2219 	
  2220 If the length of the target area is larger than the length of the source, 
  2221 then spare space within the target area is padded with the fill character.
  2222 		
  2223 @param aDes        An 8-bit non-modifiable descriptor containing the source
  2224                    data. The length of the data to be copied is the smaller of:
  2225                    the length of the source descriptor, and
  2226                    the width of the target area (only if this is not the
  2227                    explicit negative value KDefaultJustifyWidth). 
  2228 	
  2229 @param aWidth      The width of the target area. If this has the specific
  2230                    negative value KDefaultJustifyWidth, then the width is
  2231 	               re-set to the length of the data source.
  2232 	
  2233 @param anAlignment The alignment of the data within the target area. 
  2234 	
  2235 @param aFill       The fill character used to pad the target area.
  2236 
  2237 @panic USER 23  if the resulting length of this descriptor is greater than
  2238                 its maximum length or aWidth has a negative value other 
  2239                 than KDefaultJustifyWidth.
  2240 */
  2241 	{
  2242 
  2243     AppendJustify(aDes.Ptr(),aDes.Length(),aWidth,anAlignment,aFill);
  2244     } 
  2245 
  2246 EXPORT_C void TDes8::AppendJustify(const TDesC8 &aDes,TInt aLength,TInt aWidth,TAlign anAlignment,TChar aFill)
  2247 /**
  2248 Appends data onto the end of this descriptor's data and justifies it.
  2249 	
  2250 The source of the appended data is an existing descriptor.
  2251 	
  2252 The target area is considered to be an area of specified width, immediately 
  2253 following this descriptor's existing data. Source data is copied into, and 
  2254 aligned within this target area according to the specified alignment instruction.
  2255 	
  2256 If the length of the target area is larger than the length of the source, 
  2257 then spare space within the target area is padded with the fill character.
  2258 	
  2259 @param aDes        An 8-bit non-modifiable descriptor containing the source data. 
  2260 
  2261 @param aLength     The length of data to be copied from the source descriptor. 
  2262                    If this is greater than the width of the target area, then
  2263                    the length of data copied is limited to the width.
  2264                    The length of data to be copied must not be 	greater than
  2265                    the length of the source descriptor. Note that this
  2266                    condition is not automatically tested. 
  2267                    
  2268 @param aWidth      The width of the target area. If this has the specific negative 
  2269                    value KDefaultJustifyWidth, then the width is
  2270                    re-set to the length of the data source.
  2271 
  2272 @param anAlignment The alignment of the data within the target area. 
  2273 
  2274 @param aFill       The fill character used to pad the target area.
  2275 
  2276 @panic USER 23  if the resulting length of this descriptor is greater than
  2277                 its maximum length or aWidth has a negative value other 
  2278                 than KDefaultJustifyWidth.
  2279 */
  2280 	{
  2281 
  2282     AppendJustify(aDes.Ptr(),aLength,aWidth,anAlignment,aFill);
  2283     } 
  2284 
  2285 EXPORT_C void TDes8::AppendJustify(const TUint8 *aString,TInt aWidth,TAlign anAlignment,TChar aFill)
  2286 /**
  2287 Appends a zero terminated string onto the end of this descriptor's data and 
  2288 justifies it.
  2289 
  2290 The zero terminator is not copied.
  2291 
  2292 The target area is considered to be an area of specified width, immediately 
  2293 following this descriptor's existing data. Source data is copied into, and 
  2294 aligned within, this target area according to the specified alignment instruction.
  2295 
  2296 If the length of the target area is larger than the length of the source, 
  2297 then spare space within the target area is padded with the fill character.
  2298 
  2299 @param aString     A pointer to a zero terminated string. The length of the
  2300                    data to be copied is the smaller of:
  2301                    the length of the string (excluding the zero terminator),
  2302                    and the width of the target area (only if this is not the
  2303                    explicit negative value KDefaultJustifyWidth). 
  2304 
  2305 @param aWidth      The width of the target area. If this has the specific
  2306                    negative value KDefaultJustifyWidth, then the width
  2307                    is re-set to the length of the  zero terminated string
  2308                    (excluding the zero terminator).
  2309                
  2310 @param anAlignment The alignment of the data within the target area. 
  2311 
  2312 @param aFill       The fill character used to pad the target area.
  2313 
  2314 @panic USER 23  if the resulting length of this descriptor is greater than
  2315                 its maximum length or aWidth has a negative value other 
  2316                 than KDefaultJustifyWidth.
  2317 */
  2318 	{
  2319 
  2320     AppendJustify(aString,STRING_LENGTH(aString),aWidth,anAlignment,aFill);
  2321     } 
  2322 
  2323 EXPORT_C void TDes8::AppendJustify(const TUint8 *aString,TInt aLength,TInt aWidth,TAlign anAlignment,TChar aFill)
  2324 /**
  2325 Appends data onto the end of this descriptor's data and justifies it.
  2326 
  2327 The source of the appended data is a memory location.
  2328 
  2329 The target area is considered to be an area of specified width, immediately 
  2330 following this descriptor's existing data. Source data is copied into, and 
  2331 aligned within, this target area according to the specified alignment instruction.
  2332 
  2333 If the length of the target area is larger than the length of the source, 
  2334 then spare space within the target area is padded with the fill character.
  2335 
  2336 @param aString     A pointer to a source memory location. 
  2337 
  2338 @param aLength     The length of data to be copied. If this is greater than the 
  2339                    width of the target area, then the length of data copied is
  2340                    limited to the width.
  2341                     
  2342 @param aWidth      The width of the target area. If this has the specific
  2343                    negative value KDefaultJustifyWidth, then the width is
  2344                    re-set to the length of the data source.
  2345 
  2346 @param anAlignment The alignment of the data within the target area. 
  2347 
  2348 @param aFill       The fill character used to pad the target area.
  2349 
  2350 @panic USER 23  if the resulting length of this descriptor is greater than
  2351                 its maximum length or aWidth has a negative value other 
  2352                 than KDefaultJustifyWidth.
  2353                 
  2354 @panic USER 29  if aLength is negative.               
  2355 */
  2356 	{
  2357 
  2358 	__ASSERT_ALWAYS(aLength>=0,Panic(ETDes8LengthNegative));
  2359 	if (aWidth==KDefaultJustifyWidth)
  2360 		aWidth=aLength;
  2361 	if (aLength>aWidth)
  2362 		aLength=aWidth;
  2363 	TInt offset=Length();
  2364 	AppendFill(aFill,aWidth);
  2365 	TInt r=aWidth-aLength;
  2366 	if (anAlignment==ECenter)
  2367 		r>>=1;
  2368 	else if (anAlignment==ELeft)
  2369 		r=0;
  2370 	memmove(WPtr()+offset+r,aString,aLength);
  2371 	}
  2372 #endif	// __KERNEL_MODE__
  2373 
  2374 EXPORT_C void TDes8::Num(TInt64 aVal)
  2375 //
  2376 // Convert a TInt64 to the descriptor.
  2377 //
  2378 /**
  2379 Converts the 64-bit signed integer into a decimal character representation
  2380 and copies the conversion into this descriptor, replacing any existing data.
  2381 
  2382 The length of this descriptor is set to reflect the new data.
  2383 
  2384 If the integer is negative, the character representation is prefixed by a 
  2385 minus sign.
  2386 
  2387 @param aVal The 64-bit signed integer value.
  2388 */
  2389 	{
  2390 	Zero();
  2391 	AppendNum(aVal);
  2392 	}
  2393 
  2394 EXPORT_C void TDes8::Num(TUint64 aVal, TRadix aRadix)
  2395 /**
  2396 Converts the specified 64-bit unsigned integer into a character representation 
  2397 based on the specified number system and copies the conversion into this descriptor, 
  2398 replacing any existing data.
  2399 
  2400 The length of this descriptor is set to reflect the new data.
  2401 
  2402 When a hexadecimal conversion is specified, hexadecimal characters are in 
  2403 lower case.
  2404 
  2405 @param aVal   The 64-bit integer value. This is treated as an unsigned value. 
  2406 @param aRadix The number system representation for the 64-bit integer.
  2407 */
  2408 	{
  2409 	Zero();
  2410 	AppendNum(aVal, aRadix);
  2411 	}
  2412 
  2413 EXPORT_C void TDes8::NumFixedWidth(TUint aVal,TRadix aRadix,TInt aWidth)
  2414 /**
  2415 Converts the specified unsigned integer into a fixed width character
  2416 representation based on the specified number system and copies the conversion
  2417 into this descriptor, replacing any existing data.
  2418 
  2419 The length of this descriptor is set to reflect the new data.
  2420 
  2421 The function generates the exact number of specified characters, either padding 
  2422 to the left with character zeroes or discarding low order characters as necessary.
  2423 
  2424 When a hexadecimal conversion is specified, hexadecimal characters are in 
  2425 lower case.
  2426 
  2427 This function is equivalent to using Format() with parameters which specify:
  2428 
  2429 1. a fixed length target field
  2430 
  2431 2. padding with zero characters, for example "%08x".
  2432 
  2433 When this is the case, always use NumFixedWidth() in preference 
  2434 to Format() as it is more efficient.
  2435 
  2436 @param aVal   The unsigned integer value. 
  2437 @param aRadix The number system representation for the unsigned integer. 
  2438 @param aWidth The number of characters: to be used to contain the conversion, 
  2439               to be copied into this descriptor.
  2440               
  2441 @see TDes8::Format()
  2442 */
  2443 	{
  2444 
  2445 	Zero();
  2446 	AppendNumFixedWidth(aVal,aRadix,aWidth);
  2447 	}
  2448 
  2449 #ifndef __KERNEL_MODE__
  2450 EXPORT_C void TDes8::NumFixedWidthUC(TUint aVal,TRadix aRadix,TInt aWidth)
  2451 /**
  2452 Converts the specified unsigned integer into a fixed width character
  2453 representation based on the specified number system and copies the conversion
  2454 into this descriptor, replacing any existing data.
  2455 
  2456 The length of this descriptor is set to reflect the new data.
  2457 
  2458 The function generates the exact number of specified characters, either padding 
  2459 to the left with character zeroes or discarding low order characters as
  2460 necessary.
  2461 
  2462 When a hexadecimal conversion is specified, hexadecimal characters are in 
  2463 upper case.
  2464 
  2465 This function is equivalent to using Format() with parameters which specify:
  2466 
  2467 1. a fixed length target field
  2468 
  2469 2. padding with zero characters, for example "%08x".
  2470 
  2471 When this is the case, always use NumFixedWidthUC() in 
  2472 preference to Format() as it is more efficient.
  2473 
  2474 @param aVal   The unsigned integer value. 
  2475 @param aRadix The number system representation for the unsigned integer. 
  2476 @param aWidth The number of characters to be used to contain the conversion,
  2477               and to be copied into this descriptor.
  2478 
  2479 @see TDes8::Format()
  2480 */
  2481 	{
  2482 
  2483     Zero();
  2484     AppendNumFixedWidthUC(aVal,aRadix,aWidth);
  2485     }
  2486 
  2487 EXPORT_C void TDes8::NumUC(TUint64 aVal, TRadix aRadix)	//NOT __KERNEL_MODE__
  2488 /**
  2489 Converts the specified 64-bit unsigned integer into a character representation 
  2490 based on the specified number system and copies the conversion into this descriptor, 
  2491 replacing any existing data.
  2492 
  2493 The length of this descriptor is set to reflect the new data.
  2494 
  2495 When a hexadecimal conversion is specified, hexadecimal characters are in 
  2496 upper case.
  2497 
  2498 @param aVal   The 64-bit integer value. This is treated as an unsigned value. 
  2499 @param aRadix The number system representation for the 64-bit integer. If no 
  2500               explicit value is specified, then EDecimal is the default.
  2501 */
  2502 	{
  2503 	Zero();
  2504 	AppendNumUC(aVal,aRadix);
  2505 	}
  2506 #endif	// __KERNEL_MODE__
  2507 
  2508 EXPORT_C void TDes8::AppendNum(TInt64 aVal)
  2509 /**
  2510 Converts the 64-bit signed integer into a decimal character representation 
  2511 and appends the conversion onto the end of this descriptor's data.
  2512 
  2513 The length of this descriptor is incremented to reflect the new content.
  2514 
  2515 If the integer is negative, the character representation is prefixed by a 
  2516 minus sign.
  2517 
  2518 @param aVal The 64-bit signed integer value.
  2519 */
  2520 	{
  2521 	if (aVal < 0)
  2522 		{
  2523 		Append('-');
  2524 		aVal = -aVal;
  2525 		}
  2526 
  2527 	AppendNum(aVal, EDecimal);
  2528 	}
  2529 
  2530 #ifndef __DES_MACHINE_CODED__
  2531 GLDEF_C TInt __DoConvertNum(TUint aVal, TRadix aRadix, TUint aA, TUint8*& aDest)
  2532 	{
  2533 	__KERNEL_CHECK_RADIX(aRadix);
  2534 	TUint radix = (TUint)aRadix;
  2535 	TUint8* p = aDest;
  2536 	TBool out16 = (aA>255);
  2537 	aA &= 0xff;
  2538 	do	{
  2539 		TUint q = aVal/radix;
  2540 		TUint c = aVal-q*radix;
  2541 		(c>9) ? c+=(aA-10) : c+='0';
  2542 		aVal = q;
  2543 		if (out16)
  2544 			*--p = 0;
  2545 		*--p = (TUint8)c;
  2546 		} while (aVal);
  2547 	TInt l = aDest - p;
  2548 	aDest = p;
  2549 	return l;
  2550 	}
  2551 
  2552 GLDEF_C TInt __DoConvertNum(TUint64 aVal, TRadix aRadix, TUint aA, TUint8*& aDest)
  2553 	{
  2554 	__KERNEL_CHECK_RADIX(aRadix);
  2555 	TUint radix = (TUint)aRadix;
  2556 	TUint8* p = aDest;
  2557 	TBool out16 = (aA>255);
  2558 	TUint8 a = static_cast<TUint8>(aA);
  2559 	while (aVal >= UI64LIT(0x100000000))
  2560 		{
  2561 		TUint8 c = static_cast<TUint8>(aVal % radix);
  2562 		aVal /= radix;
  2563 		(c > 9) ? c = static_cast<TUint8>(c + a - 10) : c = static_cast<TUint8>(c + '0');
  2564 		if (out16)
  2565 			*--p = 0;
  2566 		*--p = c;
  2567 		}
  2568 	TInt l = aDest - p;
  2569 	aDest = p;
  2570 	return l + __DoConvertNum((TUint)aVal, aRadix, aA, aDest);
  2571 	}
  2572 #endif
  2573 
  2574 void TDes8::DoPadAppendNum(TInt l, TInt aW, const TUint8* p)
  2575 	{
  2576 	if (aW<=0)
  2577 		{
  2578 		Append(p, l);
  2579 		return;
  2580 		}
  2581 	TInt l0 = Length();
  2582 	SetLength(l0 + aW);
  2583 	TUint8* d = WPtr() + l0;
  2584 	for (; aW>l; --aW) *d++ = (TUint8)'0';
  2585 	memcpy(d, p, aW);
  2586 	}
  2587 
  2588 void TDes8::DoAppendNum(TUint64 aVal, TRadix aRadix, TUint aA, TInt aW)
  2589 //
  2590 // Convert a TUint64 into the descriptor.
  2591 //
  2592 	{
  2593 	TUint8 buf[APPEND_BUF_SIZE_64];
  2594 	TUint8* p = buf + APPEND_BUF_SIZE_64;
  2595 	TInt l = __DoConvertNum(aVal, aRadix, aA, p);
  2596 	// coverity[overrun-local]
  2597 	DoPadAppendNum(l, aW, p);
  2598 	}
  2599 
  2600 EXPORT_C void TDes8::AppendNum(TUint64 aVal, TRadix aRadix)
  2601 /**
  2602 Converts the specified 64-bit unsigned integer into a character representation 
  2603 based on the specified number system and appends the conversion onto the end 
  2604 of this descriptor's data. The length of this descriptor is incremented to 
  2605 reflect the new content
  2606 
  2607 When a hexadecimal conversion is specified, hexadecimal characters are in 
  2608 lower case.
  2609 
  2610 @param aVal   The 64-bit integer value. This is treated as an unsigned value. 
  2611 @param aRadix The number system representation for the 64-bit integer.
  2612 */
  2613 	{
  2614 	DoAppendNum(aVal, aRadix, 'a', 0);
  2615 	}
  2616 
  2617 EXPORT_C void TDes8::AppendNumFixedWidth(TUint aVal,TRadix aRadix,TInt aWidth)
  2618 /**
  2619 Converts the specified unsigned integer into a fixed width character
  2620 representation based on the specified number system and appends the conversion
  2621 onto the end of this descriptor's data.
  2622 
  2623 The length of this descriptor is incremented to reflect the new content.
  2624 
  2625 The function generates the exact number of specified characters, either padding 
  2626 to the left with character zeroes or discarding low order characters as
  2627 necessary.
  2628 
  2629 When a hexadecimal conversion is specified, hexadecimal characters are in 
  2630 lower case.
  2631 
  2632 @param aVal   The unsigned integer value. 
  2633 @param aRadix The number system representation for the unsigned integer. 
  2634 @param aWidth The number of characters to be used to contain the conversion,
  2635               and to be appended to this descriptor.
  2636 */
  2637 	{
  2638 	DoAppendNum(aVal, aRadix, 'a', aWidth);
  2639 	}
  2640 
  2641 #if (!defined(__DES8_MACHINE_CODED__) && !defined(__KERNEL_MODE__))
  2642 EXPORT_C TPtr8 TDes8::LeftTPtr(TInt aLength) const
  2643 /**
  2644 Extracts the leftmost part of the data. 
  2645 
  2646 The function does not cut or remove any data but constructs a modifiable 
  2647 pointer descriptor to represent the leftmost part of the data.
  2648 
  2649 @param aLength The length of the data to be extracted. If this value
  2650                is greater than the length of the descriptor, the function
  2651                extracts the whole of the descriptor.
  2652 
  2653 @return The 8-bit modifiable pointer descriptor representing the leftmost 
  2654         part of the data.
  2655 
  2656 @panic USER 22  if aLength is negative. 
  2657 */
  2658 	{
  2659 
  2660 	__ASSERT_ALWAYS(aLength>=0,Panic(ETDes8PosOutOfRange));
  2661 	TInt len=Min(aLength,Length());
  2662 	return(TPtr8((TUint8*)Ptr(),len,len));
  2663 	}
  2664 
  2665 EXPORT_C TPtr8 TDes8::RightTPtr(TInt aLength) const
  2666 /**
  2667 Extracts the rightmost part of the data.
  2668 
  2669 The function does not cut or remove any data but constructs a modifiable 
  2670 pointer descriptor to represent the rightmost part of the data.
  2671 
  2672 @param aLength The length of data to be extracted. If this value
  2673                is greater than the length of the descriptor, the function 
  2674                extracts the whole of the descriptor. 
  2675                
  2676 @return The 8 bit modifiable pointer descriptor representing the rightmost 
  2677         part of the data.
  2678 
  2679 @panic USER 22  if aLength is negative. 
  2680 */
  2681 	{
  2682 
  2683 	__ASSERT_ALWAYS(aLength>=0,Panic(ETDes8PosOutOfRange));
  2684 	TInt len=Length();
  2685 	if (aLength>len)
  2686 		aLength=len;
  2687 	return(TPtr8((TUint8*)Ptr()+len-aLength,aLength,aLength));
  2688 	}
  2689 
  2690 EXPORT_C TPtr8 TDes8::MidTPtr(TInt aPos) const
  2691 /**
  2692 Extracts a portion of the data.
  2693 
  2694 The function does not cut or remove any data but constructs a modifiable 
  2695 pointer descriptor to represent the defined portion.
  2696 
  2697 The portion is identified by its starting position and by the length of the 
  2698 remainder of the data starting from the specified position.
  2699 
  2700 @param aPos The starting position of the data to be extracted. This is an 
  2701             offset value; a zero value refers to the leftmost data position. 
  2702             
  2703 @return The 8-bit modifiable pointer descriptor representing the specified 
  2704         portion of the data.
  2705         
  2706 @panic USER 22  if aPos is negative or aPos is greater than the
  2707                 length of the descriptor.       
  2708 */
  2709 	{
  2710 
  2711 	TInt len=Length();
  2712 	__ASSERT_ALWAYS(aPos>=0 && aPos<=len,Panic(ETDes8PosOutOfRange));
  2713 	return(TPtr8((TUint8*)Ptr()+aPos,len-aPos,len-aPos));
  2714 	}
  2715 
  2716 EXPORT_C TPtr8 TDes8::MidTPtr(TInt aPos,TInt aLength) const
  2717 /**
  2718 Extracts a portion of the data.
  2719 
  2720 The function does not cut or remove any data but constructs a modifiable 
  2721 pointer descriptor to represent the defined portion.
  2722 
  2723 The portion is identified by its starting position and by its length.
  2724 
  2725 @param aPos    The starting position of the data to be extracted. This is an 
  2726                offset value; a zero value refers to the leftmost data position. 
  2727 @param aLength The length of data to be extracted.
  2728 
  2729 @return The 8 bit modifiable pointer descriptor representing the specified 
  2730         portion of the data.
  2731 
  2732 @panic USER 22  if aPos is negative or aPos plus aLength is greater than the
  2733                 length of the descriptor.
  2734 */
  2735 	{
  2736 
  2737 	__ASSERT_ALWAYS(aPos>=0 && (aPos+aLength)<=Length(),Panic(ETDes8PosOutOfRange));
  2738 	return(TPtr8((TUint8*)Ptr()+aPos,aLength,aLength));
  2739 	}
  2740 #endif
  2741 
  2742 #ifndef __KERNEL_MODE__
  2743 EXPORT_C void TDes8::AppendNumFixedWidthUC(TUint aVal,TRadix aRadix,TInt aWidth)
  2744 /**
  2745 Converts the specified unsigned integer into a fixed width character
  2746 representation based on the specified number system and appends the conversion
  2747 onto the end of this descriptor's data.
  2748 
  2749 The length of this descriptor is incremented to reflect the new content.
  2750 
  2751 The function generates the exact number of specified characters, either
  2752 padding to the left with character zeroes or discarding low order characters
  2753 as necessary.
  2754 
  2755 When a hexadecimal conversion is specified, hexadecimal characters are in 
  2756 upper case.
  2757 
  2758 @param aVal   The unsigned integer value. 
  2759 @param aRadix The number system representation for the unsigned integer. 
  2760 @param aWidth The number of characters to be used to contain the conversion,
  2761               and to be appended to this descriptor.
  2762 */
  2763 	{
  2764 	DoAppendNum(aVal, aRadix, 'A', aWidth);
  2765 	}
  2766 
  2767 EXPORT_C void TDes8::AppendNumUC(TUint64 aVal, TRadix aRadix)
  2768 /** Converts the specified 64-bit unsigned integer into a character
  2769 representation based on the specified number system and appends the conversion
  2770 onto the end of this descriptor's data.
  2771 
  2772 The length of this descriptor is incremented to reflect the new content.
  2773 
  2774 When a hexadecimal conversion is specified, hexadecimal characters are in 
  2775 upper case.
  2776 
  2777 @param aVal   The 64-bit integer value. This is treated as an unsigned value. 
  2778 @param aRadix The number system representation for the 64-bit integer. If no 
  2779               explicit value is specified, then EDecimal is the default.
  2780 */
  2781 	{
  2782 	DoAppendNum(aVal, aRadix, 'A', 0);
  2783 	}
  2784 
  2785 EXPORT_C void TDes8::Format(TRefByValue<const TDesC8> aFmt,...)
  2786 /**
  2787 Formats and copies text into this descriptor, replacing any existing data.
  2788 
  2789 The length of this descriptor is set to reflect the new data.
  2790 
  2791 The function takes a format string and a variable number of arguments.
  2792 The format string contains literal text embedded with directives for converting
  2793 the trailing list of arguments into text.
  2794 
  2795 The embedded directives are character sequences prefixed with the '%' character.
  2796 The literal text is simply copied into this descriptor unaltered while
  2797 the '%' directives are used to convert successive arguments from the
  2798 trailing list.
  2799 
  2800 The resulting stream of literal text and converted arguments is copied into
  2801 this descriptor.
  2802 
  2803 The syntax of the embedded directives follows one of four general patterns.
  2804 
  2805 Note that formatting of single numerical values can be achieved more
  2806 conveniently using the Num() and NumUC() member functions of this class.
  2807 
  2808 The full description of the syntax of a format string cannot be	included here.
  2809 For full details, navigate to the Symbian OS guide, and follow the hierarchy of links:
  2810 
  2811 @code
  2812 Symbian OS Guide
  2813 	Base
  2814 		Using  User Library (E32)
  2815 			Buffers and Strings
  2816 				Using Descriptors
  2817 					How to Use Descriptors
  2818 						Format string syntax
  2819 @endcode
  2820 
  2821 @param aFmt The descriptor containing the format string.
  2822             The TRefByValue class provides a constructor which takes a
  2823             TDesC8 type.
  2824 
  2825 @param ...  A variable number of arguments to be converted to text as
  2826             dictated by the format string. 
  2827 
  2828 @panic USER 23  if the  resulting length of text in this descriptor exceeds
  2829                 the descriptor's maximum length.
  2830 @panic USER 24  if the format string has incorrect syntax.
  2831 
  2832 @see TDes8::Num()
  2833 @see TDes8::NumUC()
  2834 */
  2835 	{
  2836 
  2837     VA_LIST list;
  2838     VA_START(list,aFmt);
  2839 	// coverity[uninit_use_in_call]
  2840     FormatList(aFmt,list);
  2841     }
  2842 
  2843 EXPORT_C void TDes8::FormatList(const TDesC8 &aFmt,VA_LIST aList)
  2844 /**
  2845 Formats and copies text into this descriptor, replacing any existing data.
  2846 
  2847 The length of this descriptor is set to reflect the new data.
  2848 
  2849 The behaviour of this function is the same as Format(). In practice, it is 
  2850 better and easier to use Format(), passing a variable number of arguments 
  2851 as required by the format string.
  2852 
  2853 @param aFmt  The descriptor containing the format string.
  2854 @param aList A pointer to an argument list.
  2855 
  2856 @see TDes8::Format()
  2857 @see VA_LIST
  2858 */
  2859 	{
  2860 
  2861 	Zero();
  2862 	AppendFormatList(aFmt,aList);
  2863 	}
  2864 
  2865 EXPORT_C void TDes8::AppendFormat(TRefByValue<const TDesC8> aFmt,TDes8Overflow *aOverflowHandler,...)
  2866 /**
  2867 Formats and appends text onto the end of this descriptor's data.
  2868 
  2869 The length of this descriptor is incremented to reflect the new content.
  2870 
  2871 The function takes a format string and a variable number of arguments.
  2872 The format string contains literal text, embedded with directives,
  2873 for converting the trailing list of arguments into text.
  2874 
  2875 The embedded directives are character sequences prefixed with the '%' character.
  2876 The literal text is simply copied into this descriptor unaltered while
  2877 the '%' directives are used to convert successive arguments from the
  2878 trailing list. See the description of the Format() function.
  2879 
  2880 Literal text is appended on a character by character basis.
  2881 If it results in the length of this descriptor exceeding its maximum length,
  2882 then the function:
  2883 
  2884 1. calls the Overflow() member function of the overflow handler, if an overflow
  2885    handler is supplied
  2886 2  raises a USER 23 panic, if no overflow handler is supplied.
  2887 
  2888 As much literal text as possible will have been copied into this descriptor
  2889 and this descriptor will have reached its maximum length.
  2890 
  2891 Text converted from a trailing argument is appended as a complete string.
  2892 If an attempt to append this string fails because the resulting length
  2893 of this descriptor would exceed its maximum length, then the function:
  2894 
  2895 1. calls the Overflow() member function of the overflow handler, if an overflow
  2896    handler is supplied
  2897    
  2898 2  raises a USER 23 panic, if no overflow handler is supplied.
  2899   
  2900 None of the generated text is appended and length of this descriptor
  2901 may be less than the maximum.
  2902 
  2903 @param aFmt             The 8-bit non-modifiable descriptor containing the
  2904                         format string. The TRefByValue class provides a
  2905                         constructor which takes a TDesC8 type. 
  2906 
  2907 @param aOverflowHandler A pointer to the overflow handler. 
  2908 
  2909 @param ...              A variable number of arguments to be converted to text
  2910                         as dictated by the format string. 
  2911 
  2912 @panic USER 23  if the length of the descriptor exceeds its maximum length and
  2913                 no overflow handler has been supplied.
  2914 @panic USER 24  if the format string has incorrect syntax.
  2915 
  2916 @see TDes8::Format()
  2917 @see TDes8Overflow::Overflow()
  2918 */
  2919 	{
  2920 
  2921 	VA_LIST list;
  2922 	VA_START(list, aOverflowHandler);
  2923 	// coverity[uninit_use_in_call]
  2924 	AppendFormatList(aFmt,list,aOverflowHandler);
  2925 	}
  2926 
  2927 EXPORT_C void TDes8::AppendFormat(TRefByValue<const TDesC8> aFmt,...)
  2928 /**
  2929 Formats and appends text onto the end of this descriptor's data.
  2930 
  2931 The length of this descriptor is incremented to reflect the new content.
  2932 
  2933 The function takes a format string and a variable number of arguments.
  2934 The format string contains literal text, embedded with directives,
  2935 for converting the trailing list of arguments into text.
  2936 
  2937 The embedded directives are character sequences prefixed with the '%' character.
  2938 The literal text is simply copied into this descriptor unaltered while
  2939 the '%' directives are used to convert successive arguments from the
  2940 trailing list. See the description of the Format() function.
  2941 
  2942 Literal text is appended on a character by character basis.
  2943 
  2944 Text converted from a trailing argument is appended as a complete string.
  2945 
  2946 @param aFmt The 8-bit non-modifiable descriptor containing the
  2947             format string. The TRefByValue class provides a
  2948             constructor which takes a TDesC8 type. 
  2949 
  2950 @param ...  A variable number of arguments to be converted to text
  2951             as dictated by the format string. 
  2952 
  2953 
  2954 @panic USER 23  if the  resulting length of text in this descriptor exceeds
  2955                 the descriptor's maximum length.
  2956 @panic USER 24  if the format string has incorrect syntax.
  2957 
  2958 @see TDes8::Format()
  2959 */
  2960 	{
  2961 
  2962     VA_LIST list;
  2963     VA_START(list,aFmt);
  2964     AppendFormatList(aFmt,list);
  2965     }
  2966 #endif	// __KERNEL_MODE__
  2967 
  2968 #if !defined(__DES8_MACHINE_CODED__) | defined(__EABI_CTORS__)
  2969 EXPORT_C TPtrC8::TPtrC8()
  2970 	: TDesC8(EPtrC,0),iPtr(0)
  2971 /**
  2972 Default constructor.
  2973 
  2974 Constructs an empty 8-bit non-modifiable pointer descriptor.
  2975 
  2976 It represents no data and its length is zero.
  2977 
  2978 The non-modifiable pointer descriptor can, subsequently, be set to represent 
  2979 data.
  2980 
  2981 @see TPtrC8::Set()
  2982 */
  2983 	{}
  2984 
  2985 EXPORT_C TPtrC8::TPtrC8(const TDesC8 &aDes)
  2986 	: TDesC8(EPtrC,aDes.Length()),iPtr(aDes.Ptr())
  2987 /**
  2988 Constructs the 8-bit non-modifiable pointer descriptor from any existing
  2989 descriptor.
  2990 
  2991 It is set to point to the same data and is given the same length as the source 
  2992 descriptor.
  2993 
  2994 @param aDes A reference to an 8bit non-modifiable descriptor.
  2995 */
  2996 	{}
  2997 
  2998 EXPORT_C TPtrC8::TPtrC8(const TUint8 *aString)
  2999 	: TDesC8(EPtrC,STRING_LENGTH(aString)),iPtr(aString)
  3000 /**
  3001 Constructs the 8-bit non-modifiable pointer descriptor to point to a zero
  3002 terminated string, whether in RAM or ROM.
  3003 
  3004 The length of the descriptor is set to the length of the zero terminated
  3005 string, excluding the zero terminator.
  3006 
  3007 @param aString A pointer to a zero terminated string.
  3008 */
  3009 	{}
  3010 
  3011 EXPORT_C TPtrC8::TPtrC8(const TUint8 *aBuf,TInt aLength)
  3012 	: TDesC8(EPtrC,aLength),iPtr(aBuf)
  3013 /**
  3014 Constructs the 8-bit non-modifiable pointer descriptor to point to the
  3015 specified location in memory, whether in RAM or ROM.
  3016 
  3017 The length of the descriptor is set to the specified length.
  3018 
  3019 @param aBuf    A pointer to the location that the descriptor is to represent.
  3020 @param aLength The length of the descriptor. This value must be non-negative.
  3021 
  3022 @panic USER 29  if aLength is negative.
  3023 */
  3024 	{
  3025 	__ASSERT_ALWAYS(aLength>=0,Panic(ETDes8LengthNegative));
  3026 	}
  3027 
  3028 EXPORT_C TPtr8::TPtr8(TUint8 *aBuf,TInt aMaxLength)
  3029 	: TDes8(EPtr,0,aMaxLength),iPtr(aBuf)
  3030 /**
  3031 Constructs the 8-bit modifiable pointer descriptor to point to the specified 
  3032 location in memory, whether in RAM or ROM.
  3033 
  3034 The length of the descriptor is set to zero and its maximum length is set
  3035 to the specified value.
  3036 
  3037 @param aBuf       A pointer to the location that the descriptor is to
  3038                   represent.
  3039                   
  3040 @param aMaxLength The maximum length of the descriptor.
  3041 
  3042 @panic USER 30  if aMaxLength is negative.
  3043 */
  3044 	{
  3045 	__ASSERT_ALWAYS(aMaxLength>=0,Panic(ETDes8MaxLengthNegative));
  3046 	}
  3047 
  3048 EXPORT_C TPtr8::TPtr8(TUint8 *aBuf,TInt aLength,TInt aMaxLength)
  3049 	: TDes8(EPtr,aLength,aMaxLength),iPtr(aBuf)
  3050 /**
  3051 Constructs the 8-bit modifiable pointer descriptor to point to the specified 
  3052 location in memory, whether in RAM or ROM.
  3053 
  3054 The length of the descriptor and its maximum length are set to the specified
  3055 values.
  3056 
  3057 @param aBuf       A pointer to the location that the descriptor is
  3058                   to represent.
  3059 @param aLength    The length of the descriptor.
  3060 @param aMaxLength The maximum length of the descriptor.
  3061 
  3062 @panic USER 20  if aLength is negative, or is greater than the descriptor's 
  3063                 maximum length,
  3064 @panic USER 30  if aMaxLength is negative.
  3065 */
  3066 	{
  3067 	__ASSERT_ALWAYS(aMaxLength>=0,Panic(ETDes8MaxLengthNegative));
  3068 	__ASSERT_ALWAYS(TUint(aLength)<=TUint(aMaxLength),Panic(ETDes8LengthOutOfRange));
  3069 	}
  3070 
  3071 EXPORT_C TPtr8::TPtr8(TBufCBase8 &aLcb,TInt aMaxLength)
  3072 	: TDes8(EBufCPtr,aLcb.Length(),aMaxLength),iPtr((TUint8*)&aLcb)
  3073 	{
  3074 	__ASSERT_DEBUG(aLcb.Length()<=aMaxLength,Panic(ETDes8LengthOutOfRange));
  3075 	}
  3076 
  3077 EXPORT_C TBufBase8::TBufBase8(TInt aMaxLength)
  3078 	:TDes8(EBuf,0,aMaxLength)
  3079 	{
  3080 	__ASSERT_DEBUG(aMaxLength>=0,Panic(ETDes8MaxLengthNegative));
  3081 	}
  3082 
  3083 EXPORT_C TBufBase8::TBufBase8(TInt aLength,TInt aMaxLength)
  3084 	:TDes8(EBuf,aLength,aMaxLength)
  3085 	{
  3086 	__ASSERT_DEBUG(aMaxLength>=0,Panic(ETDes8MaxLengthNegative));
  3087 	__ASSERT_ALWAYS(TUint(aLength)<=TUint(aMaxLength),Panic(ETDes8LengthOutOfRange));
  3088 	}
  3089 
  3090 EXPORT_C TBufBase8::TBufBase8(const TUint8* aString,TInt aMaxLength)
  3091 	:TDes8(EBuf,0,aMaxLength)
  3092 	{
  3093 	__ASSERT_DEBUG(aMaxLength>=0,Panic(ETDes8MaxLengthNegative));
  3094 	Copy(aString);
  3095 	}
  3096 
  3097 EXPORT_C TBufBase8::TBufBase8(const TDesC8& aDes,TInt aMaxLength)
  3098 	:TDes8(EBuf,0,aMaxLength)
  3099 	{
  3100 	__ASSERT_DEBUG(aMaxLength>=0,Panic(ETDes8MaxLengthNegative));
  3101 	Copy(aDes);
  3102 	}
  3103 
  3104 #endif
  3105 
  3106 // Truncate literal string to fit into descriptor
  3107 EXPORT_C void TDes8IgnoreOverflow::Overflow(TDes8& /*aDes*/)
  3108 	{}
  3109 
  3110 #ifndef __KERNEL_MODE__
  3111 EXPORT_C void TDesC8::__DbgTestInvariant() const
  3112 //
  3113 // Test that the class obeys its invariant.
  3114 //
  3115     {
  3116 
  3117 #if defined(_DEBUG)
  3118 	switch (Type())
  3119 		{
  3120 	case EBufC:
  3121 	case EPtrC:
  3122 	case EPtr:
  3123 	case EBuf:
  3124 	case EBufCPtr:
  3125 		break;
  3126 	default:
  3127 		User::Invariant();
  3128 		}
  3129 #endif
  3130     }
  3131 
  3132 EXPORT_C void TPtrC8::__DbgTestInvariant() const
  3133 //
  3134 // Test that the class obeys its invariant.
  3135 //
  3136     {
  3137 
  3138 #if defined(_DEBUG)
  3139 	TDesC8::__DbgTestInvariant(); // Test base class
  3140 	if (Type()!=EPtrC)
  3141 		User::Invariant();
  3142 #endif
  3143 	}
  3144 
  3145 EXPORT_C void TDes8::__DbgTestInvariant() const
  3146 //
  3147 // Test that the class obeys its invariant.
  3148 //
  3149     {
  3150 
  3151 #if defined(_DEBUG)
  3152 	TDesC8::__DbgTestInvariant(); // Test base class
  3153 	if (Length()>MaxLength() || !(Type()==EPtr || Type()==EBufCPtr || Type()==EBuf))
  3154 		User::Invariant();
  3155 #endif
  3156 	}
  3157 
  3158 EXPORT_C void HBufC8::__DbgTestInvariant() const
  3159 //
  3160 // Test that the class obeys its invariant.
  3161 //
  3162     {
  3163 
  3164 #if defined(_DEBUG)
  3165 	TDesC8::__DbgTestInvariant(); // Test base class
  3166 	if (Length()>(TInt)(User::AllocLen(this)-sizeof(TDesC8)) || Type()!=EBufC)
  3167 		User::Invariant();
  3168 #endif
  3169 	}
  3170 
  3171 EXPORT_C void TPtr8::__DbgTestInvariant() const
  3172 //
  3173 // Test that the class obeys its invariant.
  3174 //
  3175     {
  3176 
  3177 #if defined(_DEBUG)
  3178 	TDes8::__DbgTestInvariant(); // Test base class
  3179 	if (!(Type()==EPtr || Type()==EBufCPtr))
  3180 		User::Invariant();
  3181 #endif
  3182 	}
  3183 
  3184 /** Expand all characters from 8 to 16 bits
  3185 
  3186 @return 16-bit pointer descriptor to transformed text
  3187 
  3188 The length of descriptor increased by 2 (length *= 2).
  3189 
  3190 @panic USER 187 if either the descriptor length or the maximum length is odd
  3191 or data pointer is not aligned by 2-bytes boundary
  3192 */
  3193 EXPORT_C TPtr16 TDes8::Expand()
  3194 	{
  3195 	TInt l = Length();
  3196 	TInt ml = MaxLength();
  3197 	const TText8* s0 = Ptr();
  3198 	const TText8* s = s0 + l;
  3199 	__ASSERT_ALWAYS( !((ml|(TInt)s0)&1), Panic(EDes8ExpandOdd) );
  3200 	SetLength(l<<1);
  3201 	TText16* d = ((TText16*)s0) + l;
  3202 	while (s > s0)
  3203 		*--d = *--s;
  3204 	return TPtr16(d, l, ml>>1);
  3205 	}
  3206 
  3207 
  3208 /** Collapse all characters from 16 to 8 bits
  3209 
  3210 The length of descriptor truncated by 2 (length /= 2).
  3211 
  3212 @panic USER 188  if either the descriptor length or the maximum length is odd
  3213 or data pointer is not aligned by 2-bytes boundary.
  3214 */
  3215 
  3216 EXPORT_C void TDes8::Collapse()
  3217 	{
  3218 	TInt l = Length();
  3219 	TInt ml = MaxLength();
  3220 	TText8* d = (TText8*)Ptr();
  3221 	__ASSERT_ALWAYS( !((l|ml|(TInt)d)&1), Panic(EDes8CollapseOdd) );
  3222 	const TText16* s = (const TText16*)d;
  3223 	const TText16* sE = s + (l>>1);
  3224 	while (s < sE)
  3225 		*d++ = (TText8)*s++;
  3226 	SetLength(l>>1);
  3227 	}
  3228 #else // __KERNEL_MODE__
  3229 
  3230 EXPORT_C TInt TDesC8::CompareF(const TDesC8 &aDes) const
  3231 /**
  3232 Compares this descriptor's folded data with the specified descriptor's folded 
  3233 data. 
  3234 
  3235 Note that folding is locale-independent behaviour. It is also important to 
  3236 note that there can be no guarantee that folding is in any way culturally 
  3237 appropriate, and should not be used for comparing strings in natural language; 
  3238 use CompareC() for this.
  3239 
  3240 @param aDes The 8-bit non modifable descriptor whose data is to be compared 
  3241             with this descriptor's data. 
  3242             
  3243 @return Positive, if this descriptor is greater than the specified descriptor. 
  3244         Negative, if this descriptor is less than the specified descriptor.
  3245         Zero, if both descriptors have the same length and the their contents
  3246         are the same.
  3247         
  3248 @see TDesC8::Compare()
  3249 */
  3250 	{
  3251 
  3252 	TInt ll = Length();
  3253 	TInt rl = aDes.Length();
  3254 	TInt r = memicmp(Ptr(), aDes.Ptr(), Min(ll, rl));
  3255 	if (r == 0)
  3256 		r = ll - rl;
  3257 	return r;
  3258 	}
  3259 
  3260 #endif	// __KERNEL_MODE__
  3261 
  3262 #ifndef __KERNEL_MODE__
  3263 
  3264 /**
  3265 Default constructor.
  3266 
  3267 Constructs a zero-length 8-bit resizable buffer descriptor.
  3268 
  3269 Note that the object owns no allocated memory.
  3270 */
  3271 EXPORT_C RBuf8::RBuf8()
  3272 	:TDes8(EPtr,0,0),iEPtrType(NULL)
  3273 	{
  3274 	// Zero-length RBuf8 is of type EPtr with NULL pointer.
  3275 	}
  3276 
  3277 
  3278 
  3279 
  3280 /**
  3281 Constructor.
  3282 			
  3283 Constructs an 8-bit resizable buffer descriptor, transferring ownership of the
  3284 specified heap descriptor to this object.
  3285 
  3286 @param aHBuf The heap descriptor to be transferred to this object. This pointer
  3287              can be NULL, which means that a zero length 8-bit resizable
  3288              buffer	descriptor is constructed, and the object will not own any
  3289              allocated memory.
  3290 */
  3291 EXPORT_C RBuf8::RBuf8(HBufC8* aHBuf)
  3292 	{
  3293 	if(aHBuf)
  3294 		//Create EBufCPtr type descriptor that points to aHBuf
  3295 		new(this) TPtr8(aHBuf->Des());
  3296 	else
  3297 		//Create zero-length RBuf8. It is EPtr type of descriptor that points to NULL.
  3298 		new(this) RBuf8();
  3299 	}
  3300 
  3301 
  3302 
  3303 
  3304 /**
  3305 Protected constructor.
  3306 */
  3307 EXPORT_C RBuf8::RBuf8(TInt aType,TInt aLength,TInt aMaxLength)
  3308 	:TDes8(aType,aLength,aMaxLength)
  3309 	{
  3310 	}
  3311 
  3312 
  3313 
  3314 
  3315 /**
  3316 Transfers ownership of the specified 8-bit resizable buffer descriptor's 
  3317 buffer to this object.
  3318 
  3319 Note that the function assumes that this descriptor does not already own any
  3320 allocated memory. It does not check, nor does it free any pre-existing owned
  3321 allocated memory.  If this descriptor does already own allocated memory,
  3322 RBuf8::Close() should be invoked on this descriptor before this function is
  3323 invoked.
  3324 
  3325 @param aRBuf The source 8-bit resizable buffer. The ownership of this
  3326              object's buffer is to be transferred.
  3327 
  3328 @see RBuf8::Close()
  3329 */
  3330 EXPORT_C void RBuf8::Assign(const RBuf8& aRBuf)
  3331 	{
  3332 	Mem::Copy(this, &aRBuf, sizeof(RBuf8)); 
  3333 	__TEST_INVARIANT;
  3334 	}
  3335 
  3336 
  3337 
  3338 
  3339 /**
  3340 Assigns ownership of the specified allocated memory to this object.
  3341 
  3342 The allocated memory forms the buffer for this descriptor. The current length
  3343 of the descriptor is set to zero.
  3344 
  3345 Note that the function assumes that this descriptor does not already own any
  3346 allocated memory. It does not check, nor does it free any pre-existing owned
  3347 allocated memory.  If this descriptor does already own allocated memory,
  3348 RBuf8::Close() should be invoked on this descriptor before this function is
  3349 invoked.
  3350 
  3351 @param aHeapCell  The allocated memory to be assigned to this object. This
  3352                   pointer can be NULL, which means that a zero length 8-bit
  3353                   resizable buffer descriptor is created.
  3354 @param aMaxLength The maximum length of the descriptor.
  3355 
  3356 @panic USER 20 If the specified maximum length is greater then the size of
  3357                the allocated heap cell, or the specified maximum length
  3358                is NOT zero when the pointer to the heap cell is NULL.
  3359               
  3360 @see TDesC8::Length()
  3361 @see TDes8::MaxLength()
  3362 @see RBuf8::Close()
  3363 */
  3364 EXPORT_C void RBuf8::Assign(TUint8 *aHeapCell,TInt aMaxLength)
  3365 	{
  3366 	Assign(aHeapCell,0,aMaxLength);
  3367 	}
  3368 
  3369 
  3370 
  3371 
  3372 /**
  3373 Assigns ownership of the specified allocated memory to this object.
  3374 
  3375 The allocated memory forms the buffer for this descriptor. The current length
  3376 of the descriptor is set to the value of the second parameter.
  3377 
  3378 Note that the function assumes that this descriptor does not already own any
  3379 allocated memory. It does not check, nor does it free any pre-existing owned
  3380 allocated memory.  If this descriptor does already own allocated memory,
  3381 RBuf8::Close() should be invoked on this descriptor before this function is
  3382 invoked.
  3383 
  3384 @param aHeapCell  The allocated memory to be assigned to this object.
  3385 @param aLength	  The length of the descriptor.
  3386 @param aMaxLength The maximum length of the descriptor.
  3387 
  3388 @panic USER 20 If the specified maximum length is greater then the size of
  3389                the allocated heap cell, or the specified length is greater then
  3390                the specified maximum length, or the specified maximum length
  3391                is NOT zero when the pointer to the heap cell is NULL.
  3392 
  3393 @see TDesC8::Length()
  3394 @see TDes8::MaxLength()
  3395 @see RBuf8::Close()
  3396 */
  3397 EXPORT_C void RBuf8::Assign(TUint8 *aHeapCell,TInt aLength,TInt aMaxLength)
  3398 	{
  3399 	__ASSERT_ALWAYS(aLength<=aMaxLength, Panic(ETDes8LengthOutOfRange));
  3400 	if(aHeapCell)
  3401 		{
  3402 		__ASSERT_ALWAYS(User::AllocLen(aHeapCell) >= aMaxLength * (TInt)sizeof(TUint8), Panic(ETDes8LengthOutOfRange));
  3403 		//Create EPtr type descriptor that points to aHeapCell
  3404 		new(this) TPtr8(aHeapCell,aLength,aMaxLength); 
  3405 		}
  3406 	else
  3407 		{
  3408 		__ASSERT_ALWAYS(aMaxLength == 0, Panic(ETDes8LengthOutOfRange));
  3409 		//Create zero-length RBuf. It is EPtr type of descriptor that points to NULL.
  3410 		new(this) RBuf8();
  3411 		}
  3412 	__TEST_INVARIANT;
  3413 	}
  3414 
  3415 
  3416 
  3417 
  3418 /**
  3419 Transfers ownership of the specified heap descriptor to this object.
  3420 
  3421 Note that the function assumes that this descriptor does not already own any
  3422 allocated memory. It does not check, nor does it free any pre-existing owned
  3423 allocated memory.  If this descriptor does already own allocated memory,
  3424 RBuf8::Close() should be invoked on this descriptor before this function is
  3425 invoked.
  3426 
  3427 @param aHBuf  The heap descriptor to be transferred to this object.
  3428               This pointer can be NULL, which means that a zero length
  3429               8-bit resizable buffer descriptor is created.
  3430 @see RBuf8::Close()
  3431 */
  3432 EXPORT_C void RBuf8::Assign(HBufC8* aHBuf)
  3433 	{
  3434 	new(this) RBuf8(aHBuf);
  3435 	}
  3436 
  3437 
  3438 
  3439 
  3440 /**
  3441 Swaps the content of two 8-bit resizable buffer descriptors.
  3442 
  3443 @param aRBuf The 8-bit resizable buffer descriptor whose contents are to be
  3444              swapped with this one.
  3445 */
  3446 EXPORT_C void RBuf8::Swap(RBuf8& aRBuf)
  3447 	{
  3448 	Mem::Swap(this,&aRBuf,sizeof(*this));
  3449 	}
  3450 
  3451 
  3452 
  3453 
  3454 /**
  3455 Creates an 8-bit resizable buffer descriptor.
  3456 
  3457 The function allocates sufficient memory to contain descriptor data up to
  3458 the specified maximum length.
  3459 
  3460 The current length of the descriptor is set to zero. The maximum length of
  3461 the descriptor is set to the specified value.
  3462 
  3463 Note that the function assumes that this descriptor does not already own any
  3464 allocated memory. It does not check, nor does it free any pre-existing owned
  3465 allocated memory.  If this descriptor does already own allocated memory,
  3466 RBuf8::Close() should be invoked on this descriptor before this function is
  3467 invoked.
  3468 
  3469 @param aMaxLength  The maximum length of the descriptor.
  3470 
  3471 @return KErrNone, if successful; KErrNoMemory, if there is insufficient	memory.
  3472 
  3473 @see TDesC8::Length()
  3474 @see TDes8::MaxLength()
  3475 @see RBuf8::Close()
  3476 */
  3477 EXPORT_C TInt RBuf8::Create(TInt aMaxLength)
  3478 	{
  3479 	if (aMaxLength)
  3480 		{
  3481 		//Allocate memory
  3482 		TUint8* buf=(TUint8*)User::Alloc(aMaxLength*sizeof(TUint8));
  3483 		if(!buf) return KErrNoMemory;
  3484 		iEPtrType = buf;
  3485 		}
  3486 	else
  3487 		iEPtrType = NULL; //Zero-length descriptor.
  3488 
  3489 
  3490 	//Create EPtr type descriptor.
  3491 	new(this) RBuf8(EPtr,0,aMaxLength);
  3492 	__TEST_INVARIANT;
  3493 	return KErrNone;
  3494 	}
  3495 
  3496 
  3497 
  3498 
  3499 /**
  3500 Creates an 8-bit resizable buffer descriptor, and leaves on failure.
  3501 
  3502 The function allocates sufficient memory to contain descriptor data up to
  3503 the specified maximum length.
  3504 
  3505 The current length of the descriptor is set to zero. The maximum length of
  3506 the descriptor is set to the specified value.
  3507 
  3508 Note that the function assumes that this descriptor does not already own any
  3509 allocated memory. It does not check, nor does it free any pre-existing owned
  3510 allocated memory.  If this descriptor does already own allocated memory,
  3511 RBuf8::Close() should be invoked on this descriptor before this function is
  3512 invoked.
  3513 
  3514 @param aMaxLength The length and the maximum length of the descriptor.
  3515 
  3516 @leave KErrNoMemory If there is insufficient memory.
  3517 
  3518 @see TDesC8::Length()
  3519 @see TDes8::MaxLength()
  3520 @see RBuf8::Close()
  3521 */
  3522 EXPORT_C void RBuf8::CreateL(TInt aMaxLength)
  3523 	{
  3524 	User::LeaveIfError(Create(aMaxLength));
  3525 	}
  3526 
  3527 
  3528 
  3529 
  3530 /**
  3531 Creates an 8-bit resizable buffer descriptor.
  3532 
  3533 The function allocates sufficient memory to contain descriptor data up to
  3534 the specified maximum length.
  3535 
  3536 Both the current length and the maximum length of the descriptor are set to
  3537 the specified value.
  3538 
  3539 Note that the function assumes that this descriptor does not already own any
  3540 allocated memory. It does not check, nor does it free any pre-existing owned
  3541 allocated memory.  If this descriptor does already own allocated memory,
  3542 RBuf8::Close() should be invoked on this descriptor before this function is
  3543 invoked.
  3544 
  3545 @param aMaxLength  The length and the maximum length of the descriptor.
  3546 
  3547 @return KErrNone, if successful; KErrNoMemory, if there is insufficient memory.
  3548 
  3549 @see RBuf8::Close()
  3550 */
  3551 EXPORT_C TInt RBuf8::CreateMax(TInt aMaxLength)
  3552 	{
  3553 	TInt err=Create(aMaxLength); 
  3554 	if(err==KErrNone)
  3555 		SetMax(); 
  3556 	return err;
  3557 	}
  3558 
  3559 
  3560 
  3561 
  3562 /**
  3563 Creates an 8-bit resizable buffer descriptor, and leaves on failure.
  3564 
  3565 The function allocates sufficient memory to contain descriptor data up to
  3566 the specified maximum length.
  3567 
  3568 Both the current length and the maximum length of the descriptor are set to
  3569 the specified value. 
  3570 
  3571 Note that the function assumes that this descriptor does not already own any
  3572 allocated memory. It does not check, nor does it free any pre-existing owned
  3573 allocated memory.  If this descriptor does already own allocated memory,
  3574 RBuf8::Close() should be invoked on this descriptor before this function is
  3575 invoked.
  3576 
  3577 @param aMaxLength The length and the maximum length of the descriptor.
  3578 
  3579 @leave KErrNoMemory If there is insufficient memory.
  3580 
  3581 @see TDesC8::Length()
  3582 @see TDes8::MaxLength()
  3583 @see RBuf8::Close()
  3584 */
  3585 EXPORT_C void RBuf8::CreateMaxL(TInt aMaxLength)
  3586 	{
  3587 	User::LeaveIfError(CreateMax(aMaxLength));
  3588 	}
  3589 
  3590 
  3591 
  3592 
  3593 /**
  3594 Creates a 8-bit resizable buffer descriptor to contain a copy of the
  3595 specified (source) descriptor.
  3596 
  3597 The function allocates sufficient memory so that this descriptor's maximum
  3598 length is the same as the length of the source descriptor. Both the current
  3599 length and the maximum length of this descriptor are set to
  3600 the length of the source descriptor.
  3601 				
  3602 The data contained in the source descriptor is copied into this
  3603 descriptor.
  3604 
  3605 Note that the function assumes that this descriptor does not
  3606 already own any allocated memory. It does not check, nor does it free any
  3607 pre-existing owned allocated memory.  If this descriptor does already own 
  3608 allocated memory, RBuf8::Close() should be invoked on this descriptor before 
  3609 this function is invoked.
  3610 
  3611 @param aDes Source descriptor to be copied into this object.
  3612 
  3613 @return KErrNone, if successful; KErrNoMemory, if there is insufficient memory.
  3614 
  3615 @see TDesC8::Length()
  3616 @see TDes8::MaxLength()
  3617 @see TDes8::Copy()
  3618 @see RBuf8::Close()
  3619 */
  3620 EXPORT_C TInt RBuf8::Create(const TDesC8& aDes)
  3621 	{
  3622 	return Create(aDes,aDes.Length());
  3623 	}
  3624 
  3625 
  3626 
  3627 
  3628 /**
  3629 Creates an 8-bit resizable buffer descriptor to contain a copy of the specified
  3630 (source) descriptor, and leaves on failure.
  3631  
  3632 The function allocates sufficient memory so that this descriptor's maximum
  3633 length is the same as the length of the source descriptor.Both the current
  3634 length and the maximum length of this descriptor are set to the length
  3635 of the source descriptor.
  3636 
  3637 The data contained in the source descriptor is copied into this descriptor.
  3638 
  3639 Note that the function assumes that this descriptor does not already own any
  3640 allocated memory. It does not check, nor does it free any
  3641 pre-existing owned allocated memory.  If this descriptor does already own 
  3642 allocated memory, RBuf8::Close() should be invoked on this descriptor before 
  3643 this function is invoked.
  3644 
  3645 @param aDes Source descriptor to be copied into this object.
  3646 
  3647 @leave KErrNoMemory If there is insufficient memory.
  3648 
  3649 @see TDesC8::Length()
  3650 @see TDes8::MaxLength()
  3651 @see TDes8::Copy()
  3652 @see RBuf8::Close()
  3653 */
  3654 EXPORT_C void RBuf8::CreateL(const TDesC8& aDes)
  3655 	{
  3656 	CreateL(aDes,aDes.Length());
  3657 	}
  3658 
  3659 
  3660 
  3661 
  3662 /**
  3663 Creates an 8-bit resizable buffer descriptor to contain a copy of the
  3664 specified (source) descriptor. 
  3665 
  3666 The function allocates sufficient memory so that this descriptor's maximum length
  3667 is the same as the value of the aMaxLength parameter.
  3668 
  3669 The data contained in the source descriptor is copied into this descriptor.
  3670 The length of data copied is either
  3671 
  3672 - the length of the source descriptor aDes
  3673 
  3674 or
  3675 
  3676 - the value of the aMaxLength parameter
  3677 
  3678 whichever is the smaller value. The current length of this descriptor is also
  3679 set to the smaller value.
  3680 
  3681 Note that the function assumes that this descriptor does not already own any
  3682 allocated memory. It does not check, nor does it free any pre-existing owned
  3683 allocated memory.  If this descriptor does already own allocated memory,
  3684 RBuf8::Close() should be invoked on this descriptor before this function is
  3685 invoked.
  3686 
  3687 @param aDes Source descriptor to be copied into this object.
  3688             
  3689 @param aMaxLength The maximum length of this descriptor.
  3690 
  3691 @return KErrNone, if successful; KErrNoMemory, if there is insufficient memory.
  3692 
  3693 @see TDesC8::Length()
  3694 @see TDes8::MaxLength()
  3695 @see TDes8::Copy()
  3696 @see RBuf8::Close()
  3697 */
  3698 EXPORT_C TInt RBuf8::Create(const TDesC8& aDes,TInt aMaxLength)
  3699 	{
  3700 	TInt err=Create(aMaxLength);
  3701 	if(err==KErrNone)
  3702 		Copy(aDes.Left(aMaxLength));
  3703 	return err;
  3704 	}
  3705 
  3706 
  3707 
  3708 
  3709 /**
  3710 Creates an 8-bit resizable buffer descriptor to contain a copy of the specified
  3711 (source) descriptor, and leaves on failure.
  3712 
  3713 The function allocates sufficient memory so that this descriptor's maximum
  3714 length is the same as the value of the aMaxLength parameter.
  3715 
  3716 The data contained in the source descriptor is copied into this descriptor.
  3717 The length of data copied is either
  3718 
  3719 - the length of the source descriptor aDes
  3720 
  3721 or
  3722 
  3723 - the value of the aMaxLength parameter
  3724 
  3725 whichever is the smaller value. The current length of this descriptor is also
  3726 set to the smaller value.
  3727 
  3728 Note that the function assumes that this descriptor does not already own any
  3729 allocated memory. It does not check, nor does it free any pre-existing owned
  3730 allocated memory.  If this descriptor does already own allocated memory,
  3731 RBuf8::Close() should be invoked on this descriptor before this function is
  3732 invoked.
  3733 
  3734 @param aDes Source descriptor to be copied into this object.
  3735             
  3736 @param aMaxLength The maximum length of this descriptor.
  3737 
  3738 @leave KErrNoMemory If there is insufficient memory.
  3739 
  3740 @see TDesC8::Length()
  3741 @see TDes8::MaxLength()
  3742 @see TDes8::Copy()
  3743 @see RBuf8::Close()
  3744 */
  3745 EXPORT_C void RBuf8::CreateL(const TDesC8& aDes,TInt aMaxLength)
  3746 	{
  3747 	CreateL(aMaxLength);
  3748 	Copy(aDes.Left(aMaxLength));
  3749 	}
  3750 
  3751 
  3752 
  3753 
  3754 /**
  3755 Resizes this 8-bit resizable buffer descriptor.
  3756 
  3757 The length and contents of the descriptor are unchanged.
  3758 
  3759 If the buffer descriptor was created from a zero-length heap descriptor
  3760 HBufC, this method might leak memory (the heap descriptor is not freed).
  3761 It is possible to avoid this by calling the Close() method prior to ReAlloc(),
  3762 but this should be done only in this situation (otherwise the buffer contents
  3763 will be lost).
  3764 
  3765 For example, add
  3766 @code
  3767     if (desc.MaxLength() == 0) desc.Close();
  3768 @endcode
  3769 before the call to ReAlloc().
  3770 
  3771 @param aMaxLength The new maximum length of the descriptor. This can be zero,
  3772                   which results in a descriptor with zero maximum length and no
  3773                   allocated memory.
  3774                   
  3775 @return KErrNone, if successful; KErrNoMemory, if there is insufficient memory.
  3776 
  3777 @panic USER 26 If the new maximum length is less then the current descriptor length.
  3778 */
  3779 EXPORT_C TInt RBuf8::ReAlloc(TInt aMaxLength)
  3780 	{
  3781 	__ASSERT_ALWAYS(Length()<=aMaxLength, Panic(ETDes8ReAllocTooSmall));
  3782 	__TEST_INVARIANT;
  3783 
  3784 	if (!aMaxLength)				//Reallocation to zero length
  3785 		{
  3786 		User::Free(iEPtrType);	//Free memory 
  3787 		new (this) RBuf8();			//Create zero-length RBuf
  3788 		return KErrNone;
  3789 		}
  3790 
  3791 	if (!iMaxLength)				//Reallocation from zero length
  3792 		return Create(aMaxLength);
  3793 
  3794 	switch(Type())
  3795 		{
  3796 		case EPtr:
  3797 			{
  3798 			TUint8* buf = (TUint8*)User::ReAlloc(iEPtrType,aMaxLength*sizeof(TUint8));
  3799 			if(!buf) return KErrNoMemory;
  3800 			iEPtrType = buf;
  3801 			iMaxLength = aMaxLength;
  3802 			break;
  3803 			}
  3804 		case EBufCPtr:
  3805 			{
  3806 			HBufC8* hbufc = iEBufCPtrType->ReAlloc(aMaxLength);
  3807 			if(!hbufc) return KErrNoMemory;
  3808 			Assign(hbufc);
  3809 			break;
  3810 			}
  3811 		}
  3812 
  3813 	__TEST_INVARIANT;
  3814 	return KErrNone;
  3815 	}
  3816 
  3817 
  3818 
  3819 
  3820 /**
  3821 Resizes this 8-bit resizable buffer descriptor, leaving on failure.
  3822 
  3823 The length and contents of the descriptor are unchanged.
  3824 
  3825 If the buffer descriptor was created from a zero-length heap descriptor
  3826 HBufC, this method might leak memory (the heap descriptor is not freed).
  3827 It is possible to avoid this by calling the Close() method prior to ReAllocL(),
  3828 but this should be done only in this situation (otherwise the buffer contents
  3829 will be lost).
  3830 
  3831 For example, add
  3832 @code
  3833     if (desc.MaxLength() == 0) desc.Close();
  3834 @endcode
  3835 before the call to ReAlloc().
  3836 
  3837 @param aMaxLength The new maximum length of the descriptor. This can be zero,
  3838                   which results in a descriptor with zero maximum length and no
  3839                   allocated memory.
  3840                   
  3841 @return KErrNone, if successful; KErrNoMemory, if there is insufficient memory.
  3842 
  3843 @panic USER 26 If the new maximum length is less then the current descriptor length.
  3844 */
  3845 EXPORT_C void RBuf8::ReAllocL(TInt aMaxLength)
  3846 	{
  3847 	User::LeaveIfError(ReAlloc(aMaxLength));
  3848 	}
  3849 
  3850 
  3851 
  3852 
  3853 /**
  3854 Deallocates memory assigned to this object, and re-initializes the object as
  3855 a zero-length descriptor.
  3856 */
  3857 EXPORT_C void RBuf8::Close() 
  3858 	{
  3859 	User::Free(iEPtrType); 
  3860 	//Create zero-length RBuf. It is EPtr type of descriptor that points to NULL.
  3861 	new(this) RBuf8();
  3862 	}
  3863 
  3864 
  3865 
  3866 
  3867 /**
  3868 Pushes a cleanup item for this object onto the cleanup stack.
  3869 
  3870 The effect of this is to cause Close() to be called on this 8-bit resizable
  3871 buffer descriptor, when CleanupStack::PopAndDestroy() is called at some later time.
  3872 
  3873 @code
  3874 ...
  3875 RBuf8 x;
  3876 ....
  3877 x.CleanupClosePushL();
  3878 ...
  3879 CleanupStack::PopAndDestroy();
  3880 ...
  3881 @endcode
  3882 
  3883 @see RBuf8::Close()
  3884 */
  3885 EXPORT_C void RBuf8::CleanupClosePushL()
  3886 	{
  3887 	::CleanupClosePushL(*this);
  3888 	}
  3889 
  3890 
  3891 
  3892 
  3893 /**
  3894 Tests that the class obeys its invariant.
  3895 */
  3896 EXPORT_C void RBuf8::__DbgTestInvariant() const
  3897 	{
  3898 #ifdef _DEBUG
  3899 	TDes8::__DbgTestInvariant();
  3900 	switch(Type())
  3901 		{
  3902 	case EPtr:
  3903 		if (iEPtrType)
  3904 			{
  3905 			__ASSERT_DEBUG(User::AllocLen(iEPtrType) >= iMaxLength*(TInt)sizeof(TUint8), Panic(EInvariantFalse));
  3906 			}
  3907 		break;
  3908 	case EBufCPtr:
  3909 		iEBufCPtrType->__DbgTestInvariant(); 
  3910 		__ASSERT_DEBUG(iEBufCPtrType->Des().MaxLength() == iMaxLength, Panic(EInvariantFalse));
  3911 		__ASSERT_DEBUG(iEBufCPtrType->Length() == Length(), Panic(EInvariantFalse));
  3912 		break;
  3913 	default:
  3914 		User::Invariant();
  3915 		}
  3916 #endif // _DEBUG
  3917 	}
  3918 
  3919 #endif	// __KERNEL_MODE__
  3920 
  3921 
  3922 #if defined(__DES8_MACHINE_CODED__) || defined(__EABI__)
  3923 GLDEF_C void Des8PanicBadDesType()
  3924 	{
  3925 	Panic(ETDes8BadDescriptorType);
  3926 	}
  3927 
  3928 GLDEF_C void Des8PanicPosOutOfRange()
  3929 	{
  3930 	Panic(ETDes8PosOutOfRange);
  3931 	}
  3932 #endif
  3933 
  3934 #ifdef __DES8_MACHINE_CODED__
  3935 GLDEF_C void Des8PanicLengthNegative()
  3936 	{
  3937 	Panic(ETDes8LengthNegative);
  3938 	}
  3939 
  3940 GLDEF_C void Des8PanicMaxLengthNegative()
  3941 	{
  3942 	Panic(ETDes8MaxLengthNegative);
  3943 	}
  3944 
  3945 GLDEF_C void Des8PanicLengthOutOfRange()
  3946 	{
  3947 	Panic(ETDes8LengthOutOfRange);
  3948 	}
  3949 
  3950 GLDEF_C void Des8PanicDesOverflow()
  3951 	{
  3952 	Panic(ETDes8Overflow);
  3953 	}
  3954 
  3955 GLDEF_C void Des8PanicDesIndexOutOfRange()
  3956 	{
  3957 	Panic(ETDes8IndexOutOfRange);
  3958 	}
  3959 #endif
  3960