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