Changed to be used only once to create input stream.
[platform/upstream/iotivity.git] / resource / csdk / connectivity / src / bt_edr_adapter / android / caedrutils.c
index 773eed9..a70ddc0 100644 (file)
 #include "oic_string.h"
 #include "cathreadpool.h"
 #include "uarraylist.h"
+#include "caadapterutils.h"
 
 #define ERROR_CODE (-1)
-#define TAG PCF("CA_EDR_UTILS")
+#define TAG PCF("OIC_CA_EDR_UTILS")
 
 static const char METHODID_OBJECTNONPARAM[] = "()Landroid/bluetooth/BluetoothAdapter;";
 static const char METHODID_STRINGNONPARAM[] = "()Ljava/lang/String;";
@@ -45,24 +46,15 @@ jstring CAEDRNativeGetAddressFromDeviceSocket(JNIEnv *env, jobject bluetoothSock
 {
     if (!bluetoothSocketObj)
     {
-        OIC_LOG(ERROR, TAG, "[EDR] getRemoteAddress: bluetoothSocketObj is null");
+        OIC_LOG(ERROR, TAG, "bluetoothSocketObj is null");
         return NULL;
     }
 
-    jclass jni_cid_BTSocket = (*env)->FindClass(env, CLASSPATH_BT_SOCKET);
-    if (!jni_cid_BTSocket)
-    {
-        OIC_LOG(ERROR, TAG, "[EDR] getRemoteAddress: jni_cid_BTSocket is null");
-        return NULL;
-    }
-
-    jmethodID jni_mid_getRemoteDevice = (*env)->GetMethodID(
-            env, jni_cid_BTSocket, "getRemoteDevice", "()Landroid/bluetooth/BluetoothDevice;");
+    jmethodID jni_mid_getRemoteDevice = CAGetJNIMethodID(
+            env, CLASSPATH_BT_SOCKET, "getRemoteDevice", "()Landroid/bluetooth/BluetoothDevice;");
     if (!jni_mid_getRemoteDevice)
     {
-        (*env)->DeleteLocalRef(env, jni_cid_BTSocket);
-
-        OIC_LOG(ERROR, TAG, "[EDR] getRemoteAddress: jni_mid_getRemoteDevice is null");
+        OIC_LOG(ERROR, TAG, "jni_mid_getRemoteDevice is null");
         return NULL;
     }
 
@@ -70,47 +62,30 @@ jstring CAEDRNativeGetAddressFromDeviceSocket(JNIEnv *env, jobject bluetoothSock
                                                               jni_mid_getRemoteDevice);
     if (!jni_obj_remoteBTDevice)
     {
-        (*env)->DeleteLocalRef(env, jni_cid_BTSocket);
-
-        OIC_LOG(ERROR, TAG, "[EDR] getRemoteAddress: jni_obj_remoteBTDevice is null");
+        OIC_LOG(ERROR, TAG, "jni_obj_remoteBTDevice is null");
         return NULL;
     }
 
-    jclass jni_cid_BTDevice = (*env)->FindClass(env, CLASSPATH_BT_DEVICE);
-    if (!jni_cid_BTDevice)
-    {
-        (*env)->DeleteLocalRef(env, jni_obj_remoteBTDevice);
-        (*env)->DeleteLocalRef(env, jni_cid_BTSocket);
-
-        OIC_LOG(ERROR, TAG, "[EDR] getRemoteAddress: jni_cid_BTDevice is null");
-        return NULL;
-    }
-    jmethodID j_mid_getAddress = (*env)->GetMethodID(env, jni_cid_BTDevice, "getAddress",
-                                                     METHODID_STRINGNONPARAM);
+    jmethodID j_mid_getAddress = CAGetJNIMethodID(env, CLASSPATH_BT_DEVICE,
+                                                  "getAddress",
+                                                  METHODID_STRINGNONPARAM);
     if (!j_mid_getAddress)
     {
+        OIC_LOG(ERROR, TAG, "j_mid_getAddress is null");
         (*env)->DeleteLocalRef(env, jni_obj_remoteBTDevice);
-        (*env)->DeleteLocalRef(env, jni_cid_BTDevice);
-        (*env)->DeleteLocalRef(env, jni_cid_BTSocket);
-
-        OIC_LOG(ERROR, TAG, "[EDR] getRemoteAddress: j_mid_getAddress is null");
         return NULL;
     }
 
-    jstring j_str_address = (*env)->CallObjectMethod(env, jni_obj_remoteBTDevice, j_mid_getAddress);
+    jstring j_str_address = (*env)->CallObjectMethod(env, jni_obj_remoteBTDevice,
+                                                     j_mid_getAddress);
     if (!j_str_address)
     {
+        OIC_LOG(ERROR, TAG, "j_str_address is null");
         (*env)->DeleteLocalRef(env, jni_obj_remoteBTDevice);
-        (*env)->DeleteLocalRef(env, jni_cid_BTDevice);
-        (*env)->DeleteLocalRef(env, jni_cid_BTSocket);
-
-        OIC_LOG(ERROR, TAG, "[EDR] getRemoteAddress: j_str_address is null");
         return NULL;
     }
 
     (*env)->DeleteLocalRef(env, jni_obj_remoteBTDevice);
-    (*env)->DeleteLocalRef(env, jni_cid_BTDevice);
-    (*env)->DeleteLocalRef(env, jni_cid_BTSocket);
 
     return j_str_address;
 }
@@ -120,7 +95,7 @@ jstring CAEDRNativeGetLocalDeviceAddress(JNIEnv* env)
     jclass jni_cid_BTAdapter = (*env)->FindClass(env, CLASSPATH_BT_ADPATER);
     if (!jni_cid_BTAdapter)
     {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] getAddress: jni_cid_BTAdapter is null");
+        OIC_LOG(ERROR, TAG, "jni_cid_BTAdapter is null");
         return NULL;
     }
 
@@ -129,9 +104,8 @@ jstring CAEDRNativeGetLocalDeviceAddress(JNIEnv* env)
                                                                     METHODID_OBJECTNONPARAM);
     if (!jni_mid_getDefaultAdapter)
     {
+        OIC_LOG(ERROR, TAG, "jni_mid_getDefaultAdapter is null");
         (*env)->DeleteLocalRef(env, jni_cid_BTAdapter);
-
-        OIC_LOG(ERROR, TAG, "[EDR][Native] getAddress: jni_mid_getDefaultAdapter is null");
         return NULL;
     }
 
