#include "caedrclient.h"
#include "logger.h"
#include "oic_malloc.h"
+#include "oic_string.h"
#include "cathreadpool.h" /* for thread pool */
#include "camutex.h"
#include "uarraylist.h"
#include "caadapterutils.h"
+#include "caremotehandler.h"
//#define DEBUG_MODE
#define TAG PCF("CA_EDR_CLIENT")
"(Ljava/lang/String;)Landroid/bluetooth/BluetoothDevice;";
static const char CLASSPATH_BT_ADPATER[] = "android/bluetooth/BluetoothAdapter";
static const char CLASSPATH_BT_DEVICE[] = "android/bluetooth/BluetoothDevice";
-static const char CLASSPATH_BT_INTERFACE[] = "org/iotivity/jar/caedrinterface";
+static const char CLASSPATH_BT_INTERFACE[] = "org/iotivity/ca/CaEdrInterface";
static const char CLASSPATH_BT_SOCKET[] = "android/bluetooth/BluetoothSocket";
static const char CLASSPATH_BT_UUID[] = "java/util/UUID";
static const char CLASSPATH_CONTEXT[] = "android/content/Context";
*/
static ca_mutex g_mutexObjectList = NULL;
+/**
+ * @var g_edrErrorHandler
+ * @brief Error callback to update error in EDR
+ */
+static CAEDRErrorHandleCallback g_edrErrorHandler = NULL;
+
typedef struct send_data
{
char* address;
/**
* implement for BT-EDR adapter common method
*/
-CAResult_t CAEDRGetInterfaceInformation(CALocalConnectivity_t **info)
+CAResult_t CAEDRGetInterfaceInformation(CAEndpoint_t **info)
{
OIC_LOG(DEBUG, TAG, "IN - CAEDRGetInterfaceInformation");
if (!info)
{
- OIC_LOG(ERROR, TAG, "LocalConnectivity info is null");
+ OIC_LOG(ERROR, TAG, "endpoint info is null");
return CA_STATUS_FAILED;
}
}
// Create local endpoint using util function
- CALocalConnectivity_t *endpoint = CAAdapterCreateLocalEndpoint(CA_EDR, macAddress);
+ CAEndpoint_t *endpoint = CACreateEndpointObject(CA_DEFAULT_FLAGS, CA_ADAPTER_RFCOMM_BTEDR,
+ macAddress, 0);
if (NULL == endpoint)
{
OIC_LOG(ERROR, TAG, "Failed to create Local Endpoint!");
}
// copy unicast server information
- endpoint->isSecured = false;
- CALocalConnectivity_t *netInfo = (CALocalConnectivity_t *) OICMalloc(
- sizeof(CALocalConnectivity_t) * netInfoSize);
+ CAEndpoint_t *netInfo = (CAEndpoint_t *)OICMalloc(sizeof(CAEndpoint_t) * netInfoSize);
if (NULL == netInfo)
{
OIC_LOG(ERROR, TAG, "Invalid input..");
OICFree(macAddress);
- CAAdapterFreeLocalEndpoint(endpoint);
+ CAFreeEndpoint(endpoint);
return CA_MEMORY_ALLOC_FAILED;
}
- memcpy(netInfo, endpoint, sizeof(CALocalConnectivity_t));
+ *netInfo = *endpoint;
*info = netInfo;
OICFree(macAddress);
- CAAdapterFreeLocalEndpoint(endpoint);
+ CAFreeEndpoint(endpoint);
OIC_LOG(DEBUG, TAG, "OUT - CAEDRGetInterfaceInformation");
return CA_STATUS_OK;
const void *data, uint32_t dataLength, uint32_t *sentLength)
{
OIC_LOG(DEBUG, TAG, "IN");
- CAEDRSendUnicastMessage(remoteAddress, (const char*) data, dataLength);
+ CAResult_t result = CAEDRSendUnicastMessage(remoteAddress, (const char*) data, dataLength);
OIC_LOG(DEBUG, TAG, "OUT");
- return CA_STATUS_OK;
+ return result;
}
CAResult_t CAEDRClientSendMulticastData(const char *serviceUUID, const void *data,
uint32_t dataLength, uint32_t *sentLength)
{
OIC_LOG(DEBUG, TAG, "IN");
- CAEDRSendMulticastMessage((const char*) data, dataLength);
+ CAResult_t result = CAEDRSendMulticastMessage((const char*) data, dataLength);
OIC_LOG(DEBUG, TAG, "OUT");
- return CA_STATUS_OK;
+ return result;
}
// It will be updated when android EDR support is added
jclass EDRJniInterface = (*env)->FindClass(env, CLASSPATH_BT_INTERFACE);
if (!EDRJniInterface)
{
- OIC_LOG(ERROR, TAG, "[EDRCore] Could not get caedrinterface class");
+ OIC_LOG(ERROR, TAG, "[EDRCore] Could not get CaEdrInterface class");
return CA_STATUS_FAILED;
}
"(Landroid/content/Context;)V");
if (!EDRInterfaceConstructorMethod)
{
- OIC_LOG(ERROR, TAG, "[EDRCore] Could not get caedrinterface constructor method");
+ OIC_LOG(ERROR, TAG, "[EDRCore] Could not get CaEdrInterface constructor method");
return CA_STATUS_FAILED;
}
if (g_context)
{
- CAEDRCreateJNIInterfaceObject(g_context); /* create java caedrinterface instance*/
+ CAEDRCreateJNIInterfaceObject(g_context); /* create java CaEdrInterface instance*/
}
OIC_LOG(DEBUG, TAG, "OUT");
{
OIC_LOG_V(DEBUG, TAG, "CAEDRSendUnicastMessage(%s, %s)", address, data);
- CAEDRSendUnicastMessageImpl(address, data, dataLen);
- return CA_STATUS_OK;
+ CAResult_t result = CAEDRSendUnicastMessageImpl(address, data, dataLen);
+ return result;
}
CAResult_t CAEDRSendMulticastMessage(const char* data, uint32_t dataLen)
isAttached = true;
}
- CAEDRSendMulticastMessageImpl(env, data, dataLen);
+ CAResult_t result = CAEDRSendMulticastMessageImpl(env, data, dataLen);
+ if(CA_STATUS_OK != result)
+ {
+ OIC_LOG(ERROR, TAG, "CAEDRSendMulticastMessage - could not send multicast message");
+ return result;
+ }
OIC_LOG(DEBUG, TAG, "sent data");
if (jni_address)
{
const char* localAddress = (*env)->GetStringUTFChars(env, jni_address, NULL);
- *address = (char*) OICMalloc(strlen(localAddress) + 1);
+ *address = OICStrdup(localAddress);
if (*address == NULL)
{
if (isAttached)
}
return;
}
- memcpy(*address, localAddress, strlen(localAddress));
+
(*env)->ReleaseStringUTFChars(env, jni_address, localAddress);
}
(*env)->ReleaseStringUTFChars(env, j_str_address, remoteAddress);
if (CA_STATUS_OK != res)
{
- return res;
+ OIC_LOG_V(ERROR, TAG, "CASendMulticastMessageImpl, failed to send message to : %s",
+ remoteAddress);
+ g_edrErrorHandler(remoteAddress, OIC_EDR_SERVICE_ID, data, dataLen, res);
+ continue;
}
}
CAEDRInitialize(handle);
OIC_LOG(DEBUG, TAG, "OUT");
}
+
+void CAEDRSetErrorHandler(CAEDRErrorHandleCallback errorHandleCallback)
+{
+ g_edrErrorHandler = errorHandleCallback;
+}