5 #include "caedrinterface.h"
6 #include "caedrutils.h"
7 #include "caedrserver.h"
9 #include "oic_malloc.h"
10 #include "uthreadpool.h" /* for thread pool */
12 #include "uarraylist.h"
13 #include "caadapterutils.h"
14 #include "com_iotivity_jar_CAEDRInterface.h"
17 #define TAG PCF("CA_EDR_SERVER")
19 static const char *METHODID_OBJECTNONPARAM = "()Landroid/bluetooth/BluetoothAdapter;";
20 static const char *CLASSPATH_BT_ADPATER = "android/bluetooth/BluetoothAdapter";
21 static const char *CLASSPATH_BT_UUID = "java/util/UUID";
23 static const uint32_t STATE_CONNECTED = 1;
24 static const uint32_t STATE_DISCONNECTED = 0;
26 static const uint32_t MAX_PDU_BUFFER = 1024;
27 static const uint32_t MAX_CONNECTED_BT_SUPPORT_CNT = 7;
29 static u_thread_pool_t gThreadPoolHandle = NULL;
32 static jobject gContext;
35 * @var gMutexSocketListManager
36 * @brief Mutex to synchronize socket list update
38 static u_mutex gMutexSocketListManager;
40 // server socket instance
41 static jobject gServerSocketObject = NULL;
44 * @var gMutexUnicastServer
45 * @brief Mutex to synchronize unicast server
47 static u_mutex gMutexUnicastServer = NULL;
51 * @brief Flag to control the Receive Unicast Data Thread
53 static bool gStopUnicast = FALSE;
56 * @var gMutexMulticastServer
57 * @brief Mutex to synchronize secure multicast server
59 static u_mutex gMutexMulticastServer = NULL;
62 * @var gMutexMulticastServer
63 * @brief Mutex to synchronize multicast receiver
65 static u_mutex gMutexReceiver = NULL;
69 * @brief Flag to control the Receive Multicast Data Thread
71 static bool gStopMulticast = FALSE;
75 * @brief Flag to control the Accept Thread
77 static bool gStopAccept = FALSE;
80 static jobject gInputStream = NULL;
82 static jobject gSeverSocket = NULL;
84 typedef struct send_data {
91 @brief Thread context information for unicast, multicast and secured unicast server
96 CAAdapterServerType_t type;
97 } CAAdapterReceiveThreadContext_t;
102 } CAAdapterAcceptThreadContext_t;
105 * @var gEDRNetworkChangeCallback
106 * @brief Maintains the callback to be notified when data received from remote Bluetooth device
108 static CAEDRDataReceivedCallback gEDRPacketReceivedCallback = NULL;
110 static void CAReceiveHandler(void *data)
112 OIC_LOG(DEBUG, TAG, "IN - CAReceiveHandler..");
114 VERIFY_NON_NULL_VOID(data, TAG, "Invalid thread context");
116 jboolean isAttached = FALSE;
118 jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
121 OIC_LOG_V(DEBUG, TAG, "CAReceiveHandler - Could not get JNIEnv pointer");
122 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
126 OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
132 CAAdapterReceiveThreadContext_t *ctx = (CAAdapterReceiveThreadContext_t *)data;
134 while (TRUE != *(ctx->stopFlag))
138 // if new socket object is added in socket list after below logic is ran.
139 // new socket will be started to read after next while loop
140 uint32_t length = CAEDRGetSocketListLength();
143 OIC_LOG_V(DEBUG, TAG, "socket list is empty");
147 for(idx = 0 ; idx < length ; idx++)
149 OIC_LOG_V(DEBUG, TAG, "start CAEDRNativeReadData");
150 CAEDRNativeReadData(env, idx, ctx->type);
156 (*g_jvm)->DetachCurrentThread(g_jvm);
161 OIC_LOG(DEBUG, TAG, "OUT - CAReceiveHandler");
164 static void CAAcceptHandler(void *data)
168 OIC_LOG(DEBUG, TAG, "[EDR] AcceptThread start");
170 jboolean isAttached = FALSE;
172 jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
175 OIC_LOG_V(DEBUG, TAG, "CAAcceptHandler - Could not get JNIEnv pointer");
176 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
180 OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
186 jobject jni_obj_BTSeverSocket = CAEDRNativeListen(env);
187 if(!jni_obj_BTSeverSocket) {
188 OIC_LOG(DEBUG, TAG, "[EDR] AcceptThread: jni_obj_BTSeverSocket is null");
191 (*g_jvm)->DetachCurrentThread(g_jvm);
196 gSeverSocket = (*env)->NewGlobalRef(env, jni_obj_BTSeverSocket);
198 CAAdapterAcceptThreadContext_t *ctx = (CAAdapterAcceptThreadContext_t *)data;
202 OIC_LOG(DEBUG, TAG, "[EDR] AcceptThread: ctx is null");
206 // it should be initialized for restart accept thread
209 while (TRUE != *(ctx->stopFlag))
211 OIC_LOG(DEBUG, TAG, "[EDR] AcceptThread running");
213 // when BT state is changed with Off. its thread will be stopped
214 if(!CAEDRNativeIsEnableBTAdapter(env))
216 OIC_LOG(DEBUG, TAG, "BT adpater is not enable");
222 CAEDRNativeAccept(env, gSeverSocket);
227 (*g_jvm)->DetachCurrentThread(g_jvm);
232 OIC_LOG(DEBUG, TAG, "[EDR] AcceptThread finish");
238 * implement for adapter common method
240 CAResult_t CAEDRServerStart(const char *serviceUUID, int32_t *serverFD, u_thread_pool_t handle)
242 OIC_LOG_V(DEBUG, TAG, "IN");
243 CAEDRServerInitialize(handle);
245 CAEDRStartUnicastServer(NULL, FALSE);
248 OIC_LOG_V(DEBUG, TAG, "OUT");
252 CAResult_t CAEDRServerStop(const int32_t serverFD)
254 OIC_LOG_V(DEBUG, TAG, "IN");
255 CAEDRStopUnicastServer(-1);
256 CAEDRStopMulticastServer(-1);
257 CAEDRServerTerminate();
258 OIC_LOG_V(DEBUG, TAG, "OUT");
262 void CAEDRSetPacketReceivedCallback(CAEDRDataReceivedCallback packetReceivedCallback)
264 gEDRPacketReceivedCallback = packetReceivedCallback;
270 static void CAEDRServerDestroyMutex()
272 OIC_LOG(DEBUG, TAG, "IN");
274 if (gMutexUnicastServer)
276 u_mutex_free(gMutexUnicastServer);
277 gMutexUnicastServer = NULL;
284 if (gMutexMulticastServer)
286 u_mutex_free(gMutexMulticastServer);
287 gMutexMulticastServer = NULL;
290 if(gMutexSocketListManager)
292 u_mutex_free(gMutexSocketListManager);
293 gMutexSocketListManager = NULL;
296 OIC_LOG(DEBUG, TAG, "OUT");
303 static CAResult_t CAEDRServerCreateMutex()
305 OIC_LOG(DEBUG, TAG, "IN");
307 gMutexUnicastServer = u_mutex_new();
308 if (!gMutexUnicastServer)
310 OIC_LOG(ERROR, TAG, "Failed to created mutex!");
311 return CA_STATUS_FAILED;
318 gMutexMulticastServer = u_mutex_new();
319 if (!gMutexMulticastServer)
321 OIC_LOG(ERROR, TAG, "Failed to created mutex!");
323 CAEDRServerDestroyMutex();
324 return CA_STATUS_FAILED;
327 gMutexSocketListManager = u_mutex_new();
328 if (!gMutexSocketListManager)
330 OIC_LOG(ERROR, TAG, "Failed to created mutex!");
332 CAEDRServerDestroyMutex();
333 return CA_STATUS_FAILED;
336 OIC_LOG(DEBUG, TAG, "OUT");
340 void CAEDRServerJniInit()
342 OIC_LOG_V(DEBUG, TAG, "CAEDRServerJniInit");
343 g_jvm = CANativeJNIGetJavaVM();
346 void CAEDRServerInitialize(u_thread_pool_t handle)
348 OIC_LOG(DEBUG, TAG, "CAEDRServerInitialize");
350 gThreadPoolHandle = handle;
352 CAEDRServerStartAccpetThread();
354 OIC_LOG(DEBUG, TAG, "OUT");
357 void CAEDRServerStartAccpetThread()
359 CAEDRServerJniInit();
362 CAEDRServerCreateMutex();
364 jboolean isAttached = FALSE;
366 jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
369 OIC_LOG_V(DEBUG, TAG, "CAEDRServerInitialize - Could not get JNIEnv pointer");
370 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
374 OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
380 jstring jni_address = CAEDRNativeGetLocalDeviceAddress(env);
383 const char* localAddress = (*env)->GetStringUTFChars(env, jni_address, NULL);
384 OIC_LOG_V(DEBUG, TAG, "My BT Address is %s", localAddress);
387 CAEDRNativeCreateDeviceStateList();
388 CAEDRNativeCreateDeviceSocketList();
391 (*g_jvm)->DetachCurrentThread(g_jvm);
393 CAAdapterReceiveThreadContext_t *ctx = (CAAdapterReceiveThreadContext_t *)
394 OICMalloc(sizeof(CAAdapterReceiveThreadContext_t));
397 OIC_LOG(ERROR, TAG, "Out of memory!");
401 ctx->stopFlag = &gStopAccept;
402 if (CA_STATUS_OK != u_thread_pool_add_task(gThreadPoolHandle, CAAcceptHandler, (void *)ctx))
404 OIC_LOG(ERROR, TAG, "Failed to create read thread!");
405 OICFree((void *)ctx);
410 void CAEDRServerTerminate()
412 OIC_LOG(DEBUG, TAG, "CAEDRServerTerminate");
414 jboolean isAttached = FALSE;
416 jint res = (*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_6);
419 OIC_LOG_V(DEBUG, TAG, "CAEDRServerTerminate - Could not get JNIEnv pointer");
420 res = (*g_jvm)->AttachCurrentThread(g_jvm, &env, NULL);
424 OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
431 gStopMulticast = TRUE;
434 CAEDRNatvieCloseServerTask(env);
436 CAEDRNativeSocketCloseToAll(env);
439 CAEDRServerDestroyMutex();
441 CAEDRNativeRemoveAllDeviceState();
442 CAEDRNativeRemoveAllDeviceSocket(env);
445 (*g_jvm)->DetachCurrentThread(g_jvm);
448 int32_t CAEDRStartUnicastServer(const char* address, bool isSecured)
450 OIC_LOG_V(DEBUG, TAG, "CAEDRStartUnicastServer(%s)", address);
452 u_mutex_lock(gMutexUnicastServer);
455 * The task to listen for data from unicast is added to the thread pool.
456 * This is a blocking call is made where we try to receive some data..
457 * We will keep waiting until some data is received.
458 * This task will be terminated when thread pool is freed on stopping the adapters.
459 * Thread context will be freed by thread on exit.
461 CAAdapterReceiveThreadContext_t *ctx = (CAAdapterReceiveThreadContext_t *)
462 OICMalloc(sizeof(CAAdapterReceiveThreadContext_t));
465 OIC_LOG(ERROR, TAG, "Out of memory!");
466 u_mutex_unlock(gMutexUnicastServer);
467 return CA_MEMORY_ALLOC_FAILED;
470 ctx->stopFlag = &gStopUnicast;
471 ctx->type = isSecured ? CA_SECURED_UNICAST_SERVER : CA_UNICAST_SERVER;
472 if (CA_STATUS_OK != u_thread_pool_add_task(gThreadPoolHandle, CAReceiveHandler, (void *)ctx))
474 OIC_LOG(ERROR, TAG, "Failed to create read thread!");
475 u_mutex_unlock(gMutexUnicastServer);
476 OICFree((void *)ctx);
477 return CA_STATUS_FAILED;
479 u_mutex_unlock(gMutexUnicastServer);
481 OIC_LOG(DEBUG, TAG, "OUT");
485 int32_t CAEDRStartMulticastServer(bool isSecured)
487 OIC_LOG_V(DEBUG, TAG, "CAEDRStartMulticastServer");
489 u_mutex_lock(gMutexMulticastServer);
492 * The task to listen to data from multicast socket is added to the thread pool.
493 * This is a blocking call is made where we try to receive some data.
494 * We will keep waiting until some data is received.
495 * This task will be terminated when thread pool is freed on stopping the adapters.
496 * Thread context will be freed by thread on exit.
498 CAAdapterReceiveThreadContext_t *ctx = (CAAdapterReceiveThreadContext_t *)
499 OICMalloc(sizeof(CAAdapterReceiveThreadContext_t));
502 OIC_LOG(ERROR, TAG, "Out of memory!");
503 u_mutex_unlock(gMutexMulticastServer);
505 return CA_MEMORY_ALLOC_FAILED;
508 ctx->stopFlag = &gStopMulticast;
509 ctx->type = CA_MULTICAST_SERVER;
511 gStopMulticast = FALSE;
512 if (CA_STATUS_OK != u_thread_pool_add_task(gThreadPoolHandle, CAReceiveHandler, (void *)ctx))
514 OIC_LOG(ERROR, TAG, "thread_pool_add_task failed!");
516 gStopMulticast = TRUE;
517 u_mutex_unlock(gMutexMulticastServer);
519 return CA_STATUS_FAILED;
521 u_mutex_unlock(gMutexMulticastServer);
523 OIC_LOG(DEBUG, TAG, "OUT");
527 int32_t CAEDRStopUnicastServer(int32_t serverID)
529 OIC_LOG(DEBUG, TAG, "CAEDRStopUnicastServer");
531 u_mutex_lock(gMutexUnicastServer);
533 u_mutex_unlock(gMutexUnicastServer);
538 int32_t CAEDRStopMulticastServer(int32_t serverID)
540 OIC_LOG(DEBUG, TAG, "CAEDRStopMulticastServer");
542 u_mutex_lock(gMutexMulticastServer);
543 gStopMulticast = true;
544 u_mutex_unlock(gMutexMulticastServer);
546 OIC_LOG_V(INFO, TAG, "Multicast server stopped");
551 uint32_t CAEDRNativeReadData(JNIEnv *env, uint32_t id, CAAdapterServerType_t type)
553 if(!CAEDRNativeIsEnableBTAdapter(env))
555 OIC_LOG(DEBUG, TAG, "BT adpater is not enable");
559 if(!((*env)->ExceptionCheck(env)))
561 // check whether this socket object is connected or not.
562 jobject jni_obj_socket = CAEDRNativeGetDeviceSocket(id);
568 jstring jni_str_address = CAEDRNativeGetAddressFromDeviceSocket(env, jni_obj_socket);
569 const char* address = (*env)->GetStringUTFChars(env, jni_str_address, NULL);
571 // check it whether is still connected or not through google api
572 jboolean ret = CAEDRIsConnectedForSocket(env, jni_obj_socket);
575 OIC_LOG(DEBUG, TAG, "[EDR][Native] this device is not connected now...let close socket");
578 // check it whether is still connected or not through socket state list
579 if(STATE_DISCONNECTED == CAEDRIsConnectedDevice(address))
581 OIC_LOG(DEBUG, TAG, "[EDR][Native] btReadData: it is not connected yet..");
583 // remove socket to list
584 // this code is related to below read fail exception code
585 CAEDRNativeRemoveDeviceSocket(env, jni_obj_socket);
590 // start to read through InputStream
591 jclass jni_cid_BTsocket = (*env)->FindClass(env, "android/bluetooth/BluetoothSocket");
592 jmethodID jni_mid_getInputStream = (*env)->GetMethodID(env, jni_cid_BTsocket, "getInputStream", "()Ljava/io/InputStream;");
593 OIC_LOG_V(DEBUG, TAG, "[EDR][Native] btReadData: get InputStream..%d, %s", id, address);
597 OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_obj_socket is not available anymore..");
601 jobject jni_obj_inputStream = (*env)->CallObjectMethod(env, jni_obj_socket, jni_mid_getInputStream);
602 OIC_LOG(DEBUG, TAG, "[EDR][Native] btReadData: ready inputStream...");
604 gInputStream = (*env)->NewGlobalRef(env, jni_obj_inputStream);
606 jclass jni_cid_InputStream = (*env)->FindClass(env, "java/io/InputStream");
607 jmethodID jni_mid_read = (*env)->GetMethodID(env, jni_cid_InputStream, "read", "([BII)I");
609 jbyteArray jbuf = (*env)->NewByteArray(env, MAX_PDU_BUFFER);
614 OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_obj_socket is not available anymore...");
618 nread = (*env)->CallIntMethod(env, gInputStream, jni_mid_read, jbuf, (jint)0, MAX_PDU_BUFFER);
620 OIC_LOG(DEBUG, TAG, "[EDR][Native] read something from InputStream");
624 OIC_LOG(DEBUG, TAG, "[EDR][Native] read buffer is empty...");
628 if((*env)->ExceptionCheck(env))
630 OIC_LOG(DEBUG, TAG, "[EDR][Native] btReadData: read Error!!!");
631 (*env)->ExceptionDescribe(env);
632 (*env)->ExceptionClear(env);
634 // update state to disconnect
635 // the socket will be close next read thread routine
636 CAEDRUpdateDeviceState(STATE_DISCONNECTED, address);
640 OIC_LOG_V(DEBUG, TAG, "[EDR][Native] btReadData: reading");
641 jbyte* buf = (*env)->GetByteArrayElements(env, jbuf, NULL);
647 jint length = strlen((char*)buf);
648 OIC_LOG_V(DEBUG, TAG, "[EDR][Native] btReadData: read %s, %d", buf, length);
650 char responseData[MAX_PDU_BUFFER];
651 memset(responseData, 0, MAX_PDU_BUFFER);
652 strncpy(responseData, (char*)buf, length);
653 responseData[length] = '\0';
657 case CA_UNICAST_SERVER:
658 case CA_MULTICAST_SERVER:
659 // Notify data to upper layer
660 if (gEDRPacketReceivedCallback)
662 // u_mutex_lock(gMutexSocketListManager);
663 uint32_t sentLength = 0;
664 OIC_LOG_V(DEBUG, TAG, "[EDR][Native] data will be sent to callback routine: %s, %d", responseData, length);
666 gEDRPacketReceivedCallback(address, (void*)responseData, length, &sentLength);
667 // u_mutex_unlock(gMutexSocketListManager);
671 case CA_SECURED_UNICAST_SERVER:
673 #endif //__WITH_DTLS__
675 // Should never occur
676 OIC_LOG_V(DEBUG, TAG, "Invalid server type");
679 (*env)->ReleaseByteArrayElements(env, jbuf, buf, 0);
683 (*env)->ExceptionDescribe(env);
684 (*env)->ExceptionClear(env);
685 OIC_LOG(DEBUG, TAG, "[EDR][Native] btReadData: env error!!");
692 jboolean CAEDRIsConnectedForSocket(JNIEnv *env, jobject socket)
694 OIC_LOG(DEBUG, TAG, "[EDR][Native] CAEDRIsConnectedForSocket...");
696 if(!CAEDRNativeIsEnableBTAdapter(env))
698 OIC_LOG(DEBUG, TAG, "BT adpater is not enable");
704 OIC_LOG(DEBUG, TAG, "[EDR][Native] CAEDRIsConnectedForSocket - socket is null");
708 jclass jni_cid_BTsocket = (*env)->FindClass(env, "android/bluetooth/BluetoothSocket");
709 if(!jni_cid_BTsocket)
711 OIC_LOG(DEBUG, TAG, "[EDR][Native] CAEDRIsConnectedForSocket - jni_cid_BTsocket is null");
715 jmethodID jni_mid_isConnected = (*env)->GetMethodID(env, jni_cid_BTsocket, "isConnected", "()Z");
716 if(!jni_mid_isConnected)
718 OIC_LOG(DEBUG, TAG, "[EDR][Native] CAEDRIsConnectedForSocket - jni_mid_isConnected is null.");
722 jboolean jni_isConnected = (*env)->CallBooleanMethod(env, socket, jni_mid_isConnected);
724 return jni_isConnected;
727 void CANativeStartListenTask(JNIEnv *env)
729 jobject jni_obj_BTSeverSocket = CAEDRNativeListen(env);
730 if(!jni_obj_BTSeverSocket) {
731 OIC_LOG(DEBUG, TAG, "[EDR] AcceptThread: jni_obj_BTSeverSocket is null");
735 gSeverSocket = (*env)->NewGlobalRef(env, jni_obj_BTSeverSocket);
738 jobject CAEDRNativeListen(JNIEnv *env)
740 if(!CAEDRNativeIsEnableBTAdapter(env))
742 OIC_LOG(DEBUG, TAG, "BT adpater is not enable");
746 OIC_LOG(DEBUG, TAG, "[EDR][Native] btListen");
748 jclass jni_cid_BTAdapter = (*env)->FindClass(env, CLASSPATH_BT_ADPATER);
749 if(!jni_cid_BTAdapter)
751 OIC_LOG(DEBUG, TAG, "[EDR][Native] btListen: jni_cid_BTAdapter is null");
756 jmethodID jni_mid_getDefaultAdapter =(*env)->GetStaticMethodID(env, jni_cid_BTAdapter, "getDefaultAdapter", METHODID_OBJECTNONPARAM);
757 if(!jni_cid_BTAdapter)
759 OIC_LOG(DEBUG, TAG, "[EDR][Native] btListen: jni_cid_BTAdapter is null");
763 jobject jni_obj_BTAdapter = (*env)->CallStaticObjectMethod(env, jni_cid_BTAdapter, jni_mid_getDefaultAdapter);
764 if(!jni_obj_BTAdapter)
766 OIC_LOG(DEBUG, TAG, "[EDR][Native] btListen: jni_obj_BTAdapter is null");
770 // get listen method ID
771 jmethodID jni_mid_listen = (*env)->GetMethodID(env, jni_cid_BTAdapter,
772 "listenUsingInsecureRfcommWithServiceRecord","(Ljava/lang/String;Ljava/util/UUID;)Landroid/bluetooth/BluetoothServerSocket;");
775 OIC_LOG(DEBUG, TAG, "[EDR][Native] btListen: jni_mid_listen is null");
778 // listenUsingInsecureRfcommWithServiceRecord / listenUsingRfcommWithServiceRecord
780 jclass jni_cid_uuid = (*env)->FindClass(env, CLASSPATH_BT_UUID);
783 OIC_LOG(DEBUG, TAG, "[EDR][Native] btListen: jni_mid_listen is null");
787 jmethodID jni_mid_fromString = (*env)->GetStaticMethodID(env, jni_cid_uuid, "fromString", "(Ljava/lang/String;)Ljava/util/UUID;");
788 if(!jni_mid_fromString)
790 OIC_LOG(DEBUG, TAG, "[EDR][Native] btListen: jni_mid_fromString is null");
794 // jstring uuid = (*env)->NewStringUTF(env, "0000111f-0000-1000-8000-00805f9b8033");
795 jstring jni_uuid = (*env)->NewStringUTF(env, "00000000-0000-0000-0000-0000cdab0000");
796 jobject jni_obj_uuid = (*env)->CallStaticObjectMethod(env, jni_cid_uuid, jni_mid_fromString, jni_uuid);
799 OIC_LOG(DEBUG, TAG, "[EDR][Native] btListen: jni_obj_uuid is null");
804 jstring jni_name = (*env)->NewStringUTF(env, "BluetoothTestSecure");
805 jobject jni_obj_BTSeverSocket = (*env)->CallObjectMethod(env, jni_obj_BTAdapter, jni_mid_listen, jni_name, jni_obj_uuid);
806 if(!jni_obj_BTSeverSocket)
808 OIC_LOG(DEBUG, TAG, "[EDR][Native] btListen: jni_obj_BTSeverSocket is null");
812 gServerSocketObject = (*env)->NewGlobalRef(env, jni_obj_BTSeverSocket);
814 return jni_obj_BTSeverSocket;
817 void CAEDRNativeAccept(JNIEnv *env, jobject severSocketObject)
819 if(severSocketObject != NULL)
821 jclass jni_cid_BTServerSocket = (*env)->FindClass(env, "android/bluetooth/BluetoothServerSocket");
822 if(!jni_cid_BTServerSocket)
824 OIC_LOG(DEBUG, TAG, "[EDR][Native] btAccept: jni_cid_BTServerSocket is null");
828 jmethodID jni_mid_accept = (*env)->GetMethodID(env, jni_cid_BTServerSocket, "accept", "()Landroid/bluetooth/BluetoothSocket;");
831 OIC_LOG(DEBUG, TAG, "[EDR][Native] btAccept: jni_mid_accept is null");
835 OIC_LOG(DEBUG, TAG, "[EDR][Native] btAccept: initiating accept...");
837 jobject jni_obj_BTSocket = NULL;
838 jni_obj_BTSocket = (*env)->CallObjectMethod(env, severSocketObject, jni_mid_accept);
839 if(!jni_obj_BTSocket)
841 OIC_LOG(DEBUG, TAG, "[EDR][Native] btAccept: jni_obj_BTSocket is null");
843 if((*env)->ExceptionCheck(env))
845 OIC_LOG(DEBUG, TAG, "[EDR][Native] btAccept: socket might closed or timeout!!!");
846 (*env)->ExceptionDescribe(env);
847 (*env)->ExceptionClear(env);
852 // get remote address
853 jstring j_str_address = CAEDRNativeGetAddressFromDeviceSocket(env, jni_obj_BTSocket);
855 const char* address = (*env)->GetStringUTFChars(env, j_str_address, NULL);
856 OIC_LOG_V(DEBUG, TAG, "[EDR][Native] btAccept: address is %s", address);
858 // set socket to list
859 jobject jni_socket = (*env)->NewGlobalRef(env, jni_obj_BTSocket);
860 CAEDRNativeAddDeviceSocketToList(env, jni_socket);
862 OIC_LOG(DEBUG, TAG, "[EDR][Native] btAccept: Accepted!!");
865 CAEDRUpdateDeviceState(STATE_CONNECTED, address);
869 OIC_LOG(DEBUG, TAG, "[EDR][Native] btAccept: severSocket is close previously");
873 void CAEDRNativeServerSocketClose(JNIEnv *env, const char* address, uint32_t id)
875 OIC_LOG(DEBUG, TAG, "[EDR][Native] CAEDRNativeServerSocketClose");
877 if(!CAEDRNativeIsEnableBTAdapter(env))
879 OIC_LOG(DEBUG, TAG, "BT adpater is not enable");
883 jclass jni_cid_BTSocket = (*env)->FindClass(env, "android/bluetooth/BluetoothSocket");
884 if(!jni_cid_BTSocket)
886 OIC_LOG(DEBUG, TAG, "[EDR][Native] close: jni_cid_BTSocket is null");
890 jmethodID jni_mid_close = (*env)->GetMethodID(env, jni_cid_BTSocket, "close", "()V");
893 OIC_LOG(DEBUG, TAG, "[EDR][Native] close: jni_mid_close is null");
897 jobject jni_obj_socket = CAEDRNativeGetDeviceSocket(id);
900 OIC_LOG(DEBUG, TAG, "[EDR][Native] close: jni_obj_socket is not available");
904 (*env)->CallVoidMethod(env, jni_obj_socket, jni_mid_close);
906 if((*env)->ExceptionCheck(env))
908 OIC_LOG(DEBUG, TAG, "[EDR][Native] close: close is Failed!!!");
909 (*env)->ExceptionDescribe(env);
910 (*env)->ExceptionClear(env);
914 // remove socket to list
915 CAEDRNativeRemoveDeviceSocket(env, jni_obj_socket);
918 CAEDRUpdateDeviceState(STATE_DISCONNECTED, address);
920 OIC_LOG(DEBUG, TAG, "[EDR][Native] close: disconnected");
924 * InputStream & BluetoothServerSocket will be close for Terminating
926 void CAEDRNatvieCloseServerTask(JNIEnv* env)
930 OIC_LOG_V(DEBUG, TAG, "InputStream will be close");
931 jclass jni_cid_InputStream = (*env)->FindClass(env, "java/io/InputStream");
932 jmethodID jni_mid_close = (*env)->GetMethodID(env, jni_cid_InputStream, "close", "()V");
933 (*env)->CallVoidMethod(env, gInputStream, jni_mid_close);
934 (*env)->DeleteGlobalRef(env, gInputStream);
939 OIC_LOG_V(DEBUG, TAG, "[EDR][Native] Accept Resource will be close");
941 jclass jni_cid_BTServerSocket = (*env)->FindClass(env, "android/bluetooth/BluetoothServerSocket");
942 if(!jni_cid_BTServerSocket)
944 OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_cid_BTServerSocket is null");
948 jmethodID jni_mid_accept = (*env)->GetMethodID(env, jni_cid_BTServerSocket, "close", "()V");
951 OIC_LOG(DEBUG, TAG, "[EDR][Native] jni_mid_accept is null");
954 (*env)->CallVoidMethod(env, gSeverSocket, jni_mid_accept);
955 (*env)->DeleteGlobalRef(env, gSeverSocket);
957 OIC_LOG(DEBUG, TAG, "[EDR][Native] close accept obj");
961 void CAEDRServerSetPacketReceivedCallback(CAEDRDataReceivedCallback packetReceivedCallback)
963 gEDRPacketReceivedCallback = packetReceivedCallback;