/**
 * 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 "et9hwrUtil.h"
#include "et9cmmUtil.h"

#ifdef ET9_HANDWRITING_MODULE
/*----------------------------------------------------------------------------
 *  Callback Functions
 *----------------------------------------------------------------------------*/
ET9STATUS ET9FARCALL ET9AWHandle_HWR_Request(ET9AWHwrInfo      *pHwrInfo,
                                             ET9AW_HWR_Request *pHWRRequest)
{
	ET9STATUS wStatus = ET9STATUS_NONE;

	//TODO

	return wStatus;
}

/*----------------------------------------------------------------------------
 *  Get Functions
 *----------------------------------------------------------------------------*/
ET9STATUS ET9FARCALL ET9AWHwr_GetART_HWRData(JNIEnv *env, jclass jcls, ART_HWRData *art_hwrdate, jobject jobj)
{
	jclass cls;

	if(env == NULL || art_hwrdate == NULL)
		return ET9STATUS_INVALID_MEMORY;
	
	cls = (*env)->GetObjectClass(env, jobj);

	//TODO:String art_hwrdate->pInternalLanguageDict
	//TODO:voidp art_hwrdate->pHwr
	art_hwrdate->iHwrLen               = (*env)->GetIntField(env, jobj, (*env)->GetFieldID(env, cls, "iHwrLen ", "I"));

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9AWHwr_GetART_WritingAreaInfo(JNIEnv *env, jclass jcls, ART_WritingAreaInfo *wai, jobject jobj)
{
	jclass cls;

	if(env == NULL || wai == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, jobj);

	wai->maxX = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "maxX", "S"));
	wai->maxY = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "maxY", "S"));
	wai->minX = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "minX", "S"));
	wai->minY = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "minY", "S"));

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9AWHwr_GetHwrNBestSym(JNIEnv *env, jclass jcls, ET9AWHwrNBestSym *sRecogSyms, jobject jobj)
{
	jclass cls;
	jobject jobj_sSyms;

	short *temp;

	if(env == NULL || sRecogSyms == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, jobj);

	GetShortObjectArray(env, jcls, sRecogSyms->sSyms,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "sSyms", "[S")), MAX_N_BEST);

	GetShortObjectArray(env, jcls, sRecogSyms->nSymScores,
		(*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "nSymScores", "[S")), MAX_N_BEST);

	sRecogSyms->wAltSymCount = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wAltSymCount", "S"));

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9AWHwr_GetHwrPrivate(JNIEnv *env, jclass jcls, ET9AWHwrPrivate *Private, jobject jobj)
{
	jclass cls;
	jobject jobj_art_hwrdate, jobj_sRecogSyms;

	if(env == NULL || Private == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, jobj);

	jobj_art_hwrdate = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "art_hwrdate",   "Lcom/xt9/core/Xt9Datatype$S_ART_HWRData;"));
//TODO	ET9AWHwr_GetART_HWRData(env, jcls, &Private->art_hwrdate, jobj_art_hwrdate);

	Private->wRecogSymCount = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wRecogSymCount",    "S"));
	Private->wSavedRecogSymCount = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wSavedRecogSymCount",    "S"));

	// TODO:object_array
	//jobj_sRecogSyms = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "sRecogSyms",   "Lcom/xt9/core/Xt9Datatype$S_ET9AWHwrNBestSym;"));
 	//ET9AWHwr_GetHwrNBestSym(env, jcls, &Private->sRecogSyms[0], jobj_sRecogSyms);

	Private->wInfoInitOK = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wInfoInitOK",    "S"));
	Private->wHDBInitOK = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wHDBInitOK",    "S"));

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9AWHwr_GetHwrInfo(JNIEnv *env, jclass jcls, ET9AWHwrInfo *pHwrInfo, jobject jobj)
{
	jclass cls;
	jobject jobj_wai, jboj_Private;

	if(env == NULL || pHwrInfo == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, jobj);
	pHwrInfo->dwStateBits = (*env)->GetIntField(env, jobj, (*env)->GetFieldID(env, cls, "dwStateBits",    "I"));
	//TODO:callback	pHwrInfo->ET9AWHandle_HWR_Request
	pHwrInfo->wLangID = (*env)->GetShortField(env, jobj, (*env)->GetFieldID(env, cls, "wLangID",    "S"));
	//TODO:voidp	pHwrInfo->pPublicExtension

	jobj_wai = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "wai",   "Lcom/xt9/core/Xt9Datatype$S_ART_WritingAreaInfo;"));
	ET9AWHwr_GetART_WritingAreaInfo(env, jcls, &pHwrInfo->wai, jobj_wai);

	pHwrInfo->eRecogMode = (*env)->GetByteField(env, jobj, (*env)->GetFieldID(env, cls, "eRecogMode",    "B"));
	
	jboj_Private = (*env)->GetObjectField(env, jobj, (*env)->GetFieldID(env, cls, "Private",   "Lcom/xt9/core/Xt9Datatype$S_ET9AWHwrPrivate;"));
	ET9AWHwr_GetHwrPrivate(env, jcls, &pHwrInfo->Private, jboj_Private);

	return ET9STATUS_NONE;
}


