code clean up for android edr
[platform/upstream/iotivity.git] / resource / csdk / connectivity / src / bt_edr_adapter / android / caedrserver.c
index c842a26..3d4dcb6 100644 (file)
@@ -39,6 +39,7 @@
 static const char METHODID_OBJECTNONPARAM[] = "()Landroid/bluetooth/BluetoothAdapter;";
 static const char CLASSPATH_BT_ADPATER[] = "android/bluetooth/BluetoothAdapter";
 static const char CLASSPATH_BT_UUID[] = "java/util/UUID";
+static const char CLASSPATH_BT_SERVER_SOCKET[] = "android/bluetooth/BluetoothServerSocket";
 
 static ca_thread_pool_t g_threadPoolHandle = NULL;
 
@@ -51,11 +52,6 @@ static JavaVM *g_jvm;
 #define EDR_MAX_HEADER_LEN  6
 
 /**
- * server socket instance.
- */
-static jobject g_serverSocketObject = NULL;
-
-/**
  * Mutex to synchronize receive server.
  */
 static ca_mutex g_mutexReceiveServer = NULL;
@@ -559,7 +555,7 @@ CAResult_t CAEDRStopReceiveThread()
     return CA_STATUS_OK;
 }
 
-CAResult_t CAEDRNativeReadData(JNIEnv *env, uint32_t id)
+CAResult_t CAEDRNativeReadData(JNIEnv *env, uint32_t idx)
 {
     if ((*env)->ExceptionCheck(env))
     {
@@ -569,60 +565,36 @@ CAResult_t CAEDRNativeReadData(JNIEnv *env, uint32_t id)
         return CA_STATUS_FAILED;
     }
 
-    // check whether this socket object is connected or not.
-    jobject jni_obj_socket = CAEDRNativeGetDeviceSocket(id);
-    if (!jni_obj_socket)
-    {
-        return CA_STATUS_INVALID_PARAM;
-    }
-
-    // start to read through InputStream
-    jclass jni_cid_BTsocket = (*env)->FindClass(env, "android/bluetooth/BluetoothSocket");
-    if (!jni_cid_BTsocket)
-    {
-        OIC_LOG(ERROR, TAG, "jni_cid_BTsocket is null");
-        return CA_STATUS_FAILED;
-    }
-    jmethodID jni_mid_getInputStream = (*env)->GetMethodID(env, jni_cid_BTsocket,
-                                                           "getInputStream",
-                                                           "()Ljava/io/InputStream;");
-
-    jobject jni_obj_inputStream = (*env)->CallObjectMethod(env, jni_obj_socket,
-                                                           jni_mid_getInputStream);
+    jobject jni_obj_inputStream = CAEDRNativeGetInputStream(idx);
     if (!jni_obj_inputStream)
     {
         OIC_LOG(ERROR, TAG, "jni_obj_inputStream is null");
-        (*env)->DeleteLocalRef(env, jni_cid_BTsocket);
         return CA_STATUS_FAILED;
     }
 
-    jclass jni_cid_InputStream = (*env)->FindClass(env, "java/io/InputStream");
-    if (!jni_cid_InputStream)
-    {
-        OIC_LOG(ERROR, TAG, "jni_cid_InputStream is null");
-        (*env)->DeleteLocalRef(env, jni_obj_inputStream);
-        (*env)->DeleteLocalRef(env, jni_cid_BTsocket);
-        return CA_STATUS_FAILED;
-    }
-
-    jmethodID jni_mid_available = (*env)->GetMethodID(env, jni_cid_InputStream,
-                                                      "available", "()I");
+    jmethodID jni_mid_available = CAGetJNIMethodID(env, "java/io/InputStream", "available", "()I");
     if (!jni_mid_available)
     {
         OIC_LOG(ERROR, TAG, "jni_mid_available is null");
-        goto exit;
+        return CA_STATUS_FAILED;
     }
 
     jint available = (*env)->CallIntMethod(env, jni_obj_inputStream, jni_mid_available);
 
-    CAConnectedDeviceInfo_t *deviceInfo = NULL;
     if (0 < available)
     {
+        jobject jni_obj_socket = CAEDRNativeGetDeviceSocket(idx);
+        if (!jni_obj_socket)
+        {
+            OIC_LOG(ERROR, TAG, "jni_obj_socket is null");
+            return CA_STATUS_FAILED;
+        }
+
         jstring jni_str_address = CAEDRNativeGetAddressFromDeviceSocket(env, jni_obj_socket);
         if (!jni_str_address)
         {
             OIC_LOG(ERROR, TAG, "jni_str_address is null");
-            goto exit;
+            return CA_STATUS_FAILED;
         }
 
         const char* address = (*env)->GetStringUTFChars(env, jni_str_address, NULL);
@@ -630,31 +602,21 @@ CAResult_t CAEDRNativeReadData(JNIEnv *env, uint32_t id)
         {
             OIC_LOG(ERROR, TAG, "address is null");
             (*env)->DeleteLocalRef(env, jni_str_address);
-            goto exit;
-        }
-
-        OIC_LOG_V(DEBUG, TAG, "get InputStream..%d, %s", id, address);
-        jmethodID jni_mid_read = (*env)->GetMethodID(env, jni_cid_InputStream,
-                                                     "read", "([BII)I");
-        if (!jni_mid_read)
-        {
-            OIC_LOG(ERROR, TAG, "jni_mid_read is null");
-            (*env)->ReleaseStringUTFChars(env, jni_str_address, address);
-            (*env)->DeleteLocalRef(env, jni_str_address);
-            goto exit;
+            return CA_STATUS_FAILED;
         }
 
-        deviceInfo = (CAConnectedDeviceInfo_t *) CAEDRGetDeviceInfoFromAddress(address);
+        CAConnectedDeviceInfo_t *deviceInfo =
+                (CAConnectedDeviceInfo_t *) CAEDRGetDeviceInfoFromAddress(address);
         if (!deviceInfo)
         {
             OIC_LOG(ERROR, TAG, "failed to get device info from list");
             (*env)->ReleaseStringUTFChars(env, jni_str_address, address);
             (*env)->DeleteLocalRef(env, jni_str_address);
-            goto exit;
+            return CA_STATUS_FAILED;
         }
 
-        jint bufSize = (deviceInfo->totalDataLen == 0) ?
-                EDR_MAX_HEADER_LEN : deviceInfo->totalDataLen;
+        jint bufSize = (deviceInfo->totalDataLen == 0) ? EDR_MAX_HEADER_LEN
+                                                       : deviceInfo->totalDataLen;
         if (!deviceInfo->recvData)
         {
             deviceInfo->recvData = OICCalloc(1, bufSize);
@@ -663,30 +625,50 @@ CAResult_t CAEDRNativeReadData(JNIEnv *env, uint32_t id)
                 OIC_LOG(ERROR, TAG, "out of memory");
                 (*env)->ReleaseStringUTFChars(env, jni_str_address, address);
                 (*env)->DeleteLocalRef(env, jni_str_address);
-                goto exit;
+                return CA_STATUS_FAILED;
             }
         }
 
-        jbyteArray jbuf = (*env)->NewByteArray(env, (jint) bufSize - deviceInfo->recvDataLen);
+        jint remainSize = (jint) bufSize - deviceInfo->recvDataLen;
+        if (0 >= remainSize)
+        {
+            OIC_LOG(ERROR, TAG, "remainSize value is invalid.");
+            (*env)->ReleaseStringUTFChars(env, jni_str_address, address);
+            (*env)->DeleteLocalRef(env, jni_str_address);
+            return CA_STATUS_FAILED;
+        }
+
+        jbyteArray jbuf = (*env)->NewByteArray(env, remainSize);
         if (!jbuf)
         {
             OIC_LOG(ERROR, TAG, "jbuf is null");
             (*env)->ReleaseStringUTFChars(env, jni_str_address, address);
             (*env)->DeleteLocalRef(env, jni_str_address);
-            goto exit;
+            return CA_STATUS_FAILED;
         }
 
+        jmethodID jni_mid_read = CAGetJNIMethodID(env, "java/io/InputStream", "read", "([BII)I");
+        if (!jni_mid_read)
+        {
+            OIC_LOG(ERROR, TAG, "jni_mid_read is null");
+            (*env)->DeleteLocalRef(env, jbuf);
+            (*env)->ReleaseStringUTFChars(env, jni_str_address, address);
+            (*env)->DeleteLocalRef(env, jni_str_address);
+            return CA_STATUS_FAILED;
+        }
+
+        OIC_LOG_V(DEBUG, TAG, "read InputStream (idx:%d, addr:%s)", idx, address);
         jint recvLen = (*env)->CallIntMethod(env, jni_obj_inputStream, jni_mid_read,
-                                             jbuf, (jint) 0,
-                                             (jint) bufSize - deviceInfo->recvDataLen);
+                                             jbuf, (jint) 0, remainSize);
         if (-1 == recvLen)
         {
             OIC_LOG(ERROR, TAG, "recvLen is -1");
             (*env)->DeleteLocalRef(env, jbuf);
             (*env)->ReleaseStringUTFChars(env, jni_str_address, address);
             (*env)->DeleteLocalRef(env, jni_str_address);
-            goto exit;
+            return CA_STATUS_FAILED;
         }