@@ -139,9 +113,8 @@ jstring CAEDRNativeGetLocalDeviceAddress(JNIEnv* env)
                                                        METHODID_STRINGNONPARAM);
     if (!jni_mid_getAddress)
     {
+        OIC_LOG(ERROR, TAG, "jni_mid_getAddress is null");
         (*env)->DeleteLocalRef(env, jni_cid_BTAdapter);
-
-        OIC_LOG(ERROR, TAG, "[EDR][Native] getAddress: jni_mid_getAddress is null");
         return NULL;
     }
 
@@ -149,9 +122,8 @@ jstring CAEDRNativeGetLocalDeviceAddress(JNIEnv* env)
                                                                jni_mid_getDefaultAdapter);
     if (!jni_obj_BTAdapter)
     {
+        OIC_LOG(ERROR, TAG, "jni_obj_BTAdapter is null");
         (*env)->DeleteLocalRef(env, jni_cid_BTAdapter);
-
-        OIC_LOG(ERROR, TAG, "[EDR][Native] getAddress: jni_obj_BTAdapter is null");
         return NULL;
     }
 
@@ -159,10 +131,9 @@ jstring CAEDRNativeGetLocalDeviceAddress(JNIEnv* env)
                                                                 jni_mid_getAddress);
     if (!jni_str_address)
     {
+        OIC_LOG(ERROR, TAG, "jni_str_address is null");
         (*env)->DeleteLocalRef(env, jni_obj_BTAdapter);
         (*env)->DeleteLocalRef(env, jni_cid_BTAdapter);
-
-        OIC_LOG(ERROR, TAG, "[EDR][Native] getAddress: jni_str_address is null");
         return NULL;
     }
 
@@ -177,7 +148,7 @@ jobjectArray CAEDRNativeGetBondedDevices(JNIEnv *env)
     jclass jni_cid_BTAdapter = (*env)->FindClass(env, CLASSPATH_BT_ADPATER);
     if (!jni_cid_BTAdapter)
     {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] getBondedDevices: jni_cid_BTAdapter is null");
+        OIC_LOG(ERROR, TAG, "jni_cid_BTAdapter is null");
         return NULL;
     }
 
@@ -186,9 +157,8 @@ jobjectArray CAEDRNativeGetBondedDevices(JNIEnv *env)
                                                                     METHODID_OBJECTNONPARAM);
     if (!jni_mid_getDefaultAdapter)
     {
+        OIC_LOG(ERROR, TAG, "default adapter is null");
         (*env)->DeleteLocalRef(env, jni_cid_BTAdapter);
-
-        OIC_LOG(ERROR, TAG, "[EDR][Native] getBondedDevices: default adapter is null");
         return NULL;
     }
 
@@ -196,9 +166,8 @@ jobjectArray CAEDRNativeGetBondedDevices(JNIEnv *env)
                                                                jni_mid_getDefaultAdapter);
     if (!jni_obj_BTAdapter)
     {
+        OIC_LOG(ERROR, TAG, "bluetooth adapter is null");
         (*env)->DeleteLocalRef(env, jni_cid_BTAdapter);
-
-        OIC_LOG(ERROR, TAG, "[EDR][Native] getBondedDevices: bluetooth adapter is null");
         return NULL;
     }
 
@@ -208,10 +177,9 @@ jobjectArray CAEDRNativeGetBondedDevices(JNIEnv *env)
                                                              "()Ljava/util/Set;");
     if (!jni_mid_getBondedDevices)
     {
+        OIC_LOG(ERROR, TAG, "jni_mid_getBondedDevicesr is null");
         (*env)->DeleteLocalRef(env, jni_obj_BTAdapter);
         (*env)->DeleteLocalRef(env, jni_cid_BTAdapter);
-
-        OIC_LOG(ERROR, TAG, "[EDR][Native] getBondedDevices: jni_mid_getBondedDevicesr is null");
         return NULL;
     }
 
@@ -219,48 +187,28 @@ jobjectArray CAEDRNativeGetBondedDevices(JNIEnv *env)
                                                                 jni_mid_getBondedDevices);
     if (!jni_obj_setPairedDevices)
     {
+        OIC_LOG(ERROR, TAG, "ni_obj_setPairedDevices is null");
         (*env)->DeleteLocalRef(env, jni_obj_BTAdapter);
         (*env)->DeleteLocalRef(env, jni_cid_BTAdapter);
-
-        OIC_LOG(ERROR, TAG, "[EDR][Native] getBondedDevices: jni_obj_setPairedDevices is null");
         return NULL;
     }
 
     // Convert the set to an object array
     // object[] array = Set<BluetoothDevice>.toArray();
-    jclass jni_cid_Set = (*env)->FindClass(env, "java/util/Set");
-    if (!jni_cid_Set)
-    {
-        (*env)->DeleteLocalRef(env, jni_obj_BTAdapter);
-        (*env)->DeleteLocalRef(env, jni_cid_BTAdapter);
-        (*env)->DeleteLocalRef(env, jni_obj_setPairedDevices);
-
-        OIC_LOG(ERROR, TAG, "[EDR][Native] getBondedDevices: jni_cid_Set is null");
-        return NULL;
-    }
-    jmethodID jni_mid_toArray = (*env)->GetMethodID(env, jni_cid_Set, "toArray",
-                                                    "()[Ljava/lang/Object;");
-
+    jmethodID jni_mid_toArray = CAGetJNIMethodID(env, "java/util/Set",
+                                                 "toArray", "()[Ljava/lang/Object;");
     if (!jni_mid_toArray)
     {
-        (*env)->DeleteLocalRef(env, jni_obj_BTAdapter);
-        (*env)->DeleteLocalRef(env, jni_cid_BTAdapter);
-        (*env)->DeleteLocalRef(env, jni_obj_setPairedDevices);
-
-        OIC_LOG(ERROR, TAG, "[EDR][Native] getBondedDevices: jni_mid_toArray is null");
-        return NULL;
+        OIC_LOG(ERROR, TAG, "jni_mid_toArray is null");
+        goto exit;
     }
 
     jobjectArray jni_arrayPairedDevices = (jobjectArray)(
             (*env)->CallObjectMethod(env, jni_obj_setPairedDevices, jni_mid_toArray));
     if (!jni_arrayPairedDevices)
     {
-        (*env)->DeleteLocalRef(env, jni_obj_BTAdapter);
-        (*env)->DeleteLocalRef(env, jni_cid_BTAdapter);
-        (*env)->DeleteLocalRef(env, jni_obj_setPairedDevices);
-
-        OIC_LOG(ERROR, TAG, "[EDR][Native] getBondedDevices: jni_arrayPairedDevices is null");
-        return NULL;
+        OIC_LOG(ERROR, TAG, "jni_arrayPairedDevices is null");
+        goto exit;
     }
 
     (*env)->DeleteLocalRef(env, jni_obj_BTAdapter);
