mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-26 12:20:56 +00:00
Bug 1187872: Remove HAL backend from Bluetooth, r=shuang
Bluedroid's HAL backend has been superseded by the Bluetooth daemon, and already been unused in current releases. This patch removes the code from Gecko.
This commit is contained in:
parent
7cb4d91eb5
commit
2f7aeaeba9
18
configure.in
18
configure.in
@ -230,15 +230,12 @@ if test -n "$gonkdir" ; then
|
|||||||
17|18)
|
17|18)
|
||||||
GONK_INCLUDES="-I$gonkdir/frameworks/native/include -I$gonkdir/frameworks/av/include -I$gonkdir/frameworks/av/include/media -I$gonkdir/frameworks/av/include/camera -I$gonkdir/frameworks/native/include/media/openmax -I$gonkdir/frameworks/av/media/libstagefright/include -I$gonkdir/external/mdnsresponder/mDNSShared"
|
GONK_INCLUDES="-I$gonkdir/frameworks/native/include -I$gonkdir/frameworks/av/include -I$gonkdir/frameworks/av/include/media -I$gonkdir/frameworks/av/include/camera -I$gonkdir/frameworks/native/include/media/openmax -I$gonkdir/frameworks/av/media/libstagefright/include -I$gonkdir/external/mdnsresponder/mDNSShared"
|
||||||
if test -d "$gonkdir/external/bluetooth/bluez"; then
|
if test -d "$gonkdir/external/bluetooth/bluez"; then
|
||||||
GONK_INCLUDES="$GONK_INCLUDES -I$gonkdir/external/dbus -I$gonkdir/external/bluetooth/bluez/lib"
|
GONK_INCLUDES="$GONK_INCLUDES -I$gonkdir/external/dbus -I$gonkdir/external/bluetooth/bluez/lib"
|
||||||
MOZ_B2G_BT=1
|
MOZ_B2G_BT=1
|
||||||
MOZ_B2G_BT_BLUEZ=1
|
MOZ_B2G_BT_BLUEZ=1
|
||||||
elif test -d "$gonkdir/external/bluetooth/bluedroid"; then
|
elif test -d "$gonkdir/system/bluetoothd"; then
|
||||||
MOZ_B2G_BT=1
|
MOZ_B2G_BT=1
|
||||||
MOZ_B2G_BT_BLUEDROID=1
|
MOZ_B2G_BT_DAEMON=1
|
||||||
if test -d "$gonkdir/system/bluetoothd"; then
|
|
||||||
MOZ_B2G_BT_DAEMON=1
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
MOZ_RTSP=1
|
MOZ_RTSP=1
|
||||||
@ -249,15 +246,14 @@ if test -n "$gonkdir" ; then
|
|||||||
MOZ_OMX_ENCODER=1
|
MOZ_OMX_ENCODER=1
|
||||||
AC_SUBST(MOZ_OMX_ENCODER)
|
AC_SUBST(MOZ_OMX_ENCODER)
|
||||||
AC_DEFINE(MOZ_OMX_ENCODER)
|
AC_DEFINE(MOZ_OMX_ENCODER)
|
||||||
MOZ_FMP4=1
|
MOZ_FMP4=1
|
||||||
MOZ_SECUREELEMENT=1
|
MOZ_SECUREELEMENT=1
|
||||||
;;
|
;;
|
||||||
19)
|
19)
|
||||||
GONK_INCLUDES="-I$gonkdir/frameworks/native/include -I$gonkdir/frameworks/av/include -I$gonkdir/frameworks/av/include/media -I$gonkdir/frameworks/av/include/camera -I$gonkdir/frameworks/native/include/media/openmax -I$gonkdir/frameworks/av/media/libstagefright/include -I$gonkdir/external/mdnsresponder/mDNSShared"
|
GONK_INCLUDES="-I$gonkdir/frameworks/native/include -I$gonkdir/frameworks/av/include -I$gonkdir/frameworks/av/include/media -I$gonkdir/frameworks/av/include/camera -I$gonkdir/frameworks/native/include/media/openmax -I$gonkdir/frameworks/av/media/libstagefright/include -I$gonkdir/external/mdnsresponder/mDNSShared"
|
||||||
MOZ_B2G_CAMERA=1
|
MOZ_B2G_CAMERA=1
|
||||||
MOZ_B2G_BT=1
|
|
||||||
MOZ_B2G_BT_BLUEDROID=1
|
|
||||||
if test -d "$gonkdir/system/bluetoothd"; then
|
if test -d "$gonkdir/system/bluetoothd"; then
|
||||||
|
MOZ_B2G_BT=1
|
||||||
MOZ_B2G_BT_DAEMON=1
|
MOZ_B2G_BT_DAEMON=1
|
||||||
fi
|
fi
|
||||||
MOZ_NFC=1
|
MOZ_NFC=1
|
||||||
@ -281,9 +277,8 @@ if test -n "$gonkdir" ; then
|
|||||||
AC_DEFINE(MOZ_AUDIO_OFFLOAD)
|
AC_DEFINE(MOZ_AUDIO_OFFLOAD)
|
||||||
MOZ_FMP4=
|
MOZ_FMP4=
|
||||||
MOZ_B2G_CAMERA=1
|
MOZ_B2G_CAMERA=1
|
||||||
MOZ_B2G_BT=1
|
|
||||||
MOZ_B2G_BT_BLUEDROID=1
|
|
||||||
if test -d "$gonkdir/system/bluetoothd"; then
|
if test -d "$gonkdir/system/bluetoothd"; then
|
||||||
|
MOZ_B2G_BT=1
|
||||||
MOZ_B2G_BT_DAEMON=1
|
MOZ_B2G_BT_DAEMON=1
|
||||||
fi
|
fi
|
||||||
MOZ_NFC=1
|
MOZ_NFC=1
|
||||||
@ -7605,7 +7600,6 @@ if test -n "$MOZ_B2G_BT"; then
|
|||||||
fi
|
fi
|
||||||
AC_SUBST(MOZ_B2G_BT)
|
AC_SUBST(MOZ_B2G_BT)
|
||||||
AC_SUBST(MOZ_B2G_BT_BLUEZ)
|
AC_SUBST(MOZ_B2G_BT_BLUEZ)
|
||||||
AC_SUBST(MOZ_B2G_BT_BLUEDROID)
|
|
||||||
AC_SUBST(MOZ_B2G_BT_DAEMON)
|
AC_SUBST(MOZ_B2G_BT_DAEMON)
|
||||||
|
|
||||||
dnl ========================================================
|
dnl ========================================================
|
||||||
|
@ -8,9 +8,6 @@
|
|||||||
#if ANDROID_VERSION >= 17
|
#if ANDROID_VERSION >= 17
|
||||||
#include <cutils/properties.h>
|
#include <cutils/properties.h>
|
||||||
#endif
|
#endif
|
||||||
#ifdef MOZ_B2G_BT_BLUEDROID
|
|
||||||
#include "BluetoothHALInterface.h"
|
|
||||||
#endif
|
|
||||||
#ifdef MOZ_B2G_BT_DAEMON
|
#ifdef MOZ_B2G_BT_DAEMON
|
||||||
#include "BluetoothDaemonInterface.h"
|
#include "BluetoothDaemonInterface.h"
|
||||||
#endif
|
#endif
|
||||||
@ -146,9 +143,6 @@ BluetoothInterface::GetInstance()
|
|||||||
static const char* const sDefaultBackend[] = {
|
static const char* const sDefaultBackend[] = {
|
||||||
#ifdef MOZ_B2G_BT_DAEMON
|
#ifdef MOZ_B2G_BT_DAEMON
|
||||||
"bluetoothd",
|
"bluetoothd",
|
||||||
#endif
|
|
||||||
#ifdef MOZ_B2G_BT_BLUEDROID
|
|
||||||
"bluedroid",
|
|
||||||
#endif
|
#endif
|
||||||
nullptr // no default backend; must be final element in array
|
nullptr // no default backend; must be final element in array
|
||||||
};
|
};
|
||||||
@ -186,11 +180,6 @@ BluetoothInterface::GetInstance()
|
|||||||
* correct one at runtime is also an option.
|
* correct one at runtime is also an option.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef MOZ_B2G_BT_BLUEDROID
|
|
||||||
if (backend.LowerCaseEqualsLiteral("bluedroid")) {
|
|
||||||
return BluetoothHALInterface::GetInstance();
|
|
||||||
} else
|
|
||||||
#endif
|
|
||||||
#ifdef MOZ_B2G_BT_DAEMON
|
#ifdef MOZ_B2G_BT_DAEMON
|
||||||
if (backend.LowerCaseEqualsLiteral("bluetoothd")) {
|
if (backend.LowerCaseEqualsLiteral("bluetoothd")) {
|
||||||
return BluetoothDaemonInterface::GetInstance();
|
return BluetoothDaemonInterface::GetInstance();
|
||||||
|
@ -1,203 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
||||||
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
||||||
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
#include "BluetoothA2dpHALInterface.h"
|
|
||||||
#include "BluetoothHALHelpers.h"
|
|
||||||
|
|
||||||
BEGIN_BLUETOOTH_NAMESPACE
|
|
||||||
|
|
||||||
typedef
|
|
||||||
BluetoothHALInterfaceRunnable0<BluetoothA2dpResultHandler, void>
|
|
||||||
BluetoothA2dpHALResultRunnable;
|
|
||||||
|
|
||||||
typedef
|
|
||||||
BluetoothHALInterfaceRunnable1<BluetoothA2dpResultHandler, void,
|
|
||||||
BluetoothStatus, BluetoothStatus>
|
|
||||||
BluetoothA2dpHALErrorRunnable;
|
|
||||||
|
|
||||||
static nsresult
|
|
||||||
DispatchBluetoothA2dpHALResult(
|
|
||||||
BluetoothA2dpResultHandler* aRes,
|
|
||||||
void (BluetoothA2dpResultHandler::*aMethod)(),
|
|
||||||
BluetoothStatus aStatus)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(aRes);
|
|
||||||
|
|
||||||
nsRefPtr<nsRunnable> runnable;
|
|
||||||
|
|
||||||
if (aStatus == STATUS_SUCCESS) {
|
|
||||||
runnable = new BluetoothA2dpHALResultRunnable(aRes, aMethod);
|
|
||||||
} else {
|
|
||||||
runnable = new BluetoothA2dpHALErrorRunnable(aRes,
|
|
||||||
&BluetoothA2dpResultHandler::OnError, aStatus);
|
|
||||||
}
|
|
||||||
nsresult rv = NS_DispatchToMainThread(runnable);
|
|
||||||
if (NS_FAILED(rv)) {
|
|
||||||
BT_WARNING("NS_DispatchToMainThread failed: %X", rv);
|
|
||||||
}
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Notification handling
|
|
||||||
//
|
|
||||||
|
|
||||||
static BluetoothA2dpNotificationHandler* sA2dpNotificationHandler;
|
|
||||||
|
|
||||||
struct BluetoothA2dpHALCallback
|
|
||||||
{
|
|
||||||
class A2dpNotificationHandlerWrapper
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
typedef BluetoothA2dpNotificationHandler ObjectType;
|
|
||||||
|
|
||||||
static ObjectType* GetInstance()
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(NS_IsMainThread());
|
|
||||||
|
|
||||||
return sA2dpNotificationHandler;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Notifications
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable2<
|
|
||||||
A2dpNotificationHandlerWrapper, void,
|
|
||||||
BluetoothA2dpConnectionState, nsString,
|
|
||||||
BluetoothA2dpConnectionState, const nsAString&>
|
|
||||||
ConnectionStateNotification;
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable2<
|
|
||||||
A2dpNotificationHandlerWrapper, void,
|
|
||||||
BluetoothA2dpAudioState, nsString,
|
|
||||||
BluetoothA2dpAudioState, const nsAString&>
|
|
||||||
AudioStateNotification;
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable3<
|
|
||||||
A2dpNotificationHandlerWrapper, void,
|
|
||||||
nsString, uint32_t, uint8_t,
|
|
||||||
const nsAString&, uint32_t, uint8_t>
|
|
||||||
AudioConfigNotification;
|
|
||||||
|
|
||||||
// Bluedroid A2DP callbacks
|
|
||||||
|
|
||||||
static void
|
|
||||||
ConnectionState(btav_connection_state_t aState, bt_bdaddr_t* aBdAddr)
|
|
||||||
{
|
|
||||||
ConnectionStateNotification::Dispatch(
|
|
||||||
&BluetoothA2dpNotificationHandler::ConnectionStateNotification,
|
|
||||||
aState, aBdAddr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
AudioState(btav_audio_state_t aState, bt_bdaddr_t* aBdAddr)
|
|
||||||
{
|
|
||||||
AudioStateNotification::Dispatch(
|
|
||||||
&BluetoothA2dpNotificationHandler::AudioStateNotification,
|
|
||||||
aState, aBdAddr);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 21
|
|
||||||
static void
|
|
||||||
AudioConfig(bt_bdaddr_t *aBdAddr, uint32_t aSampleRate, uint8_t aChannelCount)
|
|
||||||
{
|
|
||||||
AudioConfigNotification::Dispatch(
|
|
||||||
&BluetoothA2dpNotificationHandler::AudioConfigNotification,
|
|
||||||
aBdAddr, aSampleRate, aChannelCount);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
// Interface
|
|
||||||
//
|
|
||||||
|
|
||||||
BluetoothA2dpHALInterface::BluetoothA2dpHALInterface(
|
|
||||||
const btav_interface_t* aInterface)
|
|
||||||
: mInterface(aInterface)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(mInterface);
|
|
||||||
}
|
|
||||||
|
|
||||||
BluetoothA2dpHALInterface::~BluetoothA2dpHALInterface()
|
|
||||||
{ }
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothA2dpHALInterface::Init(
|
|
||||||
BluetoothA2dpNotificationHandler* aNotificationHandler,
|
|
||||||
BluetoothA2dpResultHandler* aRes)
|
|
||||||
{
|
|
||||||
static btav_callbacks_t sCallbacks = {
|
|
||||||
sizeof(sCallbacks),
|
|
||||||
BluetoothA2dpHALCallback::ConnectionState,
|
|
||||||
BluetoothA2dpHALCallback::AudioState,
|
|
||||||
#if ANDROID_VERSION >= 21
|
|
||||||
BluetoothA2dpHALCallback::AudioConfig
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
sA2dpNotificationHandler = aNotificationHandler;
|
|
||||||
|
|
||||||
bt_status_t status = mInterface->init(&sCallbacks);
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothA2dpHALResult(aRes,
|
|
||||||
&BluetoothA2dpResultHandler::Init,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothA2dpHALInterface::Cleanup(BluetoothA2dpResultHandler* aRes)
|
|
||||||
{
|
|
||||||
mInterface->cleanup();
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothA2dpHALResult(aRes,
|
|
||||||
&BluetoothA2dpResultHandler::Cleanup,
|
|
||||||
STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothA2dpHALInterface::Connect(const nsAString& aBdAddr,
|
|
||||||
BluetoothA2dpResultHandler* aRes)
|
|
||||||
{
|
|
||||||
bt_status_t status;
|
|
||||||
bt_bdaddr_t bdAddr;
|
|
||||||
|
|
||||||
if (NS_SUCCEEDED(Convert(aBdAddr, bdAddr))) {
|
|
||||||
status = mInterface->connect(&bdAddr);
|
|
||||||
} else {
|
|
||||||
status = BT_STATUS_PARM_INVALID;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothA2dpHALResult(
|
|
||||||
aRes, &BluetoothA2dpResultHandler::Connect,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothA2dpHALInterface::Disconnect(const nsAString& aBdAddr,
|
|
||||||
BluetoothA2dpResultHandler* aRes)
|
|
||||||
{
|
|
||||||
bt_status_t status;
|
|
||||||
bt_bdaddr_t bdAddr;
|
|
||||||
|
|
||||||
if (NS_SUCCEEDED(Convert(aBdAddr, bdAddr))) {
|
|
||||||
status = mInterface->disconnect(&bdAddr);
|
|
||||||
} else {
|
|
||||||
status = BT_STATUS_PARM_INVALID;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothA2dpHALResult(
|
|
||||||
aRes, &BluetoothA2dpResultHandler::Disconnect,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
END_BLUETOOTH_NAMESPACE
|
|
@ -1,44 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
||||||
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
||||||
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
#ifndef mozilla_dom_bluetooth_bluedroid_bluetootha2dphalinterface_h__
|
|
||||||
#define mozilla_dom_bluetooth_bluedroid_bluetootha2dphalinterface_h__
|
|
||||||
|
|
||||||
#include <hardware/bluetooth.h>
|
|
||||||
#include <hardware/bt_av.h>
|
|
||||||
#include "BluetoothCommon.h"
|
|
||||||
#include "BluetoothInterface.h"
|
|
||||||
|
|
||||||
BEGIN_BLUETOOTH_NAMESPACE
|
|
||||||
|
|
||||||
class BluetoothHALInterface;
|
|
||||||
|
|
||||||
class BluetoothA2dpHALInterface final
|
|
||||||
: public BluetoothA2dpInterface
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
friend class BluetoothHALInterface;
|
|
||||||
|
|
||||||
void Init(BluetoothA2dpNotificationHandler* aNotificationHandler,
|
|
||||||
BluetoothA2dpResultHandler* aRes);
|
|
||||||
void Cleanup(BluetoothA2dpResultHandler* aRes);
|
|
||||||
|
|
||||||
void Connect(const nsAString& aBdAddr,
|
|
||||||
BluetoothA2dpResultHandler* aRes);
|
|
||||||
void Disconnect(const nsAString& aBdAddr,
|
|
||||||
BluetoothA2dpResultHandler* aRes);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
BluetoothA2dpHALInterface(const btav_interface_t* aInterface);
|
|
||||||
~BluetoothA2dpHALInterface();
|
|
||||||
|
|
||||||
private:
|
|
||||||
const btav_interface_t* mInterface;
|
|
||||||
};
|
|
||||||
|
|
||||||
END_BLUETOOTH_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,593 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
||||||
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
||||||
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
#include "BluetoothAvrcpHALInterface.h"
|
|
||||||
#include "BluetoothHALHelpers.h"
|
|
||||||
|
|
||||||
BEGIN_BLUETOOTH_NAMESPACE
|
|
||||||
|
|
||||||
typedef
|
|
||||||
BluetoothHALInterfaceRunnable0<BluetoothAvrcpResultHandler, void>
|
|
||||||
BluetoothAvrcpHALResultRunnable;
|
|
||||||
|
|
||||||
typedef
|
|
||||||
BluetoothHALInterfaceRunnable1<BluetoothAvrcpResultHandler, void,
|
|
||||||
BluetoothStatus, BluetoothStatus>
|
|
||||||
BluetoothAvrcpHALErrorRunnable;
|
|
||||||
|
|
||||||
static nsresult
|
|
||||||
DispatchBluetoothAvrcpHALResult(
|
|
||||||
BluetoothAvrcpResultHandler* aRes,
|
|
||||||
void (BluetoothAvrcpResultHandler::*aMethod)(),
|
|
||||||
BluetoothStatus aStatus)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(aRes);
|
|
||||||
|
|
||||||
nsRefPtr<nsRunnable> runnable;
|
|
||||||
|
|
||||||
if (aStatus == STATUS_SUCCESS) {
|
|
||||||
runnable = new BluetoothAvrcpHALResultRunnable(aRes, aMethod);
|
|
||||||
} else {
|
|
||||||
runnable = new BluetoothAvrcpHALErrorRunnable(aRes,
|
|
||||||
&BluetoothAvrcpResultHandler::OnError, aStatus);
|
|
||||||
}
|
|
||||||
nsresult rv = NS_DispatchToMainThread(runnable);
|
|
||||||
if (NS_FAILED(rv)) {
|
|
||||||
BT_WARNING("NS_DispatchToMainThread failed: %X", rv);
|
|
||||||
}
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Notification handling
|
|
||||||
//
|
|
||||||
|
|
||||||
static BluetoothAvrcpNotificationHandler* sAvrcpNotificationHandler;
|
|
||||||
|
|
||||||
struct BluetoothAvrcpCallback
|
|
||||||
{
|
|
||||||
class AvrcpNotificationHandlerWrapper
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
typedef BluetoothAvrcpNotificationHandler ObjectType;
|
|
||||||
|
|
||||||
static ObjectType* GetInstance()
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(NS_IsMainThread());
|
|
||||||
|
|
||||||
return sAvrcpNotificationHandler;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Notifications
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable0<AvrcpNotificationHandlerWrapper,
|
|
||||||
void>
|
|
||||||
GetPlayStatusNotification;
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable0<AvrcpNotificationHandlerWrapper,
|
|
||||||
void>
|
|
||||||
ListPlayerAppAttrNotification;
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable1<AvrcpNotificationHandlerWrapper,
|
|
||||||
void,
|
|
||||||
BluetoothAvrcpPlayerAttribute>
|
|
||||||
ListPlayerAppValuesNotification;
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable2<AvrcpNotificationHandlerWrapper, void,
|
|
||||||
uint8_t, nsAutoArrayPtr<BluetoothAvrcpPlayerAttribute>,
|
|
||||||
uint8_t, const BluetoothAvrcpPlayerAttribute*>
|
|
||||||
GetPlayerAppValueNotification;
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable2<AvrcpNotificationHandlerWrapper, void,
|
|
||||||
uint8_t, nsAutoArrayPtr<BluetoothAvrcpPlayerAttribute>,
|
|
||||||
uint8_t, const BluetoothAvrcpPlayerAttribute*>
|
|
||||||
GetPlayerAppAttrsTextNotification;
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable3<AvrcpNotificationHandlerWrapper,
|
|
||||||
void,
|
|
||||||
uint8_t, uint8_t,
|
|
||||||
nsAutoArrayPtr<uint8_t>,
|
|
||||||
uint8_t, uint8_t, const uint8_t*>
|
|
||||||
GetPlayerAppValuesTextNotification;
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable1<AvrcpNotificationHandlerWrapper,
|
|
||||||
void,
|
|
||||||
BluetoothAvrcpPlayerSettings,
|
|
||||||
const BluetoothAvrcpPlayerSettings&>
|
|
||||||
SetPlayerAppValueNotification;
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable2<AvrcpNotificationHandlerWrapper, void,
|
|
||||||
uint8_t, nsAutoArrayPtr<BluetoothAvrcpMediaAttribute>,
|
|
||||||
uint8_t, const BluetoothAvrcpMediaAttribute*>
|
|
||||||
GetElementAttrNotification;
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable2<AvrcpNotificationHandlerWrapper,
|
|
||||||
void,
|
|
||||||
BluetoothAvrcpEvent, uint32_t>
|
|
||||||
RegisterNotificationNotification;
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable2<AvrcpNotificationHandlerWrapper,
|
|
||||||
void,
|
|
||||||
nsString, unsigned long,
|
|
||||||
const nsAString&>
|
|
||||||
RemoteFeatureNotification;
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable2<AvrcpNotificationHandlerWrapper,
|
|
||||||
void,
|
|
||||||
uint8_t, uint8_t>
|
|
||||||
VolumeChangeNotification;
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable2<AvrcpNotificationHandlerWrapper,
|
|
||||||
void,
|
|
||||||
int, int>
|
|
||||||
PassthroughCmdNotification;
|
|
||||||
|
|
||||||
// Bluedroid AVRCP callbacks
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 18
|
|
||||||
static void
|
|
||||||
GetPlayStatus()
|
|
||||||
{
|
|
||||||
GetPlayStatusNotification::Dispatch(
|
|
||||||
&BluetoothAvrcpNotificationHandler::GetPlayStatusNotification);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
ListPlayerAppAttr()
|
|
||||||
{
|
|
||||||
ListPlayerAppAttrNotification::Dispatch(
|
|
||||||
&BluetoothAvrcpNotificationHandler::ListPlayerAppAttrNotification);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
ListPlayerAppValues(btrc_player_attr_t aAttrId)
|
|
||||||
{
|
|
||||||
ListPlayerAppValuesNotification::Dispatch(
|
|
||||||
&BluetoothAvrcpNotificationHandler::ListPlayerAppValuesNotification,
|
|
||||||
aAttrId);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
GetPlayerAppValue(uint8_t aNumAttrs, btrc_player_attr_t* aAttrs)
|
|
||||||
{
|
|
||||||
GetPlayerAppValueNotification::Dispatch(
|
|
||||||
&BluetoothAvrcpNotificationHandler::GetPlayerAppValueNotification,
|
|
||||||
aNumAttrs, ConvertArray<btrc_player_attr_t>(aAttrs, aNumAttrs));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
GetPlayerAppAttrsText(uint8_t aNumAttrs, btrc_player_attr_t* aAttrs)
|
|
||||||
{
|
|
||||||
GetPlayerAppAttrsTextNotification::Dispatch(
|
|
||||||
&BluetoothAvrcpNotificationHandler::GetPlayerAppAttrsTextNotification,
|
|
||||||
aNumAttrs, ConvertArray<btrc_player_attr_t>(aAttrs, aNumAttrs));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
GetPlayerAppValuesText(uint8_t aAttrId, uint8_t aNumVals, uint8_t* aVals)
|
|
||||||
{
|
|
||||||
GetPlayerAppValuesTextNotification::Dispatch(
|
|
||||||
&BluetoothAvrcpNotificationHandler::GetPlayerAppValuesTextNotification,
|
|
||||||
aAttrId, aNumVals, ConvertArray<uint8_t>(aVals, aNumVals));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
SetPlayerAppValue(btrc_player_settings_t* aVals)
|
|
||||||
{
|
|
||||||
SetPlayerAppValueNotification::Dispatch(
|
|
||||||
&BluetoothAvrcpNotificationHandler::SetPlayerAppValueNotification,
|
|
||||||
*aVals);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
GetElementAttr(uint8_t aNumAttrs, btrc_media_attr_t* aAttrs)
|
|
||||||
{
|
|
||||||
GetElementAttrNotification::Dispatch(
|
|
||||||
&BluetoothAvrcpNotificationHandler::GetElementAttrNotification,
|
|
||||||
aNumAttrs, ConvertArray<btrc_media_attr_t>(aAttrs, aNumAttrs));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
RegisterNotification(btrc_event_id_t aEvent, uint32_t aParam)
|
|
||||||
{
|
|
||||||
RegisterNotificationNotification::Dispatch(
|
|
||||||
&BluetoothAvrcpNotificationHandler::RegisterNotificationNotification,
|
|
||||||
aEvent, aParam);
|
|
||||||
}
|
|
||||||
#endif // ANDROID_VERSION >= 18
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 19
|
|
||||||
static void
|
|
||||||
RemoteFeature(bt_bdaddr_t* aBdAddr, btrc_remote_features_t aFeatures)
|
|
||||||
{
|
|
||||||
RemoteFeatureNotification::Dispatch(
|
|
||||||
&BluetoothAvrcpNotificationHandler::RemoteFeatureNotification,
|
|
||||||
aBdAddr, aFeatures);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
VolumeChange(uint8_t aVolume, uint8_t aCType)
|
|
||||||
{
|
|
||||||
VolumeChangeNotification::Dispatch(
|
|
||||||
&BluetoothAvrcpNotificationHandler::VolumeChangeNotification,
|
|
||||||
aVolume, aCType);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
PassthroughCmd(int aId, int aKeyState)
|
|
||||||
{
|
|
||||||
PassthroughCmdNotification::Dispatch(
|
|
||||||
&BluetoothAvrcpNotificationHandler::PassthroughCmdNotification,
|
|
||||||
aId, aKeyState);
|
|
||||||
}
|
|
||||||
#endif // ANDROID_VERSION >= 19
|
|
||||||
};
|
|
||||||
|
|
||||||
// Interface
|
|
||||||
//
|
|
||||||
|
|
||||||
BluetoothAvrcpHALInterface::BluetoothAvrcpHALInterface(
|
|
||||||
#if ANDROID_VERSION >= 18
|
|
||||||
const btrc_interface_t* aInterface
|
|
||||||
#endif
|
|
||||||
)
|
|
||||||
#if ANDROID_VERSION >= 18
|
|
||||||
: mInterface(aInterface)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
#if ANDROID_VERSION >= 18
|
|
||||||
MOZ_ASSERT(mInterface);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
BluetoothAvrcpHALInterface::~BluetoothAvrcpHALInterface()
|
|
||||||
{ }
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothAvrcpHALInterface::Init(
|
|
||||||
BluetoothAvrcpNotificationHandler* aNotificationHandler,
|
|
||||||
BluetoothAvrcpResultHandler* aRes)
|
|
||||||
{
|
|
||||||
#if ANDROID_VERSION >= 18
|
|
||||||
static btrc_callbacks_t sCallbacks = {
|
|
||||||
sizeof(sCallbacks),
|
|
||||||
#if ANDROID_VERSION >= 19
|
|
||||||
BluetoothAvrcpCallback::RemoteFeature,
|
|
||||||
#endif
|
|
||||||
BluetoothAvrcpCallback::GetPlayStatus,
|
|
||||||
BluetoothAvrcpCallback::ListPlayerAppAttr,
|
|
||||||
BluetoothAvrcpCallback::ListPlayerAppValues,
|
|
||||||
BluetoothAvrcpCallback::GetPlayerAppValue,
|
|
||||||
BluetoothAvrcpCallback::GetPlayerAppAttrsText,
|
|
||||||
BluetoothAvrcpCallback::GetPlayerAppValuesText,
|
|
||||||
BluetoothAvrcpCallback::SetPlayerAppValue,
|
|
||||||
BluetoothAvrcpCallback::GetElementAttr,
|
|
||||||
BluetoothAvrcpCallback::RegisterNotification
|
|
||||||
#if ANDROID_VERSION >= 19
|
|
||||||
,
|
|
||||||
BluetoothAvrcpCallback::VolumeChange,
|
|
||||||
BluetoothAvrcpCallback::PassthroughCmd
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
#endif // ANDROID_VERSION >= 18
|
|
||||||
|
|
||||||
sAvrcpNotificationHandler = aNotificationHandler;
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 18
|
|
||||||
bt_status_t status = mInterface->init(&sCallbacks);
|
|
||||||
#else
|
|
||||||
bt_status_t status = BT_STATUS_UNSUPPORTED;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothAvrcpHALResult(aRes, &BluetoothAvrcpResultHandler::Init,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothAvrcpHALInterface::Cleanup(BluetoothAvrcpResultHandler* aRes)
|
|
||||||
{
|
|
||||||
#if ANDROID_VERSION >= 18
|
|
||||||
mInterface->cleanup();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothAvrcpHALResult(aRes,
|
|
||||||
&BluetoothAvrcpResultHandler::Cleanup, STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothAvrcpHALInterface::GetPlayStatusRsp(
|
|
||||||
ControlPlayStatus aPlayStatus, uint32_t aSongLen, uint32_t aSongPos,
|
|
||||||
BluetoothAvrcpResultHandler* aRes)
|
|
||||||
{
|
|
||||||
bt_status_t status;
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 18
|
|
||||||
btrc_play_status_t playStatus = BTRC_PLAYSTATE_STOPPED;
|
|
||||||
|
|
||||||
if (!(NS_FAILED(Convert(aPlayStatus, playStatus)))) {
|
|
||||||
status = mInterface->get_play_status_rsp(playStatus, aSongLen, aSongPos);
|
|
||||||
} else {
|
|
||||||
status = BT_STATUS_PARM_INVALID;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
status = BT_STATUS_UNSUPPORTED;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothAvrcpHALResult(
|
|
||||||
aRes, &BluetoothAvrcpResultHandler::GetPlayStatusRsp,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothAvrcpHALInterface::ListPlayerAppAttrRsp(
|
|
||||||
int aNumAttr, const BluetoothAvrcpPlayerAttribute* aPAttrs,
|
|
||||||
BluetoothAvrcpResultHandler* aRes)
|
|
||||||
{
|
|
||||||
bt_status_t status;
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 18
|
|
||||||
ConvertArray<BluetoothAvrcpPlayerAttribute> pAttrsArray(aPAttrs, aNumAttr);
|
|
||||||
nsAutoArrayPtr<btrc_player_attr_t> pAttrs;
|
|
||||||
|
|
||||||
if (NS_SUCCEEDED(Convert(pAttrsArray, pAttrs))) {
|
|
||||||
status = mInterface->list_player_app_attr_rsp(aNumAttr, pAttrs);
|
|
||||||
} else {
|
|
||||||
status = BT_STATUS_PARM_INVALID;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
status = BT_STATUS_UNSUPPORTED;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothAvrcpHALResult(
|
|
||||||
aRes, &BluetoothAvrcpResultHandler::ListPlayerAppAttrRsp,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothAvrcpHALInterface::ListPlayerAppValueRsp(
|
|
||||||
int aNumVal, uint8_t* aPVals, BluetoothAvrcpResultHandler* aRes)
|
|
||||||
{
|
|
||||||
#if ANDROID_VERSION >= 18
|
|
||||||
bt_status_t status = mInterface->list_player_app_value_rsp(aNumVal, aPVals);
|
|
||||||
#else
|
|
||||||
bt_status_t status = BT_STATUS_UNSUPPORTED;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothAvrcpHALResult(
|
|
||||||
aRes, &BluetoothAvrcpResultHandler::ListPlayerAppValueRsp,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothAvrcpHALInterface::GetPlayerAppValueRsp(
|
|
||||||
uint8_t aNumAttrs, const uint8_t* aIds, const uint8_t* aValues,
|
|
||||||
BluetoothAvrcpResultHandler* aRes)
|
|
||||||
{
|
|
||||||
bt_status_t status;
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 18
|
|
||||||
btrc_player_settings_t pVals;
|
|
||||||
|
|
||||||
/* FIXME: you need to implement the missing conversion functions */
|
|
||||||
NS_NOTREACHED("Conversion function missing");
|
|
||||||
|
|
||||||
if (false /* TODO: we don't support any player app values currently */) {
|
|
||||||
status = mInterface->get_player_app_value_rsp(&pVals);
|
|
||||||
} else {
|
|
||||||
status = BT_STATUS_PARM_INVALID;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
status = BT_STATUS_UNSUPPORTED;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothAvrcpHALResult(
|
|
||||||
aRes, &BluetoothAvrcpResultHandler::GetPlayerAppValueRsp,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothAvrcpHALInterface::GetPlayerAppAttrTextRsp(
|
|
||||||
int aNumAttr, const uint8_t* aIds, const char** aTexts,
|
|
||||||
BluetoothAvrcpResultHandler* aRes)
|
|
||||||
{
|
|
||||||
bt_status_t status;
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 18
|
|
||||||
btrc_player_setting_text_t* aPAttrs;
|
|
||||||
|
|
||||||
/* FIXME: you need to implement the missing conversion functions */
|
|
||||||
NS_NOTREACHED("Conversion function missing");
|
|
||||||
|
|
||||||
if (false /* TODO: we don't support any attributes currently */) {
|
|
||||||
status = mInterface->get_player_app_attr_text_rsp(aNumAttr, aPAttrs);
|
|
||||||
} else {
|
|
||||||
status = BT_STATUS_PARM_INVALID;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
status = BT_STATUS_UNSUPPORTED;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothAvrcpHALResult(
|
|
||||||
aRes, &BluetoothAvrcpResultHandler::GetPlayerAppAttrTextRsp,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothAvrcpHALInterface::GetPlayerAppValueTextRsp(
|
|
||||||
int aNumVal, const uint8_t* aIds, const char** aTexts,
|
|
||||||
BluetoothAvrcpResultHandler* aRes)
|
|
||||||
{
|
|
||||||
bt_status_t status;
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 18
|
|
||||||
btrc_player_setting_text_t* pVals;
|
|
||||||
|
|
||||||
/* FIXME: you need to implement the missing conversion functions */
|
|
||||||
NS_NOTREACHED("Conversion function missing");
|
|
||||||
|
|
||||||
if (false /* TODO: we don't support any values currently */) {
|
|
||||||
status = mInterface->get_player_app_value_text_rsp(aNumVal, pVals);
|
|
||||||
} else {
|
|
||||||
status = BT_STATUS_PARM_INVALID;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
status = BT_STATUS_UNSUPPORTED;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothAvrcpHALResult(
|
|
||||||
aRes, &BluetoothAvrcpResultHandler::GetPlayerAppValueTextRsp,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothAvrcpHALInterface::GetElementAttrRsp(
|
|
||||||
uint8_t aNumAttr, const BluetoothAvrcpElementAttribute* aAttrs,
|
|
||||||
BluetoothAvrcpResultHandler* aRes)
|
|
||||||
{
|
|
||||||
bt_status_t status;
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 18
|
|
||||||
ConvertArray<BluetoothAvrcpElementAttribute> pAttrsArray(aAttrs, aNumAttr);
|
|
||||||
nsAutoArrayPtr<btrc_element_attr_val_t> pAttrs;
|
|
||||||
|
|
||||||
if (NS_SUCCEEDED(Convert(pAttrsArray, pAttrs))) {
|
|
||||||
status = mInterface->get_element_attr_rsp(aNumAttr, pAttrs);
|
|
||||||
} else {
|
|
||||||
status = BT_STATUS_PARM_INVALID;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
status = BT_STATUS_UNSUPPORTED;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothAvrcpHALResult(
|
|
||||||
aRes, &BluetoothAvrcpResultHandler::GetElementAttrRsp,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothAvrcpHALInterface::SetPlayerAppValueRsp(
|
|
||||||
BluetoothAvrcpStatus aRspStatus, BluetoothAvrcpResultHandler* aRes)
|
|
||||||
{
|
|
||||||
bt_status_t status;
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 18
|
|
||||||
btrc_status_t rspStatus = BTRC_STS_BAD_CMD; // silences compiler warning
|
|
||||||
|
|
||||||
if (NS_SUCCEEDED(Convert(aRspStatus, rspStatus))) {
|
|
||||||
status = mInterface->set_player_app_value_rsp(rspStatus);
|
|
||||||
} else {
|
|
||||||
status = BT_STATUS_PARM_INVALID;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
status = BT_STATUS_UNSUPPORTED;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothAvrcpHALResult(
|
|
||||||
aRes, &BluetoothAvrcpResultHandler::SetPlayerAppValueRsp,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothAvrcpHALInterface::RegisterNotificationRsp(
|
|
||||||
BluetoothAvrcpEvent aEvent, BluetoothAvrcpNotification aType,
|
|
||||||
const BluetoothAvrcpNotificationParam& aParam,
|
|
||||||
BluetoothAvrcpResultHandler* aRes)
|
|
||||||
{
|
|
||||||
bt_status_t status;
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 18
|
|
||||||
nsresult rv;
|
|
||||||
btrc_event_id_t event = { };
|
|
||||||
btrc_notification_type_t type = BTRC_NOTIFICATION_TYPE_INTERIM;
|
|
||||||
btrc_register_notification_t param;
|
|
||||||
|
|
||||||
switch (aEvent) {
|
|
||||||
case AVRCP_EVENT_PLAY_STATUS_CHANGED:
|
|
||||||
rv = Convert(aParam.mPlayStatus, param.play_status);
|
|
||||||
break;
|
|
||||||
case AVRCP_EVENT_TRACK_CHANGE:
|
|
||||||
MOZ_ASSERT(sizeof(aParam.mTrack) == sizeof(param.track));
|
|
||||||
memcpy(param.track, aParam.mTrack, sizeof(param.track));
|
|
||||||
rv = NS_OK;
|
|
||||||
break;
|
|
||||||
case AVRCP_EVENT_TRACK_REACHED_END:
|
|
||||||
NS_NOTREACHED("Unknown conversion");
|
|
||||||
rv = NS_ERROR_ILLEGAL_VALUE;
|
|
||||||
break;
|
|
||||||
case AVRCP_EVENT_TRACK_REACHED_START:
|
|
||||||
NS_NOTREACHED("Unknown conversion");
|
|
||||||
rv = NS_ERROR_ILLEGAL_VALUE;
|
|
||||||
break;
|
|
||||||
case AVRCP_EVENT_PLAY_POS_CHANGED:
|
|
||||||
param.song_pos = aParam.mSongPos;
|
|
||||||
rv = NS_OK;
|
|
||||||
break;
|
|
||||||
case AVRCP_EVENT_APP_SETTINGS_CHANGED:
|
|
||||||
NS_NOTREACHED("Unknown conversion");
|
|
||||||
rv = NS_ERROR_ILLEGAL_VALUE;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
NS_NOTREACHED("Unknown conversion");
|
|
||||||
rv = NS_ERROR_ILLEGAL_VALUE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (NS_SUCCEEDED(rv) &&
|
|
||||||
NS_SUCCEEDED(Convert(aEvent, event)) &&
|
|
||||||
NS_SUCCEEDED(Convert(aType, type))) {
|
|
||||||
status = mInterface->register_notification_rsp(event, type, ¶m);
|
|
||||||
} else {
|
|
||||||
status = BT_STATUS_PARM_INVALID;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
status = BT_STATUS_UNSUPPORTED;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothAvrcpHALResult(
|
|
||||||
aRes, &BluetoothAvrcpResultHandler::RegisterNotificationRsp,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothAvrcpHALInterface::SetVolume(uint8_t aVolume,
|
|
||||||
BluetoothAvrcpResultHandler* aRes)
|
|
||||||
{
|
|
||||||
#if ANDROID_VERSION >= 19
|
|
||||||
bt_status_t status = mInterface->set_volume(aVolume);
|
|
||||||
#else
|
|
||||||
bt_status_t status = BT_STATUS_UNSUPPORTED;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothAvrcpHALResult(
|
|
||||||
aRes, &BluetoothAvrcpResultHandler::SetVolume,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
END_BLUETOOTH_NAMESPACE
|
|
@ -1,84 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
||||||
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
||||||
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
#ifndef mozilla_dom_bluetooth_bluedroid_bluetoothavrcphalinterface_h__
|
|
||||||
#define mozilla_dom_bluetooth_bluedroid_bluetoothavrcphalinterface_h__
|
|
||||||
|
|
||||||
#include <hardware/bluetooth.h>
|
|
||||||
#if ANDROID_VERSION >= 18
|
|
||||||
#include <hardware/bt_rc.h>
|
|
||||||
#endif
|
|
||||||
#include "BluetoothCommon.h"
|
|
||||||
#include "BluetoothInterface.h"
|
|
||||||
|
|
||||||
BEGIN_BLUETOOTH_NAMESPACE
|
|
||||||
|
|
||||||
class BluetoothHALInterface;
|
|
||||||
|
|
||||||
class BluetoothAvrcpHALInterface final
|
|
||||||
: public BluetoothAvrcpInterface
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
friend class BluetoothHALInterface;
|
|
||||||
|
|
||||||
void Init(BluetoothAvrcpNotificationHandler* aNotificationHandler,
|
|
||||||
BluetoothAvrcpResultHandler* aRes);
|
|
||||||
void Cleanup(BluetoothAvrcpResultHandler* aRes);
|
|
||||||
|
|
||||||
void GetPlayStatusRsp(ControlPlayStatus aPlayStatus,
|
|
||||||
uint32_t aSongLen, uint32_t aSongPos,
|
|
||||||
BluetoothAvrcpResultHandler* aRes);
|
|
||||||
|
|
||||||
void ListPlayerAppAttrRsp(int aNumAttr,
|
|
||||||
const BluetoothAvrcpPlayerAttribute* aPAttrs,
|
|
||||||
BluetoothAvrcpResultHandler* aRes);
|
|
||||||
void ListPlayerAppValueRsp(int aNumVal, uint8_t* aPVals,
|
|
||||||
BluetoothAvrcpResultHandler* aRes);
|
|
||||||
|
|
||||||
/* TODO: redesign this interface once we actually use it */
|
|
||||||
void GetPlayerAppValueRsp(uint8_t aNumAttrs,
|
|
||||||
const uint8_t* aIds, const uint8_t* aValues,
|
|
||||||
BluetoothAvrcpResultHandler* aRes);
|
|
||||||
/* TODO: redesign this interface once we actually use it */
|
|
||||||
void GetPlayerAppAttrTextRsp(int aNumAttr,
|
|
||||||
const uint8_t* aIds, const char** aTexts,
|
|
||||||
BluetoothAvrcpResultHandler* aRes);
|
|
||||||
/* TODO: redesign this interface once we actually use it */
|
|
||||||
void GetPlayerAppValueTextRsp(int aNumVal,
|
|
||||||
const uint8_t* aIds, const char** aTexts,
|
|
||||||
BluetoothAvrcpResultHandler* aRes);
|
|
||||||
|
|
||||||
void GetElementAttrRsp(uint8_t aNumAttr,
|
|
||||||
const BluetoothAvrcpElementAttribute* aAttr,
|
|
||||||
BluetoothAvrcpResultHandler* aRes);
|
|
||||||
|
|
||||||
void SetPlayerAppValueRsp(BluetoothAvrcpStatus aRspStatus,
|
|
||||||
BluetoothAvrcpResultHandler* aRes);
|
|
||||||
|
|
||||||
void RegisterNotificationRsp(BluetoothAvrcpEvent aEvent,
|
|
||||||
BluetoothAvrcpNotification aType,
|
|
||||||
const BluetoothAvrcpNotificationParam& aParam,
|
|
||||||
BluetoothAvrcpResultHandler* aRes);
|
|
||||||
|
|
||||||
void SetVolume(uint8_t aVolume, BluetoothAvrcpResultHandler* aRes);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
BluetoothAvrcpHALInterface(
|
|
||||||
#if ANDROID_VERSION >= 18
|
|
||||||
const btrc_interface_t* aInterface
|
|
||||||
#endif
|
|
||||||
);
|
|
||||||
~BluetoothAvrcpHALInterface();
|
|
||||||
|
|
||||||
private:
|
|
||||||
#if ANDROID_VERSION >= 18
|
|
||||||
const btrc_interface_t* mInterface;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
END_BLUETOOTH_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
File diff suppressed because it is too large
Load Diff
@ -1,277 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
||||||
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
||||||
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
#ifndef mozilla_dom_bluetooth_bluedroid_bluetoothgatthalinterface_h__
|
|
||||||
#define mozilla_dom_bluetooth_bluedroid_bluetoothgatthalinterface_h__
|
|
||||||
|
|
||||||
#include <hardware/bluetooth.h>
|
|
||||||
#if ANDROID_VERSION >= 19
|
|
||||||
#include <hardware/bt_gatt.h>
|
|
||||||
#endif
|
|
||||||
#include "BluetoothCommon.h"
|
|
||||||
#include "BluetoothInterface.h"
|
|
||||||
|
|
||||||
BEGIN_BLUETOOTH_NAMESPACE
|
|
||||||
|
|
||||||
class BluetoothHALInterface;
|
|
||||||
|
|
||||||
class BluetoothGattClientHALInterface final
|
|
||||||
: public BluetoothGattClientInterface
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
friend class BluetoothGattHALInterface;
|
|
||||||
|
|
||||||
/* Register / Unregister */
|
|
||||||
void RegisterClient(const BluetoothUuid& aUuid,
|
|
||||||
BluetoothGattClientResultHandler* aRes);
|
|
||||||
void UnregisterClient(int aClientIf,
|
|
||||||
BluetoothGattClientResultHandler* aRes);
|
|
||||||
|
|
||||||
/* Start / Stop LE Scan */
|
|
||||||
void Scan(int aClientIf, bool aStart,
|
|
||||||
BluetoothGattClientResultHandler* aRes);
|
|
||||||
|
|
||||||
/* Connect / Disconnect */
|
|
||||||
void Connect(int aClientIf,
|
|
||||||
const nsAString& aBdAddr,
|
|
||||||
bool aIsDirect, /* auto connect */
|
|
||||||
BluetoothTransport aTransport,
|
|
||||||
BluetoothGattClientResultHandler* aRes);
|
|
||||||
void Disconnect(int aClientIf,
|
|
||||||
const nsAString& aBdAddr,
|
|
||||||
int aConnId,
|
|
||||||
BluetoothGattClientResultHandler* aRes);
|
|
||||||
|
|
||||||
/* Start / Stop advertisements to listen for incoming connections */
|
|
||||||
void Listen(int aClientIf,
|
|
||||||
bool aIsStart,
|
|
||||||
BluetoothGattClientResultHandler* aRes);
|
|
||||||
|
|
||||||
/* Clear the attribute cache for a given device*/
|
|
||||||
void Refresh(int aClientIf,
|
|
||||||
const nsAString& aBdAddr,
|
|
||||||
BluetoothGattClientResultHandler* aRes);
|
|
||||||
|
|
||||||
/* Enumerate Attributes */
|
|
||||||
void SearchService(int aConnId,
|
|
||||||
bool aSearchAll,
|
|
||||||
const BluetoothUuid& aUuid,
|
|
||||||
BluetoothGattClientResultHandler* aRes);
|
|
||||||
void GetIncludedService(int aConnId,
|
|
||||||
const BluetoothGattServiceId& aServiceId,
|
|
||||||
bool aFirst,
|
|
||||||
const BluetoothGattServiceId& aStartServiceId,
|
|
||||||
BluetoothGattClientResultHandler* aRes);
|
|
||||||
void GetCharacteristic(int aConnId,
|
|
||||||
const BluetoothGattServiceId& aServiceId,
|
|
||||||
bool aFirst,
|
|
||||||
const BluetoothGattId& aStartCharId,
|
|
||||||
BluetoothGattClientResultHandler* aRes);
|
|
||||||
void GetDescriptor(int aConnId,
|
|
||||||
const BluetoothGattServiceId& aServiceId,
|
|
||||||
const BluetoothGattId& aCharId,
|
|
||||||
bool aFirst,
|
|
||||||
const BluetoothGattId& aDescriptorId,
|
|
||||||
BluetoothGattClientResultHandler* aRes);
|
|
||||||
|
|
||||||
/* Read / Write An Attribute */
|
|
||||||
void ReadCharacteristic(int aConnId,
|
|
||||||
const BluetoothGattServiceId& aServiceId,
|
|
||||||
const BluetoothGattId& aCharId,
|
|
||||||
BluetoothGattAuthReq aAuthReq,
|
|
||||||
BluetoothGattClientResultHandler* aRes);
|
|
||||||
void WriteCharacteristic(int aConnId,
|
|
||||||
const BluetoothGattServiceId& aServiceId,
|
|
||||||
const BluetoothGattId& aCharId,
|
|
||||||
BluetoothGattWriteType aWriteType,
|
|
||||||
BluetoothGattAuthReq aAuthReq,
|
|
||||||
const nsTArray<uint8_t>& aValue,
|
|
||||||
BluetoothGattClientResultHandler* aRes);
|
|
||||||
void ReadDescriptor(int aConnId,
|
|
||||||
const BluetoothGattServiceId& aServiceId,
|
|
||||||
const BluetoothGattId& aCharId,
|
|
||||||
const BluetoothGattId& aDescriptorId,
|
|
||||||
BluetoothGattAuthReq aAuthReq,
|
|
||||||
BluetoothGattClientResultHandler* aRes);
|
|
||||||
void WriteDescriptor(int aConnId,
|
|
||||||
const BluetoothGattServiceId& aServiceId,
|
|
||||||
const BluetoothGattId& aCharId,
|
|
||||||
const BluetoothGattId& aDescriptorId,
|
|
||||||
BluetoothGattWriteType aWriteType,
|
|
||||||
BluetoothGattAuthReq aAuthReq,
|
|
||||||
const nsTArray<uint8_t>& aValue,
|
|
||||||
BluetoothGattClientResultHandler* aRes);
|
|
||||||
|
|
||||||
/* Execute / Abort Prepared Write*/
|
|
||||||
void ExecuteWrite(int aConnId,
|
|
||||||
int aIsExecute,
|
|
||||||
BluetoothGattClientResultHandler* aRes);
|
|
||||||
|
|
||||||
|
|
||||||
/* Register / Deregister Characteristic Notifications or Indications */
|
|
||||||
void RegisterNotification(int aClientIf,
|
|
||||||
const nsAString& aBdAddr,
|
|
||||||
const BluetoothGattServiceId& aServiceId,
|
|
||||||
const BluetoothGattId& aCharId,
|
|
||||||
BluetoothGattClientResultHandler* aRes);
|
|
||||||
void DeregisterNotification(int aClientIf,
|
|
||||||
const nsAString& aBdAddr,
|
|
||||||
const BluetoothGattServiceId& aServiceId,
|
|
||||||
const BluetoothGattId& aCharId,
|
|
||||||
BluetoothGattClientResultHandler* aRes);
|
|
||||||
|
|
||||||
void ReadRemoteRssi(int aClientIf,
|
|
||||||
const nsAString& aBdAddr,
|
|
||||||
BluetoothGattClientResultHandler* aRes);
|
|
||||||
|
|
||||||
void GetDeviceType(const nsAString& aBdAddr,
|
|
||||||
BluetoothGattClientResultHandler* aRes);
|
|
||||||
|
|
||||||
/* Set advertising data or scan response data */
|
|
||||||
void SetAdvData(int aServerIf,
|
|
||||||
bool aIsScanRsp,
|
|
||||||
bool aIsNameIncluded,
|
|
||||||
bool aIsTxPowerIncluded,
|
|
||||||
int aMinInterval,
|
|
||||||
int aMaxInterval,
|
|
||||||
int aApperance,
|
|
||||||
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
|
|
||||||
const btgatt_client_interface_t* aInterface
|
|
||||||
#endif
|
|
||||||
);
|
|
||||||
~BluetoothGattClientHALInterface();
|
|
||||||
|
|
||||||
private:
|
|
||||||
#if ANDROID_VERSION >= 19
|
|
||||||
const btgatt_client_interface_t* mInterface;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
class BluetoothGattServerHALInterface final
|
|
||||||
: public BluetoothGattServerInterface
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
friend class BluetoothGattHALInterface;
|
|
||||||
|
|
||||||
/* Register / Unregister */
|
|
||||||
void RegisterServer(const BluetoothUuid& aUuid,
|
|
||||||
BluetoothGattServerResultHandler* aRes);
|
|
||||||
void UnregisterServer(int aServerIf,
|
|
||||||
BluetoothGattServerResultHandler* aRes);
|
|
||||||
|
|
||||||
/* Connect / Disconnect */
|
|
||||||
void ConnectPeripheral(int aServerIf,
|
|
||||||
const nsAString& aBdAddr,
|
|
||||||
bool aIsDirect, /* auto connect */
|
|
||||||
BluetoothTransport aTransport,
|
|
||||||
BluetoothGattServerResultHandler* aRes);
|
|
||||||
void DisconnectPeripheral(int aServerIf,
|
|
||||||
const nsAString& aBdAddr,
|
|
||||||
int aConnId,
|
|
||||||
BluetoothGattServerResultHandler* aRes);
|
|
||||||
|
|
||||||
/* Add a services / a characteristic / a descriptor */
|
|
||||||
void AddService(int aServerIf,
|
|
||||||
const BluetoothGattServiceId& aServiceId,
|
|
||||||
int aNumHandles,
|
|
||||||
BluetoothGattServerResultHandler* aRes);
|
|
||||||
void AddIncludedService(int aServerIf,
|
|
||||||
int aServiceHandle,
|
|
||||||
int aIncludedServiceHandle,
|
|
||||||
BluetoothGattServerResultHandler* aRes);
|
|
||||||
void AddCharacteristic(int aServerIf,
|
|
||||||
int aServiceHandle,
|
|
||||||
const BluetoothUuid& aUuid,
|
|
||||||
BluetoothGattCharProp aProperties,
|
|
||||||
BluetoothGattAttrPerm aPermissions,
|
|
||||||
BluetoothGattServerResultHandler* aRes);
|
|
||||||
void AddDescriptor(int aServerIf,
|
|
||||||
int aServiceHandle,
|
|
||||||
const BluetoothUuid& aUuid,
|
|
||||||
BluetoothGattAttrPerm aPermissions,
|
|
||||||
BluetoothGattServerResultHandler* aRes);
|
|
||||||
|
|
||||||
/* Start / Stop / Delete a service */
|
|
||||||
void StartService(int aServerIf,
|
|
||||||
int aServiceHandle,
|
|
||||||
BluetoothTransport aTransport,
|
|
||||||
BluetoothGattServerResultHandler* aRes);
|
|
||||||
void StopService(int aServerIf,
|
|
||||||
int aServiceHandle,
|
|
||||||
BluetoothGattServerResultHandler* aRes);
|
|
||||||
void DeleteService(int aServerIf,
|
|
||||||
int aServiceHandle,
|
|
||||||
BluetoothGattServerResultHandler* aRes);
|
|
||||||
|
|
||||||
/* Send an indication or a notification */
|
|
||||||
void SendIndication(int aServerIf,
|
|
||||||
int aAttributeHandle,
|
|
||||||
int aConnId,
|
|
||||||
const nsTArray<uint8_t>& aValue,
|
|
||||||
bool aConfirm, /* true: indication, false: notification */
|
|
||||||
BluetoothGattServerResultHandler* aRes);
|
|
||||||
|
|
||||||
/* Send a response for an incoming indication */
|
|
||||||
void SendResponse(int aConnId,
|
|
||||||
int aTransId,
|
|
||||||
BluetoothGattStatus aStatus,
|
|
||||||
const BluetoothGattResponse& aResponse,
|
|
||||||
BluetoothGattServerResultHandler* aRes);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
BluetoothGattServerHALInterface(
|
|
||||||
#if ANDROID_VERSION >= 19
|
|
||||||
const btgatt_server_interface_t* aInterface
|
|
||||||
#endif
|
|
||||||
);
|
|
||||||
~BluetoothGattServerHALInterface();
|
|
||||||
|
|
||||||
private:
|
|
||||||
#if ANDROID_VERSION >= 19
|
|
||||||
const btgatt_server_interface_t* mInterface;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
class BluetoothGattHALInterface final
|
|
||||||
: public BluetoothGattInterface
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
friend class BluetoothHALInterface;
|
|
||||||
|
|
||||||
void Init(BluetoothGattNotificationHandler* aNotificationHandler,
|
|
||||||
BluetoothGattResultHandler* aRes);
|
|
||||||
void Cleanup(BluetoothGattResultHandler* aRes);
|
|
||||||
|
|
||||||
BluetoothGattClientInterface* GetBluetoothGattClientInterface();
|
|
||||||
BluetoothGattServerInterface* GetBluetoothGattServerInterface();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
BluetoothGattHALInterface(
|
|
||||||
#if ANDROID_VERSION >= 19
|
|
||||||
const btgatt_interface_t* aInterface
|
|
||||||
#endif
|
|
||||||
);
|
|
||||||
~BluetoothGattHALInterface();
|
|
||||||
|
|
||||||
private:
|
|
||||||
#if ANDROID_VERSION >= 19
|
|
||||||
const btgatt_interface_t* mInterface;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
END_BLUETOOTH_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,558 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
||||||
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
||||||
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
#include "BluetoothHALHelpers.h"
|
|
||||||
|
|
||||||
#define MAX_UUID_SIZE 16
|
|
||||||
|
|
||||||
BEGIN_BLUETOOTH_NAMESPACE
|
|
||||||
|
|
||||||
//
|
|
||||||
// Conversion
|
|
||||||
//
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
Convert(const nsAString& aIn, bt_property_type_t& aOut)
|
|
||||||
{
|
|
||||||
if (aIn.EqualsLiteral("Name")) {
|
|
||||||
aOut = BT_PROPERTY_BDNAME;
|
|
||||||
} else if (aIn.EqualsLiteral("Discoverable")) {
|
|
||||||
aOut = BT_PROPERTY_ADAPTER_SCAN_MODE;
|
|
||||||
} else if (aIn.EqualsLiteral("DiscoverableTimeout")) {
|
|
||||||
aOut = BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT;
|
|
||||||
} else {
|
|
||||||
BT_LOGR("Invalid property name: %s", NS_ConvertUTF16toUTF8(aIn).get());
|
|
||||||
return NS_ERROR_ILLEGAL_VALUE;
|
|
||||||
}
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
Convert(ConvertNamedValue& aIn, bt_property_t& aOut)
|
|
||||||
{
|
|
||||||
nsresult rv = Convert(aIn.mNamedValue.name(), aOut.type);
|
|
||||||
if (NS_FAILED(rv)) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aIn.mNamedValue.value().type() == BluetoothValue::Tuint32_t) {
|
|
||||||
// Set discoverable timeout
|
|
||||||
aOut.val = const_cast<void*>(static_cast<const void*>(
|
|
||||||
&(aIn.mNamedValue.value().get_uint32_t())));
|
|
||||||
aOut.len = sizeof(uint32_t);
|
|
||||||
} else if (aIn.mNamedValue.value().type() == BluetoothValue::TnsString) {
|
|
||||||
// Set name
|
|
||||||
aIn.mStringValue =
|
|
||||||
NS_ConvertUTF16toUTF8(aIn.mNamedValue.value().get_nsString());
|
|
||||||
aOut.val =
|
|
||||||
const_cast<void*>(static_cast<const void*>(aIn.mStringValue.get()));
|
|
||||||
aOut.len = strlen(static_cast<char*>(aOut.val));
|
|
||||||
} else if (aIn.mNamedValue.value().type() == BluetoothValue::Tbool) {
|
|
||||||
// Set scan mode
|
|
||||||
rv = Convert(aIn.mNamedValue.value().get_bool(), aIn.mScanMode);
|
|
||||||
if (NS_FAILED(rv)) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
aOut.val = &aIn.mScanMode;
|
|
||||||
aOut.len = sizeof(aIn.mScanMode);
|
|
||||||
} else {
|
|
||||||
BT_LOGR("Invalid property value type");
|
|
||||||
return NS_ERROR_ILLEGAL_VALUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
Convert(const nsAString& aIn, bt_bdaddr_t& aOut)
|
|
||||||
{
|
|
||||||
NS_ConvertUTF16toUTF8 bdAddressUTF8(aIn);
|
|
||||||
const char* str = bdAddressUTF8.get();
|
|
||||||
|
|
||||||
for (size_t i = 0; i < MOZ_ARRAY_LENGTH(aOut.address); ++i, ++str) {
|
|
||||||
aOut.address[i] =
|
|
||||||
static_cast<uint8_t>(strtoul(str, const_cast<char**>(&str), 16));
|
|
||||||
}
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
Convert(const BluetoothSspVariant aIn, bt_ssp_variant_t& aOut)
|
|
||||||
{
|
|
||||||
static const bt_ssp_variant_t sSspVariant[] = {
|
|
||||||
CONVERT(SSP_VARIANT_PASSKEY_CONFIRMATION,
|
|
||||||
BT_SSP_VARIANT_PASSKEY_CONFIRMATION),
|
|
||||||
CONVERT(SSP_VARIANT_PASSKEY_ENTRY, BT_SSP_VARIANT_PASSKEY_ENTRY),
|
|
||||||
CONVERT(SSP_VARIANT_CONSENT, BT_SSP_VARIANT_CONSENT),
|
|
||||||
CONVERT(SSP_VARIANT_PASSKEY_NOTIFICATION,
|
|
||||||
BT_SSP_VARIANT_PASSKEY_NOTIFICATION)
|
|
||||||
};
|
|
||||||
if (aIn >= MOZ_ARRAY_LENGTH(sSspVariant)) {
|
|
||||||
return NS_ERROR_ILLEGAL_VALUE;
|
|
||||||
}
|
|
||||||
aOut = sSspVariant[aIn];
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
Convert(const uint8_t aIn[16], bt_uuid_t& aOut)
|
|
||||||
{
|
|
||||||
if (sizeof(aOut.uu) != 16) {
|
|
||||||
return NS_ERROR_ILLEGAL_VALUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(aOut.uu, aIn, sizeof(aOut.uu));
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
Convert(const bt_uuid_t& aIn, BluetoothUuid& aOut)
|
|
||||||
{
|
|
||||||
if (sizeof(aIn.uu) != sizeof(aOut.mUuid)) {
|
|
||||||
return NS_ERROR_ILLEGAL_VALUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(aOut.mUuid, aIn.uu, sizeof(aOut.mUuid));
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
Convert(const BluetoothUuid& aIn, bt_uuid_t& aOut)
|
|
||||||
{
|
|
||||||
if (sizeof(aIn.mUuid) != sizeof(aOut.uu)) {
|
|
||||||
return NS_ERROR_ILLEGAL_VALUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(aOut.uu, aIn.mUuid, sizeof(aOut.uu));
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
Convert(const nsAString& aIn, bt_pin_code_t& aOut)
|
|
||||||
{
|
|
||||||
if (aIn.Length() > MOZ_ARRAY_LENGTH(aOut.pin)) {
|
|
||||||
return NS_ERROR_ILLEGAL_VALUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
NS_ConvertUTF16toUTF8 pinCodeUTF8(aIn);
|
|
||||||
const char* str = pinCodeUTF8.get();
|
|
||||||
|
|
||||||
nsAString::size_type i;
|
|
||||||
|
|
||||||
// Fill pin into aOut
|
|
||||||
for (i = 0; i < aIn.Length(); ++i, ++str) {
|
|
||||||
aOut.pin[i] = static_cast<uint8_t>(*str);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clear remaining bytes in aOut
|
|
||||||
size_t ntrailing =
|
|
||||||
(MOZ_ARRAY_LENGTH(aOut.pin) - aIn.Length()) * sizeof(aOut.pin[0]);
|
|
||||||
memset(aOut.pin + aIn.Length(), 0, ntrailing);
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
Convert(const bt_bdaddr_t& aIn, nsAString& aOut)
|
|
||||||
{
|
|
||||||
char str[BLUETOOTH_ADDRESS_LENGTH + 1];
|
|
||||||
|
|
||||||
int res = snprintf(str, sizeof(str), "%02x:%02x:%02x:%02x:%02x:%02x",
|
|
||||||
static_cast<int>(aIn.address[0]),
|
|
||||||
static_cast<int>(aIn.address[1]),
|
|
||||||
static_cast<int>(aIn.address[2]),
|
|
||||||
static_cast<int>(aIn.address[3]),
|
|
||||||
static_cast<int>(aIn.address[4]),
|
|
||||||
static_cast<int>(aIn.address[5]));
|
|
||||||
if (res < 0) {
|
|
||||||
return NS_ERROR_ILLEGAL_VALUE;
|
|
||||||
} else if ((size_t)res >= sizeof(str)) {
|
|
||||||
return NS_ERROR_OUT_OF_MEMORY; /* string buffer too small */
|
|
||||||
}
|
|
||||||
|
|
||||||
aOut = NS_ConvertUTF8toUTF16(str);
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
Convert(const bt_service_record_t& aIn, BluetoothServiceRecord& aOut)
|
|
||||||
{
|
|
||||||
nsresult rv = Convert(aIn.uuid, aOut.mUuid);
|
|
||||||
if (NS_FAILED(rv)) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
aOut.mChannel = aIn.channel;
|
|
||||||
|
|
||||||
MOZ_ASSERT(sizeof(aIn.name) == sizeof(aOut.mName));
|
|
||||||
memcpy(aOut.mName, aIn.name, sizeof(aOut.mName));
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
Convert(const uint8_t* aIn, BluetoothGattAdvData& aOut)
|
|
||||||
{
|
|
||||||
memcpy(aOut.mAdvData, aIn, sizeof(aOut.mAdvData));
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 18
|
|
||||||
nsresult
|
|
||||||
Convert(const BluetoothAvrcpElementAttribute& aIn, btrc_element_attr_val_t& aOut)
|
|
||||||
{
|
|
||||||
const NS_ConvertUTF16toUTF8 value(aIn.mValue);
|
|
||||||
size_t len = std::min<size_t>(strlen(value.get()), sizeof(aOut.text) - 1);
|
|
||||||
|
|
||||||
memcpy(aOut.text, value.get(), len);
|
|
||||||
aOut.text[len] = '\0';
|
|
||||||
aOut.attr_id = aIn.mId;
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
Convert(const btrc_player_settings_t& aIn, BluetoothAvrcpPlayerSettings& aOut)
|
|
||||||
{
|
|
||||||
aOut.mNumAttr = aIn.num_attr;
|
|
||||||
memcpy(aOut.mIds, aIn.attr_ids, aIn.num_attr);
|
|
||||||
memcpy(aOut.mValues, aIn.attr_values, aIn.num_attr);
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
#endif // ANDROID_VERSION >= 18
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 19
|
|
||||||
nsresult
|
|
||||||
Convert(const BluetoothGattId& aIn, btgatt_gatt_id_t& aOut)
|
|
||||||
{
|
|
||||||
nsresult rv = Convert(aIn.mUuid, aOut.uuid);
|
|
||||||
if (NS_FAILED(rv)) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
// HAL uses reversed UUID for GATT
|
|
||||||
for (uint8_t i = 0; i < sizeof(aOut.uuid.uu) / 2; i++) {
|
|
||||||
auto temp = aOut.uuid.uu[i];
|
|
||||||
aOut.uuid.uu[i] = aOut.uuid.uu[sizeof(aOut.uuid.uu) - i - 1];
|
|
||||||
aOut.uuid.uu[sizeof(aOut.uuid.uu) - i - 1] = temp;
|
|
||||||
}
|
|
||||||
aOut.inst_id = aIn.mInstanceId;
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
Convert(const btgatt_gatt_id_t& aIn, BluetoothGattId& aOut)
|
|
||||||
{
|
|
||||||
nsresult rv = Convert(aIn.uuid, aOut.mUuid);
|
|
||||||
if (NS_FAILED(rv)) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
// HAL uses reversed UUID for GATT
|
|
||||||
for (uint8_t i = 0; i < sizeof(aOut.mUuid.mUuid) / 2; i++) {
|
|
||||||
auto temp = aOut.mUuid.mUuid[i];
|
|
||||||
aOut.mUuid.mUuid[i] = aOut.mUuid.mUuid[sizeof(aOut.mUuid.mUuid) - i - 1];
|
|
||||||
aOut.mUuid.mUuid[sizeof(aOut.mUuid.mUuid) - i - 1] = temp;
|
|
||||||
}
|
|
||||||
aOut.mInstanceId = aIn.inst_id;
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
Convert(const BluetoothGattServiceId& aIn, btgatt_srvc_id_t& aOut)
|
|
||||||
{
|
|
||||||
aOut.is_primary = aIn.mIsPrimary;
|
|
||||||
return Convert(aIn.mId, aOut.id);
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
Convert(const btgatt_srvc_id_t& aIn, BluetoothGattServiceId& aOut)
|
|
||||||
{
|
|
||||||
aOut.mIsPrimary = aIn.is_primary;
|
|
||||||
return Convert(aIn.id, aOut.mId);
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
Convert(const btgatt_read_params_t& aIn, BluetoothGattReadParam& aOut)
|
|
||||||
{
|
|
||||||
nsresult rv = Convert(aIn.srvc_id, aOut.mServiceId);
|
|
||||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
rv = Convert(aIn.char_id, aOut.mCharId);
|
|
||||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
rv = Convert(aIn.descr_id, aOut.mDescriptorId);
|
|
||||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(aOut.mValue, aIn.value.value, aIn.value.len);
|
|
||||||
aOut.mValueLength = aIn.value.len;
|
|
||||||
aOut.mValueType = aIn.value_type;
|
|
||||||
aOut.mStatus = aIn.status;
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
Convert(const btgatt_write_params_t& aIn, BluetoothGattWriteParam& aOut)
|
|
||||||
{
|
|
||||||
nsresult rv = Convert(aIn.srvc_id, aOut.mServiceId);
|
|
||||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
rv = Convert(aIn.char_id, aOut.mCharId);
|
|
||||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
rv = Convert(aIn.descr_id, aOut.mDescriptorId);
|
|
||||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
aOut.mStatus = aIn.status;
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
Convert(const btgatt_notify_params_t& aIn, BluetoothGattNotifyParam& aOut)
|
|
||||||
{
|
|
||||||
nsresult rv = Convert(aIn.bda, aOut.mBdAddr);
|
|
||||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
rv = Convert(aIn.srvc_id, aOut.mServiceId);
|
|
||||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
rv = Convert(aIn.char_id, aOut.mCharId);
|
|
||||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(aOut.mValue, aIn.value, aIn.len);
|
|
||||||
aOut.mLength = aIn.len;
|
|
||||||
aOut.mIsNotify = (aIn.is_notify != 0);
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
Convert(const BluetoothGattResponse& aIn, btgatt_response_t& aOut)
|
|
||||||
{
|
|
||||||
// Only the read response format is used in bluedroid.
|
|
||||||
nsresult rv = Convert(
|
|
||||||
ConvertArray<uint8_t>(aIn.mValue, sizeof(aIn.mValue)),
|
|
||||||
aOut.attr_value.value);
|
|
||||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
rv = Convert(aIn.mHandle, aOut.attr_value.handle);
|
|
||||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
rv = Convert(aIn.mOffset, aOut.attr_value.offset);
|
|
||||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
rv = Convert(aIn.mLength, aOut.attr_value.len);
|
|
||||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
rv = Convert(aIn.mAuthReq, aOut.attr_value.auth_req);
|
|
||||||
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
#endif // ANDROID_VERSION >= 19
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 21
|
|
||||||
nsresult
|
|
||||||
Convert(const BluetoothTransport& aIn, btgatt_transport_t& aOut)
|
|
||||||
{
|
|
||||||
static const btgatt_transport_t sTransport[] = {
|
|
||||||
CONVERT(TRANSPORT_AUTO, GATT_TRANSPORT_AUTO),
|
|
||||||
CONVERT(TRANSPORT_BREDR, GATT_TRANSPORT_BREDR),
|
|
||||||
CONVERT(TRANSPORT_LE, GATT_TRANSPORT_LE)
|
|
||||||
};
|
|
||||||
if (aIn >= MOZ_ARRAY_LENGTH(sTransport)) {
|
|
||||||
aOut = static_cast<btgatt_transport_t>(0); // silence compiler warning
|
|
||||||
return NS_ERROR_ILLEGAL_VALUE;
|
|
||||||
}
|
|
||||||
aOut = sTransport[aIn];
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
Convert(const bt_activity_energy_info& aIn, BluetoothActivityEnergyInfo& aOut)
|
|
||||||
{
|
|
||||||
nsresult rv = Convert(aIn.status, aOut.mStatus);
|
|
||||||
if (NS_FAILED(rv)) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
rv = Convert(aIn.ctrl_state, aOut.mStackState);
|
|
||||||
if (NS_FAILED(rv)) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
rv = Convert(aIn.tx_time, aOut.mTxTime);
|
|
||||||
if (NS_FAILED(rv)) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
rv = Convert(aIn.rx_time, aOut.mRxTime);
|
|
||||||
if (NS_FAILED(rv)) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
rv = Convert(aIn.idle_time, aOut.mIdleTime);
|
|
||||||
if (NS_FAILED(rv)) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
rv = Convert(aIn.energy_used, aOut.mEnergyUsed);
|
|
||||||
if (NS_FAILED(rv)) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
#endif // ANDROID_VERSION >= 21
|
|
||||||
|
|
||||||
nsresult
|
|
||||||
Convert(const bt_property_t& aIn, BluetoothProperty& aOut)
|
|
||||||
{
|
|
||||||
/* type conversion */
|
|
||||||
|
|
||||||
nsresult rv = Convert(aIn.type, aOut.mType);
|
|
||||||
if (NS_FAILED(rv)) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* value conversion */
|
|
||||||
|
|
||||||
switch (aOut.mType) {
|
|
||||||
case PROPERTY_UNKNOWN:
|
|
||||||
/* Bug 1065999: working around unknown properties */
|
|
||||||
break;
|
|
||||||
case PROPERTY_BDNAME:
|
|
||||||
/* fall through */
|
|
||||||
case PROPERTY_REMOTE_FRIENDLY_NAME:
|
|
||||||
{
|
|
||||||
// We construct an nsCString here because bdname
|
|
||||||
// returned from Bluedroid is not 0-terminated.
|
|
||||||
aOut.mString = NS_ConvertUTF8toUTF16(
|
|
||||||
nsCString(static_cast<char*>(aIn.val), aIn.len));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case PROPERTY_BDADDR:
|
|
||||||
rv = Convert(*static_cast<bt_bdaddr_t*>(aIn.val), aOut.mString);
|
|
||||||
break;
|
|
||||||
case PROPERTY_UUIDS:
|
|
||||||
{
|
|
||||||
size_t numUuids = aIn.len / MAX_UUID_SIZE;
|
|
||||||
ConvertArray<bt_uuid_t> array(
|
|
||||||
static_cast<bt_uuid_t*>(aIn.val), numUuids);
|
|
||||||
aOut.mUuidArray.SetLength(numUuids);
|
|
||||||
rv = Convert(array, aOut.mUuidArray);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case PROPERTY_CLASS_OF_DEVICE:
|
|
||||||
/* fall through */
|
|
||||||
case PROPERTY_ADAPTER_DISCOVERY_TIMEOUT:
|
|
||||||
aOut.mUint32 = *static_cast<uint32_t*>(aIn.val);
|
|
||||||
break;
|
|
||||||
case PROPERTY_TYPE_OF_DEVICE:
|
|
||||||
rv = Convert(*static_cast<bt_device_type_t*>(aIn.val),
|
|
||||||
aOut.mTypeOfDevice);
|
|
||||||
break;
|
|
||||||
case PROPERTY_SERVICE_RECORD:
|
|
||||||
rv = Convert(*static_cast<bt_service_record_t*>(aIn.val),
|
|
||||||
aOut.mServiceRecord);
|
|
||||||
break;
|
|
||||||
case PROPERTY_ADAPTER_SCAN_MODE:
|
|
||||||
rv = Convert(*static_cast<bt_scan_mode_t*>(aIn.val),
|
|
||||||
aOut.mScanMode);
|
|
||||||
break;
|
|
||||||
case PROPERTY_ADAPTER_BONDED_DEVICES:
|
|
||||||
{
|
|
||||||
size_t numAddresses = aIn.len / BLUETOOTH_ADDRESS_BYTES;
|
|
||||||
ConvertArray<bt_bdaddr_t> array(
|
|
||||||
static_cast<bt_bdaddr_t*>(aIn.val), numAddresses);
|
|
||||||
aOut.mStringArray.SetLength(numAddresses);
|
|
||||||
rv = Convert(array, aOut.mStringArray);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case PROPERTY_REMOTE_RSSI:
|
|
||||||
aOut.mInt32 = *static_cast<int8_t*>(aIn.val);
|
|
||||||
break;
|
|
||||||
#if ANDROID_VERSION >= 18
|
|
||||||
case PROPERTY_REMOTE_VERSION_INFO:
|
|
||||||
rv = Convert(*static_cast<bt_remote_version_t*>(aIn.val),
|
|
||||||
aOut.mRemoteInfo);
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
case PROPERTY_REMOTE_DEVICE_TIMESTAMP:
|
|
||||||
/* nothing to do */
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/* mismatch with type conversion */
|
|
||||||
NS_NOTREACHED("Unhandled property type");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (NS_FAILED(rv)) {
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
return NS_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
END_BLUETOOTH_NAMESPACE
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,121 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
||||||
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
||||||
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
#ifndef mozilla_dom_bluetooth_bluedroid_bluetoothhalinterface_h__
|
|
||||||
#define mozilla_dom_bluetooth_bluedroid_bluetoothhalinterface_h__
|
|
||||||
|
|
||||||
#include <hardware/bluetooth.h>
|
|
||||||
#include "BluetoothInterface.h"
|
|
||||||
|
|
||||||
BEGIN_BLUETOOTH_NAMESPACE
|
|
||||||
|
|
||||||
class BluetoothHALInterface final : public BluetoothInterface
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
static BluetoothHALInterface* GetInstance();
|
|
||||||
|
|
||||||
void Init(BluetoothNotificationHandler* aNotificationHandler,
|
|
||||||
BluetoothResultHandler* aRes);
|
|
||||||
void Cleanup(BluetoothResultHandler* aRes);
|
|
||||||
|
|
||||||
void Enable(BluetoothResultHandler* aRes);
|
|
||||||
void Disable(BluetoothResultHandler* aRes);
|
|
||||||
|
|
||||||
|
|
||||||
/* Adapter Properties */
|
|
||||||
|
|
||||||
void GetAdapterProperties(BluetoothResultHandler* aRes);
|
|
||||||
void GetAdapterProperty(const nsAString& aName,
|
|
||||||
BluetoothResultHandler* aRes);
|
|
||||||
void SetAdapterProperty(const BluetoothNamedValue& aProperty,
|
|
||||||
BluetoothResultHandler* aRes);
|
|
||||||
|
|
||||||
/* Remote Device Properties */
|
|
||||||
|
|
||||||
void GetRemoteDeviceProperties(const nsAString& aRemoteAddr,
|
|
||||||
BluetoothResultHandler* aRes);
|
|
||||||
void GetRemoteDeviceProperty(const nsAString& aRemoteAddr,
|
|
||||||
const nsAString& aName,
|
|
||||||
BluetoothResultHandler* aRes);
|
|
||||||
void SetRemoteDeviceProperty(const nsAString& aRemoteAddr,
|
|
||||||
const BluetoothNamedValue& aProperty,
|
|
||||||
BluetoothResultHandler* aRes);
|
|
||||||
|
|
||||||
/* Remote Services */
|
|
||||||
|
|
||||||
void GetRemoteServiceRecord(const nsAString& aRemoteAddr,
|
|
||||||
const uint8_t aUuid[16],
|
|
||||||
BluetoothResultHandler* aRes);
|
|
||||||
void GetRemoteServices(const nsAString& aRemoteAddr,
|
|
||||||
BluetoothResultHandler* aRes);
|
|
||||||
|
|
||||||
/* Discovery */
|
|
||||||
|
|
||||||
void StartDiscovery(BluetoothResultHandler* aRes);
|
|
||||||
void CancelDiscovery(BluetoothResultHandler* aRes);
|
|
||||||
|
|
||||||
/* Bonds */
|
|
||||||
|
|
||||||
void CreateBond(const nsAString& aBdAddr, BluetoothTransport aTransport,
|
|
||||||
BluetoothResultHandler* aRes);
|
|
||||||
void RemoveBond(const nsAString& aBdAddr, BluetoothResultHandler* aRes);
|
|
||||||
void CancelBond(const nsAString& aBdAddr, BluetoothResultHandler* aRes);
|
|
||||||
|
|
||||||
/* Connection */
|
|
||||||
|
|
||||||
void GetConnectionState(const nsAString& aBdAddr,
|
|
||||||
BluetoothResultHandler* aRes);
|
|
||||||
|
|
||||||
/* Authentication */
|
|
||||||
|
|
||||||
void PinReply(const nsAString& aBdAddr, bool aAccept,
|
|
||||||
const nsAString& aPinCode,
|
|
||||||
BluetoothResultHandler* aRes);
|
|
||||||
|
|
||||||
void SspReply(const nsAString& aBdAddr, BluetoothSspVariant aVariant,
|
|
||||||
bool aAccept, uint32_t aPasskey,
|
|
||||||
BluetoothResultHandler* aRes);
|
|
||||||
|
|
||||||
/* DUT Mode */
|
|
||||||
|
|
||||||
void DutModeConfigure(bool aEnable, BluetoothResultHandler* aRes);
|
|
||||||
void DutModeSend(uint16_t aOpcode, uint8_t* aBuf, uint8_t aLen,
|
|
||||||
BluetoothResultHandler* aRes);
|
|
||||||
|
|
||||||
/* LE Mode */
|
|
||||||
|
|
||||||
void LeTestMode(uint16_t aOpcode, uint8_t* aBuf, uint8_t aLen,
|
|
||||||
BluetoothResultHandler* aRes);
|
|
||||||
|
|
||||||
/* Energy Information */
|
|
||||||
|
|
||||||
void ReadEnergyInfo(BluetoothResultHandler* aRes);
|
|
||||||
|
|
||||||
/* Profile Interfaces */
|
|
||||||
|
|
||||||
BluetoothSocketInterface* GetBluetoothSocketInterface();
|
|
||||||
BluetoothHandsfreeInterface* GetBluetoothHandsfreeInterface();
|
|
||||||
BluetoothA2dpInterface* GetBluetoothA2dpInterface();
|
|
||||||
BluetoothAvrcpInterface* GetBluetoothAvrcpInterface();
|
|
||||||
BluetoothGattInterface* GetBluetoothGattInterface();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
BluetoothHALInterface(const bt_interface_t* aInterface);
|
|
||||||
~BluetoothHALInterface();
|
|
||||||
|
|
||||||
private:
|
|
||||||
template <class T>
|
|
||||||
T* CreateProfileInterface();
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
T* GetProfileInterface();
|
|
||||||
|
|
||||||
const bt_interface_t* mInterface;
|
|
||||||
};
|
|
||||||
|
|
||||||
END_BLUETOOTH_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,957 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
||||||
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
||||||
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
#include "BluetoothHandsfreeHALInterface.h"
|
|
||||||
#include "BluetoothHALHelpers.h"
|
|
||||||
|
|
||||||
BEGIN_BLUETOOTH_NAMESPACE
|
|
||||||
|
|
||||||
typedef
|
|
||||||
BluetoothHALInterfaceRunnable0<BluetoothHandsfreeResultHandler, void>
|
|
||||||
BluetoothHandsfreeHALResultRunnable;
|
|
||||||
|
|
||||||
typedef
|
|
||||||
BluetoothHALInterfaceRunnable1<BluetoothHandsfreeResultHandler, void,
|
|
||||||
BluetoothStatus, BluetoothStatus>
|
|
||||||
BluetoothHandsfreeHALErrorRunnable;
|
|
||||||
|
|
||||||
static nsresult
|
|
||||||
DispatchBluetoothHandsfreeHALResult(
|
|
||||||
BluetoothHandsfreeResultHandler* aRes,
|
|
||||||
void (BluetoothHandsfreeResultHandler::*aMethod)(),
|
|
||||||
BluetoothStatus aStatus)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(aRes);
|
|
||||||
|
|
||||||
nsRefPtr<nsRunnable> runnable;
|
|
||||||
|
|
||||||
if (aStatus == STATUS_SUCCESS) {
|
|
||||||
runnable = new BluetoothHandsfreeHALResultRunnable(aRes, aMethod);
|
|
||||||
} else {
|
|
||||||
runnable = new BluetoothHandsfreeHALErrorRunnable(aRes,
|
|
||||||
&BluetoothHandsfreeResultHandler::OnError, aStatus);
|
|
||||||
}
|
|
||||||
nsresult rv = NS_DispatchToMainThread(runnable);
|
|
||||||
if (NS_FAILED(rv)) {
|
|
||||||
BT_WARNING("NS_DispatchToMainThread failed: %X", rv);
|
|
||||||
}
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Notification handling
|
|
||||||
//
|
|
||||||
|
|
||||||
static BluetoothHandsfreeNotificationHandler* sHandsfreeNotificationHandler;
|
|
||||||
|
|
||||||
struct BluetoothHandsfreeHALCallback
|
|
||||||
{
|
|
||||||
class HandsfreeNotificationHandlerWrapper
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
typedef BluetoothHandsfreeNotificationHandler ObjectType;
|
|
||||||
|
|
||||||
static ObjectType* GetInstance()
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(NS_IsMainThread());
|
|
||||||
|
|
||||||
return sHandsfreeNotificationHandler;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Notifications
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable2<
|
|
||||||
HandsfreeNotificationHandlerWrapper, void,
|
|
||||||
BluetoothHandsfreeConnectionState, nsString,
|
|
||||||
BluetoothHandsfreeConnectionState, const nsAString&>
|
|
||||||
ConnectionStateNotification;
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable2<
|
|
||||||
HandsfreeNotificationHandlerWrapper, void,
|
|
||||||
BluetoothHandsfreeAudioState, nsString,
|
|
||||||
BluetoothHandsfreeAudioState, const nsAString&>
|
|
||||||
AudioStateNotification;
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable2<
|
|
||||||
HandsfreeNotificationHandlerWrapper, void,
|
|
||||||
BluetoothHandsfreeVoiceRecognitionState, nsString,
|
|
||||||
BluetoothHandsfreeVoiceRecognitionState, const nsAString&>
|
|
||||||
VoiceRecognitionNotification;
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable1<
|
|
||||||
HandsfreeNotificationHandlerWrapper, void,
|
|
||||||
nsString, const nsAString&>
|
|
||||||
AnswerCallNotification;
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable1<
|
|
||||||
HandsfreeNotificationHandlerWrapper, void,
|
|
||||||
nsString, const nsAString&>
|
|
||||||
HangupCallNotification;
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable3<
|
|
||||||
HandsfreeNotificationHandlerWrapper, void,
|
|
||||||
BluetoothHandsfreeVolumeType, int, nsString,
|
|
||||||
BluetoothHandsfreeVolumeType, int, const nsAString&>
|
|
||||||
VolumeNotification;
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable2<
|
|
||||||
HandsfreeNotificationHandlerWrapper, void,
|
|
||||||
nsString, nsString, const nsAString&, const nsAString&>
|
|
||||||
DialCallNotification;
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable2<
|
|
||||||
HandsfreeNotificationHandlerWrapper, void,
|
|
||||||
char, nsString, char, const nsAString&>
|
|
||||||
DtmfNotification;
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable2<
|
|
||||||
HandsfreeNotificationHandlerWrapper, void,
|
|
||||||
BluetoothHandsfreeNRECState, nsString,
|
|
||||||
BluetoothHandsfreeNRECState, const nsAString&>
|
|
||||||
NRECNotification;
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable2<
|
|
||||||
HandsfreeNotificationHandlerWrapper, void,
|
|
||||||
BluetoothHandsfreeWbsConfig, nsString,
|
|
||||||
BluetoothHandsfreeWbsConfig, const nsAString&>
|
|
||||||
WbsNotification;
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable2<
|
|
||||||
HandsfreeNotificationHandlerWrapper, void,
|
|
||||||
BluetoothHandsfreeCallHoldType, nsString,
|
|
||||||
BluetoothHandsfreeCallHoldType, const nsAString&>
|
|
||||||
CallHoldNotification;
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable1<
|
|
||||||
HandsfreeNotificationHandlerWrapper, void,
|
|
||||||
nsString, const nsAString&>
|
|
||||||
CnumNotification;
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable1<
|
|
||||||
HandsfreeNotificationHandlerWrapper, void,
|
|
||||||
nsString, const nsAString&>
|
|
||||||
CindNotification;
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable1<
|
|
||||||
HandsfreeNotificationHandlerWrapper, void,
|
|
||||||
nsString, const nsAString&>
|
|
||||||
CopsNotification;
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable1<
|
|
||||||
HandsfreeNotificationHandlerWrapper, void,
|
|
||||||
nsString, const nsAString&>
|
|
||||||
ClccNotification;
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable2<
|
|
||||||
HandsfreeNotificationHandlerWrapper, void,
|
|
||||||
nsCString, nsString, const nsACString&, const nsAString&>
|
|
||||||
UnknownAtNotification;
|
|
||||||
|
|
||||||
typedef BluetoothNotificationHALRunnable1<
|
|
||||||
HandsfreeNotificationHandlerWrapper, void,
|
|
||||||
nsString, const nsAString&>
|
|
||||||
KeyPressedNotification;
|
|
||||||
|
|
||||||
// Bluedroid Handsfree callbacks
|
|
||||||
|
|
||||||
static void
|
|
||||||
ConnectionState(bthf_connection_state_t aState, bt_bdaddr_t* aBdAddr)
|
|
||||||
{
|
|
||||||
#if ANDROID_VERSION < 21
|
|
||||||
if (aState == BTHF_CONNECTION_STATE_CONNECTED && aBdAddr) {
|
|
||||||
memcpy(&sConnectedDeviceAddress, aBdAddr,
|
|
||||||
sizeof(sConnectedDeviceAddress));
|
|
||||||
} else if (aState == BTHF_CONNECTION_STATE_DISCONNECTED) {
|
|
||||||
memset(&sConnectedDeviceAddress, 0,
|
|
||||||
sizeof(sConnectedDeviceAddress));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ConnectionStateNotification::Dispatch(
|
|
||||||
&BluetoothHandsfreeNotificationHandler::ConnectionStateNotification,
|
|
||||||
aState, aBdAddr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
AudioState(bthf_audio_state_t aState, bt_bdaddr_t* aBdAddr)
|
|
||||||
{
|
|
||||||
AudioStateNotification::Dispatch(
|
|
||||||
&BluetoothHandsfreeNotificationHandler::AudioStateNotification,
|
|
||||||
aState, aBdAddr);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 21
|
|
||||||
static void
|
|
||||||
VoiceRecognition(bthf_vr_state_t aState, bt_bdaddr_t* aBdAddr)
|
|
||||||
{
|
|
||||||
VoiceRecognitionNotification::Dispatch(
|
|
||||||
&BluetoothHandsfreeNotificationHandler::VoiceRecognitionNotification,
|
|
||||||
aState, aBdAddr);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
static void
|
|
||||||
VoiceRecognition(bthf_vr_state_t aState)
|
|
||||||
{
|
|
||||||
VoiceRecognitionNotification::Dispatch(
|
|
||||||
&BluetoothHandsfreeNotificationHandler::VoiceRecognitionNotification,
|
|
||||||
aState, &sConnectedDeviceAddress);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 21
|
|
||||||
static void
|
|
||||||
AnswerCall(bt_bdaddr_t* aBdAddr)
|
|
||||||
{
|
|
||||||
AnswerCallNotification::Dispatch(
|
|
||||||
&BluetoothHandsfreeNotificationHandler::AnswerCallNotification,
|
|
||||||
aBdAddr);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
static void
|
|
||||||
AnswerCall()
|
|
||||||
{
|
|
||||||
AnswerCallNotification::Dispatch(
|
|
||||||
&BluetoothHandsfreeNotificationHandler::AnswerCallNotification,
|
|
||||||
&sConnectedDeviceAddress);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 21
|
|
||||||
static void
|
|
||||||
HangupCall(bt_bdaddr_t* aBdAddr)
|
|
||||||
{
|
|
||||||
HangupCallNotification::Dispatch(
|
|
||||||
&BluetoothHandsfreeNotificationHandler::HangupCallNotification,
|
|
||||||
aBdAddr);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
static void
|
|
||||||
HangupCall()
|
|
||||||
{
|
|
||||||
HangupCallNotification::Dispatch(
|
|
||||||
&BluetoothHandsfreeNotificationHandler::HangupCallNotification,
|
|
||||||
&sConnectedDeviceAddress);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 21
|
|
||||||
static void
|
|
||||||
Volume(bthf_volume_type_t aType, int aVolume, bt_bdaddr_t* aBdAddr)
|
|
||||||
{
|
|
||||||
VolumeNotification::Dispatch(
|
|
||||||
&BluetoothHandsfreeNotificationHandler::VolumeNotification,
|
|
||||||
aType, aVolume, aBdAddr);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
static void
|
|
||||||
Volume(bthf_volume_type_t aType, int aVolume)
|
|
||||||
{
|
|
||||||
VolumeNotification::Dispatch(
|
|
||||||
&BluetoothHandsfreeNotificationHandler::VolumeNotification,
|
|
||||||
aType, aVolume, &sConnectedDeviceAddress);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 21
|
|
||||||
static void
|
|
||||||
DialCall(char* aNumber, bt_bdaddr_t* aBdAddr)
|
|
||||||
{
|
|
||||||
DialCallNotification::Dispatch(
|
|
||||||
&BluetoothHandsfreeNotificationHandler::DialCallNotification,
|
|
||||||
aNumber, aBdAddr);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
static void
|
|
||||||
DialCall(char* aNumber)
|
|
||||||
{
|
|
||||||
DialCallNotification::Dispatch(
|
|
||||||
&BluetoothHandsfreeNotificationHandler::DialCallNotification,
|
|
||||||
aNumber, &sConnectedDeviceAddress);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 21
|
|
||||||
static void
|
|
||||||
Dtmf(char aDtmf, bt_bdaddr_t* aBdAddr)
|
|
||||||
{
|
|
||||||
DtmfNotification::Dispatch(
|
|
||||||
&BluetoothHandsfreeNotificationHandler::DtmfNotification,
|
|
||||||
aDtmf, aBdAddr);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
static void
|
|
||||||
Dtmf(char aDtmf)
|
|
||||||
{
|
|
||||||
DtmfNotification::Dispatch(
|
|
||||||
&BluetoothHandsfreeNotificationHandler::DtmfNotification,
|
|
||||||
aDtmf, &sConnectedDeviceAddress);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 21
|
|
||||||
static void
|
|
||||||
NoiseReductionEchoCancellation(bthf_nrec_t aNrec, bt_bdaddr_t* aBdAddr)
|
|
||||||
{
|
|
||||||
NRECNotification::Dispatch(
|
|
||||||
&BluetoothHandsfreeNotificationHandler::NRECNotification,
|
|
||||||
aNrec, aBdAddr);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
static void
|
|
||||||
NoiseReductionEchoCancellation(bthf_nrec_t aNrec)
|
|
||||||
{
|
|
||||||
NRECNotification::Dispatch(
|
|
||||||
&BluetoothHandsfreeNotificationHandler::NRECNotification,
|
|
||||||
aNrec, &sConnectedDeviceAddress);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 21
|
|
||||||
static void
|
|
||||||
WideBandSpeech(bthf_wbs_config_t aWbs, bt_bdaddr_t* aBdAddr)
|
|
||||||
{
|
|
||||||
WbsNotification::Dispatch(
|
|
||||||
&BluetoothHandsfreeNotificationHandler::WbsNotification,
|
|
||||||
aWbs, aBdAddr);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 21
|
|
||||||
static void
|
|
||||||
CallHold(bthf_chld_type_t aChld, bt_bdaddr_t* aBdAddr)
|
|
||||||
{
|
|
||||||
CallHoldNotification::Dispatch(
|
|
||||||
&BluetoothHandsfreeNotificationHandler::CallHoldNotification,
|
|
||||||
aChld, aBdAddr);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
static void
|
|
||||||
CallHold(bthf_chld_type_t aChld)
|
|
||||||
{
|
|
||||||
CallHoldNotification::Dispatch(
|
|
||||||
&BluetoothHandsfreeNotificationHandler::CallHoldNotification,
|
|
||||||
aChld, &sConnectedDeviceAddress);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 21
|
|
||||||
static void
|
|
||||||
Cnum(bt_bdaddr_t* aBdAddr)
|
|
||||||
{
|
|
||||||
CnumNotification::Dispatch(
|
|
||||||
&BluetoothHandsfreeNotificationHandler::CnumNotification,
|
|
||||||
aBdAddr);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
static void
|
|
||||||
Cnum()
|
|
||||||
{
|
|
||||||
CnumNotification::Dispatch(
|
|
||||||
&BluetoothHandsfreeNotificationHandler::CnumNotification,
|
|
||||||
&sConnectedDeviceAddress);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 21
|
|
||||||
static void
|
|
||||||
Cind(bt_bdaddr_t* aBdAddr)
|
|
||||||
{
|
|
||||||
CindNotification::Dispatch(
|
|
||||||
&BluetoothHandsfreeNotificationHandler::CindNotification,
|
|
||||||
aBdAddr);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
static void
|
|
||||||
Cind()
|
|
||||||
{
|
|
||||||
CindNotification::Dispatch(
|
|
||||||
&BluetoothHandsfreeNotificationHandler::CindNotification,
|
|
||||||
&sConnectedDeviceAddress);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 21
|
|
||||||
static void
|
|
||||||
Cops(bt_bdaddr_t* aBdAddr)
|
|
||||||
{
|
|
||||||
CopsNotification::Dispatch(
|
|
||||||
&BluetoothHandsfreeNotificationHandler::CopsNotification,
|
|
||||||
aBdAddr);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
static void
|
|
||||||
Cops()
|
|
||||||
{
|
|
||||||
CopsNotification::Dispatch(
|
|
||||||
&BluetoothHandsfreeNotificationHandler::CopsNotification,
|
|
||||||
&sConnectedDeviceAddress);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 21
|
|
||||||
static void
|
|
||||||
Clcc(bt_bdaddr_t* aBdAddr)
|
|
||||||
{
|
|
||||||
ClccNotification::Dispatch(
|
|
||||||
&BluetoothHandsfreeNotificationHandler::ClccNotification,
|
|
||||||
aBdAddr);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
static void
|
|
||||||
Clcc()
|
|
||||||
{
|
|
||||||
ClccNotification::Dispatch(
|
|
||||||
&BluetoothHandsfreeNotificationHandler::ClccNotification,
|
|
||||||
&sConnectedDeviceAddress);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 21
|
|
||||||
static void
|
|
||||||
UnknownAt(char* aAtString, bt_bdaddr_t* aBdAddr)
|
|
||||||
{
|
|
||||||
UnknownAtNotification::Dispatch(
|
|
||||||
&BluetoothHandsfreeNotificationHandler::UnknownAtNotification,
|
|
||||||
aAtString, aBdAddr);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
static void
|
|
||||||
UnknownAt(char* aAtString)
|
|
||||||
{
|
|
||||||
UnknownAtNotification::Dispatch(
|
|
||||||
&BluetoothHandsfreeNotificationHandler::UnknownAtNotification,
|
|
||||||
aAtString, &sConnectedDeviceAddress);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 21
|
|
||||||
static void
|
|
||||||
KeyPressed(bt_bdaddr_t* aBdAddr)
|
|
||||||
{
|
|
||||||
KeyPressedNotification::Dispatch(
|
|
||||||
&BluetoothHandsfreeNotificationHandler::KeyPressedNotification,
|
|
||||||
aBdAddr);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
static void
|
|
||||||
KeyPressed()
|
|
||||||
{
|
|
||||||
KeyPressedNotification::Dispatch(
|
|
||||||
&BluetoothHandsfreeNotificationHandler::KeyPressedNotification,
|
|
||||||
&sConnectedDeviceAddress);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ANDROID_VERSION < 21
|
|
||||||
/* |sConnectedDeviceAddress| stores Bluetooth device address of the
|
|
||||||
* connected device. Before Android Lollipop, we maintain this address by
|
|
||||||
* ourselves through ConnectionState(); after Android Lollipop, every callback
|
|
||||||
* carries this address directly so we don't have to keep it.
|
|
||||||
*/
|
|
||||||
static bt_bdaddr_t sConnectedDeviceAddress;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
#if ANDROID_VERSION < 21
|
|
||||||
bt_bdaddr_t BluetoothHandsfreeHALCallback::sConnectedDeviceAddress = {
|
|
||||||
{0, 0, 0, 0, 0, 0}
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Interface
|
|
||||||
//
|
|
||||||
|
|
||||||
BluetoothHandsfreeHALInterface::BluetoothHandsfreeHALInterface(
|
|
||||||
const bthf_interface_t* aInterface)
|
|
||||||
: mInterface(aInterface)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(mInterface);
|
|
||||||
}
|
|
||||||
|
|
||||||
BluetoothHandsfreeHALInterface::~BluetoothHandsfreeHALInterface()
|
|
||||||
{ }
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothHandsfreeHALInterface::Init(
|
|
||||||
BluetoothHandsfreeNotificationHandler* aNotificationHandler,
|
|
||||||
int aMaxNumClients, BluetoothHandsfreeResultHandler* aRes)
|
|
||||||
{
|
|
||||||
static bthf_callbacks_t sCallbacks = {
|
|
||||||
sizeof(sCallbacks),
|
|
||||||
BluetoothHandsfreeHALCallback::ConnectionState,
|
|
||||||
BluetoothHandsfreeHALCallback::AudioState,
|
|
||||||
BluetoothHandsfreeHALCallback::VoiceRecognition,
|
|
||||||
BluetoothHandsfreeHALCallback::AnswerCall,
|
|
||||||
BluetoothHandsfreeHALCallback::HangupCall,
|
|
||||||
BluetoothHandsfreeHALCallback::Volume,
|
|
||||||
BluetoothHandsfreeHALCallback::DialCall,
|
|
||||||
BluetoothHandsfreeHALCallback::Dtmf,
|
|
||||||
BluetoothHandsfreeHALCallback::NoiseReductionEchoCancellation,
|
|
||||||
#if ANDROID_VERSION >= 21
|
|
||||||
BluetoothHandsfreeHALCallback::WideBandSpeech,
|
|
||||||
#endif
|
|
||||||
BluetoothHandsfreeHALCallback::CallHold,
|
|
||||||
BluetoothHandsfreeHALCallback::Cnum,
|
|
||||||
BluetoothHandsfreeHALCallback::Cind,
|
|
||||||
BluetoothHandsfreeHALCallback::Cops,
|
|
||||||
BluetoothHandsfreeHALCallback::Clcc,
|
|
||||||
BluetoothHandsfreeHALCallback::UnknownAt,
|
|
||||||
BluetoothHandsfreeHALCallback::KeyPressed
|
|
||||||
};
|
|
||||||
|
|
||||||
sHandsfreeNotificationHandler = aNotificationHandler;
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 21
|
|
||||||
bt_status_t status = mInterface->init(&sCallbacks, aMaxNumClients);
|
|
||||||
#else
|
|
||||||
bt_status_t status = mInterface->init(&sCallbacks);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothHandsfreeHALResult(
|
|
||||||
aRes, &BluetoothHandsfreeResultHandler::Init,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothHandsfreeHALInterface::Cleanup(
|
|
||||||
BluetoothHandsfreeResultHandler* aRes)
|
|
||||||
{
|
|
||||||
mInterface->cleanup();
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothHandsfreeHALResult(
|
|
||||||
aRes, &BluetoothHandsfreeResultHandler::Cleanup, STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Connect / Disconnect */
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothHandsfreeHALInterface::Connect(
|
|
||||||
const nsAString& aBdAddr, BluetoothHandsfreeResultHandler* aRes)
|
|
||||||
{
|
|
||||||
bt_status_t status;
|
|
||||||
bt_bdaddr_t bdAddr;
|
|
||||||
|
|
||||||
if (NS_SUCCEEDED(Convert(aBdAddr, bdAddr))) {
|
|
||||||
status = mInterface->connect(&bdAddr);
|
|
||||||
} else {
|
|
||||||
status = BT_STATUS_PARM_INVALID;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothHandsfreeHALResult(
|
|
||||||
aRes, &BluetoothHandsfreeResultHandler::Connect,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothHandsfreeHALInterface::Disconnect(
|
|
||||||
const nsAString& aBdAddr, BluetoothHandsfreeResultHandler* aRes)
|
|
||||||
{
|
|
||||||
bt_status_t status;
|
|
||||||
bt_bdaddr_t bdAddr;
|
|
||||||
|
|
||||||
if (NS_SUCCEEDED(Convert(aBdAddr, bdAddr))) {
|
|
||||||
status = mInterface->disconnect(&bdAddr);
|
|
||||||
} else {
|
|
||||||
status = BT_STATUS_PARM_INVALID;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothHandsfreeHALResult(
|
|
||||||
aRes, &BluetoothHandsfreeResultHandler::Disconnect,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothHandsfreeHALInterface::ConnectAudio(
|
|
||||||
const nsAString& aBdAddr, BluetoothHandsfreeResultHandler* aRes)
|
|
||||||
{
|
|
||||||
bt_status_t status;
|
|
||||||
bt_bdaddr_t bdAddr;
|
|
||||||
|
|
||||||
if (NS_SUCCEEDED(Convert(aBdAddr, bdAddr))) {
|
|
||||||
status = mInterface->connect_audio(&bdAddr);
|
|
||||||
} else {
|
|
||||||
status = BT_STATUS_PARM_INVALID;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothHandsfreeHALResult(
|
|
||||||
aRes, &BluetoothHandsfreeResultHandler::ConnectAudio,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothHandsfreeHALInterface::DisconnectAudio(
|
|
||||||
const nsAString& aBdAddr, BluetoothHandsfreeResultHandler* aRes)
|
|
||||||
{
|
|
||||||
bt_status_t status;
|
|
||||||
bt_bdaddr_t bdAddr;
|
|
||||||
|
|
||||||
if (NS_SUCCEEDED(Convert(aBdAddr, bdAddr))) {
|
|
||||||
status = mInterface->disconnect_audio(&bdAddr);
|
|
||||||
} else {
|
|
||||||
status = BT_STATUS_PARM_INVALID;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothHandsfreeHALResult(
|
|
||||||
aRes, &BluetoothHandsfreeResultHandler::DisconnectAudio,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Voice Recognition */
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothHandsfreeHALInterface::StartVoiceRecognition(
|
|
||||||
const nsAString& aBdAddr,
|
|
||||||
BluetoothHandsfreeResultHandler* aRes)
|
|
||||||
{
|
|
||||||
bt_status_t status;
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 21
|
|
||||||
bt_bdaddr_t bdAddr;
|
|
||||||
|
|
||||||
if (NS_SUCCEEDED(Convert(aBdAddr, bdAddr))) {
|
|
||||||
status = mInterface->start_voice_recognition(&bdAddr);
|
|
||||||
} else {
|
|
||||||
status = BT_STATUS_PARM_INVALID;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
status = mInterface->start_voice_recognition();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothHandsfreeHALResult(
|
|
||||||
aRes, &BluetoothHandsfreeResultHandler::StartVoiceRecognition,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothHandsfreeHALInterface::StopVoiceRecognition(
|
|
||||||
const nsAString& aBdAddr,
|
|
||||||
BluetoothHandsfreeResultHandler* aRes)
|
|
||||||
{
|
|
||||||
bt_status_t status;
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 21
|
|
||||||
bt_bdaddr_t bdAddr;
|
|
||||||
|
|
||||||
if (NS_SUCCEEDED(Convert(aBdAddr, bdAddr))) {
|
|
||||||
status = mInterface->stop_voice_recognition(&bdAddr);
|
|
||||||
} else {
|
|
||||||
status = BT_STATUS_PARM_INVALID;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
status = mInterface->stop_voice_recognition();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothHandsfreeHALResult(
|
|
||||||
aRes, &BluetoothHandsfreeResultHandler::StopVoiceRecognition,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Volume */
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothHandsfreeHALInterface::VolumeControl(
|
|
||||||
BluetoothHandsfreeVolumeType aType, int aVolume, const nsAString& aBdAddr,
|
|
||||||
BluetoothHandsfreeResultHandler* aRes)
|
|
||||||
{
|
|
||||||
bt_status_t status;
|
|
||||||
bthf_volume_type_t type = BTHF_VOLUME_TYPE_SPK;
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 21
|
|
||||||
bt_bdaddr_t bdAddr;
|
|
||||||
|
|
||||||
if (NS_SUCCEEDED(Convert(aType, type)) &&
|
|
||||||
NS_SUCCEEDED(Convert(aBdAddr, bdAddr))) {
|
|
||||||
status = mInterface->volume_control(type, aVolume, &bdAddr);
|
|
||||||
#else
|
|
||||||
if (NS_SUCCEEDED(Convert(aType, type))) {
|
|
||||||
status = mInterface->volume_control(type, aVolume);
|
|
||||||
#endif
|
|
||||||
} else {
|
|
||||||
status = BT_STATUS_PARM_INVALID;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothHandsfreeHALResult(
|
|
||||||
aRes, &BluetoothHandsfreeResultHandler::VolumeControl,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Device status */
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothHandsfreeHALInterface::DeviceStatusNotification(
|
|
||||||
BluetoothHandsfreeNetworkState aNtkState,
|
|
||||||
BluetoothHandsfreeServiceType aSvcType, int aSignal,
|
|
||||||
int aBattChg, BluetoothHandsfreeResultHandler* aRes)
|
|
||||||
{
|
|
||||||
bt_status_t status;
|
|
||||||
bthf_network_state_t ntkState = BTHF_NETWORK_STATE_NOT_AVAILABLE;
|
|
||||||
bthf_service_type_t svcType = BTHF_SERVICE_TYPE_HOME;
|
|
||||||
|
|
||||||
if (NS_SUCCEEDED(Convert(aNtkState, ntkState)) &&
|
|
||||||
NS_SUCCEEDED(Convert(aSvcType, svcType))) {
|
|
||||||
status = mInterface->device_status_notification(ntkState, svcType,
|
|
||||||
aSignal, aBattChg);
|
|
||||||
} else {
|
|
||||||
status = BT_STATUS_PARM_INVALID;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothHandsfreeHALResult(
|
|
||||||
aRes, &BluetoothHandsfreeResultHandler::DeviceStatusNotification,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Responses */
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothHandsfreeHALInterface::CopsResponse(
|
|
||||||
const char* aCops, const nsAString& aBdAddr,
|
|
||||||
BluetoothHandsfreeResultHandler* aRes)
|
|
||||||
{
|
|
||||||
bt_status_t status;
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 21
|
|
||||||
bt_bdaddr_t bdAddr;
|
|
||||||
|
|
||||||
if (NS_SUCCEEDED(Convert(aBdAddr, bdAddr))) {
|
|
||||||
status = mInterface->cops_response(aCops, &bdAddr);
|
|
||||||
} else {
|
|
||||||
status = BT_STATUS_PARM_INVALID;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
status = mInterface->cops_response(aCops);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothHandsfreeHALResult(
|
|
||||||
aRes, &BluetoothHandsfreeResultHandler::CopsResponse,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothHandsfreeHALInterface::CindResponse(
|
|
||||||
int aSvc, int aNumActive, int aNumHeld,
|
|
||||||
BluetoothHandsfreeCallState aCallSetupState,
|
|
||||||
int aSignal, int aRoam, int aBattChg,
|
|
||||||
const nsAString& aBdAddr,
|
|
||||||
BluetoothHandsfreeResultHandler* aRes)
|
|
||||||
{
|
|
||||||
bt_status_t status;
|
|
||||||
bthf_call_state_t callSetupState = BTHF_CALL_STATE_ACTIVE;
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 21
|
|
||||||
bt_bdaddr_t bdAddr;
|
|
||||||
|
|
||||||
if (NS_SUCCEEDED(Convert(aCallSetupState, callSetupState)) &&
|
|
||||||
NS_SUCCEEDED(Convert(aBdAddr, bdAddr))) {
|
|
||||||
status = mInterface->cind_response(aSvc, aNumActive, aNumHeld,
|
|
||||||
callSetupState, aSignal,
|
|
||||||
aRoam, aBattChg, &bdAddr);
|
|
||||||
#else
|
|
||||||
if (NS_SUCCEEDED(Convert(aCallSetupState, callSetupState))) {
|
|
||||||
status = mInterface->cind_response(aSvc, aNumActive, aNumHeld,
|
|
||||||
callSetupState, aSignal,
|
|
||||||
aRoam, aBattChg);
|
|
||||||
#endif
|
|
||||||
} else {
|
|
||||||
status = BT_STATUS_PARM_INVALID;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothHandsfreeHALResult(
|
|
||||||
aRes, &BluetoothHandsfreeResultHandler::CindResponse,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothHandsfreeHALInterface::FormattedAtResponse(
|
|
||||||
const char* aRsp, const nsAString& aBdAddr,
|
|
||||||
BluetoothHandsfreeResultHandler* aRes)
|
|
||||||
{
|
|
||||||
bt_status_t status;
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 21
|
|
||||||
bt_bdaddr_t bdAddr;
|
|
||||||
|
|
||||||
if (NS_SUCCEEDED(Convert(aBdAddr, bdAddr))) {
|
|
||||||
status = mInterface->formatted_at_response(aRsp, &bdAddr);
|
|
||||||
} else {
|
|
||||||
status = BT_STATUS_PARM_INVALID;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
status = mInterface->formatted_at_response(aRsp);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothHandsfreeHALResult(
|
|
||||||
aRes, &BluetoothHandsfreeResultHandler::FormattedAtResponse,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothHandsfreeHALInterface::AtResponse(
|
|
||||||
BluetoothHandsfreeAtResponse aResponseCode, int aErrorCode,
|
|
||||||
const nsAString& aBdAddr,
|
|
||||||
BluetoothHandsfreeResultHandler* aRes)
|
|
||||||
{
|
|
||||||
bt_status_t status;
|
|
||||||
bthf_at_response_t responseCode = BTHF_AT_RESPONSE_ERROR;
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 21
|
|
||||||
bt_bdaddr_t bdAddr;
|
|
||||||
|
|
||||||
if (NS_SUCCEEDED(Convert(aResponseCode, responseCode)) &&
|
|
||||||
NS_SUCCEEDED(Convert(aBdAddr, bdAddr))) {
|
|
||||||
status = mInterface->at_response(responseCode, aErrorCode, &bdAddr);
|
|
||||||
#else
|
|
||||||
if (NS_SUCCEEDED(Convert(aResponseCode, responseCode))) {
|
|
||||||
status = mInterface->at_response(responseCode, aErrorCode);
|
|
||||||
#endif
|
|
||||||
} else {
|
|
||||||
status = BT_STATUS_PARM_INVALID;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothHandsfreeHALResult(
|
|
||||||
aRes, &BluetoothHandsfreeResultHandler::AtResponse,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothHandsfreeHALInterface::ClccResponse(
|
|
||||||
int aIndex,
|
|
||||||
BluetoothHandsfreeCallDirection aDir,
|
|
||||||
BluetoothHandsfreeCallState aState,
|
|
||||||
BluetoothHandsfreeCallMode aMode,
|
|
||||||
BluetoothHandsfreeCallMptyType aMpty,
|
|
||||||
const nsAString& aNumber,
|
|
||||||
BluetoothHandsfreeCallAddressType aType,
|
|
||||||
const nsAString& aBdAddr,
|
|
||||||
BluetoothHandsfreeResultHandler* aRes)
|
|
||||||
{
|
|
||||||
bt_status_t status;
|
|
||||||
bthf_call_direction_t dir = BTHF_CALL_DIRECTION_OUTGOING;
|
|
||||||
bthf_call_state_t state = BTHF_CALL_STATE_ACTIVE;
|
|
||||||
bthf_call_mode_t mode = BTHF_CALL_TYPE_VOICE;
|
|
||||||
bthf_call_mpty_type_t mpty = BTHF_CALL_MPTY_TYPE_SINGLE;
|
|
||||||
bthf_call_addrtype_t type = BTHF_CALL_ADDRTYPE_UNKNOWN;
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 21
|
|
||||||
bt_bdaddr_t bdAddr;
|
|
||||||
|
|
||||||
if (NS_SUCCEEDED(Convert(aDir, dir)) &&
|
|
||||||
NS_SUCCEEDED(Convert(aState, state)) &&
|
|
||||||
NS_SUCCEEDED(Convert(aMode, mode)) &&
|
|
||||||
NS_SUCCEEDED(Convert(aMpty, mpty)) &&
|
|
||||||
NS_SUCCEEDED(Convert(aType, type)) &&
|
|
||||||
NS_SUCCEEDED(Convert(aBdAddr, bdAddr))) {
|
|
||||||
status = mInterface->clcc_response(aIndex, dir, state, mode, mpty,
|
|
||||||
NS_ConvertUTF16toUTF8(aNumber).get(),
|
|
||||||
type, &bdAddr);
|
|
||||||
#else
|
|
||||||
if (NS_SUCCEEDED(Convert(aDir, dir)) &&
|
|
||||||
NS_SUCCEEDED(Convert(aState, state)) &&
|
|
||||||
NS_SUCCEEDED(Convert(aMode, mode)) &&
|
|
||||||
NS_SUCCEEDED(Convert(aMpty, mpty)) &&
|
|
||||||
NS_SUCCEEDED(Convert(aType, type))) {
|
|
||||||
status = mInterface->clcc_response(aIndex, dir, state, mode, mpty,
|
|
||||||
NS_ConvertUTF16toUTF8(aNumber).get(),
|
|
||||||
type);
|
|
||||||
#endif
|
|
||||||
} else {
|
|
||||||
status = BT_STATUS_PARM_INVALID;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothHandsfreeHALResult(
|
|
||||||
aRes, &BluetoothHandsfreeResultHandler::ClccResponse,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Phone State */
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothHandsfreeHALInterface::PhoneStateChange(int aNumActive, int aNumHeld,
|
|
||||||
BluetoothHandsfreeCallState aCallSetupState, const nsAString& aNumber,
|
|
||||||
BluetoothHandsfreeCallAddressType aType,
|
|
||||||
BluetoothHandsfreeResultHandler* aRes)
|
|
||||||
{
|
|
||||||
bt_status_t status;
|
|
||||||
bthf_call_state_t callSetupState = BTHF_CALL_STATE_ACTIVE;
|
|
||||||
bthf_call_addrtype_t type = BTHF_CALL_ADDRTYPE_UNKNOWN;
|
|
||||||
|
|
||||||
if (NS_SUCCEEDED(Convert(aCallSetupState, callSetupState)) &&
|
|
||||||
NS_SUCCEEDED(Convert(aType, type))) {
|
|
||||||
status = mInterface->phone_state_change(
|
|
||||||
aNumActive, aNumHeld, callSetupState,
|
|
||||||
NS_ConvertUTF16toUTF8(aNumber).get(), type);
|
|
||||||
} else {
|
|
||||||
status = BT_STATUS_PARM_INVALID;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothHandsfreeHALResult(
|
|
||||||
aRes, &BluetoothHandsfreeResultHandler::PhoneStateChange,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Wide Band Speech */
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothHandsfreeHALInterface::ConfigureWbs(
|
|
||||||
const nsAString& aBdAddr,
|
|
||||||
BluetoothHandsfreeWbsConfig aConfig,
|
|
||||||
BluetoothHandsfreeResultHandler* aRes)
|
|
||||||
{
|
|
||||||
bt_status_t status;
|
|
||||||
|
|
||||||
#if ANDROID_VERSION >= 21
|
|
||||||
bt_bdaddr_t bdAddr;
|
|
||||||
bthf_wbs_config_t wbsConfig;
|
|
||||||
|
|
||||||
if (NS_SUCCEEDED(Convert(aBdAddr, bdAddr)) &&
|
|
||||||
NS_SUCCEEDED(Convert(aConfig, wbsConfig))) {
|
|
||||||
status = mInterface->configure_wbs(&bdAddr, wbsConfig);
|
|
||||||
} else {
|
|
||||||
status = BT_STATUS_PARM_INVALID;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
status = BT_STATUS_UNSUPPORTED;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothHandsfreeHALResult(
|
|
||||||
aRes, &BluetoothHandsfreeResultHandler::ConfigureWbs,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
END_BLUETOOTH_NAMESPACE
|
|
@ -1,107 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
||||||
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
||||||
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
#ifndef mozilla_dom_bluetooth_bluedroid_bluetoothhandsfreehalinterface_h__
|
|
||||||
#define mozilla_dom_bluetooth_bluedroid_bluetoothhandsfreehalinterface_h__
|
|
||||||
|
|
||||||
#include <hardware/bluetooth.h>
|
|
||||||
#include <hardware/bt_hf.h>
|
|
||||||
#include "BluetoothCommon.h"
|
|
||||||
#include "BluetoothInterface.h"
|
|
||||||
|
|
||||||
BEGIN_BLUETOOTH_NAMESPACE
|
|
||||||
|
|
||||||
class BluetoothHALInterface;
|
|
||||||
|
|
||||||
class BluetoothHandsfreeHALInterface final
|
|
||||||
: public BluetoothHandsfreeInterface
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
friend class BluetoothHALInterface;
|
|
||||||
|
|
||||||
void Init(BluetoothHandsfreeNotificationHandler* aNotificationHandler,
|
|
||||||
int aMaxNumClients,
|
|
||||||
BluetoothHandsfreeResultHandler* aRes);
|
|
||||||
void Cleanup(BluetoothHandsfreeResultHandler* aRes);
|
|
||||||
|
|
||||||
/* Connect / Disconnect */
|
|
||||||
|
|
||||||
void Connect(const nsAString& aBdAddr,
|
|
||||||
BluetoothHandsfreeResultHandler* aRes);
|
|
||||||
void Disconnect(const nsAString& aBdAddr,
|
|
||||||
BluetoothHandsfreeResultHandler* aRes);
|
|
||||||
void ConnectAudio(const nsAString& aBdAddr,
|
|
||||||
BluetoothHandsfreeResultHandler* aRes);
|
|
||||||
void DisconnectAudio(const nsAString& aBdAddr,
|
|
||||||
BluetoothHandsfreeResultHandler* aRes);
|
|
||||||
|
|
||||||
/* Voice Recognition */
|
|
||||||
|
|
||||||
void StartVoiceRecognition(const nsAString& aBdAddr,
|
|
||||||
BluetoothHandsfreeResultHandler* aRes);
|
|
||||||
void StopVoiceRecognition(const nsAString& aBdAddr,
|
|
||||||
BluetoothHandsfreeResultHandler* aRes);
|
|
||||||
|
|
||||||
/* Volume */
|
|
||||||
|
|
||||||
void VolumeControl(BluetoothHandsfreeVolumeType aType, int aVolume,
|
|
||||||
const nsAString& aBdAddr,
|
|
||||||
BluetoothHandsfreeResultHandler* aRes);
|
|
||||||
|
|
||||||
/* Device status */
|
|
||||||
|
|
||||||
void DeviceStatusNotification(BluetoothHandsfreeNetworkState aNtkState,
|
|
||||||
BluetoothHandsfreeServiceType aSvcType,
|
|
||||||
int aSignal, int aBattChg,
|
|
||||||
BluetoothHandsfreeResultHandler* aRes);
|
|
||||||
|
|
||||||
/* Responses */
|
|
||||||
|
|
||||||
void CopsResponse(const char* aCops, const nsAString& aBdAddr,
|
|
||||||
BluetoothHandsfreeResultHandler* aRes);
|
|
||||||
void CindResponse(int aSvc, int aNumActive, int aNumHeld,
|
|
||||||
BluetoothHandsfreeCallState aCallSetupState, int aSignal,
|
|
||||||
int aRoam, int aBattChg, const nsAString& aBdAddr,
|
|
||||||
BluetoothHandsfreeResultHandler* aRes);
|
|
||||||
void FormattedAtResponse(const char* aRsp, const nsAString& aBdAddr,
|
|
||||||
BluetoothHandsfreeResultHandler* aRes);
|
|
||||||
void AtResponse(BluetoothHandsfreeAtResponse aResponseCode, int aErrorCode,
|
|
||||||
const nsAString& aBdAddr,
|
|
||||||
BluetoothHandsfreeResultHandler* aRes);
|
|
||||||
void ClccResponse(int aIndex, BluetoothHandsfreeCallDirection aDir,
|
|
||||||
BluetoothHandsfreeCallState aState,
|
|
||||||
BluetoothHandsfreeCallMode aMode,
|
|
||||||
BluetoothHandsfreeCallMptyType aMpty,
|
|
||||||
const nsAString& aNumber,
|
|
||||||
BluetoothHandsfreeCallAddressType aType,
|
|
||||||
const nsAString& aBdAddr,
|
|
||||||
BluetoothHandsfreeResultHandler* aRes);
|
|
||||||
|
|
||||||
/* Phone State */
|
|
||||||
|
|
||||||
void PhoneStateChange(int aNumActive, int aNumHeld,
|
|
||||||
BluetoothHandsfreeCallState aCallSetupState,
|
|
||||||
const nsAString& aNumber,
|
|
||||||
BluetoothHandsfreeCallAddressType aType,
|
|
||||||
BluetoothHandsfreeResultHandler* aRes);
|
|
||||||
|
|
||||||
/* Wide Band Speech */
|
|
||||||
|
|
||||||
void ConfigureWbs(const nsAString& aBdAddr,
|
|
||||||
BluetoothHandsfreeWbsConfig aConfig,
|
|
||||||
BluetoothHandsfreeResultHandler* aRes);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
BluetoothHandsfreeHALInterface(const bthf_interface_t* aInterface);
|
|
||||||
~BluetoothHandsfreeHALInterface();
|
|
||||||
|
|
||||||
private:
|
|
||||||
const bthf_interface_t* mInterface;
|
|
||||||
};
|
|
||||||
|
|
||||||
END_BLUETOOTH_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,243 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
||||||
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
||||||
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
#include "BluetoothSocketHALInterface.h"
|
|
||||||
#include "BluetoothHALHelpers.h"
|
|
||||||
#include "BluetoothSocketMessageWatcher.h"
|
|
||||||
#include "mozilla/FileUtils.h"
|
|
||||||
#include "nsClassHashtable.h"
|
|
||||||
#include "nsXULAppAPI.h"
|
|
||||||
|
|
||||||
BEGIN_BLUETOOTH_NAMESPACE
|
|
||||||
|
|
||||||
typedef
|
|
||||||
BluetoothHALInterfaceRunnable1<BluetoothSocketResultHandler, void,
|
|
||||||
int, int>
|
|
||||||
BluetoothSocketHALIntResultRunnable;
|
|
||||||
|
|
||||||
typedef
|
|
||||||
BluetoothHALInterfaceRunnable3<BluetoothSocketResultHandler, void,
|
|
||||||
int, const nsString, int,
|
|
||||||
int, const nsAString_internal&, int>
|
|
||||||
BluetoothSocketHALIntStringIntResultRunnable;
|
|
||||||
|
|
||||||
typedef
|
|
||||||
BluetoothHALInterfaceRunnable1<BluetoothSocketResultHandler, void,
|
|
||||||
BluetoothStatus, BluetoothStatus>
|
|
||||||
BluetoothSocketHALErrorRunnable;
|
|
||||||
|
|
||||||
static nsresult
|
|
||||||
DispatchBluetoothSocketHALResult(
|
|
||||||
BluetoothSocketResultHandler* aRes,
|
|
||||||
void (BluetoothSocketResultHandler::*aMethod)(int), int aArg,
|
|
||||||
BluetoothStatus aStatus)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(aRes);
|
|
||||||
|
|
||||||
nsRefPtr<nsRunnable> runnable;
|
|
||||||
|
|
||||||
if (aStatus == STATUS_SUCCESS) {
|
|
||||||
runnable = new BluetoothSocketHALIntResultRunnable(aRes, aMethod, aArg);
|
|
||||||
} else {
|
|
||||||
runnable = new BluetoothSocketHALErrorRunnable(aRes,
|
|
||||||
&BluetoothSocketResultHandler::OnError, aStatus);
|
|
||||||
}
|
|
||||||
nsresult rv = NS_DispatchToMainThread(runnable);
|
|
||||||
if (NS_FAILED(rv)) {
|
|
||||||
BT_WARNING("NS_DispatchToMainThread failed: %X", rv);
|
|
||||||
}
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
static nsresult
|
|
||||||
DispatchBluetoothSocketHALResult(
|
|
||||||
BluetoothSocketResultHandler* aRes,
|
|
||||||
void (BluetoothSocketResultHandler::*aMethod)(int, const nsAString&, int),
|
|
||||||
int aArg1, const nsAString& aArg2, int aArg3, BluetoothStatus aStatus)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(aRes);
|
|
||||||
|
|
||||||
nsRefPtr<nsRunnable> runnable;
|
|
||||||
|
|
||||||
if (aStatus == STATUS_SUCCESS) {
|
|
||||||
runnable = new BluetoothSocketHALIntStringIntResultRunnable(
|
|
||||||
aRes, aMethod, aArg1, aArg2, aArg3);
|
|
||||||
} else {
|
|
||||||
runnable = new BluetoothSocketHALErrorRunnable(aRes,
|
|
||||||
&BluetoothSocketResultHandler::OnError, aStatus);
|
|
||||||
}
|
|
||||||
nsresult rv = NS_DispatchToMainThread(runnable);
|
|
||||||
if (NS_FAILED(rv)) {
|
|
||||||
BT_WARNING("NS_DispatchToMainThread failed: %X", rv);
|
|
||||||
}
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothSocketHALInterface::Listen(BluetoothSocketType aType,
|
|
||||||
const nsAString& aServiceName,
|
|
||||||
const uint8_t aServiceUuid[16],
|
|
||||||
int aChannel, bool aEncrypt,
|
|
||||||
bool aAuth,
|
|
||||||
BluetoothSocketResultHandler* aRes)
|
|
||||||
{
|
|
||||||
int fd;
|
|
||||||
bt_status_t status;
|
|
||||||
btsock_type_t type = BTSOCK_RFCOMM; // silences compiler warning
|
|
||||||
|
|
||||||
if (NS_SUCCEEDED(Convert(aType, type))) {
|
|
||||||
status = mInterface->listen(type,
|
|
||||||
NS_ConvertUTF16toUTF8(aServiceName).get(),
|
|
||||||
aServiceUuid, aChannel, &fd,
|
|
||||||
(BTSOCK_FLAG_ENCRYPT * aEncrypt) |
|
|
||||||
(BTSOCK_FLAG_AUTH * aAuth));
|
|
||||||
} else {
|
|
||||||
status = BT_STATUS_PARM_INVALID;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aRes) {
|
|
||||||
DispatchBluetoothSocketHALResult(
|
|
||||||
aRes, &BluetoothSocketResultHandler::Listen, fd,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* |DeleteTask| deletes a class instance on the I/O thread
|
|
||||||
*/
|
|
||||||
template <typename T>
|
|
||||||
class DeleteTask final : public Task
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
DeleteTask(T* aPtr)
|
|
||||||
: mPtr(aPtr)
|
|
||||||
{ }
|
|
||||||
|
|
||||||
void Run() override
|
|
||||||
{
|
|
||||||
mPtr = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
nsAutoPtr<T> mPtr;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* |ConnectWatcher| specializes SocketMessageWatcher for
|
|
||||||
* connect operations by reading the socket messages from
|
|
||||||
* Bluedroid and forwarding the connected socket to the
|
|
||||||
* resource handler.
|
|
||||||
*/
|
|
||||||
class BluetoothSocketHALInterface::ConnectWatcher final
|
|
||||||
: public SocketMessageWatcher
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
ConnectWatcher(int aFd, BluetoothSocketResultHandler* aRes)
|
|
||||||
: SocketMessageWatcher(aFd, aRes)
|
|
||||||
{ }
|
|
||||||
|
|
||||||
void Proceed(BluetoothStatus aStatus) override
|
|
||||||
{
|
|
||||||
DispatchBluetoothSocketHALResult(
|
|
||||||
GetResultHandler(), &BluetoothSocketResultHandler::Connect,
|
|
||||||
GetFd(), GetBdAddress(), GetConnectionStatus(), aStatus);
|
|
||||||
|
|
||||||
MessageLoopForIO::current()->PostTask(
|
|
||||||
FROM_HERE, new DeleteTask<ConnectWatcher>(this));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothSocketHALInterface::Connect(const nsAString& aBdAddr,
|
|
||||||
BluetoothSocketType aType,
|
|
||||||
const uint8_t aUuid[16],
|
|
||||||
int aChannel, bool aEncrypt,
|
|
||||||
bool aAuth,
|
|
||||||
BluetoothSocketResultHandler* aRes)
|
|
||||||
{
|
|
||||||
int fd;
|
|
||||||
bt_status_t status;
|
|
||||||
bt_bdaddr_t bdAddr;
|
|
||||||
btsock_type_t type = BTSOCK_RFCOMM; // silences compiler warning
|
|
||||||
|
|
||||||
if (NS_SUCCEEDED(Convert(aBdAddr, bdAddr)) &&
|
|
||||||
NS_SUCCEEDED(Convert(aType, type))) {
|
|
||||||
status = mInterface->connect(&bdAddr, type, aUuid, aChannel, &fd,
|
|
||||||
(BTSOCK_FLAG_ENCRYPT * aEncrypt) |
|
|
||||||
(BTSOCK_FLAG_AUTH * aAuth));
|
|
||||||
} else {
|
|
||||||
status = BT_STATUS_PARM_INVALID;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (status == BT_STATUS_SUCCESS) {
|
|
||||||
/* receive Bluedroid's socket-setup messages */
|
|
||||||
Task* t = new SocketMessageWatcherTask(new ConnectWatcher(fd, aRes));
|
|
||||||
XRE_GetIOMessageLoop()->PostTask(FROM_HERE, t);
|
|
||||||
} else if (aRes) {
|
|
||||||
DispatchBluetoothSocketHALResult(
|
|
||||||
aRes, &BluetoothSocketResultHandler::Connect, -1, EmptyString(), 0,
|
|
||||||
ConvertDefault(status, STATUS_FAIL));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* |AcceptWatcher| specializes SocketMessageWatcher for Accept
|
|
||||||
* operations by reading the socket messages from Bluedroid and
|
|
||||||
* forwarding the received client socket to the resource handler.
|
|
||||||
* The first message is received immediately. When there's a new
|
|
||||||
* connection, Bluedroid sends the 2nd message with the socket
|
|
||||||
* info and socket file descriptor.
|
|
||||||
*/
|
|
||||||
class BluetoothSocketHALInterface::AcceptWatcher final
|
|
||||||
: public SocketMessageWatcher
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
AcceptWatcher(int aFd, BluetoothSocketResultHandler* aRes)
|
|
||||||
: SocketMessageWatcher(aFd, aRes)
|
|
||||||
{ }
|
|
||||||
|
|
||||||
void Proceed(BluetoothStatus aStatus) override
|
|
||||||
{
|
|
||||||
if ((aStatus != STATUS_SUCCESS) && (GetClientFd() != -1)) {
|
|
||||||
mozilla::ScopedClose(GetClientFd()); // Close received socket fd on error
|
|
||||||
}
|
|
||||||
|
|
||||||
DispatchBluetoothSocketHALResult(
|
|
||||||
GetResultHandler(), &BluetoothSocketResultHandler::Accept,
|
|
||||||
GetClientFd(), GetBdAddress(), GetConnectionStatus(), aStatus);
|
|
||||||
|
|
||||||
MessageLoopForIO::current()->PostTask(
|
|
||||||
FROM_HERE, new DeleteTask<AcceptWatcher>(this));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothSocketHALInterface::Accept(int aFd,
|
|
||||||
BluetoothSocketResultHandler* aRes)
|
|
||||||
{
|
|
||||||
/* receive Bluedroid's socket-setup messages and client fd */
|
|
||||||
Task* t = new SocketMessageWatcherTask(new AcceptWatcher(aFd, aRes));
|
|
||||||
XRE_GetIOMessageLoop()->PostTask(FROM_HERE, t);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
BluetoothSocketHALInterface::Close(BluetoothSocketResultHandler* aRes)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(aRes);
|
|
||||||
|
|
||||||
/* stop the watcher corresponding to |aRes| */
|
|
||||||
Task* t = new DeleteSocketMessageWatcherTask(aRes);
|
|
||||||
XRE_GetIOMessageLoop()->PostTask(FROM_HERE, t);
|
|
||||||
}
|
|
||||||
|
|
||||||
BluetoothSocketHALInterface::BluetoothSocketHALInterface(
|
|
||||||
const btsock_interface_t* aInterface)
|
|
||||||
: mInterface(aInterface)
|
|
||||||
{
|
|
||||||
MOZ_ASSERT(mInterface);
|
|
||||||
}
|
|
||||||
|
|
||||||
BluetoothSocketHALInterface::~BluetoothSocketHALInterface()
|
|
||||||
{ }
|
|
||||||
|
|
||||||
END_BLUETOOTH_NAMESPACE
|
|
@ -1,54 +0,0 @@
|
|||||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
||||||
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
||||||
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
||||||
|
|
||||||
#ifndef mozilla_dom_bluetooth_bluedroid_bluetoothsockethalinterface_h__
|
|
||||||
#define mozilla_dom_bluetooth_bluedroid_bluetoothsockethalinterface_h__
|
|
||||||
|
|
||||||
#include <hardware/bluetooth.h>
|
|
||||||
#include <hardware/bt_sock.h>
|
|
||||||
#include "BluetoothCommon.h"
|
|
||||||
#include "BluetoothInterface.h"
|
|
||||||
|
|
||||||
BEGIN_BLUETOOTH_NAMESPACE
|
|
||||||
|
|
||||||
class BluetoothHALInterface;
|
|
||||||
|
|
||||||
class BluetoothSocketHALInterface final
|
|
||||||
: public BluetoothSocketInterface
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
class ConnectWatcher;
|
|
||||||
class AcceptWatcher;
|
|
||||||
|
|
||||||
friend class BluetoothHALInterface;
|
|
||||||
|
|
||||||
void Listen(BluetoothSocketType aType,
|
|
||||||
const nsAString& aServiceName,
|
|
||||||
const uint8_t aServiceUuid[16],
|
|
||||||
int aChannel, bool aEncrypt, bool aAuth,
|
|
||||||
BluetoothSocketResultHandler* aRes);
|
|
||||||
|
|
||||||
void Connect(const nsAString& aBdAddr,
|
|
||||||
BluetoothSocketType aType,
|
|
||||||
const uint8_t aUuid[16],
|
|
||||||
int aChannel, bool aEncrypt, bool aAuth,
|
|
||||||
BluetoothSocketResultHandler* aRes);
|
|
||||||
|
|
||||||
void Accept(int aFd, BluetoothSocketResultHandler* aRes);
|
|
||||||
|
|
||||||
void Close(BluetoothSocketResultHandler* aRes);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
BluetoothSocketHALInterface(const btsock_interface_t* aInterface);
|
|
||||||
~BluetoothSocketHALInterface();
|
|
||||||
|
|
||||||
private:
|
|
||||||
const btsock_interface_t* mInterface;
|
|
||||||
};
|
|
||||||
|
|
||||||
END_BLUETOOTH_NAMESPACE
|
|
||||||
|
|
||||||
#endif
|
|
@ -15,7 +15,7 @@
|
|||||||
#include "BluetoothManager.h"
|
#include "BluetoothManager.h"
|
||||||
#include "BluetoothOppManager.h"
|
#include "BluetoothOppManager.h"
|
||||||
#include "BluetoothParent.h"
|
#include "BluetoothParent.h"
|
||||||
#if defined(MOZ_B2G_BT_BLUEDROID)
|
#if defined(MOZ_B2G_BT_DAEMON)
|
||||||
#include "BluetoothPbapManager.h"
|
#include "BluetoothPbapManager.h"
|
||||||
#endif
|
#endif
|
||||||
#include "BluetoothReplyRunnable.h"
|
#include "BluetoothReplyRunnable.h"
|
||||||
@ -52,17 +52,10 @@
|
|||||||
* MOZ_B2G_BT and MOZ_B2G_BT_BLUEZ are both defined.
|
* MOZ_B2G_BT and MOZ_B2G_BT_BLUEZ are both defined.
|
||||||
*/
|
*/
|
||||||
#include "BluetoothDBusService.h"
|
#include "BluetoothDBusService.h"
|
||||||
#elif defined(MOZ_B2G_BT_BLUEDROID)
|
|
||||||
/**
|
|
||||||
* B2G bluedroid:
|
|
||||||
* MOZ_B2G_BT and MOZ_B2G_BT_BLUEDROID are both defined;
|
|
||||||
* MOZ_B2G_BLUEZ or MOZ_B2G_DAEMON are not defined.
|
|
||||||
*/
|
|
||||||
#include "BluetoothServiceBluedroid.h"
|
|
||||||
#elif defined(MOZ_B2G_BT_DAEMON)
|
#elif defined(MOZ_B2G_BT_DAEMON)
|
||||||
/**
|
/**
|
||||||
* B2G Bluetooth daemon:
|
* B2G Bluetooth daemon:
|
||||||
* MOZ_B2G_BT, MOZ_B2G_BLUEDROID and MOZ_B2G_BT_DAEMON are defined;
|
* MOZ_B2G_BT and MOZ_B2G_BT_DAEMON are defined;
|
||||||
* MOZ_B2G_BLUEZ is not defined.
|
* MOZ_B2G_BLUEZ is not defined.
|
||||||
*/
|
*/
|
||||||
#include "BluetoothServiceBluedroid.h"
|
#include "BluetoothServiceBluedroid.h"
|
||||||
@ -220,8 +213,6 @@ BluetoothService::Create()
|
|||||||
|
|
||||||
#if defined(MOZ_B2G_BT_BLUEZ)
|
#if defined(MOZ_B2G_BT_BLUEZ)
|
||||||
return new BluetoothDBusService();
|
return new BluetoothDBusService();
|
||||||
#elif defined(MOZ_B2G_BT_BLUEDROID)
|
|
||||||
return new BluetoothServiceBluedroid();
|
|
||||||
#elif defined(MOZ_B2G_BT_DAEMON)
|
#elif defined(MOZ_B2G_BT_DAEMON)
|
||||||
return new BluetoothServiceBluedroid();
|
return new BluetoothServiceBluedroid();
|
||||||
#endif
|
#endif
|
||||||
@ -409,7 +400,7 @@ BluetoothService::StopBluetooth(bool aIsStartup)
|
|||||||
BluetoothHfpManager::Get(),
|
BluetoothHfpManager::Get(),
|
||||||
BluetoothA2dpManager::Get(),
|
BluetoothA2dpManager::Get(),
|
||||||
BluetoothOppManager::Get(),
|
BluetoothOppManager::Get(),
|
||||||
#if defined(MOZ_B2G_BT_BLUEDROID)
|
#if defined(MOZ_B2G_BT_DAEMON)
|
||||||
BluetoothPbapManager::Get(),
|
BluetoothPbapManager::Get(),
|
||||||
#endif
|
#endif
|
||||||
BluetoothHidManager::Get()
|
BluetoothHidManager::Get()
|
||||||
|
@ -43,17 +43,10 @@
|
|||||||
* MOZ_B2G_BT and MOZ_B2G_BT_BLUEZ are both defined.
|
* MOZ_B2G_BT and MOZ_B2G_BT_BLUEZ are both defined.
|
||||||
*/
|
*/
|
||||||
#include "BluetoothDBusService.h"
|
#include "BluetoothDBusService.h"
|
||||||
#elif defined(MOZ_B2G_BT_BLUEDROID)
|
|
||||||
/**
|
|
||||||
* B2G bluedroid:
|
|
||||||
* MOZ_B2G_BT and MOZ_B2G_BT_BLUEDROID are both defined;
|
|
||||||
* MOZ_B2G_BLUEZ or MOZ_B2G_DAEMON are not defined.
|
|
||||||
*/
|
|
||||||
#include "BluetoothServiceBluedroid.h"
|
|
||||||
#elif defined(MOZ_B2G_BT_DAEMON)
|
#elif defined(MOZ_B2G_BT_DAEMON)
|
||||||
/**
|
/**
|
||||||
* B2G Bluetooth daemon:
|
* B2G Bluetooth daemon:
|
||||||
* MOZ_B2G_BT, MOZ_B2G_BLUEDROID and MOZ_B2G_BT_DAEMON are defined;
|
* MOZ_B2G_BT and MOZ_B2G_BT_DAEMON are defined;
|
||||||
* MOZ_B2G_BLUEZ is not defined.
|
* MOZ_B2G_BLUEZ is not defined.
|
||||||
*/
|
*/
|
||||||
#include "BluetoothServiceBluedroid.h"
|
#include "BluetoothServiceBluedroid.h"
|
||||||
@ -199,8 +192,6 @@ BluetoothService::Create()
|
|||||||
|
|
||||||
#if defined(MOZ_B2G_BT_BLUEZ)
|
#if defined(MOZ_B2G_BT_BLUEZ)
|
||||||
return new BluetoothDBusService();
|
return new BluetoothDBusService();
|
||||||
#elif defined(MOZ_B2G_BT_BLUEDROID)
|
|
||||||
return new BluetoothServiceBluedroid();
|
|
||||||
#elif defined(MOZ_B2G_BT_DAEMON)
|
#elif defined(MOZ_B2G_BT_DAEMON)
|
||||||
return new BluetoothServiceBluedroid();
|
return new BluetoothServiceBluedroid();
|
||||||
#endif
|
#endif
|
||||||
|
@ -87,11 +87,9 @@ if CONFIG['MOZ_B2G_BT']:
|
|||||||
'bluez',
|
'bluez',
|
||||||
]
|
]
|
||||||
DEFINES['MOZ_B2G_BT_BLUEZ'] = True
|
DEFINES['MOZ_B2G_BT_BLUEZ'] = True
|
||||||
elif CONFIG['MOZ_B2G_BT_BLUEDROID']:
|
elif CONFIG['MOZ_B2G_BT_DAEMON']:
|
||||||
SOURCES += [
|
SOURCES += [
|
||||||
'bluedroid/BluetoothA2dpHALInterface.cpp',
|
|
||||||
'bluedroid/BluetoothA2dpManager.cpp',
|
'bluedroid/BluetoothA2dpManager.cpp',
|
||||||
'bluedroid/BluetoothAvrcpHALInterface.cpp',
|
|
||||||
'bluedroid/BluetoothDaemonA2dpInterface.cpp',
|
'bluedroid/BluetoothDaemonA2dpInterface.cpp',
|
||||||
'bluedroid/BluetoothDaemonAvrcpInterface.cpp',
|
'bluedroid/BluetoothDaemonAvrcpInterface.cpp',
|
||||||
'bluedroid/BluetoothDaemonConnector.cpp',
|
'bluedroid/BluetoothDaemonConnector.cpp',
|
||||||
@ -101,15 +99,10 @@ if CONFIG['MOZ_B2G_BT']:
|
|||||||
'bluedroid/BluetoothDaemonInterface.cpp',
|
'bluedroid/BluetoothDaemonInterface.cpp',
|
||||||
'bluedroid/BluetoothDaemonSetupInterface.cpp',
|
'bluedroid/BluetoothDaemonSetupInterface.cpp',
|
||||||
'bluedroid/BluetoothDaemonSocketInterface.cpp',
|
'bluedroid/BluetoothDaemonSocketInterface.cpp',
|
||||||
'bluedroid/BluetoothGattHALInterface.cpp',
|
|
||||||
'bluedroid/BluetoothHALHelpers.cpp',
|
|
||||||
'bluedroid/BluetoothHALInterface.cpp',
|
|
||||||
'bluedroid/BluetoothHandsfreeHALInterface.cpp',
|
|
||||||
'bluedroid/BluetoothOppManager.cpp',
|
'bluedroid/BluetoothOppManager.cpp',
|
||||||
'bluedroid/BluetoothPbapManager.cpp',
|
'bluedroid/BluetoothPbapManager.cpp',
|
||||||
'bluedroid/BluetoothServiceBluedroid.cpp',
|
'bluedroid/BluetoothServiceBluedroid.cpp',
|
||||||
'bluedroid/BluetoothSocket.cpp',
|
'bluedroid/BluetoothSocket.cpp',
|
||||||
'bluedroid/BluetoothSocketHALInterface.cpp',
|
|
||||||
'bluedroid/BluetoothSocketMessageWatcher.cpp'
|
'bluedroid/BluetoothSocketMessageWatcher.cpp'
|
||||||
]
|
]
|
||||||
LOCAL_INCLUDES += [
|
LOCAL_INCLUDES += [
|
||||||
@ -135,9 +128,7 @@ if CONFIG['MOZ_B2G_BT']:
|
|||||||
'bluedroid/BluetoothGattManager.cpp',
|
'bluedroid/BluetoothGattManager.cpp',
|
||||||
]
|
]
|
||||||
|
|
||||||
DEFINES['MOZ_B2G_BT_BLUEDROID'] = True
|
DEFINES['MOZ_B2G_BT_DAEMON'] = True
|
||||||
if CONFIG['MOZ_B2G_BT_DAEMON']:
|
|
||||||
DEFINES['MOZ_B2G_BT_DAEMON'] = True
|
|
||||||
elif CONFIG['MOZ_ENABLE_DBUS']:
|
elif CONFIG['MOZ_ENABLE_DBUS']:
|
||||||
CFLAGS += CONFIG['MOZ_DBUS_CFLAGS']
|
CFLAGS += CONFIG['MOZ_DBUS_CFLAGS']
|
||||||
CFLAGS += CONFIG['MOZ_DBUS_GLIB_CFLAGS']
|
CFLAGS += CONFIG['MOZ_DBUS_GLIB_CFLAGS']
|
||||||
|
Loading…
x
Reference in New Issue
Block a user