+        OIC_LOG_V(DEBUG, TAG, "read success (length: %d bytes)", recvLen);
 
         jbyte* buf = (*env)->GetByteArrayElements(env, jbuf, NULL);
         if (!buf)
@@ -695,12 +677,13 @@ CAResult_t CAEDRNativeReadData(JNIEnv *env, uint32_t id)
             (*env)->DeleteLocalRef(env, jbuf);
             (*env)->ReleaseStringUTFChars(env, jni_str_address, address);
             (*env)->DeleteLocalRef(env, jni_str_address);
-            goto exit;
+            return CA_STATUS_FAILED;
         }
         memcpy(deviceInfo->recvData + deviceInfo->recvDataLen, (const char*) buf, recvLen);
         deviceInfo->recvDataLen += recvLen;
 
-        OIC_LOG(DEBUG, TAG, "read something from InputStream");
+        (*env)->ReleaseByteArrayElements(env, jbuf, buf, 0);
+        (*env)->DeleteLocalRef(env, jbuf);
 
         if (!deviceInfo->totalDataLen)
         {
@@ -717,11 +700,9 @@ CAResult_t CAEDRNativeReadData(JNIEnv *env, uint32_t id)
                 if (!newBuf)
                 {
                     OIC_LOG(ERROR, TAG, "out of memory");
-                    (*env)->ReleaseByteArrayElements(env, jbuf, buf, 0);
-                    (*env)->DeleteLocalRef(env, jbuf);
                     (*env)->ReleaseStringUTFChars(env, jni_str_address, address);
                     (*env)->DeleteLocalRef(env, jni_str_address);
-                    goto exit;
+                    return CA_STATUS_FAILED;
                 }
                 deviceInfo->recvData = newBuf;
             }
