--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/ptienginev2/src/PtiKeyMappings.cpp Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,640 @@
+/*
+* Copyright (c) 2003-2006 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0""
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: PtiKeyMappings class implementation.
+*
+*/
+
+
+#include "PtiKeyMappings.h"
+#include <PtiKeyMapData.h>
+
+// CONSTANTS
+#ifdef _DEBUG
+_LIT(KPtiNoKeyMapDataPanic, "PtiEngine: No ITU-T keymap data set.");
+#endif
+
+//
+// CPtiMappings
+//
+
+// ---------------------------------------------------------------------------
+// CPtiMappings::CPtiMappings
+//
+// ---------------------------------------------------------------------------
+//
+CPtiMappings::CPtiMappings()
+ {
+ }
+
+
+// ---------------------------------------------------------------------------
+// CPtiMappings::CPtiMappings
+//
+// ---------------------------------------------------------------------------
+//
+CPtiMappings::CPtiMappings(CPtiKeyMapData* aData) : iKeyMapData(aData)
+ {
+ }
+
+
+// ---------------------------------------------------------------------------
+// CPtiMappings::~CPtiMappings
+//
+// ---------------------------------------------------------------------------
+//
+CPtiMappings::~CPtiMappings()
+ {
+ iReplacedMappings.Close();
+ }
+
+
+// ---------------------------------------------------------------------------
+// CPtiMappings::FindReplacedMapping
+//
+// ---------------------------------------------------------------------------
+//
+TInt CPtiMappings::FindReplacedMapping(TPtiKey aKey, TPtiTextCase aCase,
+ TPtiEngineInputMode aMode) const
+ {
+ for (TInt i = 0; i < iReplacedMappings.Count(); i++)
+ {
+ if (iReplacedMappings[i].iKey == aKey &&
+ iReplacedMappings[i].iCase == aCase &&
+ iReplacedMappings[i].iMode == aMode &&
+ iReplacedMappings[i].iKeyboardType == iKeyboardType)
+ {
+ return i;
+ }
+ }
+
+ return KErrNotFound;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CPtiMappings::ReplaceKeyMapLocalL
+//
+// ---------------------------------------------------------------------------
+//
+void CPtiMappings::ReplaceKeyMapLocalL(TPtiKey aKey, TDesC& aMap,
+ TPtiTextCase aCase, TPtiEngineInputMode aMode)
+ {
+ TInt i = FindReplacedMapping(aKey, aCase, aMode);
+ if (i != KErrNotFound)
+ {
+ iReplacedMappings.Remove(i);
+ }
+
+ TPtiReplacedMapping newMapping;
+ newMapping.iKey = aKey;
+ newMapping.iCase = aCase;
+ newMapping.iMode = aMode;
+ newMapping.iKeyboardType = iKeyboardType;
+
+ for (i = 0; i < KMaxReplacedMappingCharacters && i < aMap.Length(); i++)
+ {
+ newMapping.iChrs[i] = aMap[i];
+ }
+ newMapping.iNumChars = i;
+
+ User::LeaveIfError(iReplacedMappings.Append(newMapping));
+ }
+
+
+
+// ---------------------------------------------------------------------------
+// CPtiMappings::DataForKeyLocal
+//
+// ---------------------------------------------------------------------------
+//
+TPtrC CPtiMappings::DataForKeyLocal(TPtiKey aKey, TPtiTextCase aCase, TPtiEngineInputMode aMode) const
+ {
+ __ASSERT_DEBUG(iKeyMapData, User::Panic(KPtiNoKeyMapDataPanic, KErrCorrupt));
+
+ if ((aCase == EPtiCaseChrLower) && (iKeyboardType != EPtiKeyboardHalfQwerty))
+ {
+ aCase = EPtiCaseLower;
+ }
+ else if ((aCase == EPtiCaseChrUpper) && (iKeyboardType != EPtiKeyboardHalfQwerty))
+ {
+ aCase = EPtiCaseUpper;
+ }
+
+ TInt replaced = FindReplacedMapping(aKey, aCase, aMode);
+ if (replaced != KErrNotFound)
+ {
+ if (iReplacedMappings[replaced].iNumChars > 0)
+ {
+ return TPtrC(iReplacedMappings[replaced].iChrs,
+ iReplacedMappings[replaced].iNumChars);
+ }
+ return TPtrC();
+ }
+
+ return iKeyMapData->DataForKey(iKeyboardType, aKey, aCase);
+ }
+
+
+// ---------------------------------------------------------------------------
+// CPtiMappings::WriteData (DEPRECATED)
+//
+// ---------------------------------------------------------------------------
+//
+TInt CPtiMappings::WriteData(TInt16*)
+ {
+ return 0;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CPtiMappings::ChunkDataSize (DEPRECATED)
+//
+// ---------------------------------------------------------------------------
+//
+TInt CPtiMappings::ChunkDataSize() const
+ {
+ return 0;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CPtiMappings::KeyboardType
+//
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TPtiKeyboardType CPtiMappings::KeyboardType() const
+ {
+ return iKeyboardType;
+ }
+
+
+//
+// CPtiKeyMappings
+//
+
+// ---------------------------------------------------------------------------
+// CPtiKeyMappings::NewL
+//
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CPtiKeyMappings* CPtiKeyMappings::NewL(TDesC& /*aData*/)
+ {
+ // DEPRECATED
+ User::Leave(KErrNotSupported);
+ return NULL;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CPtiKeyMappings::NewL
+//
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CPtiKeyMappings* CPtiKeyMappings::NewL(TInt16* /*aData*/)
+ {
+ // DEPRECATED
+ User::Leave(KErrNotSupported);
+ return NULL;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CPtiKeyMappings::NewL
+//
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CPtiKeyMappings* CPtiKeyMappings::NewL(CPtiKeyMapData* aData)
+ {
+ CPtiKeyMappings* maps = new (ELeave) CPtiKeyMappings(aData);
+ return maps;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CPtiKeyMappings::CPtiKeyMappings
+//
+// ---------------------------------------------------------------------------
+//
+CPtiKeyMappings::CPtiKeyMappings()
+ {
+ iKeyboardType = EPtiKeyboard12Key;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CPtiKeyMappings::CPtiKeyMappings
+//
+// ---------------------------------------------------------------------------
+//
+CPtiKeyMappings::CPtiKeyMappings(CPtiKeyMapData* aData) : CPtiMappings(aData)
+ {
+ iKeyboardType = EPtiKeyboard12Key;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CPtiKeyMappings::~CPtiKeyMappings
+//
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CPtiKeyMappings::~CPtiKeyMappings()
+ {
+ }
+
+
+// ---------------------------------------------------------------------------
+// CPtiKeyMappings::StartMapping
+//
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TUint16 CPtiKeyMappings::StartMapping(TPtiKey aKey, TPtiTextCase aCase,
+ TPtiEngineInputMode aMode)
+ {
+ __ASSERT_DEBUG(iKeyMapData, User::Panic(KPtiNoKeyMapDataPanic, KErrCorrupt));
+
+ DeQwertyfyCaseValue(aCase);
+
+ KeyCodeToInternal(aKey);
+
+ iCurrentMode = aMode;
+ iCurrentChar = 0;
+
+ TPtrC keyData = DataForKeyLocal(aKey, aCase, iCurrentMode);
+ if (keyData.Length() > 0)
+ {
+ return keyData[0];
+ }
+
+ return 0;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CPtiKeyMappings::NextChar
+//
+// ---------------------------------------------------------------------------
+//
+TUint16 CPtiKeyMappings::NextChar(TPtiTextCase aCase)
+ {
+ __ASSERT_DEBUG(iKeyMapData, User::Panic(KPtiNoKeyMapDataPanic, KErrCorrupt));
+
+ iCurrentChar++;
+
+ DeQwertyfyCaseValue(aCase);
+
+ TPtrC keyData = DataForKeyLocal(iCurrentKey, aCase, iCurrentMode);
+ if (iCurrentChar >= keyData.Length())
+ {
+ iCurrentChar = 0;
+ }
+
+ if (keyData.Length())
+ {
+ return keyData[iCurrentChar];
+ }
+
+ return 0;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CPtiKeyMappings::ReplaceKeyMapL
+//
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CPtiKeyMappings::ReplaceKeyMapL(TPtiKey aKey, TDesC& aMap,
+ TPtiTextCase aCase)
+ {
+ if (iCurrentKey == aKey)
+ {
+ iCurrentKey = EPtiKeyNone;
+ iCurrentChar = 0;
+ }
+
+ DeQwertyfyCaseValue(aCase);
+
+ ReplaceKeyMapLocalL(aKey, aMap, aCase, EPtiEngineMultitapping);
+
+ return KErrNone;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CPtiKeyMappings::NextKey
+//
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TUint16 CPtiKeyMappings::NextKey(TPtiKey aKey, TBool &aAppend,
+ TPtiTextCase aCase)
+ {
+ if (CurrentKey() == aKey)
+ {
+ aAppend = EFalse;
+ return NextChar(aCase);
+ }
+
+ return StartMapping(aKey, aCase);
+ }
+
+
+// ---------------------------------------------------------------------------
+// CPtiKeyMappings::KeyForCharacter
+//
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TPtiKey CPtiKeyMappings::KeyForCharacter(TUint16 aChar)
+ {
+ __ASSERT_DEBUG(iKeyMapData, User::Panic(KPtiNoKeyMapDataPanic, KErrCorrupt));
+
+ TInt numBindItems = 0;
+ const TPtiKeyBinding* bindings = iKeyMapData->KeyBindingTable(iKeyboardType, numBindItems);
+ TInt dataSize = 0;
+ const TUint16* mtData = iKeyMapData->KeyData(iKeyboardType, dataSize);
+
+ TPtiTextCase textCase;
+ TPtiKey key;
+ for (TInt i = 0; i < numBindItems; i++)
+ {
+ key = iKeyMapData->KeyForBindingTableIndex(iKeyboardType, i, textCase);
+ if (key != EPtiKeyNone)
+ {
+ TPtrC keyData = DataForKeyLocal(key, textCase, EPtiEngineMultitapping);
+ if (keyData.Locate(aChar) != KErrNotFound)
+ {
+ return key;
+ }
+ }
+ }
+
+ return EPtiKeyNone;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CPtiKeyMappings::GetDataForKey
+//
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CPtiKeyMappings::GetDataForKey(TPtiKey aKey, TDes& aResult,
+ TPtiTextCase aCase)
+ {
+ __ASSERT_DEBUG(iKeyMapData, User::Panic(KPtiNoKeyMapDataPanic, KErrCorrupt));
+
+ DeQwertyfyCaseValue(aCase);
+
+ aResult.Copy(DataForKeyLocal(aKey, aCase, EPtiEngineMultitapping).Left(aResult.MaxLength()));
+ }
+
+
+// ---------------------------------------------------------------------------
+// CPtiKeyMappings::GetAll
+//
+// ---------------------------------------------------------------------------
+//
+TPtrC CPtiKeyMappings::GetAll(TPtiTextCase aCase)
+ {
+ __ASSERT_DEBUG(iKeyMapData, User::Panic(KPtiNoKeyMapDataPanic, KErrCorrupt));
+
+ DeQwertyfyCaseValue(aCase);
+
+ TPtrC keyData = DataForKeyLocal(iCurrentKey, aCase, EPtiEngineMultitapping);
+ if (keyData.Length() > 1)
+ {
+ // Return characters excluding the control char.
+ return keyData.Mid(1);
+ }
+
+ return TPtrC();
+ }
+
+//
+// CPtiHalfQwertyKeyMappings
+//
+
+// ---------------------------------------------------------------------------
+// CPtiHalfQwertyKeyMappings::NewL
+//
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CPtiHalfQwertyKeyMappings* CPtiHalfQwertyKeyMappings::NewL(CPtiKeyMapData* aData)
+ {
+ CPtiHalfQwertyKeyMappings* maps = new (ELeave) CPtiHalfQwertyKeyMappings(aData);
+ return maps;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CPtiHalfQwertyKeyMappings::::CPtiHalfQwertyKeyMappings
+//
+// ---------------------------------------------------------------------------
+//
+CPtiHalfQwertyKeyMappings::CPtiHalfQwertyKeyMappings(CPtiKeyMapData* aData) : CPtiKeyMappings(aData)
+ {
+ iKeyboardType = EPtiKeyboardHalfQwerty;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CPtiHalfQwertyKeyMappings::~CPtiHalfQwertyKeyMappings
+//
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CPtiHalfQwertyKeyMappings::~CPtiHalfQwertyKeyMappings()
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// CPtiHalfQwertyKeyMappings::StartMapping
+//
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TUint16 CPtiHalfQwertyKeyMappings::StartMapping(TPtiKey aKey, TPtiTextCase aCase,
+ TPtiEngineInputMode aMode)
+ {
+ __ASSERT_DEBUG(iKeyMapData, User::Panic(KPtiNoKeyMapDataPanic, KErrCorrupt));
+
+ //DeQwertyfyCaseValue(aCase);
+
+ KeyCodeToInternal(aKey);
+
+ iCurrentMode = aMode;
+ iCurrentChar = 0;
+
+ TPtrC keyData = DataForKeyLocal(aKey, aCase, iCurrentMode);
+ if (keyData.Length() > 0)
+ {
+ return keyData[0];
+ }
+
+
+ return 0;
+ }
+
+// ---------------------------------------------------------------------------
+// CPtiHalfQwertyKeyMappings::NextKey
+//
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TUint16 CPtiHalfQwertyKeyMappings::NextKey(TPtiKey aKey, TBool &aAppend,
+ TPtiTextCase aCase)
+ {
+ if (CurrentKey() == aKey)
+ {
+ aAppend = EFalse;
+ return NextChar(aCase);
+ }
+
+ return StartMapping(aKey, aCase);
+ }
+
+
+// ---------------------------------------------------------------------------
+// TUint16 CPtiHalfQwertyKeyMappings::NextChar(TPtiTextCase aCase)
+//
+// ---------------------------------------------------------------------------
+//
+TUint16 CPtiHalfQwertyKeyMappings::NextChar(TPtiTextCase aCase)
+ {
+ __ASSERT_DEBUG(iKeyMapData, User::Panic(KPtiNoKeyMapDataPanic, KErrCorrupt));
+
+ iCurrentChar++;
+ // we want to retain chr cases in half qwerty
+ //DeQwertyfyCaseValue(aCase);
+
+ TPtrC keyData = DataForKeyLocal(iCurrentKey, aCase, iCurrentMode);
+ if (iCurrentChar >= keyData.Length())
+ {
+ iCurrentChar = 0;
+ }
+
+ if (keyData.Length())
+ {
+ return keyData[iCurrentChar];
+ }
+
+ return 0;
+ }
+// ---------------------------------------------------------------------------
+// CPtiHalfQwertyKeyMappings::ReplaceKeyMapL
+//
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CPtiHalfQwertyKeyMappings::ReplaceKeyMapL(TPtiKey aKey, TDesC& aMap, TPtiTextCase aCase)
+ {
+ if (iCurrentKey == aKey)
+ {
+ iCurrentKey = EPtiKeyNone;
+ iCurrentChar = 0;
+ }
+
+// DeQwertyfyCaseValue(aCase);
+
+ ReplaceKeyMapLocalL(aKey, aMap, aCase, EPtiEngineHalfQwerty);
+
+ return KErrNone;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CPtiHalfQwertyKeyMappings::KeyForCharacter
+//
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TPtiKey CPtiHalfQwertyKeyMappings::KeyForCharacter(TUint16 aChar)
+ {
+ __ASSERT_DEBUG(iKeyMapData, User::Panic(KPtiNoKeyMapDataPanic, KErrCorrupt));
+
+ TInt numBindItems = 0;
+ const TPtiKeyBinding* bindings = iKeyMapData->KeyBindingTable(iKeyboardType, numBindItems);
+ TInt dataSize = 0;
+ const TUint16* mtData = iKeyMapData->KeyData(iKeyboardType, dataSize);
+
+ TPtiTextCase textCase;
+ TPtiKey key;
+ for (TInt i = 0; i < numBindItems; i++)
+ {
+ key = iKeyMapData->KeyForBindingTableIndex(iKeyboardType, i, textCase);
+ if (key != EPtiKeyNone)
+ {
+ TPtrC keyData = DataForKeyLocal(key, textCase, EPtiEngineHalfQwerty);
+ if (keyData.Locate(aChar) != KErrNotFound)
+ {
+ return key;
+ }
+ }
+ }
+
+ return EPtiKeyNone;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CPtiHalfQwertyKeyMappings::GetAll
+//
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TPtrC CPtiHalfQwertyKeyMappings::GetAll(TPtiTextCase aCase)
+ {
+ __ASSERT_DEBUG(iKeyMapData, User::Panic(KPtiNoKeyMapDataPanic, KErrCorrupt));
+
+// DeQwertyfyCaseValue(aCase);
+
+ TPtrC keyData = DataForKeyLocal(iCurrentKey, aCase, EPtiEngineHalfQwerty);
+ if (keyData.Length() > 1)
+ {
+ // Return characters excluding the control char.
+ return keyData.Mid(1);
+ }
+
+ return TPtrC();
+ }
+
+
+// ---------------------------------------------------------------------------
+// CPtiHalfQwertyKeyMappings::GetNumericModeKeysFromDataL
+//
+// ---------------------------------------------------------------------------
+//
+void CPtiHalfQwertyKeyMappings::GetNumericModeKeysFromDataL(RArray<TPtiNumericKeyBinding>& aResult)
+ {
+ __ASSERT_DEBUG(iKeyMapData, User::Panic(KPtiNoKeyMapDataPanic, KErrCorrupt));
+
+ TInt numEntries = 0;
+ const TPtiNumericKeyBinding* dataEntries = iKeyMapData->NumericModeKeysTable(iKeyboardType,
+ numEntries);
+
+ for (TInt i = 0; i < numEntries; i++)
+ {
+ User::LeaveIfError(aResult.Append(dataEntries[i]));
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CPtiQwertyKeyMappings::GetDataForKey
+//
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CPtiHalfQwertyKeyMappings::GetDataForKey(TPtiKey aKey, TDes& aResult,
+ TPtiTextCase aCase)
+ {
+ __ASSERT_DEBUG(iKeyMapData, User::Panic(KPtiNoKeyMapDataPanic, KErrCorrupt));
+
+ aResult.Copy(DataForKeyLocal(aKey, aCase, EPtiEngineHalfQwerty).Left(aResult.MaxLength()));
+ }
+
+
+// End of file
+
+