/**
 * 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.
 */

#ifndef ET9ALPHA_UTIL_H
#define ET9ALPHA_UTIL_H

#include "com_xt9_Xt9core.h"
#include "et9api.h"
#include "et9cmmUtil.h"

#ifdef ET9_ALPHABETIC_MODULE
#ifdef LOAD_DB_FROM_FILE
#define MAX_LDB_LIST             256

typedef struct tagLDBFileInfo {
   ET9U8          filePath[MAX_FILE_PATH];
   ET9U16         ldbCode;
   ET9U32         fileSize;
} LDBFileInfo;


typedef struct ldbData{
	ET9U32 mLdbId;
	ET9U8 *mLdbData;
	ET9U32 mLdbDataSize;
}ET9LDBDATA;

void CloseLdbFileHandle();
#endif /* LOAD_DB_FROM_FILE */
/*----------------------------------------------------------------------------
 * Callback Functions
 *----------------------------------------------------------------------------*/
 /*
ET9STATUS ET9FARCALL ET9ReadTUDB(ET9U8 ET9FARDATA * const pData, 
                                 ET9U16 wSize,
                                 ET9U8 ET9FARDATA * const pTUDB,
                                 ET9U32 dwOffset);

ET9STATUS ET9FARCALL ET9WriteTUDB(ET9U8 ET9FARDATA * const pData,
                                  ET9U16 wSize,
                                  ET9U8 ET9FARDATA * const pTUDB,
                                  ET9U32 dwOffset);
*/
ET9STATUS ET9FARCALL ET9AW_ReadMdbData(
    ET9AWLingInfo *pLingInfo,    /**< I   - pointer to FieldInfo struct owning MDB */
    ET9REQMDB eMdbRequestType,   /**< I   - MDB request type. Should be one of the values defined above */
    ET9U16    wWordLen,          /**< I   - word length */
    ET9U16    wMaxWordLen,       /**< I   - maximum word length */
    ET9SYMB  *psBuildTxtBuf,     /**< O   - word to return */
    ET9U16   *pwActWordLen,      /**< O   - length of the returned word */
    ET9U32   *pdwWordListIdx     /**< I/O - MDB word list index */
);

#ifdef ET9_DIRECT_LDB_ACCESS
void InitLDBCache();
void DeleteLdb(ET9U16 ldbCode);
ET9STATUS ET9FARCALL ET9AW_LdbReadData(ET9AWLingInfo *pLingInfo, 
                                      ET9U8 * ET9FARDATA * ppbSrc,
                                      ET9U32 *pdwSizeInBytes);
ET9STATUS ET9FARCALL ET9CP_LdbReadData(ET9CPLingInfo *pLingInfo, 
                                      ET9U8 * ET9FARDATA * ppbSrc,
                                      ET9U32 *pdwSizeInBytes);
#else /* ET9_DIRECT_LDB_ACCESS */
ET9STATUS ET9FARCALL ET9AW_LdbReadData(ET9AWLingInfo *pLingInfo, ET9U32 dwOffset, 
                                      ET9U32 dwNumberOfBytesToRead, 
                                      ET9U8 *pbDst, ET9U32 *pdwNumberOfBytesRead);
ET9STATUS ET9FARCALL ET9CP_LdbReadData(ET9CPLingInfo *pLingInfo, ET9U32 dwOffset, 
                                      ET9U32 dwNumberOfBytesToRead, 
                                      ET9U8 *pbDst, ET9U32 *pdwNumberOfBytesRead);

#endif /* ET9_DIRECT_LDB_ACCESS */

ET9STATUS ET9FARCALL ET9AW_RUDBWriteData(
    ET9AWLingInfo    *pLingInfo,                    /**< pointer to Alpha information structure */
    ET9U8 ET9FARDATA *pbDest,                       /**< buffer for the data */
    ET9U8 ET9FARDATA *pbSource,                     /**< address to retrieve write data from */
    ET9UINT           unNumberOfWriteBytes          /**< number of bytes to be written */
);

ET9STATUS ET9FARCALL ET9AW_CDBWriteData(
    ET9AWLingInfo    *pLingInfo,                    /**< pointer to Alpha information structure */
    ET9U8 ET9FARDATA *pbDest,                       /**< buffer for the data */
    ET9U8 ET9FARDATA *pbSource,                     /**< address to retrieve write data from */
    ET9UINT           unNumberOfWriteBytes          /**< number of bytes to be written */
);

ET9STATUS ET9FARCALL ET9AW_ASDBWriteData(
    ET9AWLingInfo    *pLingInfo,                    /**< pointer to Alpha information structure */
    ET9U8 ET9FARDATA *pbDest,                       /**< buffer for the data */
    ET9U8 ET9FARDATA *pbSource,                     /**< address to retrieve write data from */
    ET9UINT           unNumberOfWriteBytes          /**< number of bytes to be written */
);

/*----------------------------------------------------------------------------
 * Get Functions
 *----------------------------------------------------------------------------*/
