Fixed prevent and klock work issues reported.
authorAshok Channa <ashok.channa@samsung.com>
Wed, 21 Jan 2015 09:43:07 +0000 (18:43 +0900)
committerSudarshan Prasad <sudarshan.prasad@intel.com>
Wed, 21 Jan 2015 21:16:51 +0000 (21:16 +0000)
Static analysis reported issues are fixed in this commit.

Change-Id: I1c4cefe46650a2acaafb374fbb04ca1936434ab4
Signed-off-by: Ashok Channa <ashok.channa@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/179
Tested-by: jenkins-iotivity <jenkins-iotivity@opendaylight.org>
Reviewed-by: Sudarshan Prasad <sudarshan.prasad@intel.com>
resource/csdk/connectivity/src/bt_edr_adapter/android/caedrclient.c
resource/csdk/connectivity/src/bt_edr_adapter/android/caedrnwmonitor.c
resource/csdk/connectivity/src/bt_edr_adapter/android/caedrserver.c
resource/csdk/connectivity/src/bt_edr_adapter/android/caedrutils.c
resource/csdk/connectivity/src/bt_edr_adapter/caedradapter.c
resource/csdk/connectivity/src/bt_le_adapter/arduino/cablenwmonitor.cpp
resource/csdk/connectivity/src/bt_le_adapter/caleadapter.c
resource/csdk/connectivity/src/bt_le_adapter/caleadapter_singlethread.c
resource/csdk/connectivity/src/camessagehandler.c

index 0bfb40e..f633632 100644 (file)
@@ -10,9 +10,8 @@
 #include "oic_malloc.h"
 #include "uthreadpool.h" /* for thread pool */
 #include "umutex.h"
-#include "uarraylist.h"
 #include "caadapterutils.h"
-#include "com_iotivity_jar_CALeInterface.h"
+#include "com_iotivity_jar_CAEDRInterface.h"
 
 //#define DEBUG_MODE
 #define TAG PCF("CA_EDR_CLIENT")
@@ -25,24 +24,11 @@ static const char *CLASSPATH_BT_UUID = "java/util/UUID";
 static const uint32_t STATE_CONNECTED = 1;
 static const uint32_t STATE_DISCONNECTED = 0;
 
-static const uint32_t MAX_PDU_BUFFER = 1024;
-
-static u_arraylist_t *gdeviceStateList = NULL;
-static u_arraylist_t *gdeviceObjectList = NULL;
-
 static u_thread_pool_t gThreadPoolHandle = NULL;
 
 static JavaVM *g_jvm;
 static jobject gContext;
 
-static jbyteArray gSendBuffer;
-
-/**
- * @var gMutexSocketListManager
- * @brief Mutex to synchronize socket list update
- */
-static u_mutex gMutexSocketListManager;
-
 // server socket instance
 static jobject gServerSocketObject = NULL;
 
@@ -96,13 +82,57 @@ typedef struct
     bool *stopFlag;
 } CAAdapterAcceptThreadContext_t;
 
-// temp method
-
+/**
+ * implement for BT-EDR adapter common method
+ */
 CAResult_t CAEDRGetInterfaceInformation(CALocalConnectivity_t **info)
 {
-    OIC_LOG_V(DEBUG, TAG, "IN");
+    OIC_LOG_V(DEBUG, TAG, "IN - CAEDRGetInterfaceInformation");
 
-    OIC_LOG_V(DEBUG, TAG, "OUT");
+    CALocalConnectivity_t *netInfo = NULL;
+
+    int32_t netInfoSize = 1;
+
+    netInfo = (CALocalConnectivity_t *) OICMalloc(sizeof(CALocalConnectivity_t) * netInfoSize);
+    if(NULL == netInfo)
+    {
+        OIC_LOG_V(ERROR, TAG, "Invalid input..");
+        return CA_MEMORY_ALLOC_FAILED;
+    }
+    memset(netInfo, 0, sizeof(CALocalConnectivity_t) * netInfoSize);
+
+    char *macAddress = NULL;
+    CAResult_t ret = CAEDRGetInterfaceInfo(&macAddress);
+    OIC_LOG_V(ERROR, TAG, "address : %s", macAddress);
+    if (CA_STATUS_OK != ret || NULL == macAddress)
+    {
+        OIC_LOG_V(ERROR, TAG, "Failed to get interface info [%d]", ret);
+
+        OICFree(netInfo);
+        OICFree(macAddress);
+        return ret;
+    }
+
+    // Create local endpoint using util function
+    CALocalConnectivity_t *endpoint = CAAdapterCreateLocalEndpoint(CA_EDR, macAddress);
+    if (NULL == endpoint)
+    {
+        OIC_LOG_V(ERROR, TAG, "Failed to create Local Endpoint!",
+                  CA_MEMORY_ALLOC_FAILED);
+        OICFree(netInfo);
+        OICFree(macAddress);
+        return CA_MEMORY_ALLOC_FAILED;
+    }
+
+    // copy unicast server information
+    endpoint->isSecured = CA_FALSE;
+    memcpy(&netInfo[0], endpoint, sizeof(CALocalConnectivity_t));
+    *info = netInfo;
+
+    OICFree(macAddress);
+    CAAdapterFreeLocalEndpoint(endpoint);
+
+    OIC_LOG_V(DEBUG, TAG, "OUT - CAEDRGetInterfaceInformation");
     return CA_STATUS_OK;
 }
 
@@ -168,7 +198,7 @@ CAResult_t CAEDRGetAdapterEnableState(CABool_t *state)
         if(res != JNI_OK)
         {
             OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
-            return;
+            return CA_STATUS_FAILED;
         }
         isAttached = TRUE;
     }
@@ -192,30 +222,11 @@ CAResult_t CAEDRGetAdapterEnableState(CABool_t *state)
 ////////////////////////////////////////////////////////////////////////////////////////////////////
 //FIXME getting context
 
-void CAEDRJniSetContext(jobject context)
+void CAEDRJniSetContext()
 {
-    OIC_LOG_V(DEBUG, TAG, "caedrSetObject");
-
-    jboolean isAttached = FALSE;
-    JNIEnv* env;
-    jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
-    if(res != JNI_OK)
-    {
-        OIC_LOG_V(DEBUG, TAG, "CAEDRInitialize - Could not get JNIEnv pointer");
-        res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
+    OIC_LOG_V(DEBUG, TAG, "CAEDRJniSetContext");
 
-        if(res != JNI_OK)
-        {
-            OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
-            return;
-        }
-        isAttached = TRUE;
-    }
-
-    gContext = (*env)->NewGlobalRef(env, context);
-
-    if(isAttached)
-        (*g_jvm)->DetachCurrentThread(g_jvm);
+    gContext = CANativeJNIGetContext();
 }
 
 void CAEDRCreateJNIInterfaceObject(jobject context)
@@ -245,27 +256,23 @@ void CAEDRCreateJNIInterfaceObject(jobject context)
         return;
     }
 
-    jobject gApplicationContext = (*env)->CallObjectMethod(env, context, getApplicationContextMethod);
-    OIC_LOG_V(DEBUG, TAG, "[WIFICore] Saving Android application context object %p", gApplicationContext);
-
-   //Create WiFiInterface instance
-    jclass WiFiJniInterface = (*env)->FindClass(env, "com/iotivity/jar/CAEDRInterface");
-    if (!WiFiJniInterface)
+    //Create EDRJniInterface instance
+    jclass EDRJniInterface = (*env)->FindClass(env, "com/iotivity/jar/CAEDRInterface");
+    if (!EDRJniInterface)
     {
-        OIC_LOG_V(DEBUG, TAG, "[EDRCore] Could not get CAWiFiInterface class");
+        OIC_LOG_V(DEBUG, TAG, "[EDRCore] Could not get CAEDRInterface class");
         return;
     }
 
-    jmethodID WiFiInterfaceConstructorMethod = (*env)->GetMethodID(env,
-            WiFiJniInterface, "<init>", "(Landroid/content/Context;)V");
-    if (!WiFiInterfaceConstructorMethod)
+    jmethodID EDRInterfaceConstructorMethod = (*env)->GetMethodID(env,
+            EDRJniInterface, "<init>", "(Landroid/content/Context;)V");
+    if (!EDRInterfaceConstructorMethod)
     {
-        OIC_LOG_V(DEBUG, TAG, "[EDRCore] Could not get CAWiFiInterface constructor method");
+        OIC_LOG_V(DEBUG, TAG, "[EDRCore] Could not get CAEDRInterface constructor method");
         return;
     }
 
-    (*env)->NewObject(env, WiFiJniInterface, WiFiInterfaceConstructorMethod, gApplicationContext);
-    OIC_LOG_V(DEBUG, TAG, "[EDRCore] Create CAWiFiInterface instance");
+    (*env)->NewObject(env, EDRJniInterface, EDRInterfaceConstructorMethod, context);
     OIC_LOG_V(DEBUG, TAG, "[EDRCore] NewObject Success");
 
 }
@@ -290,12 +297,6 @@ static void CAEDRDestroyMutex()
         gMutexMulticastServer = NULL;
     }
 
-    if(gMutexSocketListManager)
-    {
-        u_mutex_free(gMutexSocketListManager);
-        gMutexSocketListManager = NULL;
-    }
-
     OIC_LOG(DEBUG, TAG, "OUT");
 }
 
@@ -323,15 +324,6 @@ static CAResult_t CAEDRCreateMutex()
         return CA_STATUS_FAILED;
     }
 
-    gMutexSocketListManager = u_mutex_new();
-    if (!gMutexSocketListManager)
-    {
-        OIC_LOG(ERROR, TAG, "Failed to created mutex!");
-
-        CAEDRDestroyMutex();
-        return CA_STATUS_FAILED;
-    }
-
     OIC_LOG(DEBUG, TAG, "OUT");
     return CA_STATUS_OK;
 }
@@ -342,6 +334,10 @@ void CAEDRInitialize(u_thread_pool_t handle)
 
     gThreadPoolHandle = handle;
 
+    CAEDRCoreJniInit();
+
+    CAEDRJniSetContext();
+
     // init mutex
     CAEDRCreateMutex();
 
@@ -365,7 +361,7 @@ void CAEDRInitialize(u_thread_pool_t handle)
     if(jni_address)
     {
         const char* localAddress = (*env)->GetStringUTFChars(env, jni_address, NULL);
-        OIC_LOG_V(DEBUG, TAG, "My BT Address is %s", localAddress);
+        OIC_LOG_V(DEBUG, TAG, "My BT Address is %s ", localAddress);
     }
 
     CAEDRNativeCreateDeviceStateList();
@@ -374,7 +370,11 @@ void CAEDRInitialize(u_thread_pool_t handle)
     if(isAttached)
         (*g_jvm)->DetachCurrentThread(g_jvm);
 
-//    CAEDRCreateJNIInterfaceObject(gContext); /* create java CAEDRInterface instance*/
+    if(gContext)
+    {
+        //FIXME
+        CAEDRCreateJNIInterfaceObject(gContext); /* create java CAEDRInterface instance*/
+    }
 
     OIC_LOG(DEBUG, TAG, "OUT");
 }
@@ -403,22 +403,22 @@ void CAEDRTerminate()
     gStopMulticast = TRUE;
     gStopUnicast = TRUE;
 
-    if(isAttached)
-        (*g_jvm)->DetachCurrentThread(g_jvm);
+    CAEDRNativeSocketCloseToAll(env);
 
     // delete mutex
     CAEDRDestroyMutex();
 
     CAEDRNativeRemoveAllDeviceState();
     CAEDRNativeRemoveAllDeviceSocket(env);
+
+    if(isAttached)
+        (*g_jvm)->DetachCurrentThread(g_jvm);
 }
 
-void CAEDRCoreJniInit(JNIEnv *env, JavaVM* jvm)
+void CAEDRCoreJniInit()
 {
     OIC_LOG_V(DEBUG, TAG, "CAEdrClientJniInit");
-    g_jvm = jvm;
-
-    CAEDRServerJniInit(env, jvm);
+    g_jvm = CANativeJNIGetJavaVM();
 }
 
 int32_t CAEDRSendUnicastMessage(const char* address, const char* data, uint32_t dataLen)
@@ -523,13 +523,6 @@ int32_t CAEDRSendUnicastMessageImpl(const char* address, const char* data, uint3
     }
 
     OIC_LOG(DEBUG, TAG, "[EDR][Native] set byteArray for data");
-    if(gSendBuffer)
-    {
-        (*env)->DeleteGlobalRef(env, gSendBuffer);
-    }
-    jbyteArray jni_arr = (*env)->NewByteArray(env, dataLen);
-    (*env)->SetByteArrayRegion(env, jni_arr, 0, dataLen, (jbyte*)data);
-    gSendBuffer = (jbyteArray)(*env)->NewGlobalRef(env, jni_arr);
 
     // get bonded device list
     jobjectArray jni_arrayPairedDevices = CAEDRNativeGetBondedDevices(env);