@@ -268,6 +216,12 @@ jobjectArray CAEDRNativeGetBondedDevices(JNIEnv *env)
     (*env)->DeleteLocalRef(env, jni_obj_setPairedDevices);
 
     return jni_arrayPairedDevices;
+
+exit:
+    (*env)->DeleteLocalRef(env, jni_obj_BTAdapter);
+    (*env)->DeleteLocalRef(env, jni_cid_BTAdapter);
+    (*env)->DeleteLocalRef(env, jni_obj_setPairedDevices);
+    return NULL;
 }
 
 jint CAEDRNativeGetBTStateOnInfo(JNIEnv *env)
@@ -275,7 +229,7 @@ jint CAEDRNativeGetBTStateOnInfo(JNIEnv *env)
     jclass jni_cid_BTAdapter = (*env)->FindClass(env, CLASSPATH_BT_ADPATER);
     if (!jni_cid_BTAdapter)
     {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] getBTStateOnInfo: jni_cid_BTAdapter is null");
+        OIC_LOG(ERROR, TAG, "jni_cid_BTAdapter is null");
         return ERROR_CODE;
     }
 
@@ -284,12 +238,12 @@ jint CAEDRNativeGetBTStateOnInfo(JNIEnv *env)
     {
         (*env)->DeleteLocalRef(env, jni_cid_BTAdapter);
 
-        OIC_LOG(ERROR, TAG, "[EDR][Native] get_field_state is 0");
+        OIC_LOG(ERROR, TAG, "get_field_state is 0");
         return ERROR_CODE;
     }
     jint jni_int_val = (*env)->GetStaticIntField(env, jni_cid_BTAdapter, jni_fid_stateon);
 
-    OIC_LOG_V(DEBUG, TAG, "[EDR][Native] bluetooth state integer value : %d", jni_int_val);
+    OIC_LOG_V(DEBUG, TAG, "bluetooth state integer value : %d", jni_int_val);
 
     (*env)->DeleteLocalRef(env, jni_cid_BTAdapter);
 
@@ -301,7 +255,7 @@ jboolean CAEDRNativeIsEnableBTAdapter(JNIEnv *env)
     jclass jni_cid_BTAdapter = (*env)->FindClass(env, CLASSPATH_BT_ADPATER);
     if (!jni_cid_BTAdapter)
     {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] jni_cid_BTAdapter: jni_cid_BTAdapter is null");
+        OIC_LOG(ERROR, TAG, "jni_cid_BTAdapter: jni_cid_BTAdapter is null");
         return JNI_FALSE;
     }
 
@@ -310,9 +264,8 @@ jboolean CAEDRNativeIsEnableBTAdapter(JNIEnv *env)
                                                                     METHODID_OBJECTNONPARAM);
     if (!jni_mid_getDefaultAdapter)
     {
+        OIC_LOG(ERROR, TAG, "jni_mid_getDefaultAdapter is null");
         (*env)->DeleteLocalRef(env, jni_cid_BTAdapter);
-
-        OIC_LOG(ERROR, TAG, "[EDR][Native] jni_mid_getDefaultAdapter is null");
         return JNI_FALSE;
     }
 
@@ -320,9 +273,8 @@ jboolean CAEDRNativeIsEnableBTAdapter(JNIEnv *env)
                                                                jni_mid_getDefaultAdapter);
     if (!jni_obj_BTAdapter)
     {
+        OIC_LOG(ERROR, TAG, "jni_obj_BTAdapter is null");
         (*env)->DeleteLocalRef(env, jni_cid_BTAdapter);
-
-        OIC_LOG(ERROR, TAG, "[EDR][Native] jni_obj_BTAdapter is null");
         return JNI_FALSE;
     }
 
@@ -330,10 +282,9 @@ jboolean CAEDRNativeIsEnableBTAdapter(JNIEnv *env)
     jmethodID jni_mid_isEnable = (*env)->GetMethodID(env, jni_cid_BTAdapter, "isEnabled", "()Z");
     if (!jni_mid_isEnable)
     {
+        OIC_LOG(ERROR, TAG, "jni_mid_isEnable is null");
         (*env)->DeleteLocalRef(env, jni_cid_BTAdapter);
         (*env)->DeleteLocalRef(env, jni_obj_BTAdapter);
-
-        OIC_LOG(ERROR, TAG, "[EDR][Native] jni_mid_isEnable is null");
         return JNI_FALSE;
     }
 
@@ -349,21 +300,17 @@ jstring CAEDRNativeGetAddressFromBTDevice(JNIEnv *env, jobject bluetoothDevice)
 {
     if (!bluetoothDevice)
     {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] bluetoothDevice is null");
-        return NULL;
-    }
-    jclass jni_cid_device_list = (*env)->FindClass(env, "android/bluetooth/BluetoothDevice");
-    if (!jni_cid_device_list)
-    {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] jni_cid_device_list is null");
+        OIC_LOG(ERROR, TAG, "bluetoothDevice is null");
         return NULL;
     }
 