#ifdef ET9_FULL_INTERFACE
ET9STATUS ET9FARCALL ET9AW_GetMDBInfo       (JNIEnv *env, jclass jcls, ET9AWMDBInfo        *sMDBInfo,        jobject jobj);
ET9STATUS ET9FARCALL ET9_GetBaseLingInfo    (JNIEnv *env, jclass jcls, ET9BaseLingInfo     *Base,            jobject jobj);
ET9STATUS ET9FARCALL ET9AW_GetRUDBInfo      (JNIEnv *env, jclass jcls, ET9AWRUDBInfo       *pRUDBInfo,       jobject jobj);
ET9STATUS ET9FARCALL ET9AW_GetCDBInfo       (JNIEnv *env, jclass jcls, ET9AWCDBInfo        *pCDBInfo,        jobject jobj);
ET9STATUS ET9FARCALL ET9_GetLdbASRecMap     (JNIEnv *env, jclass jcls, ET9LdbASRecMap      *sLdbASRecord,    jobject jobj);
ET9STATUS ET9FARCALL ET9AW_GetASDBInfo      (JNIEnv *env, jclass jcls, ET9AWASDBInfo       *pASDBInfo,       jobject jobj);
ET9STATUS ET9FARCALL ET9_GetALdbHeaderData  (JNIEnv *env, jclass jcls, ET9ALdbHeaderData   *header,          jobject jobj);
ET9STATUS ET9FARCALL ET9_GetALdbCompareData (JNIEnv *env, jclass jcls, ET9ALdbCompareData  *compare,         jobject jobj);
ET9STATUS ET9FARCALL ET9_GetALdbCursorData  (JNIEnv *env, jclass jcls, ET9ALdbCursorData   *pCursors,        jobject jobj);
ET9STATUS ET9FARCALL ET9_GetALdbSearchData  (JNIEnv *env, jclass jcls, ET9ALdbSearchData   *search,          jobject jobj);
ET9STATUS ET9FARCALL ET9_GetALdb            (JNIEnv *env, jclass jcls, ET9ALdb             *ALdb,            jobject jobj);
ET9STATUS ET9FARCALL ET9_GetALDBAutoSub     (JNIEnv *env, jclass jcls, ET9ALDBAutoSub      *sLDBAutoSub,     jobject jobj);
ET9STATUS ET9FARCALL ET9AW_GetPrivWordInfo  (JNIEnv *env, jclass jcls, ET9AWPrivWordInfo   *PrivWordInfo,    jobject jobj);
ET9STATUS ET9FARCALL ET9_GetASPCCompareData (JNIEnv *env, jclass jcls, ET9ASPCCompareData  *sCmpData,        jobject jobj);
ET9STATUS ET9FARCALL ET9_GetASpc            (JNIEnv *env, jclass jcls, ET9ASpc             *ASpc,            jobject jobj);
ET9STATUS ET9FARCALL ET9AW_GetCaptureBuild  (JNIEnv *env, jclass jcls, ET9AWCaptureBuild   *pCaptures,       jobject jobj);
ET9STATUS ET9FARCALL ET9AW_GetCaptureAction (JNIEnv *env, jclass jcls, ET9AWCaptureAction  *pCaptureActions, jobject jobj);
ET9STATUS ET9FARCALL ET9AW_GetBuildInfo     (JNIEnv *env, jclass jcls, ET9AWBuildInfo      *sBuildInfo,      jobject jobj);
ET9STATUS ET9FARCALL ET9AW_GetLingCmnPrivate(JNIEnv *env, jclass jcls, ET9AWLingCmnPrivate *Private,         jobject jobj);
ET9STATUS ET9FARCALL ET9AW_GetLingCmnInfo   (JNIEnv *env, jclass jcls, ET9AWLingCmnInfo    *pLingCmnInfo,    jobject jobj);
ET9STATUS ET9FARCALL ET9AW_GetLingPrivate   (JNIEnv *env, jclass jcls, ET9AWLingPrivate    *Private,         jobject jobj);
ET9STATUS ET9FARCALL ET9AW_GetLingInfo      (JNIEnv *env, jclass jcls, ET9AWLingInfo       *pLingInfo,       jobject jobj);
#endif // ET9_FULL_INTERFACE
#ifdef ET9_LITE_INTERFACE
ET9STATUS ET9FARCALL ET9AW_GetWordInfo      (JNIEnv *env, jclass jcls, ET9AWWordInfo       *Base,            jobject jobj);
#endif // ET9_LITE_INTERFACE
/*----------------------------------------------------------------------------
 * Set Functions
 *----------------------------------------------------------------------------*/
