replace : iotivity -> iotivity-sec
[platform/upstream/iotivity.git] / android / android_api / base / jni / JniCaInterface.c
index eb1e07a..2a7861b 100644 (file)
 #include <stdio.h>
 #include "cainterface.h"
 #include "JniCaInterface.h"
+#include "cautilinterface.h"
+#include "cacommon.h"
 
 #define  LOG_TAG   "JNI_CA_INTERFACE"
 #define  LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
 #define  LOGE(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
 
+static jobject g_foundDeviceListenerObject = NULL;
+static jobject g_listenerObject = NULL;
+static JavaVM *g_jvm = NULL;
+static jclass g_jni_cls_enum = NULL;
+static jmethodID g_jni_mid_enum = NULL;
+
 JNIEXPORT jint JNI_OnLoad(JavaVM *jvm, void *reserved)
 {
     LOGI("CaInterface_initialize");
+    g_jvm = jvm;
     CANativeJNISetJavaVM(jvm);
 
     return JNI_VERSION_1_6;
@@ -45,16 +54,386 @@ void JNI_OnUnload(JavaVM *jvm, void *reserved)
 
 JNIEXPORT void JNICALL
 Java_org_iotivity_ca_CaInterface_initialize
-(JNIEnv *env, jclass clazz, jobject context)
+(JNIEnv *env, jclass clazz, jobject activity, jobject context)
 {
     LOGI("CaInterface_initialize");
 
+    CANativeSetActivity(env, activity);
     CANativeJNISetContext(env, context);
+}
+
+void CAManagerConnectionStateChangedCB(const CAEndpoint_t *info,
+                                       bool connected)
+{
+    if (!info)
+    {
+        LOGE("info is NULL");
+        return;
+    }
+
+    if (!g_listenerObject)
+    {
+        LOGE("g_listener is NULL, cannot have callback");
+        return;
+    }
+
+    LOGI("Callback - CAManagerConnectionStateChangedCB : type(%d), address(%s), connected(%d)",
+         info->adapter, info->addr, connected);
+
+    bool isAttached = false;
+    JNIEnv* env = NULL;
+    jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);
+    if (JNI_OK != res)
+    {
+        LOGI("AttachCurrentThread will be called for JNIEnv pointer");
+        res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
+
+        if (JNI_OK != res)
+        {
+            LOGE("AttachCurrentThread has failed");
+            return;
+        }
+        isAttached = true;
+    }
+
+    jclass jni_cls_listener = (*env)->GetObjectClass(env, g_listenerObject);
+    if (!jni_cls_listener)
+    {
+        LOGE("could not get jni_cls_listener");
+        goto exit_error;
+    }
+
+    jmethodID jni_mid_listener = (*env)->GetMethodID(env, jni_cls_listener,
+                                                     "onConnectionStateChanged",
+                                                     "(Lorg/iotivity/base/OcConnectivityType;"
+                                                     "Ljava/lang/String;Z)V");
+    if (!jni_mid_listener)
+    {
+        LOGE("could not get Method ID");
+        goto exit_error;
+    }
+
+    jstring jni_address = (*env)->NewStringUTF(env, info->addr);
+    if (!jni_address)
+    {
+        LOGE("jni_address is null");
+        goto exit_error;
+    }
+
+    if (g_jni_cls_enum && g_jni_mid_enum)
+    {
+        jobject jni_adaptertype = (*env)->CallStaticObjectMethod(env, g_jni_cls_enum,
+                                                                 g_jni_mid_enum, info->adapter);
+        (*env)->CallVoidMethod(env, g_listenerObject, jni_mid_listener,
+                               jni_adaptertype, jni_address,
+                               (jboolean)connected);
+    }
+
+exit_error:
+    if (isAttached)
+    {
+        (*g_jvm)->DetachCurrentThread(g_jvm);
+    }
+
+    LOGI("OUT - CAManagerConnectionStateChangedCB");
+}
+
+void CAManagerAdapterStateChangedCB(CATransportAdapter_t adapter, bool enabled)
+{
+    LOGI("Callback - CAManagerAdapterStateChangedCB : type(%d), enabled(%d)",
+         adapter, enabled);
+
+    if (!g_listenerObject)
+    {
+        LOGE("g_listener is NULL, cannot have callback");
+        return;
+    }
+
+    bool isAttached = false;
+    JNIEnv* env = NULL;
+    jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);
+    if (JNI_OK != res)
+    {
+        LOGI("AttachCurrentThread will be called for JNIEnv pointer");
+        res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
+
+        if (JNI_OK != res)
+        {
+            LOGE("AttachCurrentThread has failed");
+            return;
+        }
+        isAttached = true;
+    }
+
+    jclass jni_cls_listener = (*env)->GetObjectClass(env, g_listenerObject);
+    if (!jni_cls_listener)
+    {
+        LOGE("could not get jni_cls_listener");
+        goto exit_error;
+    }
+
+    jmethodID jni_mid_listener = (*env)->GetMethodID(env, jni_cls_listener,
+                                                     "onAdapterStateChanged",
+                                                     "(Lorg/iotivity/base/OcConnectivityType;Z)V");
+    if (!jni_mid_listener)
+    {
+        LOGE("could not get Method ID");
+        goto exit_error;
+    }
+
+    if (g_jni_cls_enum && g_jni_mid_enum)
+    {
+        jobject jni_adaptertype = (*env)->CallStaticObjectMethod(env, g_jni_cls_enum,
+                                                                 g_jni_mid_enum, adapter);
+
+        (*env)->CallVoidMethod(env, g_listenerObject, jni_mid_listener,
+                               jni_adaptertype, (jboolean)enabled);
+    }
+
+exit_error:
+    if (isAttached)
+    {
+        (*g_jvm)->DetachCurrentThread(g_jvm);
+    }
+    LOGI("OUT -  CAManagerAdapterStateChangedCB");
+}
+
+JNIEXPORT void JNICALL
+Java_org_iotivity_ca_CaInterface_caManagerInitialize(JNIEnv *env, jclass clazz,
+                                                     jobject context, jobject listener)
+{
+    LOGI("CaManagere_initialize");
+
+    CAUtilClientInitialize(env, g_jvm, context);
+
+    if (listener)
+    {
+        g_listenerObject = (*env)->NewGlobalRef(env, listener);
+    }
+
+    if (g_listenerObject)
+    {
+        jclass cls = (*env)->FindClass(env, "org/iotivity/base/OcConnectivityType");
+        if (cls)
+        {
+            g_jni_cls_enum = (jclass)(*env)->NewGlobalRef(env, cls);
+        }
+
+        if (g_jni_cls_enum)
+        {
+            g_jni_mid_enum = (*env)->GetStaticMethodID(env, g_jni_cls_enum, "getInstance",
+                                                   "(I)Lorg/iotivity/base/OcConnectivityType;");
+        }
+    }
+    CARegisterNetworkMonitorHandler(CAManagerAdapterStateChangedCB,
+                                    CAManagerConnectionStateChangedCB);
+}
+
+JNIEXPORT void JNICALL
+Java_org_iotivity_ca_CaInterface_caManagerTerminate(JNIEnv *env, jclass clazz)
+{
+    LOGI("CaManager_terminate");
+
+    CAUtilClientTerminate(env);
+
+    if (g_listenerObject)
+    {
+        (*env)->DeleteGlobalRef(env, g_listenerObject);
+        g_listenerObject = NULL;
+    }
+
+    if (g_jni_cls_enum)
+    {
+        (*env)->DeleteGlobalRef(env, g_jni_cls_enum);
+        g_jni_cls_enum = NULL;
+    }
+}
+
+JNIEXPORT void JNICALL
+Java_org_iotivity_ca_CaInterface_caManagerSetAutoConnectionDeviceInfo(JNIEnv *env,
+                                                                      jclass clazz,
+                                                                      jstring jaddress)
+{
+    LOGI("CaManager_setAutoConnectionDeviceInfo");
+    if (!jaddress)
+    {
+        LOGE("jaddress is null");
+        return;
+    }
+
+    const char* address = (*env)->GetStringUTFChars(env, jaddress, NULL);
+    if (!address)
+    {
+        LOGE("address is null");
+        return;
+    }
+
+    CASetAutoConnectionDeviceInfo(address);
+
+    (*env)->ReleaseStringUTFChars(env, jaddress, address);
+}
+
+JNIEXPORT void JNICALL
+Java_org_iotivity_ca_CaInterface_caManagerUnsetAutoConnectionDeviceInfo(JNIEnv *env,
+                                                                        jclass clazz,
+                                                                        jstring jaddress)
+{
+    LOGI("CaManager_unsetAutoConnectionDeviceInfo");
+    if (!jaddress)
+    {
+        LOGE("jaddress is null");
+        return;
+    }
+
+    const char* address = (*env)->GetStringUTFChars(env, jaddress, NULL);
+    if (!address)
+    {
+        LOGE("address is null");
+        return;
+    }
+
+    CAUnsetAutoConnectionDeviceInfo(address);
+
+    (*env)->ReleaseStringUTFChars(env, jaddress, address);
+}
 