-    jmethodID jni_mid_getAddress = (*env)->GetMethodID(env, jni_cid_device_list, "getAddress",
-                                                       METHODID_STRINGNONPARAM);
+    jmethodID jni_mid_getAddress = CAGetJNIMethodID(env,
+                                                    CLASSPATH_BT_DEVICE,
+                                                    "getAddress",
+                                                    METHODID_STRINGNONPARAM);
     if (!jni_mid_getAddress)
     {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] jni_mid_getAddress is null");
+        OIC_LOG(ERROR, TAG, "jni_mid_getAddress is null");
         return NULL;
     }
 
@@ -371,7 +318,7 @@ jstring CAEDRNativeGetAddressFromBTDevice(JNIEnv *env, jobject bluetoothDevice)
                                                             jni_mid_getAddress);
     if (!jni_address)
     {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] jni_address is null");
+        OIC_LOG(ERROR, TAG, "jni_address is null");
         return NULL;
     }
     return jni_address;
@@ -382,7 +329,7 @@ jstring CAEDRNativeGetAddressFromBTDevice(JNIEnv *env, jobject bluetoothDevice)
  */
 void CAEDRNativeCreateDeviceStateList()
 {
-    OIC_LOG(DEBUG, TAG, "[EDR][Native] CAEDRNativeCreateDeviceStateList");
+    OIC_LOG(DEBUG, TAG, "CAEDRNativeCreateDeviceStateList");
 
     // create new object array
     if (NULL == g_deviceStateList)
@@ -397,72 +344,69 @@ void CAEDRUpdateDeviceState(CAConnectedState_t state, const char *address)
 {
     if (!address)
     {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] address is null");
+        OIC_LOG(ERROR, TAG, "address is null");
         return;
     }
-    state_t *newstate = (state_t*) OICCalloc(1, sizeof(state_t));
-    if (!newstate)
+    CAConnectedDeviceInfo_t *deviceInfo =
+            (CAConnectedDeviceInfo_t *) OICCalloc(1, sizeof(CAConnectedDeviceInfo_t));
+    if (!deviceInfo)
     {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] newstate is null");
+        OIC_LOG(ERROR, TAG, "deviceInfo is null");
         return;
     }
-    OICStrcpy((char*) newstate->address, sizeof(newstate->address), address);
-    newstate->state = state;
+    OICStrcpy((char*) deviceInfo->address, sizeof(deviceInfo->address), address);
+    deviceInfo->state = state;
 
-    CAEDRNativeAddDeviceStateToList(newstate);
+    CAEDRNativeAddDeviceStateToList(deviceInfo);
 }
 
-void CAEDRNativeAddDeviceStateToList(state_t *state)
+void CAEDRNativeAddDeviceStateToList(CAConnectedDeviceInfo_t *deviceInfo)
 {
-    if (!state)
+    if (!deviceInfo)
     {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] device is null");
+        OIC_LOG(ERROR, TAG, "device is null");
         return;
     }
 
     if (!g_deviceStateList)
     {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] gdevice_list is null");
+        OIC_LOG(ERROR, TAG, "gdevice_list is null");
         return;
     }
 
-    if (CAEDRNativeIsDeviceInList((const char*) state->address))
+    if (CAEDRNativeIsDeviceInList((const char*) deviceInfo->address))
     {
         // delete previous state for update new state
-        CAEDRNativeRemoveDevice((const char*) state->address);
+        CAEDRNativeRemoveDevice((const char*) deviceInfo->address);
     }
-    u_arraylist_add(g_deviceStateList, state); // update new state
-    OIC_LOG_V(DEBUG, TAG, "Set State Info to List : %d", state->state);
+    u_arraylist_add(g_deviceStateList, deviceInfo); // update new state
+    OIC_LOG_V(DEBUG, TAG, "add new device state[%d] to list", deviceInfo->state);
 }
 
 bool CAEDRNativeIsDeviceInList(const char* remoteAddress)
 {
-
     if (!remoteAddress)
     {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] remoteAddress is null");
+        OIC_LOG(ERROR, TAG, "remoteAddress is null");
         return false;
     }
-    jint index;
+
     jint length = u_arraylist_length(g_deviceStateList);
-    for (index = 0; index < length; index++)
+    for (jint index = 0; index < length; index++)
     {
-        state_t* state = (state_t*) u_arraylist_get(g_deviceStateList, index);
-        if (!state)
+        CAConnectedDeviceInfo_t* deviceInfo =
+                (CAConnectedDeviceInfo_t*) u_arraylist_get(g_deviceStateList, index);
+        if (!deviceInfo)
         {
-            OIC_LOG(ERROR, TAG, "[EDR][Native] state_t object is null");
+            OIC_LOG(ERROR, TAG, "deviceInfo object is null");
             return false;
         }
 
-        if (!strcmp(remoteAddress, (const char*) state->address))
+        if (!strcmp(remoteAddress, (const char*) deviceInfo->address))
         {
             OIC_LOG(DEBUG, TAG, "the device is already set");
             return true;
         }
-        else
-        {
-            continue;
-        }
     }
 
     OIC_LOG(DEBUG, TAG, "there are no the device in list.");
@@ -475,7 +419,7 @@ void CAEDRNativeRemoveAllDeviceState()
 
     if (!g_deviceStateList)
     {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] gdeviceStateList is null");
+        OIC_LOG(ERROR, TAG, "gdeviceStateList is null");
         return;
     }
 
@@ -483,13 +427,14 @@ void CAEDRNativeRemoveAllDeviceState()
     jint length = u_arraylist_length(g_deviceStateList);
     for (index = 0; index < length; index++)
     {
-        state_t* state = (state_t*) u_arraylist_get(g_deviceStateList, index);
-        if (!state)
+        CAConnectedDeviceInfo_t* deviceInfo =
+                (CAConnectedDeviceInfo_t*) u_arraylist_get(g_deviceStateList, index);
+        if (!deviceInfo)
         {
-            OIC_LOG(DEBUG, TAG, "[EDR][Native] jarrayObj is null");
+            OIC_LOG(DEBUG, TAG, "jarrayObj is null");
             continue;
         }
-        OICFree(state);
+        OICFree(deviceInfo);
     }
 
     OICFree(g_deviceStateList);
@@ -503,30 +448,30 @@ void CAEDRNativeRemoveDevice(const char *remoteAddress)
 
     if (!g_deviceStateList)
     {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] gdeviceStateList is null");