@@ -567,7 +560,7 @@ int32_t CAEDRSendUnicastMessageImpl(const char* address, const char* data, uint3
         // find address
         if(!strcmp(remoteAddress, address))
         {
-            CAEDRNativeSendData(env, remoteAddress, data, i);
+            CAEDRNativeSendData(env, remoteAddress, data, dataLen, i);
         }
     }
 
@@ -614,7 +607,7 @@ int32_t CAEDRSendMulticastMessageImpl(JNIEnv *env, const char* data, uint32_t da
         OIC_LOG_V(DEBUG, TAG, "[EDR][Native] getBondedDevices: ~~device address is %s", remoteAddress);
 
         // find address
-        CAEDRNativeSendData(env, remoteAddress, data, i);
+        CAEDRNativeSendData(env, remoteAddress, data, dataLen, i);
     }
 
     return 1;
@@ -623,9 +616,15 @@ int32_t CAEDRSendMulticastMessageImpl(JNIEnv *env, const char* data, uint32_t da
 /**
  * EDR Method
  */
-void CAEDRNativeSendData(JNIEnv *env, const char* address, const char* data, uint32_t id)
+void CAEDRNativeSendData(JNIEnv *env, const char* address, const char* data, uint32_t dataLength, uint32_t id)
 {
-    OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData logic start");
+    OIC_LOG_V(DEBUG, TAG, "[EDR][Native] btSendData logic start : %s, %d", data, dataLength);
+
+    if(!CAEDRNativeIsEnableBTAdapter(env))
+    {
+        OIC_LOG(DEBUG, TAG, "BT adpater is not enable");
+        return;
+    }
 
     if(STATE_DISCONNECTED == CAEDRIsConnectedDevice(address))
     {
@@ -692,17 +691,11 @@ void CAEDRNativeSendData(JNIEnv *env, const char* address, const char* data, uin
                 return;
             }
 
-//            const char* tmpData = "HelloWorldHelloWorld..";
-//            size_t nread = 20;
-//            jbyteArray jni_arr = (*env)->NewByteArray(env, nread);
-//            (*env)->SetByteArrayRegion(env, jni_arr, 0, nread, (jbyte*)tmpData);
-
             jbyteArray jbuf;
-            int length = strlen(data);
-            jbuf = (*env)->NewByteArray(env, length);
-            (*env)->SetByteArrayRegion(env, jbuf, 0, length, (jbyte*)data);
+            jbuf = (*env)->NewByteArray(env, dataLength);
+            (*env)->SetByteArrayRegion(env, jbuf, 0, dataLength, (jbyte*)data);
 
-            (*env)->CallVoidMethod(env, jni_obj_outputStream, jni_mid_write, jbuf, (jint)0, (jint)length);
+            (*env)->CallVoidMethod(env, jni_obj_outputStream, jni_mid_write, jbuf, (jint)0, (jint)dataLength);
 
             if((*env)->ExceptionCheck(env))
             {
@@ -713,12 +706,6 @@ void CAEDRNativeSendData(JNIEnv *env, const char* address, const char* data, uin
             }
 
             OIC_LOG(DEBUG, TAG, "[EDR][Native] btSendData: Write Success");
-
-            // remove socket to list
-            CAEDRNativeRemoveDeviceSocket(env, jni_obj_socket);
-
-            // update state
-            CAEDRUpdateDeviceState(STATE_DISCONNECTED, address);
         }
         else
         {
@@ -738,6 +725,12 @@ void CAEDRNativeConnect(JNIEnv *env, const char* address, uint32_t id)
 {
     OIC_LOG(DEBUG, TAG, "[EDR][Native] btConnect..");
 
+    if(!CAEDRNativeIsEnableBTAdapter(env))
+    {
+        OIC_LOG(DEBUG, TAG, "BT adpater is not enable");
+        return;
+    }
+
     jclass jni_cid_BTAdapter = (*env)->FindClass(env, CLASSPATH_BT_ADPATER);
     if(!jni_cid_BTAdapter)
     {
@@ -904,418 +897,9 @@ void CAEDRNativeSocketClose(JNIEnv *env, const char* address, uint32_t id)
     OIC_LOG(DEBUG, TAG, "[EDR][Native] close: disconnected");
 }
 
-
-/**
- * BT State List
- */
-void CAEDRNativeCreateDeviceStateList()
-{
-    OIC_LOG(DEBUG, TAG, "[EDR][Native] CAEDRNativeCreateDeviceStateList");
-
-    // create new object array
-    if (gdeviceStateList == NULL)
-    {
-        OIC_LOG_V(DEBUG, TAG, "Create device list");
-
-        gdeviceStateList = u_arraylist_create();
-    }
-}
-
-void CAEDRUpdateDeviceState(uint32_t state, const char* address)
-{
-    state_t *newstate = (state_t*) OICMalloc( sizeof(state_t) );
-    memset(newstate->address, 0, strlen(newstate->address));
-    strcpy(newstate->address, address);
-    newstate->state = state;
-
-    CAEDRNativeAddDeviceStateToList(newstate);
-}
-
-void CAEDRNativeAddDeviceStateToList(state_t* state)
-{
-    if(!state)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] device is null");
-        return;
-    }
-
-    if(!gdeviceStateList)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] gdevice_list is null");
-        return;
-    }
-
-    if(CAEDRNativeIsDeviceInList(state->address)) {
-        CAEDRNativeRemoveDevice(state->address); // delete previous state for update new state
-    }
-    u_arraylist_add(gdeviceStateList, state);          // update new state
-    OIC_LOG_V(DEBUG, TAG, "Set State Info to List : %d", state->state);
-}
-
-jboolean CAEDRNativeIsDeviceInList(const char* remoteAddress){
-
-    jint index;
-    for (index = 0; index < u_arraylist_length(gdeviceStateList); index++)
-    {
-        state_t* state = (state_t*) u_arraylist_get(gdeviceStateList, index);
-        if(!state)
-        {
-            OIC_LOG(DEBUG, TAG, "[EDR][Native] state_t object is null");
-            return TRUE;
-        }
-
-        if(!strcmp(remoteAddress, state->address))
-        {
-            OIC_LOG_V(DEBUG, TAG, "the device is already set");
-            return TRUE;
-        }
-        else
-        {
-            continue;
-        }
-    }
-
-    OIC_LOG_V(DEBUG, TAG, "there are no the device in list.");
-    return FALSE;
-}
-
-void CAEDRNativeRemoveAllDeviceState()
-{
-    OIC_LOG_V(DEBUG, TAG, "CAEDRNativeRemoveAllDevices");
-
-    if(!gdeviceStateList)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] gdeviceStateList is null");
-        return;
-    }
-
-    jint index;
-    for (index = 0; index < u_arraylist_length(gdeviceStateList); index++)
-    {
-        state_t* state = (state_t*) u_arraylist_get(gdeviceStateList, index);
-        if(!state)
-        {
-            OIC_LOG(DEBUG, TAG, "[EDR][Native] jarrayObj is null");
-            continue;
-        }
-        OICFree(state);
-    }
-
-    OICFree(gdeviceStateList);
-    gdeviceStateList = NULL;
-    return;
-}
-
-void CAEDRNativeRemoveDevice(const char* remoteAddress)
-{
-    OIC_LOG_V(DEBUG, TAG, "CAEDRNativeRemoveDeviceforStateList");
-
-    if(!gdeviceStateList)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] gdeviceStateList is null");
-        return;
-    }
-
-    jint index;
-    for (index = 0; index < u_arraylist_length(gdeviceStateList); index++)
-    {
-        state_t* state = (state_t*) u_arraylist_get(gdeviceStateList, index);
-        if(!state)
-        {
-            OIC_LOG(DEBUG, TAG, "[EDR][Native] state_t object is null");
-            continue;
-        }
-
-        if(!strcmp(state->address, remoteAddress))
-        {
-            OIC_LOG_V(DEBUG, TAG, "[EDR][Native] remove state : %s", remoteAddress);
-            OICFree(state);
-
-            CAEDRReorderingDeviceList(index);
-            break;
-        }
-    }
-    return;
-}
-
-jboolean CAEDRIsConnectedDevice(const char* remoteAddress)
-{
-    OIC_LOG_V(DEBUG, TAG, "CAEDRIsConnectedDevice");
-
-    if(!gdeviceStateList)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] gdeviceStateList is null");
-        return FALSE;
-    }
-
-    jint index;
-    for (index = 0; index < u_arraylist_length(gdeviceStateList); index++)
-    {
-        state_t* state = (state_t*) u_arraylist_get(gdeviceStateList, index);
-        if(!state)
-        {
-            OIC_LOG(DEBUG, TAG, "[EDR][Native] state_t object is null");
-            continue;
-        }
-
-        if(!strcmp(state->address, remoteAddress))
-        {
-            OIC_LOG_V(DEBUG, TAG, "[EDR][Native] check whether it is connected or not");
-
-            return state->state;
-        }
-    }
-    return FALSE;
-}
-
-void CAEDRReorderingDeviceList(uint32_t index)
-{
-    if (index >= gdeviceStateList->length)
-    {
-        return;
-    }
-
-    if (index < gdeviceStateList->length - 1)
-    {
-        memmove(&gdeviceStateList->data[index], &gdeviceStateList->data[index + 1],
-                (gdeviceStateList->length - index - 1) * sizeof(void *));
-    }
-
-    gdeviceStateList->size--;
-    gdeviceStateList->length--;
-}
-
-/**
- * Device Socket Object List
- */
-void CAEDRNativeCreateDeviceSocketList()
-{
-    OIC_LOG(DEBUG, TAG, "[BLE][Native] CAEDRNativeCreateDeviceSocketList");
-
-    // create new object array
-    if (gdeviceObjectList == NULL)
-    {
-        OIC_LOG_V(DEBUG, TAG, "Create Device object list");
-
-        gdeviceObjectList = u_arraylist_create();
-    }
-}
-
-void CAEDRNativeAddDeviceSocketToList(JNIEnv *env, jobject deviceSocket)
-{
-    OIC_LOG(DEBUG, TAG, "[BLE][Native] CANativeAddDeviceobjToList");
-
-    if(!deviceSocket)
-    {
-        OIC_LOG(DEBUG, TAG, "[BLE][Native] Device is null");
-        return;
-    }
-
-    if(!gdeviceObjectList)
-    {
-        OIC_LOG(DEBUG, TAG, "[BLE][Native] gdeviceObjectList is null");
-        return;
-    }
-
-    jstring jni_remoteAddress = CAEDRNativeGetAddressFromDeviceSocket(env, deviceSocket);
-    if(!jni_remoteAddress)
-    {
-        OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_remoteAddress is null");
-        return;
-    }
-
-    u_mutex_lock(gMutexSocketListManager);
-
-    const char* remoteAddress = (*env)->GetStringUTFChars(env, jni_remoteAddress, NULL);
-
-    if(!CAEDRNativeIsDeviceSocketInList(env, remoteAddress))
-    {
-        jobject gDeviceSocker = (*env)->NewGlobalRef(env, deviceSocket);
-        u_arraylist_add(gdeviceObjectList, gDeviceSocker);
-        OIC_LOG_V(DEBUG, TAG, "Set Socket Object to Array");
-    }
-
-    u_mutex_unlock(gMutexSocketListManager);
-}
-
-jboolean CAEDRNativeIsDeviceSocketInList(JNIEnv *env, const char* remoteAddress)
-{
-    OIC_LOG(DEBUG, TAG, "[BLE][Native] CANativeIsDeviceObjInList");
-
-    jint index;
-    for (index = 0; index < u_arraylist_length(gdeviceObjectList); index++)
-    {
-
-        jobject jarrayObj = (jobject) u_arraylist_get(gdeviceObjectList, index);
-        if(!jarrayObj)
-        {
-            OIC_LOG(DEBUG, TAG, "[BLE][Native] jarrayObj is null");
-            return TRUE;
-        }
-
-        jstring jni_setAddress = CAEDRNativeGetAddressFromDeviceSocket(env, jarrayObj);
-        if(!jni_setAddress)
-        {
-            OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_setAddress is null");
-            return TRUE;
-        }
-
-        const char* setAddress = (*env)->GetStringUTFChars(env, jni_setAddress, NULL);
-
-        if(!strcmp(remoteAddress, setAddress))
-        {
-            OIC_LOG_V(DEBUG, TAG, "the device is already set");
-            return TRUE;
-        }
-        else
-        {
-            continue;
-        }
-    }
-
-    OIC_LOG_V(DEBUG, TAG, "there are no the Device obejct in list. we can add");
-    return FALSE;
-}
-
-void CAEDRNativeRemoveAllDeviceSocket(JNIEnv *env)
-{
-    OIC_LOG_V(DEBUG, TAG, "CANativeRemoveAllDeviceObjsList");
-
-    if(!gdeviceObjectList)
-    {
-        OIC_LOG(DEBUG, TAG, "[BLE][Native] gdeviceObjectList is null");
-        return;
-    }
-
-    jint index;
-    for (index = 0; index < u_arraylist_length(gdeviceObjectList); index++)
-    {
-        jobject jarrayObj = (jobject) u_arraylist_get(gdeviceObjectList, index);
-        if(!jarrayObj)
-        {
-            OIC_LOG(DEBUG, TAG, "[BLE][Native] jarrayObj is null");
-            return;
-        }
-        (*env)->DeleteGlobalRef(env, jarrayObj);
-    }
-
-    OICFree(gdeviceObjectList);
-    gdeviceObjectList = NULL;
-    return;
-}
-
-void CAEDRNativeRemoveDeviceSocket(JNIEnv *env, jobject deviceSocket)
-{
-    OIC_LOG_V(DEBUG, TAG, "CAEDRNativeRemoveDeviceSocket");
-
-    if(!gdeviceObjectList)
-    {
-        OIC_LOG(DEBUG, TAG, "[BLE][Native] gdeviceObjectList is null");
-        return;
-    }
-
-    u_mutex_lock(gMutexSocketListManager);
-
-    jint index;
-    for (index = 0; index < u_arraylist_length(gdeviceObjectList); index++)
-    {
-        jobject jarrayObj = (jobject) u_arraylist_get(gdeviceObjectList, index);
-        if(!jarrayObj)
-        {
-            OIC_LOG(DEBUG, TAG, "[BLE][Native] jarrayObj is null");
-            continue;
-        }
-
-        jstring jni_setAddress = CAEDRNativeGetAddressFromDeviceSocket(env, jarrayObj);
-        if(!jni_setAddress)
-        {
-            OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_setAddress is null");
-            continue;
-        }
-        const char* setAddress = (*env)->GetStringUTFChars(env, jni_setAddress, NULL);
-
-        jstring jni_remoteAddress = CAEDRNativeGetAddressFromDeviceSocket(env, deviceSocket);
-        if(!jni_remoteAddress)
-        {
-            OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_remoteAddress is null");
-            continue;
-        }
-        const char* remoteAddress = (*env)->GetStringUTFChars(env, jni_remoteAddress, NULL);
-
-        if(!strcmp(setAddress, remoteAddress))
-        {
-            OIC_LOG_V(DEBUG, TAG, "[BLE][Native] remove object : %s", remoteAddress);
-            (*env)->DeleteGlobalRef(env, jarrayObj);
-
-            CAEDRReorderingDeviceSocketList(index);
-            break;
-        }
-    }
-    u_mutex_unlock(gMutexSocketListManager);
-
-    OIC_LOG(DEBUG, TAG, "[BLE][Native] there are no target object");
-    return;
-}
-
-jobject CAEDRNativeGetDeviceSocket(uint32_t idx)
-{
-    OIC_LOG_V(DEBUG, TAG, "CAEDRNativeGetDeviceSocket");
-
-    if(idx < 0)
-    {
-        OIC_LOG(DEBUG, TAG, "[BLE][Native] index is not available");
-        return NULL;
-    }
-
-    if(!gdeviceObjectList)
-    {
-        OIC_LOG(DEBUG, TAG, "[BLE][Native] gdeviceObjectList is null");
-        return NULL;
-    }
-
-    jobject jarrayObj = (jobject) u_arraylist_get(gdeviceObjectList, idx);
-    if(!jarrayObj)
-    {
-        OIC_LOG(DEBUG, TAG, "[BLE][Native] jarrayObj is not available");
-        return NULL;
-    }
-    return jarrayObj;
-}
-
-uint32_t CAEDRGetSocketListLength()
-{
-    if(!gdeviceObjectList)
-    {
-        OIC_LOG(DEBUG, TAG, "[BLE][Native] gdeviceObjectList is null");
-        return 0;
-    }
-
-    uint32_t length = u_arraylist_length(gdeviceObjectList);
-
-    return length;
-}
-
-void CAEDRReorderingDeviceSocketList(uint32_t index)
-{
-    if (index >= gdeviceObjectList->length)
-    {
-        return;
-    }
-
-    if (index < gdeviceObjectList->length - 1)
-    {
-        memmove(&gdeviceObjectList->data[index], &gdeviceObjectList->data[index + 1],
-                (gdeviceObjectList->length - index - 1) * sizeof(void *));
-    }
-
-    gdeviceObjectList->size--;
-    gdeviceObjectList->length--;
-}
-
 void CAEDRInitializeClient(u_thread_pool_t handle)
 {
     OIC_LOG(DEBUG, TAG, "IN");
     CAEDRInitialize(handle);
     OIC_LOG(DEBUG, TAG, "OUT");
 }
