From 8593cd10aca36f4f400f92470508055d8a05909b Mon Sep 17 00:00:00 2001 From: Jaewook Jung Date: Mon, 11 Apr 2016 14:48:30 +0900 Subject: [PATCH] code clean up in connection manager code clean up in connection manager Change-Id: I842c0f49d87525d28b916e90e54d9afa4dc5ad8e Signed-off-by: Jaewook Jung Reviewed-on: https://gerrit.iotivity.org/gerrit/7731 Tested-by: jenkins-iotivity Reviewed-by: jihwan seo Reviewed-by: Jon A. Cruz --- .../src/bt_le_adapter/android/caleclient.c | 233 +++++++++--------- .../util/src/camanager/android/caleautoconnector.c | 20 +- .../src/camanager/android/caleconnectionmanager.c | 267 +++++++-------------- .../util/src/camanager/android/camanagerdevice.c | 122 ++++++---- .../util/src/camanager/android/camanagerdevice.h | 38 +-- .../util/src/camanager/android/camanagerleutil.c | 2 +- 6 files changed, 316 insertions(+), 366 deletions(-) diff --git a/resource/csdk/connectivity/src/bt_le_adapter/android/caleclient.c b/resource/csdk/connectivity/src/bt_le_adapter/android/caleclient.c index d67e862..14e8fdb 100644 --- a/resource/csdk/connectivity/src/bt_le_adapter/android/caleclient.c +++ b/resource/csdk/connectivity/src/bt_le_adapter/android/caleclient.c @@ -1266,15 +1266,16 @@ CAResult_t CALEClientStartScanImpl(JNIEnv *env, jobject callback) } // call start le scan method + OIC_LOG(INFO, TAG, "CALL API - startLeScan"); jboolean jni_obj_startLeScan = (*env)->CallBooleanMethod(env, jni_obj_BTAdapter, jni_mid_startLeScan, callback); if (!jni_obj_startLeScan) { - OIC_LOG(INFO, TAG, "startLeScan is failed"); + OIC_LOG(INFO, TAG, "startLeScan has failed"); } else { - OIC_LOG(DEBUG, TAG, "startLeScan is started"); + OIC_LOG(DEBUG, TAG, "LeScan has started"); CALEClientSetScanFlag(true); } @@ -1330,15 +1331,16 @@ CAResult_t CALEClientStartScanWithUUIDImpl(JNIEnv *env, jobjectArray uuids, jobj } // call start le scan method + OIC_LOG(INFO, TAG, "CALL API - startLeScan (with UUID)"); jboolean jni_obj_startLeScan = (*env)->CallBooleanMethod(env, jni_obj_BTAdapter, jni_mid_startLeScan, uuids, callback); if (!jni_obj_startLeScan) { - OIC_LOG(INFO, TAG, "startLeScan With UUID is failed"); + OIC_LOG(INFO, TAG, "startLeScan has failed"); } else { - OIC_LOG(DEBUG, TAG, "startLeScan With UUID is started"); + OIC_LOG(DEBUG, TAG, "LeScan has started"); CALEClientSetScanFlag(true); } @@ -1489,7 +1491,7 @@ CAResult_t CALEClientStopScanImpl(JNIEnv *env, jobject callback) return CA_STATUS_FAILED; } - OIC_LOG(DEBUG, TAG, "CALL API - request to stop LE Scan"); + OIC_LOG(INFO, TAG, "CALL API - stopLeScan"); // call start le scan method (*env)->CallVoidMethod(env, jni_obj_BTAdapter, jni_mid_stopLeScan, callback); if ((*env)->ExceptionCheck(env)) @@ -1503,8 +1505,7 @@ CAResult_t CALEClientStopScanImpl(JNIEnv *env, jobject callback) return CA_STATUS_OK; } -CAResult_t CALEClientSetFlagToState(JNIEnv *env, jstring jni_address, - jint state_idx, jboolean flag) +CAResult_t CALEClientSetFlagToState(JNIEnv *env, jstring jni_address, jint state_idx, jboolean flag) { OIC_LOG(DEBUG, TAG, "IN - CALEClientSetFlagToState"); VERIFY_NON_NULL(env, TAG, "env"); @@ -1559,14 +1560,15 @@ jboolean CALEClientGetFlagFromState(JNIEnv *env, jstring jni_address, jint state if (!address) { OIC_LOG(ERROR, TAG, "address is not available"); + ca_mutex_unlock(g_deviceStateListMutex); return JNI_FALSE; } CALEState_t* curState = CALEClientGetStateInfo(address); + (*env)->ReleaseStringUTFChars(env, jni_address, address); if(!curState) { OIC_LOG(INFO, TAG, "there is no information. auto connect flag is false"); - (*env)->ReleaseStringUTFChars(env, jni_address, address); ca_mutex_unlock(g_deviceStateListMutex); return JNI_FALSE; } @@ -1580,11 +1582,9 @@ jboolean CALEClientGetFlagFromState(JNIEnv *env, jstring jni_address, jint state default: break; } - OIC_LOG_V(INFO, TAG, "%d flag is %d", state_idx, ret); - - (*env)->ReleaseStringUTFChars(env, jni_address, address); ca_mutex_unlock(g_deviceStateListMutex); + OIC_LOG_V(INFO, TAG, "%d flag is %d", state_idx, ret); OIC_LOG(DEBUG, TAG, "OUT - CALEClientGetFlagFromState"); return ret; } @@ -1799,7 +1799,7 @@ CAResult_t CALEClientDisconnect(JNIEnv *env, jobject bluetoothGatt) } // call disconnect gatt method - OIC_LOG(DEBUG, TAG, "CALL API - request disconnect gatt"); + OIC_LOG(INFO, TAG, "CALL API - disconnect"); (*env)->CallVoidMethod(env, bluetoothGatt, jni_mid_disconnectGatt); if ((*env)->ExceptionCheck(env)) { @@ -1936,7 +1936,7 @@ CAResult_t CALEClientDiscoverServices(JNIEnv *env, jobject bluetoothGatt) } // call disconnect gatt method - OIC_LOG(DEBUG, TAG, "CALL API - request discovery gatt services"); + OIC_LOG(INFO, TAG, "CALL API - discoverServices"); jboolean ret = (*env)->CallBooleanMethod(env, bluetoothGatt, jni_mid_discoverServices); if (!ret) { @@ -2109,7 +2109,7 @@ CAResult_t CALEClientWriteCharacteristicImpl(JNIEnv *env, jobject bluetoothGatt, } // call disconnect gatt method - OIC_LOG(DEBUG, TAG, "CALL API - request to write gatt characteristic"); + OIC_LOG(INFO, TAG, "CALL API - writeCharacteristic"); jboolean ret = (jboolean)(*env)->CallBooleanMethod(env, bluetoothGatt, jni_mid_writeCharacteristic, gattCharacteristic); @@ -2163,7 +2163,7 @@ CAResult_t CALEClientReadCharacteristic(JNIEnv *env, jobject bluetoothGatt) } // call disconnect gatt method - OIC_LOG(DEBUG, TAG, "CALL API - request to read gatt characteristic"); + OIC_LOG(INFO, TAG, "CALL API - readCharacteristic"); jboolean ret = (*env)->CallBooleanMethod(env, bluetoothGatt, jni_mid_readCharacteristic, jni_obj_GattCharacteristic); if (ret) @@ -2204,15 +2204,16 @@ CAResult_t CALEClientSetCharacteristicNotification(JNIEnv *env, jobject bluetoot return CA_STATUS_FAILED; } + OIC_LOG(INFO, TAG, "CALL API - setCharacteristicNotification"); jboolean ret = (*env)->CallBooleanMethod(env, bluetoothGatt, jni_mid_setNotification, characteristic, JNI_TRUE); if (JNI_TRUE == ret) { - OIC_LOG(DEBUG, TAG, "CALL API - setCharacteristicNotification success"); + OIC_LOG(DEBUG, TAG, "setCharacteristicNotification success"); } else { - OIC_LOG(ERROR, TAG, "CALL API - setCharacteristicNotification has failed"); + OIC_LOG(ERROR, TAG, "setCharacteristicNotification has failed"); return CA_STATUS_FAILED; } @@ -2561,7 +2562,7 @@ CAResult_t CALEClientSetUUIDToDescriptor(JNIEnv *env, jobject bluetoothGatt, return CA_STATUS_FAILED; } - OIC_LOG(DEBUG, TAG, "request to write descriptor"); + OIC_LOG(INFO, TAG, "CALL API - writeDescriptor"); jboolean jni_ret = (*env)->CallBooleanMethod(env, bluetoothGatt, jni_mid_writeDescriptor, jni_obj_descriptor); if (jni_ret) @@ -2635,7 +2636,7 @@ CAResult_t CALEClientAddScanDeviceToList(JNIEnv *env, jobject device) jobject gdevice = (*env)->NewGlobalRef(env, device); u_arraylist_add(g_deviceList, gdevice); ca_cond_signal(g_deviceDescCond); - OIC_LOG_V(DEBUG, TAG, "Added this BT Device[%s] in the List", remoteAddress); + OIC_LOG_V(DEBUG, TAG, "Added a new BT Device in deviceList [%s]", remoteAddress); } (*env)->ReleaseStringUTFChars(env, jni_remoteAddress, remoteAddress); @@ -2688,7 +2689,7 @@ bool CALEClientIsDeviceInScanDeviceList(JNIEnv *env, const char* remoteAddress) (*env)->ReleaseStringUTFChars(env, jni_setAddress, setAddress); } - OIC_LOG(DEBUG, TAG, "there are no the device in list. we can add"); + OIC_LOG_V(DEBUG, TAG, "[%s] doesn't exist in scanned device list", remoteAddress); return false; } @@ -2811,7 +2812,7 @@ CAResult_t CALEClientRemoveDeviceInScanDeviceList(JNIEnv *env, jstring address) CAResult_t CALEClientAddGattobjToList(JNIEnv *env, jobject gatt) { - OIC_LOG(INFO, TAG, "CALEClientAddGattobjToList"); + OIC_LOG(DEBUG, TAG, "CALEClientAddGattobjToList"); VERIFY_NON_NULL(env, TAG, "env is null"); VERIFY_NON_NULL(gatt, TAG, "gatt is null"); @@ -2840,12 +2841,12 @@ CAResult_t CALEClientAddGattobjToList(JNIEnv *env, jobject gatt) return CA_STATUS_FAILED; } - OIC_LOG_V(INFO, TAG, "remote address : %s", remoteAddress); + OIC_LOG_V(DEBUG, TAG, "remote address : %s", remoteAddress); if (!CALEClientIsGattObjInList(env, remoteAddress)) { jobject newGatt = (*env)->NewGlobalRef(env, gatt); u_arraylist_add(g_gattObjectList, newGatt); - OIC_LOG(INFO, TAG, "Set GATT Object to Array as Element"); + OIC_LOG(INFO, TAG, "added a newGatt object to gattObjectList"); } (*env)->ReleaseStringUTFChars(env, jni_remoteAddress, remoteAddress); @@ -3145,7 +3146,7 @@ CAResult_t CALEClientRemoveGattObjForAddr(JNIEnv *env, jstring addr) jstring CALEClientGetLEAddressFromBTDevice(JNIEnv *env, jobject bluetoothDevice) { - OIC_LOG(DEBUG, TAG, "IN - CALEClientGetLEAddressFromBTDevice"); + OIC_LOG(DEBUG, TAG, "CALEClientGetLEAddressFromBTDevice"); VERIFY_NON_NULL_RET(env, TAG, "env", NULL); VERIFY_NON_NULL_RET(bluetoothDevice, TAG, "bluetoothDevice", NULL); @@ -3175,21 +3176,27 @@ jstring CALEClientGetLEAddressFromBTDevice(JNIEnv *env, jobject bluetoothDevice) return NULL; } + ca_mutex_lock(g_gattObjectMutex); + size_t length = u_arraylist_length(g_gattObjectList); + OIC_LOG_V(DEBUG, TAG, "length of gattObjectList : %d", length); + OIC_LOG_V(DEBUG, TAG, "targetAddress : %s", targetAddress); + for (size_t index = 0; index < length; index++) { jobject jarrayObj = (jobject) u_arraylist_get(g_gattObjectList, index); if (!jarrayObj) { + ca_mutex_unlock(g_gattObjectMutex); OIC_LOG(ERROR, TAG, "jarrayObj is null"); (*env)->ReleaseStringUTFChars(env, jni_btTargetAddress, targetAddress); return NULL; } - OIC_LOG(DEBUG, TAG, "CALL API - bluetoothGatt.getDevice()"); jobject jni_obj_device = (*env)->CallObjectMethod(env, jarrayObj, jni_mid_getDevice); if (!jni_obj_device) { + ca_mutex_unlock(g_gattObjectMutex); OIC_LOG(ERROR, TAG, "jni_obj_device is null"); (*env)->ReleaseStringUTFChars(env, jni_btTargetAddress, targetAddress); return NULL; @@ -3198,6 +3205,7 @@ jstring CALEClientGetLEAddressFromBTDevice(JNIEnv *env, jobject bluetoothDevice) jstring jni_btAddress = CALEGetAddressFromBTDevice(env, jni_obj_device); if (!jni_btAddress) { + ca_mutex_unlock(g_gattObjectMutex); OIC_LOG(ERROR, TAG, "CALEGetAddressFromBTDevice has failed"); (*env)->ReleaseStringUTFChars(env, jni_btTargetAddress, targetAddress); return NULL; @@ -3206,13 +3214,13 @@ jstring CALEClientGetLEAddressFromBTDevice(JNIEnv *env, jobject bluetoothDevice) const char* btAddress = (*env)->GetStringUTFChars(env, jni_btAddress, NULL); if (!btAddress) { + ca_mutex_unlock(g_gattObjectMutex); OIC_LOG(ERROR, TAG, "btAddress is not available"); (*env)->ReleaseStringUTFChars(env, jni_btTargetAddress, targetAddress); return NULL; } - OIC_LOG_V(DEBUG, TAG, "targetAddress : %s", targetAddress); - OIC_LOG_V(DEBUG, TAG, "btAddress : %s", btAddress); + OIC_LOG_V(DEBUG, TAG, "btAddress : %s (idx: %d)", btAddress, index); if (!strcmp(targetAddress, btAddress)) { OIC_LOG(DEBUG, TAG, "Found Gatt object from BT device"); @@ -3223,6 +3231,7 @@ jstring CALEClientGetLEAddressFromBTDevice(JNIEnv *env, jobject bluetoothDevice) { OIC_LOG(ERROR, TAG, "jni_LEAddress is null"); } + ca_mutex_unlock(g_gattObjectMutex); (*env)->ReleaseStringUTFChars(env, jni_btTargetAddress, targetAddress); (*env)->ReleaseStringUTFChars(env, jni_btAddress, btAddress); (*env)->DeleteLocalRef(env, jni_btAddress); @@ -3233,8 +3242,10 @@ jstring CALEClientGetLEAddressFromBTDevice(JNIEnv *env, jobject bluetoothDevice) (*env)->DeleteLocalRef(env, jni_btAddress); (*env)->DeleteLocalRef(env, jni_obj_device); } + ca_mutex_unlock(g_gattObjectMutex); - OIC_LOG(DEBUG, TAG, "OUT - CALEClientGetLEAddressFromBTDevice"); + (*env)->ReleaseStringUTFChars(env, jni_btTargetAddress, targetAddress); + OIC_LOG_V(DEBUG, TAG, "[%s] doesn't exist in gattObjectList", targetAddress); return NULL; } @@ -3246,6 +3257,8 @@ CAResult_t CALEClientUpdateDeviceState(const char* address, uint16_t state_type, uint16_t target_state) { VERIFY_NON_NULL(address, TAG, "address is null"); + VERIFY_NON_NULL(address, TAG, "state_type is null"); + VERIFY_NON_NULL(address, TAG, "target_state is null"); if (!g_deviceStateList) { @@ -3276,10 +3289,9 @@ CAResult_t CALEClientUpdateDeviceState(const char* address, uint16_t state_type, default: break; } - OIC_LOG_V(INFO, TAG, "update state : - addr : %s, " - "conn : %d, send : %d, ACFlag : %d", - curState->address, curState->connectedState, - curState->sendState, curState->autoConnectFlag); + OIC_LOG_V(INFO, TAG, "update state - addr : %s, conn : %d, send : %d, ACFlag : %d", + curState->address, curState->connectedState, curState->sendState, + curState->autoConnectFlag); } else /** state is added newly **/ { @@ -3313,10 +3325,10 @@ CAResult_t CALEClientUpdateDeviceState(const char* address, uint16_t state_type, default: break; } - OIC_LOG_V(INFO, TAG, "Set newState to List - addr : %s, " + OIC_LOG_V(INFO, TAG, "add a new state to List - addr : %s, " "conn : %d, send : %d, ACFlag : %d", - newstate->address, newstate->connectedState, - newstate->sendState, newstate->autoConnectFlag); + newstate->address, newstate->connectedState, newstate->sendState, + newstate->autoConnectFlag); u_arraylist_add(g_deviceStateList, newstate); // update new state } @@ -3475,7 +3487,8 @@ CALEState_t* CALEClientGetStateInfo(const char* remoteAddress) } uint32_t length = u_arraylist_length(g_deviceStateList); - OIC_LOG_V(DEBUG, TAG, "size of deviceStateList is %d", length); + OIC_LOG_V(DEBUG, TAG, "length of deviceStateList : %d", length); + OIC_LOG_V(DEBUG, TAG, "target address : %s", remoteAddress); for (uint32_t index = 0; index < length; index++) { @@ -3486,15 +3499,16 @@ CALEState_t* CALEClientGetStateInfo(const char* remoteAddress) continue; } - OIC_LOG_V(DEBUG, TAG, "target address : %s", remoteAddress); - OIC_LOG_V(DEBUG, TAG, "state address : %s", state->address); + OIC_LOG_V(DEBUG, TAG, "state address : %s (idx: %d)", state->address, index); if (!strcmp(state->address, remoteAddress)) { - OIC_LOG_V(DEBUG, TAG, "get state : %s", remoteAddress); + OIC_LOG(DEBUG, TAG, "found state"); return state; } } + + OIC_LOG_V(DEBUG, TAG, "[%s] doesn't exist in deviceStateList", remoteAddress); return NULL; } @@ -3894,9 +3908,9 @@ void CATerminateLEGattClient() CALEClientTerminate(); } -CAResult_t CAUpdateCharacteristicsToGattServer(const char *remoteAddress, const uint8_t *data, - uint32_t dataLen, CALETransferType_t type, - int32_t position) +CAResult_t CAUpdateCharacteristicsToGattServer(const char *remoteAddress, const uint8_t *data, + uint32_t dataLen, CALETransferType_t type, + int32_t position) { OIC_LOG(DEBUG, TAG, "call CALEClientSendUnicastMessage"); VERIFY_NON_NULL(data, TAG, "data is null"); @@ -4017,85 +4031,81 @@ static jstring CALEClientGetAddressFromGatt(JNIEnv *env, jobject gatt) */ JNIEXPORT void JNICALL Java_org_iotivity_ca_CaLeClientInterface_caLeGattConnectionStateChangeCallback(JNIEnv *env, - jobject obj, - jobject gatt, - jint status, - jint newstate) + jobject obj, + jobject gatt, + jint status, + jint newstate) { - OIC_LOG_V(DEBUG, TAG, "CALeGattConnectionStateChangeCallback - status %d, newstate %d", status, - newstate); + OIC_LOG_V(INFO, TAG, "CALeGattConnectionStateChangeCallback - status %d, newstate %d", status, + newstate); VERIFY_NON_NULL_VOID(env, TAG, "env is null"); VERIFY_NON_NULL_VOID(obj, TAG, "obj is null"); VERIFY_NON_NULL_VOID(gatt, TAG, "gatt is null"); jint state_connected = CALEGetConstantsValue(env, CLASSPATH_BT_PROFILE, "STATE_CONNECTED"); - jint state_disconnected = CALEGetConstantsValue(env, CLASSPATH_BT_PROFILE, "STATE_DISCONNECTED"); - jint gatt_success = CALEGetConstantsValue(env, CLASSPATH_BT_GATT, "GATT_SUCCESS"); - if (gatt_success == status && state_connected == newstate) // le connected + jstring jni_address = CALEClientGetAddressFromGattObj(env, gatt); + if (!jni_address) + { + OIC_LOG(ERROR, TAG, "CALEClientGetAddressFromGattObj has failed"); + goto error_exit; + } + + const char* address = (*env)->GetStringUTFChars(env, jni_address, NULL); + if (!address) { - jstring jni_address = CALEClientGetAddressFromGattObj(env, gatt); - if (!jni_address) - { - goto error_exit; - } + OIC_LOG(ERROR, TAG, "address is null"); + goto error_exit; + } + OIC_LOG_V(DEBUG, TAG, "CALeGattConnectionStateChangeCallback - address [%s]", address); - const char* address = (*env)->GetStringUTFChars(env, jni_address, NULL); - if (address) + CAResult_t res; + if (state_connected == newstate) + { + OIC_LOG(DEBUG, TAG, "LE is connected"); + if (GATT_SUCCESS == status) { - CAResult_t res = CALEClientUpdateDeviceState(address, CA_LE_CONNECTION_STATE, - STATE_CONNECTED); + res = CALEClientUpdateDeviceState(address, CA_LE_CONNECTION_STATE, STATE_CONNECTED); + (*env)->ReleaseStringUTFChars(env, jni_address, address); if (CA_STATUS_OK != res) { OIC_LOG(ERROR, TAG, "CALEClientUpdateDeviceState has failed"); - (*env)->ReleaseStringUTFChars(env, jni_address, address); goto error_exit; } - OIC_LOG_V(INFO, TAG, "ConnectionStateCB - remote address : %s", address); - (*env)->ReleaseStringUTFChars(env, jni_address, address); - } + res = CALEClientAddGattobjToList(env, gatt); + if (CA_STATUS_OK != res) + { + OIC_LOG(ERROR, TAG, "CALEClientAddGattobjToList has failed"); + goto error_exit; + } - CAResult_t res = CALEClientAddGattobjToList(env, gatt); - if (CA_STATUS_OK != res) - { - OIC_LOG(ERROR, TAG, "CALEClientAddGattobjToList has failed"); - goto error_exit; + res = CALEClientDiscoverServices(env, gatt); + if (CA_STATUS_OK != res) + { + OIC_LOG(ERROR, TAG, "CALEClientDiscoverServices has failed"); + goto error_exit; + } } - - res = CALEClientDiscoverServices(env, gatt); - if (CA_STATUS_OK != res) + else { - OIC_LOG(ERROR, TAG, "CALEClientDiscoverServices has failed"); - goto error_exit; + OIC_LOG(INFO, TAG, "unknown status"); + (*env)->ReleaseStringUTFChars(env, jni_address, address); } } - else if (state_disconnected == newstate) // le disconnected + else // STATE_DISCONNECTED == newstate { - jstring jni_address = CALEClientGetAddressFromGattObj(env, gatt); - if (!jni_address) - { - OIC_LOG(ERROR, TAG, "CALEClientGetAddressFromGattObj has failed"); - goto error_exit; - } + OIC_LOG(DEBUG, TAG, "LE is disconnected"); - const char* address = (*env)->GetStringUTFChars(env, jni_address, NULL); - if (address) + res = CALEClientUpdateDeviceState(address, CA_LE_CONNECTION_STATE, STATE_DISCONNECTED); + (*env)->ReleaseStringUTFChars(env, jni_address, address); + if (CA_STATUS_OK != res) { - CAResult_t res = CALEClientUpdateDeviceState(address, CA_LE_CONNECTION_STATE, - STATE_DISCONNECTED); - if (CA_STATUS_OK != res) - { - OIC_LOG(ERROR, TAG, "CALEClientUpdateDeviceState has failed"); - (*env)->ReleaseStringUTFChars(env, jni_address, address); - goto error_exit; - } - OIC_LOG_V(INFO, TAG, "ConnectionStateCB - remote address : %s", address); - - (*env)->ReleaseStringUTFChars(env, jni_address, address); + OIC_LOG(ERROR, TAG, "CALEClientUpdateDeviceState has failed"); + goto error_exit; } - CAResult_t res = CALEClientGattClose(env, gatt); + res = CALEClientGattClose(env, gatt); if (CA_STATUS_OK != res) { OIC_LOG(ERROR, TAG, "CALEClientGattClose has failed"); @@ -4142,7 +4152,7 @@ Java_org_iotivity_ca_CaLeClientInterface_caLeGattConnectionStateChangeCallback(J { // other reason except for gatt_success is expected to running // background connection in BT platform. - OIC_LOG(INFO, TAG, "unknown state or manual disconnected state"); + OIC_LOG(INFO, TAG, "unknown status or manual disconnected state"); CALEClientUpdateSendCnt(env); return; } @@ -4158,7 +4168,6 @@ Java_org_iotivity_ca_CaLeClientInterface_caLeGattConnectionStateChangeCallback(J // error label. error_exit: - CALEClientSendFinish(env, gatt); return; } @@ -4170,11 +4179,11 @@ error_exit: */ JNIEXPORT void JNICALL Java_org_iotivity_ca_CaLeClientInterface_caLeGattServicesDiscoveredCallback(JNIEnv *env, - jobject obj, - jobject gatt, - jint status) + jobject obj, + jobject gatt, + jint status) { - OIC_LOG_V(DEBUG, TAG, "CALeGattServicesDiscoveredCallback - status %d: ", status); + OIC_LOG_V(INFO, TAG, "CALeGattServicesDiscoveredCallback - status %d: ", status); VERIFY_NON_NULL_VOID(env, TAG, "env is null"); VERIFY_NON_NULL_VOID(obj, TAG, "obj is null"); VERIFY_NON_NULL_VOID(gatt, TAG, "gatt is null"); @@ -4226,7 +4235,7 @@ Java_org_iotivity_ca_CaLeClientInterface_caLeGattServicesDiscoveredCallback(JNIE { OIC_LOG_V(INFO, TAG, "Descriptor is not found : %d", res); - res = CALEClientUpdateDeviceState(address, CA_LE_CONNECTION_STATE , + res = CALEClientUpdateDeviceState(address, CA_LE_CONNECTION_STATE, STATE_SERVICE_CONNECTED); if (CA_STATUS_OK != res) { @@ -4264,10 +4273,9 @@ error_exit: */ JNIEXPORT void JNICALL Java_org_iotivity_ca_CaLeClientInterface_caLeGattCharacteristicWriteCallback( - JNIEnv *env, jobject obj, jobject gatt, jbyteArray data, - jint status) + JNIEnv *env, jobject obj, jobject gatt, jbyteArray data, jint status) { - OIC_LOG_V(DEBUG, TAG, "CALeGattCharacteristicWriteCallback - status : %d", status); + OIC_LOG_V(INFO, TAG, "CALeGattCharacteristicWriteCallback - status : %d", status); VERIFY_NON_NULL_VOID(env, TAG, "env is null"); VERIFY_NON_NULL_VOID(obj, TAG, "obj is null"); VERIFY_NON_NULL_VOID(gatt, TAG, "gatt is null"); @@ -4285,8 +4293,7 @@ Java_org_iotivity_ca_CaLeClientInterface_caLeGattCharacteristicWriteCallback( goto error_exit; } - jint gatt_success = CALEGetConstantsValue(env, CLASSPATH_BT_GATT, "GATT_SUCCESS"); - if (gatt_success != status) // error case + if (GATT_SUCCESS != status) // error case { OIC_LOG(ERROR, TAG, "send failure"); @@ -4355,7 +4362,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_ca_CaLeClientInterface_caLeGattCharacteristicChangedCallback( JNIEnv *env, jobject obj, jobject gatt, jbyteArray data) { - OIC_LOG(DEBUG, TAG, "CALeGattCharacteristicChangedCallback"); + OIC_LOG(INFO, TAG, "CALeGattCharacteristicChangedCallback"); VERIFY_NON_NULL_VOID(env, TAG, "env is null"); VERIFY_NON_NULL_VOID(obj, TAG, "obj is null"); VERIFY_NON_NULL_VOID(gatt, TAG, "gatt is null"); @@ -4399,10 +4406,9 @@ Java_org_iotivity_ca_CaLeClientInterface_caLeGattCharacteristicChangedCallback( OIC_LOG_V(DEBUG, TAG, "CALeGattCharacteristicChangedCallback - data. : %p, %d", receivedData, length); - ca_mutex_lock(g_bleServerBDAddressMutex); uint32_t sentLength = 0; - g_CABLEClientDataReceivedCallback(address, receivedData, length, - &sentLength); + ca_mutex_lock(g_bleServerBDAddressMutex); + g_CABLEClientDataReceivedCallback(address, receivedData, length, &sentLength); ca_mutex_unlock(g_bleServerBDAddressMutex); (*env)->ReleaseStringUTFChars(env, jni_address, address); @@ -4418,13 +4424,12 @@ Java_org_iotivity_ca_CaLeClientInterface_caLeGattDescriptorWriteCallback(JNIEnv jobject gatt, jint status) { - OIC_LOG_V(DEBUG, TAG, "CALeGattDescriptorWriteCallback - status %d: ", status); + OIC_LOG_V(INFO, TAG, "CALeGattDescriptorWriteCallback - status %d: ", status); VERIFY_NON_NULL_VOID(env, TAG, "env is null"); VERIFY_NON_NULL_VOID(obj, TAG, "obj is null"); VERIFY_NON_NULL_VOID(gatt, TAG, "gatt is null"); - jint gatt_success = CALEGetConstantsValue(env, CLASSPATH_BT_GATT, "GATT_SUCCESS"); - if (gatt_success != status) // error + if (GATT_SUCCESS != status) // error { goto error_exit; } diff --git a/resource/csdk/connectivity/util/src/camanager/android/caleautoconnector.c b/resource/csdk/connectivity/util/src/camanager/android/caleautoconnector.c index 76f439c..6416674 100644 --- a/resource/csdk/connectivity/util/src/camanager/android/caleautoconnector.c +++ b/resource/csdk/connectivity/util/src/camanager/android/caleautoconnector.c @@ -120,14 +120,22 @@ CAResult_t CAManagerStartAutoConnection(JNIEnv *env, jstring remote_le_address) VERIFY_NON_NULL(remote_le_address, TAG, "remote_le_address is null"); OIC_LOG(DEBUG, TAG, "IN - CAManagerStartAutoConnection"); + ca_mutex_lock(g_connectRetryMutex); - if (true == CAManagerGetAutoConnectionFlag(env, remote_le_address)) + bool isAutoConnecting = false; + if (CA_STATUS_OK != CAManagerGetAutoConnectingFlag(env, remote_le_address, &isAutoConnecting)) { - OIC_LOG(INFO, TAG, "auto connecting."); + OIC_LOG(DEBUG, TAG, "CAManagerIsAutoConnecting has failed"); + ca_mutex_unlock(g_connectRetryMutex); return CA_STATUS_FAILED; } - ca_mutex_lock(g_connectRetryMutex); + if (isAutoConnecting) + { + OIC_LOG(INFO, TAG, "connection has been already in progress or completed"); + ca_mutex_unlock(g_connectRetryMutex); + return CA_STATUS_FAILED; + } for (size_t retry_cnt = 0 ; retry_cnt < MAX_RETRY_COUNT ; retry_cnt++) { @@ -139,8 +147,8 @@ CAResult_t CAManagerStartAutoConnection(JNIEnv *env, jstring remote_le_address) MAX_RETRY_COUNT - retry_cnt - 1); if (ca_cond_wait_for(g_connectRetryCond, g_connectRetryMutex, TIMEOUT) == 0) { - OIC_LOG(INFO, TAG, "request to connect gatt was canceled"); ca_mutex_unlock(g_connectRetryMutex); + OIC_LOG(INFO, TAG, "request to connect gatt was canceled"); return CA_STATUS_OK; } // time out. retry connection @@ -176,7 +184,7 @@ jobject CAManagerConnectGatt(JNIEnv *env, jstring remote_le_address) } // request to connection with AutoConnection Flag - OIC_LOG(INFO, TAG, "request to gatt connection for auto connection"); + OIC_LOG(INFO, TAG, "request gatt connection by CM auto connector"); jobject newGatt = (jobject)CALEClientConnect(env, jni_bluetooth, JNI_TRUE); if (NULL == newGatt) { @@ -185,7 +193,7 @@ jobject CAManagerConnectGatt(JNIEnv *env, jstring remote_le_address) } // set flag auto connection is requested. - CAManagerSetAutoConnectionFlag(env, remote_le_address, true); + CAManagerSetAutoConnectingFlag(env, remote_le_address, true); OIC_LOG(DEBUG, TAG, "OUT - CAManagerConnectGatt"); return newGatt; diff --git a/resource/csdk/connectivity/util/src/camanager/android/caleconnectionmanager.c b/resource/csdk/connectivity/util/src/camanager/android/caleconnectionmanager.c index ec15a00..18ba248 100644 --- a/resource/csdk/connectivity/util/src/camanager/android/caleconnectionmanager.c +++ b/resource/csdk/connectivity/util/src/camanager/android/caleconnectionmanager.c @@ -75,27 +75,25 @@ CAResult_t CASetLEClientAutoConnectionDeviceInfo(const char* address) } isAttached = true; } - OIC_LOG_V(DEBUG, TAG, "set [%s] for Auto Connection", address); + jstring jni_leAddress = (*env)->NewStringUTF(env, address); + if (!jni_leAddress) + { + OIC_LOG(ERROR, TAG, "jni_leAddress is null"); + goto error_exit; + } if (!CAManagerCheckBTAddress(env, jni_leAddress)) { OIC_LOG(ERROR, TAG, "this address is not BT address string format"); - if (isAttached) - { - (*g_jvm)->DetachCurrentThread(g_jvm); - } - return CA_STATUS_FAILED; + goto error_exit; } - // if there is target address in SharedPreference. it will be reseted. - if (CAManagerIsConnectedDeviceAddress(env, g_context, - jni_leAddress, - g_connectedDeviceSet)) + // if there is target address in SharedPreference, it will be reset. + if (CAManagerIsConnectedDeviceAddress(env, g_context, jni_leAddress, g_connectedDeviceSet)) { - if (!CAManagerRemoveConnectedDeviceAddress(env, g_context, - jni_leAddress, + if (!CAManagerRemoveConnectedDeviceAddress(env, g_context, jni_leAddress, g_connectedDeviceSet)) { OIC_LOG(ERROR, TAG, "Preference - remove has failed"); @@ -107,8 +105,7 @@ CAResult_t CASetLEClientAutoConnectionDeviceInfo(const char* address) } // it will be added new target address. - if (!CAManagerAddConnectedDeviceAddress(env, g_context, - jni_leAddress, g_connectedDeviceSet)) + if (!CAManagerAddConnectedDeviceAddress(env, g_context, jni_leAddress, g_connectedDeviceSet)) { OIC_LOG(ERROR, TAG, "Preference - putting has failed"); } @@ -123,6 +120,15 @@ CAResult_t CASetLEClientAutoConnectionDeviceInfo(const char* address) } return CA_STATUS_OK; + +error_exit: + + if (isAttached) + { + (*g_jvm)->DetachCurrentThread(g_jvm); + } + + return CA_STATUS_FAILED; } CAResult_t CAUnsetLEClientAutoConnectionDeviceInfo(const char* address) @@ -145,27 +151,25 @@ CAResult_t CAUnsetLEClientAutoConnectionDeviceInfo(const char* address) } isAttached = true; } - OIC_LOG_V(DEBUG, TAG, "unset [%s] for Auto Connection", address); + jstring jni_leAddress = (*env)->NewStringUTF(env, address); + if (!jni_leAddress) + { + OIC_LOG(ERROR, TAG, "jni_leAddress is null"); + goto error_exit; + } if (!CAManagerCheckBTAddress(env, jni_leAddress)) { OIC_LOG(ERROR, TAG, "this address is not BT address string format"); - if (isAttached) - { - (*g_jvm)->DetachCurrentThread(g_jvm); - } - return CA_STATUS_FAILED; + goto error_exit; } - // if there is target address in SharedPreference. it would be removed - if (CAManagerIsConnectedDeviceAddress(env, g_context, - jni_leAddress, - g_connectedDeviceSet)) + // if there is target address in SharedPreference, it will be removed + if (CAManagerIsConnectedDeviceAddress(env, g_context, jni_leAddress, g_connectedDeviceSet)) { - if (!CAManagerRemoveConnectedDeviceAddress(env, g_context, - jni_leAddress, + if (!CAManagerRemoveConnectedDeviceAddress(env, g_context, jni_leAddress, g_connectedDeviceSet)) { OIC_LOG(ERROR, TAG, "Preference - remove has failed"); @@ -177,10 +181,10 @@ CAResult_t CAUnsetLEClientAutoConnectionDeviceInfo(const char* address) } // remove target device for auto connection - CAResult_t ret = CAManagerRemoveData(env, jni_leAddress); + CAResult_t ret = CAManagerRemoveACData(env, jni_leAddress); if (CA_STATUS_OK != ret) { - OIC_LOG(ERROR, TAG, "CAManagerRemoveData has failed"); + OIC_LOG(ERROR, TAG, "CAManagerRemoveACData has failed"); } if (isAttached) @@ -188,7 +192,16 @@ CAResult_t CAUnsetLEClientAutoConnectionDeviceInfo(const char* address) (*g_jvm)->DetachCurrentThread(g_jvm); } - return CA_STATUS_OK; + return ret; + +error_exit: + + if (isAttached) + { + (*g_jvm)->DetachCurrentThread(g_jvm); + } + + return CA_STATUS_FAILED; } CAResult_t CAManagerLEClientInitialize(JNIEnv *env, JavaVM *jvm, jobject context) @@ -207,10 +220,10 @@ CAResult_t CAManagerLEClientInitialize(JNIEnv *env, JavaVM *jvm, jobject context g_jvm = jvm; g_context = (*env)->NewGlobalRef(env, context);; + CAManagerInitMutexVaraibles(); CAManagerInitLEAutoConnection(); - - CAManagerCreateACDataList(env); + CAManagerCreateACDataList(); // get last connected device list jobject set = NULL; @@ -219,15 +232,12 @@ CAResult_t CAManagerLEClientInitialize(JNIEnv *env, JavaVM *jvm, jobject context { // create new set object set = CAManagerCreateSetString(env); - if (set) - { - OIC_LOG(DEBUG, TAG, "created new SetString"); - } - else + if (!set) { OIC_LOG(ERROR, TAG, "CAManagerCreateSetString has failed"); return CA_STATUS_FAILED; } + OIC_LOG(DEBUG, TAG, "created new SetString"); } else { @@ -256,12 +266,13 @@ CAResult_t CAManagerLEClientTerminate(JNIEnv *env) OIC_LOG(ERROR, TAG, "CALEClientDisconnectAll has failed"); } - res = CAManagerRemoveAllData(env); + res = CAManagerRemoveAllACData(env); if (CA_STATUS_OK != res) { - OIC_LOG(ERROR, TAG, "CAManagerRemoveAllData has failed"); + OIC_LOG(ERROR, TAG, "CAManagerRemoveAllACData has failed"); } + CAManagerDestroyACDataList(); CAManagerTerminateLEAutoConnection(); CAManagerTerminateMutexVariables(); @@ -284,7 +295,7 @@ JNIEXPORT void JNICALL Java_org_iotivity_ca_CaLeClientInterface_caManagerAdapterStateChangedCallback( JNIEnv *env, jobject obj, jint state) { - OIC_LOG(DEBUG, TAG, "caManagerAdapterStateChangedCallback"); + OIC_LOG_V(INFO, TAG, "caManagerAdapterStateChangedCallback - state %d", state); VERIFY_NON_NULL_VOID(env, TAG, "env"); VERIFY_NON_NULL_VOID(obj, TAG, "obj"); @@ -305,7 +316,7 @@ Java_org_iotivity_ca_CaLeClientInterface_caManagerAdapterStateChangedCallback( // find target device for autoconnect size_t length = CAManagerGetACDataLength(); - OIC_LOG_V(DEBUG, TAG, "target device : %d", length); + OIC_LOG_V(DEBUG, TAG, "length of ACDataList : %d", length); for (size_t idx = 0; idx < length; idx++) { jstring leAddress = CAManagerGetLEAddressFromACData(env, idx); @@ -328,14 +339,15 @@ Java_org_iotivity_ca_CaLeClientInterface_caManagerAdapterStateChangedCallback( g_adapterStateCB(CA_ADAPTER_GATT_BTLE, false); } - // reset autoconnect flag for all target devices + // reset isAutoConnecting flag for all target devices size_t length = CAManagerGetACDataLength(); + OIC_LOG_V(DEBUG, TAG, "length of ACDataList : %d", length); for (size_t idx = 0; idx < length; idx++) { jstring address = CAManagerGetLEAddressFromACData(env, idx); if (address) { - CAManagerSetAutoConnectionFlag(env, address, false); + CAManagerSetAutoConnectingFlag(env, address, false); } } @@ -348,12 +360,10 @@ Java_org_iotivity_ca_CaLeClientInterface_caManagerAdapterStateChangedCallback( else if (state_turning_off == state) { OIC_LOG(DEBUG, TAG, "AdapterStateChangedCallback : state_turning_off"); - return; } else { OIC_LOG(INFO, TAG, "AdapterStateChangedCallback state is not available"); - return; } } @@ -361,7 +371,10 @@ JNIEXPORT void JNICALL Java_org_iotivity_ca_CaLeClientInterface_caManagerBondStateChangedCallback( JNIEnv *env, jobject obj, jobject device) { - OIC_LOG(DEBUG, TAG, "caManagerBondStateChangedCallback"); + OIC_LOG(INFO, TAG, "caManagerBondStateChangedCallback"); + // this callback is called by CaLeClientInterface + // only when bond state is changed from BOND_BONDED to BOND_NONE + OIC_LOG(DEBUG, TAG, "bond state is changed from BOND_BONDED to BOND_NONE"); VERIFY_NON_NULL_VOID(env, TAG, "env"); VERIFY_NON_NULL_VOID(obj, TAG, "obj"); VERIFY_NON_NULL_VOID(device, TAG, "device"); @@ -384,29 +397,26 @@ Java_org_iotivity_ca_CaLeClientInterface_caManagerBondStateChangedCallback( // if there is no data, CAData will be created. OIC_LOG_V(DEBUG, TAG, "bond none device : %s", leAddress); - CAResult_t res = CAManagerRemoveData(env, jni_leAddress); + CAResult_t res = CAManagerRemoveACData(env, jni_leAddress); if (CA_STATUS_OK != res) { - OIC_LOG(ERROR, TAG, "CAManagerRemoveData has failed"); + OIC_LOG(ERROR, TAG, "CAManagerRemoveACData has failed"); } (*env)->ReleaseStringUTFChars(env, jni_leAddress, leAddress); - if (!CAManagerRemoveConnectedDeviceAddress(env, g_context, - jni_leAddress, + if (!CAManagerRemoveConnectedDeviceAddress(env, g_context, jni_leAddress, g_connectedDeviceSet)) { OIC_LOG(ERROR, TAG, "CAManagerRemoveConnectedDeviceAddress has failed"); } - - OIC_LOG(INFO, TAG, "bonded state changed bone_none"); } JNIEXPORT void JNICALL Java_org_iotivity_ca_CaLeClientInterface_caManagerLeGattConnectionStateChangeCB( JNIEnv *env, jobject obj, jobject gatt, jint status, jint newState) { - OIC_LOG_V(DEBUG, TAG, "caManagerLeGattConnectionStateChangeCB-status(%d), newState(%d)", + OIC_LOG_V(INFO, TAG, "caManagerLeGattConnectionStateChangeCB - status %d, newState %d", status, newState); VERIFY_NON_NULL_VOID(env, TAG, "env"); @@ -415,7 +425,6 @@ Java_org_iotivity_ca_CaLeClientInterface_caManagerLeGattConnectionStateChangeCB( jint state_connected = CALEGetConstantsValue(env, CLASSPATH_BT_PROFILE, "STATE_CONNECTED"); jint state_disconnected = CALEGetConstantsValue(env, CLASSPATH_BT_PROFILE, "STATE_DISCONNECTED"); - jint gatt_success = CALEGetConstantsValue(env, CLASSPATH_BT_GATT, "GATT_SUCCESS"); jstring jni_address = CALEGetAddressFromGatt(env, gatt); if (!jni_address) @@ -428,21 +437,21 @@ Java_org_iotivity_ca_CaLeClientInterface_caManagerLeGattConnectionStateChangeCB( if (!address) { OIC_LOG(ERROR, TAG, "address is null"); + (*env)->DeleteLocalRef(env, jni_address); return; } - OIC_LOG_V(INFO, TAG, "connection state : status(%d), addr:(%s), newState(%d)", - status, address, newState); + OIC_LOG_V(DEBUG, TAG, "caManagerLeGattConnectionStateChangeCB - address [%s]", address); - if (gatt_success == status && state_connected == newState) // le connected + if (GATT_SUCCESS == status && state_connected == newState) // le connected { OIC_LOG(DEBUG, TAG, "LE is connected"); + CAResult_t res = CAManagerReadRemoteRssi(env, gatt); if (CA_STATUS_OK != res) { OIC_LOG(ERROR, TAG, "CAManagerReadRemoteRssi has failed"); - (*env)->ReleaseStringUTFChars(env, jni_address, address); - return; + goto exit; } } else if (state_disconnected == newState)// le disconnected @@ -458,22 +467,20 @@ Java_org_iotivity_ca_CaLeClientInterface_caManagerLeGattConnectionStateChangeCB( if (LINK_LOSS == status || REMOTE_DISCONNECT == status) { - if (!CAManagerIsMatchedACData(env, jni_address)) + if (!CAManagerIsInACDataList(env, jni_address)) { OIC_LOG_V(DEBUG, TAG, "this[%s] is not target address for Auto Connection", address); - (*env)->ReleaseStringUTFChars(env, jni_address, address); - return; + goto exit; } - CAManagerSetAutoConnectionFlag(env, jni_address, false); + CAManagerSetAutoConnectingFlag(env, jni_address, false); CAResult_t res = CAManagerStartAutoConnection(env, jni_address); if (CA_STATUS_OK != res) { - (*env)->ReleaseStringUTFChars(env, jni_address, address); OIC_LOG(ERROR, TAG, "CAManagerStartAutoConnection has failed"); - return; + goto exit; } } else if (ACCEPT_TIMEOUT_EXCEPTION == status) @@ -481,6 +488,8 @@ Java_org_iotivity_ca_CaLeClientInterface_caManagerLeGattConnectionStateChangeCB( CAManagerProcessRecovery(env, START_RECOVERY); } } + +exit: (*env)->ReleaseStringUTFChars(env, jni_address, address); (*env)->DeleteLocalRef(env, jni_address); } @@ -496,7 +505,7 @@ Java_org_iotivity_ca_CaLeClientInterface_caManagerLeServicesDiscoveredCallback(J jobject gatt, jint status) { - OIC_LOG_V(DEBUG, TAG, "caManagerLeServicesDiscoveredCallback - status %d: ", status); + OIC_LOG_V(INFO, TAG, "caManagerLeServicesDiscoveredCallback - status %d", status); VERIFY_NON_NULL_VOID(env, TAG, "env"); VERIFY_NON_NULL_VOID(obj, TAG, "obj"); VERIFY_NON_NULL_VOID(gatt, TAG, "gatt"); @@ -523,126 +532,22 @@ Java_org_iotivity_ca_CaLeClientInterface_caManagerLeServicesDiscoveredCallback(J (*env)->DeleteLocalRef(env, jni_address); return; } - OIC_LOG_V(DEBUG, TAG, "ServicesDiscovered device : %s", address); - // target address for auto connection will be set in device list. - // check set connected address information by user - jclass jni_cls_set = (*env)->FindClass(env, "java/util/HashSet"); - if (!jni_cls_set) - { - OIC_LOG(ERROR, TAG, "jni_cls_set is null"); - (*env)->ReleaseStringUTFChars(env, jni_address, address); - (*env)->DeleteLocalRef(env, jni_address); - return; - } - - jmethodID jni_mid_iterator = (*env)->GetMethodID(env, jni_cls_set, "iterator", - "()Ljava/util/Iterator;"); - if (!jni_mid_iterator) - { - OIC_LOG(ERROR, TAG, "jni_mid_iterator is null"); - (*env)->DeleteLocalRef(env, jni_cls_set); - (*env)->ReleaseStringUTFChars(env, jni_address, address); - (*env)->DeleteLocalRef(env, jni_address); - return; - } - - jobject jni_obj_iter = (*env)->CallObjectMethod(env, g_connectedDeviceSet, jni_mid_iterator); - if (!jni_obj_iter) - { - OIC_LOG(ERROR, TAG, "jni_obj_iter is null"); - (*env)->DeleteLocalRef(env, jni_cls_set); - (*env)->ReleaseStringUTFChars(env, jni_address, address); - (*env)->DeleteLocalRef(env, jni_address); - return; - } - - // Get the Iterator method IDs - jclass jni_cls_iterator = (*env)->FindClass(env, "java/util/Iterator"); - if (!jni_cls_iterator) - { - OIC_LOG(ERROR, TAG, "jni_cls_iterator is null"); - (*env)->DeleteLocalRef(env, jni_obj_iter); - (*env)->DeleteLocalRef(env, jni_cls_set); - (*env)->ReleaseStringUTFChars(env, jni_address, address); - (*env)->DeleteLocalRef(env, jni_address); - return; - } + OIC_LOG_V(DEBUG, TAG, "ServicesDiscovered device : %s", address); - jmethodID jni_mid_hasNext = (*env)->GetMethodID(env, jni_cls_iterator, "hasNext", "()Z"); - if (!jni_mid_hasNext) + if (CAManagerIsConnectedDeviceAddress(env, g_context, jni_address, g_connectedDeviceSet)) { - OIC_LOG(ERROR, TAG, "jni_mid_hasNext is null"); - (*env)->DeleteLocalRef(env, jni_cls_iterator); - (*env)->DeleteLocalRef(env, jni_obj_iter); - (*env)->DeleteLocalRef(env, jni_cls_set); - (*env)->ReleaseStringUTFChars(env, jni_address, address); - (*env)->DeleteLocalRef(env, jni_address); - return; - } + OIC_LOG(INFO, TAG, "AC list - the address will be added to ACData list"); + CAManagerAddACData(env, jni_address); + CAManagerSetAutoConnectingFlag(env, jni_address, false); - jmethodID jni_mid_next = (*env)->GetMethodID(env, jni_cls_iterator, "next", - "()Ljava/lang/Object;"); - if (!jni_mid_next) - { - OIC_LOG(ERROR, TAG, "jni_mid_next is null"); - (*env)->DeleteLocalRef(env, jni_cls_iterator); - (*env)->DeleteLocalRef(env, jni_obj_iter); - (*env)->DeleteLocalRef(env, jni_cls_set); - (*env)->ReleaseStringUTFChars(env, jni_address, address); - (*env)->DeleteLocalRef(env, jni_address); - return; + // next connection will be requested with JNI_TRUE on autoConnect flag + // after first connection + CALEClientSetFlagToState(env, jni_address, CA_LE_AUTO_CONNECT_FLAG, JNI_TRUE); } - - // Iterate over the entry Set - while ((*env)->CallBooleanMethod(env, jni_obj_iter, jni_mid_hasNext)) + else { - jstring jni_str_entry = (jstring)(*env)->CallObjectMethod(env, jni_obj_iter, - jni_mid_next); - if (!jni_str_entry) - { - OIC_LOG(ERROR, TAG, "jni_str_entry is null"); - (*env)->DeleteLocalRef(env, jni_cls_iterator); - (*env)->DeleteLocalRef(env, jni_obj_iter); - (*env)->DeleteLocalRef(env, jni_cls_set); - (*env)->ReleaseStringUTFChars(env, jni_address, address); - (*env)->DeleteLocalRef(env, jni_address); - return; - } - const char* foundAddress = (*env)->GetStringUTFChars(env, jni_str_entry, NULL); - if (!foundAddress) - { - OIC_LOG(ERROR, TAG, "addr is null"); - (*env)->DeleteLocalRef(env, jni_str_entry); - (*env)->DeleteLocalRef(env, jni_cls_iterator); - (*env)->DeleteLocalRef(env, jni_obj_iter); - (*env)->DeleteLocalRef(env, jni_cls_set); - (*env)->ReleaseStringUTFChars(env, jni_address, address); - (*env)->DeleteLocalRef(env, jni_address); - return; - } - OIC_LOG_V(INFO, TAG, "found last connected address [%s] from SharedPreferences", - foundAddress); - - if (!strcmp(foundAddress, address)) - { - // if BLE address is matched each other - // this address will be added into auto connection list. - OIC_LOG(INFO, TAG, "AC list - address will be added into ACData list"); - CAManagerAddACData(env, jni_address); - CAManagerSetAutoConnectionFlag(env, jni_address, false); - - // next connection will be requested as JNI_TRUE flag - // after first connection - CALEClientSetFlagToState(env, jni_str_entry, CA_LE_AUTO_CONNECT_FLAG, JNI_TRUE); - } - else - { - OIC_LOG(INFO, TAG, "AC list - device is not matched"); - } - - (*env)->ReleaseStringUTFChars(env, jni_str_entry, foundAddress); - (*env)->DeleteLocalRef(env, jni_str_entry); + OIC_LOG(DEBUG, TAG, "AC list - the address is not set to AutoConnect"); } if (g_connStateCB) @@ -651,11 +556,9 @@ Java_org_iotivity_ca_CaLeClientInterface_caManagerLeServicesDiscoveredCallback(J OIC_LOG(DEBUG, TAG, "LE Connected callback is called"); } - (*env)->DeleteLocalRef(env, jni_cls_iterator); - (*env)->DeleteLocalRef(env, jni_obj_iter); - (*env)->DeleteLocalRef(env, jni_cls_set); (*env)->ReleaseStringUTFChars(env, jni_address, address); (*env)->DeleteLocalRef(env, jni_address); + OIC_LOG(INFO, TAG, "ServicesDiscovery is successful"); } else diff --git a/resource/csdk/connectivity/util/src/camanager/android/camanagerdevice.c b/resource/csdk/connectivity/util/src/camanager/android/camanagerdevice.c index 6950361..7a431e8 100644 --- a/resource/csdk/connectivity/util/src/camanager/android/camanagerdevice.c +++ b/resource/csdk/connectivity/util/src/camanager/android/camanagerdevice.c @@ -36,8 +36,7 @@ static bool g_isBTRecovery = false; jstring CAManagerGetLEAddressFromACData(JNIEnv *env, size_t idx) { - OIC_LOG(DEBUG, TAG, "CAManagerGetLEAddressFromACData"); - OIC_LOG_V(DEBUG, TAG, "idx : %d", idx); + OIC_LOG_V(DEBUG, TAG, "CAManagerGetLEAddressFromACData (idx : %d)", idx); if (idx <= u_arraylist_length(g_deviceACDataList)) { CAManagerACData_t *curData = (CAManagerACData_t *) u_arraylist_get( @@ -54,30 +53,39 @@ jstring CAManagerGetLEAddressFromACData(JNIEnv *env, size_t idx) OIC_LOG(ERROR, TAG, "address is null"); return NULL; } - OIC_LOG_V(INFO, TAG, "found out target address : %s", address); + OIC_LOG_V(INFO, TAG, "found target address : %s", address); (*env)->ReleaseStringUTFChars(env, curData->address, address); return curData->address; } + OIC_LOG(DEBUG, TAG, "idx is greater than the length of ACDataList"); return NULL; } -void CAManagerCreateACDataList(JNIEnv *env) +void CAManagerCreateACDataList() { OIC_LOG(DEBUG, TAG, "CAManagerCreateACDataList"); - VERIFY_NON_NULL_VOID(env, TAG, "env"); ca_mutex_lock(g_deviceACDataListMutex); - // create new object array - if (g_deviceACDataList == NULL) + if (NULL == g_deviceACDataList) { OIC_LOG(DEBUG, TAG, "Create AC Data list"); - g_deviceACDataList = u_arraylist_create(); } ca_mutex_unlock(g_deviceACDataListMutex); } +void CAManagerDestroyACDataList() +{ + OIC_LOG(DEBUG, TAG, "CAManagerDestroyACDataList"); + if (g_deviceACDataList) + { + OIC_LOG(DEBUG, TAG, "Destroy AC Data list"); + u_arraylist_free(&g_deviceACDataList); + g_deviceACDataList = NULL; + } +} + CAResult_t CAManagerInitMutexVaraibles() { if (NULL == g_deviceACDataListMutex) @@ -103,10 +111,10 @@ void CAManagerTerminateMutexVariables() static CAManagerACData_t *CAManagerCreateACData(jstring jaddress) { - OIC_LOG(DEBUG, TAG, "IN-CAManagerCreateACData"); + OIC_LOG(DEBUG, TAG, "IN - CAManagerCreateACData"); VERIFY_NON_NULL_RET(jaddress, TAG, "jaddress", NULL); - // create block data + // create AC data CAManagerACData_t *data = (CAManagerACData_t *) OICCalloc(1, sizeof(*data)); if (!data) { @@ -115,21 +123,24 @@ static CAManagerACData_t *CAManagerCreateACData(jstring jaddress) } data->address = jaddress; - data->isAutoConnect = false; + data->isAutoConnecting = false; - OIC_LOG(DEBUG, TAG, "OUT-CAManagerCreateACData"); + OIC_LOG(DEBUG, TAG, "OUT - CAManagerCreateACData"); return data; } -bool CAManagerIsMatchedACData(JNIEnv *env, jstring jaddress) +bool CAManagerIsInACDataList(JNIEnv *env, jstring jaddress) { VERIFY_NON_NULL_RET(env, TAG, "env", NULL); VERIFY_NON_NULL_RET(jaddress, TAG, "jaddress", false); + ca_mutex_lock(g_deviceACDataListMutex); + const char* address = (*env)->GetStringUTFChars(env, jaddress, NULL); if (!address) { OIC_LOG(ERROR, TAG, "address is null"); + ca_mutex_unlock(g_deviceACDataListMutex); return false; } @@ -142,6 +153,7 @@ bool CAManagerIsMatchedACData(JNIEnv *env, jstring jaddress) { OIC_LOG(ERROR, TAG, "curData is null"); (*env)->ReleaseStringUTFChars(env, jaddress, address); + ca_mutex_unlock(g_deviceACDataListMutex); return false; } @@ -150,6 +162,7 @@ bool CAManagerIsMatchedACData(JNIEnv *env, jstring jaddress) { OIC_LOG(ERROR, TAG, "address is null"); (*env)->ReleaseStringUTFChars(env, jaddress, address); + ca_mutex_unlock(g_deviceACDataListMutex); return false; } @@ -157,41 +170,49 @@ bool CAManagerIsMatchedACData(JNIEnv *env, jstring jaddress) { (*env)->ReleaseStringUTFChars(env, curData->address, setAddress); (*env)->ReleaseStringUTFChars(env, jaddress, address); + ca_mutex_unlock(g_deviceACDataListMutex); return true; } (*env)->ReleaseStringUTFChars(env, curData->address, setAddress); } + + OIC_LOG_V(DEBUG, TAG, "[%s] doesn't exist in list", address); (*env)->ReleaseStringUTFChars(env, jaddress, address); + ca_mutex_unlock(g_deviceACDataListMutex); return false; } void CAManagerAddACData(JNIEnv *env, jstring jaddress) { - OIC_LOG(DEBUG, TAG, "IN-CAManagerAddACData"); + OIC_LOG(DEBUG, TAG, "IN - CAManagerAddACData"); VERIFY_NON_NULL_VOID(env, TAG, "env"); VERIFY_NON_NULL_VOID(jaddress, TAG, "jaddress"); - ca_mutex_lock(g_deviceACDataListMutex); - - if(!CAManagerIsMatchedACData(env, jaddress)) + if(!CAManagerIsInACDataList(env, jaddress)) { - OIC_LOG(DEBUG, TAG, "ACdata will be added"); + OIC_LOG(DEBUG, TAG, "new ACdata will be added in List"); // add CAManagerACData jobject gaddress = (*env)->NewGlobalRef(env, jaddress); CAManagerACData_t *data = CAManagerCreateACData(gaddress); + + ca_mutex_lock(g_deviceACDataListMutex); u_arraylist_add(g_deviceACDataList, data); + ca_mutex_unlock(g_deviceACDataListMutex); + } + else + { + OIC_LOG(DEBUG, TAG, "the address is already in ACData list"); } - ca_mutex_unlock(g_deviceACDataListMutex); - OIC_LOG(DEBUG, TAG, "OUT-CAManagerAddACData"); + OIC_LOG(DEBUG, TAG, "OUT - CAManagerAddACData"); } -CAResult_t CAManagerRemoveData(JNIEnv *env, jstring jaddress) +CAResult_t CAManagerRemoveACData(JNIEnv *env, jstring jaddress) { - OIC_LOG(DEBUG, TAG, "IN-CAManagerRemoveData"); + OIC_LOG(DEBUG, TAG, "CAManagerRemoveACData"); VERIFY_NON_NULL(env, TAG, "env"); VERIFY_NON_NULL(jaddress, TAG, "jaddress"); @@ -205,7 +226,7 @@ CAResult_t CAManagerRemoveData(JNIEnv *env, jstring jaddress) return CA_STATUS_FAILED; } - OIC_LOG_V(DEBUG, TAG, "(%s) will be removed", address); + OIC_LOG_V(DEBUG, TAG, "[%s] will be removed", address); size_t length = u_arraylist_length(g_deviceACDataList); for (size_t idx = 0; idx < length; idx++) @@ -256,15 +277,16 @@ CAResult_t CAManagerRemoveData(JNIEnv *env, jstring jaddress) (*env)->ReleaseStringUTFChars(env, curData->address, setAddress); } + OIC_LOG_V(DEBUG, TAG, "[%s] doesn't exist in list", address); (*env)->ReleaseStringUTFChars(env, jaddress, address); ca_mutex_unlock(g_deviceACDataListMutex); - OIC_LOG(DEBUG, TAG, "OUT-CAManagerRemoveData"); + return CA_STATUS_OK; } -CAResult_t CAManagerRemoveAllData(JNIEnv *env) +CAResult_t CAManagerRemoveAllACData(JNIEnv *env) { - OIC_LOG(DEBUG, TAG, "IN-CAManagerRemoveAllData"); + OIC_LOG(DEBUG, TAG, "IN - CAManagerRemoveAllACData"); VERIFY_NON_NULL(env, TAG, "env"); ca_mutex_lock(g_deviceACDataListMutex); @@ -296,15 +318,15 @@ CAResult_t CAManagerRemoveAllData(JNIEnv *env) OICFree(curData); } ca_mutex_unlock(g_deviceACDataListMutex); - OIC_LOG(DEBUG, TAG, "OUT-CAManagerRemoveAllData"); + OIC_LOG(DEBUG, TAG, "OUT - CAManagerRemoveAllACData"); return CA_STATUS_OK; } -bool CAManagerGetAutoConnectionFlag(JNIEnv *env, jstring jaddress) +CAResult_t CAManagerGetAutoConnectingFlag(JNIEnv *env, jstring jaddress, bool *flag) { - OIC_LOG(DEBUG, TAG, "IN-CAManagerGetAutoConnectionFlag"); - VERIFY_NON_NULL_RET(env, TAG, "env", NULL); - VERIFY_NON_NULL_RET(jaddress, TAG, "jaddress", NULL); + OIC_LOG(DEBUG, TAG, "CAManagerGetAutoConnectingFlag"); + VERIFY_NON_NULL(env, TAG, "env"); + VERIFY_NON_NULL(jaddress, TAG, "jaddress"); ca_mutex_lock(g_deviceACDataListMutex); @@ -340,26 +362,29 @@ bool CAManagerGetAutoConnectionFlag(JNIEnv *env, jstring jaddress) if (!strcmp(setAddress, address)) { + OIC_LOG_V(DEBUG, TAG, "address : [%s], isAutoConnecting : %d", address, + curData->isAutoConnecting); + *flag = curData->isAutoConnecting; (*env)->ReleaseStringUTFChars(env, curData->address, setAddress); (*env)->ReleaseStringUTFChars(env, jaddress, address); ca_mutex_unlock(g_deviceACDataListMutex); - OIC_LOG_V(DEBUG, TAG, "flag is %d", curData->isAutoConnect); - return curData->isAutoConnect; + return CA_STATUS_OK; } (*env)->ReleaseStringUTFChars(env, curData->address, setAddress); } + + OIC_LOG_V(DEBUG, TAG, "[%s] doesn't exist in list", address); (*env)->ReleaseStringUTFChars(env, jaddress, address); ca_mutex_unlock(g_deviceACDataListMutex); - OIC_LOG(DEBUG, TAG, "OUT-CAManagerGetAutoConnectionFlag"); - return false; + return CA_STATUS_FAILED; } -void CAManagerSetAutoConnectionFlag(JNIEnv *env, jstring jaddress, bool flag) +bool CAManagerSetAutoConnectingFlag(JNIEnv *env, jstring jaddress, bool flag) { - OIC_LOG(DEBUG, TAG, "IN-CAManagerSetAutoConnectionFlag"); - VERIFY_NON_NULL_VOID(env, TAG, "env"); - VERIFY_NON_NULL_VOID(jaddress, TAG, "jaddress"); + OIC_LOG(DEBUG, TAG, "CAManagerSetAutoConnectingFlag"); + VERIFY_NON_NULL_RET(env, TAG, "env", false); + VERIFY_NON_NULL_RET(jaddress, TAG, "jaddress", false); ca_mutex_lock(g_deviceACDataListMutex); @@ -368,7 +393,7 @@ void CAManagerSetAutoConnectionFlag(JNIEnv *env, jstring jaddress, bool flag) { OIC_LOG(ERROR, TAG, "address is null"); ca_mutex_unlock(g_deviceACDataListMutex); - return; + return false; } size_t length = u_arraylist_length(g_deviceACDataList); @@ -381,7 +406,7 @@ void CAManagerSetAutoConnectionFlag(JNIEnv *env, jstring jaddress, bool flag) OIC_LOG(ERROR, TAG, "curData is null"); (*env)->ReleaseStringUTFChars(env, jaddress, address); ca_mutex_unlock(g_deviceACDataListMutex); - return; + return false; } const char* setAddress = (*env)->GetStringUTFChars(env, curData->address, NULL); @@ -390,24 +415,27 @@ void CAManagerSetAutoConnectionFlag(JNIEnv *env, jstring jaddress, bool flag) OIC_LOG(ERROR, TAG, "address is null"); (*env)->ReleaseStringUTFChars(env, jaddress, address); ca_mutex_unlock(g_deviceACDataListMutex); - return; + return false; } if (!strcmp(setAddress, address)) { - OIC_LOG_V(DEBUG, TAG, "flag is set to %d", flag); - curData->isAutoConnect = flag; + OIC_LOG_V(DEBUG, TAG, "isAutoConnecting flag of [%s] is set to %d", address, + curData->isAutoConnecting); + curData->isAutoConnecting = flag; (*env)->ReleaseStringUTFChars(env, curData->address, setAddress); (*env)->ReleaseStringUTFChars(env, jaddress, address); ca_mutex_unlock(g_deviceACDataListMutex); - return; + return true; } (*env)->ReleaseStringUTFChars(env, curData->address, setAddress); } + + OIC_LOG_V(DEBUG, TAG, "[%s] doesn't exist in list", address); (*env)->ReleaseStringUTFChars(env, jaddress, address); ca_mutex_unlock(g_deviceACDataListMutex); - OIC_LOG(DEBUG, TAG, "OUT-CAManagerSetAutoConnectionFlag"); + return false; } size_t CAManagerGetACDataLength() @@ -418,7 +446,7 @@ size_t CAManagerGetACDataLength() void CAManagerSetBTRecovery(bool flag) { g_isBTRecovery = flag; - OIC_LOG_V(DEBUG, TAG, "BT recovery flag : %d", g_isBTRecovery); + OIC_LOG_V(DEBUG, TAG, "BT recovery flag is set to %d", g_isBTRecovery); } bool CAManagerIsRecoveryFlagSet() diff --git a/resource/csdk/connectivity/util/src/camanager/android/camanagerdevice.h b/resource/csdk/connectivity/util/src/camanager/android/camanagerdevice.h index f3ec358..f9598e8 100644 --- a/resource/csdk/connectivity/util/src/camanager/android/camanagerdevice.h +++ b/resource/csdk/connectivity/util/src/camanager/android/camanagerdevice.h @@ -35,8 +35,8 @@ extern "C" */ typedef struct { - jstring address; /**< remote address */ - bool isAutoConnect; /**< auto connection flag */ + jstring address; /**< remote address */ + bool isAutoConnecting; /**< whether GATT connection has been in progress */ } CAManagerACData_t; /** @@ -49,9 +49,13 @@ jstring CAManagerGetLEAddressFromACData(JNIEnv *env, size_t idx); /** * create auto connection list. - * @param[in] env JNI interface pointer. */ -void CAManagerCreateACDataList(JNIEnv *env); +void CAManagerCreateACDataList(); + +/** + * Destroy auto connection list. + */ +void CAManagerDestroyACDataList(); /** * initialize mutex. @@ -65,11 +69,11 @@ CAResult_t CAManagerInitMutexVaraibles(); void CAManagerTerminateMutexVariables(); /** - * check whether target address is already contained in list or not. + * check whether target address is already contained in ACData list or not. * @param[in] env JNI interface pointer. * @param[in] jaddress ble address. */ -bool CAManagerIsMatchedACData(JNIEnv *env, jstring jaddress); +bool CAManagerIsInACDataList(JNIEnv *env, jstring jaddress); /** * add auto connection data into list. @@ -79,35 +83,37 @@ bool CAManagerIsMatchedACData(JNIEnv *env, jstring jaddress); void CAManagerAddACData(JNIEnv *env, jstring jaddress); /** - * remove auto connection data for selected ble address. + * remove auto connection data from ACData list for selected ble address. * @param[in] env JNI interface pointer. * @param[in] jaddress ble address. * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h). */ -CAResult_t CAManagerRemoveData(JNIEnv *env, jstring jaddress); +CAResult_t CAManagerRemoveACData(JNIEnv *env, jstring jaddress); /** - * remove auto connection data for all devices. + * remove auto connection data from ACData list for all devices. * @param[in] env JNI interface pointer. * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h). */ -CAResult_t CAManagerRemoveAllData(JNIEnv *env); +CAResult_t CAManagerRemoveAllACData(JNIEnv *env); /** - * get current auto connection flag. + * get isAutoConnecting flag for the address. * @param[in] env JNI interface pointer. * @param[in] jaddress ble address. - * @return true or false + * @param[out] flag isAutoConnecting flag + * @return ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h). */ -bool CAManagerGetAutoConnectionFlag(JNIEnv *env, jstring jaddress); +CAResult_t CAManagerGetAutoConnectingFlag(JNIEnv *env, jstring jaddress, bool *flag); /** - * set auto connection flag. + * set isAutoConnecting flag for the address. * @param[in] env JNI interface pointer. * @param[in] jaddress ble address. - * @param[in] flag auto connection flag. + * @param[in] flag isAutoConnecting flag. + * @return true or false */ -void CAManagerSetAutoConnectionFlag(JNIEnv *env, jstring jaddress, bool flag); +bool CAManagerSetAutoConnectingFlag(JNIEnv *env, jstring jaddress, bool flag); /** * get length of auto connection list. diff --git a/resource/csdk/connectivity/util/src/camanager/android/camanagerleutil.c b/resource/csdk/connectivity/util/src/camanager/android/camanagerleutil.c index a181467..04121eb 100644 --- a/resource/csdk/connectivity/util/src/camanager/android/camanagerleutil.c +++ b/resource/csdk/connectivity/util/src/camanager/android/camanagerleutil.c @@ -636,7 +636,7 @@ jobject CAManagerGetConnectedDeviceAddress(JNIEnv *env, jobject context) bool CAManagerRemoveConnectedDeviceAddress(JNIEnv *env, jobject context, jstring address, jobject set) { - OIC_LOG(DEBUG, TAG, "IN-CAManagerRemoveConnectedDeviceAddress"); + OIC_LOG(DEBUG, TAG, "CAManagerRemoveConnectedDeviceAddress"); VERIFY_NON_NULL_RET(env, TAG, "env", false); VERIFY_NON_NULL_RET(context, TAG, "context", false); -- 2.7.4