+        OIC_LOG(ERROR, TAG, "gdeviceStateList is null");
         return;
     }
     if (!remoteAddress)
     {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] remoteAddress is null");
+        OIC_LOG(ERROR, TAG, "remoteAddress is null");
         return;
     }
 
-    jint index;
     jint length = u_arraylist_length(g_deviceStateList);
-    for (index = 0; index < length; index++)
+    for (jint index = 0; index < length; index++)
     {
-        state_t* state = (state_t*) u_arraylist_get(g_deviceStateList, index);
-        if (!state)
+        CAConnectedDeviceInfo_t* deviceInfo =
+                (CAConnectedDeviceInfo_t*) u_arraylist_get(g_deviceStateList, index);
+        if (!deviceInfo)
         {
-            OIC_LOG(DEBUG, TAG, "[EDR][Native] state_t object is null");
+            OIC_LOG(DEBUG, TAG, "deviceInfo object is null");
             continue;
         }
 
-        if (!strcmp((const char*) state->address, remoteAddress))
+        if (!strcmp((const char*) deviceInfo->address, remoteAddress))
         {
-            OIC_LOG_V(DEBUG, TAG, "[EDR][Native] remove state : %s", remoteAddress);
-            OICFree(state);
+            OIC_LOG_V(DEBUG, TAG, "remove [%s] info from list", remoteAddress);
+            OICFree(deviceInfo);
 
             u_arraylist_remove(g_deviceStateList, index);
             break;
@@ -541,30 +486,30 @@ CAConnectedState_t CAEDRIsConnectedDevice(const char *remoteAddress)
 
     if (!remoteAddress)
     {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] remoteAddress is null");
+        OIC_LOG(ERROR, TAG, "remoteAddress is null");
         return STATE_DISCONNECTED;
     }
 
     if (!g_deviceStateList)
     {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] gdeviceStateList is null");
+        OIC_LOG(ERROR, TAG, "gdeviceStateList is null");
         return STATE_DISCONNECTED;
     }
 
-    jint index;
     jint length = u_arraylist_length(g_deviceStateList);
-    for (index = 0; index < length; index++)
+    for (jint index = 0; index < length; index++)
     {
-        state_t* state = (state_t*) u_arraylist_get(g_deviceStateList, index);
-        if (!state)
+        CAConnectedDeviceInfo_t* deviceInfo =
+                (CAConnectedDeviceInfo_t*) u_arraylist_get(g_deviceStateList, index);
+        if (!deviceInfo)
         {
-            OIC_LOG(DEBUG, TAG, "[EDR][Native] state_t object is null");
+            OIC_LOG(DEBUG, TAG, "deviceInfo object is null");
             continue;
         }
 
-        if (!strcmp((const char*) state->address, remoteAddress))
+        if (!strcmp((const char*) deviceInfo->address, remoteAddress))
         {
-            return state->state;
+            return deviceInfo->state;
         }
     }
     return STATE_DISCONNECTED;
@@ -575,7 +520,7 @@ CAConnectedState_t CAEDRIsConnectedDevice(const char *remoteAddress)
  */
 void CAEDRNativeCreateDeviceSocketList()
 {
-    OIC_LOG(DEBUG, TAG, "[EDR][Native] CAEDRNativeCreateDeviceSocketList");
+    OIC_LOG(DEBUG, TAG, "CAEDRNativeCreateDeviceSocketList");
 
     // create new object array
     if (NULL == g_deviceObjectList)
@@ -588,24 +533,24 @@ void CAEDRNativeCreateDeviceSocketList()
 
 void CAEDRNativeAddDeviceSocketToList(JNIEnv *env, jobject deviceSocket)
 {
-    OIC_LOG(DEBUG, TAG, "[EDR][Native] CANativeAddDeviceobjToList");
+    OIC_LOG(DEBUG, TAG, "CANativeAddDeviceobjToList");
 
     if (!deviceSocket)
     {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] Device is null");
+        OIC_LOG(ERROR, TAG, "Device is null");
         return;
     }
 
     if (!g_deviceObjectList)
     {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] gdeviceObjectList is null");
+        OIC_LOG(ERROR, TAG, "gdeviceObjectList is null");
         return;
     }
 
     jstring jni_remoteAddress = CAEDRNativeGetAddressFromDeviceSocket(env, deviceSocket);
     if (!jni_remoteAddress)
     {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] jni_remoteAddress is null");
+        OIC_LOG(ERROR, TAG, "jni_remoteAddress is null");
         return;
     }
 
@@ -613,9 +558,44 @@ void CAEDRNativeAddDeviceSocketToList(JNIEnv *env, jobject deviceSocket)
 
     if (!CAEDRNativeIsDeviceSocketInList(env, remoteAddress))
     {
-        jobject gDeviceSocker = (*env)->NewGlobalRef(env, deviceSocket);
-        u_arraylist_add(g_deviceObjectList, gDeviceSocker);
-        OIC_LOG(DEBUG, TAG, "Set Socket Object to Array");
+        CAEDRSocketInfo_t *socketInfo = (CAEDRSocketInfo_t *) OICCalloc(1, sizeof(*socketInfo));
+        if (!socketInfo)
+        {
+            OIC_LOG(ERROR, TAG, "Out of memory");
+            return;
+        }
+
+        jmethodID jni_mid_getInputStream = CAGetJNIMethodID(env,
+                                                            "android/bluetooth/BluetoothSocket",
+                                                            "getInputStream",
+                                                            "()Ljava/io/InputStream;");
+        if (!jni_mid_getInputStream)
+        {
+            OIC_LOG(ERROR, TAG, "jni_mid_getInputStream is null");
+            return;
+        }
+
+        jobject jni_obj_inputStream = (*env)->CallObjectMethod(env, deviceSocket,
+                                                               jni_mid_getInputStream);
+        if (!jni_obj_inputStream)
+        {
+            OIC_LOG(ERROR, TAG, "jni_obj_inputStream is null");
+            return;
+        }
+
+        socketInfo->deviceSocket = (*env)->NewGlobalRef(env, deviceSocket);
+        socketInfo->inputStream = (*env)->NewGlobalRef(env, jni_obj_inputStream);
+        (*env)->DeleteLocalRef(env, jni_obj_inputStream);
+
+        bool result = u_arraylist_add(g_deviceObjectList, (void *) socketInfo);
+        if (!result)
+        {
+            OIC_LOG(ERROR, TAG, "u_arraylist_add failed.");
+            OICFree(socketInfo);
+            return;
+        }
+
+        OIC_LOG(DEBUG, TAG, "add new device socket object to list");
     }
     (*env)->ReleaseStringUTFChars(env, jni_remoteAddress, remoteAddress);
     (*env)->DeleteLocalRef(env, jni_remoteAddress);