-
index 967c085..a34d548 100644 (file)
@@ -3,6 +3,7 @@
 #include <jni.h>
 
 #include "caedrinterface.h"
+#include "caedrnwmonitor.h"
 #include "logger.h"
 #include "oic_malloc.h"
 #include "uthreadpool.h" /* for thread pool */
 #include "uarraylist.h"
 #include "caadapterutils.h"
 
+#include "com_iotivity_jar_CAEDRInterface.h"
+
 //#define DEBUG_MODE
 #define TAG PCF("CA_EDR_MONITOR")
 
+#define BT_STATE_ON         12
+#define BT_STATE_OFF        10
+
 // temp method
+static JavaVM *g_jvm;
+static jobject gContext;
+static CAEDRNetworkStatusCallback gNetworkChangeCb = NULL;
+
+void CAEDRNetworkMonitorJNISetContext()
+{
+    OIC_LOG_V(DEBUG, TAG, "CAEDRNetworkMonitorJNISetContext");
+    gContext = CANativeJNIGetContext();
+}
+
+//getting jvm
+void CAEDRNetworkMonitorJniInit()
+{
+    OIC_LOG_V(DEBUG, TAG, "CAEDRNetworkMonitorJniInit");
+    g_jvm = CANativeJNIGetJavaVM();
+}
 
 CAResult_t CAEDRInitializeNetworkMonitor()
 {
     OIC_LOG_V(DEBUG, TAG, "IN");
 
+    CAEDRNetworkMonitorJniInit();
+    CANativeJNIGetJavaVM();
+
     OIC_LOG_V(DEBUG, TAG, "OUT");
     return CA_STATUS_OK;
 }
@@ -26,7 +51,8 @@ CAResult_t CAEDRInitializeNetworkMonitor()
 void CAEDRSetNetworkChangeCallback(
     CAEDRNetworkStatusCallback networkChangeCallback)
 {
-
+    OIC_LOG_V(DEBUG, TAG, "CAEDRSetNetworkChangeCallback");
+    gNetworkChangeCb = networkChangeCallback;
 }
 
 void CAEDRTerminateNetworkMonitor(void)
@@ -59,3 +85,41 @@ CAResult_t CAEDRClientSetCallbacks(void)
     OIC_LOG_V(DEBUG, TAG, "OUT");
     return CA_STATUS_OK;
 }
+
+JNIEXPORT void JNICALL
+Java_com_iotivity_jar_CAEDRInterface_CAEDRStateChangedCallback
+(JNIEnv *env, jobject obj, jint status)
+{
+    // STATE_ON:12, STATE_OFF:10
+    OIC_LOG_V(DEBUG, TAG, "CAEDRInterface - Network State Changed");
+
+    if(gNetworkChangeCb == NULL)
+        OIC_LOG_V(DEBUG, TAG, "gNetworkChangeCb is null", status);
+
+    if(BT_STATE_ON == status)
+    {
+        CANetworkStatus_t newStatus = CA_INTERFACE_UP;
+        CAEDRServerStartAccpetThread();
+        gNetworkChangeCb(newStatus);
+    }
+    else if(BT_STATE_OFF == status)
+    {
+        CANetworkStatus_t newStatus = CA_INTERFACE_DOWN;
+        CAEDRNativeRemoveAllDeviceSocket(env);
+        CAEDRNativeRemoveAllDeviceState(env);
+        gNetworkChangeCb(newStatus);
+    }
+}
+
+JNIEXPORT void JNICALL
+Java_com_iotivity_jar_CAEDRInterface_CAEDRBondStateChangedCallback
+(JNIEnv *env, jobject obj, jstring addr)
+{
+    OIC_LOG_V(DEBUG, TAG, "CAEDRInterface - Bond State Changed");
+
+    if(addr)
+    {
+        CAEDRNativeRemoveDeviceSocketBaseAddr(env, addr);
+        CAEDRNativeRemoveDevice(env, addr);
+    }
+}
index c203698..e86cebd 100644 (file)
 #include "umutex.h"
 #include "uarraylist.h"
 #include "caadapterutils.h"
+#include "com_iotivity_jar_CAEDRInterface.h"
 
 //#define DEBUG_MODE
 #define TAG PCF("CA_EDR_SERVER")
 
 static const char *METHODID_OBJECTNONPARAM = "()Landroid/bluetooth/BluetoothAdapter;";
-static const char *METHODID_STRINGNONPARAM = "()Ljava/lang/String;";
 static const char *CLASSPATH_BT_ADPATER = "android/bluetooth/BluetoothAdapter";
 static const char *CLASSPATH_BT_UUID = "java/util/UUID";
 
@@ -24,17 +24,13 @@ static const uint32_t STATE_CONNECTED = 1;
 static const uint32_t STATE_DISCONNECTED = 0;
 
 static const uint32_t MAX_PDU_BUFFER = 1024;
-
-static u_arraylist_t *gdeviceStateList = NULL;
-static u_arraylist_t *gdeviceObjectList = NULL;
+static const uint32_t MAX_CONNECTED_BT_SUPPORT_CNT = 7;
 
 static u_thread_pool_t gThreadPoolHandle = NULL;
 
 static JavaVM *g_jvm;
 static jobject gContext;
 
-static jbyteArray gSendBuffer;
-
 /**
  * @var gMutexSocketListManager
  * @brief Mutex to synchronize socket list update
@@ -63,6 +59,12 @@ static bool gStopUnicast = FALSE;
 static u_mutex gMutexMulticastServer = NULL;
 
 /**
+ * @var gMutexMulticastServer
+ * @brief Mutex to synchronize multicast receiver
+ */
+static u_mutex gMutexReceiver = NULL;
+
+/**
  * @var gStopMulticast
  * @brief Flag to control the Receive Multicast Data Thread
  */
@@ -74,6 +76,11 @@ static bool gStopMulticast = FALSE;
  */
 static bool gStopAccept = FALSE;
 
+
+static jobject gInputStream = NULL;
+
+static jobject gSeverSocket = NULL;
+
 typedef struct send_data {
     char* address;
     char* data;
@@ -94,8 +101,6 @@ typedef struct
     bool *stopFlag;
 } CAAdapterAcceptThreadContext_t;
 
-// callback instance
-
 /**
  * @var gEDRNetworkChangeCallback
  * @brief Maintains the callback to be notified when data received from remote Bluetooth device
@@ -104,8 +109,7 @@ static CAEDRDataReceivedCallback gEDRPacketReceivedCallback = NULL;
 
 static void CAReceiveHandler(void *data)
 {
-    OIC_LOG_V(DEBUG, TAG, "start CAReceiveHandler..");
-    OIC_LOG(DEBUG, TAG, "IN");
+    OIC_LOG(DEBUG, TAG, "IN - CAReceiveHandler..");
     // Input validation
     VERIFY_NON_NULL_VOID(data, TAG, "Invalid thread context");
 
@@ -133,18 +137,19 @@ static void CAReceiveHandler(void *data)
 
         // if new socket object is added in socket list after below logic is ran.
         // new socket will be started to read after next while loop
-        uint32_t length = CAEDRServerGetSocketListLength();
+        uint32_t length = CAEDRGetSocketListLength();
         if(0 == length)
         {
             OIC_LOG_V(DEBUG, TAG, "socket list is empty");
             sleep(1);
         }
 
-//        for(idx = 0 ; idx < length ; idx++)
-//        {
-//            OIC_LOG_V(DEBUG, TAG, "start CAEDRNativeReadData");
+        for(idx = 0 ; idx < length ; idx++)
+        {
+            OIC_LOG_V(DEBUG, TAG, "start CAEDRNativeReadData");
             CAEDRNativeReadData(env, idx, ctx->type);
-//        }
+            sleep(1);
+        }
     }
 
     if(isAttached)
@@ -153,7 +158,7 @@ static void CAReceiveHandler(void *data)
     if(ctx)
         OICFree(ctx);
 
-    OIC_LOG(DEBUG, TAG, "OUT");
+    OIC_LOG(DEBUG, TAG, "OUT - CAReceiveHandler");
 }
 
 static void CAAcceptHandler(void *data)
@@ -188,12 +193,34 @@ static void CAAcceptHandler(void *data)
         return;
     }
 
+    gSeverSocket = (*env)->NewGlobalRef(env, jni_obj_BTSeverSocket);
+
     CAAdapterAcceptThreadContext_t *ctx = (CAAdapterAcceptThreadContext_t *)data;
 
+    if(NULL == ctx)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR] AcceptThread: ctx is null");
+        return;
+    }
+
+    // it should be initialized for restart accept thread
+    gStopAccept = FALSE;
+
     while (TRUE != *(ctx->stopFlag))
     {
         OIC_LOG(DEBUG, TAG, "[EDR] AcceptThread running");
-        CAEDRNativeAccept(env, jni_obj_BTSeverSocket);
+
+        // when BT state is changed with Off. its thread will be stopped
+        if(!CAEDRNativeIsEnableBTAdapter(env))
+        {
+            OIC_LOG(DEBUG, TAG, "BT adpater is not enable");
+            gStopAccept = TRUE;
+            gSeverSocket = NULL;
+        }
+        else
+        {
+            CAEDRNativeAccept(env, gSeverSocket);
+        }
     }
 
     if(isAttached)
@@ -207,15 +234,17 @@ static void CAAcceptHandler(void *data)
     return;
 }
 
-
-// adapter common method
-
+/**
+ * implement for adapter common method
+ */
 CAResult_t CAEDRServerStart(const char *serviceUUID, int32_t *serverFD, u_thread_pool_t handle)
 {
     OIC_LOG_V(DEBUG, TAG, "IN");
     CAEDRServerInitialize(handle);
     // FIXME
     CAEDRStartUnicastServer(NULL, FALSE);
+
+    *serverFD = 1;
     OIC_LOG_V(DEBUG, TAG, "OUT");
     return CA_STATUS_OK;
 }
