From 5018039d55a5ad083290ed127d811462f1b0351d Mon Sep 17 00:00:00 2001 From: "jihwan.seo" Date: Thu, 17 Mar 2016 13:58:30 +0900 Subject: [PATCH] modified start Multicast Server logic of android BLE. Change-Id: I22dc91b6361da26830490dbf7c5b773473ccd4e8 Signed-off-by: jihwan.seo Reviewed-on: https://gerrit.iotivity.org/gerrit/5993 Tested-by: jenkins-iotivity Reviewed-by: Jon A. Cruz (cherry picked from commit 9a79a0333d52b0435f17eae84662a828a021a3c7) Reviewed-on: https://gerrit.iotivity.org/gerrit/6113 --- .../src/bt_le_adapter/android/caleclient.c | 105 ++++++--------------- .../src/bt_le_adapter/android/calenwmonitor.c | 2 - .../src/bt_le_adapter/android/caleserver.c | 28 ++++-- 3 files changed, 50 insertions(+), 85 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 92f78f1..e215d5b 100644 --- a/resource/csdk/connectivity/src/bt_le_adapter/android/caleclient.c +++ b/resource/csdk/connectivity/src/bt_le_adapter/android/caleclient.c @@ -68,7 +68,6 @@ static jobjectArray g_uuidList = NULL; // it will be prevent to start send logic when adapter has stopped. static bool g_isStartedLEClient = false; -static bool g_isStartedMulticastServer = false; static bool g_isStartedScan = false; static jbyteArray g_sendBuffer = NULL; @@ -334,21 +333,25 @@ void CALEClientTerminate() if (g_leScanCallback) { (*env)->DeleteGlobalRef(env, g_leScanCallback); + g_leScanCallback = NULL; } if (g_leGattCallback) { (*env)->DeleteGlobalRef(env, g_leGattCallback); + g_leGattCallback = NULL; } if (g_sendBuffer) { (*env)->DeleteGlobalRef(env, g_sendBuffer); + g_sendBuffer = NULL; } if (g_uuidList) { (*env)->DeleteGlobalRef(env, g_uuidList); + g_uuidList = NULL; } CAResult_t ret = CALEClientRemoveAllDeviceState(); @@ -369,9 +372,8 @@ void CALEClientTerminate() OIC_LOG(ERROR, TAG, "CALEClientRemoveAllGattObjs has failed"); } - g_isStartedMulticastServer = false; CALEClientSetScanFlag(false); - CALEClientSetSendFinishFlag(false); + CALEClientSetSendFinishFlag(true); CALEClientTerminateGattMutexVariables(); CALEClientDestroyJniInterface(); @@ -543,49 +545,9 @@ CAResult_t CALEClientStartUnicastServer(const char* address) CAResult_t CALEClientStartMulticastServer() { - OIC_LOG(DEBUG, TAG, "CALEClientStartMulticastServer"); - - if (g_isStartedMulticastServer) - { - OIC_LOG(ERROR, TAG, "server is already started..it will be skipped"); - return CA_STATUS_FAILED; - } - - if (!g_jvm) - { - OIC_LOG(ERROR, TAG, "g_jvm is null"); - return CA_STATUS_FAILED; - } - - bool isAttached = false; - JNIEnv* env; - jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6); - if (JNI_OK != res) - { - OIC_LOG(INFO, TAG, "Could not get JNIEnv pointer"); - res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL); - - if (JNI_OK != res) - { - OIC_LOG(ERROR, TAG, "AttachCurrentThread has failed"); - return CA_STATUS_FAILED; - } - isAttached = true; - } + OIC_LOG(DEBUG, TAG, "it is not needed in this platform"); - g_isStartedMulticastServer = true; - CAResult_t ret = CALEClientStartScan(); - if (CA_STATUS_OK != ret) - { - OIC_LOG(ERROR, TAG, "CALEClientStartScan has failed"); - } - - if (isAttached) - { - (*g_jvm)->DetachCurrentThread(g_jvm); - } - - return ret; + return CA_NOT_SUPPORTED; } void CALEClientStopUnicastServer() @@ -596,13 +558,6 @@ void CALEClientStopUnicastServer() void CALEClientStopMulticastServer() { OIC_LOG(DEBUG, TAG, "CALEClientStopMulticastServer"); - g_isStartedMulticastServer = false; - CAResult_t res = CALEClientStopScan(); - if (CA_STATUS_OK != res) - { - OIC_LOG(ERROR, TAG, "CALEClientStartScan has failed"); - return; - } } void CALEClientSetCallback(CAPacketReceiveCallback callback) @@ -1207,12 +1162,6 @@ CAResult_t CALEClientGattClose(JNIEnv *env, jobject bluetoothGatt) CAResult_t CALEClientStartScan() { - if (!g_isStartedMulticastServer) - { - OIC_LOG(ERROR, TAG, "server is not started yet..scan will be passed"); - return CA_STATUS_FAILED; - } - if (!g_isStartedLEClient) { OIC_LOG(ERROR, TAG, "LE client is not started"); @@ -1332,8 +1281,7 @@ CAResult_t CALEClientStartScanImpl(JNIEnv *env, jobject callback) jni_mid_startLeScan, callback); if (!jni_obj_startLeScan) { - OIC_LOG(ERROR, TAG, "startLeScan is failed"); - return CA_STATUS_FAILED; + OIC_LOG(INFO, TAG, "startLeScan is failed"); } else { @@ -1397,8 +1345,7 @@ CAResult_t CALEClientStartScanWithUUIDImpl(JNIEnv *env, jobjectArray uuids, jobj jni_mid_startLeScan, uuids, callback); if (!jni_obj_startLeScan) { - OIC_LOG(ERROR, TAG, "startLeScan With UUID is failed"); - return CA_STATUS_FAILED; + OIC_LOG(INFO, TAG, "startLeScan With UUID is failed"); } else { @@ -1700,6 +1647,12 @@ jobject CALEClientGattConnect(JNIEnv *env, jobject bluetoothDevice, jboolean aut VERIFY_NON_NULL_RET(env, TAG, "env is null", NULL); VERIFY_NON_NULL_RET(bluetoothDevice, TAG, "bluetoothDevice is null", NULL); + if (!g_leGattCallback) + { + OIC_LOG(INFO, TAG, "g_leGattCallback is null"); + return NULL; + } + if (!CALEIsEnableBTAdapter(env)) { OIC_LOG(INFO, TAG, "BT adapter is not enabled"); @@ -2603,6 +2556,13 @@ CAResult_t CALEClientAddScanDeviceToList(JNIEnv *env, jobject device) if (!g_deviceList) { OIC_LOG(ERROR, TAG, "gdevice_list is null"); + + CALEClientSetScanFlag(false); + if (CA_STATUS_OK != CALEClientStopScan()) + { + OIC_LOG(ERROR, TAG, "CALEClientStopScan has failed"); + } + ca_mutex_unlock(g_deviceListMutex); return CA_STATUS_FAILED; } @@ -3806,17 +3766,15 @@ CAResult_t CAStartLEGattClient() g_threadWriteCharacteristicCond = ca_cond_new(); } - CAResult_t res = CALEClientStartMulticastServer(); - if (CA_STATUS_OK != res) - { - OIC_LOG(ERROR, TAG, "CALEClientStartMulticastServer has failed"); - } - else + CAResult_t ret = CALEClientStartScan(); + if (CA_STATUS_OK != ret) { - g_isStartedLEClient = true; + OIC_LOG(ERROR, TAG, "CALEClientStartScan has failed"); + return ret; } - return res; + g_isStartedLEClient = true; + return CA_STATUS_OK; } void CAStopLEGattClient() @@ -3860,6 +3818,7 @@ void CAStopLEGattClient() ca_mutex_lock(g_threadMutex); OIC_LOG(DEBUG, TAG, "signal - connection cond"); ca_cond_signal(g_threadCond); + CALEClientSetSendFinishFlag(true); ca_mutex_unlock(g_threadMutex); ca_mutex_lock(g_threadWriteCharacteristicMutex); @@ -3867,17 +3826,11 @@ void CAStopLEGattClient() ca_cond_signal(g_threadWriteCharacteristicCond); ca_mutex_unlock(g_threadWriteCharacteristicMutex); - ca_mutex_lock(g_threadSendMutex); - OIC_LOG(DEBUG, TAG, "signal - send cond"); - ca_cond_signal(g_deviceDescCond); - ca_mutex_unlock(g_threadSendMutex); - ca_mutex_lock(g_deviceScanRetryDelayMutex); OIC_LOG(DEBUG, TAG, "signal - delay cond"); ca_cond_signal(g_deviceScanRetryDelayCond); ca_mutex_unlock(g_deviceScanRetryDelayMutex); - ca_cond_free(g_deviceDescCond); ca_cond_free(g_threadCond); ca_cond_free(g_threadWriteCharacteristicCond); 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 ca8df5b..758243e 100644 --- a/resource/csdk/connectivity/src/bt_le_adapter/android/calenwmonitor.c +++ b/resource/csdk/connectivity/src/bt_le_adapter/android/calenwmonitor.c @@ -295,8 +295,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) diff --git a/resource/csdk/connectivity/src/bt_le_adapter/android/caleserver.c b/resource/csdk/connectivity/src/bt_le_adapter/android/caleserver.c index 5699eb0..7242404 100644 --- a/resource/csdk/connectivity/src/bt_le_adapter/android/caleserver.c +++ b/resource/csdk/connectivity/src/bt_le_adapter/android/caleserver.c @@ -310,6 +310,8 @@ CAResult_t CALEServerSendResponseData(JNIEnv *env, jobject device, jobject respo return CA_STATUS_FAILED; } + OIC_LOG(DEBUG, TAG, "CALL API - notifyCharacteristicChanged"); + jboolean jni_boolean_notifyCharacteristicChanged = (*env)->CallBooleanMethod( env, g_bluetoothGattServer, jni_mid_notifyCharacteristicChanged, device, responseData, JNI_FALSE); @@ -1787,8 +1789,13 @@ CAResult_t CALEServerSendUnicastMessageImpl(JNIEnv *env, const char* address, co if (g_obj_bluetoothDevice) { (*env)->DeleteGlobalRef(env, g_obj_bluetoothDevice); + g_obj_bluetoothDevice = NULL; + } + + if (jarrayObj) + { + g_obj_bluetoothDevice = (*env)->NewGlobalRef(env, jarrayObj); } - g_obj_bluetoothDevice = (*env)->NewGlobalRef(env, jarrayObj); (*env)->ReleaseStringUTFChars(env, jni_setAddress, setAddress); break; } @@ -1805,11 +1812,6 @@ CAResult_t CALEServerSendUnicastMessageImpl(JNIEnv *env, const char* address, co if (CA_STATUS_OK != res) { OIC_LOG(ERROR, TAG, "send has failed"); - if (g_obj_bluetoothDevice) - { - (*env)->DeleteGlobalRef(env, g_obj_bluetoothDevice); - g_obj_bluetoothDevice = NULL; - } goto error_exit; } } @@ -1836,6 +1838,12 @@ error_exit: g_sendBuffer = NULL; } + if (g_obj_bluetoothDevice) + { + (*env)->DeleteGlobalRef(env, g_obj_bluetoothDevice); + g_obj_bluetoothDevice = NULL; + } + ca_mutex_unlock(g_threadSendMutex); return CA_SEND_FAILED; } @@ -1895,8 +1903,13 @@ CAResult_t CALEServerSendMulticastMessageImpl(JNIEnv *env, const uint8_t *data, if (g_obj_bluetoothDevice) { (*env)->DeleteGlobalRef(env, g_obj_bluetoothDevice); + g_obj_bluetoothDevice = NULL; + } + + if (jarrayObj) + { + g_obj_bluetoothDevice = (*env)->NewGlobalRef(env, jarrayObj); } - g_obj_bluetoothDevice = (*env)->NewGlobalRef(env, jarrayObj); CAResult_t res = CALEServerSend(env, g_obj_bluetoothDevice, jni_bytearr_data); if (CA_STATUS_OK != res) @@ -2114,6 +2127,7 @@ CAResult_t CALEServerRemoveDevice(JNIEnv *env, jstring address) (*env)->ReleaseStringUTFChars(env, jni_setAddress, setAddress); (*env)->ReleaseStringUTFChars(env, address, remoteAddress); (*env)->DeleteGlobalRef(env, jarrayObj); + jarrayObj = NULL; if (NULL == u_arraylist_remove(g_connectedDeviceList, index)) { -- 2.7.4