@@ -623,36 +603,43 @@ void CAEDRNativeAddDeviceSocketToList(JNIEnv *env, jobject deviceSocket)
 
 bool CAEDRNativeIsDeviceSocketInList(JNIEnv *env, const char* remoteAddress)
 {
-    OIC_LOG(DEBUG, TAG, "[EDR][Native] CANativeIsDeviceObjInList");
+    OIC_LOG(DEBUG, TAG, "CANativeIsDeviceObjInList");
 
     if (!remoteAddress)
     {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] remoteAddress is null");
+        OIC_LOG(ERROR, TAG, "remoteAddress is null");
         return false;
     }
-    jint index;
+
     jint length = u_arraylist_length(g_deviceStateList);
-    for (index = 0; index < length; index++)
+    for (jint index = 0; index < length; index++)
     {
+        CAEDRSocketInfo_t *socketInfo = (CAEDRSocketInfo_t *) u_arraylist_get(g_deviceObjectList,
+                                                                              index);
+        if (!socketInfo)
+        {
+            OIC_LOG(DEBUG, TAG, "socketInfo is null");
+            return false;
+        }
 
-        jobject jarrayObj = (jobject) u_arraylist_get(g_deviceObjectList, index);
+        jobject jarrayObj = socketInfo->deviceSocket;
         if (!jarrayObj)
         {
-            OIC_LOG(DEBUG, TAG, "[EDR][Native] jarrayObj is null");
+            OIC_LOG(DEBUG, TAG, "jarrayObj is null");
             return false;
         }
 
         jstring jni_setAddress = CAEDRNativeGetAddressFromDeviceSocket(env, jarrayObj);
         if (!jni_setAddress)
         {
-            OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_setAddress is null");
+            OIC_LOG(DEBUG, TAG, "jni_setAddress is null");
             return false;
         }
 
         const char* setAddress = (*env)->GetStringUTFChars(env, jni_setAddress, NULL);
         if (!setAddress)
         {
-            OIC_LOG(DEBUG, TAG, "[EDR][Native] setAddress is null");
+            OIC_LOG(DEBUG, TAG, "setAddress is null");
             return false;
         }
 
@@ -669,42 +656,35 @@ bool CAEDRNativeIsDeviceSocketInList(JNIEnv *env, const char* remoteAddress)
         }
     }
 
-    OIC_LOG(DEBUG, TAG, "there are no the Device obejct in list. we can add");
+    OIC_LOG(DEBUG, TAG, "there are no the Device obejct in list");
     return false;
 }
 
 void CAEDRNativeSocketCloseToAll(JNIEnv *env)
 {
-    OIC_LOG(DEBUG, TAG, "[EDR][Native] CAEDRNativeSocketCloseToAll");
+    OIC_LOG(DEBUG, TAG, "CAEDRNativeSocketCloseToAll");
 
     if (!g_deviceObjectList)
     {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] gdeviceObjectList is null");
-        return;
-    }
-
-    jclass jni_cid_BTSocket = (*env)->FindClass(env, CLASSPATH_BT_SOCKET);
-    if (!jni_cid_BTSocket)
-    {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] close: jni_cid_BTSocket is null");
+        OIC_LOG(ERROR, TAG, "gdeviceObjectList is null");
         return;
     }
 
-    jmethodID jni_mid_close = (*env)->GetMethodID(env, jni_cid_BTSocket, "close", "()V");
+    jmethodID jni_mid_close = CAGetJNIMethodID(env, CLASSPATH_BT_SOCKET,
+                                               "close", "()V");
     if (!jni_mid_close)
     {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] close: jni_mid_close is null");
+        OIC_LOG(ERROR, TAG, "jni_mid_close is null");
         return;
     }
 
-    jint index;
     jint length = u_arraylist_length(g_deviceStateList);
-    for (index = 0; index < length; index++)
+    for (jint index = 0; index < length; index++)
     {
         jobject jni_obj_socket = (jobject) u_arraylist_get(g_deviceObjectList, index);
         if (!jni_obj_socket)
         {
-            OIC_LOG(ERROR, TAG, "[EDR][Native] socket obj is null");
+            OIC_LOG(ERROR, TAG, "socket obj is null");
             return;
         }
 
@@ -712,7 +692,7 @@ void CAEDRNativeSocketCloseToAll(JNIEnv *env)
 
         if ((*env)->ExceptionCheck(env))
         {
-            OIC_LOG(ERROR, TAG, "[EDR][Native] close: close is Failed!!!");
+            OIC_LOG(ERROR, TAG, "close is Failed!!!");
             (*env)->ExceptionDescribe(env);
             (*env)->ExceptionClear(env);
             return;
@@ -726,21 +706,33 @@ void CAEDRNativeRemoveAllDeviceSocket(JNIEnv *env)
 
     if (!g_deviceObjectList)
     {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] gdeviceObjectList is null");
+        OIC_LOG(ERROR, TAG, "gdeviceObjectList is null");
         return;
     }
 
-    jint index;
     jint length = u_arraylist_length(g_deviceStateList);
-    for (index = 0; index < length; index++)
+    for (jint index = 0; index < length; index++)
     {
-        jobject jarrayObj = (jobject) u_arraylist_get(g_deviceObjectList, index);
-        if (!jarrayObj)
+
+        CAEDRSocketInfo_t *socketInfo = (CAEDRSocketInfo_t *) u_arraylist_get(g_deviceObjectList,
+                                                                              index);
+        if (!socketInfo)
         {
-            OIC_LOG(ERROR, TAG, "[EDR][Native] jarrayObj is null");
-            return;
+            OIC_LOG(ERROR, TAG, "socketInfo is null");
+            continue;
+        }
+
+        jobject jdeviceSocket = socketInfo->deviceSocket;
+        if (jdeviceSocket)
+        {
+            (*env)->DeleteGlobalRef(env, jdeviceSocket);
+        }
+
+        jobject jinputStream = socketInfo->inputStream;
+        if (jinputStream)
+        {
+            (*env)->DeleteGlobalRef(env, jinputStream);
         }
-        (*env)->DeleteGlobalRef(env, jarrayObj);
     }
 
     OICFree(g_deviceObjectList);
@@ -754,32 +746,39 @@ void CAEDRNativeRemoveDeviceSocket(JNIEnv *env, jobject deviceSocket)
 
     if (!g_deviceObjectList)
     {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] gdeviceObjectList is null");
+        OIC_LOG(ERROR, TAG, "gdeviceObjectList is null");
         return;
     }
 