@@ -308,10 +337,10 @@ static CAResult_t CAEDRServerCreateMutex()
     return CA_STATUS_OK;
 }
 
-void CAEDRServerJniInit(JNIEnv *env, JavaVM* jvm)
+void CAEDRServerJniInit()
 {
     OIC_LOG_V(DEBUG, TAG, "CAEDRServerJniInit");
-    g_jvm = jvm;
+    g_jvm = CANativeJNIGetJavaVM();
 }
 
 void CAEDRServerInitialize(u_thread_pool_t handle)
@@ -320,6 +349,15 @@ void CAEDRServerInitialize(u_thread_pool_t handle)
 
     gThreadPoolHandle = handle;
 
+    CAEDRServerStartAccpetThread();
+
+    OIC_LOG(DEBUG, TAG, "OUT");
+}
+
+void CAEDRServerStartAccpetThread()
+{
+    CAEDRServerJniInit();
+
     // init mutex
     CAEDRServerCreateMutex();
 
@@ -346,14 +384,12 @@ void CAEDRServerInitialize(u_thread_pool_t handle)
         OIC_LOG_V(DEBUG, TAG, "My BT Address is %s", localAddress);
     }
 
-    CAEDRServerNativeCreateDeviceStateList();
-    CAEDRServerNativeCreateDeviceSocketList();
+    CAEDRNativeCreateDeviceStateList();
+    CAEDRNativeCreateDeviceSocketList();
 
     if(isAttached)
         (*g_jvm)->DetachCurrentThread(g_jvm);
 
-//    CAEDRCreateJNIInterfaceObject(gContext); /* create java CAEDRInterface instance*/
-
     CAAdapterReceiveThreadContext_t *ctx = (CAAdapterReceiveThreadContext_t *)
                                                OICMalloc(sizeof(CAAdapterReceiveThreadContext_t));
     if (!ctx)
@@ -369,8 +405,6 @@ void CAEDRServerInitialize(u_thread_pool_t handle)
         OICFree((void *)ctx);
         return;
     }
-
-    OIC_LOG(DEBUG, TAG, "OUT");
 }
 
 void CAEDRServerTerminate()
@@ -397,14 +431,18 @@ void CAEDRServerTerminate()
     gStopMulticast = TRUE;
     gStopUnicast = TRUE;
 
-    if(isAttached)
-        (*g_jvm)->DetachCurrentThread(g_jvm);
+    CAEDRNatvieCloseServerTask(env);
+
+    CAEDRNativeSocketCloseToAll(env);
 
     // delete mutex
     CAEDRServerDestroyMutex();
 
-    CAEDRServerNativeRemoveAllDeviceState();
-    CAEDRServerNativeRemoveAllDeviceSocket(env);
+    CAEDRNativeRemoveAllDeviceState();
+    CAEDRNativeRemoveAllDeviceSocket(env);
+
+    if(isAttached)
+            (*g_jvm)->DetachCurrentThread(g_jvm);
 }
 
 int32_t CAEDRStartUnicastServer(const char* address, bool isSecured)
@@ -512,21 +550,41 @@ int32_t CAEDRStopMulticastServer(int32_t serverID)
 
 uint32_t CAEDRNativeReadData(JNIEnv *env, uint32_t id, CAAdapterServerType_t type)
 {
+    if(!CAEDRNativeIsEnableBTAdapter(env))
+    {
+        OIC_LOG(DEBUG, TAG, "BT adpater is not enable");
+        return 0;
+    }
+
     if(!((*env)->ExceptionCheck(env)))
     {
         // check whether this socket object is connected or not.
-        jobject jni_obj_socket = CAEDRServerNativeGetDeviceSocket(id);
+        jobject jni_obj_socket = CAEDRNativeGetDeviceSocket(id);
         if(!jni_obj_socket)
         {
-            return -1;
+            return 0;
         }
 
         jstring jni_str_address = CAEDRNativeGetAddressFromDeviceSocket(env, jni_obj_socket);
         const char* address = (*env)->GetStringUTFChars(env, jni_str_address, NULL);
-        if(STATE_DISCONNECTED == CAEDRServerIsConnectedDevice(address))
+
+        // check it whether is still connected or not through google api
+        jboolean ret = CAEDRIsConnectedForSocket(env, jni_obj_socket);
+        if(!ret)
+        {
+            OIC_LOG(DEBUG, TAG, "[EDR][Native] this device is not connected now...let close socket");
+        }
+
+        // check it whether is still connected or not through socket state list
+        if(STATE_DISCONNECTED == CAEDRIsConnectedDevice(address))
         {
             OIC_LOG(DEBUG, TAG, "[EDR][Native] btReadData: it is not connected yet..");
-            return -1;
+
+            // remove socket to list
+            // this code is related to below read fail exception code
+            CAEDRNativeRemoveDeviceSocket(env, jni_obj_socket);
+
+            return 0;
         }
 
         // start to read through InputStream
@@ -537,11 +595,13 @@ uint32_t CAEDRNativeReadData(JNIEnv *env, uint32_t id, CAAdapterServerType_t typ
         if(!jni_obj_socket)
         {
             OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_obj_socket is not available anymore..");
-            return -1;
+            return 0;
         }
 
         jobject jni_obj_inputStream = (*env)->CallObjectMethod(env, jni_obj_socket, jni_mid_getInputStream);
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] btReadData:  ready inputStream..");
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] btReadData:  ready inputStream...");
+
+        gInputStream = (*env)->NewGlobalRef(env, jni_obj_inputStream);
 
         jclass jni_cid_InputStream = (*env)->FindClass(env, "java/io/InputStream");
         jmethodID jni_mid_read = (*env)->GetMethodID(env, jni_cid_InputStream, "read", "([BII)I");
@@ -552,68 +612,137 @@ uint32_t CAEDRNativeReadData(JNIEnv *env, uint32_t id, CAAdapterServerType_t typ
         if(!jni_obj_socket)
         {
             OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_obj_socket is not available anymore...");
-            return -1;
+            return 0;
         }
 
-        while ((nread = (*env)->CallIntMethod(env, jni_obj_inputStream, jni_mid_read, jbuf, (jint)0, MAX_PDU_BUFFER)) != -1)
+        nread = (*env)->CallIntMethod(env, gInputStream, jni_mid_read, jbuf, (jint)0, MAX_PDU_BUFFER);
+
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] read something from InputStream");
+
+        if(-1 == nread)
         {
-            if((*env)->ExceptionCheck(env))
-            {
-                OIC_LOG(DEBUG, TAG, "[EDR][Native] btReadData: read Error!!!");
-                (*env)->ExceptionDescribe(env);
-                (*env)->ExceptionClear(env);
-                return -1;
-            }
-            OIC_LOG_V(DEBUG, TAG, "[EDR][Native] btReadData: reading");
-            jbyte* buf = (*env)->GetByteArrayElements(env, jbuf, NULL);
-            jint length = strlen((char*)buf);
-            OIC_LOG_V(DEBUG, TAG, "[EDR][Native] btReadData: read %s", buf);
-            if (buf == NULL)
-            {
-                return -1;
-            }
+            OIC_LOG(DEBUG, TAG, "[EDR][Native] read buffer is empty...");
+            return 0;
+        }
 
-            switch (type)
-            {
-                case CA_UNICAST_SERVER:
-                case CA_MULTICAST_SERVER:
-                    // Notify data to upper layer
-                    if (gEDRPacketReceivedCallback)
-                    {
-                        uint32_t sentLength = 0;
-                        OIC_LOG_V(DEBUG, TAG, "[EDR][Native] data will be sent to callback routine: %s, %d", buf, length);
-                        gEDRPacketReceivedCallback(address, (void*)buf, length, &sentLength);
-                    }
-                    break;
+        if((*env)->ExceptionCheck(env))
+        {
+            OIC_LOG(DEBUG, TAG, "[EDR][Native] btReadData: read Error!!!");
+            (*env)->ExceptionDescribe(env);
+            (*env)->ExceptionClear(env);
+
+            // update state to disconnect
+            // the socket will be close next read thread routine
+            CAEDRUpdateDeviceState(STATE_DISCONNECTED, address);
+            return 0;
+        }
+
+        OIC_LOG_V(DEBUG, TAG, "[EDR][Native] btReadData: reading");
+        jbyte* buf = (*env)->GetByteArrayElements(env, jbuf, NULL);
+        if (buf == NULL)
+        {
+            return 0;
+        }
+
+        jint length = strlen((char*)buf);
+        OIC_LOG_V(DEBUG, TAG, "[EDR][Native] btReadData: read %s, %d", buf, length);
+
+        char responseData[MAX_PDU_BUFFER];
+        memset(responseData, 0, MAX_PDU_BUFFER);
+        strncpy(responseData, (char*)buf, length);
+        responseData[length] = '\0';
+
+        switch (type)
+        {
+            case CA_UNICAST_SERVER:
+            case CA_MULTICAST_SERVER:
+                // Notify data to upper layer
+                if (gEDRPacketReceivedCallback)
+                {
+                  //  u_mutex_lock(gMutexSocketListManager);
+                    uint32_t sentLength = 0;
+                    OIC_LOG_V(DEBUG, TAG, "[EDR][Native] data will be sent to callback routine: %s, %d", responseData, length);
+//                        sleep(3);
+                    gEDRPacketReceivedCallback(address, (void*)responseData, length, &sentLength);
+                  //  u_mutex_unlock(gMutexSocketListManager);
+                }
+                break;
 #ifdef __WITH_DTLS__
-                case CA_SECURED_UNICAST_SERVER:
-                    break;
+            case CA_SECURED_UNICAST_SERVER:
+                break;
 #endif //__WITH_DTLS__
-                default:
-                    // Should never occur
-                    OIC_LOG_V(DEBUG, TAG, "Invalid server type");
-                    return -1;
-            }
-            (*env)->ReleaseByteArrayElements(env, jbuf, buf, 0);
-
-            // close socket after data was sent
-            CAEDRNativeServerSocketClose(env, address, id);
-            break;
+            default:
+                // Should never occur
+                OIC_LOG_V(DEBUG, TAG, "Invalid server type");
+                return 0;
         }
+        (*env)->ReleaseByteArrayElements(env, jbuf, buf, 0);
     }
     else
     {
         (*env)->ExceptionDescribe(env);
         (*env)->ExceptionClear(env);
         OIC_LOG(DEBUG, TAG, "[EDR][Native] btReadData: env error!!");
-        return -1;
+        return 0;
     }
 
