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>
#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")
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;
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;
}
if(res != JNI_OK)
{
OIC_LOG_V(DEBUG, TAG, "AttachCurrentThread failed");
- return;
+ return CA_STATUS_FAILED;
}
isAttached = TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
//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)
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");
}
gMutexMulticastServer = NULL;
}
- if(gMutexSocketListManager)
- {
- u_mutex_free(gMutexSocketListManager);
- gMutexSocketListManager = NULL;
- }
-
OIC_LOG(DEBUG, TAG, "OUT");
}
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;
}
gThreadPoolHandle = handle;
+ CAEDRCoreJniInit();
+
+ CAEDRJniSetContext();
+
// init mutex
CAEDRCreateMutex();
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();
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");
}
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)
}
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);
// find address
if(!strcmp(remoteAddress, address))
{
- CAEDRNativeSendData(env, remoteAddress, data, i);
+ CAEDRNativeSendData(env, remoteAddress, data, dataLen, i);
}
}
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;
/**
* 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))
{
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))
{
}
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
{
{
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)
{
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");
}
-
#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;
}
void CAEDRSetNetworkChangeCallback(
CAEDRNetworkStatusCallback networkChangeCallback)
{
-
+ OIC_LOG_V(DEBUG, TAG, "CAEDRSetNetworkChangeCallback");
+ gNetworkChangeCb = networkChangeCallback;
}
void CAEDRTerminateNetworkMonitor(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);
+ }
+}
#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";
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
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
*/
*/
static bool gStopAccept = FALSE;
+
+static jobject gInputStream = NULL;
+
+static jobject gSeverSocket = NULL;
+
typedef struct send_data {
char* address;
char* data;
bool *stopFlag;
} CAAdapterAcceptThreadContext_t;
-// callback instance
-
/**
* @var gEDRNetworkChangeCallback
* @brief Maintains the callback to be notified when data received from remote Bluetooth device
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");
// 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)
if(ctx)
OICFree(ctx);
- OIC_LOG(DEBUG, TAG, "OUT");
+ OIC_LOG(DEBUG, TAG, "OUT - CAReceiveHandler");
}
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)
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;
}
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)
gThreadPoolHandle = handle;
+ CAEDRServerStartAccpetThread();
+
+ OIC_LOG(DEBUG, TAG, "OUT");
+}
+
+void CAEDRServerStartAccpetThread()
+{
+ CAEDRServerJniInit();
+
// init mutex
CAEDRServerCreateMutex();
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)
OICFree((void *)ctx);
return;
}
-
- OIC_LOG(DEBUG, TAG, "OUT");
}
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)
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
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");
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);
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
// 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
{
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)
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");
}
// 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)
gEDRPacketReceivedCallback = packetReceivedCallback;
}
-
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)
}
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--;
+}
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;
{
OIC_LOG_V(DEBUG, EDR_ADAPTER_TAG, "IN");
+ // Stop EDR adapter
+ CAStopEDR();
+
// Terminate EDR Network Monitor
CAEDRTerminateNetworkMonitor();
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);
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");
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 )
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");
}
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)
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;
}
* 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;
{
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));
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)
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)
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.
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)
{
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);
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.
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)
{
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
// 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)
{
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;
+ }
}
}
}
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);
#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;} }
{
// 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)
}
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)
{
{
OIC_LOG_V(DEBUG, TAG, "CAHandleRequestResponseCallbacks IN");
+#ifdef SINGLE_HANDLE
// parse the data and call the callbacks.
// #1 parse the data
// #2 get endpoint
}
OICFree(rep);
+
+
+#endif
OIC_LOG_V(DEBUG, TAG, "CAHandleRequestResponseCallbacks OUT");
}
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);
// 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);