sl@0: /* sl@0: * Copyright (c) 2022 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 module is a plug-in module for Shift-JIS with Pictograph. sl@0: * Basicaly, Vodafone Pictograph is encoded by ISO2022, sl@0: * but Japanese FEP needs a pictograph as one character code sl@0: * in Shift-JIS character code set. sl@0: * sl@0: */ sl@0: sl@0: sl@0: sl@0: sl@0: sl@0: sl@0: // INCLUDE FILES sl@0: #include "CnvShiftJisDirectmap.h" sl@0: #include sl@0: #include sl@0: #include "jisx0201.h" sl@0: #include "jisx0208.h" sl@0: #include sl@0: sl@0: #ifdef EKA2 sl@0: #include sl@0: #include sl@0: #include "charactersetconverter.h" sl@0: #endif // EKA2 sl@0: sl@0: const TUint KSingleByteRangeFirstBlockEnd = 0x7f; sl@0: const TUint KSingleByteRangeSecondBlockStart = 0xa1; sl@0: const TUint KSingleByteRangeSecondBlockEnd = 0xdf; sl@0: const TUint KFirstByteRangeFirstBlockStart = 0x81; sl@0: const TUint KFirstByteRangeFirstBlockEnd = 0x9f; sl@0: const TUint KFirstByteRangeFirstBlockLength = (KFirstByteRangeFirstBlockEnd+1)-KFirstByteRangeFirstBlockStart; sl@0: const TUint KFirstByteRangeSecondBlockStart = 0xe0; sl@0: const TUint KFirstByteRangeSecondBlockEnd = 0xfc; sl@0: const TUint KSecondByteRangeFirstBlockStart = 0x40; sl@0: const TUint KSecondByteRangeFirstBlockEnd = 0x7e; sl@0: const TUint KSecondByteRangeFirstBlockLength = (KSecondByteRangeFirstBlockEnd+1)-KSecondByteRangeFirstBlockStart; sl@0: const TUint KSecondByteRangeSecondBlockStart = 0x80; sl@0: const TUint KSecondByteRangeSecondBlockEnd = 0xfc; sl@0: sl@0: const TUint KPictoFirstByteStart = 0xF0; sl@0: const TUint KPictoFirstByteEnd = 0xF9; sl@0: const TUint KPictoSecondByteStart = 0x40; sl@0: //const TUint KPictoSecondByteEnd = 0xFB; sl@0: const TUint KPictoSecondByteEnd = 0xFC; sl@0: sl@0: // SecureID for Brower app sl@0: const TUint32 KBrowserSecureId = 0x10008D39; sl@0: // Define for converting from YenSign to BackSlash sl@0: const TUint KCharacterCodeForYenSign = 0x00A5; sl@0: const TUint KCharacterCodeForBackSlash = 0x005C; sl@0: sl@0: #ifdef _DEBUG sl@0: sl@0: _LIT(KLitPanicText, "SHIFTJIS_FORFEP"); sl@0: sl@0: enum TPanic sl@0: { sl@0: EPanicIndexOverflow1=1, sl@0: EPanicIndexOverflow2, sl@0: EPanicNothingToConvert1, sl@0: EPanicNothingToConvert2, sl@0: EPanicOddNumberOfBytes1, sl@0: EPanicOddNumberOfBytes2, sl@0: EPanicBadPointers1, sl@0: EPanicBadPointers2, sl@0: EPanicBadPointers3, sl@0: EPanicBadPointers4, sl@0: EPanicBadPointers5, sl@0: EPanicBadPointers6, sl@0: EPanicBadPointers7, sl@0: EPanicBadPointers8, sl@0: EPanicBadPointers9 sl@0: }; sl@0: sl@0: // ============================= LOCAL FUNCTIONS =============================== sl@0: // ----------------------------------------------------------------------------- sl@0: // Panic ?description. sl@0: // ?description sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: LOCAL_C void Panic(TPanic aPanic) sl@0: { sl@0: User::Panic(KLitPanicText, aPanic); sl@0: } sl@0: #endif sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // DummyConvertFromIntermediateBufferInPlace ?description. sl@0: // ?description sl@0: // Returns: ?value_1: ?description sl@0: // ?value_n: ?description_line1 sl@0: // ?description_line2 sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void DummyConvertFromIntermediateBufferInPlace(TInt, TDes8&, TInt& aNumberOfCharactersThatDroppedOut) sl@0: { sl@0: aNumberOfCharactersThatDroppedOut = 0; sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // ConvertFromJisX0208ToShiftJisInPlace ?description. sl@0: // ?description sl@0: // Returns: ?value_1: ?description sl@0: // ?value_n: ?description_line1 sl@0: // ?description_line2 sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void ConvertFromJisX0208ToShiftJisInPlace(TInt aStartPositionInDescriptor, TDes8& aDescriptor, TInt& aNumberOfCharactersThatDroppedOut) sl@0: { sl@0: aNumberOfCharactersThatDroppedOut=0; sl@0: const TInt descriptorLength=aDescriptor.Length(); sl@0: __ASSERT_DEBUG(descriptorLength>aStartPositionInDescriptor, Panic(EPanicNothingToConvert1)); sl@0: __ASSERT_DEBUG((descriptorLength-aStartPositionInDescriptor)%2==0, Panic(EPanicOddNumberOfBytes1)); sl@0: TUint8* pointerToCurrentByte=CONST_CAST(TUint8*, aDescriptor.Ptr()); sl@0: const TUint8* const pointerToLastByte=pointerToCurrentByte+(descriptorLength-1); sl@0: pointerToCurrentByte+=aStartPositionInDescriptor; sl@0: FOREVER sl@0: { sl@0: TUint firstByte=*pointerToCurrentByte-0x21; sl@0: TUint secondByte=*(pointerToCurrentByte+1)-0x21; sl@0: if (firstByte%2!=0) sl@0: { sl@0: secondByte+=94; sl@0: } sl@0: firstByte/=2; sl@0: if (firstByte=pointerToLastByte) sl@0: { sl@0: break; sl@0: } sl@0: ++pointerToCurrentByte; sl@0: } sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // NumberOfBytesAbleToConvertToJisX0201 ?description. sl@0: // ?description sl@0: // Returns: ?value_1: ?description sl@0: // ?value_n: ?description_line1 sl@0: // ?description_line2 sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TInt NumberOfBytesAbleToConvertToJisX0201(const TDesC8& aDescriptor) sl@0: { sl@0: const TUint8* pointerToPreviousByte=aDescriptor.Ptr()-1; sl@0: const TUint8* const pointerToLastByte=pointerToPreviousByte+aDescriptor.Length(); sl@0: if (pointerToPreviousByte==pointerToLastByte) sl@0: { sl@0: return 0; sl@0: } sl@0: FOREVER sl@0: { sl@0: __ASSERT_DEBUG(pointerToPreviousByte KSingleByteRangeFirstBlockEnd) sl@0: && (currentByte < KSingleByteRangeSecondBlockStart)) || sl@0: (currentByte > KSingleByteRangeSecondBlockEnd)) sl@0: { sl@0: break; sl@0: } sl@0: __ASSERT_DEBUG(pointerToPreviousByte=pointerToLastByte) sl@0: { sl@0: break; sl@0: } sl@0: } sl@0: return (pointerToPreviousByte+1)-aDescriptor.Ptr(); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // NumberOfBytesAbleToConvertToJisX0208 ?description. sl@0: // ?description sl@0: // Returns: ?value_1: ?description sl@0: // ?value_n: ?description_line1 sl@0: // ?description_line2 sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TInt NumberOfBytesAbleToConvertToJisX0208(const TDesC8& aDescriptor) sl@0: { sl@0: const TUint8* pointerToPreviousByte=aDescriptor.Ptr()-1; sl@0: const TUint8* const pointerToLastByte=pointerToPreviousByte+aDescriptor.Length(); sl@0: if (pointerToPreviousByte==pointerToLastByte) sl@0: { sl@0: return 0; sl@0: } sl@0: FOREVER sl@0: { sl@0: __ASSERT_DEBUG(pointerToPreviousByteKFirstByteRangeFirstBlockEnd) && (currentByteKFirstByteRangeSecondBlockEnd) || sl@0: ((currentByte >= KPictoFirstByteStart) && (currentByte <= KPictoFirstByteEnd)) sl@0: ) sl@0: { sl@0: break; sl@0: } sl@0: sl@0: __ASSERT_DEBUG(pointerToPreviousByte=pointerToLastByte) sl@0: { sl@0: break; sl@0: } sl@0: __ASSERT_DEBUG(pointerToPreviousByte+2<=pointerToLastByte, Panic(EPanicBadPointers7)); sl@0: currentByte=*(pointerToPreviousByte+2); sl@0: if ((currentByteKSecondByteRangeFirstBlockEnd) && (currentByteKSecondByteRangeSecondBlockEnd)) sl@0: { sl@0: break; sl@0: } sl@0: pointerToPreviousByte+=2; sl@0: __ASSERT_DEBUG(pointerToPreviousByte<=pointerToLastByte, Panic(EPanicBadPointers8)); sl@0: if (pointerToPreviousByte>=pointerToLastByte) sl@0: { sl@0: break; sl@0: } sl@0: } sl@0: return (pointerToPreviousByte+1)-aDescriptor.Ptr(); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // NumberOfBytesAbleToConvertToPictograph ?description. sl@0: // ?description sl@0: // Returns: ?value_1: ?description sl@0: // ?value_n: ?description_line1 sl@0: // ?description_line2 sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TInt NumberOfBytesAbleToConvertToPictograph(const TDesC8& aDescriptor) sl@0: { sl@0: const TUint8* pointerToPreviousByte = aDescriptor.Ptr() - 1; sl@0: const TUint8* const pointerToLastByte = pointerToPreviousByte + aDescriptor.Length(); sl@0: sl@0: for (; pointerToPreviousByte < pointerToLastByte;) sl@0: { sl@0: __ASSERT_DEBUG(pointerToPreviousByte < pointerToLastByte, Panic(EPanicBadPointers5)); sl@0: TUint currentByte = *(pointerToPreviousByte + 1); sl@0: if ((currentByte < KPictoFirstByteStart) || (currentByte > KPictoFirstByteEnd)) sl@0: { sl@0: break; sl@0: } sl@0: __ASSERT_DEBUG(pointerToPreviousByte < pointerToLastByte, Panic(EPanicBadPointers6)); sl@0: if (pointerToPreviousByte + 1 >= pointerToLastByte) sl@0: { sl@0: break; sl@0: } sl@0: __ASSERT_DEBUG(pointerToPreviousByte + 2 <= pointerToLastByte, Panic(EPanicBadPointers7)); sl@0: currentByte = *(pointerToPreviousByte + 2); sl@0: if ((currentByte < KPictoSecondByteStart) || (currentByte> KPictoSecondByteEnd)) sl@0: { sl@0: break; sl@0: } sl@0: pointerToPreviousByte += 2; sl@0: __ASSERT_DEBUG(pointerToPreviousByte <= pointerToLastByte, Panic(EPanicBadPointers8)); sl@0: if (pointerToPreviousByte >= pointerToLastByte) sl@0: { sl@0: break; sl@0: } sl@0: } sl@0: return (pointerToPreviousByte + 1)-aDescriptor.Ptr(); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // DummyConvertToIntermediateBufferInPlace ?description. sl@0: // ?description sl@0: // Returns: ?value_1: ?description sl@0: // ?value_n: ?description_line1 sl@0: // ?description_line2 sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void DummyConvertToIntermediateBufferInPlace(TDes8&) sl@0: { sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // ConvertToJisX0208FromShiftJisInPlace ?description. sl@0: // ?description sl@0: // Returns: ?value_1: ?description sl@0: // ?value_n: ?description_line1 sl@0: // ?description_line2 sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void ConvertToJisX0208FromShiftJisInPlace(TDes8& aDescriptor) sl@0: { sl@0: const TInt descriptorLength=aDescriptor.Length(); sl@0: __ASSERT_DEBUG(descriptorLength>0, Panic(EPanicNothingToConvert2)); sl@0: __ASSERT_DEBUG(descriptorLength%2==0, Panic(EPanicOddNumberOfBytes2)); sl@0: TUint8* pointerToCurrentByte=CONST_CAST(TUint8*, aDescriptor.Ptr()); sl@0: const TUint8* const pointerToLastByte=pointerToCurrentByte+(descriptorLength-1); sl@0: FOREVER sl@0: { sl@0: TUint firstByte=*pointerToCurrentByte; sl@0: TUint secondByte=*(pointerToCurrentByte+1); sl@0: if (firstByte=94) sl@0: { sl@0: ++firstByte; sl@0: secondByte-=94; sl@0: } sl@0: firstByte+=0x21; sl@0: secondByte+=0x21; sl@0: *pointerToCurrentByte=STATIC_CAST(TUint8, firstByte); sl@0: ++pointerToCurrentByte; sl@0: *pointerToCurrentByte=STATIC_CAST(TUint8, secondByte); sl@0: __ASSERT_DEBUG(pointerToCurrentByte<=pointerToLastByte, Panic(EPanicBadPointers9)); sl@0: if (pointerToCurrentByte>=pointerToLastByte) sl@0: { sl@0: break; sl@0: } sl@0: ++pointerToCurrentByte; sl@0: } sl@0: } sl@0: sl@0: // New Interface class sl@0: class ShiftJisDirectmapImplementation : public CCharacterSetConverterPluginInterface sl@0: { sl@0: public: sl@0: virtual const TDesC8& ReplacementForUnconvertibleUnicodeCharacters(); sl@0: sl@0: virtual TInt ConvertFromUnicode( sl@0: CCnvCharacterSetConverter::TEndianness aDefaultEndiannessOfForeignCharacters, sl@0: const TDesC8& aReplacementForUnconvertibleUnicodeCharacters, sl@0: TDes8& aForeign, sl@0: const TDesC16& aUnicode, sl@0: CCnvCharacterSetConverter::TArrayOfAscendingIndices& aIndicesOfUnconvertibleCharacters ); sl@0: sl@0: virtual TInt ConvertToUnicode( sl@0: CCnvCharacterSetConverter::TEndianness aDefaultEndiannessOfForeignCharacters, sl@0: TDes16& aUnicode, sl@0: const TDesC8& aForeign, sl@0: TInt&, sl@0: TInt& aNumberOfUnconvertibleCharacters, sl@0: TInt& aIndexOfFirstByteOfFirstUnconvertibleCharacter ); sl@0: sl@0: virtual TBool IsInThisCharacterSetL( sl@0: TBool& aSetToTrue, sl@0: TInt& aConfidenceLevel, sl@0: const TDesC8& ); sl@0: sl@0: static ShiftJisDirectmapImplementation* NewL(); sl@0: sl@0: virtual ~ShiftJisDirectmapImplementation(); sl@0: private: sl@0: ShiftJisDirectmapImplementation(); sl@0: }; sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // ReplacementForUnconvertibleUnicodeCharacters returns the character which sl@0: // which is used by default as the replacement for unconvertible Unicode sl@0: // characters. sl@0: // Returns: a character sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: _LIT8(KLit8ShiftJisReplacementForUnconvertibleUnicodeCharacters, "\x81\x48"); sl@0: const TDesC8& ShiftJisDirectmapImplementation::ReplacementForUnconvertibleUnicodeCharacters() sl@0: { sl@0: return KLit8ShiftJisReplacementForUnconvertibleUnicodeCharacters;//CnvShiftJis::ReplacementForUnconvertibleUnicodeCharacters(); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // ConvertFromUnicode converts from an Unicode string to a Shift-Jis string sl@0: // with Pictograph. sl@0: // Returns: The number of unconverted characters left at the end of the input sl@0: // descriptor sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TInt ShiftJisDirectmapImplementation::ConvertFromUnicode( sl@0: CCnvCharacterSetConverter::TEndianness aDefaultEndiannessOfForeignCharacters, sl@0: const TDesC8& aReplacementForUnconvertibleUnicodeCharacters, sl@0: TDes8& aForeign, const TDesC16& aUnicode, sl@0: CCnvCharacterSetConverter::TArrayOfAscendingIndices& aIndicesOfUnconvertibleCharacters) sl@0: { sl@0: TFixedArray arrayOfCoreCharacterSets; sl@0: arrayOfCoreCharacterSets[0].iConversionData = &CnvJisX0201::ConversionData(); sl@0: arrayOfCoreCharacterSets[0].iConvertFromIntermediateBufferInPlace = sl@0: DummyConvertFromIntermediateBufferInPlace; sl@0: arrayOfCoreCharacterSets[0].iEscapeSequence = &KNullDesC8; sl@0: arrayOfCoreCharacterSets[1].iConversionData = &CnvJisX0208::ConversionData(); sl@0: arrayOfCoreCharacterSets[1].iConvertFromIntermediateBufferInPlace = sl@0: ConvertFromJisX0208ToShiftJisInPlace; sl@0: arrayOfCoreCharacterSets[1].iEscapeSequence = &KNullDesC8; sl@0: arrayOfCoreCharacterSets[2].iConversionData = &CnvShiftJisDirectmap::ConversionData(); sl@0: arrayOfCoreCharacterSets[2].iConvertFromIntermediateBufferInPlace = sl@0: DummyConvertFromIntermediateBufferInPlace; sl@0: arrayOfCoreCharacterSets[2].iEscapeSequence = &KNullDesC8; sl@0: sl@0: return CnvUtilities::ConvertFromUnicode(aDefaultEndiannessOfForeignCharacters, sl@0: aReplacementForUnconvertibleUnicodeCharacters, aForeign, aUnicode, sl@0: aIndicesOfUnconvertibleCharacters, arrayOfCoreCharacterSets.Array()); sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // ConvertToUnicode converts from a Shift-Jis string with Pictograph to sl@0: // an Unicode string . sl@0: // Returns: The number of unconverted bytes left at the end of the input sl@0: // descriptor sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TInt ShiftJisDirectmapImplementation::ConvertToUnicode( sl@0: CCnvCharacterSetConverter::TEndianness aDefaultEndiannessOfForeignCharacters, sl@0: TDes16& aUnicode, const TDesC8& aForeign, TInt&, sl@0: TInt& aNumberOfUnconvertibleCharacters, sl@0: TInt& aIndexOfFirstByteOfFirstUnconvertibleCharacter) sl@0: { sl@0: TFixedArray arrayOfCoreMethods; sl@0: arrayOfCoreMethods[0].iNumberOfBytesAbleToConvert = sl@0: NumberOfBytesAbleToConvertToJisX0201; sl@0: arrayOfCoreMethods[0].iConvertToIntermediateBufferInPlace = sl@0: DummyConvertToIntermediateBufferInPlace; sl@0: arrayOfCoreMethods[0].iConversionData = &CnvJisX0201::ConversionData(); sl@0: arrayOfCoreMethods[0].iNumberOfBytesPerCharacter = 1; sl@0: arrayOfCoreMethods[0].iNumberOfCoreBytesPerCharacter = 1; sl@0: arrayOfCoreMethods[1].iNumberOfBytesAbleToConvert = sl@0: NumberOfBytesAbleToConvertToPictograph; sl@0: arrayOfCoreMethods[1].iConvertToIntermediateBufferInPlace = sl@0: DummyConvertToIntermediateBufferInPlace; sl@0: arrayOfCoreMethods[1].iConversionData = &CnvShiftJisDirectmap::ConversionData(); sl@0: arrayOfCoreMethods[1].iNumberOfBytesPerCharacter = 2; sl@0: arrayOfCoreMethods[1].iNumberOfCoreBytesPerCharacter = 2; sl@0: arrayOfCoreMethods[2].iNumberOfBytesAbleToConvert = sl@0: NumberOfBytesAbleToConvertToJisX0208; sl@0: arrayOfCoreMethods[2].iConvertToIntermediateBufferInPlace = sl@0: ConvertToJisX0208FromShiftJisInPlace; sl@0: arrayOfCoreMethods[2].iConversionData = &CnvJisX0208::ConversionData(); sl@0: arrayOfCoreMethods[2].iNumberOfBytesPerCharacter = 2; sl@0: arrayOfCoreMethods[2].iNumberOfCoreBytesPerCharacter = 2; sl@0: sl@0: TInt unconvert = CnvUtilities::ConvertToUnicodeFromHeterogeneousForeign( sl@0: aDefaultEndiannessOfForeignCharacters, aUnicode, aForeign, sl@0: aNumberOfUnconvertibleCharacters, sl@0: aIndexOfFirstByteOfFirstUnconvertibleCharacter, sl@0: arrayOfCoreMethods.Array()); sl@0: sl@0: // The following is specific impelementation for brower. sl@0: // If brower app calls this API, the yen sign code(0xA5) sl@0: // must be converted to backslash code(0x5C). sl@0: // Becasue Javascript supports backslash code ony. sl@0: TBool browserProcess = (RProcess().SecureId().iId == KBrowserSecureId); sl@0: if (browserProcess && aUnicode.Length() > 0) sl@0: { sl@0: const TUint16* pB = aUnicode.Ptr(); sl@0: const TUint16* pbase = pB; sl@0: const TUint16* pE = pB + aUnicode.Length() -1; sl@0: while (pE>=pbase) sl@0: { sl@0: if (*pbase == KCharacterCodeForYenSign) sl@0: { sl@0: aUnicode[pbase - pB] = KCharacterCodeForBackSlash; sl@0: } sl@0: pbase++; sl@0: } sl@0: } sl@0: sl@0: return unconvert; sl@0: } sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // IsInThisCharacterSetL tests whether the aSample is Shift-JIS or not. sl@0: // But, This .cpl is only used for FEP. sl@0: // So, it's not need to correspond auto code detection. sl@0: // Returns: EFalse: ?description sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: TBool ShiftJisDirectmapImplementation::IsInThisCharacterSetL(TBool& /*aSetToTrue*/, TInt& /*aConfidenceLevel*/, sl@0: const TDesC8& /*aSample*/) sl@0: { sl@0: return EFalse; sl@0: } sl@0: sl@0: ShiftJisDirectmapImplementation* ShiftJisDirectmapImplementation::NewL() sl@0: { sl@0: ShiftJisDirectmapImplementation* self = new(ELeave) ShiftJisDirectmapImplementation; sl@0: return self; sl@0: } sl@0: sl@0: ShiftJisDirectmapImplementation::ShiftJisDirectmapImplementation() sl@0: { sl@0: //default constructor.. do nothing sl@0: } sl@0: sl@0: ShiftJisDirectmapImplementation::~ShiftJisDirectmapImplementation() sl@0: { sl@0: //default destructor .. do nothing sl@0: } sl@0: sl@0: // ECOM CREATION FUNCTION sl@0: const TImplementationProxy ImplementationTable[] = sl@0: { sl@0: // Note: This is the same UID as defined in old mmp-file sl@0: // Used also in 12221212.rss ( implementation_uid ) sl@0: IMPLEMENTATION_PROXY_ENTRY( 0x101F8691, ShiftJisDirectmapImplementation::NewL ) sl@0: }; sl@0: sl@0: EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt& aTableCount ) sl@0: { sl@0: aTableCount = sizeof( ImplementationTable ) / sizeof(TImplementationProxy); sl@0: return ImplementationTable; sl@0: } sl@0: sl@0: // End of File