-    return 0;
+    return 1;
+}
+
+jboolean CAEDRIsConnectedForSocket(JNIEnv *env, jobject socket)
+{
+    OIC_LOG(DEBUG, TAG, "[EDR][Native] CAEDRIsConnectedForSocket...");
+
+    if(!CAEDRNativeIsEnableBTAdapter(env))
+    {
+        OIC_LOG(DEBUG, TAG, "BT adpater is not enable");
+        return FALSE;
+    }
+
+    if(!socket)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] CAEDRIsConnectedForSocket - socket is null");
+        return FALSE;
+    }
+
+    jclass jni_cid_BTsocket = (*env)->FindClass(env, "android/bluetooth/BluetoothSocket");
+    if(!jni_cid_BTsocket)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] CAEDRIsConnectedForSocket - jni_cid_BTsocket is null");
+        return FALSE;
+    }
+
+    jmethodID jni_mid_isConnected = (*env)->GetMethodID(env, jni_cid_BTsocket, "isConnected", "()Z");
+    if(!jni_mid_isConnected)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] CAEDRIsConnectedForSocket - jni_mid_isConnected is null.");
+        return FALSE;
+    }
+
+    jboolean jni_isConnected = (*env)->CallBooleanMethod(env, socket, jni_mid_isConnected);
+
+    return jni_isConnected;
+}
+
+void CANativeStartListenTask(JNIEnv *env)
+{
+    jobject jni_obj_BTSeverSocket = CAEDRNativeListen(env);
+    if(!jni_obj_BTSeverSocket) {
+        OIC_LOG(DEBUG, TAG, "[EDR] AcceptThread: jni_obj_BTSeverSocket is null");
+        return;
+    }
+
+    gSeverSocket = (*env)->NewGlobalRef(env, jni_obj_BTSeverSocket);
 }
 
 jobject CAEDRNativeListen(JNIEnv *env)
 {
+    if(!CAEDRNativeIsEnableBTAdapter(env))
+    {
+        OIC_LOG(DEBUG, TAG, "BT adpater is not enable");
+        return NULL;
+    }
+
     OIC_LOG(DEBUG, TAG, "[EDR][Native] btListen");
 
     jclass jni_cid_BTAdapter = (*env)->FindClass(env,  CLASSPATH_BT_ADPATER);
@@ -710,7 +839,14 @@ void CAEDRNativeAccept(JNIEnv *env, jobject severSocketObject)
         if(!jni_obj_BTSocket)
         {
             OIC_LOG(DEBUG, TAG, "[EDR][Native] btAccept: jni_obj_BTSocket is null");
-            return;
+
+            if((*env)->ExceptionCheck(env))
+            {
+                OIC_LOG(DEBUG, TAG, "[EDR][Native] btAccept: socket might closed or timeout!!!");
+                (*env)->ExceptionDescribe(env);
+                (*env)->ExceptionClear(env);
+                return;
+            }
         }
 
         // get remote address
@@ -721,12 +857,12 @@ void CAEDRNativeAccept(JNIEnv *env, jobject severSocketObject)
 
         // set socket to list
         jobject jni_socket = (*env)->NewGlobalRef(env, jni_obj_BTSocket);
-        CAEDRServerNativeAddDeviceSocketToList(env, jni_socket);
+        CAEDRNativeAddDeviceSocketToList(env, jni_socket);
 
         OIC_LOG(DEBUG, TAG, "[EDR][Native] btAccept: Accepted!!");
 
         // update state
-        CAEDRServerUpdateDeviceState(STATE_CONNECTED, address);
+        CAEDRUpdateDeviceState(STATE_CONNECTED, address);
     }
     else
     {
@@ -736,6 +872,13 @@ void CAEDRNativeAccept(JNIEnv *env, jobject severSocketObject)
 
 void CAEDRNativeServerSocketClose(JNIEnv *env, const char* address, uint32_t id)
 {
+    OIC_LOG(DEBUG, TAG, "[EDR][Native] CAEDRNativeServerSocketClose");
+
+    if(!CAEDRNativeIsEnableBTAdapter(env))
+    {
+        OIC_LOG(DEBUG, TAG, "BT adpater is not enable");
+        return;
+    }
 
     jclass jni_cid_BTSocket = (*env)->FindClass(env, "android/bluetooth/BluetoothSocket");
     if(!jni_cid_BTSocket)
@@ -751,7 +894,7 @@ void CAEDRNativeServerSocketClose(JNIEnv *env, const char* address, uint32_t id)
         return;
     }
 
-    jobject jni_obj_socket = CAEDRServerNativeGetDeviceSocket(id);
+    jobject jni_obj_socket = CAEDRNativeGetDeviceSocket(id);
     if(!jni_obj_socket)
     {
         OIC_LOG(DEBUG, TAG, "[EDR][Native] close: jni_obj_socket is not available");
@@ -769,421 +912,50 @@ void CAEDRNativeServerSocketClose(JNIEnv *env, const char* address, uint32_t id)
     }
 
     // remove socket to list
-    CAEDRServerNativeRemoveDeviceSocket(env, jni_obj_socket);
+    CAEDRNativeRemoveDeviceSocket(env, jni_obj_socket);
 
     // update state
-    CAEDRServerUpdateDeviceState(STATE_DISCONNECTED, address);
+    CAEDRUpdateDeviceState(STATE_DISCONNECTED, address);
 
     OIC_LOG(DEBUG, TAG, "[EDR][Native] close: disconnected");
 }
 
 /**
- * BT State List
- */
-void CAEDRServerNativeCreateDeviceStateList()
-{
-    OIC_LOG(DEBUG, TAG, "[EDR][Native] CAEDRNativeCreateDeviceStateList");
-
-    // create new object array
-    if (gdeviceStateList == NULL)
-    {
-        OIC_LOG_V(DEBUG, TAG, "Create device list");
-
-        gdeviceStateList = u_arraylist_create();
-    }
-}
-
-void CAEDRServerUpdateDeviceState(uint32_t state, const char* address)
-{
-    state_t *newstate = (state_t*) OICMalloc( sizeof(state_t) );
-    memset(newstate->address, 0, strlen(newstate->address));
-    strcpy(newstate->address, address);
-    newstate->state = state;
-
-    CAEDRServerNativeAddDeviceStateToList(newstate);
-}
-
-void CAEDRServerNativeAddDeviceStateToList(state_t* state)
-{
-    if(!state)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] device is null");
-        return;
-    }
-
-    if(!gdeviceStateList)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] gdevice_list is null");
-        return;
-    }
-
-    if(!CAEDRServerNativeIsDeviceInList(state->address)) {
-        CAEDRServerNativeRemoveDevice(state->address); // delete previous state for update new state
-        u_arraylist_add(gdeviceStateList, state);          // update new state
-        OIC_LOG_V(DEBUG, TAG, "Set State to Connected State List");
-    }
-}
-
-jboolean CAEDRServerNativeIsDeviceInList(const char* remoteAddress){
-
-    jint index;
-    for (index = 0; index < u_arraylist_length(gdeviceStateList); index++)
-    {
-        state_t* state = (state_t*) u_arraylist_get(gdeviceStateList, index);
-        if(!state)
-        {
-            OIC_LOG(DEBUG, TAG, "[EDR][Native] state_t object is null");
-            return TRUE;
-        }
-
-        if(!strcmp(remoteAddress, state->address))
-        {
-            OIC_LOG_V(DEBUG, TAG, "the device is already set");
-            return TRUE;
-        }
-        else
-        {
-            continue;
-        }
-    }
-
-    OIC_LOG_V(DEBUG, TAG, "there are no the device in list.");
-    return FALSE;
-}
-
-void CAEDRServerNativeRemoveAllDeviceState()
-{
-    OIC_LOG_V(DEBUG, TAG, "CAEDRNativeRemoveAllDevices");
-
-    if(!gdeviceStateList)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] gdeviceStateList is null");
-        return;
-    }
-
-    jint index;
-    for (index = 0; index < u_arraylist_length(gdeviceStateList); index++)
-    {
-        state_t* state = (state_t*) u_arraylist_get(gdeviceStateList, index);
-        if(!state)
-        {
-            OIC_LOG(DEBUG, TAG, "[EDR][Native] jarrayObj is null");
-            continue;
-        }
-        OICFree(state);
-    }
-
-    OICFree(gdeviceStateList);
-    gdeviceStateList = NULL;
-    return;
-}
-
-void CAEDRServerNativeRemoveDevice(const char* remoteAddress)
-{
-    OIC_LOG_V(DEBUG, TAG, "CAEDRNativeRemoveDevice");
-
-    if(!gdeviceStateList)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] gdeviceStateList is null");
-        return;
-    }
-
-    jint index;
-    for (index = 0; index < u_arraylist_length(gdeviceStateList); index++)
-    {
-        state_t* state = (state_t*) u_arraylist_get(gdeviceStateList, index);
-        if(!state)
-        {
-            OIC_LOG(DEBUG, TAG, "[EDR][Native] state_t object is null");
-            continue;
-        }
-
-        if(!strcmp(state->address, remoteAddress))
-        {
-            OIC_LOG_V(DEBUG, TAG, "[EDR][Native] remove object : %s", remoteAddress);
-            OICFree(state);
-
-            CAEDRServerReorderingDeviceList(index);
-            break;
-        }
-    }
-    OIC_LOG(DEBUG, TAG, "[EDR][Native] there are no target object");
-    return;
-}
-
-jboolean CAEDRServerIsConnectedDevice(const char* remoteAddress)
-{
-    OIC_LOG_V(DEBUG, TAG, "CAEDRServerIsConnectedDevice");
-
-    if(!gdeviceStateList)
-    {
-        OIC_LOG(DEBUG, TAG, "[EDR][Native] gdeviceStateList is null");
-        return FALSE;
-    }
-
-    jint index;
-    for (index = 0; index < u_arraylist_length(gdeviceStateList); index++)
-    {
-        state_t* state = (state_t*) u_arraylist_get(gdeviceStateList, index);
-        if(!state)
-        {
-            OIC_LOG(DEBUG, TAG, "[EDR][Native] state_t object is null");
-            continue;
-        }
-
-        if(!strcmp(state->address, remoteAddress))
-        {
-            OIC_LOG_V(DEBUG, TAG, "[EDR][Native] check whether it is connected or not");
-
-            return state->state;
-        }
-    }
-    OIC_LOG(DEBUG, TAG, "[EDR][Native] there are no target object");
-    return FALSE;
-}
-
-void CAEDRServerReorderingDeviceList(uint32_t index)
-{
-    if (index >= gdeviceStateList->length)
-    {
-        return;
-    }
-
-    if (index < gdeviceStateList->length - 1)
-    {
-        memmove(&gdeviceStateList->data[index], &gdeviceStateList->data[index + 1],
-                (gdeviceStateList->length - index - 1) * sizeof(void *));
-    }
-
-    gdeviceStateList->size--;
-    gdeviceStateList->length--;
-}
-
-/**
- * Device Socket Object List
+ * InputStream & BluetoothServerSocket will be close for Terminating
  */