-    jint index;
     jint length = u_arraylist_length(g_deviceStateList);
-    for (index = 0; index < length; index++)
+    for (jint index = 0; index < length; index++)
     {
-        jobject jarrayObj = (jobject) u_arraylist_get(g_deviceObjectList, index);
+        CAEDRSocketInfo_t *socketInfo = (CAEDRSocketInfo_t *) u_arraylist_get(g_deviceObjectList,
+                                                                              index);
+        if (!socketInfo)
+        {
+            OIC_LOG(ERROR, TAG, "socketInfo is null");
+            continue;
+        }
+
+        jobject jarrayObj = socketInfo->deviceSocket;
         if (!jarrayObj)
         {
-            OIC_LOG(DEBUG, TAG, "[EDR][Native] jarrayObj is null");
+            OIC_LOG(DEBUG, TAG, "jarrayObj is null");
             continue;
         }
 
         jstring jni_setAddress = CAEDRNativeGetAddressFromDeviceSocket(env, jarrayObj);
         if (!jni_setAddress)
         {
-            OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_setAddress is null");
+            OIC_LOG(DEBUG, TAG, "jni_setAddress is null");
             continue;
         }
 
         jstring jni_remoteAddress = CAEDRNativeGetAddressFromDeviceSocket(env, deviceSocket);
         if (!jni_remoteAddress)
         {
-            OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_remoteAddress is null");
+            OIC_LOG(DEBUG, TAG, "jni_remoteAddress is null");
             continue;
         }
 
@@ -788,8 +787,13 @@ void CAEDRNativeRemoveDeviceSocket(JNIEnv *env, jobject deviceSocket)
 
         if (!strcmp(setAddress, remoteAddress))
         {
-            OIC_LOG_V(DEBUG, TAG, "[EDR][Native] remove object : %s", remoteAddress);
+            OIC_LOG_V(DEBUG, TAG, "remove object : %s", remoteAddress);
             (*env)->DeleteGlobalRef(env, jarrayObj);
+            jobject jinputStream = socketInfo->inputStream;
+            if (jinputStream)
+            {
+                (*env)->DeleteGlobalRef(env, jinputStream);
+            }
             (*env)->ReleaseStringUTFChars(env, jni_setAddress, setAddress);
             (*env)->ReleaseStringUTFChars(env, jni_remoteAddress, remoteAddress);
 
@@ -800,7 +804,7 @@ void CAEDRNativeRemoveDeviceSocket(JNIEnv *env, jobject deviceSocket)
         (*env)->ReleaseStringUTFChars(env, jni_remoteAddress, remoteAddress);
     }
 
-    OIC_LOG(DEBUG, TAG, "[EDR][Native] there are no target object");
+    OIC_LOG(DEBUG, TAG, "there are no target object");
     return;
 }
 
@@ -810,25 +814,32 @@ void CAEDRNativeRemoveDeviceSocketBaseAddr(JNIEnv *env, jstring address)
 
     if (!g_deviceObjectList)
     {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] gdeviceObjectList is null");
+        OIC_LOG(ERROR, TAG, "gdeviceObjectList is null");
         return;
     }
 
-    jint index;
     jint length = u_arraylist_length(g_deviceStateList);
-    for (index = 0; index < length; index++)
+    for (jint index = 0; index < length; index++)
     {
-        jobject jarrayObj = (jobject) u_arraylist_get(g_deviceObjectList, index);
+        CAEDRSocketInfo_t *socketInfo = (CAEDRSocketInfo_t *) u_arraylist_get(g_deviceObjectList,
+                                                                              index);
+        if (!socketInfo)
+        {
+            OIC_LOG(ERROR, TAG, "socketInfo is null");
+            continue;
+        }
+
+        jobject jarrayObj = socketInfo->deviceSocket;
         if (!jarrayObj)
         {
-            OIC_LOG(DEBUG, TAG, "[EDR][Native] jarrayObj is null");
+            OIC_LOG(DEBUG, TAG, "jarrayObj is null");
             continue;
         }
 
         jstring jni_setAddress = CAEDRNativeGetAddressFromDeviceSocket(env, jarrayObj);
         if (!jni_setAddress)
         {
-            OIC_LOG(ERROR, TAG, "[EDR][Native] jni_setAddress is null");
+            OIC_LOG(ERROR, TAG, "jni_setAddress is null");
             continue;
         }
         const char* setAddress = (*env)->GetStringUTFChars(env, jni_setAddress, NULL);
@@ -836,8 +847,13 @@ void CAEDRNativeRemoveDeviceSocketBaseAddr(JNIEnv *env, jstring address)
 
         if (!strcmp(setAddress, remoteAddress))
         {
-            OIC_LOG_V(ERROR, TAG, "[EDR][Native] remove object : %s", remoteAddress);
+            OIC_LOG_V(DEBUG, TAG, "remove object : %s", remoteAddress);
             (*env)->DeleteGlobalRef(env, jarrayObj);
+            jobject jinputStream = socketInfo->inputStream;
+            if (jinputStream)
+            {
+                (*env)->DeleteGlobalRef(env, jinputStream);
+            }
             (*env)->ReleaseStringUTFChars(env, jni_setAddress, setAddress);
             (*env)->ReleaseStringUTFChars(env, address, remoteAddress);
 
@@ -848,22 +864,30 @@ void CAEDRNativeRemoveDeviceSocketBaseAddr(JNIEnv *env, jstring address)
         (*env)->ReleaseStringUTFChars(env, address, remoteAddress);
     }
 
-    OIC_LOG(DEBUG, TAG, "[EDR][Native] there are no target object");
+    OIC_LOG(DEBUG, TAG, "there are no target object");
     return;
 }
 
