textinput/ptihangulcore/src/OssHangulInputContext.cpp
branchRCL_3
changeset 3 f5a1e66df979
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/ptihangulcore/src/OssHangulInputContext.cpp	Fri Feb 19 23:09:27 2010 +0200
@@ -0,0 +1,255 @@
+/*
+* Copyright (c) 2005,2006 Choe Hwanjin
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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:
+*
+*/
+
+#include "OssHangulInputContext.h"
+#include "hangul.h"
+#include "OssKeyboard.h"
+#include "OssCombination.h"
+
+_LIT8(KHangulInputContextEventTranslate,"translate");
+_LIT8(KHangulInputContextEventTransition,"transition");
+
+/*
+LOCAL_C HBufC8* AllocStdBufLC(const TDesC8& aStr)
+    {
+    TInt len=aStr.Length()+1;
+    HBufC8* buf=HBufC8::NewLC(len);
+    TPtr8 ptr(buf->Des());
+    ptr.FillZ(len);
+    ptr.Copy(aStr);
+    return buf;
+    }*/
+
+
+LOCAL_C HBufC8* AllocStdBufL(const TDesC8& aStr)
+    {
+    TInt len=aStr.Length()+1;
+    HBufC8* buf=HBufC8::NewL(len);
+    TPtr8 ptr(buf->Des());
+    ptr.FillZ(len);
+    ptr.Copy(aStr);
+    return buf;
+    }
+
+class TLocalStdBuf
+    {
+    public:
+        
+        TLocalStdBuf(const TDesC8& aStr)
+            {
+            TInt len=aStr.Length()+1;
+            iBuf=HBufC8::New(len);
+            if (iBuf!=NULL)
+                {
+                TPtr8 ptr(iBuf->Des());
+                ptr.FillZ(len);
+                ptr.Copy(aStr);
+                }
+            }
+        
+        ~TLocalStdBuf()
+            {
+            delete iBuf;
+            }
+        
+        const char* operator() ()
+            {
+            return (const char*) iBuf->Ptr(); 
+            }
+    
+    private:
+        
+        HBufC8* iBuf;
+    };
+
+
+LOCAL_C TBool CBTranslate(HangulInputContext* ,int aAscII, ucschar* aStr, void* aSelf)
+    {
+    COssHangulInputContext* context=(COssHangulInputContext*)aSelf;
+    return context->OnTranslate(aAscII,TPtrC(aStr));
+    }
+
+LOCAL_C TBool CBTransition(HangulInputContext* ,ucschar aChar, const ucschar* preedit, void* aSelf)
+    {
+    COssHangulInputContext* context=(COssHangulInputContext*)aSelf;
+    return context->OnTransition(aChar,TPtrC(preedit));    
+    }
+
+EXPORT_C COssHangulInputContext* COssHangulInputContext::NewLC(
+        const TDesC8& aKeyboardType)
+    {
+    COssHangulInputContext* self = 
+        new (ELeave) COssHangulInputContext();
+    CleanupStack::PushL(self);
+    self->ConstructL(aKeyboardType);
+    return self;
+    }
+
+EXPORT_C COssHangulInputContext* COssHangulInputContext::NewL(
+        const TDesC8& aKeyboardType)
+    {
+    COssHangulInputContext* self = 
+        COssHangulInputContext::NewLC(aKeyboardType);
+    CleanupStack::Pop(); // self;
+    return self;
+    }
+
+
+COssHangulInputContext::COssHangulInputContext()
+    {
+    }
+
+void COssHangulInputContext::ConstructL(const TDesC8& aKeyboardType)
+    {
+    // Null termination string for standard library
+    //iKeyboardType=AllocStdBufLC(aKeyboardType);
+    iKeyboardType=AllocStdBufL(aKeyboardType);
+    iHic=hangul_ic_new((const char*)iKeyboardType->Ptr());
+    //CleanupStack::Pop(iKeyboardType);
+    }
+
+EXPORT_C COssHangulInputContext::~COssHangulInputContext()
+    {
+    hangul_ic_delete(iHic);
+    delete iKeyboardType;
+    }
+
+EXPORT_C TBool COssHangulInputContext::Process(const TChar& aAscII)
+    {
+    return hangul_ic_process(iHic,aAscII);
+    }
+
+EXPORT_C void COssHangulInputContext::Reset()
+    {
+    hangul_ic_reset(iHic);
+    }
+
+EXPORT_C TBool COssHangulInputContext::BackSpace()
+    {
+    return hangul_ic_backspace(iHic);
+    }
+
+EXPORT_C TBool COssHangulInputContext::IsEmpty()
+    {
+    return hangul_ic_is_empty(iHic);
+    }
+
+EXPORT_C TBool COssHangulInputContext::HasChoseong()
+    {
+    return hangul_ic_has_choseong(iHic);
+    }
+
+EXPORT_C TBool COssHangulInputContext::HasJungseong()
+    {
+    return hangul_ic_has_jungseong(iHic);
+    }
+
+EXPORT_C TBool COssHangulInputContext::HasJongseong()
+    {
+    return hangul_ic_has_jongseong(iHic);
+    }
+
+EXPORT_C void COssHangulInputContext::SetOutputMode(const TInt& aMode)
+    {
+    hangul_ic_set_output_mode(iHic,aMode);
+    }
+
+EXPORT_C void COssHangulInputContext::SetKeyboard(const COssKeyboard& aOssKeyboard)
+    {
+    hangul_ic_set_keyboard(iHic,aOssKeyboard.iHangulKeyboard);
+    }
+
+EXPORT_C void COssHangulInputContext::SelectKeyboard(const TDesC8& aId)
+    {
+    TLocalStdBuf buf(aId);
+    hangul_ic_select_keyboard(iHic,buf());
+    }
+
+EXPORT_C void COssHangulInputContext::SetCombinationL(COssCombination& aOssCombination)
+    {
+    aOssCombination.PopulateListL();
+    hangul_ic_set_combination(iHic,aOssCombination.iHangulCombination);
+    }
+
+EXPORT_C void COssHangulInputContext::AddEventObserver(MOssHangulInputEventObserver* aObserver)
+    {
+    __ASSERT_ALWAYS(
+        iObservers.Find(aObserver)==KErrNotFound,
+        User::Panic(_L("libhangul_symbian"),__LINE__));
+    
+    hangul_ic_connect_callback(
+        iHic,
+        (const char *)KHangulInputContextEventTranslate().Ptr(),
+        (void*)CBTranslate, 
+        this);
+    
+    hangul_ic_connect_callback(
+        iHic,
+        (const char *)KHangulInputContextEventTransition().Ptr(),
+        (void*)CBTransition, 
+        this);
+    
+    iObservers.Append(aObserver);
+    }
+
+EXPORT_C void COssHangulInputContext::RemoveEventObserver(MOssHangulInputEventObserver* aObserver)
+    {
+    TInt index(iObservers.Find(aObserver));
+    if (index!=KErrNotFound)
+        {
+        iObservers.Remove(index);        
+        }
+    }
+
+EXPORT_C TPtrC COssHangulInputContext::GetPreeditString()
+    {
+    TPtrC ret(hangul_ic_get_preedit_string(iHic));
+    return ret;
+    }
+
+EXPORT_C TPtrC COssHangulInputContext::GetCommitString()
+    {
+    TPtrC ret(hangul_ic_get_commit_string(iHic));
+    return ret;
+    }
+
+EXPORT_C TPtrC COssHangulInputContext::Flush()
+    {
+    TPtrC ret(hangul_ic_flush(iHic));
+    return ret;
+    }
+
+TBool COssHangulInputContext::OnTranslate(const TChar& aAscII,const TDesC& aUcsStr)
+    {
+    TBool ret(EFalse);
+    for (TInt i=0;i<iObservers.Count();i++)
+        {
+        if (iObservers[i]->MOhieoOnTranslate(aAscII,aUcsStr)) ret=ETrue;
+        }
+    return ret;
+    }
+
+TBool COssHangulInputContext::OnTransition(const TChar& aChar,const TDesC& aPreEdit)
+    {
+    TBool ret(EFalse);
+    for (TInt i=0;i<iObservers.Count();i++)
+        {
+        if (iObservers[i]->MOhieoOnTransition(aChar,aPreEdit)) ret=ETrue;
+        }
+    return ret;
+    }
+