+}
+
+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);
+}