-jobject CAEDRNativeGetDeviceSocket(uint32_t idx)
+jobject CAEDRNativeGetDeviceSocket(uint32_t index)
 {
     if (!g_deviceObjectList)
     {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] gdeviceObjectList is null");
+        OIC_LOG(ERROR, TAG, "gdeviceObjectList is null");
+        return NULL;
+    }
+
+    CAEDRSocketInfo_t *socketInfo = (CAEDRSocketInfo_t *) u_arraylist_get(g_deviceObjectList,
+                                                                          index);
+    if (!socketInfo)
+    {
+        OIC_LOG(ERROR, TAG, "socketInfo is null");
         return NULL;
     }
 
-    jobject jarrayObj = (jobject) u_arraylist_get(g_deviceObjectList, idx);
+    jobject jarrayObj = socketInfo->deviceSocket;
     if (!jarrayObj)
     {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] jarrayObj is not available");
+        OIC_LOG(ERROR, TAG, "jarrayObj is not available");
         return NULL;
     }
     return jarrayObj;
@@ -875,32 +899,39 @@ jobject CAEDRNativeGetDeviceSocketBaseAddr(JNIEnv *env, const char* remoteAddres
 
     if (!g_deviceObjectList)
     {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] gdeviceObjectList is null");
+        OIC_LOG(ERROR, TAG, "gdeviceObjectList is null");
         return NULL;
     }
 
-    jint index;
     jint length = u_arraylist_length(g_deviceStateList);
-    for (index = 0; index < length; index++)
+    for (jint index = 0; index < length; index++)
     {
-        jobject jarrayObj = (jobject) u_arraylist_get(g_deviceObjectList, index);
+        CAEDRSocketInfo_t *socketInfo = (CAEDRSocketInfo_t *) u_arraylist_get(g_deviceObjectList,
+                                                                              index);
+        if (!socketInfo)
+        {
+            OIC_LOG(ERROR, TAG, "socketInfo is null");
+            continue;
+        }
+
+        jobject jarrayObj = socketInfo->deviceSocket;
         if (!jarrayObj)
         {
-            OIC_LOG(ERROR, TAG, "[EDR][Native] jarrayObj is null");
+            OIC_LOG(ERROR, TAG, "jarrayObj is null");
             continue;
         }
 
         jstring jni_setAddress = CAEDRNativeGetAddressFromDeviceSocket(env, jarrayObj);
         if (!jni_setAddress)
         {
-            OIC_LOG(ERROR, TAG, "[EDR][Native] jni_setAddress is null");
+            OIC_LOG(ERROR, TAG, "jni_setAddress is null");
             continue;
         }
         const char* setAddress = (*env)->GetStringUTFChars(env, jni_setAddress, NULL);
 
         if (!strcmp(setAddress, remoteAddress))
         {
-            OIC_LOG_V(ERROR, TAG, "[EDR][Native] remove object : %s", remoteAddress);
+            OIC_LOG_V(ERROR, TAG, "remove object : %s", remoteAddress);
             (*env)->ReleaseStringUTFChars(env, jni_setAddress, setAddress);
             (*env)->DeleteLocalRef(env, jni_setAddress);
             return jarrayObj;
@@ -912,15 +943,72 @@ jobject CAEDRNativeGetDeviceSocketBaseAddr(JNIEnv *env, const char* remoteAddres
     return NULL;
 }
 
+jobject CAEDRNativeGetInputStream(uint32_t index)
+{
+    if (!g_deviceObjectList)
+    {
+        OIC_LOG(ERROR, TAG, "gdeviceObjectList is null");
+        return NULL;
+    }
+
+    CAEDRSocketInfo_t *socketInfo = (CAEDRSocketInfo_t *) u_arraylist_get(g_deviceObjectList,
+                                                                          index);
+    if (!socketInfo)
+    {
+        OIC_LOG(ERROR, TAG, "socketInfo is null");
+        return NULL;
+    }
+
+    jobject jarrayObj = socketInfo->inputStream;
+    if (!jarrayObj)
+    {
+        OIC_LOG(ERROR, TAG, "jarrayObj is not available");
+        return NULL;
+    }
+    return jarrayObj;
+}
+
 uint32_t CAEDRGetSocketListLength()
 {
     if (!g_deviceObjectList)
     {
-        OIC_LOG(ERROR, TAG, "[EDR][Native] gdeviceObjectList is null");
+        OIC_LOG(ERROR, TAG, "gdeviceObjectList is null");
         return 0;
     }
 
-    uint32_t length = u_arraylist_length(g_deviceObjectList);
+    return u_arraylist_length(g_deviceObjectList);
+}
+
+CAConnectedDeviceInfo_t *CAEDRGetDeviceInfoFromAddress(const char *remoteAddress)
+{
+    OIC_LOG(DEBUG, TAG, "CAEDRGetDeviceInfoFromAddress");
+
+    if (!g_deviceStateList)
+    {
+        OIC_LOG(ERROR, TAG, "gdeviceStateList is null");
+        return NULL;
+    }
+    if (!remoteAddress)
+    {
+        OIC_LOG(ERROR, TAG, "remoteAddress is null");
+        return NULL;
+    }
+
+    jint length = u_arraylist_length(g_deviceStateList);
+    for (jint index = 0; index < length; index++)
+    {
+        CAConnectedDeviceInfo_t* deviceInfo =
+                (CAConnectedDeviceInfo_t*) u_arraylist_get(g_deviceStateList, index);
+        if (!deviceInfo)
+        {
+            OIC_LOG(DEBUG, TAG, "deviceInfo object is null");
+            continue;
+        }
 
-    return length;
+        if (!strcmp((const char*) deviceInfo->address, remoteAddress))
+        {
+            return deviceInfo;
+        }
+    }
+    return NULL;
 }