-void CAEDRServerNativeCreateDeviceSocketList()
-{
-    OIC_LOG(DEBUG, TAG, "[BLE][Native] CAEDRServerNativeCreateDeviceSocketList");
-
-    // create new object array
-    if (gdeviceObjectList == NULL)
-    {
-        OIC_LOG_V(DEBUG, TAG, "Create Device object list");
-
-        gdeviceObjectList = u_arraylist_create();
-    }
-}
-
-void CAEDRServerNativeAddDeviceSocketToList(JNIEnv *env, jobject deviceSocket)
+void CAEDRNatvieCloseServerTask(JNIEnv* env)
 {
-    OIC_LOG(DEBUG, TAG, "[BLE][Native] CAEDRServerNativeAddDeviceSocketToList");
-
-    if(!deviceSocket)
-    {
-        OIC_LOG(DEBUG, TAG, "[BLE][Native] Device is null");
-        return;
-    }
-
-    if(!gdeviceObjectList)
+    if(gInputStream)
     {
-        OIC_LOG(DEBUG, TAG, "[BLE][Native] gdeviceObjectList is null");
-        return;
-    }
-
-    jstring jni_remoteAddress = CAEDRNativeGetAddressFromDeviceSocket(env, deviceSocket);
-    if(!jni_remoteAddress)
-    {
-        OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_remoteAddress is null");
-        return;
-    }
-
-    u_mutex_lock(gMutexSocketListManager);
-
-    const char* remoteAddress = (*env)->GetStringUTFChars(env, jni_remoteAddress, NULL);
-
-    if(!CAEDRServerNativeIsDeviceSocketInList(env, remoteAddress))
-    {
-        jobject gDeviceSocker = (*env)->NewGlobalRef(env, deviceSocket);
-        u_arraylist_add(gdeviceObjectList, gDeviceSocker);
-        OIC_LOG_V(DEBUG, TAG, "Set Object to Array as Element");
-    }
-
-    u_mutex_unlock(gMutexSocketListManager);
-}
-
-jboolean CAEDRServerNativeIsDeviceSocketInList(JNIEnv *env, const char* remoteAddress)
-{
-    OIC_LOG(DEBUG, TAG, "[BLE][Native] CANativeIsDeviceObjInList");
-
-    jint index;
-    for (index = 0; index < u_arraylist_length(gdeviceObjectList); index++)
-    {
-
-        jobject jarrayObj = (jobject) u_arraylist_get(gdeviceObjectList, index);
-        if(!jarrayObj)
-        {
-            OIC_LOG(DEBUG, TAG, "[BLE][Native] jarrayObj is null");
-            return TRUE;
-        }
-
-        jstring jni_setAddress = CAEDRNativeGetAddressFromDeviceSocket(env, jarrayObj);
-        if(!jni_setAddress)
-        {
-            OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_setAddress is null");
-            return TRUE;
-        }
-
-        const char* setAddress = (*env)->GetStringUTFChars(env, jni_setAddress, NULL);
-
-        if(!strcmp(remoteAddress, setAddress))
-        {
-            OIC_LOG_V(DEBUG, TAG, "the device is already set");
-            return TRUE;
-        }
-        else
-        {
-            continue;
-        }
+        OIC_LOG_V(DEBUG, TAG, "InputStream will be close");
+        jclass jni_cid_InputStream = (*env)->FindClass(env, "java/io/InputStream");
+        jmethodID jni_mid_close = (*env)->GetMethodID(env, jni_cid_InputStream, "close", "()V");
+        (*env)->CallVoidMethod(env, gInputStream, jni_mid_close);
+        (*env)->DeleteGlobalRef(env, gInputStream);
     }
 
-    OIC_LOG_V(DEBUG, TAG, "there are no the Device obejct in list. we can add");
-    return FALSE;
-}
-
-void CAEDRServerNativeRemoveAllDeviceSocket(JNIEnv *env)
-{
-    OIC_LOG_V(DEBUG, TAG, "CANativeRemoveAllDeviceObjsList");
-
-    if(!gdeviceObjectList)
+    if(gSeverSocket)
     {
-        OIC_LOG(DEBUG, TAG, "[BLE][Native] gdeviceObjectList is null");
-        return;
-    }
+        OIC_LOG_V(DEBUG, TAG, "[EDR][Native] Accept Resource will be close");
 
-    jint index;
-    for (index = 0; index < u_arraylist_length(gdeviceObjectList); index++)
-    {
-        jobject jarrayObj = (jobject) u_arraylist_get(gdeviceObjectList, index);
-        if(!jarrayObj)
+        jclass jni_cid_BTServerSocket = (*env)->FindClass(env, "android/bluetooth/BluetoothServerSocket");
+        if(!jni_cid_BTServerSocket)
         {
-            OIC_LOG(DEBUG, TAG, "[BLE][Native] jarrayObj is null");
+            OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_cid_BTServerSocket is null");
             return;
         }
-        (*env)->DeleteGlobalRef(env, jarrayObj);
-    }
-
-    OICFree(gdeviceObjectList);
-    gdeviceObjectList = NULL;
-    return;
-}
-
-void CAEDRServerNativeRemoveDeviceSocket(JNIEnv *env, jobject deviceSocket)
-{
-    OIC_LOG_V(DEBUG, TAG, "CAEDRServerNativeRemoveDeviceSocket");
-
-    if(!gdeviceObjectList)
-    {
-        OIC_LOG(DEBUG, TAG, "[BLE][Native] gdeviceObjectList is null");
-        return;
-    }
-
-    u_mutex_lock(gMutexSocketListManager);
-
-    jint index;
-    for (index = 0; index < u_arraylist_length(gdeviceObjectList); index++)
-    {
-        jobject jarrayObj = (jobject) u_arraylist_get(gdeviceObjectList, index);
-        if(!jarrayObj)
-        {
-            OIC_LOG(DEBUG, TAG, "[BLE][Native] jarrayObj is null");
-            continue;
-        }
-
-        jstring jni_setAddress = CAEDRNativeGetAddressFromDeviceSocket(env, jarrayObj);
-        if(!jni_setAddress)
-        {
-            OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_setAddress is null");
-            continue;
-        }
-        const char* setAddress = (*env)->GetStringUTFChars(env, jni_setAddress, NULL);
 
-        jstring jni_remoteAddress = CAEDRNativeGetAddressFromDeviceSocket(env, deviceSocket);
-        if(!jni_remoteAddress)
+        jmethodID jni_mid_accept = (*env)->GetMethodID(env, jni_cid_BTServerSocket, "close", "()V");
+        if(!jni_mid_accept)
         {
-            OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_remoteAddress is null");
-            continue;
+            OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_mid_accept is null");
+            return;
         }
-        const char* remoteAddress = (*env)->GetStringUTFChars(env, jni_remoteAddress, NULL);
-
-        if(!strcmp(setAddress, remoteAddress))
-        {
-            OIC_LOG_V(DEBUG, TAG, "[BLE][Native] remove object : %s", remoteAddress);
-            (*env)->DeleteGlobalRef(env, jarrayObj);
+        (*env)->CallVoidMethod(env, gSeverSocket, jni_mid_accept);
+        (*env)->DeleteGlobalRef(env, gSeverSocket);
 
-            CAEDRServerReorderingDeviceSocketList(index);
-            break;
-        }
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] close accept obj");
     }
-    u_mutex_unlock(gMutexSocketListManager);
-
-    OIC_LOG(DEBUG, TAG, "[BLE][Native] there are no target object");
-    return;
-}
-
-jobject CAEDRServerNativeGetDeviceSocket(uint32_t idx)
-{
-    OIC_LOG_V(DEBUG, TAG, "CAEDRServerNativeGetDeviceSocket");
-
-    if(idx < 0)
-    {
-        OIC_LOG(DEBUG, TAG, "[BLE][Native] index is not available");
-        return NULL;
-    }
-
-    if(!gdeviceObjectList)
-    {
-        OIC_LOG(DEBUG, TAG, "[BLE][Native] gdeviceObjectList is null");
-        return NULL;
-    }
-
-    jobject jarrayObj = (jobject) u_arraylist_get(gdeviceObjectList, idx);
-    if(!jarrayObj)
-    {
-        OIC_LOG(DEBUG, TAG, "[BLE][Native] jarrayObj is not available");
-        return NULL;
-    }
-    return jarrayObj;
-}
-
-uint32_t CAEDRServerGetSocketListLength()
-{
-    if(!gdeviceObjectList)
-    {
-        OIC_LOG(DEBUG, TAG, "[BLE][Native] gdeviceObjectList is null");
-        return 0;
-    }
-
-    uint32_t length = u_arraylist_length(gdeviceObjectList);
-
-    return length;
-}
-
-void CAEDRServerReorderingDeviceSocketList(uint32_t index)
-{
-    if (index >= gdeviceObjectList->length)
-    {
-        return;
-    }
-
-    if (index < gdeviceObjectList->length - 1)
-    {
-        memmove(&gdeviceObjectList->data[index], &gdeviceObjectList->data[index + 1],
-                (gdeviceObjectList->length - index - 1) * sizeof(void *));
-    }
-
-    gdeviceObjectList->size--;
-    gdeviceObjectList->length--;
 }
 
 void CAEDRServerSetPacketReceivedCallback(CAEDRDataReceivedCallback packetReceivedCallback)
@@ -1191,4 +963,3 @@ void CAEDRServerSetPacketReceivedCallback(CAEDRDataReceivedCallback packetReceiv
     gEDRPacketReceivedCallback = packetReceivedCallback;
 }
 
-
index 06cd0fb..e0cdfd5 100644 (file)
@@ -13,9 +13,8 @@ static const char *METHODID_OBJECTNONPARAM = "()Landroid/bluetooth/BluetoothAdap
 static const char *METHODID_STRINGNONPARAM = "()Ljava/lang/String;";
 static const char *CLASSPATH_BT_ADPATER = "android/bluetooth/BluetoothAdapter";
 
-/**
- * BT common
- */
+static u_arraylist_t *gdeviceStateList = NULL;
+static u_arraylist_t *gdeviceObjectList = NULL;
 
 // get address from bluetooth socket
 jstring CAEDRNativeGetAddressFromDeviceSocket(JNIEnv *env, jobject bluetoothSocketObj)
@@ -246,3 +245,487 @@ jstring CAEDRNativeGetAddressFromBTDevice(JNIEnv *env, jobject bluetoothDevice)
     }
     return jni_address;
 }
