| Index: chrome/browser/extensions/api/bluetooth_low_energy/bluetooth_low_energy_api.cc
|
| diff --git a/chrome/browser/extensions/api/bluetooth_low_energy/bluetooth_low_energy_api.cc b/chrome/browser/extensions/api/bluetooth_low_energy/bluetooth_low_energy_api.cc
|
| deleted file mode 100644
|
| index fc50f4ea8c17f0700bd7abd20d410f6043ff2e47..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/extensions/api/bluetooth_low_energy/bluetooth_low_energy_api.cc
|
| +++ /dev/null
|
| @@ -1,1540 +0,0 @@
|
| -// Copyright 2014 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/browser/extensions/api/bluetooth_low_energy/bluetooth_low_energy_api.h"
|
| -
|
| -#include <stdint.h>
|
| -#include <algorithm>
|
| -#include <iterator>
|
| -#include <utility>
|
| -#include <vector>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/callback.h"
|
| -#include "base/callback_forward.h"
|
| -#include "base/command_line.h"
|
| -#include "base/lazy_instance.h"
|
| -#include "base/logging.h"
|
| -#include "base/memory/weak_ptr.h"
|
| -#include "base/values.h"
|
| -#include "chrome/browser/extensions/api/bluetooth_low_energy/utils.h"
|
| -#include "chrome/common/extensions/api/bluetooth_low_energy.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| -#include "device/bluetooth/bluetooth_adapter.h"
|
| -#include "device/bluetooth/bluetooth_gatt_characteristic.h"
|
| -#include "device/bluetooth/bluetooth_local_gatt_characteristic.h"
|
| -#include "device/bluetooth/bluetooth_local_gatt_descriptor.h"
|
| -#include "device/bluetooth/bluetooth_local_gatt_service.h"
|
| -#include "device/bluetooth/bluetooth_uuid.h"
|
| -#include "extensions/common/api/bluetooth/bluetooth_manifest_data.h"
|
| -#include "extensions/common/extension.h"
|
| -#include "extensions/common/switches.h"
|
| -
|
| -#if defined(OS_CHROMEOS)
|
| -#include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h"
|
| -#endif
|
| -
|
| -using content::BrowserContext;
|
| -using content::BrowserThread;
|
| -
|
| -namespace apibtle = extensions::api::bluetooth_low_energy;
|
| -
|
| -namespace extensions {
|
| -
|
| -namespace {
|
| -
|
| -const char kErrorAdapterNotInitialized[] =
|
| - "Could not initialize Bluetooth adapter";
|
| -const char kErrorAlreadyConnected[] = "Already connected";
|
| -const char kErrorAlreadyNotifying[] = "Already notifying";
|
| -const char kErrorAttributeLengthInvalid[] = "Attribute length invalid";
|
| -const char kErrorAuthenticationFailed[] = "Authentication failed";
|
| -const char kErrorCanceled[] = "Request canceled";
|
| -const char kErrorConnectionCongested[] = "Connection congested";
|
| -const char kErrorGattNotSupported[] = "Operation not supported by this service";
|
| -const char kErrorHigherSecurity[] = "Higher security needed";
|
| -const char kErrorInProgress[] = "In progress";
|
| -const char kErrorInsufficientAuthorization[] = "Insufficient authorization";
|
| -const char kErrorInsufficientEncryption[] = "Insufficient encryption";
|
| -const char kErrorInvalidAdvertisementLength[] = "Invalid advertisement length";
|
| -const char kErrorInvalidLength[] = "Invalid attribute value length";
|
| -const char kErrorNotConnected[] = "Not connected";
|
| -const char kErrorNotFound[] = "Instance not found";
|
| -const char kErrorNotNotifying[] = "Not notifying";
|
| -const char kErrorOffsetInvalid[] = "Offset invalid";
|
| -const char kErrorOperationFailed[] = "Operation failed";
|
| -const char kErrorPermissionDenied[] = "Permission denied";
|
| -const char kErrorPlatformNotSupported[] =
|
| - "This operation is not supported on the current platform";
|
| -const char kErrorRequestNotSupported[] = "Request not supported";
|
| -const char kErrorTimeout[] = "Operation timed out";
|
| -const char kErrorUnsupportedDevice[] =
|
| - "This device is not supported on the current platform";
|
| -const char kErrorInvalidServiceId[] = "The service ID doesn't exist.";
|
| -const char kErrorInvalidCharacteristicId[] =
|
| - "The characteristic ID doesn't exist.";
|
| -const char kErrorNotifyPropertyNotSet[] =
|
| - "The characteristic does not have the notify property set.";
|
| -const char kErrorIndicatePropertyNotSet[] =
|
| - "The characteristic does not have the indicate property set.";
|
| -const char kErrorServiceNotRegistered[] =
|
| - "The characteristic is not owned by a service that is registered.";
|
| -const char kErrorUnknownNotificationError[] =
|
| - "An unknown notification error occured.";
|
| -
|
| -const char kStatusAdvertisementAlreadyExists[] =
|
| - "An advertisement is already advertising";
|
| -const char kStatusAdvertisementDoesNotExist[] =
|
| - "This advertisement does not exist";
|
| -#if defined(OS_CHROMEOS) || defined(OS_LINUX)
|
| -const char kStatusInvalidAdvertisingInterval[] =
|
| - "Invalid advertising interval specified.";
|
| -#endif
|
| -
|
| -// Returns the correct error string based on error status |status|. This is used
|
| -// to set the value of |chrome.runtime.lastError.message| and should not be
|
| -// passed |BluetoothLowEnergyEventRouter::kStatusSuccess|.
|
| -std::string StatusToString(BluetoothLowEnergyEventRouter::Status status) {
|
| - switch (status) {
|
| - case BluetoothLowEnergyEventRouter::kStatusErrorAlreadyConnected:
|
| - return kErrorAlreadyConnected;
|
| - case BluetoothLowEnergyEventRouter::kStatusErrorAlreadyNotifying:
|
| - return kErrorAlreadyNotifying;
|
| - case BluetoothLowEnergyEventRouter::kStatusErrorAttributeLengthInvalid:
|
| - return kErrorAttributeLengthInvalid;
|
| - case BluetoothLowEnergyEventRouter::kStatusErrorAuthenticationFailed:
|
| - return kErrorAuthenticationFailed;
|
| - case BluetoothLowEnergyEventRouter::kStatusErrorCanceled:
|
| - return kErrorCanceled;
|
| - case BluetoothLowEnergyEventRouter::kStatusErrorConnectionCongested:
|
| - return kErrorConnectionCongested;
|
| - case BluetoothLowEnergyEventRouter::kStatusErrorGattNotSupported:
|
| - return kErrorGattNotSupported;
|
| - case BluetoothLowEnergyEventRouter::kStatusErrorHigherSecurity:
|
| - return kErrorHigherSecurity;
|
| - case BluetoothLowEnergyEventRouter::kStatusErrorInProgress:
|
| - return kErrorInProgress;
|
| - case BluetoothLowEnergyEventRouter::kStatusErrorInsufficientAuthorization:
|
| - return kErrorInsufficientAuthorization;
|
| - case BluetoothLowEnergyEventRouter::kStatusErrorInsufficientEncryption:
|
| - return kErrorInsufficientEncryption;
|
| - case BluetoothLowEnergyEventRouter::kStatusErrorInvalidLength:
|
| - return kErrorInvalidLength;
|
| - case BluetoothLowEnergyEventRouter::kStatusErrorNotConnected:
|
| - return kErrorNotConnected;
|
| - case BluetoothLowEnergyEventRouter::kStatusErrorNotFound:
|
| - return kErrorNotFound;
|
| - case BluetoothLowEnergyEventRouter::kStatusErrorNotNotifying:
|
| - return kErrorNotNotifying;
|
| - case BluetoothLowEnergyEventRouter::kStatusErrorOffsetInvalid:
|
| - return kErrorOffsetInvalid;
|
| - case BluetoothLowEnergyEventRouter::kStatusErrorPermissionDenied:
|
| - return kErrorPermissionDenied;
|
| - case BluetoothLowEnergyEventRouter::kStatusErrorRequestNotSupported:
|
| - return kErrorRequestNotSupported;
|
| - case BluetoothLowEnergyEventRouter::kStatusErrorTimeout:
|
| - return kErrorTimeout;
|
| - case BluetoothLowEnergyEventRouter::kStatusErrorUnsupportedDevice:
|
| - return kErrorUnsupportedDevice;
|
| - case BluetoothLowEnergyEventRouter::kStatusErrorInvalidServiceId:
|
| - return kErrorInvalidServiceId;
|
| - case BluetoothLowEnergyEventRouter::kStatusSuccess:
|
| - NOTREACHED();
|
| - break;
|
| - default:
|
| - return kErrorOperationFailed;
|
| - }
|
| - return "";
|
| -}
|
| -
|
| -extensions::BluetoothLowEnergyEventRouter* GetEventRouter(
|
| - BrowserContext* context) {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| - return extensions::BluetoothLowEnergyAPI::Get(context)->event_router();
|
| -}
|
| -
|
| -template <typename T>
|
| -void DoWorkCallback(const base::Callback<T()>& callback) {
|
| - DCHECK(!callback.is_null());
|
| - callback.Run();
|
| -}
|
| -
|
| -std::unique_ptr<device::BluetoothAdvertisement::ManufacturerData>
|
| -CreateManufacturerData(
|
| - std::vector<apibtle::ManufacturerData>* manufacturer_data) {
|
| - std::unique_ptr<device::BluetoothAdvertisement::ManufacturerData>
|
| - created_data(new device::BluetoothAdvertisement::ManufacturerData());
|
| - for (const auto& it : *manufacturer_data) {
|
| - std::vector<uint8_t> data(it.data.size());
|
| - std::copy(it.data.begin(), it.data.end(), data.begin());
|
| - (*created_data)[it.id] = data;
|
| - }
|
| - return created_data;
|
| -}
|
| -
|
| -std::unique_ptr<device::BluetoothAdvertisement::ServiceData> CreateServiceData(
|
| - std::vector<apibtle::ServiceData>* service_data) {
|
| - std::unique_ptr<device::BluetoothAdvertisement::ServiceData> created_data(
|
| - new device::BluetoothAdvertisement::ServiceData());
|
| - for (const auto& it : *service_data) {
|
| - std::vector<uint8_t> data(it.data.size());
|
| - std::copy(it.data.begin(), it.data.end(), data.begin());
|
| - (*created_data)[it.uuid] = data;
|
| - }
|
| - return created_data;
|
| -}
|
| -
|
| -bool HasProperty(
|
| - const std::vector<apibtle::CharacteristicProperty>& api_properties,
|
| - apibtle::CharacteristicProperty property) {
|
| - return find(api_properties.begin(), api_properties.end(), property) !=
|
| - api_properties.end();
|
| -}
|
| -
|
| -bool HasPermission(
|
| - const std::vector<apibtle::DescriptorPermission>& api_permissions,
|
| - apibtle::DescriptorPermission permission) {
|
| - return find(api_permissions.begin(), api_permissions.end(), permission) !=
|
| - api_permissions.end();
|
| -}
|
| -
|
| -device::BluetoothGattCharacteristic::Properties GetBluetoothProperties(
|
| - const std::vector<apibtle::CharacteristicProperty>& api_properties) {
|
| - device::BluetoothGattCharacteristic::Properties properties =
|
| - device::BluetoothGattCharacteristic::PROPERTY_NONE;
|
| -
|
| - static_assert(
|
| - apibtle::CHARACTERISTIC_PROPERTY_LAST == 14,
|
| - "Update required if the number of characteristic properties changes.");
|
| -
|
| - if (HasProperty(api_properties, apibtle::CHARACTERISTIC_PROPERTY_BROADCAST)) {
|
| - properties |= device::BluetoothGattCharacteristic::PROPERTY_BROADCAST;
|
| - }
|
| -
|
| - if (HasProperty(api_properties, apibtle::CHARACTERISTIC_PROPERTY_READ)) {
|
| - properties |= device::BluetoothGattCharacteristic::PROPERTY_READ;
|
| - }
|
| -
|
| - if (HasProperty(api_properties,
|
| - apibtle::CHARACTERISTIC_PROPERTY_WRITEWITHOUTRESPONSE)) {
|
| - properties |=
|
| - device::BluetoothGattCharacteristic::PROPERTY_WRITE_WITHOUT_RESPONSE;
|
| - }
|
| -
|
| - if (HasProperty(api_properties, apibtle::CHARACTERISTIC_PROPERTY_WRITE)) {
|
| - properties |= device::BluetoothGattCharacteristic::PROPERTY_WRITE;
|
| - }
|
| -
|
| - if (HasProperty(api_properties, apibtle::CHARACTERISTIC_PROPERTY_NOTIFY)) {
|
| - properties |= device::BluetoothGattCharacteristic::PROPERTY_NOTIFY;
|
| - }
|
| -
|
| - if (HasProperty(api_properties, apibtle::CHARACTERISTIC_PROPERTY_INDICATE)) {
|
| - properties |= device::BluetoothGattCharacteristic::PROPERTY_INDICATE;
|
| - }
|
| -
|
| - if (HasProperty(api_properties,
|
| - apibtle::CHARACTERISTIC_PROPERTY_AUTHENTICATEDSIGNEDWRITES)) {
|
| - properties |= device::BluetoothGattCharacteristic::
|
| - PROPERTY_AUTHENTICATED_SIGNED_WRITES;
|
| - }
|
| -
|
| - if (HasProperty(api_properties,
|
| - apibtle::CHARACTERISTIC_PROPERTY_EXTENDEDPROPERTIES)) {
|
| - properties |=
|
| - device::BluetoothGattCharacteristic::PROPERTY_EXTENDED_PROPERTIES;
|
| - }
|
| -
|
| - if (HasProperty(api_properties,
|
| - apibtle::CHARACTERISTIC_PROPERTY_RELIABLEWRITE)) {
|
| - properties |= device::BluetoothGattCharacteristic::PROPERTY_RELIABLE_WRITE;
|
| - }
|
| -
|
| - if (HasProperty(api_properties,
|
| - apibtle::CHARACTERISTIC_PROPERTY_WRITABLEAUXILIARIES)) {
|
| - properties |=
|
| - device::BluetoothGattCharacteristic::PROPERTY_WRITABLE_AUXILIARIES;
|
| - }
|
| -
|
| - if (HasProperty(api_properties,
|
| - apibtle::CHARACTERISTIC_PROPERTY_ENCRYPTREAD)) {
|
| - properties |= device::BluetoothGattCharacteristic::PROPERTY_READ_ENCRYPTED;
|
| - }
|
| -
|
| - if (HasProperty(api_properties,
|
| - apibtle::CHARACTERISTIC_PROPERTY_ENCRYPTWRITE)) {
|
| - properties |= device::BluetoothGattCharacteristic::PROPERTY_WRITE_ENCRYPTED;
|
| - }
|
| -
|
| - if (HasProperty(api_properties,
|
| - apibtle::CHARACTERISTIC_PROPERTY_ENCRYPTAUTHENTICATEDREAD)) {
|
| - properties |= device::BluetoothGattCharacteristic::
|
| - PROPERTY_READ_ENCRYPTED_AUTHENTICATED;
|
| - }
|
| -
|
| - if (HasProperty(api_properties,
|
| - apibtle::CHARACTERISTIC_PROPERTY_ENCRYPTAUTHENTICATEDWRITE)) {
|
| - properties |= device::BluetoothGattCharacteristic::
|
| - PROPERTY_WRITE_ENCRYPTED_AUTHENTICATED;
|
| - }
|
| -
|
| - return properties;
|
| -}
|
| -
|
| -device::BluetoothGattCharacteristic::Permissions GetBluetoothPermissions(
|
| - const std::vector<apibtle::DescriptorPermission>& api_permissions) {
|
| - device::BluetoothGattCharacteristic::Permissions permissions =
|
| - device::BluetoothGattCharacteristic::PERMISSION_NONE;
|
| -
|
| - static_assert(
|
| - apibtle::DESCRIPTOR_PERMISSION_LAST == 6,
|
| - "Update required if the number of descriptor permissions changes.");
|
| -
|
| - if (HasPermission(api_permissions, apibtle::DESCRIPTOR_PERMISSION_READ)) {
|
| - permissions |= device::BluetoothGattCharacteristic::PERMISSION_READ;
|
| - }
|
| -
|
| - if (HasPermission(api_permissions, apibtle::DESCRIPTOR_PERMISSION_WRITE)) {
|
| - permissions |= device::BluetoothGattCharacteristic::PERMISSION_WRITE;
|
| - }
|
| -
|
| - if (HasPermission(api_permissions,
|
| - apibtle::DESCRIPTOR_PERMISSION_ENCRYPTEDREAD)) {
|
| - permissions |=
|
| - device::BluetoothGattCharacteristic::PERMISSION_READ_ENCRYPTED;
|
| - }
|
| -
|
| - if (HasPermission(api_permissions,
|
| - apibtle::DESCRIPTOR_PERMISSION_ENCRYPTEDWRITE)) {
|
| - permissions |=
|
| - device::BluetoothGattCharacteristic::PERMISSION_WRITE_ENCRYPTED;
|
| - }
|
| -
|
| - if (HasPermission(
|
| - api_permissions,
|
| - apibtle::DESCRIPTOR_PERMISSION_ENCRYPTEDAUTHENTICATEDREAD)) {
|
| - permissions |= device::BluetoothGattCharacteristic::
|
| - PERMISSION_READ_ENCRYPTED_AUTHENTICATED;
|
| - }
|
| -
|
| - if (HasPermission(
|
| - api_permissions,
|
| - apibtle::DESCRIPTOR_PERMISSION_ENCRYPTEDAUTHENTICATEDWRITE)) {
|
| - permissions |= device::BluetoothGattCharacteristic::
|
| - PERMISSION_WRITE_ENCRYPTED_AUTHENTICATED;
|
| - }
|
| -
|
| - return permissions;
|
| -}
|
| -
|
| -bool IsAutoLaunchedKioskApp(const ExtensionId& id) {
|
| -#if defined(OS_CHROMEOS)
|
| - chromeos::KioskAppManager::App app_info;
|
| - return chromeos::KioskAppManager::Get()->GetApp(id, &app_info) &&
|
| - app_info.was_auto_launched_with_zero_delay;
|
| -#else
|
| - return false;
|
| -#endif
|
| -}
|
| -
|
| -bool IsPeripheralFlagEnabled() {
|
| - return base::CommandLine::ForCurrentProcess()->HasSwitch(
|
| - switches::kEnableBLEAdvertising);
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -
|
| -static base::LazyInstance<BrowserContextKeyedAPIFactory<BluetoothLowEnergyAPI> >
|
| - g_factory = LAZY_INSTANCE_INITIALIZER;
|
| -
|
| -// static
|
| -BrowserContextKeyedAPIFactory<BluetoothLowEnergyAPI>*
|
| -BluetoothLowEnergyAPI::GetFactoryInstance() {
|
| - return g_factory.Pointer();
|
| -}
|
| -
|
| -// static
|
| -BluetoothLowEnergyAPI* BluetoothLowEnergyAPI::Get(BrowserContext* context) {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| - return GetFactoryInstance()->Get(context);
|
| -}
|
| -
|
| -BluetoothLowEnergyAPI::BluetoothLowEnergyAPI(BrowserContext* context)
|
| - : event_router_(new BluetoothLowEnergyEventRouter(context)) {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| -}
|
| -
|
| -BluetoothLowEnergyAPI::~BluetoothLowEnergyAPI() {
|
| -}
|
| -
|
| -void BluetoothLowEnergyAPI::Shutdown() {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| -}
|
| -
|
| -namespace api {
|
| -
|
| -BluetoothLowEnergyExtensionFunctionDeprecated::
|
| - BluetoothLowEnergyExtensionFunctionDeprecated() {}
|
| -
|
| -BluetoothLowEnergyExtensionFunctionDeprecated::
|
| - ~BluetoothLowEnergyExtensionFunctionDeprecated() {}
|
| -
|
| -bool BluetoothLowEnergyExtensionFunctionDeprecated::RunAsync() {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| -
|
| - if (!BluetoothManifestData::CheckLowEnergyPermitted(extension())) {
|
| - error_ = kErrorPermissionDenied;
|
| - return false;
|
| - }
|
| -
|
| - BluetoothLowEnergyEventRouter* event_router =
|
| - GetEventRouter(browser_context());
|
| - if (!event_router->IsBluetoothSupported()) {
|
| - SetError(kErrorPlatformNotSupported);
|
| - return false;
|
| - }
|
| -
|
| - // It is safe to pass |this| here as ExtensionFunction is refcounted.
|
| - if (!event_router->InitializeAdapterAndInvokeCallback(base::Bind(
|
| - &DoWorkCallback<bool>,
|
| - base::Bind(&BluetoothLowEnergyExtensionFunctionDeprecated::DoWork,
|
| - this)))) {
|
| - SetError(kErrorAdapterNotInitialized);
|
| - return false;
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| -BluetoothLowEnergyExtensionFunction::BluetoothLowEnergyExtensionFunction()
|
| - : event_router_(nullptr) {}
|
| -
|
| -BluetoothLowEnergyExtensionFunction::~BluetoothLowEnergyExtensionFunction() {}
|
| -
|
| -ExtensionFunction::ResponseAction BluetoothLowEnergyExtensionFunction::Run() {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| -
|
| - if (!BluetoothManifestData::CheckLowEnergyPermitted(extension()))
|
| - return RespondNow(Error(kErrorPermissionDenied));
|
| -
|
| - event_router_ = GetEventRouter(browser_context());
|
| - if (!event_router_->IsBluetoothSupported())
|
| - return RespondNow(Error(kErrorPlatformNotSupported));
|
| -
|
| - // It is safe to pass |this| here as ExtensionFunction is refcounted.
|
| - if (!event_router_->InitializeAdapterAndInvokeCallback(base::Bind(
|
| - &DoWorkCallback<void>,
|
| - base::Bind(&BluetoothLowEnergyExtensionFunction::PreDoWork, this)))) {
|
| - // DoWork will respond when the adapter gets initialized.
|
| - return RespondNow(Error(kErrorAdapterNotInitialized));
|
| - }
|
| -
|
| - return RespondLater();
|
| -}
|
| -
|
| -void BluetoothLowEnergyExtensionFunction::PreDoWork() {
|
| - // The adapter must be initialized at this point, but return an error instead
|
| - // of asserting.
|
| - if (!event_router_->HasAdapter()) {
|
| - Respond(Error(kErrorAdapterNotInitialized));
|
| - return;
|
| - }
|
| - DoWork();
|
| -}
|
| -
|
| -template <typename Params>
|
| -BLEPeripheralExtensionFunction<Params>::BLEPeripheralExtensionFunction() {}
|
| -
|
| -template <typename Params>
|
| -BLEPeripheralExtensionFunction<Params>::~BLEPeripheralExtensionFunction() {}
|
| -
|
| -template <typename Params>
|
| -ExtensionFunction::ResponseAction
|
| -BLEPeripheralExtensionFunction<Params>::Run() {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| -
|
| - // Check permissions in manifest.
|
| - if (!BluetoothManifestData::CheckPeripheralPermitted(extension()))
|
| - return RespondNow(Error(kErrorPermissionDenied));
|
| -
|
| - if (!(IsAutoLaunchedKioskApp(extension()->id()) ||
|
| - IsPeripheralFlagEnabled())) {
|
| - return RespondNow(Error(kErrorPermissionDenied));
|
| - }
|
| -
|
| -// Causes link error on Windows. API will never be on Windows, so #ifdefing.
|
| -#if !defined(OS_WIN)
|
| - params_ = Params::Create(*args_);
|
| - EXTENSION_FUNCTION_VALIDATE(params_.get() != NULL);
|
| -#endif
|
| -
|
| - return BluetoothLowEnergyExtensionFunction::Run();
|
| -}
|
| -
|
| -bool BluetoothLowEnergyConnectFunction::DoWork() {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| -
|
| - BluetoothLowEnergyEventRouter* event_router =
|
| - GetEventRouter(browser_context());
|
| -
|
| - // The adapter must be initialized at this point, but return an error instead
|
| - // of asserting.
|
| - if (!event_router->HasAdapter()) {
|
| - SetError(kErrorAdapterNotInitialized);
|
| - SendResponse(false);
|
| - return false;
|
| - }
|
| -
|
| - std::unique_ptr<apibtle::Connect::Params> params(
|
| - apibtle::Connect::Params::Create(*args_));
|
| - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
|
| -
|
| - bool persistent = false; // Not persistent by default.
|
| - apibtle::ConnectProperties* properties = params->properties.get();
|
| - if (properties)
|
| - persistent = properties->persistent;
|
| -
|
| - event_router->Connect(
|
| - persistent,
|
| - extension(),
|
| - params->device_address,
|
| - base::Bind(&BluetoothLowEnergyConnectFunction::SuccessCallback, this),
|
| - base::Bind(&BluetoothLowEnergyConnectFunction::ErrorCallback, this));
|
| -
|
| - return true;
|
| -}
|
| -
|
| -void BluetoothLowEnergyConnectFunction::SuccessCallback() {
|
| - SendResponse(true);
|
| -}
|
| -
|
| -void BluetoothLowEnergyConnectFunction::ErrorCallback(
|
| - BluetoothLowEnergyEventRouter::Status status) {
|
| - SetError(StatusToString(status));
|
| - SendResponse(false);
|
| -}
|
| -
|
| -bool BluetoothLowEnergyDisconnectFunction::DoWork() {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| -
|
| - BluetoothLowEnergyEventRouter* event_router =
|
| - GetEventRouter(browser_context());
|
| -
|
| - // The adapter must be initialized at this point, but return an error instead
|
| - // of asserting.
|
| - if (!event_router->HasAdapter()) {
|
| - SetError(kErrorAdapterNotInitialized);
|
| - SendResponse(false);
|
| - return false;
|
| - }
|
| -
|
| - std::unique_ptr<apibtle::Disconnect::Params> params(
|
| - apibtle::Disconnect::Params::Create(*args_));
|
| - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
|
| -
|
| - event_router->Disconnect(
|
| - extension(),
|
| - params->device_address,
|
| - base::Bind(&BluetoothLowEnergyDisconnectFunction::SuccessCallback, this),
|
| - base::Bind(&BluetoothLowEnergyDisconnectFunction::ErrorCallback, this));
|
| -
|
| - return true;
|
| -}
|
| -
|
| -void BluetoothLowEnergyDisconnectFunction::SuccessCallback() {
|
| - SendResponse(true);
|
| -}
|
| -
|
| -void BluetoothLowEnergyDisconnectFunction::ErrorCallback(
|
| - BluetoothLowEnergyEventRouter::Status status) {
|
| - SetError(StatusToString(status));
|
| - SendResponse(false);
|
| -}
|
| -
|
| -bool BluetoothLowEnergyGetServiceFunction::DoWork() {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| -
|
| - BluetoothLowEnergyEventRouter* event_router =
|
| - GetEventRouter(browser_context());
|
| -
|
| - // The adapter must be initialized at this point, but return an error instead
|
| - // of asserting.
|
| - if (!event_router->HasAdapter()) {
|
| - SetError(kErrorAdapterNotInitialized);
|
| - SendResponse(false);
|
| - return false;
|
| - }
|
| -
|
| - std::unique_ptr<apibtle::GetService::Params> params(
|
| - apibtle::GetService::Params::Create(*args_));
|
| - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
|
| -
|
| - apibtle::Service service;
|
| - BluetoothLowEnergyEventRouter::Status status =
|
| - event_router->GetService(params->service_id, &service);
|
| - if (status != BluetoothLowEnergyEventRouter::kStatusSuccess) {
|
| - SetError(StatusToString(status));
|
| - SendResponse(false);
|
| - return false;
|
| - }
|
| -
|
| - results_ = apibtle::GetService::Results::Create(service);
|
| - SendResponse(true);
|
| -
|
| - return true;
|
| -}
|
| -
|
| -bool BluetoothLowEnergyGetServicesFunction::DoWork() {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| -
|
| - BluetoothLowEnergyEventRouter* event_router =
|
| - GetEventRouter(browser_context());
|
| -
|
| - // The adapter must be initialized at this point, but return an error instead
|
| - // of asserting.
|
| - if (!event_router->HasAdapter()) {
|
| - SetError(kErrorAdapterNotInitialized);
|
| - SendResponse(false);
|
| - return false;
|
| - }
|
| -
|
| - std::unique_ptr<apibtle::GetServices::Params> params(
|
| - apibtle::GetServices::Params::Create(*args_));
|
| - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
|
| -
|
| - BluetoothLowEnergyEventRouter::ServiceList service_list;
|
| - if (!event_router->GetServices(params->device_address, &service_list)) {
|
| - SetError(kErrorNotFound);
|
| - SendResponse(false);
|
| - return false;
|
| - }
|
| -
|
| - results_ = apibtle::GetServices::Results::Create(service_list);
|
| - SendResponse(true);
|
| -
|
| - return true;
|
| -}
|
| -
|
| -bool BluetoothLowEnergyGetCharacteristicFunction::DoWork() {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| -
|
| - BluetoothLowEnergyEventRouter* event_router =
|
| - GetEventRouter(browser_context());
|
| -
|
| - // The adapter must be initialized at this point, but return an error instead
|
| - // of asserting.
|
| - if (!event_router->HasAdapter()) {
|
| - SetError(kErrorAdapterNotInitialized);
|
| - SendResponse(false);
|
| - return false;
|
| - }
|
| -
|
| - std::unique_ptr<apibtle::GetCharacteristic::Params> params(
|
| - apibtle::GetCharacteristic::Params::Create(*args_));
|
| - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
|
| -
|
| - apibtle::Characteristic characteristic;
|
| - BluetoothLowEnergyEventRouter::Status status =
|
| - event_router->GetCharacteristic(
|
| - extension(), params->characteristic_id, &characteristic);
|
| - if (status != BluetoothLowEnergyEventRouter::kStatusSuccess) {
|
| - SetError(StatusToString(status));
|
| - SendResponse(false);
|
| - return false;
|
| - }
|
| -
|
| - // Manually construct the result instead of using
|
| - // apibtle::GetCharacteristic::Result::Create as it doesn't convert lists of
|
| - // enums correctly.
|
| - SetResult(apibtle::CharacteristicToValue(&characteristic));
|
| - SendResponse(true);
|
| -
|
| - return true;
|
| -}
|
| -
|
| -bool BluetoothLowEnergyGetCharacteristicsFunction::DoWork() {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| -
|
| - BluetoothLowEnergyEventRouter* event_router =
|
| - GetEventRouter(browser_context());
|
| -
|
| - // The adapter must be initialized at this point, but return an error instead
|
| - // of asserting.
|
| - if (!event_router->HasAdapter()) {
|
| - SetError(kErrorAdapterNotInitialized);
|
| - SendResponse(false);
|
| - return false;
|
| - }
|
| -
|
| - std::unique_ptr<apibtle::GetCharacteristics::Params> params(
|
| - apibtle::GetCharacteristics::Params::Create(*args_));
|
| - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
|
| -
|
| - BluetoothLowEnergyEventRouter::CharacteristicList characteristic_list;
|
| - BluetoothLowEnergyEventRouter::Status status =
|
| - event_router->GetCharacteristics(
|
| - extension(), params->service_id, &characteristic_list);
|
| - if (status != BluetoothLowEnergyEventRouter::kStatusSuccess) {
|
| - SetError(StatusToString(status));
|
| - SendResponse(false);
|
| - return false;
|
| - }
|
| -
|
| - // Manually construct the result instead of using
|
| - // apibtle::GetCharacteristics::Result::Create as it doesn't convert lists of
|
| - // enums correctly.
|
| - std::unique_ptr<base::ListValue> result(new base::ListValue());
|
| - for (apibtle::Characteristic& characteristic : characteristic_list)
|
| - result->Append(apibtle::CharacteristicToValue(&characteristic));
|
| -
|
| - SetResult(std::move(result));
|
| - SendResponse(true);
|
| -
|
| - return true;
|
| -}
|
| -
|
| -bool BluetoothLowEnergyGetIncludedServicesFunction::DoWork() {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| -
|
| - BluetoothLowEnergyEventRouter* event_router =
|
| - GetEventRouter(browser_context());
|
| -
|
| - // The adapter must be initialized at this point, but return an error instead
|
| - // of asserting.
|
| - if (!event_router->HasAdapter()) {
|
| - SetError(kErrorAdapterNotInitialized);
|
| - SendResponse(false);
|
| - return false;
|
| - }
|
| -
|
| - std::unique_ptr<apibtle::GetIncludedServices::Params> params(
|
| - apibtle::GetIncludedServices::Params::Create(*args_));
|
| - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
|
| -
|
| - BluetoothLowEnergyEventRouter::ServiceList service_list;
|
| - BluetoothLowEnergyEventRouter::Status status =
|
| - event_router->GetIncludedServices(params->service_id, &service_list);
|
| - if (status != BluetoothLowEnergyEventRouter::kStatusSuccess) {
|
| - SetError(StatusToString(status));
|
| - SendResponse(false);
|
| - return false;
|
| - }
|
| -
|
| - results_ = apibtle::GetIncludedServices::Results::Create(service_list);
|
| - SendResponse(true);
|
| -
|
| - return true;
|
| -}
|
| -
|
| -bool BluetoothLowEnergyGetDescriptorFunction::DoWork() {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| -
|
| - BluetoothLowEnergyEventRouter* event_router =
|
| - GetEventRouter(browser_context());
|
| -
|
| - // The adapter must be initialized at this point, but return an error instead
|
| - // of asserting.
|
| - if (!event_router->HasAdapter()) {
|
| - SetError(kErrorAdapterNotInitialized);
|
| - SendResponse(false);
|
| - return false;
|
| - }
|
| -
|
| - std::unique_ptr<apibtle::GetDescriptor::Params> params(
|
| - apibtle::GetDescriptor::Params::Create(*args_));
|
| - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
|
| -
|
| - apibtle::Descriptor descriptor;
|
| - BluetoothLowEnergyEventRouter::Status status = event_router->GetDescriptor(
|
| - extension(), params->descriptor_id, &descriptor);
|
| - if (status != BluetoothLowEnergyEventRouter::kStatusSuccess) {
|
| - SetError(StatusToString(status));
|
| - SendResponse(false);
|
| - return false;
|
| - }
|
| -
|
| - // Manually construct the result instead of using
|
| - // apibtle::GetDescriptor::Result::Create as it doesn't convert lists of enums
|
| - // correctly.
|
| - SetResult(apibtle::DescriptorToValue(&descriptor));
|
| - SendResponse(true);
|
| -
|
| - return true;
|
| -}
|
| -
|
| -bool BluetoothLowEnergyGetDescriptorsFunction::DoWork() {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| -
|
| - BluetoothLowEnergyEventRouter* event_router =
|
| - GetEventRouter(browser_context());
|
| -
|
| - // The adapter must be initialized at this point, but return an error instead
|
| - // of asserting.
|
| - if (!event_router->HasAdapter()) {
|
| - SetError(kErrorAdapterNotInitialized);
|
| - SendResponse(false);
|
| - return false;
|
| - }
|
| -
|
| - std::unique_ptr<apibtle::GetDescriptors::Params> params(
|
| - apibtle::GetDescriptors::Params::Create(*args_));
|
| - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
|
| -
|
| - BluetoothLowEnergyEventRouter::DescriptorList descriptor_list;
|
| - BluetoothLowEnergyEventRouter::Status status = event_router->GetDescriptors(
|
| - extension(), params->characteristic_id, &descriptor_list);
|
| - if (status != BluetoothLowEnergyEventRouter::kStatusSuccess) {
|
| - SetError(StatusToString(status));
|
| - SendResponse(false);
|
| - return false;
|
| - }
|
| -
|
| - // Manually construct the result instead of using
|
| - // apibtle::GetDescriptors::Result::Create as it doesn't convert lists of
|
| - // enums correctly.
|
| - std::unique_ptr<base::ListValue> result(new base::ListValue());
|
| - for (apibtle::Descriptor& descriptor : descriptor_list)
|
| - result->Append(apibtle::DescriptorToValue(&descriptor));
|
| -
|
| - SetResult(std::move(result));
|
| - SendResponse(true);
|
| -
|
| - return true;
|
| -}
|
| -
|
| -bool BluetoothLowEnergyReadCharacteristicValueFunction::DoWork() {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| -
|
| - BluetoothLowEnergyEventRouter* event_router =
|
| - GetEventRouter(browser_context());
|
| -
|
| - // The adapter must be initialized at this point, but return an error instead
|
| - // of asserting.
|
| - if (!event_router->HasAdapter()) {
|
| - SetError(kErrorAdapterNotInitialized);
|
| - SendResponse(false);
|
| - return false;
|
| - }
|
| -
|
| - std::unique_ptr<apibtle::ReadCharacteristicValue::Params> params(
|
| - apibtle::ReadCharacteristicValue::Params::Create(*args_));
|
| - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
|
| -
|
| - instance_id_ = params->characteristic_id;
|
| - event_router->ReadCharacteristicValue(
|
| - extension(),
|
| - instance_id_,
|
| - base::Bind(
|
| - &BluetoothLowEnergyReadCharacteristicValueFunction::SuccessCallback,
|
| - this),
|
| - base::Bind(
|
| - &BluetoothLowEnergyReadCharacteristicValueFunction::ErrorCallback,
|
| - this));
|
| -
|
| - return true;
|
| -}
|
| -
|
| -void BluetoothLowEnergyReadCharacteristicValueFunction::SuccessCallback() {
|
| - // Obtain info on the characteristic and see whether or not the characteristic
|
| - // is still around.
|
| - apibtle::Characteristic characteristic;
|
| - BluetoothLowEnergyEventRouter::Status status =
|
| - GetEventRouter(browser_context())
|
| - ->GetCharacteristic(extension(), instance_id_, &characteristic);
|
| - if (status != BluetoothLowEnergyEventRouter::kStatusSuccess) {
|
| - SetError(StatusToString(status));
|
| - SendResponse(false);
|
| - return;
|
| - }
|
| -
|
| - // Manually construct the result instead of using
|
| - // apibtle::GetCharacteristic::Result::Create as it doesn't convert lists of
|
| - // enums correctly.
|
| - SetResult(apibtle::CharacteristicToValue(&characteristic));
|
| - SendResponse(true);
|
| -}
|
| -
|
| -void BluetoothLowEnergyReadCharacteristicValueFunction::ErrorCallback(
|
| - BluetoothLowEnergyEventRouter::Status status) {
|
| - SetError(StatusToString(status));
|
| - SendResponse(false);
|
| -}
|
| -
|
| -bool BluetoothLowEnergyWriteCharacteristicValueFunction::DoWork() {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| -
|
| - BluetoothLowEnergyEventRouter* event_router =
|
| - GetEventRouter(browser_context());
|
| -
|
| - // The adapter must be initialized at this point, but return an error instead
|
| - // of asserting.
|
| - if (!event_router->HasAdapter()) {
|
| - SetError(kErrorAdapterNotInitialized);
|
| - SendResponse(false);
|
| - return false;
|
| - }
|
| -
|
| - std::unique_ptr<apibtle::WriteCharacteristicValue::Params> params(
|
| - apibtle::WriteCharacteristicValue::Params::Create(*args_));
|
| - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
|
| -
|
| - std::vector<uint8_t> value(params->value.begin(), params->value.end());
|
| - event_router->WriteCharacteristicValue(
|
| - extension(),
|
| - params->characteristic_id,
|
| - value,
|
| - base::Bind(
|
| - &BluetoothLowEnergyWriteCharacteristicValueFunction::SuccessCallback,
|
| - this),
|
| - base::Bind(
|
| - &BluetoothLowEnergyWriteCharacteristicValueFunction::ErrorCallback,
|
| - this));
|
| -
|
| - return true;
|
| -}
|
| -
|
| -void BluetoothLowEnergyWriteCharacteristicValueFunction::SuccessCallback() {
|
| - results_ = apibtle::WriteCharacteristicValue::Results::Create();
|
| - SendResponse(true);
|
| -}
|
| -
|
| -void BluetoothLowEnergyWriteCharacteristicValueFunction::ErrorCallback(
|
| - BluetoothLowEnergyEventRouter::Status status) {
|
| - SetError(StatusToString(status));
|
| - SendResponse(false);
|
| -}
|
| -
|
| -bool BluetoothLowEnergyStartCharacteristicNotificationsFunction::DoWork() {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| -
|
| - BluetoothLowEnergyEventRouter* event_router =
|
| - GetEventRouter(browser_context());
|
| -
|
| - // The adapter must be initialized at this point, but return an error instead
|
| - // of asserting.
|
| - if (!event_router->HasAdapter()) {
|
| - SetError(kErrorAdapterNotInitialized);
|
| - SendResponse(false);
|
| - return false;
|
| - }
|
| -
|
| - std::unique_ptr<apibtle::StartCharacteristicNotifications::Params> params(
|
| - apibtle::StartCharacteristicNotifications::Params::Create(*args_));
|
| - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
|
| -
|
| - bool persistent = false; // Not persistent by default.
|
| - apibtle::NotificationProperties* properties = params->properties.get();
|
| - if (properties)
|
| - persistent = properties->persistent;
|
| -
|
| - event_router->StartCharacteristicNotifications(
|
| - persistent,
|
| - extension(),
|
| - params->characteristic_id,
|
| - base::Bind(&BluetoothLowEnergyStartCharacteristicNotificationsFunction::
|
| - SuccessCallback,
|
| - this),
|
| - base::Bind(&BluetoothLowEnergyStartCharacteristicNotificationsFunction::
|
| - ErrorCallback,
|
| - this));
|
| -
|
| - return true;
|
| -}
|
| -
|
| -void
|
| -BluetoothLowEnergyStartCharacteristicNotificationsFunction::SuccessCallback() {
|
| - SendResponse(true);
|
| -}
|
| -
|
| -void BluetoothLowEnergyStartCharacteristicNotificationsFunction::ErrorCallback(
|
| - BluetoothLowEnergyEventRouter::Status status) {
|
| - SetError(StatusToString(status));
|
| - SendResponse(false);
|
| -}
|
| -
|
| -bool BluetoothLowEnergyStopCharacteristicNotificationsFunction::DoWork() {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| -
|
| - BluetoothLowEnergyEventRouter* event_router =
|
| - GetEventRouter(browser_context());
|
| -
|
| - // The adapter must be initialized at this point, but return an error instead
|
| - // of asserting.
|
| - if (!event_router->HasAdapter()) {
|
| - SetError(kErrorAdapterNotInitialized);
|
| - SendResponse(false);
|
| - return false;
|
| - }
|
| -
|
| - std::unique_ptr<apibtle::StopCharacteristicNotifications::Params> params(
|
| - apibtle::StopCharacteristicNotifications::Params::Create(*args_));
|
| - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
|
| -
|
| - event_router->StopCharacteristicNotifications(
|
| - extension(),
|
| - params->characteristic_id,
|
| - base::Bind(&BluetoothLowEnergyStopCharacteristicNotificationsFunction::
|
| - SuccessCallback,
|
| - this),
|
| - base::Bind(&BluetoothLowEnergyStopCharacteristicNotificationsFunction::
|
| - ErrorCallback,
|
| - this));
|
| -
|
| - return true;
|
| -}
|
| -
|
| -void
|
| -BluetoothLowEnergyStopCharacteristicNotificationsFunction::SuccessCallback() {
|
| - SendResponse(true);
|
| -}
|
| -
|
| -void BluetoothLowEnergyStopCharacteristicNotificationsFunction::ErrorCallback(
|
| - BluetoothLowEnergyEventRouter::Status status) {
|
| - SetError(StatusToString(status));
|
| - SendResponse(false);
|
| -}
|
| -
|
| -bool BluetoothLowEnergyReadDescriptorValueFunction::DoWork() {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| -
|
| - BluetoothLowEnergyEventRouter* event_router =
|
| - GetEventRouter(browser_context());
|
| -
|
| - // The adapter must be initialized at this point, but return an error instead
|
| - // of asserting.
|
| - if (!event_router->HasAdapter()) {
|
| - SetError(kErrorAdapterNotInitialized);
|
| - SendResponse(false);
|
| - return false;
|
| - }
|
| -
|
| - std::unique_ptr<apibtle::ReadDescriptorValue::Params> params(
|
| - apibtle::ReadDescriptorValue::Params::Create(*args_));
|
| - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
|
| -
|
| - instance_id_ = params->descriptor_id;
|
| - event_router->ReadDescriptorValue(
|
| - extension(),
|
| - instance_id_,
|
| - base::Bind(
|
| - &BluetoothLowEnergyReadDescriptorValueFunction::SuccessCallback,
|
| - this),
|
| - base::Bind(&BluetoothLowEnergyReadDescriptorValueFunction::ErrorCallback,
|
| - this));
|
| -
|
| - return true;
|
| -}
|
| -
|
| -void BluetoothLowEnergyReadDescriptorValueFunction::SuccessCallback() {
|
| - // Obtain info on the descriptor and see whether or not the descriptor is
|
| - // still around.
|
| - apibtle::Descriptor descriptor;
|
| - BluetoothLowEnergyEventRouter::Status status =
|
| - GetEventRouter(browser_context())
|
| - ->GetDescriptor(extension(), instance_id_, &descriptor);
|
| - if (status != BluetoothLowEnergyEventRouter::kStatusSuccess) {
|
| - SetError(StatusToString(status));
|
| - SendResponse(false);
|
| - return;
|
| - }
|
| -
|
| - // Manually construct the result instead of using
|
| - // apibtle::GetDescriptor::Results::Create as it doesn't convert lists of
|
| - // enums correctly.
|
| - SetResult(apibtle::DescriptorToValue(&descriptor));
|
| - SendResponse(true);
|
| -}
|
| -
|
| -void BluetoothLowEnergyReadDescriptorValueFunction::ErrorCallback(
|
| - BluetoothLowEnergyEventRouter::Status status) {
|
| - SetError(StatusToString(status));
|
| - SendResponse(false);
|
| -}
|
| -
|
| -bool BluetoothLowEnergyWriteDescriptorValueFunction::DoWork() {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| -
|
| - BluetoothLowEnergyEventRouter* event_router =
|
| - GetEventRouter(browser_context());
|
| -
|
| - // The adapter must be initialized at this point, but return an error instead
|
| - // of asserting.
|
| - if (!event_router->HasAdapter()) {
|
| - SetError(kErrorAdapterNotInitialized);
|
| - SendResponse(false);
|
| - return false;
|
| - }
|
| -
|
| - std::unique_ptr<apibtle::WriteDescriptorValue::Params> params(
|
| - apibtle::WriteDescriptorValue::Params::Create(*args_));
|
| - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
|
| -
|
| - std::vector<uint8_t> value(params->value.begin(), params->value.end());
|
| - event_router->WriteDescriptorValue(
|
| - extension(),
|
| - params->descriptor_id,
|
| - value,
|
| - base::Bind(
|
| - &BluetoothLowEnergyWriteDescriptorValueFunction::SuccessCallback,
|
| - this),
|
| - base::Bind(&BluetoothLowEnergyWriteDescriptorValueFunction::ErrorCallback,
|
| - this));
|
| -
|
| - return true;
|
| -}
|
| -
|
| -void BluetoothLowEnergyWriteDescriptorValueFunction::SuccessCallback() {
|
| - results_ = apibtle::WriteDescriptorValue::Results::Create();
|
| - SendResponse(true);
|
| -}
|
| -
|
| -void BluetoothLowEnergyWriteDescriptorValueFunction::ErrorCallback(
|
| - BluetoothLowEnergyEventRouter::Status status) {
|
| - SetError(StatusToString(status));
|
| - SendResponse(false);
|
| -}
|
| -
|
| -BluetoothLowEnergyAdvertisementFunction::
|
| - BluetoothLowEnergyAdvertisementFunction()
|
| - : advertisements_manager_(nullptr) {
|
| -}
|
| -
|
| -BluetoothLowEnergyAdvertisementFunction::
|
| - ~BluetoothLowEnergyAdvertisementFunction() {
|
| -}
|
| -
|
| -int BluetoothLowEnergyAdvertisementFunction::AddAdvertisement(
|
| - BluetoothApiAdvertisement* advertisement) {
|
| - DCHECK(advertisements_manager_);
|
| - return advertisements_manager_->Add(advertisement);
|
| -}
|
| -
|
| -BluetoothApiAdvertisement*
|
| -BluetoothLowEnergyAdvertisementFunction::GetAdvertisement(
|
| - int advertisement_id) {
|
| - DCHECK(advertisements_manager_);
|
| - return advertisements_manager_->Get(extension_id(), advertisement_id);
|
| -}
|
| -
|
| -void BluetoothLowEnergyAdvertisementFunction::RemoveAdvertisement(
|
| - int advertisement_id) {
|
| - DCHECK(advertisements_manager_);
|
| - advertisements_manager_->Remove(extension_id(), advertisement_id);
|
| -}
|
| -
|
| -bool BluetoothLowEnergyAdvertisementFunction::RunAsync() {
|
| - Initialize();
|
| - return BluetoothLowEnergyExtensionFunctionDeprecated::RunAsync();
|
| -}
|
| -
|
| -void BluetoothLowEnergyAdvertisementFunction::Initialize() {
|
| - advertisements_manager_ =
|
| - ApiResourceManager<BluetoothApiAdvertisement>::Get(browser_context());
|
| -}
|
| -
|
| -// RegisterAdvertisement:
|
| -
|
| -bool BluetoothLowEnergyRegisterAdvertisementFunction::DoWork() {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| -
|
| - // Check permissions in manifest.
|
| - if (!BluetoothManifestData::CheckPeripheralPermitted(extension())) {
|
| - error_ = kErrorPermissionDenied;
|
| - SendResponse(false);
|
| - return false;
|
| - }
|
| -
|
| - // For this API to be available the app has to be either auto
|
| - // launched in Kiosk Mode or the enable-ble-advertisement-in-apps
|
| - // should be set.
|
| - if (!(IsAutoLaunchedKioskApp(extension()->id()) ||
|
| - IsPeripheralFlagEnabled())) {
|
| - error_ = kErrorPermissionDenied;
|
| - SendResponse(false);
|
| - return false;
|
| - }
|
| -
|
| - BluetoothLowEnergyEventRouter* event_router =
|
| - GetEventRouter(browser_context());
|
| -
|
| - // The adapter must be initialized at this point, but return an error instead
|
| - // of asserting.
|
| - if (!event_router->HasAdapter()) {
|
| - SetError(kErrorAdapterNotInitialized);
|
| - SendResponse(false);
|
| - return false;
|
| - }
|
| -
|
| - std::unique_ptr<apibtle::RegisterAdvertisement::Params> params(
|
| - apibtle::RegisterAdvertisement::Params::Create(*args_));
|
| - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
|
| -
|
| - std::unique_ptr<device::BluetoothAdvertisement::Data> advertisement_data(
|
| - new device::BluetoothAdvertisement::Data(
|
| - params->advertisement.type ==
|
| - apibtle::AdvertisementType::ADVERTISEMENT_TYPE_BROADCAST
|
| - ? device::BluetoothAdvertisement::AdvertisementType::
|
| - ADVERTISEMENT_TYPE_BROADCAST
|
| - : device::BluetoothAdvertisement::AdvertisementType::
|
| - ADVERTISEMENT_TYPE_PERIPHERAL));
|
| -
|
| - advertisement_data->set_service_uuids(
|
| - std::move(params->advertisement.service_uuids));
|
| - advertisement_data->set_solicit_uuids(
|
| - std::move(params->advertisement.solicit_uuids));
|
| - if (params->advertisement.manufacturer_data) {
|
| - advertisement_data->set_manufacturer_data(
|
| - CreateManufacturerData(params->advertisement.manufacturer_data.get()));
|
| - }
|
| - if (params->advertisement.service_data) {
|
| - advertisement_data->set_service_data(
|
| - CreateServiceData(params->advertisement.service_data.get()));
|
| - }
|
| -
|
| - event_router->adapter()->RegisterAdvertisement(
|
| - std::move(advertisement_data),
|
| - base::Bind(
|
| - &BluetoothLowEnergyRegisterAdvertisementFunction::SuccessCallback,
|
| - this),
|
| - base::Bind(
|
| - &BluetoothLowEnergyRegisterAdvertisementFunction::ErrorCallback,
|
| - this));
|
| -
|
| - return true;
|
| -}
|
| -
|
| -void BluetoothLowEnergyRegisterAdvertisementFunction::SuccessCallback(
|
| - scoped_refptr<device::BluetoothAdvertisement> advertisement) {
|
| - results_ = apibtle::RegisterAdvertisement::Results::Create(AddAdvertisement(
|
| - new BluetoothApiAdvertisement(extension_id(), advertisement)));
|
| - SendResponse(true);
|
| -}
|
| -
|
| -void BluetoothLowEnergyRegisterAdvertisementFunction::ErrorCallback(
|
| - device::BluetoothAdvertisement::ErrorCode status) {
|
| - switch (status) {
|
| - case device::BluetoothAdvertisement::ErrorCode::
|
| - ERROR_ADVERTISEMENT_ALREADY_EXISTS:
|
| - SetError(kStatusAdvertisementAlreadyExists);
|
| - break;
|
| - case device::BluetoothAdvertisement::ErrorCode::
|
| - ERROR_ADVERTISEMENT_INVALID_LENGTH:
|
| - SetError(kErrorInvalidAdvertisementLength);
|
| - break;
|
| - default:
|
| - SetError(kErrorOperationFailed);
|
| - }
|
| - SendResponse(false);
|
| -}
|
| -
|
| -// UnregisterAdvertisement:
|
| -
|
| -bool BluetoothLowEnergyUnregisterAdvertisementFunction::DoWork() {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| -
|
| - // Check permission in the manifest.
|
| - if (!BluetoothManifestData::CheckPeripheralPermitted(extension())) {
|
| - error_ = kErrorPermissionDenied;
|
| - SendResponse(false);
|
| - return false;
|
| - }
|
| -
|
| - // For this API to be available the app has to be either auto
|
| - // launched in Kiosk Mode or the enable-ble-advertisement-in-apps
|
| - // should be set.
|
| - if (!(IsAutoLaunchedKioskApp(extension()->id()) ||
|
| - IsPeripheralFlagEnabled())) {
|
| - error_ = kErrorPermissionDenied;
|
| - SendResponse(false);
|
| - return false;
|
| - }
|
| -
|
| - BluetoothLowEnergyEventRouter* event_router =
|
| - GetEventRouter(browser_context());
|
| -
|
| - // If we don't have an initialized adapter, unregistering is a no-op.
|
| - if (!event_router->HasAdapter())
|
| - return true;
|
| -
|
| - std::unique_ptr<apibtle::UnregisterAdvertisement::Params> params(
|
| - apibtle::UnregisterAdvertisement::Params::Create(*args_));
|
| - EXTENSION_FUNCTION_VALIDATE(params.get() != NULL);
|
| -
|
| - BluetoothApiAdvertisement* advertisement =
|
| - GetAdvertisement(params->advertisement_id);
|
| - if (!advertisement) {
|
| - error_ = kStatusAdvertisementDoesNotExist;
|
| - SendResponse(false);
|
| - return false;
|
| - }
|
| -
|
| - advertisement->advertisement()->Unregister(
|
| - base::Bind(
|
| - &BluetoothLowEnergyUnregisterAdvertisementFunction::SuccessCallback,
|
| - this, params->advertisement_id),
|
| - base::Bind(
|
| - &BluetoothLowEnergyUnregisterAdvertisementFunction::ErrorCallback,
|
| - this, params->advertisement_id));
|
| -
|
| - return true;
|
| -}
|
| -
|
| -void BluetoothLowEnergyUnregisterAdvertisementFunction::SuccessCallback(
|
| - int advertisement_id) {
|
| - RemoveAdvertisement(advertisement_id);
|
| - SendResponse(true);
|
| -}
|
| -
|
| -void BluetoothLowEnergyUnregisterAdvertisementFunction::ErrorCallback(
|
| - int advertisement_id,
|
| - device::BluetoothAdvertisement::ErrorCode status) {
|
| - RemoveAdvertisement(advertisement_id);
|
| - switch (status) {
|
| - case device::BluetoothAdvertisement::ErrorCode::
|
| - ERROR_ADVERTISEMENT_DOES_NOT_EXIST:
|
| - SetError(kStatusAdvertisementDoesNotExist);
|
| - break;
|
| - default:
|
| - SetError(kErrorOperationFailed);
|
| - }
|
| - SendResponse(false);
|
| -}
|
| -
|
| -// SetAdvertisingInterval:
|
| -
|
| -template class BLEPeripheralExtensionFunction<
|
| - apibtle::SetAdvertisingInterval::Params>;
|
| -
|
| -void BluetoothLowEnergySetAdvertisingIntervalFunction::DoWork() {
|
| -#if defined(OS_CHROMEOS) || defined(OS_LINUX)
|
| - BluetoothLowEnergyEventRouter* event_router =
|
| - GetEventRouter(browser_context());
|
| - event_router->adapter()->SetAdvertisingInterval(
|
| - base::TimeDelta::FromMilliseconds(params_->min_interval),
|
| - base::TimeDelta::FromMilliseconds(params_->max_interval),
|
| - base::Bind(
|
| - &BluetoothLowEnergySetAdvertisingIntervalFunction::SuccessCallback,
|
| - this),
|
| - base::Bind(
|
| - &BluetoothLowEnergySetAdvertisingIntervalFunction::ErrorCallback,
|
| - this));
|
| -#endif
|
| -}
|
| -
|
| -void BluetoothLowEnergySetAdvertisingIntervalFunction::SuccessCallback() {
|
| - Respond(NoArguments());
|
| -}
|
| -
|
| -void BluetoothLowEnergySetAdvertisingIntervalFunction::ErrorCallback(
|
| - device::BluetoothAdvertisement::ErrorCode status) {
|
| -#if defined(OS_CHROMEOS) || defined(OS_LINUX)
|
| - switch (status) {
|
| - case device::BluetoothAdvertisement::ErrorCode::
|
| - ERROR_INVALID_ADVERTISEMENT_INTERVAL:
|
| - Respond(Error(kStatusInvalidAdvertisingInterval));
|
| - break;
|
| - default:
|
| - Respond(Error(kErrorOperationFailed));
|
| - }
|
| -#endif
|
| -}
|
| -
|
| -// createService:
|
| -
|
| -template class BLEPeripheralExtensionFunction<apibtle::CreateService::Params>;
|
| -
|
| -void BluetoothLowEnergyCreateServiceFunction::DoWork() {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| -// Causes link error on Windows. API will never be on Windows, so #ifdefing.
|
| -// TODO: Ideally this should be handled by our feature system, so that this
|
| -// code doesn't even compile on OSes it isn't being used on, but currently this
|
| -// is not possible.
|
| -#if !defined(OS_WIN)
|
| - base::WeakPtr<device::BluetoothLocalGattService> service =
|
| - device::BluetoothLocalGattService::Create(
|
| - event_router_->adapter(),
|
| - device::BluetoothUUID(params_->service.uuid),
|
| - params_->service.is_primary, nullptr, event_router_);
|
| -
|
| - event_router_->AddServiceToApp(extension_id(), service->GetIdentifier());
|
| - Respond(ArgumentList(
|
| - apibtle::CreateService::Results::Create(service->GetIdentifier())));
|
| -#else
|
| - Respond(Error(kErrorPlatformNotSupported));
|
| -#endif
|
| -}
|
| -
|
| -// createCharacteristic:
|
| -
|
| -template class BLEPeripheralExtensionFunction<
|
| - apibtle::CreateCharacteristic::Params>;
|
| -
|
| -void BluetoothLowEnergyCreateCharacteristicFunction::DoWork() {
|
| - device::BluetoothLocalGattService* service =
|
| - event_router_->adapter()->GetGattService(params_->service_id);
|
| - if (!service) {
|
| - Respond(Error(kErrorInvalidServiceId));
|
| - return;
|
| - }
|
| -
|
| - base::WeakPtr<device::BluetoothLocalGattCharacteristic> characteristic =
|
| - device::BluetoothLocalGattCharacteristic::Create(
|
| - device::BluetoothUUID(params_->characteristic.uuid),
|
| - GetBluetoothProperties(params_->characteristic.properties),
|
| - device::BluetoothGattCharacteristic::Permissions(), service);
|
| -
|
| - // Keep a track of this characteristic so we can look it up later if a
|
| - // descriptor lists it as its parent.
|
| - event_router_->AddLocalCharacteristic(characteristic->GetIdentifier(),
|
| - service->GetIdentifier());
|
| -
|
| - Respond(ArgumentList(apibtle::CreateCharacteristic::Results::Create(
|
| - characteristic->GetIdentifier())));
|
| -}
|
| -
|
| -// createDescriptor:
|
| -
|
| -template class BLEPeripheralExtensionFunction<
|
| - apibtle::CreateDescriptor::Params>;
|
| -
|
| -void BluetoothLowEnergyCreateDescriptorFunction::DoWork() {
|
| - device::BluetoothLocalGattCharacteristic* characteristic =
|
| - event_router_->GetLocalCharacteristic(params_->characteristic_id);
|
| - if (!characteristic) {
|
| - Respond(Error(kErrorInvalidCharacteristicId));
|
| - return;
|
| - }
|
| -
|
| - base::WeakPtr<device::BluetoothLocalGattDescriptor> descriptor =
|
| - device::BluetoothLocalGattDescriptor::Create(
|
| - device::BluetoothUUID(params_->descriptor.uuid),
|
| - GetBluetoothPermissions(params_->descriptor.permissions),
|
| - characteristic);
|
| -
|
| - Respond(ArgumentList(
|
| - apibtle::CreateDescriptor::Results::Create(descriptor->GetIdentifier())));
|
| -}
|
| -
|
| -// registerService:
|
| -
|
| -template class BLEPeripheralExtensionFunction<apibtle::RegisterService::Params>;
|
| -
|
| -void BluetoothLowEnergyRegisterServiceFunction::DoWork() {
|
| - event_router_->RegisterGattService(
|
| - extension(), params_->service_id,
|
| - base::Bind(&BluetoothLowEnergyRegisterServiceFunction::SuccessCallback,
|
| - this),
|
| - base::Bind(&BluetoothLowEnergyRegisterServiceFunction::ErrorCallback,
|
| - this));
|
| -}
|
| -
|
| -void BluetoothLowEnergyRegisterServiceFunction::SuccessCallback() {
|
| - Respond(NoArguments());
|
| -}
|
| -
|
| -void BluetoothLowEnergyRegisterServiceFunction::ErrorCallback(
|
| - BluetoothLowEnergyEventRouter::Status status) {
|
| - Respond(Error(StatusToString(status)));
|
| -}
|
| -
|
| -// unregisterService:
|
| -
|
| -template class BLEPeripheralExtensionFunction<
|
| - apibtle::UnregisterService::Params>;
|
| -
|
| -void BluetoothLowEnergyUnregisterServiceFunction::DoWork() {
|
| - event_router_->UnregisterGattService(
|
| - extension(), params_->service_id,
|
| - base::Bind(&BluetoothLowEnergyUnregisterServiceFunction::SuccessCallback,
|
| - this),
|
| - base::Bind(&BluetoothLowEnergyUnregisterServiceFunction::ErrorCallback,
|
| - this));
|
| -}
|
| -
|
| -void BluetoothLowEnergyUnregisterServiceFunction::SuccessCallback() {
|
| - Respond(NoArguments());
|
| -}
|
| -
|
| -void BluetoothLowEnergyUnregisterServiceFunction::ErrorCallback(
|
| - BluetoothLowEnergyEventRouter::Status status) {
|
| - Respond(Error(StatusToString(status)));
|
| -}
|
| -
|
| -// notifyCharacteristicValueChanged:
|
| -
|
| -template class BLEPeripheralExtensionFunction<
|
| - apibtle::NotifyCharacteristicValueChanged::Params>;
|
| -
|
| -void BluetoothLowEnergyNotifyCharacteristicValueChangedFunction::DoWork() {
|
| - device::BluetoothLocalGattCharacteristic* characteristic =
|
| - event_router_->GetLocalCharacteristic(params_->characteristic_id);
|
| - if (!characteristic) {
|
| - Respond(Error(kErrorInvalidCharacteristicId));
|
| - return;
|
| - }
|
| - std::vector<uint8_t> uint8_vector;
|
| - uint8_vector.assign(params_->notification.value.begin(),
|
| - params_->notification.value.end());
|
| -
|
| - bool indicate = params_->notification.should_indicate.get()
|
| - ? *params_->notification.should_indicate
|
| - : false;
|
| - device::BluetoothLocalGattCharacteristic::NotificationStatus status =
|
| - characteristic->NotifyValueChanged(nullptr, uint8_vector, indicate);
|
| -
|
| - switch (status) {
|
| - case device::BluetoothLocalGattCharacteristic::NOTIFICATION_SUCCESS:
|
| - Respond(NoArguments());
|
| - break;
|
| - case device::BluetoothLocalGattCharacteristic::NOTIFY_PROPERTY_NOT_SET:
|
| - Respond(Error(kErrorNotifyPropertyNotSet));
|
| - break;
|
| - case device::BluetoothLocalGattCharacteristic::INDICATE_PROPERTY_NOT_SET:
|
| - Respond(Error(kErrorIndicatePropertyNotSet));
|
| - break;
|
| - case device::BluetoothLocalGattCharacteristic::SERVICE_NOT_REGISTERED:
|
| - Respond(Error(kErrorServiceNotRegistered));
|
| - break;
|
| - default:
|
| - LOG(ERROR) << "Unknown notification error!";
|
| - Respond(Error(kErrorUnknownNotificationError));
|
| - }
|
| -}
|
| -
|
| -// removeService:
|
| -
|
| -template class BLEPeripheralExtensionFunction<apibtle::RemoveService::Params>;
|
| -
|
| -void BluetoothLowEnergyRemoveServiceFunction::DoWork() {
|
| - device::BluetoothLocalGattService* service =
|
| - event_router_->adapter()->GetGattService(params_->service_id);
|
| - if (!service) {
|
| - Respond(Error(kErrorInvalidServiceId));
|
| - return;
|
| - }
|
| - event_router_->RemoveServiceFromApp(extension_id(), service->GetIdentifier());
|
| - service->Delete();
|
| - Respond(NoArguments());
|
| -}
|
| -
|
| -// sendRequestResponse:
|
| -
|
| -template class BLEPeripheralExtensionFunction<
|
| - apibtle::SendRequestResponse::Params>;
|
| -
|
| -void BluetoothLowEnergySendRequestResponseFunction::DoWork() {
|
| - std::vector<uint8_t> uint8_vector;
|
| - if (params_->response.value) {
|
| - uint8_vector.assign(params_->response.value->begin(),
|
| - params_->response.value->end());
|
| - }
|
| - event_router_->HandleRequestResponse(
|
| - extension(), params_->response.request_id, params_->response.is_error,
|
| - uint8_vector);
|
| - Respond(NoArguments());
|
| -}
|
| -
|
| -} // namespace api
|
| -} // namespace extensions
|
|
|