textinput/peninputarc/src/peninputlayouteng/peninputlayouteng.cpp
changeset 0 eb1f2e154e89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/peninputarc/src/peninputlayouteng/peninputlayouteng.cpp	Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,256 @@
+/*
+* Copyright (c) 2005-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:  Implementation for CFepLayoutEngine
+*
+*/
+
+
+#include "peninputlayoutplugininterface.h"
+#include "peninputuilayoutbase.h"
+#include "peninputlayouteng.h"
+#include "peninputimefinder.h"  
+#include <PtiEngine.h>          //CPtiEngine
+
+// ======== LOCAL FUNCTIONS ========
+
+//
+// Cleaup function
+//
+void Cleanup( TAny* aAny )
+    {
+    RImplInfoPtrArray* implArray = 
+        reinterpret_cast< RImplInfoPtrArray*> ( aAny );
+    if(implArray)
+        {
+        implArray->ResetAndDestroy();
+        implArray->Close();            
+        }
+    }
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CFepLayoutEngine::NewL
+// Factory function
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CFepLayoutEngine* CFepLayoutEngine::NewL()
+    {
+    CFepLayoutEngine *engine = new (ELeave) CFepLayoutEngine();
+    CleanupStack::PushL( engine );
+    engine->ConstructL();
+    CleanupStack::Pop(engine); // engine
+    return engine;
+    }
+
+// ---------------------------------------------------------------------------
+// CFepLayoutEngine::NewL
+// Factory function
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CFepLayoutEngine* CFepLayoutEngine::NewL(CPtiEngine* aPtiEngine)
+    {
+    CFepLayoutEngine *engine = new (ELeave) CFepLayoutEngine(aPtiEngine);
+    CleanupStack::PushL( engine );
+    engine->ConstructL();
+    CleanupStack::Pop(engine); // engine
+    return engine;
+    }
+// ---------------------------------------------------------------------------
+// CFepLayoutEngine::CFepLayoutEngine
+// Default constructor
+// ---------------------------------------------------------------------------
+//
+CFepLayoutEngine::CFepLayoutEngine(CPtiEngine* aPtiEngine)
+:iPtiEngine(aPtiEngine)
+    {
+    iLayoutId.iUid=0;
+    }
+
+// ---------------------------------------------------------------------------
+// CFepLayoutEngine::ConstructL
+// 2nd phase Constructor
+// ---------------------------------------------------------------------------
+//
+void CFepLayoutEngine::ConstructL()
+    {
+    FindImeLayoutL(KHwrInputMethodId);
+    iImeFinder = CImePluginFinder::NewL();
+    }
+
+
+// ---------------------------------------------------------------------------
+// CFepLayoutEngine::~CFepLayoutEngine
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CFepLayoutEngine::~CFepLayoutEngine()
+    {
+    iLayoutIdList.Reset();
+    delete iCurInterface;
+    iCurInterface = NULL;
+    delete iImeFinder;
+    iTouchSupportLanguages.Close();
+    iImePluginIdList.Close();
+    REComSession::FinalClose();
+    }
+
+// ---------------------------------------------------------------------------
+// CFepLayoutEngine::GetUiLayout
+// Create UI layout
+// ---------------------------------------------------------------------------
+//
+EXPORT_C MPenUiLayoutBase* CFepLayoutEngine::GetUiLayout(TUid aInputMethodId,
+                                 MLayoutOwner* aLayoutOwner,const TAny* aData)
+    {
+    MPenUiLayoutBase* uiLayout=NULL;
+    if(aInputMethodId != iLayoutId)
+        {
+        iLayoutId = aInputMethodId;
+        delete iCurInterface;
+        iCurInterface = NULL;
+
+        if( aInputMethodId == TUid::Null() ) 
+            { 
+            return NULL; 
+            } 
+            
+        TUid destructor_ID_Key;
+        TAny* pFunc = NULL;
+        TRAPD(err, 
+            pFunc = REComSession::CreateImplementationL(aInputMethodId, 
+                                                           destructor_ID_Key)
+                                                           );
+        
+       
+        if(err != KErrNone)
+            return NULL;
+        else
+            iCurInterface = reinterpret_cast<CFepUiLayoutInterface*>(pFunc);
+                                                       
+        iCurInterface->SetDestructorKey(destructor_ID_Key);
+           
+        }
+        
+    if(iCurInterface)
+        {
+        TRAP_IGNORE(uiLayout = iCurInterface->
+                                     CreateFepUiLayoutL(aLayoutOwner,aData));
+        }
+                
+    return uiLayout;
+    }   
+      
+// ---------------------------------------------------------------------------
+// CFepLayoutEngine::FindImeLayoutL
+// Find layout for a input mode
+// ---------------------------------------------------------------------------
+//
+void CFepLayoutEngine::FindImeLayoutL(TInt aInputMethodId)
+    {
+    
+    if(iInputMethodId == aInputMethodId)
+        return;
+    
+    iInputMethodId = aInputMethodId;
+    
+    RImplInfoPtrArray infoArray;
+    TInt i;
+
+    iLayoutIdList.Reset();
+
+    CleanupStack::PushL( TCleanupItem( Cleanup, &infoArray ) );
+    
+    TUid id;
+    id.iUid = aInputMethodId;
+    
+    REComSession::ListImplementationsL(id, infoArray);
+
+    for (i = 0; i < infoArray.Count(); i++)
+        {
+        iLayoutIdList.AppendL(infoArray[i]->ImplementationUid().iUid);
+        }
+
+    CleanupStack::PopAndDestroy(&infoArray); // infoArray    
+    
+    }
+
+// ---------------------------------------------------------------------------
+// CFepLayoutEngine::UiLayoutListL
+// Get the layout list
+// ---------------------------------------------------------------------------
+//
+EXPORT_C const RArray<TInt>& CFepLayoutEngine::UiLayoutListL(TInt aInputMethodId)
+    {
+    FindImeLayoutL(aInputMethodId);
+    return iLayoutIdList;
+    }
+    
+// ---------------------------------------------------------------------------
+// CFepLayoutEngine::ImePluginListL
+// Get the IME plugin list by required mode
+// ---------------------------------------------------------------------------
+//
+EXPORT_C const RArray<TInt>& CFepLayoutEngine::ImePluginListL(TInt aLanguage, TInt aPluginMode)
+    {
+    if( !iImeFinder->Initialized() )
+        {
+        iImeFinder->InitializeL(iPtiEngine);
+        }
+    
+    iImeFinder->GetImePlugins(aLanguage, aPluginMode, iImePluginIdList);
+    return iImePluginIdList;
+    }
+
+// ---------------------------------------------------------------------------
+// CFepLayoutEngine::TouchSupportLanguagesL
+// Get touch input language list
+// ---------------------------------------------------------------------------
+//
+EXPORT_C const RArray<TInt>& CFepLayoutEngine::TouchSupportLanguagesL()
+    {
+    if( !iImeFinder->Initialized() )
+        {
+        iImeFinder->InitializeL(iPtiEngine);
+        }
+    
+    iImeFinder->SupportLanguages(iTouchSupportLanguages);
+    return iTouchSupportLanguages;
+    }
+
+// ---------------------------------------------------------------------------
+// CFepLayoutEngine::IsSupportPluginMode
+// Get touch input language list
+// ---------------------------------------------------------------------------
+//    
+EXPORT_C TBool CFepLayoutEngine::IsSupportPluginMode( TLanguage aLanguage, TPluginInputMode aMode ) 
+    {
+    return iImeFinder->IsSupportPluginMode( aLanguage, aMode );
+    }
+
+// ---------------------------------------------------------------------------
+// CFepLayoutEngine::InitializeL
+// Initialize finder
+// ---------------------------------------------------------------------------
+//    
+EXPORT_C void CFepLayoutEngine::InitializeL()
+    {
+    if(iPtiEngine && iImeFinder)
+        {
+        iImeFinder->InitializeL(iPtiEngine);
+        }
+    }
+// End of file
+