-    CAResult_t res = CAInitialize();
+JNIEXPORT void JNICALL
+Java_org_iotivity_ca_CaInterface_caBtPairingInitialize(JNIEnv *env, jclass clazz,
+                                                       jobject context, jobject listener)
+{
+    LOGI("caBtPairingInitialize");
+    (void)clazz;
+
+    CAUtilClientInitialize(env, g_jvm, context);
+
+    g_foundDeviceListenerObject = (*env)->NewGlobalRef(env, listener);
+    CAUtilSetFoundDeviceListener(g_foundDeviceListenerObject);
+}
 
-    if (CA_STATUS_OK != res)
+JNIEXPORT void JNICALL
+Java_org_iotivity_ca_CaInterface_caBtPairingTerminate(JNIEnv *env, jclass clazz)
+{
+    LOGI("caBtPairingTerminate");
+    (void)clazz;
+
+    if (g_foundDeviceListenerObject)
     {
-        LOGE("Could not Initialize");
+        (*env)->DeleteGlobalRef(env, g_foundDeviceListenerObject);
     }
-}
\ No newline at end of file
+}
+
+JNIEXPORT void JNICALL
+Java_org_iotivity_ca_CaInterface_caBtPairingStartScan(JNIEnv *env, jclass clazz)
+{
+    LOGI("caBtPairingStartScan");
+    (void)clazz;
+    CAUtilStartScan(env);
+}
+
+JNIEXPORT void JNICALL
+Java_org_iotivity_ca_CaInterface_caBtPairingStopScan(JNIEnv *env, jclass clazz)
+{
+    LOGI("caBtPairingStopScan");
+    (void)clazz;
+    CAUtilStopScan(env);
+}
+
+JNIEXPORT void JNICALL
+Java_org_iotivity_ca_CaInterface_caBtPairingCreateBond(JNIEnv *env, jclass clazz, jobject device)
+{
+    LOGI("caBtPairingCreateBond");
+    (void)clazz;
+    CAUtilCreateBond(env, device);
+}
+
+JNIEXPORT void JNICALL
+Java_org_iotivity_ca_CaInterface_setLeScanIntervalTimeImpl(JNIEnv *env, jclass clazz,
+                                                           jint intervalTime, jint workignCount)
+{
+    LOGI("setLeScanIntervalTimeImpl");
+    (void)env;
+    (void)clazz;
+    CAUtilSetLEScanInterval(intervalTime, workignCount);
+}
+
+JNIEXPORT void JNICALL
+Java_org_iotivity_ca_CaInterface_stopLeScanImpl(JNIEnv *env, jclass clazz)
+{
+    LOGI("stopLeScan");
+    (void)env;
+    (void)clazz;
+    CAUtilStopLEScan();
+}
+
+JNIEXPORT void JNICALL
+Java_org_iotivity_ca_CaInterface_startLeAdvertisingImpl(JNIEnv *env, jclass clazz)
+{
+    LOGI("startLeAdvertising");
+    (void)env;
+    (void)clazz;
+    CAUtilStartLEAdvertising();
+}
+
+JNIEXPORT void JNICALL
+Java_org_iotivity_ca_CaInterface_stopLeAdvertisingImpl(JNIEnv *env, jclass clazz)
+{
+    LOGI("stopLeAdvertising");
+    (void)env;
+    (void)clazz;
+    CAUtilStopLEAdvertising();
+}
+
+JNIEXPORT void JNICALL
+Java_org_iotivity_ca_CaInterface_setBTConfigureImpl(JNIEnv *env, jclass clazz, jint flag)
+{
+    LOGI("setConfigureImpl");
+    (void)env;
+    (void)clazz;
+    CAUtilConfig_t configs = {(CATransportBTFlags_t)flag};
+    CAUtilSetBTConfigure(configs);
+}
+
+JNIEXPORT jint JNICALL Java_org_iotivity_ca_CaInterface_setCipherSuiteImpl
+  (JNIEnv *env, jclass clazz, jint cipherSuite, jint adapter)
+{
+    LOGI("setCipherSuiteImpl");
+    (void)env;
+    (void)clazz;
+    CAResult_t ret = CASelectCipherSuite(cipherSuite, (CATransportAdapter_t) adapter);
+    if (CA_STATUS_OK != ret)
+    {
+        LOGE("CASelectCipherSuite has failed");
+    }
+    return ret;
+}
+
+JNIEXPORT jint JNICALL Java_org_iotivity_ca_CaInterface_disconnectTCPSessionImpl
+ (JNIEnv *env, jclass clazz, jstring address, jint port, jint transportFlags)
+{
+    LOGI("disconnectTCPSessionImpl");
+    (void)env;
+    (void)clazz;
+
+    if(!address)
+    {
+        LOGE("Java address is null");
+        return CA_STATUS_INVALID_PARAM;
+    }
+
+    //convert java string to native string
+    const char* nativeAddress = (*env)->GetStringUTFChars(env, address, NULL);
+    if (!nativeAddress)
+    {
+        LOGE("Native address is null");
+        return CA_STATUS_INVALID_PARAM;
+    }
+
+    CAResult_t result = CAUtilTCPDisconnectSession(nativeAddress, (int)port,
+                                            (CATransportFlags_t)transportFlags);
+    if (CA_STATUS_OK != result)
+    {
+        LOGE("disconnectTCPSessionImpl failed");
+    }
+    return result;
+}
+