X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fcsdk%2Fconnectivity%2Fsrc%2Fbt_edr_adapter%2Fandroid%2Fcaedrclient.c;h=d29de99b02d204e4fd375f9b27a3b37bdaae8970;hb=7f00f942c39b7bc27c7eeecf213a239c3fe4173c;hp=a729e2c71ee188daefa8a700889094b92bff0f7c;hpb=3e08f0b76cfa2aebd58a6acd4d8a6ae64c5d3cf4;p=platform%2Fupstream%2Fiotivity.git diff --git a/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrclient.c b/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrclient.c index a729e2c..d29de99 100644 --- a/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrclient.c +++ b/resource/csdk/connectivity/src/bt_edr_adapter/android/caedrclient.c @@ -29,12 +29,11 @@ #include "oic_malloc.h" #include "oic_string.h" #include "cathreadpool.h" /* for thread pool */ -#include "camutex.h" +#include "octhread.h" #include "uarraylist.h" #include "caadapterutils.h" #include "caremotehandler.h" -//#define DEBUG_MODE #define TAG PCF("OIC_CA_EDR_CLIENT") static const char METHODID_CONTEXTNONPARAM[] = "()Landroid/content/Context;"; @@ -51,52 +50,20 @@ static const char CLASSPATH_BT_UUID[] = "java/util/UUID"; static const char CLASSPATH_CONTEXT[] = "android/content/Context"; static const char CLASSPATH_OUTPUT[] = "java/io/OutputStream"; -static ca_thread_pool_t g_threadPoolHandle = NULL; - static JavaVM *g_jvm; static jobject g_context; /** - * @var g_mutexUnicastServer - * @brief Mutex to synchronize unicast server - */ -static ca_mutex g_mutexUnicastServer = NULL; - -/** - * @var g_stopUnicast - * @brief Flag to control the Receive Unicast Data Thread - */ -static bool g_stopUnicast = false; - -/** - * @var g_mutexMulticastServer - * @brief Mutex to synchronize secure multicast server - */ -static ca_mutex g_mutexMulticastServer = NULL; - -/** - * @var g_stopMulticast - * @brief Flag to control the Receive Multicast Data Thread - */ -static bool g_stopMulticast = false; - -/** - * @var g_stopAccept - * @brief Flag to control the Accept Thread - */ -static bool g_stopAccept = false; - -/** * @var g_mutexStateList * @brief Mutex to synchronize device state list */ -static ca_mutex g_mutexStateList = NULL; +static oc_mutex g_mutexStateList = NULL; /** * @var g_mutexObjectList * @brief Mutex to synchronize device object list */ -static ca_mutex g_mutexObjectList = NULL; +static oc_mutex g_mutexObjectList = NULL; /** * @var g_edrErrorHandler @@ -104,27 +71,6 @@ static ca_mutex g_mutexObjectList = NULL; */ static CAEDRErrorHandleCallback g_edrErrorHandler = NULL; -typedef struct send_data -{ - char* address; - char* data; - uint32_t id; -} data_t; - -/** - @brief Thread context information for unicast, multicast and secured unicast server - */ -typedef struct -{ - bool *stopFlag; - CAAdapterServerType_t type; -} CAAdapterReceiveThreadContext_t; - -typedef struct -{ - bool *stopFlag; -} CAAdapterAcceptThreadContext_t; - /** * implement for BT-EDR adapter common method */ @@ -243,7 +189,7 @@ CAResult_t CAEDRGetAdapterEnableState(bool *state) return CA_STATUS_INVALID_PARAM; } 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) { @@ -282,7 +228,7 @@ void CAEDRJniInitContext() CAResult_t CAEDRCreateJNIInterfaceObject(jobject context) { - JNIEnv* env; + JNIEnv* env = NULL; OIC_LOG(DEBUG, TAG, "CAEDRCreateJNIInterfaceObject"); if ((*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6) != JNI_OK) @@ -291,20 +237,21 @@ CAResult_t CAEDRCreateJNIInterfaceObject(jobject context) return CA_STATUS_FAILED; } - //getApplicationContext - jclass contextClass = (*env)->FindClass(env, CLASSPATH_CONTEXT); - if (!contextClass) + + jmethodID mid_getApplicationContext = CAGetJNIMethodID(env, CLASSPATH_CONTEXT, + "getApplicationContext", + METHODID_CONTEXTNONPARAM); + if (!mid_getApplicationContext) { - OIC_LOG(ERROR, TAG, "Could not get context object class"); + OIC_LOG(ERROR, TAG, "Could not get getApplicationContext method"); return CA_STATUS_FAILED; } - jmethodID getApplicationContextMethod = (*env)->GetMethodID(env, contextClass, - "getApplicationContext", - METHODID_CONTEXTNONPARAM); - if (!getApplicationContextMethod) + jobject jApplicationContext = (*env)->CallObjectMethod(env, context, + mid_getApplicationContext); + if (!jApplicationContext) { - OIC_LOG(ERROR, TAG, "Could not get getApplicationContext method"); + OIC_LOG(ERROR, TAG, "Could not get application context"); return CA_STATUS_FAILED; } @@ -324,7 +271,7 @@ CAResult_t CAEDRCreateJNIInterfaceObject(jobject context) return CA_STATUS_FAILED; } - (*env)->NewObject(env, EDRJniInterface, EDRInterfaceConstructorMethod, context); + (*env)->NewObject(env, EDRJniInterface, EDRInterfaceConstructorMethod, jApplicationContext); OIC_LOG(DEBUG, TAG, "NewObject Success"); return CA_STATUS_OK; @@ -332,50 +279,22 @@ CAResult_t CAEDRCreateJNIInterfaceObject(jobject context) static void CAEDRDestroyMutex() { - if (g_mutexUnicastServer) - { - ca_mutex_free(g_mutexUnicastServer); - g_mutexUnicastServer = NULL; - } - - if (g_mutexMulticastServer) - { - ca_mutex_free(g_mutexMulticastServer); - g_mutexMulticastServer = NULL; - } - if (g_mutexStateList) { - ca_mutex_free(g_mutexStateList); + oc_mutex_free(g_mutexStateList); g_mutexStateList = NULL; } if (g_mutexObjectList) { - ca_mutex_free(g_mutexObjectList); + oc_mutex_free(g_mutexObjectList); g_mutexObjectList = NULL; } } static CAResult_t CAEDRCreateMutex() { - g_mutexUnicastServer = ca_mutex_new(); - if (!g_mutexUnicastServer) - { - OIC_LOG(ERROR, TAG, "Failed to created mutex!"); - return CA_STATUS_FAILED; - } - - g_mutexMulticastServer = ca_mutex_new(); - if (!g_mutexMulticastServer) - { - OIC_LOG(ERROR, TAG, "Failed to created mutex!"); - - CAEDRDestroyMutex(); - return CA_STATUS_FAILED; - } - - g_mutexStateList = ca_mutex_new(); + g_mutexStateList = oc_mutex_new(); if (!g_mutexStateList) { OIC_LOG(ERROR, TAG, "Failed to created mutex!"); @@ -384,7 +303,7 @@ static CAResult_t CAEDRCreateMutex() return CA_STATUS_FAILED; } - g_mutexObjectList = ca_mutex_new(); + g_mutexObjectList = oc_mutex_new(); if (!g_mutexObjectList) { OIC_LOG(ERROR, TAG, "Failed to created mutex!"); @@ -396,21 +315,24 @@ static CAResult_t CAEDRCreateMutex() return CA_STATUS_OK; } -void CAEDRInitialize(ca_thread_pool_t handle) +CAResult_t CAEDRInitialize() { OIC_LOG(DEBUG, TAG, "CAEDRInitialize"); - g_threadPoolHandle = handle; - CAEDRCoreJniInit(); CAEDRJniInitContext(); // init mutex - CAEDRCreateMutex(); + CAResult_t result = CAEDRCreateMutex(); + if(CA_STATUS_OK != result) + { + OIC_LOG(ERROR, TAG, "CAEDRInitialize - Could not create mutex"); + return result; + } 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) { @@ -420,7 +342,7 @@ void CAEDRInitialize(ca_thread_pool_t handle) if (JNI_OK != res) { OIC_LOG(ERROR, TAG, "AttachCurrentThread failed"); - return; + return CA_STATUS_NOT_INITIALIZED; } isAttached = true; } @@ -433,13 +355,13 @@ void CAEDRInitialize(ca_thread_pool_t handle) } (*env)->DeleteLocalRef(env, jni_address); - ca_mutex_lock(g_mutexStateList); + oc_mutex_lock(g_mutexStateList); CAEDRNativeCreateDeviceStateList(); - ca_mutex_unlock(g_mutexStateList); + oc_mutex_unlock(g_mutexStateList); - ca_mutex_lock(g_mutexObjectList); + oc_mutex_lock(g_mutexObjectList); CAEDRNativeCreateDeviceSocketList(); - ca_mutex_unlock(g_mutexObjectList); + oc_mutex_unlock(g_mutexObjectList); if (isAttached) { @@ -452,6 +374,8 @@ void CAEDRInitialize(ca_thread_pool_t handle) } OIC_LOG(DEBUG, TAG, "OUT"); + + return result; } void CAEDRTerminate() @@ -459,7 +383,7 @@ void CAEDRTerminate() OIC_LOG(DEBUG, TAG, "CAEDRTerminate"); 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) { @@ -474,10 +398,6 @@ void CAEDRTerminate() isAttached = true; } - g_stopAccept = true; - g_stopMulticast = true; - g_stopUnicast = true; - if (isAttached) { (*g_jvm)->DetachCurrentThread(g_jvm); @@ -486,6 +406,7 @@ void CAEDRTerminate() if (g_context) { (*env)->DeleteGlobalRef(env, g_context); + g_context = NULL; } CAEDRNativeSocketCloseToAll(env); @@ -509,7 +430,7 @@ CAResult_t CAEDRDestroyJniInterface() } 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) { @@ -589,7 +510,7 @@ CAResult_t CAEDRSendMulticastMessage(const uint8_t* data, uint32_t dataLen) VERIFY_NON_NULL(data, TAG, "data is null"); 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) { @@ -611,8 +532,6 @@ CAResult_t CAEDRSendMulticastMessage(const uint8_t* data, uint32_t dataLen) return result; } - OIC_LOG(DEBUG, TAG, "sent data"); - if (isAttached) { OIC_LOG(DEBUG, TAG, "DetachCurrentThread"); @@ -632,7 +551,7 @@ CAResult_t CAEDRGetInterfaceInfo(char **address) void CAEDRGetLocalAddress(char **address) { 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) { @@ -679,7 +598,7 @@ CAResult_t CAEDRSendUnicastMessageImpl(const char* address, const uint8_t* data, VERIFY_NON_NULL(data, TAG, "data is null"); 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) { @@ -843,14 +762,14 @@ CAResult_t CAEDRNativeSendData(JNIEnv *env, const char *address, const uint8_t * if (!CAEDRNativeIsEnableBTAdapter(env)) { - OIC_LOG(ERROR, TAG, "BT adpater is not enable"); - return CA_STATUS_INVALID_PARAM; + OIC_LOG(INFO, TAG, "BT adapter is not enabled"); + return CA_ADAPTER_NOT_ENABLED; } if (STATE_DISCONNECTED == CAEDRIsConnectedDevice(address)) { // connect before send data - OIC_LOG(DEBUG, TAG, "connect before send data"); + OIC_LOG_V(DEBUG, TAG, "try to connect with [%s] before sending data", address); CAResult_t res = CAEDRNativeConnect(env, address); if (CA_STATUS_OK != res) @@ -935,19 +854,22 @@ CAResult_t CAEDRNativeSendData(JNIEnv *env, const char *address, const uint8_t * if ((*env)->ExceptionCheck(env)) { OIC_LOG(ERROR, TAG, "Failed to write data in outputStram"); + CALogSendStateInfo(CA_ADAPTER_RFCOMM_BTEDR, address, 0, dataLength, false, NULL); (*env)->ExceptionDescribe(env); (*env)->ExceptionClear(env); return CA_STATUS_FAILED; } - OIC_LOG_V(INFO, TAG, "EDR sendTo is successful: %ld bytes, to %s", + OIC_LOG_V(INFO, TAG, "EDR sendTo is successful: %u bytes, to %s", dataLength, address); + CALogSendStateInfo(CA_ADAPTER_RFCOMM_BTEDR, address, 0, dataLength, true, NULL); } else { + OIC_LOG(ERROR, TAG, "error!!"); + CALogSendStateInfo(CA_ADAPTER_RFCOMM_BTEDR, address, 0, dataLength, false, NULL); (*env)->ExceptionDescribe(env); (*env)->ExceptionClear(env); - OIC_LOG(ERROR, TAG, "error!!"); return CA_STATUS_FAILED; } } @@ -962,12 +884,11 @@ CAResult_t CAEDRNativeSendData(JNIEnv *env, const char *address, const uint8_t * CAResult_t CAEDRNativeConnect(JNIEnv *env, const char *address) { VERIFY_NON_NULL(address, TAG, "address is null"); - OIC_LOG(DEBUG, TAG, "btConnect.."); if (!CAEDRNativeIsEnableBTAdapter(env)) { - OIC_LOG(ERROR, TAG, "BT adpater is not enable"); - return CA_STATUS_INVALID_PARAM; + OIC_LOG(INFO, TAG, "BT adapter is not enabled"); + return CA_ADAPTER_NOT_ENABLED; } jclass jni_cid_BTAdapter = (*env)->FindClass(env, CLASSPATH_BT_ADPATER); @@ -1111,6 +1032,7 @@ CAResult_t CAEDRNativeConnect(JNIEnv *env, const char *address) if ((*env)->ExceptionCheck(env)) { + CALogSendStateInfo(CA_ADAPTER_RFCOMM_BTEDR, address, 0, 0, false, "Connect has Failed"); OIC_LOG(ERROR, TAG, "Connect is Failed!!!"); (*env)->ExceptionDescribe(env); (*env)->ExceptionClear(env); @@ -1125,18 +1047,18 @@ CAResult_t CAEDRNativeConnect(JNIEnv *env, const char *address) (*env)->DeleteLocalRef(env, jni_obj_BTSocket); return CA_STATUS_FAILED; } - ca_mutex_lock(g_mutexObjectList); + oc_mutex_lock(g_mutexObjectList); CAEDRNativeAddDeviceSocketToList(env, jni_socket); (*env)->DeleteGlobalRef(env, jni_socket); (*env)->DeleteLocalRef(env, jni_obj_BTSocket); - ca_mutex_unlock(g_mutexObjectList); + oc_mutex_unlock(g_mutexObjectList); // update state - ca_mutex_lock(g_mutexStateList); + oc_mutex_lock(g_mutexStateList); CAEDRUpdateDeviceState(STATE_CONNECTED, address); - ca_mutex_unlock(g_mutexStateList); + oc_mutex_unlock(g_mutexStateList); - OIC_LOG(DEBUG, TAG, "connected"); + OIC_LOG(DEBUG, TAG, "successfully connected"); return CA_STATUS_OK; } @@ -1180,16 +1102,17 @@ void CAEDRNativeSocketClose(JNIEnv *env, const char *address) CAEDRNativeRemoveDeviceSocket(env, jni_obj_socket); // update state - ca_mutex_lock(g_mutexStateList); + oc_mutex_lock(g_mutexStateList); CAEDRUpdateDeviceState(STATE_DISCONNECTED, address); - ca_mutex_unlock(g_mutexStateList); + oc_mutex_unlock(g_mutexStateList); - OIC_LOG(DEBUG, TAG, "disconnected"); + OIC_LOG_V(DEBUG, TAG, "disconnected with [%s]", address); } -void CAEDRInitializeClient(ca_thread_pool_t handle) +CAResult_t CAEDRClientInitialize() { - CAEDRInitialize(handle); + CAResult_t result = CAEDRInitialize(); + return result; } void CAEDRSetErrorHandler(CAEDRErrorHandleCallback errorHandleCallback)