textinput/ptienginev2/src/PtiLanguage.cpp
changeset 0 eb1f2e154e89
child 9 e6a39382bb9c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/ptienginev2/src/PtiLanguage.cpp	Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,646 @@
+/*
+* Copyright (c) 2003-2007 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:   PtiLanguage class implementation.
+*
+*/
+
+
+#include "PtiKeyMappings.h"
+#include "PtiLanguage.h"
+#include <PtiKeyMapData.h>
+#include <PtiCore.h>
+#include "PtiDefaultCore.h"
+
+#ifdef _DEBUG
+_LIT(KPtiEngineLangPanic, "CPtiLanguage");
+#endif
+
+//
+// TPtiKeyMappingsHolder
+//
+
+// ---------------------------------------------------------------------------
+// TPtiKeyMappingsHolder::TPtiKeyMappingsHolder
+// 
+// ---------------------------------------------------------------------------
+// 
+TPtiKeyMappingsHolder::TPtiKeyMappingsHolder()
+    {
+    iKeyMappings = NULL;
+    iQwertyKeyMappings = NULL;
+    iHalfQwertyMappings = NULL;       
+    }
+   
+    
+// ---------------------------------------------------------------------------
+// TPtiKeyMappingsHolder::~TPtiKeyMappingsHolder
+// 
+// ---------------------------------------------------------------------------
+//     
+TPtiKeyMappingsHolder::~TPtiKeyMappingsHolder()
+    {
+    Clear();
+    }
+    
+    
+// ---------------------------------------------------------------------------
+// TPtiKeyMappingsHolder::´Clear()
+// 
+// ---------------------------------------------------------------------------
+//         
+void TPtiKeyMappingsHolder::Clear()
+    {
+    delete iKeyMappings;
+    iKeyMappings = NULL;
+    delete iQwertyKeyMappings;
+    iQwertyKeyMappings = NULL;
+    delete iHalfQwertyMappings;          
+    iHalfQwertyMappings = NULL;
+    }
+    
+    
+
+//
+// CPtiCoreLanguage
+//
+
+// ---------------------------------------------------------------------------
+// CPtiCoreLanguage::NewL
+// 
+// ---------------------------------------------------------------------------
+// 
+EXPORT_C CPtiCoreLanguage* CPtiCoreLanguage::NewL()
+	{
+	CPtiCoreLanguage* lang = new (ELeave) CPtiCoreLanguage();
+	CleanupStack::PushL( lang );
+	lang->ConstructL();
+	CleanupStack::Pop(); // lang
+	return lang;
+	}
+
+
+// ---------------------------------------------------------------------------
+// CPtiCoreLanguage::CPtiCoreLanguage
+// 
+// ---------------------------------------------------------------------------
+// 
+CPtiCoreLanguage::CPtiCoreLanguage()
+	{
+	}
+
+
+// ---------------------------------------------------------------------------
+// CPtiCoreLanguage::~CPtiCoreLanguage
+// 
+// ---------------------------------------------------------------------------
+// 
+EXPORT_C CPtiCoreLanguage::~CPtiCoreLanguage()
+	{
+	Clear();
+	delete iHolder;
+	iHolder = NULL;		
+	}
+
+
+// ---------------------------------------------------------------------------
+// CPtiCoreLanguage::ConstructL
+// 
+// ---------------------------------------------------------------------------
+// 
+void CPtiCoreLanguage::ConstructL()
+	{
+	iHolder = new (ELeave) TPtiKeyMappingsHolder();
+	}
+
+
+// ---------------------------------------------------------------------------
+// CPtiCoreLanguage::Clear
+// 
+// ---------------------------------------------------------------------------
+// 
+void CPtiCoreLanguage::Clear()
+    {	
+	if (iHolder)
+	    {
+        iHolder->Clear();		
+	    }
+	delete iKeyMapData;
+	iKeyMapData = NULL;	
+	iCores.Close();
+	}
+
+
+// ---------------------------------------------------------------------------
+// CPtiCoreLanguage::SetLanguageCode
+// 
+// ---------------------------------------------------------------------------
+// 
+EXPORT_C void CPtiCoreLanguage::SetLanguageCode(TInt aCode)
+	{
+	if (aCode == iLanguageCode)
+		{
+		return;	
+		}
+
+	Clear();
+	iLanguageCode = aCode;
+	}
+
+
+// ---------------------------------------------------------------------------
+// CPtiCoreLanguage::SetLocalizedName
+// 
+// ---------------------------------------------------------------------------
+// 
+EXPORT_C void CPtiCoreLanguage::SetLocalizedName(const TDesC& aName)
+	{	
+	iLocalizedName.Copy(aName.Left(iLocalizedName.MaxLength()));	
+	}
+
+
+// ---------------------------------------------------------------------------
+// CPtiCoreLanguage::GetKeymappings
+// 
+// ---------------------------------------------------------------------------
+// 
+EXPORT_C MPtiKeyMappings* CPtiCoreLanguage::GetKeymappings() const
+	{
+	__ASSERT_DEBUG(iHolder, User::Panic(KPtiEngineLangPanic, KErrCorrupt));	
+	
+	if (!iKeyMapData)	
+		{
+	    if (!iDataFactory)
+		    {
+		    CPtiDefaultCore* defaultCore = static_cast<CPtiDefaultCore*> (GetCoreForNumericMode());
+		    if (defaultCore)
+		        {
+		        TRAPD(err, defaultCore->LoadFactoryForLanguageL(LanguageCode()));
+		        if(err != KErrNone)
+		        	{
+		        	return NULL;
+		        	}
+		        }
+            else
+                {
+                return NULL;
+                }		        
+		    }  		
+		
+		TRAP_IGNORE(LoadKeymappingsL());	
+		}
+	
+	return iHolder->iKeyMappings;
+	}
+
+
+// ---------------------------------------------------------------------------
+// CPtiCoreLanguage::GetQwertyKeymappings
+// 
+// ---------------------------------------------------------------------------
+// 
+EXPORT_C MPtiKeyMappings* CPtiCoreLanguage::GetQwertyKeymappings() const
+	{
+	__ASSERT_DEBUG(iHolder, User::Panic(KPtiEngineLangPanic, KErrCorrupt));	
+	
+	if (!iKeyMapData)	
+		{
+		if (!iDataFactory)
+		    {
+		    CPtiDefaultCore* defaultCore = static_cast<CPtiDefaultCore*> (GetCoreForNumericMode());
+		    if (defaultCore)
+		        {
+		        TRAPD(err, defaultCore->LoadFactoryForLanguageL(LanguageCode()));
+		        if(err != KErrNone)
+		        	{
+		        	return NULL;
+		        	}
+		        }
+            else
+                {
+                return NULL;
+                }		        
+		    }  
+
+		
+		TRAP_IGNORE(LoadKeymappingsL());	
+		}
+	
+	return iHolder->iQwertyKeyMappings;		
+	}
+
+
+// ---------------------------------------------------------------------------
+// CPtiCoreLanguage::ClearMultitapping
+// 
+// ---------------------------------------------------------------------------
+// 
+EXPORT_C void CPtiCoreLanguage::ClearMultitapping()
+	{
+	__ASSERT_DEBUG(iHolder, User::Panic(KPtiEngineLangPanic, KErrCorrupt));	
+		
+	delete iHolder->iKeyMappings;
+	iHolder->iKeyMappings = NULL;
+	}
+
+
+// ---------------------------------------------------------------------------
+// CPtiCoreLanguage::ClearQwerty
+// 
+// ---------------------------------------------------------------------------
+// 
+EXPORT_C void CPtiCoreLanguage::ClearQwerty()
+	{
+	__ASSERT_DEBUG(iHolder, User::Panic(KPtiEngineLangPanic, KErrCorrupt));		
+	
+	delete iHolder->iQwertyKeyMappings;
+	iHolder->iQwertyKeyMappings = NULL;
+	}
+
+
+// ---------------------------------------------------------------------------
+// CPtiCoreLanguage::LocalizedNameDes
+// 
+// ---------------------------------------------------------------------------
+// 
+EXPORT_C TDes& CPtiCoreLanguage::LocalizedNameDes()
+	{
+	return iLocalizedName;
+	}
+
+
+// ---------------------------------------------------------------------------
+// CPtiCoreLanguage::GetCore
+// 
+// ---------------------------------------------------------------------------
+// 
+EXPORT_C MPtiCore* CPtiCoreLanguage::GetCore(TPtiEngineInputMode aMode)
+	{
+	if (aMode == EPtiEngineNumeric)
+		{
+		return GetCoreForNumericMode();	
+		}
+	
+	if (!iKeyMapData)	
+		{
+		TRAP_IGNORE(LoadKeymappingsL());	
+		}		
+	
+	for (TInt i = 0; i < iCores.Count(); i++)
+		{
+		if (iCores[i].iInputMode == aMode)
+			{
+			return iCores[i].iCore;
+			}
+		}
+	
+	return NULL;
+	}
+
+
+// ---------------------------------------------------------------------------
+// CPtiCoreLanguage::SetCore
+// 
+// ---------------------------------------------------------------------------
+// 
+EXPORT_C void CPtiCoreLanguage::SetCore(MPtiCore *aCore, TPtiEngineInputMode aMode)
+	{
+	SetCoreLocal(aCore, aMode);
+	}
+
+
+// ---------------------------------------------------------------------------
+// CPtiCoreLanguage::SetKeyMappings
+// 
+// ---------------------------------------------------------------------------
+// 
+EXPORT_C void CPtiCoreLanguage::SetKeyMappings(MPtiKeyMappings* aMappings)
+	{
+	__ASSERT_DEBUG(iHolder, User::Panic(KPtiEngineLangPanic, KErrCorrupt));		
+	
+	delete iHolder->iKeyMappings;
+	iHolder->iKeyMappings = aMappings;
+	}
+
+
+// ---------------------------------------------------------------------------
+// CPtiCoreLanguage::SetQwertyKeyMappings
+// 
+// ---------------------------------------------------------------------------
+// 
+EXPORT_C void CPtiCoreLanguage::SetQwertyKeyMappings(MPtiKeyMappings* aMappings)
+	{
+	__ASSERT_DEBUG(iHolder, User::Panic(KPtiEngineLangPanic, KErrCorrupt));		
+	
+	delete iHolder->iQwertyKeyMappings;
+	iHolder->iQwertyKeyMappings = aMappings;
+	}
+
+
+// ---------------------------------------------------------------------------
+// CPtiCoreLanguage::HasInputMode
+// 
+// ---------------------------------------------------------------------------
+// 
+EXPORT_C TBool CPtiCoreLanguage::HasInputMode(TPtiEngineInputMode aMode) const
+	{
+	if (!iKeyMapData)	
+		{
+		TRAP_IGNORE(LoadKeymappingsL());	
+		}	
+	
+	for (TInt i = 0; i < iCores.Count(); i++)
+		{
+		if (iCores[i].iInputMode == aMode)
+			{	
+			return ETrue;
+			}
+		}
+	
+	return EFalse;
+	}
+
+
+// ---------------------------------------------------------------------------
+// CPtiCoreLanguage::HasCore
+// 
+// ---------------------------------------------------------------------------
+// 
+EXPORT_C TBool CPtiCoreLanguage::HasCore(MPtiCore* aCore) const
+	{
+	if (!iKeyMapData)	
+		{
+		TRAP_IGNORE(LoadKeymappingsL());	
+		}	
+	
+	for (TInt i = 0; i < iCores.Count(); i++)
+		{
+		if (iCores[i].iCore == aCore)
+			{
+			return ETrue;
+			}
+		}
+
+	return EFalse;
+	}
+
+
+// ---------------------------------------------------------------------------
+// CPtiCoreLanguage::GetAvailableInputModesL
+// 
+// ---------------------------------------------------------------------------
+// 
+EXPORT_C void CPtiCoreLanguage::GetAvailableInputModesL(CArrayFix<TInt>* aResult)
+	{
+	if (!iKeyMapData)	
+		{
+		TRAP_IGNORE(LoadKeymappingsL());	
+		}	
+	
+	if (aResult)
+		{
+		for (TInt i = 0; i < iCores.Count(); i++)
+			{
+			aResult->AppendL(iCores[i].iInputMode);
+			}
+		}
+	}
+
+
+// ---------------------------------------------------------------------------
+// CPtiCoreLanguage::GetAvailableInputModesL
+// 
+// ---------------------------------------------------------------------------
+// 
+EXPORT_C void CPtiCoreLanguage::GetAvailableInputModesL(RArray<TInt>& aResult)
+	{
+	if (!iKeyMapData)	
+		{
+		TRAP_IGNORE(LoadKeymappingsL());	
+		}	
+	
+	for (TInt i = 0; i < iCores.Count(); i++)
+		{
+		aResult.AppendL(iCores[i].iInputMode);
+		}	
+	}
+	
+
+// ---------------------------------------------------------------------------
+// CPtiCoreLanguage::RemoveCore
+// 
+// ---------------------------------------------------------------------------
+// 	
+EXPORT_C void CPtiCoreLanguage::RemoveCore(MPtiCore* aCore)
+	{
+	for (TInt i = 0; i < iCores.Count(); i++)	
+		{
+		if (iCores[i].iCore == aCore)	
+			{
+			iCores.Remove(i);
+			i--;			
+			}		
+		}	
+	}
+	
+	
+// ---------------------------------------------------------------------------
+// CPtiCoreLanguage::GetCoreForNumericMode
+// 
+// ---------------------------------------------------------------------------
+// 	
+CPtiCore* CPtiCoreLanguage::GetCoreForNumericMode() const
+	{
+	for (TInt i = 0; i < iCores.Count(); i++)	
+		{
+		if (iCores[i].iInputMode == EPtiEngineNumeric)	
+			{
+			return static_cast<CPtiCore*>(iCores[i].iCore);						
+			}		
+		}		
+	
+	return NULL;
+	}
+	
+	
+// ---------------------------------------------------------------------------
+// CPtiCoreLanguage::LoadKeymappingsL
+// 
+// ---------------------------------------------------------------------------
+// 	
+void CPtiCoreLanguage::LoadKeymappingsL() const
+	{	
+	__ASSERT_DEBUG(iHolder, User::Panic(KPtiEngineLangPanic, KErrCorrupt));		
+	
+    iHolder->Clear();
+    
+	delete iKeyMapData;
+	iKeyMapData = NULL; 
+	
+	if (iDataFactory)
+	    {	    		
+	    CPtiCore* defaultCore = GetCoreForNumericMode();	
+	    iKeyMapData = static_cast<CPtiKeyMapData*>(iDataFactory->KeyMapDataForLanguageL(iLanguageCode));
+	    if (iKeyMapData)
+		    {
+		    if (iKeyMapData->HasKeyData(EPtiKeyboard12Key))	
+			    {				
+			    iHolder->iKeyMappings = CPtiKeyMappings::NewL(iKeyMapData);
+			    SetCoreLocal(defaultCore, EPtiEngineMultitapping);					
+			    }
+		    if (iKeyMapData->HasKeyData(EPtiKeyboardQwerty4x12) ||
+		        iKeyMapData->HasKeyData(EPtiKeyboardQwerty4x10) ||
+		        iKeyMapData->HasKeyData(EPtiKeyboardQwerty3x11))							
+			    {					
+			    SetCoreLocal(defaultCore, EPtiEngineQwerty);													
+			    iHolder->iQwertyKeyMappings = CPtiQwertyKeyMappings::NewL(iKeyMapData);					
+			    }
+		    if (iKeyMapData->HasKeyData(EPtiKeyboardHalfQwerty))							
+			    {					
+			    SetCoreLocal(defaultCore, EPtiEngineHalfQwerty);																
+		        iHolder->iHalfQwertyMappings = CPtiHalfQwertyKeyMappings::NewL(iKeyMapData);									    				  
+			    }																			
+		    }		
+	    }
+						
+	}
+	
+	
+// ---------------------------------------------------------------------------
+// CPtiCoreLanguage::SetCoreLocal
+// 
+// ---------------------------------------------------------------------------
+// 	
+void CPtiCoreLanguage::SetCoreLocal(MPtiCore *aCore, TPtiEngineInputMode aMode) const
+	{
+	if (aMode > EPtiEngineInputModeNone && aMode <= EPtiEngineMaxInputModes)
+		{
+		for (TInt i = 0; i < iCores.Count(); i++)
+			{
+			if (iCores[i].iInputMode == aMode)
+				{
+				iCores[i].iCore = aCore;
+				return;
+				}				
+			}
+
+		TPtiCoreBinding binding;
+		binding.iCore = aCore;
+		binding.iInputMode = aMode;
+		// If this fails, then it just fails.
+		iCores.Append(binding);
+		}
+	}
+	
+	
+// ---------------------------------------------------------------------------
+// CPtiCoreLanguage::GetHalfQwertyKeymappings
+// 
+// ---------------------------------------------------------------------------
+// 		
+EXPORT_C MPtiKeyMappings* CPtiCoreLanguage::GetHalfQwertyKeymappings() const
+    {
+	__ASSERT_DEBUG(iHolder, User::Panic(KPtiEngineLangPanic, KErrCorrupt));	
+        
+	if (!iKeyMapData)	
+		{
+	    if (!iDataFactory)
+		    {
+		    CPtiDefaultCore* defaultCore = static_cast<CPtiDefaultCore*> (GetCoreForNumericMode());
+		    if (defaultCore)
+		        {
+		        TRAPD(err, defaultCore->LoadFactoryForLanguageL(LanguageCode()));
+		        if(err != KErrNone)
+		        	{
+		        	return NULL;
+		        	}
+		        }
+            else
+                {
+                return NULL;
+                }		        
+		    }  		
+		TRAP_IGNORE(LoadKeymappingsL());	
+		}
+	
+	return iHolder->iHalfQwertyMappings;	    
+    }				
+
+
+// ---------------------------------------------------------------------------
+// CPtiCoreLanguage::SetHalfQwertyKeyMappings
+// 
+// ---------------------------------------------------------------------------
+// 			
+EXPORT_C void CPtiCoreLanguage::SetHalfQwertyKeyMappings(MPtiKeyMappings* aMappings)
+    {
+	__ASSERT_DEBUG(iHolder, User::Panic(KPtiEngineLangPanic, KErrCorrupt));	    
+    
+	delete iHolder->iHalfQwertyMappings;
+	iHolder->iHalfQwertyMappings = aMappings;    
+    }
+
+
+// ---------------------------------------------------------------------------
+// CPtiCoreLanguage::SetHalfQwertyKeyMappings
+// 
+// ---------------------------------------------------------------------------
+// 	
+EXPORT_C void CPtiCoreLanguage::ClearHalfQwerty()
+    {
+	__ASSERT_DEBUG(iHolder, User::Panic(KPtiEngineLangPanic, KErrCorrupt));		
+	
+	delete iHolder->iHalfQwertyMappings;
+	iHolder->iHalfQwertyMappings = NULL;    
+    }
+
+
+// ---------------------------------------------------------------------------
+// CPtiCoreLanguage::SetKeyMapDataFactory
+// 
+// ---------------------------------------------------------------------------
+//	
+void CPtiCoreLanguage::SetKeyMapDataFactory(CPtiKeyMapDataFactory* aFactory)
+    {
+    if (iDataFactory != aFactory)
+        {
+        iHolder->Clear();       
+	    delete iKeyMapData;
+    	iKeyMapData = NULL;     		
+        iDataFactory = aFactory;            
+        }
+    }
+    
+    
+// ---------------------------------------------------------------------------
+// CPtiCoreLanguage::DataFactory
+// 
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CPtiKeyMapDataFactory* CPtiCoreLanguage::DataFactory() const
+    {
+    return iDataFactory;    
+    }	
+    
+    
+// ---------------------------------------------------------------------------
+// CPtiCoreLanguage::DataFactory
+// 
+// ---------------------------------------------------------------------------
+//    
+EXPORT_C CPtiKeyMapData* CPtiCoreLanguage::RawKeyMapData() const
+    {
+    return iKeyMapData;
+    }
+
+// End of file