+
+
+/**
+ * BT State List
+ */
+void CAEDRNativeCreateDeviceStateList()
+{
+    OIC_LOG(DEBUG, TAG, "[EDR][Native] CAEDRNativeCreateDeviceStateList");
+
+    // create new object array
+    if (gdeviceStateList == NULL)
+    {
+        OIC_LOG_V(DEBUG, TAG, "Create device list");
+
+        gdeviceStateList = u_arraylist_create();
+    }
+}
+
+void CAEDRUpdateDeviceState(uint32_t state, const char* address)
+{
+    state_t *newstate = (state_t*) OICMalloc( sizeof(state_t) );
+    memset(newstate->address, 0, CA_MACADDR_SIZE);
+    strcpy(newstate->address, address);
+    newstate->state = state;
+
+    CAEDRNativeAddDeviceStateToList(newstate);
+}
+
+void CAEDRNativeAddDeviceStateToList(state_t* state)
+{
+    if(!state)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] device is null");
+        return;
+    }
+
+    if(!gdeviceStateList)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] gdevice_list is null");
+        return;
+    }
+
+    if(CAEDRNativeIsDeviceInList(state->address)) {
+        CAEDRNativeRemoveDevice(state->address); // delete previous state for update new state
+    }
+    u_arraylist_add(gdeviceStateList, state);          // update new state
+    OIC_LOG_V(DEBUG, TAG, "Set State Info to List : %d", state->state);
+}
+
+jboolean CAEDRNativeIsDeviceInList(const char* remoteAddress){
+
+    jint index;
+    for (index = 0; index < u_arraylist_length(gdeviceStateList); index++)
+    {
+        state_t* state = (state_t*) u_arraylist_get(gdeviceStateList, index);
+        if(!state)
+        {
+            OIC_LOG(DEBUG, TAG, "[EDR][Native] state_t object is null");
+            return TRUE;
+        }
+
+        if(!strcmp(remoteAddress, state->address))
+        {
+            OIC_LOG_V(DEBUG, TAG, "the device is already set");
+            return TRUE;
+        }
+        else
+        {
+            continue;
+        }
+    }
+
+    OIC_LOG_V(DEBUG, TAG, "there are no the device in list.");
+    return FALSE;
+}
+
+void CAEDRNativeRemoveAllDeviceState()
+{
+    OIC_LOG_V(DEBUG, TAG, "CAEDRNativeRemoveAllDevices");
+
+    if(!gdeviceStateList)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] gdeviceStateList is null");
+        return;
+    }
+
+    jint index;
+    for (index = 0; index < u_arraylist_length(gdeviceStateList); index++)
+    {
+        state_t* state = (state_t*) u_arraylist_get(gdeviceStateList, index);
+        if(!state)
+        {
+            OIC_LOG(DEBUG, TAG, "[EDR][Native] jarrayObj is null");
+            continue;
+        }
+        OICFree(state);
+    }
+
+    OICFree(gdeviceStateList);
+    gdeviceStateList = NULL;
+    return;
+}
+
+void CAEDRNativeRemoveDevice(const char* remoteAddress)
+{
+    OIC_LOG_V(DEBUG, TAG, "CAEDRNativeRemoveDeviceforStateList");
+
+    if(!gdeviceStateList)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] gdeviceStateList is null");
+        return;
+    }
+
+    jint index;
+    for (index = 0; index < u_arraylist_length(gdeviceStateList); index++)
+    {
+        state_t* state = (state_t*) u_arraylist_get(gdeviceStateList, index);
+        if(!state)
+        {
+            OIC_LOG(DEBUG, TAG, "[EDR][Native] state_t object is null");
+            continue;
+        }
+
+        if(!strcmp(state->address, remoteAddress))
+        {
+            OIC_LOG_V(DEBUG, TAG, "[EDR][Native] remove state : %s", remoteAddress);
+            OICFree(state);
+
+            CAEDRReorderingDeviceList(index);
+            break;
+        }
+    }
+    return;
+}
+
+jboolean CAEDRIsConnectedDevice(const char* remoteAddress)
+{
+    OIC_LOG_V(DEBUG, TAG, "CAEDRIsConnectedDevice");
+
+    if(!gdeviceStateList)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] gdeviceStateList is null");
+        return FALSE;
+    }
+
+    jint index;
+    for (index = 0; index < u_arraylist_length(gdeviceStateList); index++)
+    {
+        state_t* state = (state_t*) u_arraylist_get(gdeviceStateList, index);
+        if(!state)
+        {
+            OIC_LOG(DEBUG, TAG, "[EDR][Native] state_t object is null");
+            continue;
+        }
+
+        if(!strcmp(state->address, remoteAddress))
+        {
+            OIC_LOG_V(DEBUG, TAG, "[EDR][Native] check whether it is connected or not");
+
+            return state->state;
+        }
+    }
+    return FALSE;
+}
+
+void CAEDRReorderingDeviceList(uint32_t index)
+{
+    if (index >= gdeviceStateList->length)
+    {
+        return;
+    }
+
+    if (index < gdeviceStateList->length - 1)
+    {
+        memmove(&gdeviceStateList->data[index], &gdeviceStateList->data[index + 1],
+                (gdeviceStateList->length - index - 1) * sizeof(void *));
+    }
+
+    gdeviceStateList->size--;
+    gdeviceStateList->length--;
+}
+
+/**
+ * Device Socket Object List
+ */
+void CAEDRNativeCreateDeviceSocketList()
+{
+    OIC_LOG(DEBUG, TAG, "[BLE][Native] CAEDRNativeCreateDeviceSocketList");
+
+    // create new object array
+    if (gdeviceObjectList == NULL)
+    {
+        OIC_LOG_V(DEBUG, TAG, "Create Device object list");
+
+        gdeviceObjectList = u_arraylist_create();
+    }
+}
+
+void CAEDRNativeAddDeviceSocketToList(JNIEnv *env, jobject deviceSocket)
+{
+    OIC_LOG(DEBUG, TAG, "[BLE][Native] CANativeAddDeviceobjToList");
+
+    if(!deviceSocket)
+    {
+        OIC_LOG(DEBUG, TAG, "[BLE][Native] Device is null");
+        return;
+    }
+
+    if(!gdeviceObjectList)
+    {
+        OIC_LOG(DEBUG, TAG, "[BLE][Native] gdeviceObjectList is null");
+        return;
+    }
+
+    jstring jni_remoteAddress = CAEDRNativeGetAddressFromDeviceSocket(env, deviceSocket);
+    if(!jni_remoteAddress)
+    {
+        OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_remoteAddress is null");
+        return;
+    }
+
+    const char* remoteAddress = (*env)->GetStringUTFChars(env, jni_remoteAddress, NULL);
+
+    if(!CAEDRNativeIsDeviceSocketInList(env, remoteAddress))
+    {
+        jobject gDeviceSocker = (*env)->NewGlobalRef(env, deviceSocket);
+        u_arraylist_add(gdeviceObjectList, gDeviceSocker);
+        OIC_LOG_V(DEBUG, TAG, "Set Socket Object to Array");
+    }
+}
+
+jboolean CAEDRNativeIsDeviceSocketInList(JNIEnv *env, const char* remoteAddress)
+{
+    OIC_LOG(DEBUG, TAG, "[BLE][Native] CANativeIsDeviceObjInList");
+
+    jint index;
+    for (index = 0; index < u_arraylist_length(gdeviceObjectList); index++)
+    {
+
+        jobject jarrayObj = (jobject) u_arraylist_get(gdeviceObjectList, index);
+        if(!jarrayObj)
+        {
+            OIC_LOG(DEBUG, TAG, "[BLE][Native] jarrayObj is null");
+            return TRUE;
+        }
+
+        jstring jni_setAddress = CAEDRNativeGetAddressFromDeviceSocket(env, jarrayObj);
+        if(!jni_setAddress)
+        {
+            OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_setAddress is null");
+            return TRUE;
+        }
+
+        const char* setAddress = (*env)->GetStringUTFChars(env, jni_setAddress, NULL);
+
+        if(!strcmp(remoteAddress, setAddress))
+        {
+            OIC_LOG_V(DEBUG, TAG, "the device is already set");
+            return TRUE;
+        }
+        else
+        {
+            continue;
+        }
+    }
+
+    OIC_LOG_V(DEBUG, TAG, "there are no the Device obejct in list. we can add");
+    return FALSE;
+}
+
+void CAEDRNativeSocketCloseToAll(JNIEnv *env)
+{
+    OIC_LOG(DEBUG, TAG, "[EDR][Native] CAEDRNativeSocketCloseToAll");
+
+    if(!gdeviceObjectList)
+    {
+        OIC_LOG(DEBUG, TAG, "[BLE][Native] gdeviceObjectList is null");
+        return;
+    }
+
+    jclass jni_cid_BTSocket = (*env)->FindClass(env, "android/bluetooth/BluetoothSocket");
+    if(!jni_cid_BTSocket)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] close: jni_cid_BTSocket is null");
+        return;
+    }
+
+    jmethodID jni_mid_close = (*env)->GetMethodID(env, jni_cid_BTSocket, "close", "()V");
+    if(!jni_mid_close)
+    {
+        OIC_LOG(DEBUG, TAG, "[EDR][Native] close: jni_mid_close is null");
+        return;
+    }
+
+    jint index;
+    for (index = 0; index < u_arraylist_length(gdeviceObjectList); index++)
+    {
+        jobject jni_obj_socket = (jobject) u_arraylist_get(gdeviceObjectList, index);
+        if(!jni_obj_socket)
+        {
+            OIC_LOG(DEBUG, TAG, "[BLE][Native] socket obj is null");
+            return;
+        }
+
+        (*env)->CallVoidMethod(env, jni_obj_socket, jni_mid_close);
+
+        if((*env)->ExceptionCheck(env))
+        {
+            OIC_LOG(DEBUG, TAG, "[EDR][Native] close: close is Failed!!!");
+            (*env)->ExceptionDescribe(env);
+            (*env)->ExceptionClear(env);
+            return;
+        }
+    }
+}
+
+void CAEDRNativeRemoveAllDeviceSocket(JNIEnv *env)
+{
+    OIC_LOG_V(DEBUG, TAG, "CANativeRemoveAllDeviceObjsList");
+
+    if(!gdeviceObjectList)
+    {
+        OIC_LOG(DEBUG, TAG, "[BLE][Native] gdeviceObjectList is null");
+        return;
+    }
+
+    jint index;
+    for (index = 0; index < u_arraylist_length(gdeviceObjectList); index++)
+    {
+        jobject jarrayObj = (jobject) u_arraylist_get(gdeviceObjectList, index);
+        if(!jarrayObj)
+        {
+            OIC_LOG(DEBUG, TAG, "[BLE][Native] jarrayObj is null");
+            return;
+        }
+        (*env)->DeleteGlobalRef(env, jarrayObj);
+    }
+
+    OICFree(gdeviceObjectList);
+    gdeviceObjectList = NULL;
+    return;
+}
+
+void CAEDRNativeRemoveDeviceSocket(JNIEnv *env, jobject deviceSocket)
+{
+    OIC_LOG_V(DEBUG, TAG, "CAEDRNativeRemoveDeviceSocket");
+
+    if(!gdeviceObjectList)
+    {
+        OIC_LOG(DEBUG, TAG, "[BLE][Native] gdeviceObjectList is null");
+        return;
+    }
+
+    jint index;
+    for (index = 0; index < u_arraylist_length(gdeviceObjectList); index++)
+    {
+        jobject jarrayObj = (jobject) u_arraylist_get(gdeviceObjectList, index);
+        if(!jarrayObj)
+        {
+            OIC_LOG(DEBUG, TAG, "[BLE][Native] jarrayObj is null");
+            continue;
+        }
+
+        jstring jni_setAddress = CAEDRNativeGetAddressFromDeviceSocket(env, jarrayObj);
+        if(!jni_setAddress)
+        {
+            OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_setAddress is null");
+            continue;
+        }
+        const char* setAddress = (*env)->GetStringUTFChars(env, jni_setAddress, NULL);
+
+        jstring jni_remoteAddress = CAEDRNativeGetAddressFromDeviceSocket(env, deviceSocket);
+        if(!jni_remoteAddress)
+        {
+            OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_remoteAddress is null");
+            continue;
+        }
+        const char* remoteAddress = (*env)->GetStringUTFChars(env, jni_remoteAddress, NULL);
+
+        if(!strcmp(setAddress, remoteAddress))
+        {
+            OIC_LOG_V(DEBUG, TAG, "[BLE][Native] remove object : %s", remoteAddress);
+            (*env)->DeleteGlobalRef(env, jarrayObj);
+
+            CAEDRReorderingDeviceSocketList(index);
+            break;
+        }
+    }
+
+    OIC_LOG(DEBUG, TAG, "[BLE][Native] there are no target object");
+    return;
+}
+
+void CAEDRNativeRemoveDeviceSocketBaseAddr(JNIEnv *env, jstring address)
+{
+    OIC_LOG_V(DEBUG, TAG, "CAEDRNativeRemoveDeviceSocket");
+
+    if(!gdeviceObjectList)
+    {
+        OIC_LOG(DEBUG, TAG, "[BLE][Native] gdeviceObjectList is null");
+        return;
+    }
+
+    jint index;
+    for (index = 0; index < u_arraylist_length(gdeviceObjectList); index++)
+    {
+        jobject jarrayObj = (jobject) u_arraylist_get(gdeviceObjectList, index);
+        if(!jarrayObj)
+        {
+            OIC_LOG(DEBUG, TAG, "[BLE][Native] jarrayObj is null");
+            continue;
+        }
+
+        jstring jni_setAddress = CAEDRNativeGetAddressFromDeviceSocket(env, jarrayObj);
+        if(!jni_setAddress)
+        {
+            OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_setAddress is null");
+            continue;
+        }
+        const char* setAddress = (*env)->GetStringUTFChars(env, jni_setAddress, NULL);
+        const char* remoteAddress = (*env)->GetStringUTFChars(env, address, NULL);
+
+        if(!strcmp(setAddress, remoteAddress))
+        {
+            OIC_LOG_V(DEBUG, TAG, "[BLE][Native] remove object : %s", remoteAddress);
+            (*env)->DeleteGlobalRef(env, jarrayObj);
+
+            CAEDRReorderingDeviceSocketList(index);
+            break;
+        }
+    }
+
+    OIC_LOG(DEBUG, TAG, "[BLE][Native] there are no target object");
+    return;
+}
+
+jobject CAEDRNativeGetDeviceSocket(uint32_t idx)
+{
+    OIC_LOG_V(DEBUG, TAG, "CAEDRNativeGetDeviceSocket");
+
+    if(!gdeviceObjectList)
+    {
+        OIC_LOG(DEBUG, TAG, "[BLE][Native] gdeviceObjectList is null");
+        return NULL;
+    }
+
+    jobject jarrayObj = (jobject) u_arraylist_get(gdeviceObjectList, idx);
+    if(!jarrayObj)
+    {
+        OIC_LOG(DEBUG, TAG, "[BLE][Native] jarrayObj is not available");
+        return NULL;
+    }
+    return jarrayObj;
+}
+
+uint32_t CAEDRGetSocketListLength()
+{
+    if(!gdeviceObjectList)
+    {
+        OIC_LOG(DEBUG, TAG, "[BLE][Native] gdeviceObjectList is null");
+        return 0;
+    }
+
+    uint32_t length = u_arraylist_length(gdeviceObjectList);
+
+    return length;
+}
+
+void CAEDRReorderingDeviceSocketList(uint32_t index)
+{
+    if (index >= gdeviceObjectList->length)
+    {
+        return;
+    }
+
+    if (index < gdeviceObjectList->length - 1)
+    {
+        memmove(&gdeviceObjectList->data[index], &gdeviceObjectList->data[index + 1],
+                (gdeviceObjectList->length - index - 1) * sizeof(void *));
+    }
+
+    gdeviceObjectList->size--;
+    gdeviceObjectList->length--;
+}
index e0d17d3..a7876fd 100644 (file)
@@ -273,6 +273,8 @@ uint32_t CASendEDRUnicastData(const CARemoteEndpoint_t *remoteEndpoint, void *da
         return 0;
     }
 
+    OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "CASendEDRUnicastData : %s", data);
+
     uint32_t sentLength = 0;
     const char *serviceUUID = OIC_EDR_SERVICE_ID;
     const char *address = remoteEndpoint->addressInfo.BT.btMacAddress;
@@ -375,6 +377,9 @@ void CATerminateEDR(void)
 {
     OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "IN");
 
+    // Stop EDR adapter
+    CAStopEDR();
+
     // Terminate EDR Network Monitor
     CAEDRTerminateNetworkMonitor();
 
@@ -533,6 +538,7 @@ void CAAdapterDataSendHandler(void *context)
     serviceUUID = message->remoteEndpoint->resourceUri;
 
     char *dataSegment = NULL;
+    uint32_t dataSegmentLength = message->dataLen + CA_HEADER_LENGTH;
     int32_t datalen = message->dataLen;
     OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "checking for fragmentation and the dataLen is %d",
               datalen);
@@ -541,7 +547,7 @@ void CAAdapterDataSendHandler(void *context)
     char *header = (char *) OICMalloc(sizeof(char) * CA_HEADER_LENGTH);
     VERIFY_NON_NULL_VOID(header, EDR_ADAPTER_TAG, "Malloc failed");
 
-    dataSegment = (char *) OICMalloc(sizeof(char) * message->dataLen + CA_HEADER_LENGTH);
+    dataSegment = (char *) OICMalloc(sizeof(char) * dataSegmentLength);
     if (NULL == dataSegment)
     {
         OIC_LOG(ERROR, EDR_ADAPTER_TAG, "Malloc failed");
@@ -549,8 +555,8 @@ void CAAdapterDataSendHandler(void *context)
         return;
     }
 
-    memset(header, 0x0, sizeof(char) * CA_HEADER_LENGTH );
-    memset(dataSegment, 0x0, sizeof(char) * message->dataLen );
+    memset(header, 0x0, sizeof(char) * CA_HEADER_LENGTH);
+    memset(dataSegment, 0x0, dataSegmentLength);
 
     CAResult_t result = CAGenerateHeader(header, message->dataLen);
     if (CA_STATUS_OK != result )
@@ -705,15 +711,13 @@ void CAAdapterDataReceiverHandler(void *context)
         recvDataLen += message->dataLen ;
     }
     //CAFreeEDRData(message);
