#include "oic_malloc.h"
#include "oic_string.h"
#include "cathreadpool.h" /* for thread pool */
-#include "camutex.h"
+#include "octhread.h"
#include "uarraylist.h"
#include "caadapterutils.h"
#include "caremotehandler.h"
-//#define DEBUG_MODE
#define TAG PCF("OIC_CA_EDR_CLIENT")
static const char METHODID_CONTEXTNONPARAM[] = "()Landroid/content/Context;";
static const char CLASSPATH_CONTEXT[] = "android/content/Context";
static const char CLASSPATH_OUTPUT[] = "java/io/OutputStream";
-static ca_thread_pool_t g_threadPoolHandle = NULL;
-
static JavaVM *g_jvm;
static jobject g_context;
/**
- * @var g_mutexUnicastServer
- * @brief Mutex to synchronize unicast server
- */
-static ca_mutex g_mutexUnicastServer = NULL;
-
-/**
- * @var g_stopUnicast
- * @brief Flag to control the Receive Unicast Data Thread
- */
-static bool g_stopUnicast = false;
-
-/**
- * @var g_mutexMulticastServer
- * @brief Mutex to synchronize secure multicast server
- */
-static ca_mutex g_mutexMulticastServer = NULL;
-
-/**
- * @var g_stopMulticast
- * @brief Flag to control the Receive Multicast Data Thread
- */
-static bool g_stopMulticast = false;
-
-/**
- * @var g_stopAccept
- * @brief Flag to control the Accept Thread
- */
-static bool g_stopAccept = false;
-
-/**
* @var g_mutexStateList
* @brief Mutex to synchronize device state list
*/
-static ca_mutex g_mutexStateList = NULL;
+static oc_mutex g_mutexStateList = NULL;
/**
* @var g_mutexObjectList
* @brief Mutex to synchronize device object list
*/
-static ca_mutex g_mutexObjectList = NULL;
+static oc_mutex g_mutexObjectList = NULL;
/**
* @var g_edrErrorHandler
*/
static CAEDRErrorHandleCallback g_edrErrorHandler = NULL;
-typedef struct send_data
-{
- char* address;
- char* data;
- uint32_t id;
-} data_t;
-
-/**
- @brief Thread context information for unicast, multicast and secured unicast server
- */
-typedef struct
-{
- bool *stopFlag;
- CAAdapterServerType_t type;
-} CAAdapterReceiveThreadContext_t;
-
-typedef struct
-{
- bool *stopFlag;
-} CAAdapterAcceptThreadContext_t;
-
/**
* implement for BT-EDR adapter common method
*/
return CA_STATUS_INVALID_PARAM;
}
bool isAttached = false;
- JNIEnv* env;
+ JNIEnv* env = NULL;
jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);
if (JNI_OK != res)
{
CAResult_t CAEDRCreateJNIInterfaceObject(jobject context)
{
- JNIEnv* env;
+ JNIEnv* env = NULL;
OIC_LOG(DEBUG, TAG, "CAEDRCreateJNIInterfaceObject");
if ((*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6) != JNI_OK)
return CA_STATUS_FAILED;
}
- //getApplicationContext
- jclass contextClass = (*env)->FindClass(env, CLASSPATH_CONTEXT);
- if (!contextClass)
+
+ jmethodID mid_getApplicationContext = CAGetJNIMethodID(env, CLASSPATH_CONTEXT,
+ "getApplicationContext",
+ METHODID_CONTEXTNONPARAM);
+ if (!mid_getApplicationContext)
{
- OIC_LOG(ERROR, TAG, "Could not get context object class");
+ OIC_LOG(ERROR, TAG, "Could not get getApplicationContext method");
return CA_STATUS_FAILED;
}
- jmethodID getApplicationContextMethod = (*env)->GetMethodID(env, contextClass,
- "getApplicationContext",
- METHODID_CONTEXTNONPARAM);
- if (!getApplicationContextMethod)
+ jobject jApplicationContext = (*env)->CallObjectMethod(env, context,
+ mid_getApplicationContext);
+ if (!jApplicationContext)
{
- OIC_LOG(ERROR, TAG, "Could not get getApplicationContext method");
+ OIC_LOG(ERROR, TAG, "Could not get application context");
return CA_STATUS_FAILED;
}
return CA_STATUS_FAILED;
}
- (*env)->NewObject(env, EDRJniInterface, EDRInterfaceConstructorMethod, context);
+ (*env)->NewObject(env, EDRJniInterface, EDRInterfaceConstructorMethod, jApplicationContext);
OIC_LOG(DEBUG, TAG, "NewObject Success");
return CA_STATUS_OK;
static void CAEDRDestroyMutex()
{
- if (g_mutexUnicastServer)
- {
- ca_mutex_free(g_mutexUnicastServer);
- g_mutexUnicastServer = NULL;
- }
-
- if (g_mutexMulticastServer)
- {
- ca_mutex_free(g_mutexMulticastServer);
- g_mutexMulticastServer = NULL;
- }
-
if (g_mutexStateList)
{
- ca_mutex_free(g_mutexStateList);
+ oc_mutex_free(g_mutexStateList);
g_mutexStateList = NULL;
}
if (g_mutexObjectList)
{
- ca_mutex_free(g_mutexObjectList);
+ oc_mutex_free(g_mutexObjectList);
g_mutexObjectList = NULL;
}
}
static CAResult_t CAEDRCreateMutex()
{
- g_mutexUnicastServer = ca_mutex_new();
- if (!g_mutexUnicastServer)
- {
- OIC_LOG(ERROR, TAG, "Failed to created mutex!");
- return CA_STATUS_FAILED;
- }
-
- g_mutexMulticastServer = ca_mutex_new();
- if (!g_mutexMulticastServer)
- {
- OIC_LOG(ERROR, TAG, "Failed to created mutex!");
-
- CAEDRDestroyMutex();
- return CA_STATUS_FAILED;
- }
-
- g_mutexStateList = ca_mutex_new();
+ g_mutexStateList = oc_mutex_new();
if (!g_mutexStateList)
{
OIC_LOG(ERROR, TAG, "Failed to created mutex!");
return CA_STATUS_FAILED;
}
- g_mutexObjectList = ca_mutex_new();
+ g_mutexObjectList = oc_mutex_new();
if (!g_mutexObjectList)
{
OIC_LOG(ERROR, TAG, "Failed to created mutex!");
return CA_STATUS_OK;
}
-void CAEDRInitialize(ca_thread_pool_t handle)
+CAResult_t CAEDRInitialize()
{
OIC_LOG(DEBUG, TAG, "CAEDRInitialize");
- g_threadPoolHandle = handle;
-
CAEDRCoreJniInit();
CAEDRJniInitContext();
// init mutex
- CAEDRCreateMutex();
+ CAResult_t result = CAEDRCreateMutex();
+ if(CA_STATUS_OK != result)
+ {
+ OIC_LOG(ERROR, TAG, "CAEDRInitialize - Could not create mutex");
+ return result;
+ }
bool isAttached = false;
- JNIEnv* env;
+ JNIEnv* env = NULL;
jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);
if (JNI_OK != res)
{
if (JNI_OK != res)
{
OIC_LOG(ERROR, TAG, "AttachCurrentThread failed");
- return;
+ return CA_STATUS_NOT_INITIALIZED;
}
isAttached = true;
}
}
(*env)->DeleteLocalRef(env, jni_address);
- ca_mutex_lock(g_mutexStateList);
+ oc_mutex_lock(g_mutexStateList);
CAEDRNativeCreateDeviceStateList();
- ca_mutex_unlock(g_mutexStateList);
+ oc_mutex_unlock(g_mutexStateList);
- ca_mutex_lock(g_mutexObjectList);
+ oc_mutex_lock(g_mutexObjectList);
CAEDRNativeCreateDeviceSocketList();
- ca_mutex_unlock(g_mutexObjectList);
+ oc_mutex_unlock(g_mutexObjectList);
if (isAttached)
{
}
OIC_LOG(DEBUG, TAG, "OUT");
+
+ return result;
}
void CAEDRTerminate()
OIC_LOG(DEBUG, TAG, "CAEDRTerminate");
bool isAttached = false;
- JNIEnv* env;
+ JNIEnv* env = NULL;
jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);
if (JNI_OK != res)
{
isAttached = true;
}
- g_stopAccept = true;
- g_stopMulticast = true;
- g_stopUnicast = true;
-
if (isAttached)
{
(*g_jvm)->DetachCurrentThread(g_jvm);
if (g_context)
{
(*env)->DeleteGlobalRef(env, g_context);
+ g_context = NULL;
}
CAEDRNativeSocketCloseToAll(env);
}
bool isAttached = false;
- JNIEnv* env;
+ JNIEnv* env = NULL;
jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);
if (JNI_OK != res)
{
VERIFY_NON_NULL(data, TAG, "data is null");
bool isAttached = false;
- JNIEnv* env;
+ JNIEnv* env = NULL;
jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);
if (JNI_OK != res)
{
return result;
}
- OIC_LOG(DEBUG, TAG, "sent data");
-
if (isAttached)
{
OIC_LOG(DEBUG, TAG, "DetachCurrentThread");
void CAEDRGetLocalAddress(char **address)
{
bool isAttached = false;
- JNIEnv* env;
+ JNIEnv* env = NULL;
jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);
if (JNI_OK != res)
{
VERIFY_NON_NULL(data, TAG, "data is null");
bool isAttached = false;
- JNIEnv* env;
+ JNIEnv* env = NULL;
jint res = (*g_jvm)->GetEnv(g_jvm, (void**) &env, JNI_VERSION_1_6);
if (JNI_OK != res)
{
if (!CAEDRNativeIsEnableBTAdapter(env))
{
- OIC_LOG(ERROR, TAG, "BT adpater is not enable");
- return CA_STATUS_INVALID_PARAM;
+ OIC_LOG(INFO, TAG, "BT adapter is not enabled");
+ return CA_ADAPTER_NOT_ENABLED;
}
if (STATE_DISCONNECTED == CAEDRIsConnectedDevice(address))
{
// connect before send data
- OIC_LOG(DEBUG, TAG, "connect before send data");
+ OIC_LOG_V(DEBUG, TAG, "try to connect with [%s] before sending data", address);
CAResult_t res = CAEDRNativeConnect(env, address);
if (CA_STATUS_OK != res)
if ((*env)->ExceptionCheck(env))
{
OIC_LOG(ERROR, TAG, "Failed to write data in outputStram");
+ CALogSendStateInfo(CA_ADAPTER_RFCOMM_BTEDR, address, 0, dataLength, false, NULL);
(*env)->ExceptionDescribe(env);
(*env)->ExceptionClear(env);
return CA_STATUS_FAILED;
}
- OIC_LOG_V(INFO, TAG, "EDR sendTo is successful: %ld bytes, to %s",
+ OIC_LOG_V(INFO, TAG, "EDR sendTo is successful: %u bytes, to %s",
dataLength, address);
+ CALogSendStateInfo(CA_ADAPTER_RFCOMM_BTEDR, address, 0, dataLength, true, NULL);
}
else
{
+ OIC_LOG(ERROR, TAG, "error!!");
+ CALogSendStateInfo(CA_ADAPTER_RFCOMM_BTEDR, address, 0, dataLength, false, NULL);
(*env)->ExceptionDescribe(env);
(*env)->ExceptionClear(env);
- OIC_LOG(ERROR, TAG, "error!!");
return CA_STATUS_FAILED;
}
}
CAResult_t CAEDRNativeConnect(JNIEnv *env, const char *address)
{
VERIFY_NON_NULL(address, TAG, "address is null");
- OIC_LOG(DEBUG, TAG, "btConnect..");
if (!CAEDRNativeIsEnableBTAdapter(env))
{
- OIC_LOG(ERROR, TAG, "BT adpater is not enable");
- return CA_STATUS_INVALID_PARAM;
+ OIC_LOG(INFO, TAG, "BT adapter is not enabled");
+ return CA_ADAPTER_NOT_ENABLED;
}
jclass jni_cid_BTAdapter = (*env)->FindClass(env, CLASSPATH_BT_ADPATER);
if ((*env)->ExceptionCheck(env))
{
+ CALogSendStateInfo(CA_ADAPTER_RFCOMM_BTEDR, address, 0, 0, false, "Connect has Failed");
OIC_LOG(ERROR, TAG, "Connect is Failed!!!");
(*env)->ExceptionDescribe(env);
(*env)->ExceptionClear(env);
(*env)->DeleteLocalRef(env, jni_obj_BTSocket);
return CA_STATUS_FAILED;
}
- ca_mutex_lock(g_mutexObjectList);
+ oc_mutex_lock(g_mutexObjectList);
CAEDRNativeAddDeviceSocketToList(env, jni_socket);
(*env)->DeleteGlobalRef(env, jni_socket);
(*env)->DeleteLocalRef(env, jni_obj_BTSocket);
- ca_mutex_unlock(g_mutexObjectList);
+ oc_mutex_unlock(g_mutexObjectList);
// update state
- ca_mutex_lock(g_mutexStateList);
+ oc_mutex_lock(g_mutexStateList);
CAEDRUpdateDeviceState(STATE_CONNECTED, address);
- ca_mutex_unlock(g_mutexStateList);
+ oc_mutex_unlock(g_mutexStateList);
- OIC_LOG(DEBUG, TAG, "connected");
+ OIC_LOG(DEBUG, TAG, "successfully connected");
return CA_STATUS_OK;
}
CAEDRNativeRemoveDeviceSocket(env, jni_obj_socket);
// update state
- ca_mutex_lock(g_mutexStateList);
+ oc_mutex_lock(g_mutexStateList);
CAEDRUpdateDeviceState(STATE_DISCONNECTED, address);
- ca_mutex_unlock(g_mutexStateList);
+ oc_mutex_unlock(g_mutexStateList);
- OIC_LOG(DEBUG, TAG, "disconnected");
+ OIC_LOG_V(DEBUG, TAG, "disconnected with [%s]", address);
}
-void CAEDRInitializeClient(ca_thread_pool_t handle)
+CAResult_t CAEDRClientInitialize()
{
- CAEDRInitialize(handle);
+ CAResult_t result = CAEDRInitialize();
+ return result;
}
void CAEDRSetErrorHandler(CAEDRErrorHandleCallback errorHandleCallback)