1 // Copyright (c) 2000-2010 Nokia Corporation and/or its subsidiary(-ies). |
1 // Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies). |
2 // All rights reserved. |
2 // All rights reserved. |
3 // This component and the accompanying materials are made available |
3 // This component and the accompanying materials are made available |
4 // under the terms of "Eclipse Public License v1.0" |
4 // under the terms of "Eclipse Public License v1.0" |
5 // which accompanies this distribution, and is available |
5 // which accompanies this distribution, and is available |
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html". |
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html". |
42 * |
36 * |
43 * @capability None |
37 * @capability None |
44 */ |
38 */ |
45 EXPORT_C CSmsBufferSegmenter* CSmsBufferSegmenter::NewLC(CSmsAlphabetConverter& aAlphabetConverter,const CSmsBufferBase& aBuffer,TInt aSegmentSize) |
39 EXPORT_C CSmsBufferSegmenter* CSmsBufferSegmenter::NewLC(CSmsAlphabetConverter& aAlphabetConverter,const CSmsBufferBase& aBuffer,TInt aSegmentSize) |
46 { |
40 { |
47 OstTraceDef0(OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CSMSBUFFERSEGMENTER_NEWLC_1, "CSmsBufferSegmenter::NewLC()"); |
41 LOGGSMU1("CSmsBufferSegmenter::NewLC()"); |
48 |
42 |
49 CSmsBufferSegmenter* segmenter=new(ELeave) CSmsBufferSegmenter(aAlphabetConverter,aBuffer,aSegmentSize); |
43 CSmsBufferSegmenter* segmenter=new(ELeave) CSmsBufferSegmenter(aAlphabetConverter,aBuffer,aSegmentSize); |
50 CleanupStack::PushL(segmenter); |
44 CleanupStack::PushL(segmenter); |
51 segmenter->ConstructL(); |
45 segmenter->ConstructL(); |
52 return segmenter; |
46 return segmenter; |
63 /** |
57 /** |
64 * 2nd phase of constructor. Esures we have an initial buffer. |
58 * 2nd phase of constructor. Esures we have an initial buffer. |
65 */ |
59 */ |
66 void CSmsBufferSegmenter::ConstructL() |
60 void CSmsBufferSegmenter::ConstructL() |
67 { |
61 { |
68 OstTraceDef0(OST_TRACE_CATEGORY_DEBUG, TRACE_INTERNALS, CSMSBUFFERSEGMENTER_CONSTRUCTL_1, "CSmsBufferSegmenter::ConstructL()"); |
62 LOGGSMU1("CSmsBufferSegmenter::ConstructL()"); |
69 |
63 |
70 iConvertedBuffer=HBufC8::NewMaxL(iSegmentSize); |
64 iConvertedBuffer=HBufC8::NewMaxL(iSegmentSize); |
71 iConvertedBufferPtr.Set((TUint8*)iConvertedBuffer->Des().Ptr(),0,iConvertedBuffer->Length()); |
65 iConvertedBufferPtr.Set((TUint8*)iConvertedBuffer->Des().Ptr(),0,iConvertedBuffer->Length()); |
72 } // CSmsBufferSegmenter::ConstructL |
66 } // CSmsBufferSegmenter::ConstructL |
73 |
67 |
86 /** |
80 /** |
87 * Resets the converted buffer |
81 * Resets the converted buffer |
88 */ |
82 */ |
89 void CSmsBufferSegmenter::Reset() |
83 void CSmsBufferSegmenter::Reset() |
90 { |
84 { |
91 OstTraceDef0(OST_TRACE_CATEGORY_DEBUG, TRACE_INTERNALS, CSMSBUFFERSEGMENTER_RESET_1, "CSmsBufferSegmenter::Reset()"); |
85 LOGGSMU1("CSmsBufferSegmenter::Reset()"); |
92 |
86 |
93 iConvertedBufferPtr.Zero(); |
87 iConvertedBufferPtr.Zero(); |
94 iElementsExtracted=0; |
88 iElementsExtracted=0; |
95 } // CSmsBufferSegmenter::Reset |
89 } // CSmsBufferSegmenter::Reset |
96 |
90 |
108 */ |
102 */ |
109 EXPORT_C TBool CSmsBufferSegmenter::SegmentNextL(TDes8& aSegmentBuffer, |
103 EXPORT_C TBool CSmsBufferSegmenter::SegmentNextL(TDes8& aSegmentBuffer, |
110 TInt& aUnconvertedChars, TInt& aDowngradedChars, |
104 TInt& aUnconvertedChars, TInt& aDowngradedChars, |
111 TSmsEncoding aEncoding) |
105 TSmsEncoding aEncoding) |
112 { |
106 { |
113 OstTraceDef1(OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CSMSBUFFERSEGMENTER_SEGMENTNEXTL_1, "CSmsBufferSegmenter::SegmentNextL(): iSegmentSize=%d", iSegmentSize); |
107 LOGGSMU2("CSmsBufferSegmenter::SegmentNextL(): iSegmentSize=%d", iSegmentSize); |
114 |
108 |
115 TBool ret = DoSegmentNextL(aSegmentBuffer, iSegmentSize, |
109 TBool ret = DoSegmentNextL(aSegmentBuffer, iSegmentSize, |
116 aUnconvertedChars, aDowngradedChars, |
110 aUnconvertedChars, aDowngradedChars, |
117 aEncoding); |
111 aEncoding); |
118 OstTraceDef1(OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CSMSBUFFERSEGMENTER_SEGMENTNEXTL_2, "CSmsBufferSegmenter::SegmentNextL() returns %d ", ret); |
112 LOGGSMU2("CSmsBufferSegmenter::SegmentNextL() returns %d ", ret); |
119 |
113 |
120 return ret; |
114 return ret; |
121 } // CSmsBufferSegmenter::SegmentNextL |
115 } // CSmsBufferSegmenter::SegmentNextL |
122 |
116 |
123 |
117 |
128 // Extracts a "native" segment from the SMS buffer, converts to the required |
122 // Extracts a "native" segment from the SMS buffer, converts to the required |
129 // character set and breaks off the next segment of required size. |
123 // character set and breaks off the next segment of required size. |
130 // Returns true if this was the last segment |
124 // Returns true if this was the last segment |
131 // |
125 // |
132 { |
126 { |
133 OstTraceDef1(OST_TRACE_CATEGORY_DEBUG, TRACE_INTERNALS, CSMSBUFFERSEGMENTER_DOSEGMENTNEXTL_1, "CSmsBufferSegmenter::DoSegmentNextL(): aSegmentSize=%d", aSegmentSize); |
127 LOGGSMU2("CSmsBufferSegmenter::DoSegmentNextL(): aSegmentSize=%d", aSegmentSize); |
134 |
128 |
135 __ASSERT_ALWAYS(aSegmentSize>0,Panic(KGsmuPanicIllegalSegmentSize)); |
129 __ASSERT_ALWAYS(aSegmentSize>0,Panic(KGsmuPanicIllegalSegmentSize)); |
136 __ASSERT_ALWAYS(aSegmentBuffer.MaxLength()>=aSegmentSize,Panic(KGsmuPanicSegmentBufferTooSmall)); |
130 __ASSERT_ALWAYS(aSegmentBuffer.MaxLength()>=aSegmentSize,Panic(KGsmuPanicSegmentBufferTooSmall)); |
137 |
131 |
138 // Extract from buffer until we have enough chars for a segment or we're at the end |
132 // Extract from buffer until we have enough chars for a segment or we're at the end |
167 } // CSmsBufferSegmenter::DoSegmentNextL |
161 } // CSmsBufferSegmenter::DoSegmentNextL |
168 |
162 |
169 |
163 |
170 TBool CSmsBufferSegmenter::MoreL() |
164 TBool CSmsBufferSegmenter::MoreL() |
171 { |
165 { |
172 OstTraceDef0(OST_TRACE_CATEGORY_DEBUG, TRACE_INTERNALS, CSMSBUFFERSEGMENTER_MOREL_1, "CSmsBufferSegmenter::MoreL()"); |
166 LOGGSMU1("CSmsBufferSegmenter::MoreL()"); |
173 |
167 |
174 if ((iElementsExtracted>=iSmsBuffer.Length())&&(iConvertedBufferPtr.Length()==0)) |
168 if ((iElementsExtracted>=iSmsBuffer.Length())&&(iConvertedBufferPtr.Length()==0)) |
175 { |
169 { |
176 if (iAlphabetConverter.UnconvertedNativeCharacters().Length()>0) |
170 if (iAlphabetConverter.UnconvertedNativeCharacters().Length()>0) |
177 { |
171 { |
194 * |
188 * |
195 * @capability None |
189 * @capability None |
196 */ |
190 */ |
197 EXPORT_C TInt CSmsBufferSegmenter::TotalConvertedLengthL(TSmsEncoding aEncoding) |
191 EXPORT_C TInt CSmsBufferSegmenter::TotalConvertedLengthL(TSmsEncoding aEncoding) |
198 { |
192 { |
199 OstTraceDef1(OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CSMSBUFFERSEGMENTER_TOTALCONVERTEDLENGTHL_1, "CSmsBufferSegmenter::TotalConvertedLengthL(): aEncoding=%d", aEncoding); |
193 LOGGSMU2("CSmsBufferSegmenter::TotalConvertedLengthL(): aEncoding=%d", aEncoding); |
200 |
194 |
201 // Check for shortcut |
195 // Check for shortcut |
202 CSmsAlphabetConverter::TSmsAlphabetConversionProperties conversionProperties; |
196 CSmsAlphabetConverter::TSmsAlphabetConversionProperties conversionProperties; |
203 iAlphabetConverter.ConversionPropertiesL(conversionProperties); |
197 iAlphabetConverter.ConversionPropertiesL(conversionProperties); |
204 if (conversionProperties.iWidthConversion==CSmsAlphabetConverter::ESmsAlphabetWidthConversionFixed) |
198 if (conversionProperties.iWidthConversion==CSmsAlphabetConverter::ESmsAlphabetWidthConversionFixed) |
233 |
227 |
234 |
228 |
235 TSmsEncoding CSmsBufferSegmenter::FindBestAlternativeEncodingL(TSmsEncoding aSuggestedEncoding, |
229 TSmsEncoding CSmsBufferSegmenter::FindBestAlternativeEncodingL(TSmsEncoding aSuggestedEncoding, |
236 TInt aMaxBodyLength) const |
230 TInt aMaxBodyLength) const |
237 { |
231 { |
238 OstTraceDefExt2(OST_TRACE_CATEGORY_DEBUG, TRACE_INTERNALS, CSMSBUFFERSEGMENTER_FINDBESTALTERNATIVEENCODINGL_1, "CSmsBufferSegmenter::FindBestAlternativeEncodingL(): aSuggestedEncoding=%d, aMaxBodyLength=%d",aSuggestedEncoding, aMaxBodyLength); |
232 LOGGSMU3("CSmsBufferSegmenter::FindBestAlternativeEncodingL(): aSuggestedEncoding=%d, aMaxBodyLength=%d", |
|
233 aSuggestedEncoding, aMaxBodyLength); |
239 |
234 |
240 TSmsEncoding encodingToUse = ESmsEncodingNone; |
235 TSmsEncoding encodingToUse = ESmsEncodingNone; |
241 |
236 |
242 // |
237 // |
243 // If this is not 7bit or the alternative encoding is not set then do |
238 // If this is not 7bit or the alternative encoding is not set then do |
269 /** |
264 /** |
270 * Ensures the segmentation buffer is of the specified length |
265 * Ensures the segmentation buffer is of the specified length |
271 */ |
266 */ |
272 void CSmsBufferSegmenter::CheckConvertedBufferAllocL(TInt aMaxLength) |
267 void CSmsBufferSegmenter::CheckConvertedBufferAllocL(TInt aMaxLength) |
273 { |
268 { |
274 OstTraceDef1(OST_TRACE_CATEGORY_DEBUG, TRACE_INTERNALS, CSMSBUFFERSEGMENTER_CHECKCONVERTEDBUFFERALLOCL_1, "CSmsBufferSegmenter::CheckConvertedBufferAllocL(): aMaxLength=%d",aMaxLength); |
269 LOGGSMU2("CSmsBufferSegmenter::CheckConvertedBufferAllocL(): aMaxLength=%d", |
|
270 aMaxLength); |
275 |
271 |
276 if (iConvertedBuffer->Length()<aMaxLength) |
272 if (iConvertedBuffer->Length()<aMaxLength) |
277 { |
273 { |
278 iConvertedBuffer=iConvertedBuffer->ReAllocL(aMaxLength); |
274 iConvertedBuffer=iConvertedBuffer->ReAllocL(aMaxLength); |
279 iConvertedBuffer->Des().SetLength(aMaxLength); |
275 iConvertedBuffer->Des().SetLength(aMaxLength); |
286 * Determines the number of converted elements that should be returned in the |
282 * Determines the number of converted elements that should be returned in the |
287 * segment - called from DoSegmentNextL |
283 * segment - called from DoSegmentNextL |
288 */ |
284 */ |
289 TInt CSmsBufferSegmenter::ElementsToReturnFromConvertedBufferL(TInt aSegmentSize) |
285 TInt CSmsBufferSegmenter::ElementsToReturnFromConvertedBufferL(TInt aSegmentSize) |
290 { |
286 { |
291 OstTraceDef1(OST_TRACE_CATEGORY_DEBUG, TRACE_INTERNALS, CSMSBUFFERSEGMENTER_ELEMENTSTORETURNFROMCONVERTEDBUFFERL_1, "CSmsBufferSegmenter::CheckConvertedBufferAllocL(): aSegmentSize=%d",aSegmentSize); |
287 LOGGSMU2("CSmsBufferSegmenter::CheckConvertedBufferAllocL(): aSegmentSize=%d", |
|
288 aSegmentSize); |
292 |
289 |
293 TInt elementCount=Min(aSegmentSize,iConvertedBufferPtr.Length()); |
290 TInt elementCount=Min(aSegmentSize,iConvertedBufferPtr.Length()); |
294 if (iAlphabetConverter.Alphabet()==TSmsDataCodingScheme::ESmsAlphabet7Bit) |
291 if (iAlphabetConverter.Alphabet()==TSmsDataCodingScheme::ESmsAlphabet7Bit) |
295 { |
292 { |
296 // For 7-bit, don't break an extended character across a segment |
293 // For 7-bit, don't break an extended character across a segment |
309 /** |
306 /** |
310 * @capability None |
307 * @capability None |
311 */ |
308 */ |
312 EXPORT_C CSmsEMSBufferSegmenter* CSmsEMSBufferSegmenter::NewLC(CSmsAlphabetConverter& aAlphabetConverter,const CSmsBufferBase& aBuffer, TInt aSegmentSize) |
309 EXPORT_C CSmsEMSBufferSegmenter* CSmsEMSBufferSegmenter::NewLC(CSmsAlphabetConverter& aAlphabetConverter,const CSmsBufferBase& aBuffer, TInt aSegmentSize) |
313 { |
310 { |
314 OstTraceDef1(OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CSMSEMSBUFFERSEGMENTER_NEWLC_1, "CSmsBufferSegmenter::NewLC(): aSegmentSize=%d", aSegmentSize); |
311 LOGGSMU2("CSmsBufferSegmenter::NewLC(): aSegmentSize=%d", aSegmentSize); |
315 |
312 |
316 CSmsEMSBufferSegmenter* self = new (ELeave) CSmsEMSBufferSegmenter(aAlphabetConverter, aBuffer, aSegmentSize); |
313 CSmsEMSBufferSegmenter* self = new (ELeave) CSmsEMSBufferSegmenter(aAlphabetConverter, aBuffer, aSegmentSize); |
317 CleanupStack::PushL(self); |
314 CleanupStack::PushL(self); |
318 self->ConstructL(); |
315 self->ConstructL(); |
319 return self; |
316 return self; |
338 */ |
335 */ |
339 EXPORT_C TBool CSmsEMSBufferSegmenter::SegmentNextL(TDes8& aSegmentBuffer, TInt aSegmentSize, |
336 EXPORT_C TBool CSmsEMSBufferSegmenter::SegmentNextL(TDes8& aSegmentBuffer, TInt aSegmentSize, |
340 TInt& aUnconvertedChars, TInt& aDowngradedChars, |
337 TInt& aUnconvertedChars, TInt& aDowngradedChars, |
341 TSmsEncoding aEncoding) |
338 TSmsEncoding aEncoding) |
342 { |
339 { |
343 OstTraceDef1(OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CSMSEMSBUFFERSEGMENTER_SEGMENTNEXTL_1, "CSmsEMSBufferSegmenter::SegmentNext(): aSegmentSize=%d", aSegmentSize); |
340 LOGGSMU2("CSmsEMSBufferSegmenter::SegmentNext(): aSegmentSize=%d", aSegmentSize); |
344 |
341 |
345 TBool ret=DoSegmentNextL(aSegmentBuffer, aSegmentSize, aUnconvertedChars, aDowngradedChars, |
342 TBool ret=DoSegmentNextL(aSegmentBuffer, aSegmentSize, aUnconvertedChars, aDowngradedChars, |
346 aEncoding); |
343 aEncoding); |
347 |
344 |
348 OstTraceDef1(OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, CSMSEMSBUFFERSEGMENTER_SEGMENTNEXTL_2, "CSmsEMSBufferSegmenter::SegmentNext() returns %d ", ret); |
345 LOGGSMU2("CSmsEMSBufferSegmenter::SegmentNext() returns %d ", ret); |
349 |
346 |
350 return ret; |
347 return ret; |
351 } // CSmsEMSBufferSegmenter::SegmentNextL |
348 } // CSmsEMSBufferSegmenter::SegmentNextL |
352 |
349 |
353 |
350 |
362 */ |
359 */ |
363 TInt CSmsEMSBufferSegmenter::SegmentL(TDes8& aSegmentBuffer, TInt aNativeChars, TInt aSegmentMax, |
360 TInt CSmsEMSBufferSegmenter::SegmentL(TDes8& aSegmentBuffer, TInt aNativeChars, TInt aSegmentMax, |
364 TInt& aUnconvertedChars, TInt& aDowngradedChars, |
361 TInt& aUnconvertedChars, TInt& aDowngradedChars, |
365 TSmsEncoding aEncoding) |
362 TSmsEncoding aEncoding) |
366 { |
363 { |
367 OstTraceDefExt2(OST_TRACE_CATEGORY_DEBUG, TRACE_INTERNALS, CSMSEMSBUFFERSEGMENTER_SEGMENTL_1, "CSmsEMSBufferSegmenter::SegmentL(): aNativeChars=%d, aSegmentMax=%d",aNativeChars, aSegmentMax); |
364 LOGGSMU3("CSmsEMSBufferSegmenter::SegmentL(): aNativeChars=%d, aSegmentMax=%d", |
|
365 aNativeChars, aSegmentMax); |
368 |
366 |
369 __ASSERT_ALWAYS(iConvertedBufferPtr.Length()==0, User::Leave(KGsmuPanicBufferNotReset)); |
367 __ASSERT_ALWAYS(iConvertedBufferPtr.Length()==0, User::Leave(KGsmuPanicBufferNotReset)); |
370 __ASSERT_ALWAYS(aNativeChars>0,User::Leave(KGsmuPanicIllegalSegmentSize)); |
368 __ASSERT_ALWAYS(aNativeChars>0,User::Leave(KGsmuPanicIllegalSegmentSize)); |
371 __ASSERT_ALWAYS(aSegmentMax>0,User::Leave(KGsmuPanicIllegalSegmentSize)); |
369 __ASSERT_ALWAYS(aSegmentMax>0,User::Leave(KGsmuPanicIllegalSegmentSize)); |
372 __ASSERT_ALWAYS(aSegmentBuffer.MaxLength()>=aNativeChars,User::Leave(KGsmuPanicSegmentBufferTooSmall)); |
370 __ASSERT_ALWAYS(aSegmentBuffer.MaxLength()>=aNativeChars,User::Leave(KGsmuPanicSegmentBufferTooSmall)); |
430 * @capability None |
428 * @capability None |
431 */ |
429 */ |
432 EXPORT_C void TSmsBufferReassembler::ReassembleNextL(const TDesC8& aSegmentBuffer, |
430 EXPORT_C void TSmsBufferReassembler::ReassembleNextL(const TDesC8& aSegmentBuffer, |
433 TSmsEncoding aEncoding,TBool aIsLast) |
431 TSmsEncoding aEncoding,TBool aIsLast) |
434 { |
432 { |
435 OstTraceDefExt2(OST_TRACE_CATEGORY_DEBUG, TRACE_BORDER, TSMSBUFFERREASSEMBLER_REASSEMBLENEXTL_1, "TSmsBufferReassembler::ReassembleNextL(): aEncoding=%d aIsLast=%d",aEncoding, aIsLast); |
433 LOGGSMU3("TSmsBufferReassembler::ReassembleNextL(): aEncoding=%d aIsLast=%d", |
|
434 aEncoding, aIsLast); |
436 |
435 |
437 TPtrC nativeChars=iAlphabetConverter.ConvertToNativeL(aSegmentBuffer, aEncoding); |
436 TPtrC nativeChars=iAlphabetConverter.ConvertToNativeL(aSegmentBuffer, aEncoding); |
438 iSmsBuffer.InsertL(iSmsBuffer.Length(),nativeChars); |
437 iSmsBuffer.InsertL(iSmsBuffer.Length(),nativeChars); |
439 if ((aIsLast)&&(iAlphabetConverter.UnconvertedUDElements().Length()>0)) |
438 if ((aIsLast)&&(iAlphabetConverter.UnconvertedUDElements().Length()>0)) |
440 { |
439 { |