sl@0: /* sl@0: * Copyright (c) 2002-2004 Nokia Corporation and/or its subsidiary(-ies). sl@0: * All rights reserved. sl@0: * This component and the accompanying materials are made available sl@0: * under the terms of "Eclipse Public License v1.0" sl@0: * which accompanies this distribution, and is available sl@0: * at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: * sl@0: * Initial Contributors: sl@0: * Nokia Corporation - initial contribution. sl@0: * sl@0: * Contributors: sl@0: * sl@0: * Description: This file is a source code file for a charconv plug-in. sl@0: * This plug-in supports EUC-JP with direct mapped pictograph. sl@0: * sl@0: */ sl@0: sl@0: sl@0: sl@0: sl@0: sl@0: sl@0: sl@0: // INCLUDE FILES sl@0: sl@0: #include sl@0: sl@0: #include sl@0: sl@0: sl@0: sl@0: #ifndef EKA2 sl@0: sl@0: #include sl@0: sl@0: #else sl@0: sl@0: #include sl@0: sl@0: #include sl@0: sl@0: #include "charactersetconverter.h" sl@0: sl@0: #endif // !EKA2 sl@0: sl@0: sl@0: sl@0: #include sl@0: sl@0: #include "jisx0201.h" sl@0: sl@0: #include "jisx0208.h" sl@0: sl@0: #include "jisx0212.h" sl@0: sl@0: #include "CnvShiftJisDirectmap.h" sl@0: sl@0: // LOCAL CONSTANTS AND MACROS sl@0: sl@0: const TUint KSingleShift2=0x8e; sl@0: sl@0: const TUint KSingleShift3=0x8f; sl@0: sl@0: const TUint KFirstByteRangeFirstBlockStart = 0xF5; sl@0: sl@0: const TUint KFirstByteRangeFirstBlockEnd = 0xFE; sl@0: sl@0: const TUint KSecondByteRangeSecondBlockStart = 0xA1; sl@0: sl@0: const TUint KSecondByteRangeSecondBlockEnd = 0xFE; sl@0: sl@0: const TUint KPictographStartFirstByte = 0xF0; sl@0: sl@0: const TUint KPictographStartSecondByte = 0x40; sl@0: sl@0: const TUint KEUCJPSecondBlockStart = 0xF5; sl@0: sl@0: const TUint KEUCJPBlockSize = 0x5D; sl@0: sl@0: const TUint KShiftJisTrailByteIllegal = 0x7F; sl@0: sl@0: sl@0: sl@0: // SecureID for Brower app sl@0: sl@0: const TUint32 KBrowserSecureId = 0x10008D39; sl@0: sl@0: // Define for converting from YenSign to BackSlash sl@0: sl@0: const TUint KCharacterCodeForYenSign = 0x00A5; sl@0: sl@0: const TUint KCharacterCodeForBackSlash = 0x005C; sl@0: sl@0: sl@0: sl@0: // fullwidth question mark sl@0: sl@0: _LIT8(KLit8EucJpPackedReplacementForUnconvertibleUnicodeCharacters, "\xa1\xa9"); sl@0: sl@0: #if defined(_DEBUG) sl@0: sl@0: _LIT(KLitPanicText, "EucJpDirectmap"); sl@0: sl@0: enum TPanic sl@0: sl@0: { sl@0: sl@0: EPanicNothingToConvert1=1, sl@0: sl@0: EPanicNothingToConvert2, sl@0: sl@0: EPanicNothingToConvert3, sl@0: sl@0: EPanicNothingToConvert4, sl@0: sl@0: EPanicNothingToConvert5, sl@0: sl@0: EPanicNothingToConvert6, sl@0: sl@0: EPanicOddNumberOfBytes1, sl@0: sl@0: EPanicOddNumberOfBytes2, sl@0: sl@0: EPanicOddNumberOfBytes3, sl@0: sl@0: EPanicOddNumberOfBytes4, sl@0: sl@0: EPanicOddNumberOfBytes5, sl@0: sl@0: EPanicOddNumberOfBytes6, sl@0: sl@0: EPanicBadHighBit1, sl@0: sl@0: EPanicBadHighBit2, sl@0: sl@0: EPanicBadHighBit3, sl@0: sl@0: EPanicBadHighBit4, sl@0: sl@0: EPanicBadHighBit5, sl@0: sl@0: EPanicBadHighBit6, sl@0: sl@0: EPanicBadHighBit7, sl@0: sl@0: EPanicBadPointers1, sl@0: sl@0: EPanicBadPointers2, sl@0: sl@0: EPanicBadPointers3, sl@0: sl@0: EPanicBadPointers4, sl@0: sl@0: EPanicBadPointers5, sl@0: sl@0: EPanicBadPointers6, sl@0: sl@0: EPanicBadPointers7, sl@0: sl@0: EPanicBadPointers8, sl@0: sl@0: EPanicBadPointers9, sl@0: sl@0: EPanicBadPointers10, sl@0: sl@0: EPanicBadPointers11, sl@0: sl@0: EPanicBadPointers12, sl@0: sl@0: EPanicBadPointers13, sl@0: sl@0: EPanicBadPointers14, sl@0: sl@0: EPanicBadPointers15, sl@0: sl@0: EPanicBadPointers16, sl@0: sl@0: EPanicBadPointers17, sl@0: sl@0: EPanicBadPointers18, sl@0: sl@0: EPanicBadPointers19, sl@0: sl@0: EPanicBadPointers20, sl@0: sl@0: EPanicBadPointers21, sl@0: sl@0: EPanicBadPointers22, sl@0: sl@0: EPanicBadPointers23, sl@0: sl@0: EPanicBadPointers24, sl@0: sl@0: EPanicBadPointers25, sl@0: sl@0: EPanicBadPointers26, sl@0: sl@0: EPanicBadPointers27, sl@0: sl@0: EPanicBadPointers28, sl@0: sl@0: EPanicBadPointers29, sl@0: sl@0: EPanicBadPointers30, sl@0: sl@0: EPanicBadPointers31, sl@0: sl@0: EPanicBadPointers32, sl@0: sl@0: EPanicBadPointers33, sl@0: sl@0: EPanicBadPointers34, sl@0: sl@0: EPanicBadPointers35, sl@0: sl@0: EPanicBadPointers36, sl@0: sl@0: EPanicBadCalculation1, sl@0: sl@0: EPanicBadCalculation2, sl@0: sl@0: EPanicNumberOfBytesIsNotMultipleOfThree1, sl@0: sl@0: EPanicNumberOfBytesIsNotMultipleOfThree2, sl@0: sl@0: EPanicSingleShift2Expected, sl@0: sl@0: EPanicSingleShift3Expected sl@0: sl@0: }; sl@0: sl@0: sl@0: sl@0: LOCAL_C void Panic(TPanic aPanic) sl@0: sl@0: { sl@0: sl@0: User::Panic(KLitPanicText, aPanic); sl@0: sl@0: } sl@0: sl@0: #endif sl@0: sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // DummyConvertFromIntermediateBufferInPlace sl@0: sl@0: // sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // sl@0: sl@0: LOCAL_C void DummyConvertFromIntermediateBufferInPlace(TInt, TDes8&, sl@0: sl@0: TInt& aNumberOfCharactersThatDroppedOut) sl@0: sl@0: { sl@0: sl@0: aNumberOfCharactersThatDroppedOut = 0; sl@0: sl@0: } sl@0: sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // ConvertFromJisX0208ToEucJpPackedInPlace sl@0: sl@0: // Converts from JIS code to EUC-JP sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // sl@0: sl@0: LOCAL_C void ConvertFromJisX0208ToEucJpPackedInPlace( sl@0: sl@0: TInt aStartPositionInDescriptor, TDes8& aDescriptor, sl@0: sl@0: TInt& aNumberOfCharactersThatDroppedOut) sl@0: sl@0: { sl@0: sl@0: aNumberOfCharactersThatDroppedOut = 0; sl@0: sl@0: const TInt descriptorLength = aDescriptor.Length(); sl@0: sl@0: __ASSERT_DEBUG(descriptorLength > aStartPositionInDescriptor, sl@0: sl@0: Panic(EPanicNothingToConvert1)); sl@0: sl@0: __ASSERT_DEBUG((descriptorLength - aStartPositionInDescriptor) % 2 == 0, sl@0: sl@0: Panic(EPanicOddNumberOfBytes1)); sl@0: sl@0: TUint8* pointerToCurrentByte = CONST_CAST(TUint8*, aDescriptor.Ptr()); sl@0: sl@0: const TUint8* const pointerToLastByte = sl@0: sl@0: pointerToCurrentByte + (descriptorLength - 1); sl@0: sl@0: pointerToCurrentByte += aStartPositionInDescriptor; sl@0: sl@0: FOREVER sl@0: sl@0: { sl@0: sl@0: const TUint currentByte = *pointerToCurrentByte; sl@0: sl@0: __ASSERT_DEBUG((currentByte & 0x80) == 0, Panic(EPanicBadHighBit1)); sl@0: sl@0: *pointerToCurrentByte = STATIC_CAST(TUint8, currentByte | 0x80); sl@0: sl@0: __ASSERT_DEBUG(pointerToCurrentByte <= pointerToLastByte, sl@0: sl@0: Panic(EPanicBadPointers1)); sl@0: sl@0: if (pointerToCurrentByte >= pointerToLastByte) sl@0: sl@0: { sl@0: sl@0: break; sl@0: sl@0: } sl@0: sl@0: ++pointerToCurrentByte; sl@0: sl@0: } sl@0: sl@0: } sl@0: sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // ConvertFromHalfWidthKatakana8ToEucJpPackedInPlace sl@0: sl@0: // Converts from half width Katakana code to EUC-JP sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // sl@0: sl@0: LOCAL_C void ConvertFromHalfWidthKatakana8ToEucJpPackedInPlace( sl@0: sl@0: TInt aStartPositionInDescriptor, TDes8& aDescriptor, sl@0: sl@0: TInt& aNumberOfCharactersThatDroppedOut) sl@0: sl@0: { sl@0: sl@0: TInt descriptorLength = aDescriptor.Length(); sl@0: sl@0: __ASSERT_DEBUG(descriptorLength > aStartPositionInDescriptor, sl@0: sl@0: Panic(EPanicNothingToConvert2)); sl@0: sl@0: aNumberOfCharactersThatDroppedOut = Max(0, (descriptorLength - sl@0: sl@0: aStartPositionInDescriptor) - ((aDescriptor.MaxLength() - sl@0: sl@0: aStartPositionInDescriptor) / 2)); sl@0: sl@0: descriptorLength -= aNumberOfCharactersThatDroppedOut; sl@0: sl@0: __ASSERT_DEBUG(descriptorLength >= aStartPositionInDescriptor, sl@0: sl@0: Panic(EPanicBadCalculation1)); sl@0: sl@0: if (descriptorLength <= aStartPositionInDescriptor) sl@0: sl@0: { sl@0: sl@0: aDescriptor.SetLength(descriptorLength); sl@0: sl@0: } sl@0: sl@0: else sl@0: sl@0: { sl@0: sl@0: // pointerToTargetByte is initialized properly when descriptorLength sl@0: sl@0: // has been offset to the actual final length of aDescriptor sl@0: sl@0: TUint8* pointerToTargetByte = CONST_CAST(TUint8*, aDescriptor.Ptr()); sl@0: sl@0: const TUint8* const pointerToFirstByte = sl@0: sl@0: pointerToTargetByte + aStartPositionInDescriptor; sl@0: sl@0: const TUint8* pointerToSourceByte = sl@0: sl@0: pointerToTargetByte + (descriptorLength - 1); sl@0: sl@0: descriptorLength = sl@0: sl@0: ((descriptorLength - aStartPositionInDescriptor) * 2) + sl@0: sl@0: aStartPositionInDescriptor; sl@0: sl@0: __ASSERT_DEBUG((descriptorLength - aStartPositionInDescriptor) % 2 == 0, sl@0: sl@0: Panic(EPanicOddNumberOfBytes2)); sl@0: sl@0: aDescriptor.SetLength(descriptorLength); sl@0: sl@0: // pointerToTargetByte is is initialized properly here sl@0: sl@0: pointerToTargetByte += descriptorLength - 1; sl@0: sl@0: FOREVER sl@0: sl@0: { sl@0: sl@0: *pointerToTargetByte = *pointerToSourceByte; sl@0: sl@0: __ASSERT_DEBUG(pointerToTargetByte>pointerToFirstByte, sl@0: sl@0: Panic(EPanicBadPointers2)); sl@0: sl@0: --pointerToTargetByte; sl@0: sl@0: *pointerToTargetByte = KSingleShift2; sl@0: sl@0: __ASSERT_DEBUG(pointerToTargetByte >= pointerToFirstByte, sl@0: sl@0: Panic(EPanicBadPointers3)); sl@0: sl@0: if (pointerToTargetByte <= pointerToFirstByte) sl@0: sl@0: { sl@0: sl@0: break; sl@0: sl@0: } sl@0: sl@0: --pointerToTargetByte; sl@0: sl@0: __ASSERT_DEBUG(pointerToSourceByte > pointerToFirstByte, sl@0: sl@0: Panic(EPanicBadPointers4)); sl@0: sl@0: --pointerToSourceByte; sl@0: sl@0: } sl@0: sl@0: __ASSERT_DEBUG(pointerToTargetByte == pointerToFirstByte, sl@0: sl@0: Panic(EPanicBadPointers5)); sl@0: sl@0: __ASSERT_DEBUG(pointerToSourceByte == pointerToFirstByte, sl@0: sl@0: Panic(EPanicBadPointers6)); sl@0: sl@0: } sl@0: sl@0: } sl@0: sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // ConvertFromJisX0212ToEucJpPackedInPlace sl@0: sl@0: // Converts from JIS code to EUC-JP sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // sl@0: sl@0: LOCAL_C void ConvertFromJisX0212ToEucJpPackedInPlace( sl@0: sl@0: TInt aStartPositionInDescriptor, TDes8& aDescriptor, sl@0: sl@0: TInt& aNumberOfCharactersThatDroppedOut) sl@0: sl@0: { sl@0: sl@0: TInt descriptorLength=aDescriptor.Length(); sl@0: sl@0: __ASSERT_DEBUG(descriptorLength > aStartPositionInDescriptor, sl@0: sl@0: Panic(EPanicNothingToConvert3)); sl@0: sl@0: __ASSERT_DEBUG((descriptorLength - aStartPositionInDescriptor) % 2 == 0, sl@0: sl@0: Panic(EPanicOddNumberOfBytes3)); sl@0: sl@0: aNumberOfCharactersThatDroppedOut = sl@0: sl@0: Max(0, ((descriptorLength - aStartPositionInDescriptor) / 2) - sl@0: sl@0: ((aDescriptor.MaxLength() - aStartPositionInDescriptor) / 3)); sl@0: sl@0: descriptorLength -= aNumberOfCharactersThatDroppedOut * 2; sl@0: sl@0: __ASSERT_DEBUG(descriptorLength >= aStartPositionInDescriptor, sl@0: sl@0: Panic(EPanicBadCalculation2)); sl@0: sl@0: if (descriptorLength <= aStartPositionInDescriptor) sl@0: sl@0: { sl@0: sl@0: aDescriptor.SetLength(descriptorLength); sl@0: sl@0: } sl@0: sl@0: else sl@0: sl@0: { sl@0: sl@0: __ASSERT_DEBUG((descriptorLength - aStartPositionInDescriptor) % 2 == 0, sl@0: sl@0: Panic(EPanicOddNumberOfBytes4)); sl@0: sl@0: // pointerToTargetByte is initialized properly when descriptorLength sl@0: sl@0: // has been offset to the actual final length of aDescriptor sl@0: sl@0: TUint8* pointerToTargetByte = CONST_CAST(TUint8*, aDescriptor.Ptr()); sl@0: sl@0: const TUint8* const pointerToFirstByte = sl@0: sl@0: pointerToTargetByte + aStartPositionInDescriptor; sl@0: sl@0: const TUint8* pointerToSourceByte = sl@0: sl@0: pointerToTargetByte + (descriptorLength - 1); sl@0: sl@0: descriptorLength = (((descriptorLength - aStartPositionInDescriptor) sl@0: sl@0: * 3) / 2) + aStartPositionInDescriptor; sl@0: sl@0: __ASSERT_DEBUG((descriptorLength - aStartPositionInDescriptor) % 3 ==0, sl@0: sl@0: Panic(EPanicNumberOfBytesIsNotMultipleOfThree1)); sl@0: sl@0: aDescriptor.SetLength(descriptorLength); sl@0: sl@0: // pointerToTargetByte is is initialized properly here sl@0: sl@0: pointerToTargetByte += descriptorLength - 1; sl@0: sl@0: FOREVER sl@0: sl@0: { sl@0: sl@0: __ASSERT_DEBUG((*pointerToSourceByte & 0x80) == 0, sl@0: sl@0: Panic(EPanicBadHighBit2)); sl@0: sl@0: *pointerToTargetByte = sl@0: sl@0: STATIC_CAST(TUint8, *pointerToSourceByte | 0x80); sl@0: sl@0: __ASSERT_DEBUG(pointerToTargetByte > pointerToFirstByte, sl@0: sl@0: Panic(EPanicBadPointers7)); sl@0: sl@0: --pointerToTargetByte; sl@0: sl@0: __ASSERT_DEBUG(pointerToSourceByte > pointerToFirstByte, sl@0: sl@0: Panic(EPanicBadPointers8)); sl@0: sl@0: --pointerToSourceByte; sl@0: sl@0: __ASSERT_DEBUG((*pointerToSourceByte & 0x80) == 0, sl@0: sl@0: Panic(EPanicBadHighBit3)); sl@0: sl@0: *pointerToTargetByte = sl@0: sl@0: STATIC_CAST(TUint8, *pointerToSourceByte | 0x80); sl@0: sl@0: __ASSERT_DEBUG(pointerToTargetByte > pointerToFirstByte, sl@0: sl@0: Panic(EPanicBadPointers9)); sl@0: sl@0: --pointerToTargetByte; sl@0: sl@0: *pointerToTargetByte = KSingleShift3; sl@0: sl@0: __ASSERT_DEBUG(pointerToTargetByte >= pointerToFirstByte, sl@0: sl@0: Panic(EPanicBadPointers10)); sl@0: sl@0: if (pointerToTargetByte <= pointerToFirstByte) sl@0: sl@0: { sl@0: sl@0: break; sl@0: sl@0: } sl@0: sl@0: --pointerToTargetByte; sl@0: sl@0: __ASSERT_DEBUG(pointerToSourceByte > pointerToFirstByte, sl@0: sl@0: Panic(EPanicBadPointers11)); sl@0: sl@0: --pointerToSourceByte; sl@0: sl@0: } sl@0: sl@0: __ASSERT_DEBUG(pointerToTargetByte == pointerToFirstByte, sl@0: sl@0: Panic(EPanicBadPointers12)); sl@0: sl@0: __ASSERT_DEBUG(pointerToSourceByte == pointerToFirstByte, sl@0: sl@0: Panic(EPanicBadPointers13)); sl@0: sl@0: } sl@0: sl@0: } sl@0: sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // NumberOfBytesAbleToConvertToJisRoman sl@0: sl@0: // Counts the bytes of be able to convert to JIS sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // sl@0: sl@0: LOCAL_C TInt NumberOfBytesAbleToConvertToJisRoman(const TDesC8& aDescriptor) sl@0: sl@0: { sl@0: sl@0: const TUint8* pointerToPreviousByte = aDescriptor.Ptr() - 1; sl@0: sl@0: const TUint8* const pointerToLastByte = sl@0: sl@0: pointerToPreviousByte + aDescriptor.Length(); sl@0: sl@0: if (pointerToPreviousByte == pointerToLastByte) sl@0: sl@0: { sl@0: sl@0: return 0; sl@0: sl@0: } sl@0: sl@0: FOREVER sl@0: sl@0: { sl@0: sl@0: __ASSERT_DEBUG(pointerToPreviousByte < pointerToLastByte, sl@0: sl@0: Panic(EPanicBadPointers14)); sl@0: sl@0: const TUint currentByte = *(pointerToPreviousByte + 1); sl@0: sl@0: if (currentByte & 0x80) sl@0: sl@0: { sl@0: sl@0: break; sl@0: sl@0: } sl@0: sl@0: __ASSERT_DEBUG(pointerToPreviousByte < pointerToLastByte, sl@0: sl@0: Panic(EPanicBadPointers15)); sl@0: sl@0: ++pointerToPreviousByte; sl@0: sl@0: __ASSERT_DEBUG(pointerToPreviousByte <= pointerToLastByte, sl@0: sl@0: Panic(EPanicBadPointers16)); sl@0: sl@0: if (pointerToPreviousByte >= pointerToLastByte) sl@0: sl@0: { sl@0: sl@0: break; sl@0: sl@0: } sl@0: sl@0: } sl@0: sl@0: return (pointerToPreviousByte + 1) - aDescriptor.Ptr(); sl@0: sl@0: } sl@0: sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // NumberOfBytesAbleToConvertToJisX0208 sl@0: sl@0: // Counts the bytes of be able to convert to JIS sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // sl@0: sl@0: LOCAL_C TInt NumberOfBytesAbleToConvertToJisX0208(const TDesC8& aDescriptor) sl@0: sl@0: { sl@0: sl@0: const TUint8* pointerToPreviousByte = aDescriptor.Ptr() - 1; sl@0: sl@0: const TUint8* const pointerToLastByte = sl@0: sl@0: pointerToPreviousByte + aDescriptor.Length(); sl@0: sl@0: if (pointerToPreviousByte == pointerToLastByte) sl@0: sl@0: { sl@0: sl@0: return 0; sl@0: sl@0: } sl@0: sl@0: FOREVER sl@0: sl@0: { sl@0: sl@0: __ASSERT_DEBUG(pointerToPreviousByte < pointerToLastByte, sl@0: sl@0: Panic(EPanicBadPointers17)); sl@0: sl@0: TUint currentByte = *(pointerToPreviousByte + 1); sl@0: sl@0: if (currentByte < 0xa0) sl@0: sl@0: { sl@0: sl@0: break; sl@0: sl@0: } sl@0: sl@0: __ASSERT_DEBUG(pointerToPreviousByte < pointerToLastByte, sl@0: sl@0: Panic(EPanicBadPointers18)); sl@0: sl@0: if (pointerToLastByte - pointerToPreviousByte < 2) sl@0: sl@0: { sl@0: sl@0: break; sl@0: sl@0: } sl@0: sl@0: ++pointerToPreviousByte; sl@0: sl@0: currentByte = *(pointerToPreviousByte + 1); sl@0: sl@0: if (currentByte < 0xa0) sl@0: sl@0: { sl@0: sl@0: return CCnvCharacterSetConverter::EErrorIllFormedInput; sl@0: sl@0: } sl@0: sl@0: __ASSERT_DEBUG(pointerToPreviousByte < pointerToLastByte, sl@0: sl@0: Panic(EPanicBadPointers19)); sl@0: sl@0: ++pointerToPreviousByte; sl@0: sl@0: __ASSERT_DEBUG(pointerToPreviousByte <= pointerToLastByte, sl@0: sl@0: Panic(EPanicBadPointers20)); sl@0: sl@0: if (pointerToPreviousByte >= pointerToLastByte) sl@0: sl@0: { sl@0: sl@0: break; sl@0: sl@0: } sl@0: sl@0: } sl@0: sl@0: return (pointerToPreviousByte + 1) - aDescriptor.Ptr(); sl@0: sl@0: } sl@0: sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // NumberOfBytesAbleToConvertToHalfWidthKatakana8 sl@0: sl@0: // Counts the bytes of be able to convert to half width Katakana sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // sl@0: sl@0: LOCAL_C TInt NumberOfBytesAbleToConvertToHalfWidthKatakana8(const TDesC8& aDescriptor) sl@0: sl@0: { sl@0: sl@0: const TUint8* pointerToPreviousByte = aDescriptor.Ptr() - 1; sl@0: sl@0: const TUint8* const pointerToLastByte = sl@0: sl@0: pointerToPreviousByte + aDescriptor.Length(); sl@0: sl@0: if (pointerToPreviousByte == pointerToLastByte) sl@0: sl@0: { sl@0: sl@0: return 0; sl@0: sl@0: } sl@0: sl@0: FOREVER sl@0: sl@0: { sl@0: sl@0: __ASSERT_DEBUG(pointerToPreviousByte < pointerToLastByte, sl@0: sl@0: Panic(EPanicBadPointers21)); sl@0: sl@0: TUint currentByte = *(pointerToPreviousByte + 1); sl@0: sl@0: if (currentByte != KSingleShift2) sl@0: sl@0: { sl@0: sl@0: break; sl@0: sl@0: } sl@0: sl@0: __ASSERT_DEBUG(pointerToPreviousByte < pointerToLastByte, sl@0: sl@0: Panic(EPanicBadPointers22)); sl@0: sl@0: if (pointerToLastByte - pointerToPreviousByte < 2) sl@0: sl@0: { sl@0: sl@0: break; sl@0: sl@0: } sl@0: sl@0: ++pointerToPreviousByte; sl@0: sl@0: currentByte = *(pointerToPreviousByte + 1); sl@0: sl@0: if (currentByte < 0xa0) sl@0: sl@0: { sl@0: sl@0: return CCnvCharacterSetConverter::EErrorIllFormedInput; sl@0: sl@0: } sl@0: sl@0: __ASSERT_DEBUG(pointerToPreviousByte < pointerToLastByte, sl@0: sl@0: Panic(EPanicBadPointers23)); sl@0: sl@0: ++pointerToPreviousByte; sl@0: sl@0: __ASSERT_DEBUG(pointerToPreviousByte <= pointerToLastByte, sl@0: sl@0: Panic(EPanicBadPointers24)); sl@0: sl@0: if (pointerToPreviousByte >= pointerToLastByte) sl@0: sl@0: { sl@0: sl@0: break; sl@0: sl@0: } sl@0: sl@0: } sl@0: sl@0: return (pointerToPreviousByte + 1) - aDescriptor.Ptr(); sl@0: sl@0: } sl@0: sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // NumberOfBytesAbleToConvertToJisX0212 sl@0: sl@0: // Counts the bytes of be able to convert to JIS sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // sl@0: sl@0: LOCAL_C TInt NumberOfBytesAbleToConvertToJisX0212(const TDesC8& aDescriptor) sl@0: sl@0: { sl@0: sl@0: const TUint8* pointerToPreviousByte = aDescriptor.Ptr() - 1; sl@0: sl@0: const TUint8* const pointerToLastByte = sl@0: sl@0: pointerToPreviousByte + aDescriptor.Length(); sl@0: sl@0: if (pointerToPreviousByte == pointerToLastByte) sl@0: sl@0: { sl@0: sl@0: return 0; sl@0: sl@0: } sl@0: sl@0: FOREVER sl@0: sl@0: { sl@0: sl@0: __ASSERT_DEBUG(pointerToPreviousByte < pointerToLastByte, sl@0: sl@0: Panic(EPanicBadPointers25)); sl@0: sl@0: TUint currentByte = *(pointerToPreviousByte + 1); sl@0: sl@0: if (currentByte != KSingleShift3) sl@0: sl@0: { sl@0: sl@0: break; sl@0: sl@0: } sl@0: sl@0: __ASSERT_DEBUG(pointerToPreviousByte < pointerToLastByte, sl@0: sl@0: Panic(EPanicBadPointers26)); sl@0: sl@0: if (pointerToLastByte - pointerToPreviousByte < 3) sl@0: sl@0: { sl@0: sl@0: break; sl@0: sl@0: } sl@0: sl@0: ++pointerToPreviousByte; sl@0: sl@0: currentByte = *(pointerToPreviousByte + 1); sl@0: sl@0: if (currentByte < 0xa0) sl@0: sl@0: { sl@0: sl@0: return CCnvCharacterSetConverter::EErrorIllFormedInput; sl@0: sl@0: } sl@0: sl@0: __ASSERT_DEBUG(pointerToPreviousByte < pointerToLastByte, sl@0: sl@0: Panic(EPanicBadPointers27)); sl@0: sl@0: ++pointerToPreviousByte; sl@0: sl@0: currentByte = *(pointerToPreviousByte + 1); sl@0: sl@0: if (currentByte < 0xa0) sl@0: sl@0: { sl@0: sl@0: return CCnvCharacterSetConverter::EErrorIllFormedInput; sl@0: sl@0: } sl@0: sl@0: __ASSERT_DEBUG(pointerToPreviousByte < pointerToLastByte, sl@0: sl@0: Panic(EPanicBadPointers28)); sl@0: sl@0: ++pointerToPreviousByte; sl@0: sl@0: __ASSERT_DEBUG(pointerToPreviousByte <= pointerToLastByte, sl@0: sl@0: Panic(EPanicBadPointers29)); sl@0: sl@0: if (pointerToPreviousByte >= pointerToLastByte) sl@0: sl@0: { sl@0: sl@0: break; sl@0: sl@0: } sl@0: sl@0: } sl@0: sl@0: return (pointerToPreviousByte + 1) - aDescriptor.Ptr(); sl@0: sl@0: } sl@0: sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // DummyConvertToIntermediateBufferInPlace sl@0: sl@0: // sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // sl@0: sl@0: LOCAL_C void DummyConvertToIntermediateBufferInPlace(TDes8&) sl@0: sl@0: { sl@0: sl@0: } sl@0: sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // ConvertToJisX0208FromEucJpPackedInPlace sl@0: sl@0: // Converts from EUC-JP to JIS code sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // sl@0: sl@0: LOCAL_C void ConvertToJisX0208FromEucJpPackedInPlace(TDes8& aDescriptor) sl@0: sl@0: { sl@0: sl@0: const TInt descriptorLength = aDescriptor.Length(); sl@0: sl@0: __ASSERT_DEBUG(descriptorLength > 0, Panic(EPanicNothingToConvert4)); sl@0: sl@0: __ASSERT_DEBUG(descriptorLength % 2 == 0, Panic(EPanicOddNumberOfBytes5)); sl@0: sl@0: TUint8* pointerToCurrentByte = CONST_CAST(TUint8*, aDescriptor.Ptr()); sl@0: sl@0: const TUint8* const pointerToLastByte = sl@0: sl@0: pointerToCurrentByte + (descriptorLength - 1); sl@0: sl@0: FOREVER sl@0: sl@0: { sl@0: sl@0: const TUint currentByte = *pointerToCurrentByte; sl@0: sl@0: __ASSERT_DEBUG(currentByte & 0x80, Panic(EPanicBadHighBit4)); sl@0: sl@0: *pointerToCurrentByte = STATIC_CAST(TUint8, currentByte & ~0x80); sl@0: sl@0: __ASSERT_DEBUG(pointerToCurrentByte <= pointerToLastByte, sl@0: sl@0: Panic(EPanicBadPointers30)); sl@0: sl@0: if (pointerToCurrentByte >= pointerToLastByte) sl@0: sl@0: { sl@0: sl@0: break; sl@0: sl@0: } sl@0: sl@0: ++pointerToCurrentByte; sl@0: sl@0: } sl@0: sl@0: } sl@0: sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // ConvertToHalfWidthKatakana8FromEucJpPackedInPlace sl@0: sl@0: // Converts from EUC-JP to half width Katakana sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // sl@0: sl@0: LOCAL_C void ConvertToHalfWidthKatakana8FromEucJpPackedInPlace( sl@0: sl@0: TDes8& aDescriptor) sl@0: sl@0: { sl@0: sl@0: const TInt descriptorLength = aDescriptor.Length(); sl@0: sl@0: __ASSERT_DEBUG(descriptorLength > 0, Panic(EPanicNothingToConvert5)); sl@0: sl@0: __ASSERT_DEBUG(descriptorLength % 2 == 0, Panic(EPanicOddNumberOfBytes6)); sl@0: sl@0: TUint8* pointerToTargetByte = CONST_CAST(TUint8*, aDescriptor.Ptr()); sl@0: sl@0: const TUint8* pointerToSourceByte = pointerToTargetByte; sl@0: sl@0: const TUint8* const pointerToLastByte = pointerToSourceByte + sl@0: sl@0: (descriptorLength - 1); sl@0: sl@0: FOREVER sl@0: sl@0: { sl@0: sl@0: __ASSERT_DEBUG(*pointerToSourceByte == KSingleShift2, sl@0: sl@0: Panic(EPanicSingleShift2Expected)); sl@0: sl@0: __ASSERT_DEBUG(pointerToSourceByte < pointerToLastByte, sl@0: sl@0: Panic(EPanicBadPointers31)); sl@0: sl@0: ++pointerToSourceByte; sl@0: sl@0: const TUint sourceByte = *pointerToSourceByte; sl@0: sl@0: __ASSERT_DEBUG(sourceByte & 0x80, Panic(EPanicBadHighBit5)); sl@0: sl@0: *pointerToTargetByte = STATIC_CAST(TUint8, sourceByte); sl@0: sl@0: __ASSERT_DEBUG(pointerToSourceByte <= pointerToLastByte, sl@0: sl@0: Panic(EPanicBadPointers32)); sl@0: sl@0: if (pointerToSourceByte >= pointerToLastByte) sl@0: sl@0: { sl@0: sl@0: break; sl@0: sl@0: } sl@0: sl@0: ++pointerToSourceByte; sl@0: sl@0: ++pointerToTargetByte; sl@0: sl@0: } sl@0: sl@0: aDescriptor.SetLength(descriptorLength / 2); sl@0: sl@0: } sl@0: sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // ConvertToJisX0212FromEucJpPackedInPlace sl@0: sl@0: // Converts from EUC-JP to JIS sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // sl@0: sl@0: LOCAL_C void ConvertToJisX0212FromEucJpPackedInPlace(TDes8& aDescriptor) sl@0: sl@0: { sl@0: sl@0: const TInt descriptorLength = aDescriptor.Length(); sl@0: sl@0: __ASSERT_DEBUG(descriptorLength > 0, Panic(EPanicNothingToConvert6)); sl@0: sl@0: __ASSERT_DEBUG(descriptorLength % 3 == 0, sl@0: sl@0: Panic(EPanicNumberOfBytesIsNotMultipleOfThree2)); sl@0: sl@0: TUint8* pointerToTargetByte = CONST_CAST(TUint8*, aDescriptor.Ptr()); sl@0: sl@0: const TUint8* pointerToSourceByte = pointerToTargetByte; sl@0: sl@0: const TUint8* const pointerToLastByte = sl@0: sl@0: pointerToSourceByte + (descriptorLength - 1); sl@0: sl@0: FOREVER sl@0: sl@0: { sl@0: sl@0: __ASSERT_DEBUG(*pointerToSourceByte == KSingleShift3, sl@0: sl@0: Panic(EPanicSingleShift3Expected)); sl@0: sl@0: __ASSERT_DEBUG(pointerToSourceByte < pointerToLastByte, sl@0: sl@0: Panic(EPanicBadPointers33)); sl@0: sl@0: ++pointerToSourceByte; sl@0: sl@0: TUint sourceByte = *pointerToSourceByte; sl@0: sl@0: __ASSERT_DEBUG(sourceByte & 0x80, Panic(EPanicBadHighBit6)); sl@0: sl@0: *pointerToTargetByte = STATIC_CAST(TUint8, sourceByte & ~0x80); sl@0: sl@0: __ASSERT_DEBUG(pointerToSourceByte= pointerToLastByte) sl@0: sl@0: { sl@0: sl@0: break; sl@0: sl@0: } sl@0: sl@0: ++pointerToSourceByte; sl@0: sl@0: ++pointerToTargetByte; sl@0: sl@0: } sl@0: sl@0: aDescriptor.SetLength((descriptorLength / 3) * 2); sl@0: sl@0: } sl@0: sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // NumberOfBytesAbleToConvertToPictograph sl@0: sl@0: // sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // sl@0: sl@0: LOCAL_C TInt NumberOfBytesAbleToConvertToPictograph1(const TDesC8& aDescriptor) sl@0: sl@0: { sl@0: sl@0: const TUint8* pointerToPreviousByte = aDescriptor.Ptr() - 1; sl@0: sl@0: const TUint8* const pointerToLastByte = sl@0: sl@0: pointerToPreviousByte + aDescriptor.Length(); sl@0: sl@0: if (pointerToPreviousByte == pointerToLastByte) sl@0: sl@0: { sl@0: sl@0: return 0; sl@0: sl@0: } sl@0: sl@0: for (;pointerToPreviousByte < pointerToLastByte;) sl@0: sl@0: { sl@0: sl@0: __ASSERT_DEBUG(pointerToPreviousByte < pointerToLastByte, sl@0: sl@0: Panic(EPanicBadPointers14)); sl@0: sl@0: TUint currentByte = *(pointerToPreviousByte + 1); sl@0: sl@0: const TUint nextByte = *(pointerToPreviousByte + 2); sl@0: sl@0: if (((currentByte < KFirstByteRangeFirstBlockStart) || sl@0: sl@0: (currentByte > KFirstByteRangeFirstBlockEnd)) || sl@0: sl@0: ((nextByte < KSecondByteRangeSecondBlockStart) || sl@0: sl@0: (nextByte > KSecondByteRangeSecondBlockEnd))) sl@0: sl@0: { sl@0: sl@0: break; sl@0: sl@0: } sl@0: sl@0: __ASSERT_DEBUG(pointerToPreviousByte < pointerToLastByte, sl@0: sl@0: Panic(EPanicBadPointers15)); sl@0: sl@0: pointerToPreviousByte += 2; sl@0: sl@0: } sl@0: sl@0: return (pointerToPreviousByte + 1) - aDescriptor.Ptr(); sl@0: sl@0: } sl@0: sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // NumberOfBytesAbleToConvertToPictograph sl@0: sl@0: // sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // sl@0: sl@0: LOCAL_C TInt NumberOfBytesAbleToConvertToPictograph2(const TDesC8& aDescriptor) sl@0: sl@0: { sl@0: sl@0: const TUint8* pointerToPreviousByte = aDescriptor.Ptr() - 1; sl@0: sl@0: const TUint8* const pointerToLastByte = sl@0: sl@0: pointerToPreviousByte + aDescriptor.Length(); sl@0: sl@0: if (pointerToPreviousByte == pointerToLastByte) sl@0: sl@0: { sl@0: sl@0: return 0; sl@0: sl@0: } sl@0: sl@0: for (;pointerToPreviousByte < pointerToLastByte;) sl@0: sl@0: { sl@0: sl@0: __ASSERT_DEBUG(pointerToPreviousByte < pointerToLastByte, sl@0: sl@0: Panic(EPanicBadPointers14)); sl@0: sl@0: TUint currentByte = *(pointerToPreviousByte + 1); sl@0: sl@0: if (currentByte == KSingleShift3) sl@0: sl@0: { sl@0: sl@0: pointerToPreviousByte++; sl@0: sl@0: currentByte = *(pointerToPreviousByte + 1); sl@0: sl@0: } sl@0: sl@0: else sl@0: sl@0: { sl@0: sl@0: break; sl@0: sl@0: } sl@0: sl@0: if (currentByte < 0xa0) sl@0: sl@0: { sl@0: sl@0: return CCnvCharacterSetConverter::EErrorIllFormedInput; sl@0: sl@0: } sl@0: sl@0: const TUint nextByte = *(pointerToPreviousByte + 2); sl@0: sl@0: if (nextByte < 0xa0) sl@0: sl@0: { sl@0: sl@0: return CCnvCharacterSetConverter::EErrorIllFormedInput; sl@0: sl@0: } sl@0: sl@0: if (((currentByte < KFirstByteRangeFirstBlockStart) || sl@0: sl@0: (currentByte > KFirstByteRangeFirstBlockEnd)) || sl@0: sl@0: ((nextByte < KSecondByteRangeSecondBlockStart) || sl@0: sl@0: (nextByte > KSecondByteRangeSecondBlockEnd))) sl@0: sl@0: { sl@0: sl@0: // return the previous byte to the beginning of loop. sl@0: sl@0: pointerToPreviousByte--; sl@0: sl@0: break; sl@0: sl@0: } sl@0: sl@0: __ASSERT_DEBUG(pointerToPreviousByte < pointerToLastByte, sl@0: sl@0: Panic(EPanicBadPointers15)); sl@0: sl@0: pointerToPreviousByte += 2; sl@0: sl@0: } sl@0: sl@0: return (pointerToPreviousByte + 1) - aDescriptor.Ptr(); sl@0: sl@0: } sl@0: sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // ConvertFromPictogaphToEucJpDirectmapInPlace sl@0: sl@0: // Converts from EucJp packed Pictograph to Unicode sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // sl@0: sl@0: LOCAL_C void ConvertFromPictogaphToEucJpDirectmapInPlace( sl@0: sl@0: TInt aStartPositionInDescriptor, TDes8& aDescriptor, sl@0: sl@0: TInt& aNumberOfCharactersThatDroppedOut) sl@0: sl@0: { sl@0: sl@0: TInt descriptorLength=aDescriptor.Length(); sl@0: sl@0: __ASSERT_DEBUG(descriptorLength > aStartPositionInDescriptor, sl@0: sl@0: Panic(EPanicNothingToConvert3)); sl@0: sl@0: __ASSERT_DEBUG((descriptorLength - aStartPositionInDescriptor) % 2 == 0, sl@0: sl@0: Panic(EPanicOddNumberOfBytes3)); sl@0: sl@0: TInt bytesPerCharacter = 2; sl@0: sl@0: if (aDescriptor[0] >= KEUCJPSecondBlockStart) sl@0: sl@0: { sl@0: sl@0: bytesPerCharacter = 3; sl@0: sl@0: } sl@0: sl@0: sl@0: sl@0: aNumberOfCharactersThatDroppedOut = sl@0: sl@0: Max(0, ((descriptorLength - aStartPositionInDescriptor) / 2) - sl@0: sl@0: ((aDescriptor.MaxLength() - aStartPositionInDescriptor) / sl@0: sl@0: bytesPerCharacter)); sl@0: sl@0: descriptorLength -= aNumberOfCharactersThatDroppedOut * 2; sl@0: sl@0: __ASSERT_DEBUG(descriptorLength >= aStartPositionInDescriptor, sl@0: sl@0: Panic(EPanicBadCalculation2)); sl@0: sl@0: if (descriptorLength <= aStartPositionInDescriptor) sl@0: sl@0: { sl@0: sl@0: aDescriptor.SetLength(descriptorLength); sl@0: sl@0: } sl@0: sl@0: else sl@0: sl@0: { sl@0: sl@0: __ASSERT_DEBUG((descriptorLength - aStartPositionInDescriptor) % 2 == 0, sl@0: sl@0: Panic(EPanicOddNumberOfBytes4)); sl@0: sl@0: // pointerToTargetByte is initialized properly when descriptorLength sl@0: sl@0: // has been offset to the actual final length of aDescriptor sl@0: sl@0: TUint8* pointerToTargetByte = CONST_CAST(TUint8*, aDescriptor.Ptr()); sl@0: sl@0: const TUint8* const pointerToFirstByte = sl@0: sl@0: pointerToTargetByte + aStartPositionInDescriptor; sl@0: sl@0: const TUint8* pointerToSourceByte = sl@0: sl@0: pointerToTargetByte + (descriptorLength - 1); sl@0: sl@0: descriptorLength = (((descriptorLength - aStartPositionInDescriptor) sl@0: sl@0: * bytesPerCharacter) / 2) + aStartPositionInDescriptor; sl@0: sl@0: __ASSERT_DEBUG((descriptorLength - aStartPositionInDescriptor) % sl@0: sl@0: bytesPerCharacter == 0, Panic(EPanicNumberOfBytesIsNotMultipleOfThree1)); sl@0: sl@0: aDescriptor.SetLength(descriptorLength); sl@0: sl@0: // pointerToTargetByte is is initialized properly here sl@0: sl@0: pointerToTargetByte += descriptorLength - 1; sl@0: sl@0: for (;pointerToTargetByte > pointerToFirstByte; ) sl@0: sl@0: { sl@0: sl@0: TInt secondByte = *pointerToSourceByte; sl@0: sl@0: TInt firstByte = *(pointerToSourceByte - 1); sl@0: sl@0: sl@0: sl@0: if (bytesPerCharacter == 3) sl@0: sl@0: { sl@0: sl@0: firstByte = (firstByte - KEUCJPSecondBlockStart) * 2 + sl@0: sl@0: KFirstByteRangeFirstBlockStart; sl@0: sl@0: } sl@0: sl@0: else sl@0: sl@0: { sl@0: sl@0: firstByte = (firstByte - KPictographStartFirstByte) * 2 + sl@0: sl@0: KFirstByteRangeFirstBlockStart; sl@0: sl@0: } sl@0: sl@0: if (static_cast(KEUCJPBlockSize + KPictographStartSecondByte + 1) sl@0: sl@0: < secondByte) sl@0: sl@0: { sl@0: sl@0: if (secondByte > KShiftJisTrailByteIllegal) sl@0: sl@0: secondByte -= 1; sl@0: sl@0: secondByte = secondByte -(KPictographStartSecondByte + sl@0: sl@0: KEUCJPBlockSize + 1) + KSecondByteRangeSecondBlockStart; sl@0: sl@0: firstByte++; sl@0: sl@0: } sl@0: sl@0: else sl@0: sl@0: { sl@0: sl@0: if (secondByte > KShiftJisTrailByteIllegal) sl@0: sl@0: secondByte -= 1; sl@0: sl@0: secondByte += KSecondByteRangeSecondBlockStart - KPictographStartSecondByte; sl@0: sl@0: } sl@0: sl@0: *pointerToTargetByte = static_cast(secondByte); sl@0: sl@0: --pointerToTargetByte; sl@0: sl@0: *pointerToTargetByte = static_cast(firstByte); sl@0: sl@0: if (bytesPerCharacter == 3) sl@0: sl@0: { sl@0: sl@0: --pointerToTargetByte; sl@0: sl@0: *pointerToTargetByte = KSingleShift3; sl@0: sl@0: } sl@0: sl@0: __ASSERT_DEBUG(pointerToTargetByte >= pointerToFirstByte, sl@0: sl@0: Panic(EPanicBadPointers10)); sl@0: sl@0: --pointerToTargetByte; sl@0: sl@0: pointerToSourceByte -= 2; sl@0: sl@0: } sl@0: sl@0: } sl@0: sl@0: } sl@0: sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // ConvertToPictographFromEucJpPackedInPlace1 sl@0: sl@0: // Converts from EucJp packed Pictograph to Unicode sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // sl@0: sl@0: LOCAL_C void ConvertToPictographFromEucJpPackedInPlace(TDes8& aDescriptor) sl@0: sl@0: { sl@0: sl@0: const TInt descriptorLength = aDescriptor.Length(); sl@0: sl@0: __ASSERT_DEBUG(descriptorLength > 0, Panic(EPanicNothingToConvert6)); sl@0: sl@0: TUint8* pointerToTargetByte = CONST_CAST(TUint8*, aDescriptor.Ptr()); sl@0: sl@0: const TUint8* pointerToSourceByte = pointerToTargetByte; sl@0: sl@0: const TUint8* const pointerToLastByte = sl@0: sl@0: pointerToSourceByte + (descriptorLength - 1); sl@0: sl@0: TInt bytesPerCharacter = 2; sl@0: sl@0: TInt sjisStartbyte = KPictographStartFirstByte; sl@0: sl@0: if (*pointerToSourceByte == KSingleShift3) sl@0: sl@0: { sl@0: sl@0: ++pointerToSourceByte; sl@0: sl@0: bytesPerCharacter = 3; sl@0: sl@0: sjisStartbyte = KEUCJPSecondBlockStart; sl@0: sl@0: } sl@0: sl@0: for (;pointerToSourceByte < pointerToLastByte; ) sl@0: sl@0: { sl@0: sl@0: __ASSERT_DEBUG(pointerToSourceByte < pointerToLastByte, sl@0: sl@0: Panic(EPanicBadPointers33)); sl@0: sl@0: TUint firstByte = (*pointerToSourceByte sl@0: sl@0: - KFirstByteRangeFirstBlockStart) / 2 + sjisStartbyte; sl@0: sl@0: TUint secondByte = *(pointerToSourceByte + 1); sl@0: sl@0: if ((*pointerToSourceByte % 2) == 0) sl@0: sl@0: { sl@0: sl@0: secondByte += KPictographStartSecondByte - sl@0: sl@0: KSecondByteRangeSecondBlockStart + KEUCJPBlockSize + 1; sl@0: sl@0: if (secondByte >= KShiftJisTrailByteIllegal) sl@0: sl@0: secondByte++; sl@0: sl@0: } sl@0: sl@0: else sl@0: sl@0: { sl@0: sl@0: secondByte += KPictographStartSecondByte - KSecondByteRangeSecondBlockStart; sl@0: sl@0: if (secondByte >= KShiftJisTrailByteIllegal) sl@0: sl@0: secondByte++; sl@0: sl@0: } sl@0: sl@0: *pointerToTargetByte = static_cast(firstByte); sl@0: sl@0: sl@0: sl@0: __ASSERT_DEBUG(pointerToTargetByte < pointerToLastByte, sl@0: sl@0: Panic(EPanicBadPointers35)); sl@0: sl@0: ++pointerToTargetByte; sl@0: sl@0: *pointerToTargetByte = static_cast(secondByte); sl@0: sl@0: __ASSERT_DEBUG(pointerToSourceByte <= pointerToLastByte, sl@0: sl@0: Panic(EPanicBadPointers36)); sl@0: sl@0: pointerToSourceByte += 2; sl@0: sl@0: ++pointerToTargetByte; sl@0: sl@0: } sl@0: sl@0: aDescriptor.SetLength((descriptorLength / bytesPerCharacter) * 2); sl@0: sl@0: } sl@0: sl@0: sl@0: sl@0: // New Interface class sl@0: sl@0: class CEucJpDirectmapImplementation : public CCharacterSetConverterPluginInterface sl@0: sl@0: { sl@0: sl@0: public: sl@0: sl@0: virtual const TDesC8& ReplacementForUnconvertibleUnicodeCharacters(); sl@0: sl@0: sl@0: sl@0: virtual TInt ConvertFromUnicode( sl@0: sl@0: CCnvCharacterSetConverter::TEndianness aDefaultEndiannessOfForeignCharacters, sl@0: sl@0: const TDesC8& aReplacementForUnconvertibleUnicodeCharacters, sl@0: sl@0: TDes8& aForeign, sl@0: sl@0: const TDesC16& aUnicode, sl@0: sl@0: CCnvCharacterSetConverter::TArrayOfAscendingIndices& aIndicesOfUnconvertibleCharacters ); sl@0: sl@0: sl@0: sl@0: virtual TInt ConvertToUnicode( sl@0: sl@0: CCnvCharacterSetConverter::TEndianness aDefaultEndiannessOfForeignCharacters, sl@0: sl@0: TDes16& aUnicode, sl@0: sl@0: const TDesC8& aForeign, sl@0: sl@0: TInt&, sl@0: sl@0: TInt& aNumberOfUnconvertibleCharacters, sl@0: sl@0: TInt& aIndexOfFirstByteOfFirstUnconvertibleCharacter ); sl@0: sl@0: sl@0: sl@0: virtual TBool IsInThisCharacterSetL( sl@0: sl@0: TBool& aSetToTrue, sl@0: sl@0: TInt& aConfidenceLevel, sl@0: sl@0: const TDesC8& ); sl@0: sl@0: sl@0: sl@0: static CEucJpDirectmapImplementation* NewL(); sl@0: sl@0: sl@0: sl@0: virtual ~CEucJpDirectmapImplementation(); sl@0: sl@0: private: sl@0: sl@0: CEucJpDirectmapImplementation(); sl@0: sl@0: }; sl@0: sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // ReplacementForUnconvertibleUnicodeCharacters sl@0: sl@0: // Retruns the character to replacement for unconvertible unicode character. sl@0: sl@0: // Returns: '?': sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // sl@0: sl@0: const TDesC8& CEucJpDirectmapImplementation::ReplacementForUnconvertibleUnicodeCharacters() sl@0: sl@0: { sl@0: sl@0: return KLit8EucJpPackedReplacementForUnconvertibleUnicodeCharacters; sl@0: sl@0: } sl@0: sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // ConvertFromUnicode sl@0: sl@0: // Converts from Unicode to EUC-JP sl@0: sl@0: // Returns: The number of unconverted characters sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // sl@0: sl@0: TInt CEucJpDirectmapImplementation::ConvertFromUnicode( sl@0: sl@0: CCnvCharacterSetConverter::TEndianness aDefaultEndiannessOfForeignCharacters, sl@0: sl@0: const TDesC8& aReplacementForUnconvertibleUnicodeCharacters, sl@0: sl@0: TDes8& aForeign, const TDesC16& aUnicode, sl@0: sl@0: CCnvCharacterSetConverter::TArrayOfAscendingIndices& aIndicesOfUnconvertibleCharacters) sl@0: sl@0: { sl@0: sl@0: TFixedArray characterSets; sl@0: sl@0: characterSets[0].iConversionData = &CnvJisRoman::ConversionData(); sl@0: sl@0: characterSets[0].iConvertFromIntermediateBufferInPlace = sl@0: sl@0: DummyConvertFromIntermediateBufferInPlace; sl@0: sl@0: characterSets[0].iEscapeSequence = &KNullDesC8; sl@0: sl@0: characterSets[1].iConversionData = &CnvJisX0208::ConversionData(); sl@0: sl@0: characterSets[1].iConvertFromIntermediateBufferInPlace = sl@0: sl@0: ConvertFromJisX0208ToEucJpPackedInPlace; sl@0: sl@0: characterSets[1].iEscapeSequence = &KNullDesC8; sl@0: sl@0: characterSets[2].iConversionData = &CnvHalfWidthKatakana8::ConversionData(); sl@0: sl@0: characterSets[2].iConvertFromIntermediateBufferInPlace = sl@0: sl@0: ConvertFromHalfWidthKatakana8ToEucJpPackedInPlace; sl@0: sl@0: characterSets[2].iEscapeSequence = &KNullDesC8; sl@0: sl@0: characterSets[3].iConversionData = &CnvJisX0212::ConversionData(); sl@0: sl@0: characterSets[3].iConvertFromIntermediateBufferInPlace = sl@0: sl@0: ConvertFromJisX0212ToEucJpPackedInPlace; sl@0: sl@0: characterSets[3].iEscapeSequence = &KNullDesC8; sl@0: sl@0: characterSets[4].iConversionData = &CnvShiftJisDirectmap::ConversionData(); sl@0: sl@0: characterSets[4].iConvertFromIntermediateBufferInPlace = sl@0: sl@0: ConvertFromPictogaphToEucJpDirectmapInPlace; sl@0: sl@0: characterSets[4].iEscapeSequence = &KNullDesC8; sl@0: sl@0: characterSets[5].iConversionData = &CnvShiftJisDirectmap::ConversionData(); sl@0: sl@0: characterSets[5].iConvertFromIntermediateBufferInPlace = sl@0: sl@0: ConvertFromPictogaphToEucJpDirectmapInPlace; sl@0: sl@0: characterSets[5].iEscapeSequence = &KNullDesC8; sl@0: sl@0: sl@0: sl@0: TInt unconvert = CnvUtilities::ConvertFromUnicode( sl@0: sl@0: aDefaultEndiannessOfForeignCharacters, sl@0: sl@0: aReplacementForUnconvertibleUnicodeCharacters, sl@0: sl@0: aForeign, aUnicode, aIndicesOfUnconvertibleCharacters, sl@0: sl@0: characterSets.Array()); sl@0: sl@0: sl@0: sl@0: return unconvert; sl@0: sl@0: } sl@0: sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // ConvertToUnicode sl@0: sl@0: // Converts from EUC-JP to Unicode. sl@0: sl@0: // Returns: The number of unconverted bytes sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // sl@0: sl@0: TInt CEucJpDirectmapImplementation::ConvertToUnicode( sl@0: sl@0: CCnvCharacterSetConverter::TEndianness aDefaultEndiannessOfForeignCharacters, sl@0: sl@0: TDes16& aUnicode, const TDesC8& aForeign, TInt&, sl@0: sl@0: TInt& aNumberOfUnconvertibleCharacters, sl@0: sl@0: TInt& aIndexOfFirstByteOfFirstUnconvertibleCharacter) sl@0: sl@0: { sl@0: sl@0: TFixedArray methods; sl@0: sl@0: sl@0: sl@0: methods[0].iNumberOfBytesAbleToConvert = sl@0: sl@0: NumberOfBytesAbleToConvertToPictograph1; sl@0: sl@0: methods[0].iConvertToIntermediateBufferInPlace = sl@0: sl@0: ConvertToPictographFromEucJpPackedInPlace; sl@0: sl@0: methods[0].iConversionData = &CnvShiftJisDirectmap::ConversionData(); sl@0: sl@0: methods[0].iNumberOfBytesPerCharacter = 2; sl@0: sl@0: methods[0].iNumberOfCoreBytesPerCharacter = 2; sl@0: sl@0: methods[1].iNumberOfBytesAbleToConvert = sl@0: sl@0: NumberOfBytesAbleToConvertToPictograph2; sl@0: sl@0: methods[1].iConvertToIntermediateBufferInPlace = sl@0: sl@0: ConvertToPictographFromEucJpPackedInPlace; sl@0: sl@0: methods[1].iConversionData = &CnvShiftJisDirectmap::ConversionData(); sl@0: sl@0: methods[1].iNumberOfBytesPerCharacter = 3; sl@0: sl@0: methods[1].iNumberOfCoreBytesPerCharacter = 2; sl@0: sl@0: sl@0: sl@0: methods[2].iNumberOfBytesAbleToConvert = NumberOfBytesAbleToConvertToJisRoman; sl@0: sl@0: methods[2].iConvertToIntermediateBufferInPlace = sl@0: sl@0: DummyConvertToIntermediateBufferInPlace; sl@0: sl@0: methods[2].iConversionData = &CnvJisRoman::ConversionData(); sl@0: sl@0: methods[2].iNumberOfBytesPerCharacter = 1; sl@0: sl@0: methods[2].iNumberOfCoreBytesPerCharacter = 1; sl@0: sl@0: methods[3].iNumberOfBytesAbleToConvert = NumberOfBytesAbleToConvertToJisX0208; sl@0: sl@0: methods[3].iConvertToIntermediateBufferInPlace = sl@0: sl@0: ConvertToJisX0208FromEucJpPackedInPlace; sl@0: sl@0: methods[3].iConversionData = &CnvJisX0208::ConversionData(); sl@0: sl@0: methods[3].iNumberOfBytesPerCharacter = 2; sl@0: sl@0: methods[3].iNumberOfCoreBytesPerCharacter = 2; sl@0: sl@0: methods[4].iNumberOfBytesAbleToConvert = sl@0: sl@0: NumberOfBytesAbleToConvertToHalfWidthKatakana8; sl@0: sl@0: methods[4].iConvertToIntermediateBufferInPlace = sl@0: sl@0: ConvertToHalfWidthKatakana8FromEucJpPackedInPlace; sl@0: sl@0: methods[4].iConversionData = &CnvHalfWidthKatakana8::ConversionData(); sl@0: sl@0: methods[4].iNumberOfBytesPerCharacter = 2; sl@0: sl@0: methods[4].iNumberOfCoreBytesPerCharacter = 1; sl@0: sl@0: methods[5].iNumberOfBytesAbleToConvert = sl@0: sl@0: NumberOfBytesAbleToConvertToJisX0212; sl@0: sl@0: methods[5].iConvertToIntermediateBufferInPlace = sl@0: sl@0: ConvertToJisX0212FromEucJpPackedInPlace; sl@0: sl@0: methods[5].iConversionData = &CnvJisX0212::ConversionData(); sl@0: sl@0: methods[5].iNumberOfBytesPerCharacter = 3; sl@0: sl@0: methods[5].iNumberOfCoreBytesPerCharacter = 2; sl@0: sl@0: sl@0: sl@0: TInt unconvert = CnvUtilities::ConvertToUnicodeFromHeterogeneousForeign( sl@0: sl@0: aDefaultEndiannessOfForeignCharacters, aUnicode, aForeign, sl@0: sl@0: aNumberOfUnconvertibleCharacters, sl@0: sl@0: aIndexOfFirstByteOfFirstUnconvertibleCharacter, methods.Array()); sl@0: sl@0: sl@0: sl@0: // The following is specific impelementation for brower. sl@0: sl@0: // If brower app calls this API, the yen sign code(0xA5) sl@0: sl@0: // must be converted to backslash code(0x5C). sl@0: sl@0: // Becasue Javascript supports backslash code ony. sl@0: sl@0: TBool browserProcess = (RProcess().SecureId().iId == KBrowserSecureId); sl@0: sl@0: if (browserProcess && aUnicode.Length() > 0) sl@0: sl@0: { sl@0: sl@0: const TUint16* pB = aUnicode.Ptr(); sl@0: sl@0: const TUint16* pbase = pB; sl@0: sl@0: const TUint16* pE = pB + aUnicode.Length() -1; sl@0: sl@0: while (pE>=pbase) sl@0: sl@0: { sl@0: sl@0: if (*pbase == KCharacterCodeForYenSign) sl@0: sl@0: { sl@0: sl@0: aUnicode[pbase - pB] = KCharacterCodeForBackSlash; sl@0: sl@0: } sl@0: sl@0: pbase++; sl@0: sl@0: } sl@0: sl@0: } sl@0: sl@0: sl@0: sl@0: return unconvert; sl@0: sl@0: } sl@0: sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // IsInThisCharacterSetL sl@0: sl@0: // Detects whether the text is the character code or not. sl@0: sl@0: // Returns: ETrue: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: sl@0: // sl@0: sl@0: TBool CEucJpDirectmapImplementation::IsInThisCharacterSetL(TBool& /*aSetToTrue*/, TInt& /*aConfidenceLevel*/, sl@0: sl@0: const TDesC8& /*aSample*/) sl@0: sl@0: { sl@0: sl@0: return EFalse; sl@0: sl@0: } sl@0: sl@0: sl@0: sl@0: CEucJpDirectmapImplementation* CEucJpDirectmapImplementation::NewL() sl@0: sl@0: { sl@0: sl@0: CEucJpDirectmapImplementation* self = new(ELeave) CEucJpDirectmapImplementation; sl@0: sl@0: return self; sl@0: sl@0: } sl@0: sl@0: sl@0: sl@0: CEucJpDirectmapImplementation::CEucJpDirectmapImplementation() sl@0: sl@0: { sl@0: sl@0: //default constructor.. do nothing sl@0: sl@0: } sl@0: sl@0: sl@0: sl@0: CEucJpDirectmapImplementation::~CEucJpDirectmapImplementation() sl@0: sl@0: { sl@0: sl@0: //default destructor .. do nothing sl@0: sl@0: } sl@0: sl@0: sl@0: sl@0: // ECOM CREATION FUNCTION sl@0: sl@0: const TImplementationProxy ImplementationTable[] = sl@0: sl@0: { sl@0: sl@0: // Note: This is the same UID as defined in old mmp-file sl@0: sl@0: // Used also in 12221212.rss ( implementation_uid ) sl@0: sl@0: IMPLEMENTATION_PROXY_ENTRY( 0x101F86A6, CEucJpDirectmapImplementation::NewL ) sl@0: sl@0: }; sl@0: sl@0: sl@0: sl@0: EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount ) sl@0: sl@0: { sl@0: sl@0: aTableCount = sizeof( ImplementationTable ) / sizeof(TImplementationProxy); sl@0: sl@0: return ImplementationTable; sl@0: sl@0: } sl@0: sl@0: sl@0: sl@0: // End of file sl@0: