/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#include "NfcJniUtil.h"
#include <errno.h>
#include <ScopedLocalRef.h>


/*******************************************************************************
**
** Function:        JNI_OnLoad
**
** Description:     Register all JNI functions with Java Virtual Machine.
**                  jvm: Java Virtual Machine.
**                  reserved: Not used.
**
** Returns:         JNI version.
**
*******************************************************************************/
jint JNI_OnLoad (JavaVM* jvm, void*)
{
    ALOGD ("%s: enter", __FUNCTION__);
    JNIEnv *e = NULL;

    ALOGI("NFC Service: loading nci JNI");

    // Check JNI version
    if (jvm->GetEnv ((void **) &e, JNI_VERSION_1_6))
        return JNI_ERR;

    if (android::register_com_android_nfc_NativeNfcManager (e) == -1)
        return JNI_ERR;
    if (android::register_com_android_nfc_NativeLlcpServiceSocket (e) == -1)
        return JNI_ERR;
    if (android::register_com_android_nfc_NativeLlcpSocket (e) == -1)
        return JNI_ERR;
    if (android::register_com_android_nfc_NativeNfcTag (e) == -1)
        return JNI_ERR;
    if (android::register_com_android_nfc_NativeLlcpConnectionlessSocket (e) == -1)
        return JNI_ERR;
    if (android::register_com_android_nfc_NativeP2pDevice (e) == -1)
        return JNI_ERR;
    if (android::register_com_android_nfc_NativeNfcSecureElement (e) == -1)
        return JNI_ERR;
    ALOGD ("%s: exit", __FUNCTION__);
    return JNI_VERSION_1_6;
}


namespace android
{


/*******************************************************************************
**
** Function:        nfc_jni_cache_object
**
** Description:
**
** Returns:         Status code.
**
*******************************************************************************/
int nfc_jni_cache_object (JNIEnv *e, const char *className, jobject *cachedObj)
{
    ScopedLocalRef<jclass> cls(e, e->FindClass(className));
    if (cls.get() == NULL) {
        ALOGE("%s: find class error", __FUNCTION__);
        return -1;
    }

    jmethodID ctor = e->GetMethodID(cls.get(), "<init>", "()V");
    ScopedLocalRef<jobject> obj(e, e->NewObject(cls.get(), ctor));
    if (obj.get() == NULL) {
       ALOGE("%s: create object error", __FUNCTION__);
       return -1;
    }

    *cachedObj = e->NewGlobalRef(obj.get());
    if (*cachedObj == NULL) {
        ALOGE("%s: global ref error", __FUNCTION__);
        return -1;
    }
    return 0;
}


/*******************************************************************************
**
** Function:        nfc_jni_get_nfc_socket_handle
**
** Description:     Get the value of "mHandle" member variable.
**                  e: JVM environment.
**                  o: Java object.
**
** Returns:         Value of mHandle.
**
*******************************************************************************/
int nfc_jni_get_nfc_socket_handle (JNIEnv *e, jobject o)
{
    ScopedLocalRef<jclass> c(e, e->GetObjectClass(o));
    jfieldID f = e->GetFieldID(c.get(), "mHandle", "I");
    return e->GetIntField(o, f);
}


/*******************************************************************************
**
** Function:        nfc_jni_get_nat
**
** Description:     Get the value of "mNative" member variable.
**                  e: JVM environment.
**                  o: Java object.
**
** Returns:         Pointer to the value of mNative.
**
*******************************************************************************/
struct nfc_jni_native_data* nfc_jni_get_nat(JNIEnv *e, jobject o)
{
   ScopedLocalRef<jclass> c(e, e->GetObjectClass(o));
   jfieldID f = e->GetFieldID(c.get(), "mNative", "I");
   /* Retrieve native structure address */
   return (struct nfc_jni_native_data*) e->GetIntField(o, f);
}


} // namespace android