/*----------------------------------------------------------------------------
 *  Set Functions
 *----------------------------------------------------------------------------*/
ET9STATUS ET9FARCALL ET9AWHwr_SetART_HWRData(JNIEnv *env, jclass jcls, jobject *jobj, ART_HWRData art_hwrdate)
{
	jclass cls;

	if(env == NULL || jobj == NULL)
		return ET9STATUS_INVALID_MEMORY;
	
	cls = (*env)->GetObjectClass(env, *jobj);

	//TODO:String art_hwrdate.pInternalLanguageDict
	//TODO:voidp art_hwrdate.pHwr
	(*env)->SetIntField(env, *jobj, (*env)->GetFieldID(env, cls, "iHwrLen", "I"), art_hwrdate.iHwrLen);

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9AWHwr_SetART_WritingAreaInfo(JNIEnv *env, jclass jcls, jobject *jobj, ART_WritingAreaInfo wai)
{
	jclass cls;

	if(env == NULL || jobj == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, *jobj);

	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "maxX", "S"), wai.maxX);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "maxY", "S"), wai.maxY);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "minX", "S"), wai.minX);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "minY", "S"), wai.minY);

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9AWHwr_SetHwrNBestSym(JNIEnv *env, jclass jcls, jobject *jobj, ET9AWHwrNBestSym sRecogSyms)
{
	jclass cls;

	if(env == NULL || jobj == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, *jobj);

	SetShortObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "sSyms", "[S")), sRecogSyms.sSyms, ET9MAXLDBWORDSIZE);

	SetShortObjectArray(env, jcls, 
		(*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "nSymScores", "[S")), sRecogSyms.nSymScores, ET9MAXLDBWORDSIZE);

	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wAltSymCount", "S"), sRecogSyms.wAltSymCount);

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9AWHwr_SetHwrPrivate(JNIEnv *env, jclass jcls, jobject *jobj, ET9AWHwrPrivate Private)
{
	jclass cls;
	jobject jobj_art_hwrdate, jobj_sRecogSyms;

	if(env == NULL || jobj == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, *jobj);

	jobj_art_hwrdate = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "art_hwrdate",   "Lcom/xt9/core/Xt9Datatype$S_ART_HWRData;"));
	ET9AWHwr_SetART_HWRData(env, jcls, &jobj_art_hwrdate, Private.art_hwrdate);

	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wRecogSymCount", "S"), Private.wRecogSymCount);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wSavedRecogSymCount", "S"), Private.wSavedRecogSymCount);

	// TODO:object array
	//jobj_sRecogSyms = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "sRecogSyms",   "Lcom/xt9/core/Xt9Datatype$S_ET9AWHwrNBestSym;"));
 	//ET9AWHwr_SetHwrNBestSym(env, jcls, &jobj_sRecogSyms, Private.sRecogSyms[0]);

	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wInfoInitOK", "S"), Private.wInfoInitOK);
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wHDBInitOK", "S"), Private.wHDBInitOK);

	return ET9STATUS_NONE;
}

ET9STATUS ET9FARCALL ET9AWHwr_SetHwrInfo(JNIEnv *env, jclass jcls, jobject *jobj, ET9AWHwrInfo pHwrInfo)
{
	jclass cls;
	jobject jobj_wai, jboj_Private;

	if(env == NULL || jobj == NULL)
		return ET9STATUS_INVALID_MEMORY;

	cls = (*env)->GetObjectClass(env, *jobj);
	(*env)->SetIntField  (env, *jobj, (*env)->GetFieldID(env, cls, "dwStateBits",    "I"), pHwrInfo.dwStateBits);
	//TODO:callback	pHwrInfo.ET9AWHandle_HWR_Request
	(*env)->SetShortField(env, *jobj, (*env)->GetFieldID(env, cls, "wLangID",        "S"), pHwrInfo.wLangID);
	//TODO:voidp	pHwrInfo.pPublicExtension

	jobj_wai = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "wai",   "Lcom/xt9/core/Xt9Datatype$S_ART_WritingAreaInfo;"));
	ET9AWHwr_SetART_WritingAreaInfo(env, jcls, &jobj_wai, pHwrInfo.wai);

	(*env)->SetByteField(env, *jobj, (*env)->GetFieldID(env, cls, "eRecogMode",      "B"), pHwrInfo.eRecogMode);

//	jboj_Private = (*env)->GetObjectField(env, *jobj, (*env)->GetFieldID(env, cls, "Private",   "Lcom/xt9/core/Xt9Datatype$S_ET9AWHwrPrivate;"));
//	ET9AWHwr_SetHwrPrivate(env, jcls, &jboj_Private, pHwrInfo.Private);

	return ET9STATUS_NONE;
}

#endif // ET9_HANDWRITING_MODULE