#ifdef ET9_FULL_INTERFACE
ET9STATUS ET9FARCALL ET9AW_SetMDBInfo       (JNIEnv *env, jclass jcls, jobject *jobj, ET9AWMDBInfo        sMDBInfo);
ET9STATUS ET9FARCALL ET9_SetBaseLingInfo    (JNIEnv *env, jclass jcls, jobject *jobj, ET9BaseLingInfo     Base);
ET9STATUS ET9FARCALL ET9AW_SetRUDBInfo      (JNIEnv *env, jclass jcls, jobject *jobj, ET9AWRUDBInfo       pRUDBInfo);
ET9STATUS ET9FARCALL ET9AW_SetCDBInfo       (JNIEnv *env, jclass jcls, jobject *jobj ,ET9AWCDBInfo        pCDBInfo);
ET9STATUS ET9FARCALL ET9_SetLdbASRecMap     (JNIEnv *env, jclass jcls, jobject *jobj, ET9LdbASRecMap      sLdbASRecord);
ET9STATUS ET9FARCALL ET9AW_SetASDBInfo      (JNIEnv *env, jclass jcls, jobject *jobj, ET9AWASDBInfo       pASDBInfo);
ET9STATUS ET9FARCALL ET9_SetALdbHeaderData  (JNIEnv *env, jclass jcls, jobject *jobj, ET9ALdbHeaderData   header);
ET9STATUS ET9FARCALL ET9_SetALdbCompareData (JNIEnv *env, jclass jcls, jobject *jobj, ET9ALdbCompareData  compare);
ET9STATUS ET9FARCALL ET9_SetALdbCursorData  (JNIEnv *env, jclass jcls, jobject *jobj, ET9ALdbCursorData   pCursors);
ET9STATUS ET9FARCALL ET9_SetALdbSearchData  (JNIEnv *env, jclass jcls, jobject *jobj, ET9ALdbSearchData   search);
ET9STATUS ET9FARCALL ET9_SetALdb            (JNIEnv *env, jclass jcls, jobject *jobj, ET9ALdb             ALdb);
ET9STATUS ET9FARCALL ET9_SetALDBAutoSub     (JNIEnv *env, jclass jcls, jobject *jobj, ET9ALDBAutoSub      sLDBAutoSub);
ET9STATUS ET9FARCALL ET9AW_SetPrivWordInfo  (JNIEnv *env, jclass jcls, jobject *jobj, ET9AWPrivWordInfo   PrivWordInfo);
ET9STATUS ET9FARCALL ET9_SetASPCCompareData (JNIEnv *env, jclass jcls, jobject *jobj, ET9ASPCCompareData  sCmpData);
ET9STATUS ET9FARCALL ET9_SetASpc            (JNIEnv *env, jclass jcls, jobject *jobj, ET9ASpc             ASpc);
ET9STATUS ET9FARCALL ET9AW_SetCaptureBuild  (JNIEnv *env, jclass jcls, jobject *jobj, ET9AWCaptureBuild   pCaptures);
ET9STATUS ET9FARCALL ET9AW_SetCaptureAction (JNIEnv *env, jclass jcls, jobject *jobj, ET9AWCaptureAction  pCaptureActions);
ET9STATUS ET9FARCALL ET9AW_SetBuildInfo     (JNIEnv *env, jclass jcls, jobject *jobj, ET9AWBuildInfo      sBuildInfo);
ET9STATUS ET9FARCALL ET9AW_SetLingCmnPrivate(JNIEnv *env, jclass jcls, jobject *jobj, ET9AWLingCmnPrivate Private);
ET9STATUS ET9FARCALL ET9AW_SetLingCmnInfo   (JNIEnv *env, jclass jcls, jobject *jobj, ET9AWLingCmnInfo    pLingCmnInfo);
ET9STATUS ET9FARCALL ET9AW_SetLingPrivate   (JNIEnv *env, jclass jcls, jobject *jobj, ET9AWLingPrivate    Private);
ET9STATUS ET9FARCALL ET9AW_SetLingInfo      (JNIEnv *env, jclass jcls, jobject *jobj, ET9AWLingInfo       pLingInfo);
#endif // ET9_FULL_INTERFACE
#ifdef ET9_LITE_INTERFACE
ET9STATUS ET9FARCALL ET9AW_SetWordInfo      (JNIEnv *env, jclass jcls, jobject *jobj, ET9AWWordInfo       Base);

#endif // ET9_LITE_INTERFACE
void Util_VietDisassembleTone(ET9SYMB      * const psInBuf,
                              ET9U32         const dwInBufLen,
                              ET9U32         const dwWordStart,
                              ET9U16         const wWordLen,
                              ET9SYMB      * const psOutBuf,
                              ET9U32       * const pwOutBufLen,
                              ET9U32       * const pdwOutWordStart,
                              ET9U16       * const pwOutWordLen);
ET9BOOL IsVietnameseTone(ET9WordSymbInfo * const pWordSymbInfo, ET9U16 symIndex, ET9SYMB * const pSymb);
ET9BOOL IsVietnameseToneAllowed(ET9WordSymbInfo * const pWordSymbInfo,
                                       ET9U16            const symIndex,
                                       ET9BOOL         * const isTone,
                                       ET9SYMB         * const pSymb);



#endif // ET9_ALPHABETIC_MODULE
#endif // ET9ALPHA_UTIL_H