-    if (totalDataLen == recvDataLen)
-    {
-        OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "Sending data up !");
-        gNetworkPacketReceivedCallback(remoteEndpoint, defragData, recvDataLen);
-        recvDataLen = 0;
-        totalDataLen = 0;
-        remoteEndpoint = NULL;
-        isHeaderAvailable = CA_FALSE;
-    }
+
+    OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "Sending data up !");
+    gNetworkPacketReceivedCallback(remoteEndpoint, defragData, recvDataLen);
+    recvDataLen = 0;
+    totalDataLen = 0;
+    remoteEndpoint = NULL;
+    isHeaderAvailable = CA_FALSE;
 
     OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "OUT_CAAdapterDataReceiverHandler");
 }
@@ -835,7 +839,7 @@ CAResult_t CAAdapterSendData(const char *remoteAddress, const char *serviceUUID,
 
 void CAEDRNotifyNetworkStatus(CANetworkStatus_t status)
 {
-    OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "IN");
+    OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "CAEDRNotifyNetworkStatus, status:%d", status);
 
     // Create localconnectivity
     if (NULL == gLocalConnectivity)
index 326accf..fab7112 100644 (file)
@@ -52,7 +52,10 @@ static unsigned char *gLeAddress = NULL;
 CAResult_t CALEInitializeNetworkMonitor()
 {
     OIC_LOG(DEBUG, TAG, "IN");
-    memcpy(gLeAddress, 0, CA_MACADDR_SIZE);
+       if(gLeAddress != NULL)
+       {
+        memcpy(gLeAddress, 0, CA_MACADDR_SIZE);
+       }
     OIC_LOG(DEBUG, TAG, "OUT");
     return CA_STATUS_OK;
 }
@@ -78,7 +81,7 @@ void CAGetLEAddress(char **leAddress)
      *   Below Allocated Memory will be freed by caller API
      */
     *leAddress = (char*)OICMalloc(CA_MACADDR_SIZE);
-    if (NULL == leAddress)
+    if (NULL == *leAddress)
     {
         OIC_LOG(ERROR, TAG, "error");
         return;
index e29b18b..267c9ad 100644 (file)
@@ -576,7 +576,7 @@ void CALEDeviceStateChangedCb( CAAdapterState_t adapter_state)
 {
     OIC_LOG(DEBUG, CALEADAPTER_TAG, "IN");
 
-    CALocalConnectivity_t localEndpoint;
+    CALocalConnectivity_t localEndpoint = {{{{0}}}};
 
     u_mutex_lock(gBleLocalAddressMutex);
     strncpy(localEndpoint.addressInfo.BT.btMacAddress, gLocalBLEAddress, strlen(gLocalBLEAddress));
@@ -1116,7 +1116,7 @@ void CABLEServerDataReceiverHandler(void *threadData)
             OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "totalDatalength  [%d] recveived Datalen [%d]",
                       totalDataLen, recvDataLen);
         }
-        if (totalDataLen == recvDataLen)
+        if (totalDataLen <= recvDataLen)
         {
             u_mutex_lock(gBleAdapterReqRespCbMutex);
             if (NULL == gNetworkPacketReceivedCallback)
@@ -1217,7 +1217,7 @@ void CABLEClientDataReceiverHandler(void *threadData)
             OIC_LOG_V(DEBUG, CALEADAPTER_TAG, "totalDatalength  [%d] recveived Datalen [%d]",
                       totalDataLen, recvDataLen);
         }
-        if (totalDataLen == recvDataLen)
+        if (totalDataLen <= recvDataLen)
         {
             u_mutex_lock(gBleAdapterReqRespCbMutex);
             if (NULL == gNetworkPacketReceivedCallback)
@@ -1305,6 +1305,14 @@ void CABLEServerSendDataThread(void *threadData)
     u_mutex_lock(gBleServerSendDataMutex);
     // Send the first segment with the header.
     result = CAUpdateCharacteristicsInGattServer(dataSegment, length);
+    if (CA_STATUS_OK != result)
+    {
+        OIC_LOG_V(ERROR, CALEADAPTER_TAG, "Update characteristics failed, result [%d]", result);
+        OICFree(dataSegment);
+        u_mutex_unlock(gBleServerSendDataMutex);
+        return;
+    }
+    
     for (index = 1; index < iter; index++)
     {
         // Send the remaining header.
@@ -1312,6 +1320,13 @@ void CABLEServerSendDataThread(void *threadData)
         result = CAUpdateCharacteristicsInGattServer(
                      bleData->data + ((index * CA_SUPPORTED_BLE_MTU_SIZE) - CA_HEADER_LENGTH),
                      CA_SUPPORTED_BLE_MTU_SIZE);
+       if (CA_STATUS_OK != result)
+        {
+            OIC_LOG_V(ERROR, CALEADAPTER_TAG, "Update characteristics failed, result [%d]", result);
+            OICFree(dataSegment);
+            u_mutex_unlock(gBleServerSendDataMutex);
+            return;
+        }
     }
     if (bleData->dataLen / CA_SUPPORTED_BLE_MTU_SIZE)
     {
@@ -1320,6 +1335,13 @@ void CABLEServerSendDataThread(void *threadData)
         result = CAUpdateCharacteristicsInGattServer(
                      bleData->data + (index * CA_SUPPORTED_BLE_MTU_SIZE) - CA_HEADER_LENGTH,
                      bleData->dataLen % CA_SUPPORTED_BLE_MTU_SIZE + CA_HEADER_LENGTH);
+     if (CA_STATUS_OK != result)
+        {
+            OIC_LOG_V(ERROR, CALEADAPTER_TAG, "Update characteristics failed, result [%d]", result);
+            OICFree(dataSegment);
+            u_mutex_unlock(gBleServerSendDataMutex);
+            return;
+        }
     }
 
     OICFree(dataSegment);
@@ -1390,6 +1412,13 @@ void CABLEClientSendDataThread(void *threadData)
                  dataSegment,
                  length,
                  UNICAST, 0);
+      if (CA_STATUS_OK != result)
+        {
+            OIC_LOG_V(ERROR, CALEADAPTER_TAG, "Update characteristics failed, result [%d]", result);
+            OICFree(dataSegment);
+            u_mutex_unlock(gBleClientSendDataMutex);
+            return ;
+        }
         for (index = 1; index < iter; index++)
         {
             // Send the remaining header.
@@ -1397,6 +1426,14 @@ void CABLEClientSendDataThread(void *threadData)
                      bleData->data + (index * CA_SUPPORTED_BLE_MTU_SIZE) - CA_HEADER_LENGTH,
                      CA_SUPPORTED_BLE_MTU_SIZE,
                      UNICAST, 0);
+        if (CA_STATUS_OK != result)
+            {
+                OIC_LOG_V(ERROR, CALEADAPTER_TAG, "Update characteristics failed, result [%d]",
+                          result);
+                OICFree(dataSegment);
+                u_mutex_unlock(gBleClientSendDataMutex);
+                return;
+            }
         }
         if (bleData->dataLen / CA_SUPPORTED_BLE_MTU_SIZE)
         {
@@ -1406,6 +1443,14 @@ void CABLEClientSendDataThread(void *threadData)
                      bleData->data + (index * CA_SUPPORTED_BLE_MTU_SIZE) - CA_HEADER_LENGTH,
                      bleData->dataLen % CA_SUPPORTED_BLE_MTU_SIZE + CA_HEADER_LENGTH,
                      UNICAST, 0);
+       if (CA_STATUS_OK != result)
+            {
+                OIC_LOG_V(ERROR, CALEADAPTER_TAG, "Update characteristics failed, result [%d]",
+                          result);
+                OICFree(dataSegment);
+                u_mutex_unlock(gBleClientSendDataMutex);
+                return;
+            }
         }
     }
     else
@@ -1413,12 +1458,28 @@ void CABLEClientSendDataThread(void *threadData)
         // Send the first segment with the header.
         result = CAUpdateCharacteristicsToAllGattServers(dataSegment + (index * length),
                  length);
+     if (CA_STATUS_OK != result)
+        {
+            OIC_LOG_V(ERROR, CALEADAPTER_TAG, "Update characteristics failed (all), result [%d]",
+                      result);
+            OICFree(dataSegment);
+            u_mutex_unlock(gBleClientSendDataMutex);
+            return ;
+        }
         // Send the remaining header.
         for (index = 1; index < iter; index++)
         {
             result = CAUpdateCharacteristicsToAllGattServers(
                          bleData->data + (index * CA_SUPPORTED_BLE_MTU_SIZE) - CA_HEADER_LENGTH,
                          CA_SUPPORTED_BLE_MTU_SIZE);
+         if (CA_STATUS_OK != result)
+            {
+                OIC_LOG_V(ERROR, CALEADAPTER_TAG, "Update characteristics (all) failed, result [%d]",
+                          result);
+                OICFree(dataSegment);
+                u_mutex_unlock(gBleClientSendDataMutex);
+                return;
+            }
         }
         if (bleData->dataLen / CA_SUPPORTED_BLE_MTU_SIZE)
         {
@@ -1427,6 +1488,14 @@ void CABLEClientSendDataThread(void *threadData)
             result = CAUpdateCharacteristicsToAllGattServers(
                          bleData->data + (index * CA_SUPPORTED_BLE_MTU_SIZE) - CA_HEADER_LENGTH,
                          bleData->dataLen % CA_SUPPORTED_BLE_MTU_SIZE + CA_HEADER_LENGTH);
+            if (CA_STATUS_OK != result)
+            {
+                OIC_LOG_V(ERROR, CALEADAPTER_TAG, "Update characteristics (all) failed, result [%d]",
+                          result);
+                OICFree(dataSegment);
+                u_mutex_unlock(gBleClientSendDataMutex);
+                return;
+            }
         }
     }
 
index e91c927..3724aec 100644 (file)
@@ -224,11 +224,6 @@ uint32_t CASendLEMulticastData(void *data, uint32_t dataLen)
     }
 
     char *char_value = (char *)data;
-    if (NULL == char_value || dataLen == 0)
-    {
-        OIC_LOG(ERROR, TAG, "error");
-        return 0;
-    }
 
     char header[CA_HEADER_LENGTH] = "";
     memset(header, 0, sizeof(char) * CA_HEADER_LENGTH);
index 9bf9854..b2efaeb 100644 (file)
@@ -39,6 +39,7 @@
 #include "oic_malloc.h"
 
 #define TAG PCF("CA")
+#define SINGLE_HANDLE
 
 #define MEMORY_ALLOC_CHECK(arg) { if (arg == NULL) {OIC_LOG_V(DEBUG, TAG, "memory error"); \
 goto memory_error_exit;} }
@@ -153,7 +154,7 @@ static void CAReceiveThreadProcess(void *threadData)
 {
     // Currently not supported
        // This will be enabled when RI supports multi threading
-#if 0
+#ifndef SINGLE_HANDLE
     CAData_t *data = (CAData_t *) threadData;
 
     if (data == NULL)
@@ -351,6 +352,7 @@ static void CAReceivedPacketCallback(CARemoteEndpoint_t *endpoint, void *data,
         }
         OIC_LOG_V(DEBUG, TAG, "Request- code: %d", ReqInfo->method);
         OIC_LOG_V(DEBUG, TAG, "Request- token : %s", ReqInfo->info.token);
+        OIC_LOG_V(DEBUG, TAG, "Request- msgID: %d", ReqInfo->info.messageId);
 
         if (NULL != endpoint)
         {
@@ -471,6 +473,7 @@ void CAHandleRequestResponseCallbacks()
 {
     OIC_LOG_V(DEBUG, TAG, "CAHandleRequestResponseCallbacks IN");
 
+#ifdef SINGLE_HANDLE
     // parse the data and call the callbacks.
     // #1 parse the data
     // #2 get endpoint
@@ -551,6 +554,9 @@ void CAHandleRequestResponseCallbacks()
     }
 
     OICFree(rep);
+
+
+#endif
     OIC_LOG_V(DEBUG, TAG, "CAHandleRequestResponseCallbacks OUT");
 }
 
@@ -853,7 +859,7 @@ CAResult_t CAInitializeMessageHandler()
     CAQueueingThreadInitialize(&gReceiveThread, gThreadPoolHandle, CAReceiveThreadProcess,
             CADataDestroyer);
 
-#if 0 // This will be enabled when RI supports multi threading
+#ifndef SINGLE_HANDLE// This will be enabled when RI supports multi threading
     // start receive thread
     res = CAQueueingThreadStart(&gReceiveThread);
 
@@ -904,7 +910,7 @@ void CATerminateMessageHandler()
     // stop thread
     // delete thread data
     if(gReceiveThread.threadMutex != NULL) {
-       #if 0 // This will be enabled when RI supports multi threading
+       #ifndef SINGLE_HANDLE// This will be enabled when RI supports multi threading
         // CAQueueingThreadStop(&gReceiveThread);
        #endif  
         CAQueueingThreadDestroy(&gReceiveThread);