diff -r eb1f2e154e89 -r f5a1e66df979 textinput/ptihangulcore/src/OssHangulInputContext.cpp --- /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;iMOhieoOnTranslate(aAscII,aUcsStr)) ret=ETrue; + } + return ret; + } + +TBool COssHangulInputContext::OnTransition(const TChar& aChar,const TDesC& aPreEdit) + { + TBool ret(EFalse); + for (TInt i=0;iMOhieoOnTransition(aChar,aPreEdit)) ret=ETrue; + } + return ret; + } +