@@ -741,17 +722,15 @@ CAResult_t CAEDRNativeReadData(JNIEnv *env, uint32_t id)
                 CAEDRUpdateDeviceState(STATE_DISCONNECTED, address);
                 ca_mutex_unlock(g_mutexStateList);
 
-                (*env)->ReleaseByteArrayElements(env, jbuf, buf, 0);
-                (*env)->DeleteLocalRef(env, jbuf);
                 (*env)->ReleaseStringUTFChars(env, jni_str_address, address);
                 (*env)->DeleteLocalRef(env, jni_str_address);
-                goto exit;
+                return CA_STATUS_FAILED;
             }
 
             if (g_edrPacketReceivedCallback)
             {
-                OIC_LOG_V(DEBUG, TAG,"data will be sent to callback routine: \
-                          %s, %d", deviceInfo->recvData, deviceInfo->recvDataLen);
+                OIC_LOG_V(DEBUG, TAG, "data will be sent to callback routine: %s, %d",
+                          deviceInfo->recvData, deviceInfo->recvDataLen);
 
                 uint32_t sentLength = 0;
                 g_edrPacketReceivedCallback(address, (void*) deviceInfo->recvData,
@@ -763,23 +742,12 @@ CAResult_t CAEDRNativeReadData(JNIEnv *env, uint32_t id)
                 deviceInfo->totalDataLen = 0;
             }
         }
-        (*env)->ReleaseByteArrayElements(env, jbuf, buf, 0);
-        (*env)->DeleteLocalRef(env, jbuf);
+
         (*env)->ReleaseStringUTFChars(env, jni_str_address, address);
         (*env)->DeleteLocalRef(env, jni_str_address);
     }
-    (*env)->DeleteLocalRef(env, jni_cid_InputStream);
-    (*env)->DeleteLocalRef(env, jni_obj_inputStream);
-    (*env)->DeleteLocalRef(env, jni_cid_BTsocket);
 
     return CA_STATUS_OK;
-
-exit:
-    (*env)->DeleteLocalRef(env, jni_cid_InputStream);
-    (*env)->DeleteLocalRef(env, jni_obj_inputStream);
-    (*env)->DeleteLocalRef(env, jni_cid_BTsocket);
-
-    return CA_STATUS_FAILED;
 }
 
 void CANativeStartListenTask(JNIEnv *env)
@@ -886,8 +854,6 @@ jobject CAEDRNativeListen(JNIEnv *env)
         return NULL;
     }
 
