kernel/eka/common/des8.cpp
changeset 0 a41df078684a
equal deleted inserted replaced
-1:000000000000 0:a41df078684a
       
     1 // Copyright (c) 1994-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of the License "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // e32\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