// ==========================================================================
// Author:  Yee Hsu
// Date:    3/2/2006
// File:    JNI.cpp
//
// Desc:    JNI implementation for a Java created JNI header file.
//          This is the JNI workaround for a native port done in C++
//          which provides a working JNI interface for Java developers
// ==========================================================================

// ObjectJNI.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "Object.h"
#include "ObjectExports.h"

using namespace OBJECT;

/* Global Variables */
CObject* g_pObject = NULL;

JNIEXPORT jboolean JNICALL Java_Object_Init(JNIEnv *env, jobject obj, jstring jstr)
{
    int nLicense = 0;

    if (!g_pObject)
    {
        g_pObject = (CObject*) UVObjectCreate();
    }

    if (g_pObject)
    {
        const char *str = env->GetStringUTFChars(jstr, 0);
        nLicense = g_pObject->Init(str);
        env->ReleaseStringUTFChars(jstr, str);
    }
    return (nLicense == 1 ? JNI_TRUE : JNI_FALSE);
}

JNIEXPORT jboolean JNICALL Java_Object_ParseXmlFile(JNIEnv *env, jobject obj, jstring jstr)
{
    // TODO: Add your implementation code here
    jboolean ret = JNI_FALSE;

    const char *str = env->GetStringUTFChars(jstr, 0);

    if (g_pObject->ParseXmlFile(str, PARSE_ALL))
        ret = JNI_TRUE;

    env->ReleaseStringUTFChars(jstr, str);

    return ret;
}

JNIEXPORT jstring JNICALL Java_Object_InvokeMethod
(JNIEnv *env, jobject obj, jint nMethodId, jint nuId, jint nhId, jstring jstr)
{
    // TODO: Add your implementation code here
    jstring jReturnCode = NULL;

    CObject::ReturnCode rcRes = CObject::rcInternalError;
    enum CObject::InvokeMethodId eMethId = (CObject::InvokeMethodId) nMethodId;

    const char *str = env->GetStringUTFChars(jstr, 0);

    switch (eMethId)
    {
        case CObject::_Meth1:
        case CObject::_Meth2:
            rcRes = g_pObject->InvokeMethod(eMethId, nhId, str, NULL);

            // determine return code value and return via jstring
            switch (rcRes)
            {
                case CObject::rcOk:
                    jReturnCode = env->NewStringUTF("rcOk");
                    break;

                default:
                    jReturnCode = env->NewStringUTF("rcError");
                    break;
            }
            break;

        case CObject::_Meth3:
            jReturnCode = env->NewStringUTF("rcNotImplemented");
            break;

        default:
            jReturnCode = env->NewStringUTF("rcError");
            break;
    }
    env->ReleaseStringUTFChars(jstr, str);
    //env->ReleaseStringUTFChars(jReturnCode, NULL);    // may have memory leak

    return jReturnCode;
}

JNIEXPORT jboolean JNICALL Java_Object_Term(JNIEnv *env, jobject obj)
{
    // TODO: Add your implementation code here
    if (g_pObject)
    {
        UVObjectFree(g_pObject);
    }
    g_pObject = NULL;

    return JNI_TRUE;
}