/**
 * Copyright (C) 2009 Samsung Electronics Co., Ltd. All rights reserved.
 *
 * Mobile Communication Division,
 * Digital Media & Communications Business, Samsung Electronics Co., Ltd.
 *
 * This software and its documentation are confidential and proprietary
 * information of Samsung Electronics Co., Ltd.  No part of the software and
 * documents may be copied, reproduced, transmitted, translated, or reduced to
 * any electronic medium or machine-readable form without the prior written
 * consent of Samsung Electronics.
 *
 * Samsung Electronics makes no representations with respect to the contents,
 * and assumes no responsibility for any errors that might appear in the
 * software and documents. This publication and the contents hereof are subject
 * to change without notice.
 */

#include "com_xt9_Xt9core.h"
#include "et9api.h"

#ifdef ET9_KDB_MODULE
#include "et9kdbUtil.h"
#endif
#ifdef ET9_ALPHABETIC_MODULE
#include "et9alphaUtil.h"
#endif
#ifdef ET9_KOREAN_MODULE
#include "et9hangulUtil.h"
#endif
#ifdef ET9_HANDWRITING_MODULE
#include "et9hwrUtil.h"
#endif
#include "et9imuUtil.h"
#include "et9cmmUtil.h"

/*----------------------------------------------------------------------------
 * External Functions
 *----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------
 * External Variables
 *----------------------------------------------------------------------------*/
#ifdef ET9_ALPHABETIC_MODULE
extern ET9AWLingCmnInfo g_pLingCmnInfo;
extern ET9AWWordInfo*    g_pWordInfo;
#if 0 
extern ET9AWCDBInfo     g_pCDBInfo;
extern ET9AWRUDBInfo    g_pRUDBInfo;
extern ET9AWASDBInfo    g_pASDBInfo;
#endif

ET9U8 *g_pCdbInfo = NULL;
ET9U8 *g_pRudbInfo = NULL;
ET9U8 *g_pAsdbInfo = NULL;
#endif

#ifdef ET9_KOREAN_MODULE
extern ET9KLingInfo     g_KLingInfo;
extern ET9KHangulWord   g_KHangulWord;
ET9U8 *g_pKRudbInfo = NULL;
#endif

/*----------------------------------------------------------------------------
 * Global Variables
 *----------------------------------------------------------------------------*/
#ifdef ET9_KDB_MODULE
ET9KDBInfo        g_KdbInfo;
ET9Region         g_KeyRegion;
#endif

#ifdef ET9_ALPHABETIC_MODULE
ET9AWLingInfo       g_pLingInfo;
ET9AWPrivWordInfo   g_PrivWordInfo[ET9MAXSELLISTSIZE];
ET9AWTUDBNextRecord g_pNextRecord;
#endif

#ifdef ET9_HANDWRITING_MODULE
ET9AWHwrInfo      g_pHwrInfo;
#endif

#ifdef ET9_CHINESE_MODULE
ET9CPLingInfo 	g_CPLingInfo;
ET9CPPhrase 		g_CPPhrase;
ET9CPSpell		g_CPSpell;
ET9U8 			*g_pCPUdbInfo = NULL;
#endif

ET9WordSymbInfo   g_WordSymbInfo;
ET9TracePoint	g_TracePoint[ET9_TRACE_MAX_POINTS];

typedef struct _ET9BackupInfo {
	ET9U8			nTotalWords;
	ET9U8			nActivewordIndex;
	ET9AWLingInfo	LingInfo;
	ET9AWWordInfo	WordInfo;
	ET9AWLingCmnInfo	LingCmnInfo;
	ET9AWPrivWordInfo	WordList[ET9MAXSELLISTSIZE];
}ET9BackupInfo;

typedef struct _ET9KBackupInfo {
	ET9U8			nTotalWords;
	ET9U8			nActivewordIndex;
	ET9KLingInfo		KLingInfo;
	ET9KHangulWord	HangulWord;
}ET9KBackupInfo;

ET9BackupInfo	g_BackupInfo;
ET9KBackupInfo	g_KBackupInfo;
ET9BOOL			g_bIsBackUpAvailable = 0;
/*----------------------------------------------------------------------------
 * Macros
 *----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------
 * function definition
 *----------------------------------------------------------------------------*/
JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9InitCallback (
		JNIEnv		*env,
		jclass		jcls,
		jobject		jobj_callback)
{
	jshort wStatus = ET9STATUS_ERROR;	

#ifdef SUPPORT_CALLBACK
	wStatus = ET9InitCallback(env, jobj_callback);
#endif
	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9ClearCallback (
		JNIEnv		*env,
		jclass		jcls)
{
	jshort wStatus = ET9STATUS_ERROR;	

#ifdef SUPPORT_CALLBACK
	wStatus = ET9ClearCallback(env);
#endif
	return wStatus;
}

JNIEXPORT jlong JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_GetCurrentTimeMillis (
		JNIEnv		*env,
		jclass		jcls)
{
#ifdef SUPPORT_CALLBACK
	return GetCurrentTimeMillis();
#else
	return -1;
#endif
}

/*----------------------------------------------------------------------------
 *  Generic Input Module ** ALWAYS IN **
 *----------------------------------------------------------------------------*/

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9WordSymbInit (
		JNIEnv		*env,
		jclass		jcls,
		jbyte		bResetWordSymbInfo)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9WordSymbInit(&g_WordSymbInfo, bResetWordSymbInfo);

	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9ClearOneSymb (
		JNIEnv		*env,
		jclass		jcls)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9ClearOneSymb(&g_WordSymbInfo);
	g_bIsBackUpAvailable = 0;
	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9ClearAllSymbs (
		JNIEnv		*env,
		jclass		jcls)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9ClearAllSymbs(&g_WordSymbInfo);
	g_bIsBackUpAvailable = 0;
	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9DeleteSymbs (
		JNIEnv		*env,
		jclass		jcls,
		jbyte		bIndex,
		jbyte		bCount)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9DeleteSymbs(&g_WordSymbInfo, bIndex, bCount);

	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AddExplicitSymb (
		JNIEnv	 *env,
		jclass	 jcls,
		jshort	 sSymb,
		jbyte	 eShiftState,
		jbyte	 bCurrIndexList)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9AddExplicitSymb(&g_WordSymbInfo, sSymb, eShiftState, bCurrIndexList);

	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AddCustomSymbolSet (
		JNIEnv		*env,
		jclass		jcls,
		jshortArray	psSymbs,
		jbyteArray	pbSymbProbs,
		jint		nNumSymbsInSet,
		jbyte		eShiftState,
		jbyte		bCurrIndexInList)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9SYMB *_psSymbs = (ET9SYMB *)(*env)->GetShortArrayElements(env, psSymbs, NULL);
	ET9U8 *_pbSymbProbs = (ET9U8 *)(*env)->GetByteArrayElements(env, pbSymbProbs, NULL);

	wStatus = ET9AddCustomSymbolSet(&g_WordSymbInfo, _psSymbs, _pbSymbProbs, nNumSymbsInSet, eShiftState, bCurrIndexInList);

	(*env)->ReleaseShortArrayElements(env, psSymbs, (jshort *)_psSymbs, 0);
	(*env)->ReleaseByteArrayElements(env, pbSymbProbs, (jbyte *)_pbSymbProbs, 0);

	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9GetExactWord (
		JNIEnv		*env,
		jclass		jcls,
		jobject		jobj_pWord)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9SimpleWord tSimpleWord;
	void *pConvertSymbInfo = NULL; // TODO:voidp

	/* get fields */
	ET9Word_GetSimpleWords(env, jcls, &tSimpleWord, jobj_pWord);

	wStatus = ET9GetExactWord(&g_WordSymbInfo, &tSimpleWord, ET9_ConvertSymb, pConvertSymbInfo);

	/* set fields */
	ET9Word_SetSimpleWords(env, jcls, &jobj_pWord, tSimpleWord);

	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9LockWord(
		JNIEnv		*env,
		jclass		jcls,
		jobject		jobj_pWord)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9SimpleWord tSimpleWord;

	/* get fields */
	ET9Word_GetSimpleWords(env, jcls, &tSimpleWord, jobj_pWord);

	wStatus = ET9LockWord(&g_WordSymbInfo, &tSimpleWord);

	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9SetNextLocking(
		JNIEnv		*env,
		jclass		jcls)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9SetNextLocking(&g_WordSymbInfo);

	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9ClearNextLocking(
		JNIEnv		*env,
		jclass		jcls)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9ClearNextLocking(&g_WordSymbInfo);

	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9GetAutoCapSituation(
		JNIEnv		*env,
		jclass		jcls,
		jbyteArray	pbAutoCap)
{
	jshort wStatus = ET9STATUS_NONE;
	void *pBufferReadInfo = NULL; // TODO:voidp
	ET9BOOL *_pbAutoCap = (ET9BOOL *)(*env)->GetByteArrayElements(env, pbAutoCap, NULL);
	
	wStatus = ET9GetAutoCapSituation(&g_WordSymbInfo, _pbAutoCap, ET9_BufFreeRead, pBufferReadInfo);

	(*env)->ReleaseByteArrayElements(env, pbAutoCap, (jbyte *)_pbAutoCap, 0);

	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9SetUnShift(
		JNIEnv		*env,
		jclass		jcls)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9SetUnShift(&g_WordSymbInfo);

	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9SetShift(
		JNIEnv		*env,
		jclass		jcls)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9SetShift(&g_WordSymbInfo);

	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9SetCapsLock(
		JNIEnv		*env,
		jclass		jcls)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9SetCapsLock(&g_WordSymbInfo);

	return wStatus;
}

JNIEXPORT jint JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9GetStateBits(
		JNIEnv		*env,
		jclass		jcls)
{
	return (jint) g_WordSymbInfo.dwStateBits;
}

#ifdef ET9_KDB_MODULE
/*----------------------------------------------------------------------------
 *  KDB Input Module  ** REMOVABLE **
 *----------------------------------------------------------------------------*/
JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KDB_1Init
  (JNIEnv *env, jclass jcls, 
  jshort wFirstKdbNum, 
  jshort wFirstPageNum, 
  jshort wSecondKdbNum, 
  jshort wSecondPageNum
  )
{
	jshort wStatus = ET9STATUS_ERROR;
	void* pPublicExt      = NULL; // TODO:voidp

	wStatus = ET9KDB_Init(&g_KdbInfo, wFirstKdbNum, wFirstPageNum, wSecondKdbNum, wSecondPageNum, NULL,
		ET9KDBReadData, ET9Handle_KDB_Request, pPublicExt);

	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KDB_1Validate
  (JNIEnv *env, jclass jcls,
  jshort wKdbNum
  )
{
	jshort wStatus = ET9STATUS_ERROR;

	wStatus = ET9KDB_Validate(&g_KdbInfo, wKdbNum, NULL, ET9KDBReadData);

	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KDB_1GetKdbVersion
  (JNIEnv *env, jclass jcls, 
  jshortArray psKdbVerBuf, 
  jshort wBufMaxSize, 
  jshortArray pwBufSize
  )
{
	jshort wStatus = ET9STATUS_ERROR;
	ET9SYMB *_psKdbVerBuf = (ET9SYMB *)(*env)->GetShortArrayElements(env, psKdbVerBuf, NULL);
	ET9U16 *_pwBufSize = (ET9U16 *)(*env)->GetShortArrayElements(env, pwBufSize, NULL);

	wStatus = ET9KDB_GetKdbVersion(&g_KdbInfo, _psKdbVerBuf, wBufMaxSize, _pwBufSize);

	(*env)->ReleaseShortArrayElements(env, psKdbVerBuf,(jshort*)_psKdbVerBuf, 0);
	(*env)->ReleaseShortArrayElements(env, pwBufSize, (jshort*)_pwBufSize, 0);
	
	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KDB_1SetKdbNum
  (JNIEnv *env, jclass jcls,
  jshort wFirstKdbNum, 
  jshort wFirstPageNum,
  jshort wSecondKdbNum,
  jshort wSecondPageNum
  )
{
	jshort wStatus = ET9STATUS_ERROR;
	
	wStatus = ET9KDB_SetKdbNum(&g_KdbInfo,  wFirstKdbNum, wFirstPageNum, wSecondKdbNum, wSecondPageNum);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KDB_1GetKdbNum
  (JNIEnv *env, jclass jcls, 
  jshortArray pwFirstKdbNum, 
  jshortArray pwSecondKdbNum
  )
{
	jshort wStatus = ET9STATUS_ERROR;
	ET9U16 *_pwFirstKdbNum = (ET9U16 *)(*env)->GetShortArrayElements(env, pwFirstKdbNum, NULL);
	ET9U16 *_pwSecondKdbNum = (ET9U16 *)(*env)->GetShortArrayElements(env, pwSecondKdbNum, NULL);

	wStatus = ET9KDB_GetKdbNum(&g_KdbInfo, _pwFirstKdbNum, _pwSecondKdbNum);

	(*env)->ReleaseShortArrayElements(env, pwFirstKdbNum, (jshort *)_pwFirstKdbNum, 0);
	(*env)->ReleaseShortArrayElements(env, pwSecondKdbNum, (jshort *)_pwSecondKdbNum, 0);


	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KDB_1SetPageNum
  (JNIEnv *env, jclass jcls,
  jshort wFirstPageNum, 
  jshort wSecondPageNum
  )
{
	jshort wStatus = ET9STATUS_ERROR;

	wStatus = ET9KDB_SetPageNum(&g_KdbInfo,wFirstPageNum,wSecondPageNum);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KDB_1GetPageNum
  (JNIEnv *env, jclass jcls, 
  jshortArray pwFirstPageNum, 
  jshortArray pwSecondPageNum
  )
{
	jshort wStatus = ET9STATUS_ERROR;
	ET9U16 *_pwFirstPageNum = (ET9U16 *)(*env)->GetShortArrayElements(env, pwFirstPageNum, NULL);
	ET9U16 *_pwSecondPageNum = (ET9U16 *)(*env)->GetShortArrayElements(env, pwSecondPageNum, NULL);

	wStatus = ET9KDB_GetPageNum(&g_KdbInfo, _pwFirstPageNum, _pwSecondPageNum);

	(*env)->ReleaseShortArrayElements(env, pwFirstPageNum, (jshort *)_pwFirstPageNum, 0);
	(*env)->ReleaseShortArrayElements(env, pwSecondPageNum, (jshort*)_pwSecondPageNum, 0);

	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KDB_1TimeOut
  (JNIEnv *env, jclass jclss)
{
	jshort wStatus = ET9STATUS_ERROR;

	wStatus = ET9KDB_TimeOut(&g_KdbInfo, &g_WordSymbInfo);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KDB_1SetAmbigMode
  (JNIEnv *env, jclass jcls,
  jshort wFirstPageNum, 
  jshort wSecondPageNum
  )
{
	jshort wStatus = ET9STATUS_ERROR;

	wStatus = ET9KDB_SetAmbigMode(&g_KdbInfo, wFirstPageNum, wSecondPageNum, &g_WordSymbInfo);
	
	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KDB_1SetMultiTapMode
  (JNIEnv *env, jclass jcls,
  jshort wFirstPageNum, 
  jshort wSecondPageNum
  )
{
	jshort wStatus = ET9STATUS_ERROR;
	
	wStatus = ET9KDB_SetMultiTapMode(&g_KdbInfo, wFirstPageNum, wSecondPageNum, &g_WordSymbInfo);
	
	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KDB_1SetRegionalMode
  (JNIEnv *env, jclass jclss)
{
	jshort wStatus = ET9STATUS_ERROR;

	wStatus = ET9KDB_SetRegionalMode(&g_KdbInfo);

	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KDB_1SetDiscreteMode
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_ERROR;

	wStatus = ET9KDB_SetDiscreteMode(&g_KdbInfo);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KDB_1ProcessTap
  (JNIEnv *env, jclass jcls,
  jshort wX,
  jshort wY, 
  jbyte bCurrIndexInList,
  jshortArray psFunctionKey
  )
{
	jshort wStatus = ET9STATUS_ERROR;
	ET9SYMB *_psFunctionKey = (ET9SYMB *)(*env)->GetShortArrayElements(env, psFunctionKey, NULL);

	wStatus = ET9KDB_ProcessTap(&g_KdbInfo, &g_WordSymbInfo, wX, wY, bCurrIndexInList, _psFunctionKey);

	(*env)->ReleaseShortArrayElements(env, psFunctionKey, (jshort *)_psFunctionKey, 0);
	
	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KDB_1ProcessKey
  (JNIEnv *env, jclass jcls,
  jshort wKeyIndex,
  jbyte bCurrIndexInList,
  jshortArray psFunctionKey
  )
{
	jshort wStatus = ET9STATUS_ERROR;
	ET9SYMB *_psFunctionKey = (ET9SYMB *)(*env)->GetShortArrayElements(env, psFunctionKey, NULL);

	wStatus = ET9KDB_ProcessKey(&g_KdbInfo, &g_WordSymbInfo, wKeyIndex, bCurrIndexInList, _psFunctionKey);

	(*env)->ReleaseShortArrayElements(env, psFunctionKey, (jshort *)_psFunctionKey, 0);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KDB_1ProcessKeyBySymbol
  (JNIEnv *env, jclass jcls,
  jshort sSymbol, 
  jbyte bCurrIndexInList,
  jshortArray psFunctionKey,
  jboolean bInitialSymCheck
  )
{
	jshort wStatus = ET9STATUS_ERROR;
	ET9SYMB *_psFunctionKey = (ET9SYMB *)(*env)->GetShortArrayElements(env, psFunctionKey, NULL);

	wStatus = ET9KDB_ProcessKeyBySymbol(&g_KdbInfo, &g_WordSymbInfo, sSymbol, bCurrIndexInList, _psFunctionKey, bInitialSymCheck);
	
	(*env)->ReleaseShortArrayElements(env, psFunctionKey, (jshort *)_psFunctionKey, 0);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KDB_1NextDiacritic
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_ERROR;
	
	wStatus = ET9KDB_NextDiacritic(&g_KdbInfo, &g_WordSymbInfo);
	
	return wStatus;	
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KDB_1GetTapKeyRegion
  (JNIEnv *env, jclass jcls, 
  jshort wX, 
  jshort wY, 
  jobject pKeyRegion
  )
{
	jshort wStatus = ET9STATUS_ERROR;
	/* get fields */
	ET9_GetKeyRegion(env, jcls, &g_KeyRegion, pKeyRegion);
	
	//unused function
	//wStatus = ET9KDB_GetTapKeyRegion(&g_KdbInfo, wX, wY, &g_KeyRegion);
	
	/* set fields */
	ET9_SetKeyRegion(env, jcls, &pKeyRegion, g_KeyRegion);

	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KDB_1ReselectWord
  (JNIEnv *env, jclass jcls,
  jcharArray psWord, 
  jshort wWordLen
  )
{
	jshort wStatus = ET9STATUS_ERROR;
	ET9SYMB *_psWord = (ET9SYMB *)(*env)->GetCharArrayElements(env, psWord, NULL);

	wStatus = ET9KDB_ReselectWord(&g_KdbInfo, &g_WordSymbInfo, _psWord,wWordLen);

	(*env)->ReleaseCharArrayElements(env, psWord, (jchar *)_psWord, 0);
	
	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KDB_1SetConvertSymb
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_ERROR;
	void* pConvertSymbInfo      = NULL; // TODO:voidp

	wStatus = ET9KDB_SetConvertSymb(&g_KdbInfo, ET9ConvertSymb, pConvertSymbInfo);
	
	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KDB_1GetMultiTapSequence
  (JNIEnv *env, jclass jcls,
  jshortArray psMultiTapSequenceBuf,
  jshort wBufSize,
  jshortArray pwTotalSymbs,
  jbyteArray pbCurrentSelSymb
  )
{
	jshort wStatus = ET9STATUS_ERROR;
	ET9SYMB *_psMultiTapSequenceBuf = (ET9SYMB *)(*env)->GetShortArrayElements(env, psMultiTapSequenceBuf, NULL);
	ET9U16* _pwTotalSymbs= (ET9U16*)(*env)->GetShortArrayElements(env, pwTotalSymbs, NULL);
	ET9U8* _pbCurrentSelSymb= (ET9U8*)(*env)->GetByteArrayElements(env, pbCurrentSelSymb, NULL);

	wStatus = ET9KDB_GetMultiTapSequence(&g_KdbInfo,_psMultiTapSequenceBuf,wBufSize,_pwTotalSymbs,_pbCurrentSelSymb);

	(*env)->ReleaseShortArrayElements(env, psMultiTapSequenceBuf, (jshort *)_psMultiTapSequenceBuf, 0);
	(*env)->ReleaseShortArrayElements(env, pwTotalSymbs, (jshort *)_pwTotalSymbs, 0);
	(*env)->ReleaseByteArrayElements(env, pbCurrentSelSymb, (jbyte *)_pbCurrentSelSymb, 0);
	
	return wStatus;	
}

JNIEXPORT jint JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KDB_1GetStateBits
  (JNIEnv *env, jclass jcls)
{
	return (jint)g_KdbInfo.dwStateBits;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KDB_1SetLocale
  (JNIEnv *env, jclass jcls, jshort wLocale)
{
	jshort wStatus = ET9STATUS_NONE;
	wStatus = ET9KDB_SetLocale(&g_KdbInfo, &g_WordSymbInfo, wLocale);
	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KDB_1SetKeyboardSize
  (JNIEnv *env, jclass jcls,
  jshort wLayoutWidth,
  jshort wLayoutHeight)
{
	jshort wStatus = ET9STATUS_NONE;
	wStatus = ET9KDB_SetKeyboardSize(&g_KdbInfo, wLayoutWidth, wLayoutHeight);
	return wStatus;
}
#endif // ET9_KDB_MODULE

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWSysSetAutoSpace
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	wStatus = ET9AWSysSetAutoSpace(&g_pLingInfo);
	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9GetCodeVersion
  (JNIEnv *env, jclass jcls, 
  jshortArray   psCodeVerBuf,
  jshort        wBufMaxSize,
  jshortArray   pwBufSize)
{
	jshort wStatus = ET9STATUS_NONE;

	ET9SYMB *_psCodeVerBuf = (ET9SYMB *)(*env)->GetShortArrayElements(env, psCodeVerBuf, NULL);
	ET9U16 *_pwBufSize = (ET9U16 *)(*env)->GetShortArrayElements(env, pwBufSize, NULL);

	wStatus = ET9GetCodeVersion(_psCodeVerBuf, wBufMaxSize, _pwBufSize);

	(*env)->ReleaseShortArrayElements(env, psCodeVerBuf, (jshort *)_psCodeVerBuf, 0);
	(*env)->ReleaseShortArrayElements(env, pwBufSize, (jshort *)_pwBufSize, 0);

	return wStatus;	
}

#ifdef ET9_ALPHABETIC_MODULE
/*----------------------------------------------------------------------------
 *  Alpha MDB description.
 *----------------------------------------------------------------------------*/
JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9SetDownshiftDefault
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9SetDownshiftDefault(&g_pLingInfo);

	return wStatus;	
}
JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9ClearDownshiftDefault
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9ClearDownshiftDefault(&g_pLingInfo);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9SetDownshiftAllLDBWords
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9SetDownshiftAllLDBWords(&g_pLingInfo);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9ClearDownshiftAllLDBWords
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9ClearDownshiftAllLDBWords(&g_pLingInfo);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWSysSetWordStemsPoint
  (JNIEnv *env, jclass jcls, jshort wWordStemsPoint)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9AWSysSetWordStemsPoint(&g_pLingInfo, wWordStemsPoint);

	return wStatus;	
}

/*----------------------------------------------------------------------------
 *  Define ET9 Alphabetic system structures and functions
 *----------------------------------------------------------------------------*/

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWSysSetWordCompletionPoint
  (JNIEnv *env, jclass jcls, jshort wWordCompletionPoint)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9AWSysSetWordCompletionPoint(&g_pLingInfo, wWordCompletionPoint);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWSysSetCompletionCount
  (JNIEnv *env, jclass jcls, jshort wCount)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9AWSysSetCompletionCount(&g_pLingInfo, wCount);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWSetDBStems
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9AWSetDBStems(&g_pLingInfo);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWSetDBCompletion
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9AWSetDBCompletion(&g_pLingInfo);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWSetDBPrediction
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9AWSetDBPrediction(&g_pLingInfo);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWSetUDBDelayedReorder
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9AWSetUDBDelayedReorder(&g_pLingInfo);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWClearDBStems
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9AWClearDBStems(&g_pLingInfo);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWClearDBCompletion
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9AWClearDBCompletion(&g_pLingInfo);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWClearDBPrediction
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9AWClearDBPrediction(&g_pLingInfo);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWClearUDBDelayedReorder
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9AWClearUDBDelayedReorder(&g_pLingInfo);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWSysSetSpellCorrectionMode
  (JNIEnv *env, jclass jcls, jbyte eMode, jboolean bSpellCorrectSecondaryLanguage)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9AWSysSetSpellCorrectionMode(&g_pLingInfo, eMode, bSpellCorrectSecondaryLanguage);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWSysSetSpellCorrectionCount
  (JNIEnv *env, jclass jcls, jshort wCount)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9AWSysSetSpellCorrectionCount(&g_pLingInfo, wCount);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWSysSetSpellCorrectionSearchFilter
  (JNIEnv *env, jclass jcls, jbyte eFilter)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9AWSysSetSpellCorrectionSearchFilter(&g_pLingInfo, eFilter);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWSysSetSelectionListMode
  (JNIEnv *env, jclass jcls, jbyte eMode)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9AWSysSetSelectionListMode(&g_pLingInfo, eMode);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWSysSetPostSort
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9AWSysSetPostSort(&g_pLingInfo);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWSysClearPostSort
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9AWSysClearPostSort(&g_pLingInfo);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWSetUserDefinedAutoSubstitution
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9AWSetUserDefinedAutoSubstitution(&g_pLingInfo);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWClearUserDefinedAutoSubstitution
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9AWClearUserDefinedAutoSubstitution(&g_pLingInfo);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWSetLDBAutoSubstitution
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9AWSetLDBAutoSubstitution(&g_pLingInfo);

	return wStatus;	
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWClearLDBAutoSubstitution
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9AWClearLDBAutoSubstitution(&g_pLingInfo);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWEnableDBs
  (JNIEnv *env, jclass jcls, jint dwDBMasks)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9AWEnableDBs(&g_pLingInfo, dwDBMasks);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWDisableDBs
  (JNIEnv *env, jclass jcls, jint dwDBMasks)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9AWDisableDBs(&g_pLingInfo, dwDBMasks);

	return wStatus;	
}

/*----------------------------------------------------------------------------
 *  Define ET9 Alphabetic selection list functions
 *----------------------------------------------------------------------------*/
JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWSysInit
  (JNIEnv *env, 
  jclass   jcls, 
  jboolean bResetLingCmn, 
  jbyte    bListSize)
{
	jshort wStatus = ET9STATUS_NONE;
	void* pPublicExtension = NULL; // TODO:voidp

	wStatus = ET9AWSysInit(&g_pLingInfo, &g_pLingCmnInfo, &g_WordSymbInfo, bResetLingCmn, bListSize, g_PrivWordInfo, pPublicExtension);
#ifdef LOAD_DB_FROM_FILE
	MakeDBFileList(DB_FILE_PATH);
#endif
	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWSetExactInList
  (JNIEnv *env, jclass jcls, jbyte eSetting)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9AWSetExactInList(&g_pLingInfo, eSetting);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWGetExactInList
  (JNIEnv *env, jclass jcls, jbyteArray peSetting)
{
	jshort wStatus = ET9STATUS_NONE;
	jbyte *_peSetting = (*env)->GetByteArrayElements(env, peSetting, NULL);
	
	wStatus = ET9AWGetExactInList(&g_pLingInfo, (ET9AEXACTINLIST *)_peSetting);

	(*env)->ReleaseByteArrayElements(env, peSetting, _peSetting, 0);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWSetAutoAppendInList
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9AWSetAutoAppendInList(&g_pLingInfo);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWClearAutoAppendInList
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9AWClearAutoAppendInList(&g_pLingInfo);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWSelLstBuild
  (JNIEnv *env, jclass jcls, jbyteArray pbTotalWords, jbyteArray pbDefaultListIndex)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9U8  *_pbTotalWords       = (ET9U8  *)(*env)->GetByteArrayElements(env, pbTotalWords, NULL);
	ET9U8  *_pbDefaultListIndex = (ET9U8  *)(*env)->GetByteArrayElements(env, pbDefaultListIndex, NULL);
	
	wStatus = ET9AWSelLstBuild(&g_pLingInfo, _pbTotalWords, _pbDefaultListIndex);

	if( *_pbDefaultListIndex == ET9_NO_ACTIVE_INDEX && wStatus == ET9STATUS_NO_MATCHING_WORDS) {
		if(g_bIsBackUpAvailable) {
			ET9ClearOneSymb(&g_WordSymbInfo);
			_ET9ByteCopy(&g_pLingInfo, &g_BackupInfo.LingInfo, sizeof(ET9AWLingInfo));
			_ET9ByteCopy(g_pWordInfo, &g_BackupInfo.WordInfo, sizeof(ET9AWWordInfo));
			_ET9ByteCopy(g_pLingInfo.pLingCmnInfo, &g_BackupInfo.LingCmnInfo, sizeof(ET9AWLingCmnInfo));
			_ET9ByteCopy(g_pLingInfo.pLingCmnInfo->Private.pWordList, g_BackupInfo.WordList, ET9MAXSELLISTSIZE*sizeof(ET9AWPrivWordInfo));
			g_pLingInfo.pLingCmnInfo->Private.bTotalWords = g_BackupInfo.nTotalWords;
			g_pLingInfo.pLingCmnInfo->Private.bDefaultIndex = g_BackupInfo.nActivewordIndex;
			*_pbTotalWords = g_BackupInfo.nTotalWords;
			*_pbDefaultListIndex = g_BackupInfo.nActivewordIndex;
		}
	}

	(*env)->ReleaseByteArrayElements(env, pbTotalWords, (jbyte *)_pbTotalWords, 0);
	(*env)->ReleaseByteArrayElements(env, pbDefaultListIndex, (jbyte *)_pbDefaultListIndex, 0);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWSelLstGetWord
  (JNIEnv *env, jclass jcls, jobject jobj_pWord, jbyte byWordIndex)
{
	jshort wStatus = ET9STATUS_NONE;
	//ET9AWWordInfo *pWordInfo = NULL;

	wStatus = ET9AWSelLstGetWord(&g_pLingInfo, &g_pWordInfo, byWordIndex);

	if(g_pWordInfo != NULL)
		ET9AW_SetWordInfo(env, jcls, &jobj_pWord, *g_pWordInfo);
	if(!wStatus) {
		_ET9ByteCopy(&g_BackupInfo.LingInfo, &g_pLingInfo, sizeof(ET9AWLingInfo));
		_ET9ByteCopy(&g_BackupInfo.WordInfo, g_pWordInfo, sizeof(ET9AWWordInfo));
		_ET9ByteCopy(&g_BackupInfo.LingCmnInfo, g_pLingInfo.pLingCmnInfo, sizeof(ET9AWLingCmnInfo));
		_ET9ByteCopy(g_BackupInfo.WordList, g_pLingInfo.pLingCmnInfo->Private.pWordList, ET9MAXSELLISTSIZE*sizeof(ET9AWPrivWordInfo));
		g_BackupInfo.nTotalWords = g_pLingInfo.pLingCmnInfo->Private.bTotalWords;
		g_BackupInfo.nActivewordIndex =  g_pLingInfo.pLingCmnInfo->Private.bDefaultIndex;
		g_bIsBackUpAvailable = 1;
	}

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWSelLstSelWord
  (JNIEnv *env, jclass jcls, jbyte byWordIndex)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9AWSelLstSelWord(&g_pLingInfo, byWordIndex);

	return wStatus;	
}
  
JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWLockWord
  (JNIEnv *env, jclass jcls, jbyte byWordIndex)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9AWLockWord(&g_pLingInfo, byWordIndex);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWNoteWordDone
  (JNIEnv *env, jclass jcls, jshortArray pText, jshort aSize)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9SYMB *_pText = (ET9SYMB *)(*env)->GetShortArrayElements(env, pText, NULL);

	wStatus = ET9AWNoteWordDone(&g_pLingInfo, _pText, aSize);

	(*env)->ReleaseShortArrayElements(env, pText, (jshort *)_pText, 0);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWNotePhraseDone
  (JNIEnv *env, jclass jcls, jshortArray pText, jshort aSize)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9SYMB *_pText = (ET9SYMB *)(*env)->GetShortArrayElements(env, pText, NULL);
	
	wStatus = ET9AWNotePhraseDone(&g_pLingInfo, _pText, aSize);

	(*env)->ReleaseShortArrayElements(env, pText, (jshort *)_pText, 0);

	return wStatus;	
}
  
JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWSetCustomTermPuncts
  (JNIEnv *env, jclass jcls, jshortArray psPunct, jbyte pbDefault)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9SYMB *_psPunct = (ET9SYMB *)(*env)->GetShortArrayElements(env, psPunct, NULL);

	wStatus = ET9AWSetCustomTermPuncts(&g_pLingInfo, _psPunct, pbDefault);

	(*env)->ReleaseShortArrayElements(env, psPunct, (jshort *)_psPunct, 0);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWSetDefaultTermPuncts
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9AWSetDefaultTermPuncts(&g_pLingInfo);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWGetTermPuncts
  (JNIEnv       *env, 
  jclass        jcls, 
  jshort        wLdbNum, 
  jshortArray   psPunctBuf, 
  jbyte         bPunctBufLen, 
  jbyteArray    pbCount, 
  jbooleanArray pbDefault)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9SYMB *_psPunctBuf = (ET9SYMB *)(*env)->GetShortArrayElements(env, psPunctBuf, NULL);
	ET9U8 *_pbCount      = (ET9U8 *)(*env)->GetByteArrayElements(env, pbCount, NULL);
	ET9BOOL *_pbDefault  = (ET9BOOL *)(*env)->GetBooleanArrayElements(env, pbDefault, NULL);

	wStatus = ET9AWGetTermPuncts(&g_pLingInfo, wLdbNum, _psPunctBuf, bPunctBufLen, _pbCount, _pbDefault);

	(*env)->ReleaseShortArrayElements(env, psPunctBuf, (jshort *)_psPunctBuf, 0);
	(*env)->ReleaseByteArrayElements(env, pbCount, (jbyte *)_pbCount, 0);
	(*env)->ReleaseBooleanArrayElements(env, pbDefault, (jboolean *)_pbDefault, 0);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWSetCustomEmbeddedPunct
  (JNIEnv *env, jclass jcls, jshort sEmbeddedPunct)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9AWSetCustomEmbeddedPunct(&g_pLingInfo, sEmbeddedPunct);

	return wStatus;	
}
  
JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWSetDefaultEmbeddedPunct
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9AWSetDefaultEmbeddedPunct(&g_pLingInfo);

	return wStatus;	
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWGetEmbeddedPunct
  (JNIEnv *env, jclass jcls, jshort wLdbNum, jshortArray psPunct, jbooleanArray pbDefault)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9SYMB  *_psPunct  = (ET9SYMB  *)(*env)->GetShortArrayElements(env, psPunct, NULL);
	ET9BOOL *_pbDefault = (ET9BOOL *)(*env)->GetBooleanArrayElements(env, pbDefault, NULL);

	wStatus = ET9AWGetEmbeddedPunct(&g_pLingInfo, wLdbNum, _psPunct, _pbDefault);

	(*env)->ReleaseShortArrayElements(env, psPunct, (jshort *)_psPunct, 0);
	(*env)->ReleaseBooleanArrayElements(env, pbDefault, (jboolean *)_pbDefault, 0);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWSelLstPostShift
  (JNIEnv *env, jclass jcls, jbyte eMode, jbyteArray pbTotalWords, jbyteArray pbCurrListIndex)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9U8  *_pbTotalWords    = (ET9U8  *)(*env)->GetByteArrayElements(env, pbTotalWords, NULL);
	ET9U8  *_pbCurrListIndex = (ET9U8  *)(*env)->GetByteArrayElements(env, pbCurrListIndex, NULL);
	
	wStatus = ET9AWSelLstPostShift(&g_pLingInfo, eMode, _pbTotalWords, _pbCurrListIndex);

	(*env)->ReleaseByteArrayElements(env, pbTotalWords, (jbyte *)_pbTotalWords, 0);
	(*env)->ReleaseByteArrayElements(env, pbCurrListIndex, (jbyte *)_pbCurrListIndex, 0);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWGetPostShiftMode
  (JNIEnv *env, jclass jcls, jbyteArray peMode)
{
	jshort wStatus = ET9STATUS_NONE;
	jbyte *_peMode = (*env)->GetByteArrayElements(env, peMode, NULL);
	
	wStatus = ET9AWGetPostShiftMode(&g_pLingInfo, (ET9POSTSHIFTMODE *)_peMode);

	(*env)->ReleaseByteArrayElements(env, peMode, _peMode, 0);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWSetConvertSymb
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	void *pConvertSymbInfo = NULL; // TODO:voidp

	wStatus = ET9AWSetConvertSymb(&g_pLingInfo, ET9_ConvertSymb, pConvertSymbInfo);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWSetActiveLanguageSwitch
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9AWSetActiveLanguageSwitch(&g_pLingInfo);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWClearActiveLanguageSwitch
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9AWClearActiveLanguageSwitch(&g_pLingInfo);

	return wStatus;	
}

/*----------------------------------------------------------------------------
 *  Define ET9 Alphabetic LDB functions
 *----------------------------------------------------------------------------*/
JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWLdbInit
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9AWLdbInit(&g_pLingInfo, ET9AW_LdbReadData);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWLdbSetLanguage
  (JNIEnv *env, jclass jcls, jshort wFirstLdbNum, jshort wSecondLdbNum)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9AWLdbSetLanguage(&g_pLingInfo, wFirstLdbNum, wSecondLdbNum);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWLdbGetLanguage
  (JNIEnv *env, jclass jcls, jshortArray pwFirstLdbNum, jshortArray pwSecondLdbNum)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9U16 *_pwFirstLdbNum  = (ET9U16 *)(*env)->GetShortArrayElements(env, pwFirstLdbNum, NULL);
	ET9U16 *_pwSecondLdbNum = (ET9U16 *)(*env)->GetShortArrayElements(env, pwSecondLdbNum, NULL);
	
	wStatus = ET9AWLdbGetLanguage(&g_pLingInfo, _pwFirstLdbNum, _pwSecondLdbNum);

	(*env)->ReleaseShortArrayElements(env, pwFirstLdbNum, (jshort *)_pwFirstLdbNum, 0);
	(*env)->ReleaseShortArrayElements(env, pwSecondLdbNum, (jshort *)_pwSecondLdbNum, 0);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWLdbGetActiveLanguage
  (JNIEnv *env, jclass jcls, jshortArray pwLdbNum)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9U16 *_pwLdbNum = (ET9U16 *)(*env)->GetShortArrayElements(env, pwLdbNum, NULL);

	wStatus = ET9AWLdbGetActiveLanguage(&g_pLingInfo, _pwLdbNum);

	(*env)->ReleaseShortArrayElements(env, pwLdbNum, (jshort *)_pwLdbNum, 0);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWLdbValidate
  (JNIEnv *env, jclass jcls, jshort wLdbNum)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9AWLdbValidate(&g_pLingInfo, wLdbNum, ET9AW_LdbReadData);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWLdbGetVersion
  (JNIEnv *env, jclass jcls, jshortArray psLdbVerBuf, jshort wBufMaxSize, jshortArray pwBufSize)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9SYMB *_psLdbVerBuf = (ET9SYMB *)(*env)->GetShortArrayElements(env, psLdbVerBuf, NULL);
	ET9U16 *_pwBufSize    = (ET9U16 *)(*env)->GetShortArrayElements(env, pwBufSize, NULL);
	
	wStatus = ET9AWLdbGetVersion(&g_pLingInfo, _psLdbVerBuf, wBufMaxSize, _pwBufSize);

	(*env)->ReleaseShortArrayElements(env, psLdbVerBuf, (jshort *)_psLdbVerBuf, 0);
	(*env)->ReleaseShortArrayElements(env, pwBufSize, (jshort *)_pwBufSize, 0);

	return wStatus;	
}

/*----------------------------------------------------------------------------
 *  Define ET9 Alphabetic RUDB functions
 *----------------------------------------------------------------------------*/
JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWRUDBInit
  (JNIEnv *env, jclass jcls,jbyteArray pDbInfo ,jshort wDataSize)
{
	jshort wStatus = ET9STATUS_NONE;
	if (g_pRudbInfo ==NULL) {
		g_pRudbInfo = (ET9U8 *)(*env)->GetByteArrayElements(env, pDbInfo, NULL);
	}

	wStatus = ET9AWRUDBInit(&g_pLingInfo, (ET9AWRUDBInfo*)g_pRudbInfo, wDataSize, NULL); // TODO:callback

	//(*env)->ReleaseByteArrayElements(env, pDbInfo, (jbyte *)g_pRudbInfo, JNI_COMMIT);
	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWUDBAddWord
  (JNIEnv *env, jclass jcls, jshortArray psBuf, jshort wWordLen)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9SYMB *_psBuf = (ET9SYMB *)(*env)->GetShortArrayElements(env, psBuf, NULL);
	
	wStatus = ET9AWUDBAddWord(&g_pLingInfo, _psBuf, wWordLen);

	(*env)->ReleaseShortArrayElements(env, psBuf, (jshort *)_psBuf, 0);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWUDBGetWordCount
  (JNIEnv *env, jclass jcls, jshortArray pEntryCount)
{
	jshort wStatus = ET9STATUS_NONE;

	ET9SYMB *_pEntryCount = (ET9SYMB *)(*env)->GetShortArrayElements(env, pEntryCount, NULL);
	
	wStatus = ET9AWUDBGetWordCount(&g_pLingInfo, _pEntryCount);

	(*env)->ReleaseShortArrayElements(env, pEntryCount, (jshort *)_pEntryCount, 0);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWUDBDeleteWord
  (JNIEnv *env, jclass jcls, jshortArray psBuf, jshort wWordLen)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9SYMB *_psBuf = (ET9SYMB *)(*env)->GetShortArrayElements(env, psBuf, NULL);

	wStatus = ET9AWUDBDeleteWord(&g_pLingInfo, _psBuf, wWordLen);

	(*env)->ReleaseShortArrayElements(env, psBuf, (jshort *)_psBuf, 0);

	return wStatus;	
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWUDBGetWord
  (JNIEnv *env, jclass jcls, jshortArray psWordBuf, jshort wWordBufLen, jshortArray pwWordLen, jbyte bForward)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9SYMB *_psWordBuf = (ET9SYMB *)(*env)->GetShortArrayElements(env, psWordBuf, NULL);
	ET9U16 *_pwWordLen  = (ET9U16 *)(*env)->GetShortArrayElements(env, pwWordLen, NULL);
	
	wStatus = ET9AWUDBGetWord(&g_pLingInfo, _psWordBuf, wWordBufLen, _pwWordLen, bForward);

	(*env)->ReleaseShortArrayElements(env, psWordBuf, (jshort *)_psWordBuf, 0);
	(*env)->ReleaseShortArrayElements(env, pwWordLen, (jshort *)_pwWordLen, 0);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWRUDBReset
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9AWRUDBReset(&g_pLingInfo);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWUDBOnlyReset
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9AWUDBOnlyReset(&g_pLingInfo);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWUDBFindWord
  (JNIEnv *env, jclass jcls, jshortArray psBuf, jshort wWordLen)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9SYMB *_psBuf = (ET9SYMB *)(*env)->GetShortArrayElements(env, psBuf, NULL);
	
	wStatus = ET9AWUDBFindWord(&g_pLingInfo, _psBuf, wWordLen);

	(*env)->ReleaseShortArrayElements(env, psBuf, (jshort *)_psBuf, 0);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWScanBufForCustomWords
  (JNIEnv *env, jclass jcls, jshortArray psBuf, jshort wBufLen)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9SYMB *_psBuf = (ET9SYMB *)(*env)->GetShortArrayElements(env, psBuf, NULL);
	
	wStatus = ET9AWScanBufForCustomWords(&g_pLingInfo, _psBuf, wBufLen, 0);

	(*env)->ReleaseShortArrayElements(env, psBuf, (jshort *)_psBuf, 0);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWScanBufForNextCustomWord
  (JNIEnv      *env, 
  jclass       jcls, 
  jshortArray  ppsBuf, 
  jshortArray  pwBufLen, 
  jshortArray  psWordBuf, 
  jshort       wWordBufLen, 
  jshortArray  pwWordLen)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9SYMB * _ppsBuf    = (ET9SYMB *)(*env)->GetShortArrayElements(env, ppsBuf, NULL);
	ET9U16  *_pwBufLen   = (ET9U16  *)(*env)->GetShortArrayElements(env, pwBufLen, NULL);
	ET9SYMB *_psWordBuf  = (ET9SYMB *)(*env)->GetShortArrayElements(env, psWordBuf, NULL);
	ET9U16  *_pwWordLen  = (ET9U16  *)(*env)->GetShortArrayElements(env, pwWordLen, NULL);
	
	wStatus = ET9AWScanBufForNextCustomWord(&g_pLingInfo, &_ppsBuf, _pwBufLen, _psWordBuf, wWordBufLen, _pwWordLen, 0);

	(*env)->ReleaseShortArrayElements(env, ppsBuf, (jshort *)_ppsBuf, 0);
	(*env)->ReleaseShortArrayElements(env, pwBufLen, (jshort *)_pwBufLen, 0);
	(*env)->ReleaseShortArrayElements(env, psWordBuf, (jshort *)_psWordBuf, 0);
	(*env)->ReleaseShortArrayElements(env, pwWordLen, (jshort *)_pwWordLen, 0);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWScanBufForNextSpellCorrection
  (JNIEnv      *env, 
  jclass       jcls, 
  jshortArray  psBegBuf, 
  jshortArray  psBuf, 
  jshort       wBufLen, 
  jbyteArray   pbTotalWords, 
  jshortArray  ppsWord, 
  jshortArray  ppsString, 
  jshortArray  pwStringLen)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9SYMB *_psBegBuf     = (ET9SYMB *)(*env)->GetShortArrayElements(env, psBegBuf, NULL);
	ET9SYMB *_psBuf        = (ET9SYMB *)(*env)->GetShortArrayElements(env, psBuf, NULL);
	ET9U8   *_pbTotalWords = (ET9U8   *)(*env)->GetByteArrayElements(env, pbTotalWords, NULL);
	ET9SYMB *_ppsWord      = (ET9SYMB *)(*env)->GetShortArrayElements(env, ppsWord, NULL);
	ET9SYMB *_ppsString    = (ET9SYMB *)(*env)->GetShortArrayElements(env, ppsString, NULL);
	ET9U16  *_pwStringLen  = (ET9U16  *)(*env)->GetShortArrayElements(env, pwStringLen, NULL);

	wStatus = ET9AWScanBufForNextSpellCorrection(&g_pLingInfo, _psBegBuf, _psBuf, wBufLen, _pbTotalWords, &_ppsWord, &_ppsString, _pwStringLen);

	(*env)->ReleaseShortArrayElements(env, psBegBuf, (jshort *)_psBegBuf, 0);
	(*env)->ReleaseShortArrayElements(env, psBuf, (jshort *)_psBuf, 0);
	(*env)->ReleaseByteArrayElements(env, pbTotalWords, (jbyte *)_pbTotalWords, 0);
	(*env)->ReleaseShortArrayElements(env, ppsWord, (jshort *)_ppsWord, 0);
	(*env)->ReleaseShortArrayElements(env, ppsString, (jshort *)_ppsString, 0);
	(*env)->ReleaseShortArrayElements(env, pwStringLen, (jshort *)_pwStringLen, 0);


	return wStatus;	
}

/*----------------------------------------------------------------------------
 *  Define ET9 Alphabetic AutoSubstitution functions
 *----------------------------------------------------------------------------*/
JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWASDBInit
  (JNIEnv *env, jclass jcls,jbyteArray pDbInfo ,jshort wDataSize)
{
	jshort wStatus = ET9STATUS_NONE;
	if (g_pAsdbInfo ==NULL) {
		g_pAsdbInfo = (ET9U8 *)(*env)->GetByteArrayElements(env, pDbInfo, NULL);
	}

	wStatus = ET9AWASDBInit(&g_pLingInfo, (ET9AWASDBInfo*)g_pAsdbInfo, wDataSize, NULL); // TODO:callback

	//(*env)->ReleaseByteArrayElements(env, pDbInfo, (jbyte *)g_pAsdbInfo, JNI_COMMIT);
	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWASDBAddEntry
  (JNIEnv *env,
  jclass jcls,  
  jshortArray psShortCut, 
  jshortArray psSubstitution, 
  jshort wShortcutLen, 
  jshort wSubstitutionLen)
{
	jshort wStatus = ET9STATUS_NONE;

	ET9SYMB  *_psShortCut = (ET9SYMB  *)(*env)->GetShortArrayElements(env, psShortCut, NULL);
	ET9SYMB  *_psSubstitution = (ET9SYMB  *)(*env)->GetShortArrayElements(env, psSubstitution, NULL);

	wStatus = ET9AWASDBAddEntry(&g_pLingInfo, _psShortCut, _psSubstitution, wShortcutLen, wSubstitutionLen);

	(*env)->ReleaseShortArrayElements(env, psShortCut, (jshort *)_psShortCut, 0);
	(*env)->ReleaseShortArrayElements(env, psSubstitution, (jshort *)_psSubstitution, 0);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWASDBGetEntryCount
  (JNIEnv *env, jclass jcls, jshortArray pEntryCount)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9U16 *_pEntryCount = (ET9U16 *)(*env)->GetShortArrayElements(env, pEntryCount, NULL);

	wStatus = ET9AWASDBGetEntryCount(&g_pLingInfo, _pEntryCount);

	(*env)->ReleaseShortArrayElements(env, pEntryCount, (jshort *)_pEntryCount, 0);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWASDBDeleteEntry
  (JNIEnv *env, jclass jcls, jshortArray psBuf, jshort wWordLen)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9U16 *_psBuf = (ET9U16 *)(*env)->GetShortArrayElements(env, psBuf, NULL);

	wStatus = ET9AWASDBDeleteEntry(&g_pLingInfo, _psBuf, wWordLen);

	(*env)->ReleaseShortArrayElements(env, psBuf, (jshort *)_psBuf, 0);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWASDBGetEntry
  (JNIEnv     *env, 
  jclass      jcls, 
  jshortArray psShortcutBuf, 
  jshort      wShortcutBufLen, 
  jshortArray pwShortcutLen, 
  jshortArray psSubstitutionBuf, 
  jshort      wSubstitutionBufLen, 
  jshortArray pwSubstitutionLen, 
  jbyte       bForward)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9SYMB *_psShortcutBuf      = (ET9SYMB *)(*env)->GetShortArrayElements(env, psShortcutBuf, NULL);
	ET9U16  *_pwShortcutLen      = (ET9U16  *)(*env)->GetShortArrayElements(env, pwShortcutLen, NULL);
	ET9SYMB *_psSubstitutionBuf  = (ET9SYMB *)(*env)->GetShortArrayElements(env, psSubstitutionBuf, NULL);
	ET9U16  *_pwSubstitutionLen  = (ET9U16  *)(*env)->GetShortArrayElements(env, pwSubstitutionLen, NULL);
	
	wStatus = ET9AWASDBGetEntry(&g_pLingInfo, 
		_psShortcutBuf, wShortcutBufLen, _pwShortcutLen, _psSubstitutionBuf, wSubstitutionBufLen, _pwSubstitutionLen, bForward);

	(*env)->ReleaseShortArrayElements(env, psShortcutBuf,     (jshort *)_psShortcutBuf, 0);
	(*env)->ReleaseShortArrayElements(env, pwShortcutLen,     (jshort *)_pwShortcutLen, 0);
	(*env)->ReleaseShortArrayElements(env, psSubstitutionBuf, (jshort *)_psSubstitutionBuf, 0);
	(*env)->ReleaseShortArrayElements(env, pwSubstitutionLen, (jshort *)_pwSubstitutionLen, 0);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWASDBReset
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9AWASDBReset(&g_pLingInfo);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWASDBFindEntry
  (JNIEnv     *env, 
  jclass      jcls, 
  jshortArray psShortcut, 
  jshort      wShortcutLen, 
  jshortArray psSubstitutionBuf, 
  jshort      wSubstitutionBufLen, 
  jshortArray pwSubstitutionLen)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9SYMB *_psShortcut        = (ET9SYMB *)(*env)->GetShortArrayElements(env, psShortcut, NULL);
	ET9SYMB *_psSubstitutionBuf = (ET9SYMB *)(*env)->GetShortArrayElements(env, psSubstitutionBuf, NULL);
	ET9U16 *_pwSubstitutionLen  = (ET9U16 *)(*env)->GetShortArrayElements(env, pwSubstitutionLen, NULL);

	wStatus = ET9AWASDBFindEntry(&g_pLingInfo, _psShortcut, wShortcutLen, _psSubstitutionBuf, wSubstitutionBufLen, _pwSubstitutionLen);

	(*env)->ReleaseShortArrayElements(env, psShortcut,        (jshort *)_psShortcut, 0);
	(*env)->ReleaseShortArrayElements(env, psSubstitutionBuf, (jshort *)_psSubstitutionBuf, 0);
	(*env)->ReleaseShortArrayElements(env, pwSubstitutionLen, (jshort *)_pwSubstitutionLen, 0);

	return wStatus;	
}

/*----------------------------------------------------------------------------
 *  Define ET9 Alphabetic MDB functions
 *----------------------------------------------------------------------------*/

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWRegisterMDB
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9AWRegisterMDB(&g_pLingInfo, ET9AW_ReadMdbData);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWUnregisterMDB
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9AWUnregisterMDB(&g_pLingInfo);

	return wStatus;	
}

/*----------------------------------------------------------------------------
 *  Define ET9 Alphabetic CDB functions
 *----------------------------------------------------------------------------*/
JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWCDBInit
  (JNIEnv *env, jclass jcls, jbyteArray pDbInfo ,jshort wDataSize)
{
	jshort wStatus = ET9STATUS_NONE;
	if (g_pCdbInfo ==NULL) {
		g_pCdbInfo = (ET9U8 *)(*env)->GetByteArrayElements(env, pDbInfo, NULL);
	}

	wStatus = ET9AWCDBInit(&g_pLingInfo, (ET9AWCDBInfo*)g_pCdbInfo, wDataSize, NULL); // TODO:callback

	//(*env)->ReleaseByteArrayElements(env, pDbInfo, (jbyte *)g_pCdbInfo, JNI_COMMIT);
	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWBreakContext
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9AWFillContextBuffer(&g_pLingInfo, NULL, 0);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWFillContextBuffer
  (JNIEnv *env, jclass jcls, jshortArray psBufIn, jint nBufLen)
{
	jshort wStatus = ET9STATUS_NONE;

	ET9SYMB *_psBufIn = (ET9SYMB *)(*env)->GetShortArrayElements(env, psBufIn, NULL);
	
	wStatus = ET9AWFillContextBuffer(&g_pLingInfo, _psBufIn, nBufLen);

	(*env)->ReleaseShortArrayElements(env, psBufIn, (jshort *)_psBufIn, 0);

	return wStatus;	
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWCDBReset
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9AWCDBReset(&g_pLingInfo);

	return wStatus;	
}


/*----------------------------------------------------------------------------
 *  Define ET9 Alphabetic TUDB functions
 *----------------------------------------------------------------------------*/
JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWTUDBGetSize
  (JNIEnv *env, 
	jclass jcls, 
	jintArray pdwSize, 
	jintArray pdwTotalWords)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9U32 *_pdwSize       = (ET9U32 *)(*env)->GetIntArrayElements(env, pdwSize, NULL);
	ET9U32 *_pdwTotalWords = (ET9U32 *)(*env)->GetIntArrayElements(env, pdwTotalWords, NULL);

	wStatus = ET9AWTUDBGetSize(&g_pLingInfo, _pdwSize, _pdwTotalWords);

	(*env)->ReleaseIntArrayElements(env, pdwSize, (jint *)_pdwSize, 0);
	(*env)->ReleaseIntArrayElements(env, pdwTotalWords, (jint *)_pdwTotalWords, 0);

	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWTUDBExport
  (JNIEnv *env, 
	jclass jcls, 
	jbyteArray pTUdb, 
	jint dwTUDBSize, 
	jintArray pdwExportSize, 
	jobject jobj_pNextRecord, 
	jshortArray pwRecordsExported)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9U8  *_pTUdb             = (ET9U8  *)(*env)->GetByteArrayElements(env, pTUdb, NULL);
	ET9U32 *_pdwExportSize     = (ET9U32 *)(*env)->GetIntArrayElements(env, pdwExportSize, NULL);
	ET9U16 *_pwRecordsExported = (ET9U16 *)(*env)->GetShortArrayElements(env, pwRecordsExported, NULL);

	wStatus = ET9AWTUDBExport(&g_pLingInfo, _pTUdb, dwTUDBSize, _pdwExportSize, ET9WriteTUDB, &g_pNextRecord, _pwRecordsExported);

	(*env)->ReleaseByteArrayElements(env, pTUdb, (jbyte *)_pTUdb, 0);
	(*env)->ReleaseIntArrayElements(env, pdwExportSize, (jint *)_pdwExportSize, 0);
	(*env)->ReleaseShortArrayElements(env, pwRecordsExported, (jshort *)_pwRecordsExported, 0);

	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWTUDBImport
  (JNIEnv *env, 
	jclass jcls, 
	jbyteArray pTUdb, 
	jint dwTUdbSize, 
	jshortArray pwTotalImported, 
	jshortArray pwTotalRejected)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9U8  *_pTUdb           = (ET9U8  *)(*env)->GetByteArrayElements(env, pTUdb, NULL);
	ET9U16 *_pwTotalImported = (ET9U16 *)(*env)->GetShortArrayElements(env, pwTotalImported, NULL);
	ET9U16 *_pwTotalRejected = (ET9U16 *)(*env)->GetShortArrayElements(env, pwTotalRejected, NULL);

	wStatus = ET9AWTUDBImport(&g_pLingInfo, _pTUdb, dwTUdbSize, ET9ReadTUDB, _pwTotalImported, _pwTotalRejected);

	(*env)->ReleaseByteArrayElements(env, pTUdb, (jbyte *)_pTUdb, 0);
	(*env)->ReleaseShortArrayElements(env, pwTotalImported, (jshort *)_pwTotalImported, 0);
	(*env)->ReleaseShortArrayElements(env, pwTotalRejected, (jshort *)_pwTotalRejected, 0);

	return wStatus;
}

#endif // ET9_ALPHABETIC_MODULE

#ifdef ET9_KOREAN_MODULE
JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KSysInit
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
    wStatus = ET9KSysInit(&g_KLingInfo, &g_WordSymbInfo, NULL);

	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KBuildHangul
  (JNIEnv *env, jclass jcls, jobject jobj_pHangul, jshortArray pMultitapSequence, jshort wTotalSymbs)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9SYMB *_pMultitapSequence = (ET9SYMB *)(*env)->GetShortArrayElements(env, pMultitapSequence, NULL);
	ET9K_GetHangulWord(env, jcls, &g_KHangulWord, jobj_pHangul);

	wStatus = ET9KBuildHangul(&g_KLingInfo, &g_KHangulWord, _pMultitapSequence, wTotalSymbs);

	ET9K_SetHangulWord(env, jcls, &jobj_pHangul, g_KHangulWord);
	(*env)->ReleaseShortArrayElements(env, pMultitapSequence, (jshort *)_pMultitapSequence, 0);
	return wStatus;
}

/*
 * Class:     com_diotek_ime_framework_engine_xt9_Xt9core
 * Method:    ET9KUTIL_BuildHangulSingleConsonants
 * Signature: (Lcom/diotek/ime/framework/engine/xt9/Xt9Datatype/S_ET9KHangulWord;[SS)S
 */
JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KUTIL_1BuildHangulSingleConsonants
  (JNIEnv *env, jclass jcls, jobject jobj_pHangul, jshortArray pMultitapSequence, jshort wTotalSymbs)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9SYMB *_pMultitapSequence = (ET9SYMB *)(*env)->GetShortArrayElements(env, pMultitapSequence, NULL);
	ET9K_GetHangulWord(env, jcls, &g_KHangulWord, jobj_pHangul);

	wStatus = ET9KUTIL_BuildHangulSingleConsonants(&g_KLingInfo, &g_KHangulWord, _pMultitapSequence, wTotalSymbs);

	ET9K_SetHangulWord(env, jcls, &jobj_pHangul, g_KHangulWord);
	(*env)->ReleaseShortArrayElements(env, pMultitapSequence, (jshort *)_pMultitapSequence, 0);
	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KDecodeHangul
  (JNIEnv *env, jclass jcls, jobject jobj_pHangul, jobject jobj_pJamo)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9SimpleWord jamo;
	ET9KHangulWord hanWord;
	ET9K_GetHangulWord(env, jcls, &hanWord, jobj_pHangul);

	wStatus = ET9KDecodeHangul(&g_KLingInfo, &hanWord, &jamo);

	ET9Word_SetSimpleWords(env, jcls, &jobj_pJamo, jamo);
	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KEnableChunJiIn
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	wStatus = ET9KEnableChunJiIn(&g_KLingInfo);
	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KDisableChunJiIn
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	wStatus = ET9KDisableChunJiIn(&g_KLingInfo);
	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KEnableJoinChunJiIn
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	wStatus = ET9KEnableJoinChunJiIn(&g_KLingInfo);
	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KDisableJoinChunJiIn
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	wStatus = ET9KDisableJoinChunJiIn(&g_KLingInfo);
	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KEnableCompatibilityJamo
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	wStatus = ET9KEnableCompatibilityJamo(&g_KLingInfo);
	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KDisableCompatibilityJamo
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	wStatus = ET9KDisableCompatibilityJamo(&g_KLingInfo);
	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KLdbInit
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	wStatus = ET9KLdbInit(&g_KLingInfo, ET9AW_LdbReadData);
	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KRUDBInit
   (JNIEnv *env, jclass jcls, jbyteArray pDbInfo, jshort wDataSize)
{
	jshort wStatus = ET9STATUS_NONE;
	if (g_pKRudbInfo ==NULL) {
		g_pKRudbInfo = (ET9U8 *)(*env)->GetByteArrayElements(env, pDbInfo, NULL);
	}

	wStatus = ET9KRUDBInit(&g_KLingInfo, g_pKRudbInfo, wDataSize, NULL); // TODO:callback

	//(*env)->ReleaseByteArrayElements(env, pDbInfo, (jbyte *)g_pRudbInfo, JNI_COMMIT);
	return wStatus;	
}
JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KUDBAddWord
  (JNIEnv *env, jclass jcls, jshortArray psHangul, jshort wHangulLen)
{
	jshort wStatus = ET9STATUS_NONE;

	ET9SYMB  *_psHangul           = (ET9SYMB  *)(*env)->GetShortArrayElements(env, psHangul, NULL);
	
	wStatus = ET9KUDBAddWord(&g_KLingInfo, _psHangul, wHangulLen);
	
	(*env)->ReleaseShortArrayElements(env, psHangul, (jshort *)_psHangul, 0);
	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KUDBGetWord
  (JNIEnv *env, jclass jcls, jshortArray psHangulBuf, jshort wHangulBufSize, jshortArray pwHangulLen, jbyte bForward)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9SYMB  *_psHangulBuf           = (ET9U8  *)(*env)->GetShortArrayElements(env, psHangulBuf, NULL);
	ET9U16 *_pwHangulLen           = (ET9U16  *)(*env)->GetShortArrayElements(env, pwHangulLen, NULL);
	
	wStatus = ET9KUDBGetWord(&g_KLingInfo, _psHangulBuf, wHangulBufSize, _pwHangulLen, bForward);
	
	(*env)->ReleaseShortArrayElements(env, psHangulBuf, (jshort *)_psHangulBuf, 0);
	(*env)->ReleaseShortArrayElements(env, pwHangulLen, (jshort *)_pwHangulLen, 0);
	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KUDBGetWordCount
  (JNIEnv *env, jclass jcls, jshortArray pHangulCount)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9U16 *_pHangulCount           = (ET9U16  *)(*env)->GetShortArrayElements(env, pHangulCount, NULL);
	
	wStatus = ET9KUDBGetWordCount(&g_KLingInfo, _pHangulCount);

	(*env)->ReleaseShortArrayElements(env, pHangulCount, (jshort *)_pHangulCount, 0);
	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KUDBDeleteWord
  (JNIEnv *env, jclass jcls, jshortArray psHangul, jshort wHangulLen)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9SYMB  *_psHangul           = (ET9SYMB  *)(*env)->GetShortArrayElements(env, psHangul, NULL);
	
	wStatus = ET9KUDBDeleteWord(&g_KLingInfo, _psHangul, wHangulLen);

	(*env)->ReleaseShortArrayElements(env, psHangul, (jshort *)_psHangul, 0);
	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KUDBFindWord
  (JNIEnv *env, jclass jcls, jshortArray psHangul, jshort wHangulLen)
{
	jshort wStatus = ET9STATUS_NONE;

	ET9SYMB  *_psHangul           = (ET9SYMB  *)(*env)->GetShortArrayElements(env, psHangul, NULL);
	
	wStatus = ET9KUDBFindWord(&g_KLingInfo, _psHangul, wHangulLen);
	
	(*env)->ReleaseShortArrayElements(env, psHangul, (jshort *)_psHangul, 0);
	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KRUDBReset
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	wStatus = ET9KRUDBReset(&g_KLingInfo);
	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KBuildSelectionList
  (JNIEnv *env, jclass jcls, jbyteArray pbTotalWords, jbyteArray pbDefaultListIndex)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9U8  *_pbTotalWords       = (ET9U8  *)(*env)->GetByteArrayElements(env, pbTotalWords, NULL);
	ET9U8  *_pbDefaultListIndex = (ET9U8  *)(*env)->GetByteArrayElements(env, pbDefaultListIndex, NULL);
	
	wStatus = ET9KBuildSelectionList(&g_KLingInfo, _pbTotalWords, _pbDefaultListIndex);

	if( *_pbDefaultListIndex == ET9_NO_ACTIVE_INDEX && wStatus == ET9STATUS_NO_MATCHING_WORDS) {
		if(g_bIsBackUpAvailable) {
			ET9ClearOneSymb(&g_WordSymbInfo);
			_ET9ByteCopy(&g_KLingInfo, &g_KBackupInfo.KLingInfo, sizeof(ET9KLingInfo));
			_ET9ByteCopy(&g_KHangulWord, &g_KBackupInfo.HangulWord, sizeof(ET9KHangulWord));
			g_KLingInfo.sAWLingCmnInfo.Private.bTotalWords = g_KBackupInfo.nTotalWords;
			g_KLingInfo.sAWLingCmnInfo.Private.bDefaultIndex = g_KBackupInfo.nActivewordIndex;
			*_pbTotalWords = g_KBackupInfo.nTotalWords;
			*_pbDefaultListIndex = g_KBackupInfo.nActivewordIndex;
		}
	}
	(*env)->ReleaseByteArrayElements(env, pbTotalWords, (jbyte *)_pbTotalWords, 0);
	(*env)->ReleaseByteArrayElements(env, pbDefaultListIndex, (jbyte *)_pbDefaultListIndex, 0);
	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KGetHangul
  (JNIEnv *env, jclass jcls, jbyte bHangulIndex, jshortArray psHangulBuf, jshort wHangulBufLen, jshortArray pwHangulLen)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9U16  *_psHangulBuf       = (ET9U16  *)(*env)->GetShortArrayElements(env, psHangulBuf, NULL);
	ET9U16  *_pwHangulLen = (ET9U16  *)(*env)->GetShortArrayElements(env, pwHangulLen, NULL);
	
	wStatus = ET9KGetHangul(&g_KLingInfo, bHangulIndex, _psHangulBuf, wHangulBufLen, _pwHangulLen);

	if(!wStatus) {
		_ET9ByteCopy(&g_KBackupInfo.KLingInfo, &g_KLingInfo, sizeof(ET9KLingInfo));
		_ET9ByteCopy(&g_KBackupInfo.HangulWord, &g_KHangulWord, sizeof(ET9KHangulWord));
		g_KBackupInfo.nTotalWords = g_KLingInfo.sAWLingCmnInfo.Private.bTotalWords;
		g_KBackupInfo.nActivewordIndex =  g_KLingInfo.sAWLingCmnInfo.Private.bDefaultIndex;
		g_bIsBackUpAvailable = 1;
	}
	
	(*env)->ReleaseShortArrayElements(env, psHangulBuf, (jshort *)_psHangulBuf, 0);
	(*env)->ReleaseShortArrayElements(env, pwHangulLen, (jshort *)_pwHangulLen, 0);
	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KUTIL_1GetHangulSingleConsonants
  (JNIEnv *env, jclass jcls, jbyte bHangulIndex, jshortArray psHangulBuf, jshort wHangulBufLen, jshortArray pwHangulLen)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9U16  *_psHangulBuf       = (ET9U16  *)(*env)->GetShortArrayElements(env, psHangulBuf, NULL);
	ET9U16  *_pwHangulLen = (ET9U16  *)(*env)->GetShortArrayElements(env, pwHangulLen, NULL);
	
	wStatus = ET9KUTIL_GetHangulSingleConsonants(&g_KLingInfo, bHangulIndex, _psHangulBuf, wHangulBufLen, _pwHangulLen);

	if(!wStatus) {
		_ET9ByteCopy(&g_KBackupInfo.KLingInfo, &g_KLingInfo, sizeof(ET9KLingInfo));
		_ET9ByteCopy(&g_KBackupInfo.HangulWord, &g_KHangulWord, sizeof(ET9KHangulWord));
		g_KBackupInfo.nTotalWords = g_KLingInfo.sAWLingCmnInfo.Private.bTotalWords;
		g_KBackupInfo.nActivewordIndex =  g_KLingInfo.sAWLingCmnInfo.Private.bDefaultIndex;
		g_bIsBackUpAvailable = 1;
	}
	
	(*env)->ReleaseShortArrayElements(env, psHangulBuf, (jshort *)_psHangulBuf, 0);
	(*env)->ReleaseShortArrayElements(env, pwHangulLen, (jshort *)_pwHangulLen, 0);
	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KSelectHangul
  (JNIEnv *env, jclass jcls, jbyte bHangulIndex)
{
	jshort wStatus = ET9STATUS_NONE;
	wStatus = ET9KSelectHangul(&g_KLingInfo, bHangulIndex);
	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KNoteHangulDone
  (JNIEnv *env, jclass jcls, jshortArray psHangul, jshort wHangulLen)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9U16  *_psHangul       = (ET9U16  *)(*env)->GetShortArrayElements(env, psHangul, NULL);
	wStatus = ET9KNoteHangulDone(&g_KLingInfo, _psHangul, wHangulLen);
	(*env)->ReleaseShortArrayElements(env, psHangul, (jshort *)_psHangul, 0);
	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9_1K_1Hangul2Jamo
  (JNIEnv *env, jclass jcls, jcharArray pHangulStr, jshort wHangulStrLen, jobject pJamo, jboolean bLeadingUpper)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9SimpleWord jamo;
	ET9SYMB  *_pHangulStr       = (ET9SYMB  *)(*env)->GetCharArrayElements(env, pHangulStr, NULL);
	
	wStatus = ET9_K_Hangul2Jamo(_pHangulStr, wHangulStrLen, &jamo, bLeadingUpper);
	ET9Word_SetSimpleWords(env, jcls, &pJamo, jamo);
	(*env)->ReleaseCharArrayElements(env, pHangulStr, (jchar *)_pHangulStr, 0);
	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KCompatibilityJamoToJamo
  (JNIEnv *env, jclass jcls, jcharArray pwJamo, jchar wLen)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9U16  *_pwJamo       = (ET9U16  *)(*env)->GetCharArrayElements(env, pwJamo, NULL);
	
	wStatus = ET9KCompatibilityJamoToJamo(_pwJamo, wLen);
	(*env)->ReleaseCharArrayElements(env, pwJamo, (jchar *)_pwJamo, 0);
	return wStatus;
}

#endif // ET9_KOREAN_MODULE

#ifdef ET9_HANDWRITING_MODULE
/*----------------------------------------------------------------------------
 *  Hand Writing Input Module  ** REMOVABLE **
 *----------------------------------------------------------------------------*/
JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWHwr_1Init
  (JNIEnv *env, 
	jclass jcls, 
	jshort wLangNum, 
	jbyteArray pHwrDatabase, 
	jbyteArray pHwrWorkBuf, 
	jshort wWorkBufSize)
{
	jshort wStatus = ET9STATUS_NONE;
	void *pPublicExtension = NULL; // TODO:voidp


	ET9U8 *_pHwrDatabase = (ET9U8 *)(*env)->GetByteArrayElements(env, pHwrDatabase, NULL);
	ET9U8 *_pHwrWorkBuf  = (ET9U8 *)(*env)->GetByteArrayElements(env, pHwrWorkBuf, NULL);

	wStatus = ET9AWHwr_Init(&g_pHwrInfo, wLangNum, _pHwrDatabase, _pHwrWorkBuf, wWorkBufSize, ET9AWHandle_HWR_Request, pPublicExtension);

	(*env)->ReleaseByteArrayElements(env, pHwrDatabase, (jbyte *)_pHwrDatabase, 0);
	(*env)->ReleaseByteArrayElements(env, pHwrWorkBuf, (jbyte *)_pHwrWorkBuf, 0);

	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWHwr_1SetPadSize
  (JNIEnv *env, 
	jclass jcls, 
	jint minX, 
	jint minY, 
	jint maxX, 
	jint maxY)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9AWHwr_SetPadSize(&g_pHwrInfo, minX, minY, maxX, maxY);

	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWHwr_1SetRecognitionMode
  (JNIEnv *env, 
	jclass jcls, 
	jbyte eMode)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9AWHwr_SetRecognitionMode(&g_pHwrInfo, eMode);

	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWHwr_1SetLanguage
  (JNIEnv *env, 
	jclass jcls, 
	jshort wLangNum)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9AWHwr_SetLanguage(&g_pHwrInfo, wLangNum);

	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWHwr_1GetLanguage
  (JNIEnv *env, 
	jclass jcls, 
	jshortArray pwLdbNum)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9U16 *_pwLdbNum  = (ET9U16 *)(*env)->GetShortArrayElements(env, pwLdbNum, NULL);

	wStatus = ET9AWHwr_GetLanguage(&g_pHwrInfo, _pwLdbNum);

	(*env)->ReleaseShortArrayElements(env, pwLdbNum, (jshort *)_pwLdbNum, 0);

	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWHwr_1AddPoint
  (JNIEnv *env, 
	jclass jcls, 
	jint pointX, 
	jint pointY)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9AWHwr_AddPoint(&g_pHwrInfo, pointX, pointY);

	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWHwr_1HandlePenDown
  (JNIEnv *env, 
	jclass jcls, 
	jint pointX, 
	jint pointY)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9AWHwr_HandlePenDown(&g_pHwrInfo, pointX, pointY);

	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWHwr_1HandlePenUp
  (JNIEnv *env, 
	jclass jcls, 
	jobject jobj_pWordSymbInfo, 
	jbyte bCurrIndexInList, 
	jshortArray psFunctionKey)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9U16 *_psFunctionKey = (ET9U16 *)(*env)->GetShortArrayElements(env, psFunctionKey, NULL);

	/* get fields */
	ET9Word_GetWordSymbInfo(env, jcls, &g_WordSymbInfo, jobj_pWordSymbInfo);

	wStatus = ET9AWHwr_HandlePenUp(&g_pHwrInfo, &g_WordSymbInfo, bCurrIndexInList, _psFunctionKey);

	/* set fields */
	ET9Word_SetWordSymbInfo(env, jcls, &jobj_pWordSymbInfo, g_WordSymbInfo);

	(*env)->ReleaseShortArrayElements(env, psFunctionKey, (jshort *)_psFunctionKey, 0);

	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWHwr_1ProcessStrokes
  (JNIEnv *env, 
	jclass jcls, 
	jobject jobj_pWordSymbInfo, 
	jint nTimerID, 
	jbyte bCurrIndexInList, 
	jshortArray psFunctionKey)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9U16 *_psFunctionKey = (ET9U16 *)(*env)->GetShortArrayElements(env, psFunctionKey, NULL);

	/* get fields */
	ET9Word_GetWordSymbInfo(env, jcls, &g_WordSymbInfo, jobj_pWordSymbInfo);
	
	wStatus = ET9AWHwr_ProcessStrokes(&g_pHwrInfo, &g_WordSymbInfo, nTimerID, bCurrIndexInList, _psFunctionKey);

	/* set fields */
	ET9Word_SetWordSymbInfo(env, jcls, &jobj_pWordSymbInfo, g_WordSymbInfo);

	(*env)->ReleaseShortArrayElements(env, psFunctionKey, (jshort *)_psFunctionKey, 0);

	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWHwr_1SetUnShift
  (JNIEnv *env, 
	jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9AWHwr_SetUnShift(&g_pHwrInfo, &g_WordSymbInfo);

	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWHwr_1SetShift
  (JNIEnv *env, 
	jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9AWHwr_SetShift(&g_pHwrInfo, &g_WordSymbInfo);

	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9AWHwr_1SetCapsLock
  (JNIEnv *env, 
	jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;

	wStatus = ET9AWHwr_SetCapsLock(&g_pHwrInfo, &g_WordSymbInfo);
		
	return wStatus;
}

#endif // ET9_HANDWRITING_MODULE

#ifdef ET9_KDB_TRACE_MODULE
JNIEXPORT jboolean JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KDB_1IsAutoAcceptBeforeTrace
  (JNIEnv *env, jclass jcls, jobjectArray pPoints, jint nPointCount, jbooleanArray pbAddSpace)
{
	jboolean wStatus = ET9STATUS_ERROR;

	
	ET9BOOL *_pbAddSpace = (ET9BOOL *)(*env)->GetBooleanArrayElements(env, pbAddSpace, NULL);
	ET9_GetTracePoint(env, jcls, g_TracePoint, pPoints, nPointCount);
	
	wStatus = ET9KDB_IsAutoAcceptBeforeTrace(&g_KdbInfo, &g_WordSymbInfo, g_TracePoint, nPointCount, _pbAddSpace);
	(*env)->ReleaseBooleanArrayElements(env, pbAddSpace, (jboolean *)pbAddSpace, 0);

	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KDB_1ProcessTrace
  (JNIEnv *env, jclass jcls,
  jobjectArray pTracePoints,
  jint nTracePointCount,
  jbyte bCurrIndexInList
  )
{
	jshort wStatus = ET9STATUS_ERROR;
	ET9SYMB sFunctionKey;
	
	ET9_GetTracePoint(env, jcls, g_TracePoint, pTracePoints, nTracePointCount);
	
	wStatus = ET9KDB_ProcessTrace(&g_KdbInfo, &g_WordSymbInfo, g_TracePoint, nTracePointCount, bCurrIndexInList, &sFunctionKey);
	
	return wStatus;	
}
#endif // ET9_KDB_TRACE_MODULE

#ifdef ET9_CHINESE_MODULE
JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPSysInit
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	wStatus = ET9CPSysInit(&g_CPLingInfo, &g_WordSymbInfo, NULL);

	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPLdbInit
  (JNIEnv *env, jclass jcls, jshort wLdbNum)
{
	jshort wStatus = ET9STATUS_NONE;
	wStatus = ET9CPLdbInit(&g_CPLingInfo, wLdbNum, ET9CP_LdbReadData);

	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPLdbValidate
  (JNIEnv *env, jclass jcls, jshort wLdbNum)
{
	jshort wStatus = ET9STATUS_NONE;
	wStatus = ET9CPLdbValidate(&g_CPLingInfo, wLdbNum, ET9CP_LdbReadData);

	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPGetChineseLdbNum
  (JNIEnv *env, jclass jcls)
{
	return g_CPLingInfo.wLdbNum;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPSetInputMode
  (JNIEnv *env, jclass jcls, jbyte eMode)
{
	jshort wStatus = ET9STATUS_NONE;
	wStatus = ET9CPSetInputMode(&g_CPLingInfo, eMode);

	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPSetNameInput
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	wStatus = ET9CPSetNameInput(&g_CPLingInfo);

	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPClearNameInput
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	wStatus = ET9CPClearNameInput(&g_CPLingInfo);

	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPSetSmartPunct
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	wStatus = ET9CPSetSmartPunct(&g_CPLingInfo);

	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPClearSmartPunct
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	wStatus = ET9CPClearSmartPunct(&g_CPLingInfo);

	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPSetMohuPairs
  (JNIEnv *env, jclass jcls, jshort wMohuPairBitMask)
{
	jshort wStatus = ET9STATUS_NONE;
	wStatus = ET9CPSetMohuPairs(&g_CPLingInfo, wMohuPairBitMask);

	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPIsMohuPairEnabled
  (JNIEnv *env, jclass jcls, jbyte eMohuPair)
{
	jshort wStatus = ET9STATUS_NONE;
	wStatus = ET9CPIsMohuPairEnabled(&g_CPLingInfo, eMohuPair);

	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPSetComponent
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	wStatus = ET9CPSetComponent(&g_CPLingInfo);

	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPClearComponent
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	wStatus = ET9CPClearComponent(&g_CPLingInfo);

	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPSetPartialSpell
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	wStatus = ET9CPSetPartialSpell(&g_CPLingInfo);

	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPClearPartialSpell
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	wStatus = ET9CPClearPartialSpell(&g_CPLingInfo);

	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPSetFullSentence
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	wStatus = ET9CPSetFullSentence(&g_CPLingInfo);

	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPClearFullSentence
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	wStatus = ET9CPClearFullSentence(&g_CPLingInfo);

	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPGetSpecialPhrase
  (JNIEnv *env, jclass jcls, jbyte ePhraseType, jshort wPhraseIndex, jobject psPhrase)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9CPGetSpecialPhrase(&g_CPLingInfo, ePhraseType, wPhraseIndex, &g_CPPhrase);

	ET9CP_SetPhrase(env, jcls, &psPhrase, &g_CPPhrase);

	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPSelectSpecialPhrase
  (JNIEnv *env, jclass jcls, jbyte ePhraseType, jshort wPhraseIndex)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9CPSelectSpecialPhrase(&g_CPLingInfo, ePhraseType, wPhraseIndex);

	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPSetAW
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9CPSetAW(&g_CPLingInfo, &g_pLingInfo);

	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPIsAWActive
  (JNIEnv *env, jclass jcls)
{
	if( g_CPLingInfo.pAWLing )
		return ET9STATUS_NONE;
	return ET9STATUS_NO_INIT;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPTraceInit
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9CPTraceInit(&g_CPLingInfo, &g_pLingInfo);

	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPAddToneSymb
  (JNIEnv *env, jclass jcls, jbyte bTone)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9CPAddToneSymb(&g_WordSymbInfo, &g_CPSpell, bTone);
	
	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPBuildSelectionList
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9CPBuildSelectionList(&g_CPLingInfo);

	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPGetSelection
  (JNIEnv *env, jclass jcls, jobject pUnicodePhrase, jobject psSpell, jbyteArray pbSelSymbCount)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9U8 *_pbSelSymbCount = NULL;
	if(pbSelSymbCount != NULL) {
		_pbSelSymbCount = (ET9U8 *)(*env)->GetByteArrayElements(env, pbSelSymbCount, NULL);
	}
	
	_ET9ByteSet(&g_CPSpell, sizeof(ET9CPSpell), NULL);
	_ET9ByteSet(&g_CPPhrase, sizeof(ET9CPPhrase), NULL);
	wStatus = ET9CPGetSelection(&g_CPLingInfo, &g_CPPhrase, &g_CPSpell, _pbSelSymbCount);
	
	if(pUnicodePhrase != NULL) {
		ET9CP_SetPhrase(env, jcls, &pUnicodePhrase, &g_CPPhrase);
	}
	if(psSpell != NULL) {
		ET9CP_SetSpell(env, jcls, &psSpell, &g_CPSpell);
	}
	if(pbSelSymbCount != NULL) {
		(*env)->ReleaseByteArrayElements(env, pbSelSymbCount, (jbyte *)_pbSelSymbCount, 0);
	}
	return wStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPGetSpell
  (JNIEnv *env, jclass jcls, jobject psSpell)
{
	jshort wStatus = ET9STATUS_NONE;

	_ET9ByteSet(&g_CPSpell, sizeof(ET9CPSpell), NULL);
	wStatus = ET9CPGetSpell(&g_CPLingInfo, &g_CPSpell);

	ET9CP_SetSpell(env, jcls, &psSpell, &g_CPSpell);
	return wStatus;
}

JNIEXPORT jbyte JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPGetPrefixCount
  (JNIEnv *env, jclass jcls)
{
	jbyte bStatus = ET9STATUS_NONE;
	
	bStatus = ET9CPGetPrefixCount(&g_CPLingInfo);

	return bStatus;
}

JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPGetPrefix
  (JNIEnv *env, jclass jcls, jshort wIndex, jobject psSpell)
{
	jshort wStatus = ET9STATUS_NONE;

	_ET9ByteSet(&g_CPSpell, sizeof(ET9CPSpell), NULL);
	wStatus = ET9CPGetPrefix(&g_CPLingInfo, wIndex, &g_CPSpell);
	
	ET9CP_SetSpell(env, jcls, &psSpell, &g_CPSpell);
	
	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPGetPhrase
  (JNIEnv *env, jclass jcls, jshort wPhraseIndex, jobject psPhrase, jobject psSpell)
{
	jshort wStatus = ET9STATUS_NONE;

	_ET9ByteSet(&g_CPSpell, sizeof(ET9CPSpell), NULL);
	_ET9ByteSet(&g_CPPhrase, sizeof(ET9CPPhrase), NULL);
	wStatus = ET9CPGetPhrase(&g_CPLingInfo, wPhraseIndex, &g_CPPhrase, &g_CPSpell);

	if(psPhrase != NULL)
		ET9CP_SetPhrase(env, jcls, &psPhrase, &g_CPPhrase);
	if(psSpell != NULL)
		ET9CP_SetSpell(env, jcls, &psSpell, &g_CPSpell);

	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPSetActivePrefix
  (JNIEnv *env, jclass jcls, jbyte bPrefixIndex)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9CPSetActivePrefix(&g_CPLingInfo, bPrefixIndex);

	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPSelectPhrase
  (JNIEnv *env, jclass jcls, jshort wPhraseIndex, jobject psSpell)
{
	jshort wStatus = ET9STATUS_NONE;

	_ET9ByteSet(&g_CPSpell, sizeof(ET9CPSpell), NULL);
	_ET9ByteSet(&g_CPPhrase, sizeof(ET9CPPhrase), NULL);
	wStatus = ET9CPSelectPhrase(&g_CPLingInfo, wPhraseIndex, &g_CPSpell);

	ET9CP_SetSpell(env, jcls, &psSpell, &g_CPSpell);
	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPCommitSelection
 (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9CPCommitSelection(&g_CPLingInfo);

	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPUnselectPhrase
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9CPUnselectPhrase(&g_CPLingInfo);

	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPUnselectAll
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9CPUnselectAll(&g_CPLingInfo);

	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPClearContext
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9CPClearContext(&g_CPLingInfo);

	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPSetContext
  (JNIEnv *env, jclass jcls, jshortArray psContext, jint nContextLength)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9SYMB *_psContext = (ET9U16 *)(*env)->GetShortArrayElements(env, psContext, NULL);
	
	wStatus = ET9CPSetContext(&g_CPLingInfo, _psContext, nContextLength);

	(*env)->ReleaseShortArrayElements(env, psContext, (jshort *)_psContext, 0);
	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPUdbActivate
  (JNIEnv *env, jclass jcls, jbyteArray pUdb, jshort wDataSize)
{
	jshort wStatus = ET9STATUS_NONE;
	if (g_pCPUdbInfo==NULL) {
		g_pCPUdbInfo = (ET9U8 *)(*env)->GetByteArrayElements(env, pUdb, NULL);
	}
	
	wStatus = ET9CPUdbActivate(&g_CPLingInfo, NULL, (ET9CPUdbInfo*)g_pCPUdbInfo, wDataSize);

	return wStatus;	
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPUdbReset
  (JNIEnv *env, jclass jcls)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9CPUdbReset(&g_CPLingInfo);

	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPUdbAddPhrase
  (JNIEnv *env, jclass jcls, jobject psPhrase, jshortArray psSpell, jbyte bSpellLen)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9SYMB *_psSpell = (ET9U16 *)(*env)->GetShortArrayElements(env, psSpell, NULL);
	
	wStatus = ET9CPUdbAddPhrase(&g_CPLingInfo, &g_CPPhrase, psSpell, bSpellLen);

	(*env)->ReleaseShortArrayElements(env, psSpell, (jshort *)_psSpell, 0);
	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPUdbGetPhrase
  (JNIEnv *env, jclass jcls, jshort wTypeMask, jshort wIndex, jobject psPhrase, jobject psSpell)
{
	jshort wStatus = ET9STATUS_NONE;
	
	_ET9ByteSet(&g_CPSpell, sizeof(ET9CPSpell), NULL);
	_ET9ByteSet(&g_CPPhrase, sizeof(ET9CPPhrase), NULL);

	wStatus = ET9CPUdbGetPhrase(&g_CPLingInfo,wTypeMask, wIndex, &g_CPPhrase, &g_CPSpell);

	ET9CP_SetPhrase(env, jcls, &psPhrase, &g_CPPhrase);
	ET9CP_SetSpell(env, jcls, &psSpell, &g_CPSpell);
	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPUdbGetPhraseCount
  (JNIEnv *env, jclass jcls, jshort wTypeMask, jshortArray pwCount)
{
	jshort wStatus = ET9STATUS_NONE;
	ET9U16 *_pwCount = (ET9U16 *)(*env)->GetShortArrayElements(env, pwCount, NULL);
	
	wStatus = ET9CPUdbGetPhraseCount(&g_CPLingInfo, wTypeMask, _pwCount);

	(*env)->ReleaseShortArrayElements(env, pwCount, (jshort *)_pwCount, 0);
	return wStatus;
}


JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9CPUdbDeletePhrase
  (JNIEnv *env, jclass jcls, jobject psPhrase)
{
	jshort wStatus = ET9STATUS_NONE;
	
	wStatus = ET9CPUdbDeletePhrase(&g_CPLingInfo, &g_CPPhrase);

	return wStatus;
}
JNIEXPORT jshort JNICALL Java_com_diotek_ime_framework_engine_xt9_Xt9core_ET9KDBRecaptureWord
  (JNIEnv *env, jclass jcls,
  jcharArray psWord, 
  jshort wWordLen
  )
{
	jshort wStatus = ET9STATUS_ERROR;
	ET9SYMB *_psWord = (ET9SYMB *)(*env)->GetCharArrayElements(env, psWord, NULL);
	ET9SYMB * dummy = NULL;
	ET9SYMB symbolChar;

	int count = 0;

	for (count ; count < wWordLen; count++) {
		symbolChar = (ET9SYMB) _psWord[count];
	       wStatus = ET9KDB_ProcessKeyBySymbol(&g_KdbInfo, &g_WordSymbInfo, symbolChar, ET9_NO_ACTIVE_INDEX, &dummy, 0);
		if (wStatus != ET9STATUS_NONE) {
			ET9ClearAllSymbs(&g_WordSymbInfo);
			break;
		}
	}

	(*env)->ReleaseCharArrayElements(env, psWord, (jchar *)_psWord, 0);
	
	return wStatus;	
}
#endif
