| 0 |      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 | 
 |