X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fcsdk%2Fconnectivity%2Fsrc%2Fbt_le_adapter%2Fandroid%2Fcalenwmonitor.c;h=440fe3e13e974e5f23d5dc565763ebc4a7894b3e;hb=8229635f6d207516ccbbdf23b13be164e0fc1787;hp=1fa93b816314bb57eb3ce6af0a6d4b2eca5a485a;hpb=ab1460dc19275c2642e59794d65111775246e700;p=platform%2Fupstream%2Fiotivity.git diff --git a/resource/csdk/connectivity/src/bt_le_adapter/android/calenwmonitor.c b/resource/csdk/connectivity/src/bt_le_adapter/android/calenwmonitor.c index 1fa93b8..440fe3e 100644 --- a/resource/csdk/connectivity/src/bt_le_adapter/android/calenwmonitor.c +++ b/resource/csdk/connectivity/src/bt_le_adapter/android/calenwmonitor.c @@ -29,13 +29,15 @@ #include "caleinterface.h" #include "caadapterutils.h" -#include "camutex.h" +#include "octhread.h" #include "org_iotivity_ca_CaLeClientInterface.h" #include "org_iotivity_ca_CaLeServerInterface.h" #define TAG PCF("OIC_CA_LE_MONITOR") +static const jint CONNECTION_FAILED_TO_BE_EASTABLISHED = 62; + static JavaVM *g_jvm; /** @@ -55,14 +57,14 @@ static CALEConnectionStateChangedCallback g_bleConnectionStateChangedCallback = * @brief Mutex to synchronize access to the deviceStateChanged Callback when the state * of the LE adapter gets change. */ -static ca_mutex g_bleDeviceStateChangedCbMutex = NULL; +static oc_mutex g_bleDeviceStateChangedCbMutex = NULL; /** * @var g_bleConnectionStateChangedCbMutex * @brief Mutex to synchronize access to the LE ConnectionStateChanged Callback when the state * of the LE adapter gets change. */ -static ca_mutex g_bleConnectionStateChangedCbMutex = NULL; +static oc_mutex g_bleConnectionStateChangedCbMutex = NULL; //getting context void CALENetworkMonitorJNISetContext() @@ -83,11 +85,10 @@ void CALESetAdapterStateCallback(CALEDeviceStateChangedCallback callback) g_bleDeviceStateChangedCallback = callback; } -CAResult_t CAInitializeLEAdapter(const ca_thread_pool_t threadPool) +CAResult_t CAInitializeLEAdapter() { - OIC_LOG(DEBUG, TAG, "IN"); - (void)threadPool; - OIC_LOG(DEBUG, TAG, "OUT"); + // Nothing to do. + return CA_STATUS_OK; } @@ -107,49 +108,41 @@ CAResult_t CAStopLEAdapter() CAResult_t CAInitLENwkMonitorMutexVaraibles() { - OIC_LOG(DEBUG, TAG, "IN"); if (NULL == g_bleDeviceStateChangedCbMutex) { - g_bleDeviceStateChangedCbMutex = ca_mutex_new(); + g_bleDeviceStateChangedCbMutex = oc_mutex_new(); if (NULL == g_bleDeviceStateChangedCbMutex) { - OIC_LOG(ERROR, TAG, "ca_mutex_new has failed"); + OIC_LOG(ERROR, TAG, "oc_mutex_new has failed"); return CA_STATUS_FAILED; } } if (NULL == g_bleConnectionStateChangedCbMutex) { - g_bleConnectionStateChangedCbMutex = ca_mutex_new(); + g_bleConnectionStateChangedCbMutex = oc_mutex_new(); if (NULL == g_bleConnectionStateChangedCbMutex) { - OIC_LOG(ERROR, TAG, "ca_mutex_new has failed"); - ca_mutex_free(g_bleDeviceStateChangedCbMutex); + OIC_LOG(ERROR, TAG, "oc_mutex_new has failed"); + oc_mutex_free(g_bleDeviceStateChangedCbMutex); return CA_STATUS_FAILED; } } - OIC_LOG(DEBUG, TAG, "OUT"); return CA_STATUS_OK; } void CATerminateLENwkMonitorMutexVaraibles() { - OIC_LOG(DEBUG, TAG, "IN"); - - ca_mutex_free(g_bleDeviceStateChangedCbMutex); + oc_mutex_free(g_bleDeviceStateChangedCbMutex); g_bleDeviceStateChangedCbMutex = NULL; - ca_mutex_free(g_bleConnectionStateChangedCbMutex); + oc_mutex_free(g_bleConnectionStateChangedCbMutex); g_bleConnectionStateChangedCbMutex = NULL; - - OIC_LOG(DEBUG, TAG, "OUT"); } CAResult_t CAGetLEAdapterState() { - OIC_LOG(DEBUG, TAG, "IN"); - if (!g_jvm) { OIC_LOG(ERROR, TAG, "g_jvm is null"); @@ -157,7 +150,7 @@ CAResult_t CAGetLEAdapterState() } bool isAttached = false; - JNIEnv* env; + JNIEnv* env = NULL; jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6); if (JNI_OK != res) { @@ -187,14 +180,11 @@ CAResult_t CAGetLEAdapterState() (*g_jvm)->DetachCurrentThread(g_jvm); } - OIC_LOG(DEBUG, TAG, "OUT"); return CA_STATUS_OK; } CAResult_t CAInitializeLENetworkMonitor() { - OIC_LOG(DEBUG, TAG, "IN"); - CAResult_t res = CAInitLENwkMonitorMutexVaraibles(); if (CA_STATUS_OK != res) { @@ -205,32 +195,24 @@ CAResult_t CAInitializeLENetworkMonitor() CALENetworkMonitorJNISetContext(); CALENetworkMonitorJniInit(); - OIC_LOG(DEBUG, TAG, "OUT"); - return CA_STATUS_OK; - } void CATerminateLENetworkMonitor() { - OIC_LOG(DEBUG, TAG, "IN"); + OIC_LOG(DEBUG, TAG, "CATerminateLENetworkMonitor"); CATerminateLENwkMonitorMutexVaraibles(); - - OIC_LOG(DEBUG, TAG, "OUT"); } CAResult_t CASetLEAdapterStateChangedCb(CALEDeviceStateChangedCallback callback) { - OIC_LOG(DEBUG, TAG, "IN"); - OIC_LOG(DEBUG, TAG, "Setting CALEDeviceStateChangedCallback"); - ca_mutex_lock(g_bleDeviceStateChangedCbMutex); + oc_mutex_lock(g_bleDeviceStateChangedCbMutex); CALESetAdapterStateCallback(callback); - ca_mutex_unlock(g_bleDeviceStateChangedCbMutex); + oc_mutex_unlock(g_bleDeviceStateChangedCbMutex); - OIC_LOG(DEBUG, TAG, "OUT"); return CA_STATUS_OK; } @@ -242,21 +224,47 @@ CAResult_t CAUnSetLEAdapterStateChangedCb() CAResult_t CASetLENWConnectionStateChangedCb(CALEConnectionStateChangedCallback callback) { - OIC_LOG(DEBUG, TAG, "IN"); - ca_mutex_lock(g_bleConnectionStateChangedCbMutex); + OIC_LOG(DEBUG, TAG, "CASetLENWConnectionStateChangedCb"); + oc_mutex_lock(g_bleConnectionStateChangedCbMutex); g_bleConnectionStateChangedCallback = callback; - ca_mutex_unlock(g_bleConnectionStateChangedCbMutex); - OIC_LOG(DEBUG, TAG, "OUT"); + oc_mutex_unlock(g_bleConnectionStateChangedCbMutex); return CA_STATUS_OK; } -CAResult_t CAUnsetLENWConnectionStateChangedCb() +CAResult_t CAUnSetLENWConnectionStateChangedCb() { - OIC_LOG(DEBUG, TAG, "IN"); - ca_mutex_lock(g_bleConnectionStateChangedCbMutex); + OIC_LOG(DEBUG, TAG, "CAUnSetLENWConnectionStateChangedCb"); + oc_mutex_lock(g_bleConnectionStateChangedCbMutex); g_bleConnectionStateChangedCallback = NULL; - ca_mutex_unlock(g_bleConnectionStateChangedCbMutex); - OIC_LOG(DEBUG, TAG, "OUT"); + oc_mutex_unlock(g_bleConnectionStateChangedCbMutex); + return CA_STATUS_OK; +} + +static CAResult_t CALEStateConnectedCallback(JNIEnv *env, jstring jni_address, + jboolean isDescriptorFound) +{ + VERIFY_NON_NULL(env, TAG, "env"); + VERIFY_NON_NULL(jni_address, TAG, "jni_address"); + + if (CALEClientGetFlagFromState(env, jni_address, CA_LE_DESCRIPTOR_FOUND) == isDescriptorFound) + { + if (g_bleConnectionStateChangedCallback) + { + const char* address = (*env)->GetStringUTFChars(env, jni_address, NULL); + if (!address) + { + OIC_LOG(ERROR, TAG, "address is null"); + CACheckJNIException(env); + return CA_STATUS_FAILED; + } + + g_bleConnectionStateChangedCallback(CA_ADAPTER_GATT_BTLE, address, true); + OIC_LOG(DEBUG, TAG, "BLE is connected"); + + (*env)->ReleaseStringUTFChars(env, jni_address, address); + } + } + return CA_STATUS_OK; } @@ -267,7 +275,7 @@ Java_org_iotivity_ca_CaLeClientInterface_caLeStateChangedCallback(JNIEnv *env, j VERIFY_NON_NULL_VOID(env, TAG, "env is null"); VERIFY_NON_NULL_VOID(obj, TAG, "obj is null"); - OIC_LOG_V(DEBUG, TAG, "CaLeClientInterface - Network State Changed : status(%d)", status); + OIC_LOG_V(INFO, TAG, "CaLeClientInterface - Network State Changed : status(%d)", status); if (!g_bleDeviceStateChangedCallback) { @@ -283,7 +291,11 @@ Java_org_iotivity_ca_CaLeClientInterface_caLeStateChangedCallback(JNIEnv *env, j { CANetworkStatus_t newStatus = CA_INTERFACE_UP; CALEClientCreateDeviceList(); - CALEServerCreateCachedDeviceList(); + + if (!(caglobals.bleFlags & CA_LE_SERVER_DISABLE)) + { + CALEServerCreateCachedDeviceList(); + } g_bleDeviceStateChangedCallback(newStatus); } @@ -295,8 +307,6 @@ Java_org_iotivity_ca_CaLeClientInterface_caLeStateChangedCallback(JNIEnv *env, j } else if (state_off == status) // STATE_OFF:10 { - CALEClientStopMulticastServer(); - // remove obj for client CAResult_t res = CALEClientRemoveAllGattObjs(env); if (CA_STATUS_OK != res) @@ -304,10 +314,10 @@ Java_org_iotivity_ca_CaLeClientInterface_caLeStateChangedCallback(JNIEnv *env, j OIC_LOG(ERROR, TAG, "CALEClientRemoveAllGattObjs has failed"); } - res = CALEClientRemoveAllDeviceState(); + res = CALEClientResetDeviceStateForAll(); if (CA_STATUS_OK != res) { - OIC_LOG(ERROR, TAG, "CALEClientRemoveAllDeviceState has failed"); + OIC_LOG(ERROR, TAG, "CALEClientResetDeviceStateForAll has failed"); } // remove obj for server @@ -317,8 +327,6 @@ Java_org_iotivity_ca_CaLeClientInterface_caLeStateChangedCallback(JNIEnv *env, j OIC_LOG(ERROR, TAG, "CALEServerRemoveAllDevices has failed"); } - CALEClientSetScanFlag(false); - CANetworkStatus_t newStatus = CA_INTERFACE_DOWN; g_bleDeviceStateChangedCallback(newStatus); } @@ -361,11 +369,164 @@ Java_org_iotivity_ca_CaLeClientInterface_caLeBondStateChangedCallback(JNIEnv *en { OIC_LOG(ERROR, TAG, "CALEServerRemoveDevice has failed"); } +} - const char* address = (*env)->GetStringUTFChars(env, jaddr, NULL); - if (!address) +JNIEXPORT void JNICALL +Java_org_iotivity_ca_CaLeClientInterface_caLeGattNWConnectionStateChangeCallback(JNIEnv *env, + jobject obj, + jobject gatt, + jint status, + jint newState) +{ + OIC_LOG_V(INFO, TAG, "CALeGattNWConnectionStateChangeCallback - status %d, newstate %d", + status, newState); + VERIFY_NON_NULL_VOID(env, TAG, "env"); + VERIFY_NON_NULL_VOID(obj, TAG, "obj"); + VERIFY_NON_NULL_VOID(gatt, TAG, "gatt"); + + jint state_disconnected = CALEGetConstantsValue(env, CLASSPATH_BT_PROFILE, + "STATE_DISCONNECTED"); + if (state_disconnected == newState) { - OIC_LOG(ERROR, TAG, "address is null"); - return; + jstring jni_address = CALEClientGetAddressFromGattObj(env, gatt); + if (!jni_address) + { + OIC_LOG(ERROR, TAG, "jni_address is null"); + return; + } + + const char* address = (*env)->GetStringUTFChars(env, jni_address, NULL); + if (!address) + { + OIC_LOG(ERROR, TAG, "address is null"); + CACheckJNIException(env); + return; + } + + if (CONNECTION_FAILED_TO_BE_EASTABLISHED != status) + { + if (g_bleConnectionStateChangedCallback) + { + OIC_LOG_V(DEBUG, TAG, "LE Disconnected state is %s", address); + g_bleConnectionStateChangedCallback(CA_ADAPTER_GATT_BTLE, address, false); + } + } + + (*env)->ReleaseStringUTFChars(env, jni_address, address); + } +} + +JNIEXPORT void JNICALL +Java_org_iotivity_ca_CaLeServerInterface_caLeGattServerNWConnectionStateChangeCallback( + JNIEnv *env, jobject obj, jobject device, jint status, jint newState) +{ + OIC_LOG_V(DEBUG, TAG, "caLeGattServerNWConnectionStateChangeCallback - status %d, newstate %d", + status, newState); + VERIFY_NON_NULL_VOID(env, TAG, "env"); + VERIFY_NON_NULL_VOID(obj, TAG, "obj"); + VERIFY_NON_NULL_VOID(device, TAG, "device"); + + if (CONNECTION_FAILED_TO_BE_EASTABLISHED != status) + { + if (g_bleConnectionStateChangedCallback) + { + jstring jni_remoteAddress = CALEGetAddressFromBTDevice(env, device); + if (!jni_remoteAddress) + { + OIC_LOG(ERROR, TAG, "jni_remoteAddress is null"); + return; + } + + const char* address = (*env)->GetStringUTFChars(env, jni_remoteAddress, NULL); + if (!address) + { + OIC_LOG(ERROR, TAG, "address is null"); + CACheckJNIException(env); + return; + } + + // STATE_DISCONNECTED + jint state_disconnected = CALEGetConstantsValue(env, CLASSPATH_BT_PROFILE, + "STATE_DISCONNECTED"); + + // STATE_CONNECTED + jint state_connected = CALEGetConstantsValue(env, CLASSPATH_BT_PROFILE, + "STATE_CONNECTED"); + + if (state_disconnected == newState) + { + OIC_LOG_V(DEBUG, TAG, "LE Disconnected state is %d, %s", newState, address); + g_bleConnectionStateChangedCallback(CA_ADAPTER_GATT_BTLE, address, false); + } + else if (state_connected == newState) + { + OIC_LOG_V(DEBUG, TAG, "LE Connected state is %d, %s", newState, address); + g_bleConnectionStateChangedCallback(CA_ADAPTER_GATT_BTLE, address, true); + } + else + { + OIC_LOG_V(DEBUG, TAG, "Unknown state : %d, %s", newState, address); + } + + (*env)->ReleaseStringUTFChars(env, jni_remoteAddress, address); + } + } +} + +JNIEXPORT void JNICALL +Java_org_iotivity_ca_CaLeClientInterface_caLeGattNWServicesDiscoveredCallback(JNIEnv *env, + jobject obj, + jobject gatt, + jint status) +{ + OIC_LOG_V(INFO, TAG, "caLeGattNWServicesDiscoveredCallback - status %d", status); + VERIFY_NON_NULL_VOID(env, TAG, "env"); + VERIFY_NON_NULL_VOID(obj, TAG, "obj"); + VERIFY_NON_NULL_VOID(gatt, TAG, "gatt"); + + if (GATT_SUCCESS == status) + { + jstring jni_address = CALEGetAddressFromGatt(env, gatt); + if (!jni_address) + { + OIC_LOG(ERROR, TAG, "jni_address is null"); + return; + } + + if (CA_STATUS_OK != CALEStateConnectedCallback(env, jni_address, JNI_FALSE)) + { + OIC_LOG(ERROR, TAG, "CALEStateConnectedCallback has failed"); + } + + (*env)->DeleteLocalRef(env, jni_address); + } +} + +JNIEXPORT void JNICALL +Java_org_iotivity_ca_CaLeClientInterface_caLeGattNWDescriptorWriteCallback(JNIEnv *env, + jobject obj, + jobject gatt, + jint status) +{ + OIC_LOG_V(INFO, TAG, "caLeGattNWDescriptorWriteCallback - status %d", status); + VERIFY_NON_NULL_VOID(env, TAG, "env"); + VERIFY_NON_NULL_VOID(obj, TAG, "obj"); + VERIFY_NON_NULL_VOID(gatt, TAG, "gatt"); + + if (GATT_SUCCESS == status) + { + jstring jni_address = CALEGetAddressFromGatt(env, gatt); + if (!jni_address) + { + OIC_LOG(ERROR, TAG, "jni_address is null"); + return; + } + + if (CA_STATUS_OK != CALEStateConnectedCallback(env, jni_address, JNI_TRUE)) + { + OIC_LOG(ERROR, TAG, "CALEStateConnectedCallback has failed"); + } + + (*env)->DeleteLocalRef(env, jni_address); } }