Bug 1163499 - Part 1: Revise BluetoothGattInterface and result handler for daemon support. r=tzimmermann

This commit is contained in:
Jocelyn Liu 2015-05-27 04:50:00 -04:00
parent 8f5273f47d
commit e9c7840743
6 changed files with 149 additions and 84 deletions

View File

@ -729,9 +729,9 @@ struct BluetoothGattReadParam {
BluetoothGattServiceId mServiceId;
BluetoothGattId mCharId;
BluetoothGattId mDescriptorId;
uint8_t mValue[BLUETOOTH_GATT_MAX_ATTR_LEN];
uint32_t mValueType;
uint16_t mValueLength;
uint16_t mValueType;
uint8_t mValue[BLUETOOTH_GATT_MAX_ATTR_LEN];
uint8_t mStatus;
};
@ -743,14 +743,24 @@ struct BluetoothGattWriteParam {
};
struct BluetoothGattNotifyParam {
uint8_t mValue[BLUETOOTH_GATT_MAX_ATTR_LEN];
nsString mBdAddr;
BluetoothGattServiceId mServiceId;
BluetoothGattId mCharId;
uint16_t mLength;
uint8_t mValue[BLUETOOTH_GATT_MAX_ATTR_LEN];
bool mIsNotify;
};
struct BluetoothGattTestParam {
nsString mBdAddr;
BluetoothUuid mUuid;
uint16_t mU1;
uint16_t mU2;
uint16_t mU3;
uint16_t mU4;
uint16_t mU5;
};
/**
* EIR Data Type, Advertising Data Type (AD Type) and OOB Data Type Definitions
* Please refer to https://www.bluetooth.org/en-us/specification/\

View File

@ -9,7 +9,6 @@
#include "BluetoothCommon.h"
#include "mozilla/dom/bluetooth/BluetoothTypes.h"
#include "mozilla/dom/TypedArray.h"
BEGIN_BLUETOOTH_NAMESPACE
@ -632,16 +631,28 @@ protected:
{ }
};
class BluetoothGattClientResultHandler
class BluetoothGattResultHandler
{
public:
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(BluetoothGattClientResultHandler)
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(BluetoothGattResultHandler)
virtual void OnError(BluetoothStatus aStatus)
{
BT_WARNING("Received error code %d", (int)aStatus);
}
virtual void Init() { }
virtual void Cleanup() { }
protected:
virtual ~BluetoothGattResultHandler() { }
};
class BluetoothGattClientResultHandler : public BluetoothGattResultHandler
{
public:
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(BluetoothGattClientResultHandler)
virtual void RegisterClient() { }
virtual void UnregisterClient() { }
@ -671,6 +682,7 @@ public:
virtual void ReadRemoteRssi() { }
virtual void GetDeviceType() { }
virtual void SetAdvData() { }
virtual void TestCommand() { }
protected:
virtual ~BluetoothGattClientResultHandler() { }
@ -678,23 +690,6 @@ protected:
// TODO: Add GattServerResultHandler
class BluetoothGattResultHandler
{
public:
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(BluetoothGattResultHandler)
virtual void OnError(BluetoothStatus aStatus)
{
BT_WARNING("Received error code %d", (int)aStatus);
}
virtual void Init() { }
virtual void Cleanup() { }
protected:
virtual ~BluetoothGattResultHandler() { }
};
class BluetoothGattClientInterface
{
public:
@ -815,14 +810,18 @@ public:
int aMinInterval,
int aMaxInterval,
int aApperance,
uint8_t aManufacturerLen,
const ArrayBuffer& aManufacturerData,
uint8_t aServiceDataLen,
const ArrayBuffer& aServiceData,
uint8_t aServiceUUIDLen,
const ArrayBuffer& aServiceUUID,
uint16_t aManufacturerLen,
char* aManufacturerData,
uint16_t aServiceDataLen,
char* aServiceData,
uint16_t aServiceUUIDLen,
char* aServiceUUID,
BluetoothGattClientResultHandler* aRes) = 0;
virtual void TestCommand(int aCommand,
const BluetoothGattTestParam& aTestParam,
BluetoothGattClientResultHandler* aRes) = 0;
protected:
BluetoothGattClientInterface();
virtual ~BluetoothGattClientInterface();

View File

@ -1031,44 +1031,22 @@ void
BluetoothGattClientHALInterface::SetAdvData(
int aServerIf, bool aIsScanRsp, bool aIsNameIncluded,
bool aIsTxPowerIncluded, int aMinInterval, int aMaxInterval, int aApperance,
uint8_t aManufacturerLen, const ArrayBuffer& aManufacturerData,
uint8_t aServiceDataLen, const ArrayBuffer& aServiceData,
uint8_t aServiceUUIDLen, const ArrayBuffer& aServiceUUID,
uint16_t aManufacturerLen, char* aManufacturerData,
uint16_t aServiceDataLen, char* aServiceData,
uint16_t aServiceUUIDLen, char* aServiceUUID,
BluetoothGattClientResultHandler* aRes)
{
/* FIXME: This method allocates a large amount of memory on the
* stack. It should be rewritten to prevent the pending stack
* overflow. Additionally |ArrayBuffer| seems like the wrong data
* type here. Why not use plain pointers instead?
*/
bt_status_t status;
#if ANDROID_VERSION >= 21
char manufacturerData[aManufacturerLen + 1];
char serviceData[aServiceDataLen + 1];
char serviceUUID[aServiceUUIDLen + 1];
if (NS_SUCCEEDED(Convert(aManufacturerData, manufacturerData)) ||
NS_SUCCEEDED(Convert(aServiceData, serviceData)) ||
NS_SUCCEEDED(Convert(aServiceUUID, serviceUUID))) {
status = mInterface->set_adv_data(
aServerIf, aIsScanRsp, aIsNameIncluded, aIsTxPowerIncluded,
aMinInterval, aMaxInterval, aApperance,
aManufacturerLen, manufacturerData,
aServiceDataLen, serviceData, aServiceUUIDLen, serviceUUID);
} else {
status = BT_STATUS_PARM_INVALID;
}
status = mInterface->set_adv_data(
aServerIf, aIsScanRsp, aIsNameIncluded, aIsTxPowerIncluded,
aMinInterval, aMaxInterval, aApperance,
aManufacturerLen, aManufacturerData,
aServiceDataLen, aServiceData, aServiceUUIDLen, aServiceUUID);
#elif ANDROID_VERSION >= 19
char value[aManufacturerLen + 1];
if (NS_SUCCEEDED(Convert(aManufacturerData, value))) {
status = mInterface->set_adv_data(
aServerIf, aIsScanRsp, aIsNameIncluded, aIsTxPowerIncluded, aMinInterval,
aMaxInterval, aApperance, aManufacturerLen, value);
} else {
status = BT_STATUS_PARM_INVALID;
}
status = mInterface->set_adv_data(
aServerIf, aIsScanRsp, aIsNameIncluded, aIsTxPowerIncluded, aMinInterval,
aMaxInterval, aApperance, aManufacturerLen, aManufacturerData);
#else
status = BT_STATUS_UNSUPPORTED;
#endif
@ -1080,6 +1058,32 @@ BluetoothGattClientHALInterface::SetAdvData(
}
}
void
BluetoothGattClientHALInterface::TestCommand(
int aCommand, const BluetoothGattTestParam& aTestParam,
BluetoothGattClientResultHandler* aRes)
{
bt_status_t status;
#if ANDROID_VERSION >= 19
btgatt_test_params_t testParam;
if (NS_SUCCEEDED(Convert(aTestParam, testParam))) {
status = mInterface->test_command(aCommand, &testParam);
} else {
status = BT_STATUS_PARM_INVALID;
}
#else
status = BT_STATUS_UNSUPPORTED;
#endif
if (aRes) {
DispatchBluetoothGattClientHALResult(
aRes, &BluetoothGattClientResultHandler::TestCommand,
ConvertDefault(status, STATUS_FAIL));
}
}
// TODO: Add GATT Server Interface
// GATT Interface

