/**
 * 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 ET9CMM_UTIL_H
#define ET9CMM_UTIL_H

#include "et9api.h"
#include "com_xt9_Xt9core.h"
#include <stdio.h>

//#define __DEBUG__
//#define SUPPORT_CALLBACK
//#define ET9_FULL_INTERFACE
#define ET9_LITE_INTERFACE

//SISO - AxT9IME - Start
//Commented
#define LOAD_DB_FROM_FILE
//SISO - AxT9IME - End

#define USE_HEAP_BUFFER

#define FALSE   0
#define TRUE    1
#define MAX_LOG_TAG_SIZE 10
#define MAX_LOG_MSG_SIZE 100

typedef struct CallbackInterface_s {
	ET9BOOL   InitOK;
	jobject   obj;
	JNIEnv    *env;

} CallbackInterface;

#ifdef __DEBUG__
typedef struct Log_s {
//	char tag[MAX_LOG_TAG_SIZE]; /* reserved */
	char msg[MAX_LOG_MSG_SIZE];
} Log;
#endif

#ifdef LOAD_DB_FROM_FILE
//#define DB_FILE_PATH      "/data/data/com.sec.android.inputmethod.axt9"
#define DB_FILE_PATH      "/system/T9DB"
#define DB_FILE_PATH_2      "/system/chn_sipdb/t9db"
#define DOWNLOAD_DB_FILE_PATH      "/data/data/com.sec.android.inputmethod/files"
#define MAX_FILE_PATH     256
#define DB_BUFFER_SIZE    60
#endif

/*----------------------------------------------------------------------------
 * MACROS
 *----------------------------------------------------------------------------*/
#ifdef __DEBUG__
#define LOG(MSG) sprintf(log.msg, MSG); \
	PrintMessage(log.msg);

#define LOG1(MSG, ARG1) sprintf(log.msg, MSG, ARG1); \
	PrintMessage(log.msg);

#define LOG2(MSG, ARG1, ARG2) sprintf(log.msg, MSG, ARG1, ARG2); \
	PrintMessage(log.msg);

#define LOG3(MSG, ARG1, ARG2, ARG3) sprintf(log.msg, MSG, ARG1, ARG2, ARG3); \
	PrintMessage(log.msg);
#else
#define LOG(MSG)
#define LOG1(MSG, ARG1)
#define LOG2(MSG, ARG1, ARG2)
#define LOG3(MSG, ARG1, ARG2, ARG3)
#endif

/*----------------------------------------------------------------------------
 * variable declaration
 *----------------------------------------------------------------------------*/
#ifdef __DEBUG__
extern Log log;
#endif

/*----------------------------------------------------------------------------
 * Function declaration
 *----------------------------------------------------------------------------*/

#ifdef SUPPORT_CALLBACK
ET9STATUS ET9FARCALL ET9InitCallback(JNIEnv *env, jobject obj);
ET9STATUS ET9FARCALL ET9ClearCallback(JNIEnv *env);

jlong GetCurrentTimeMillis(void);
ET9STATUS ET9FARCALL ET9SetMultitapStartTime(jlong startTime);
#endif // SUPPORT_CALLBACK
#ifdef __DEBUG__
void ET9FARCALL PrintMessage(char *msg);
#endif

#ifdef LOAD_DB_FROM_FILE
ET9STATUS MakeDBFileList(ET9U8 *filePath);
ET9BOOL GetMakeDBListFlag();
void SetMakeDBListFlag(ET9BOOL flag);
#endif

/*----------------------------------------------------------------------------
 * Get Array <Type> object Function
 *----------------------------------------------------------------------------*/
ET9STATUS ET9FARCALL GetBooleanObjectArray(JNIEnv *env, jclass jcls, ET9BOOL *nat_array, jobject jobj_array, int max_array);
ET9STATUS ET9FARCALL GetByteObjectArray   (JNIEnv *env, jclass jcls, ET9U8   *nat_array, jobject jobj_array, int max_array);
ET9STATUS ET9FARCALL GetCharObjectArray   (JNIEnv *env, jclass jcls, ET9U16  *nat_array, jobject jobj_array, int max_array);
ET9STATUS ET9FARCALL GetShortObjectArray  (JNIEnv *env, jclass jcls, ET9U16  *nat_array, jobject jobj_array, int max_array);
ET9STATUS ET9FARCALL GetIntObjectArray    (JNIEnv *env, jclass jcls, ET9INT  *nat_array, jobject jobj_array, int max_array);
ET9STATUS ET9FARCALL GetLongObjectArray   (JNIEnv *env, jclass jcls, ET9U32  *nat_array, jobject jobj_array, int max_array);
ET9STATUS ET9FARCALL GetFloatObjectArray  (JNIEnv *env, jclass jcls, jfloat  *nat_array, jobject jobj_array, int max_array);
ET9STATUS ET9FARCALL GetDoubleObjectArray (JNIEnv *env, jclass jcls, jdouble *nat_array, jobject jobj_array, int max_array);

/*----------------------------------------------------------------------------
 * Set Array <Type> object Function
 *----------------------------------------------------------------------------*/
ET9STATUS ET9FARCALL SetBooleanObjectArray(JNIEnv *env, jclass jcls, jobject jobj_array, ET9BOOL *nat_array, int max_array);
ET9STATUS ET9FARCALL SetByteObjectArray   (JNIEnv *env, jclass jcls, jobject jobj_array, ET9U8   *nat_array, int max_array);
ET9STATUS ET9FARCALL SetCharObjectArray   (JNIEnv *env, jclass jcls, jobject jobj_array, ET9U16  *nat_array, int max_array);
ET9STATUS ET9FARCALL SetShortObjectArray  (JNIEnv *env, jclass jcls, jobject jobj_array, ET9U16  *nat_array, int max_array);
ET9STATUS ET9FARCALL SetIntObjectArray    (JNIEnv *env, jclass jcls, jobject jobj_array, ET9INT  *nat_array, int max_array);
ET9STATUS ET9FARCALL SetLongObjectArray   (JNIEnv *env, jclass jcls, jobject jobj_array, ET9U32  *nat_array, int max_array);
ET9STATUS ET9FARCALL SetFloatObjectArray  (JNIEnv *env, jclass jcls, jobject jobj_array, jfloat  *nat_array, int max_array);
ET9STATUS ET9FARCALL SetDoubleObjectArray (JNIEnv *env, jclass jcls, jobject jobj_array, jdouble *nat_array, int max_array);
#endif
