#include "et9api.h"
#include <malloc.h>

#include <stdlib.h>
#include "com_xt9_Xt9core.h"
#include "et9cmmUtil.h"


	  typedef struct _JXT9KeyboardDatabase {
    jclass clazz;   // com.nuance.xt9.input.XT9KeyboardDatabase;
    jfieldID id;    // int
    jfieldID page; // int
    jfieldID width; // int
    jfieldID height;    // int
    jfieldID keys;      // List<com.nuance.xt9.input.XT9KeyboardDatabase.Key>
}JXT9KeyboardDatabase, *pJXT9KeyboardDatabase;

// com.nuance.xt9.input.XT9KeyboardDatabase.Key
typedef struct _JXT9KeyboardDatabase_Key {
    jclass clazz;       // com.nuance.xt9.input.XT9KeyboardDatabase.Key
    jfieldID codes;     // array of int
    jfieldID type;      // int
    jfieldID x;         // int
    jfieldID y;         // int
    jfieldID width;     // int
    jfieldID height;    // int
    jfieldID shiftCodes; //array of int
}JXT9KeyboardDatabase_Key;

// java.util.List
typedef struct _JList {
    jclass clazz;
    jmethodID add;
    jmethodID get;
    jmethodID size;
}JList;

typedef struct Key {
            //static const int MAX_CHARS = 64;
            unsigned short index;
            ET9LOADKEYTYPE type;
            unsigned short left;
            unsigned short top;
            unsigned short right;
            unsigned short bottom;

            unsigned short charsCount;
            unsigned short chars[256];

            unsigned short shiftedCharsCount;
            unsigned short shiftedChars[256];
        }mkey, *mPkey;

typedef struct KeyboardDatabase {
            long hashCode;
            int kdbId;
            int kdbPage;
            unsigned short width;
            unsigned short height;
            unsigned short totalPages;
            unsigned short maxKeys;
            unsigned short numbKeys;
            mPkey keys;
}mKeyboardDatabase;


static JXT9KeyboardDatabase_Key g_sXT9KeyboardDatabase_Key = {0, };
static JXT9KeyboardDatabase g_sXT9KeyboardDatabase = {0, };
static JList g_sListClass = {0, };
static mKeyboardDatabase g_mKeyboardDatabase = {0, };

ET9STATUS ET9SetKeyboardDatabase(JNIEnv *env, jclass jcls,jobject jXT9KeyboardDatabase);
ET9STATUS dynamicKdbLoadCallback(ET9KDBInfo *, const ET9U32, const ET9U16);
ET9STATUS CacheJavaFieldAndClassIDs(JNIEnv *, jobject jXT9KeyboardDatabase);
ET9STATUS setProperties(int kdbId, int kdbPage, unsigned short width, unsigned short height, unsigned short maxKeys);
ET9STATUS addKey(int type, int* chars, unsigned short charsCount, int* shiftedChars, unsigned short shiftedCharsCount, unsigned short left, unsigned short top, unsigned short right, unsigned short bottom, int* oemKeyCode);

ET9STATUS SetProtectPercent(float fWidthRatio, float fHeightRatio);

       