View File

@ -138,12 +138,14 @@ public:
int aMinInterval,
int aMaxInterval,
int aApperance,
uint8_t aManufacturerLen,
const ArrayBuffer& aManufacturerData,
uint8_t aServiceDataLen, const ArrayBuffer& aServiceData,
uint8_t aServiceUUIDLen, const ArrayBuffer& aServiceUUID,
uint16_t aManufacturerLen, char* aManufacturerData,
uint16_t aServiceDataLen, char* aServiceData,
uint16_t aServiceUUIDLen, char* aServiceUUID,
BluetoothGattClientResultHandler* aRes);
void TestCommand(int aCommand, const BluetoothGattTestParam& aTestParam,
BluetoothGattClientResultHandler* aRes);
protected:
BluetoothGattClientHALInterface(
#if ANDROID_VERSION >= 19

View File

@ -262,16 +262,20 @@ Convert(const btgatt_srvc_id_t& aIn, BluetoothGattServiceId& aOut)
nsresult
Convert(const btgatt_read_params_t& aIn, BluetoothGattReadParam& aOut)
{
nsresult rv;
rv = Convert(aIn.srvc_id, aOut.mServiceId);
NS_ENSURE_SUCCESS(rv, rv);
nsresult rv = Convert(aIn.srvc_id, aOut.mServiceId);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
rv = Convert(aIn.char_id, aOut.mCharId);
NS_ENSURE_SUCCESS(rv, rv);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
rv = Convert(aIn.descr_id, aOut.mDescriptorId);
NS_ENSURE_SUCCESS(rv, rv);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
memcpy(aOut.mValue, aIn.value.value, aIn.value.len);
aOut.mValueLength = aIn.value.len;
@ -284,16 +288,20 @@ Convert(const btgatt_read_params_t& aIn, BluetoothGattReadParam& aOut)
nsresult
Convert(const btgatt_write_params_t& aIn, BluetoothGattWriteParam& aOut)
{
nsresult rv;
rv = Convert(aIn.srvc_id, aOut.mServiceId);
NS_ENSURE_SUCCESS(rv, rv);
nsresult rv = Convert(aIn.srvc_id, aOut.mServiceId);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
rv = Convert(aIn.char_id, aOut.mCharId);
NS_ENSURE_SUCCESS(rv, rv);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
rv = Convert(aIn.descr_id, aOut.mDescriptorId);
NS_ENSURE_SUCCESS(rv, rv);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
aOut.mStatus = aIn.status;
@ -303,16 +311,20 @@ Convert(const btgatt_write_params_t& aIn, BluetoothGattWriteParam& aOut)
nsresult
Convert(const btgatt_notify_params_t& aIn, BluetoothGattNotifyParam& aOut)
{
nsresult rv;
rv = Convert(aIn.bda, aOut.mBdAddr);
NS_ENSURE_SUCCESS(rv, rv);
nsresult rv = Convert(aIn.bda, aOut.mBdAddr);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
rv = Convert(aIn.srvc_id, aOut.mServiceId);
NS_ENSURE_SUCCESS(rv, rv);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
rv = Convert(aIn.char_id, aOut.mCharId);
NS_ENSURE_SUCCESS(rv, rv);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
memcpy(aOut.mValue, aIn.value, aIn.len);
aOut.mLength = aIn.len;
@ -320,6 +332,41 @@ Convert(const btgatt_notify_params_t& aIn, BluetoothGattNotifyParam& aOut)
return NS_OK;
}
nsresult
Convert(const BluetoothGattTestParam& aIn, btgatt_test_params_t& aOut)
{
nsresult rv = Convert(aIn.mBdAddr, *aOut.bda1);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
rv = Convert(aIn.mUuid, *aOut.uuid1);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
rv = Convert(aIn.mU1, aOut.u1);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
rv = Convert(aIn.mU2, aOut.u2);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
rv = Convert(aIn.mU3, aOut.u3);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
rv = Convert(aIn.mU4, aOut.u4);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
rv = Convert(aIn.mU5, aOut.u5);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
return NS_OK;
}
#endif // ANDROID_VERSION >= 19
#if ANDROID_VERSION >= 21

View File

@ -891,6 +891,9 @@ Convert(const btgatt_write_params_t& aIn, BluetoothGattWriteParam& aOut);
nsresult
Convert(const btgatt_notify_params_t& aIn, BluetoothGattNotifyParam& aOut);
nsresult
Convert(const BluetoothGattTestParam& aIn, btgatt_test_params_t& aOut);
#endif // ANDROID_VERSION >= 19
#if ANDROID_VERSION >= 21