-    g_serverSocketObject = (*env)->NewGlobalRef(env, jni_obj_BTServerSocket);
-
     OIC_LOG(DEBUG, TAG, "CAEDRNativeListen - OUT");
 
     return jni_obj_BTServerSocket;
@@ -899,16 +865,9 @@ void CAEDRNativeAccept(JNIEnv *env, jobject serverSocketObject)
 
     if (NULL != serverSocketObject)
     {
-        jclass jni_cid_BTServerSocket = (*env)->FindClass(
-                env, "android/bluetooth/BluetoothServerSocket");
-        if (!jni_cid_BTServerSocket)
-        {
-            OIC_LOG(ERROR, TAG, "jni_cid_BTServerSocket is null");
-            return;
-        }
-
-        jmethodID jni_mid_accept = (*env)->GetMethodID(env, jni_cid_BTServerSocket, "accept",
-                                                       "()Landroid/bluetooth/BluetoothSocket;");
+        jmethodID jni_mid_accept = CAGetJNIMethodID(env, CLASSPATH_BT_SERVER_SOCKET,
+                                                    "accept",
+                                                    "()Landroid/bluetooth/BluetoothSocket;");
         if (!jni_mid_accept)
         {
             OIC_LOG(ERROR, TAG, "jni_mid_accept is null");
@@ -941,13 +900,8 @@ void CAEDRNativeAccept(JNIEnv *env, jobject serverSocketObject)
         }
 
         const char* address = (*env)->GetStringUTFChars(env, j_str_address, NULL);
-        OIC_LOG_V(DEBUG, TAG, "received the connection request from [%s]", address);
 
-        // set socket to list
-        jobject jni_socket = (*env)->NewGlobalRef(env, jni_obj_BTSocket);
-        ca_mutex_lock(g_mutexObjectList);
-        CAEDRNativeAddDeviceSocketToList(env, jni_socket);
-        ca_mutex_unlock(g_mutexObjectList);
+        OIC_LOG_V(INFO, TAG, "accept a new connection from [%s]", address);
 
         // update state
         ca_mutex_lock(g_mutexStateList);
@@ -957,7 +911,21 @@ void CAEDRNativeAccept(JNIEnv *env, jobject serverSocketObject)
         (*env)->ReleaseStringUTFChars(env, j_str_address, address);
         (*env)->DeleteLocalRef(env, j_str_address);
 
-        OIC_LOG_V(DEBUG, TAG, "connected with [%s]", address);
+        // set socket to list
+        jobject jni_socket = (*env)->NewGlobalRef(env, jni_obj_BTSocket);
+        if (!jni_socket)
+        {
+            OIC_LOG(ERROR, TAG, "jni_socket is null");
+            (*env)->DeleteLocalRef(env, jni_obj_BTSocket);
+            return;
+        }
+
+        ca_mutex_lock(g_mutexObjectList);
+        CAEDRNativeAddDeviceSocketToList(env, jni_socket);
+        ca_mutex_unlock(g_mutexObjectList);
+
+        (*env)->DeleteGlobalRef(env, jni_socket);
+        (*env)->DeleteLocalRef(env, jni_obj_BTSocket);
     }
     else
     {
@@ -976,22 +944,15 @@ void CAEDRNatvieCloseServerTask(JNIEnv* env)
     {
         OIC_LOG(DEBUG, TAG, "Accept Resource will be close");
 
-        jclass jni_cid_BTServerSocket = (*env)->FindClass(
-                env, "android/bluetooth/BluetoothServerSocket");
-        if (!jni_cid_BTServerSocket)
+        jmethodID jni_mid_close = CAGetJNIMethodID(env, CLASSPATH_BT_SERVER_SOCKET,
+                                                   "close", "()V");
+        if (!jni_mid_close)
         {
-            OIC_LOG(ERROR, TAG, "jni_cid_BTServerSocket is null");
+            OIC_LOG(ERROR, TAG, "jni_mid_close is null");
             return;
         }
 
-        jmethodID jni_mid_accept = (*env)->GetMethodID(env, jni_cid_BTServerSocket,
-                                                       "close", "()V");
-        if (!jni_mid_accept)
-        {
-            OIC_LOG(ERROR, TAG, "jni_mid_accept is null");
-            return;
-        }
-        (*env)->CallVoidMethod(env, g_serverSocket, jni_mid_accept);
+        (*env)->CallVoidMethod(env, g_serverSocket, jni_mid_close);
         (*env)->DeleteGlobalRef(env, g_serverSocket);
         g_serverSocket = NULL;