Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1223)

Unified Diff: chrome/browser/extensions/api/bluetooth_low_energy/bluetooth_low_energy_api.cc

Issue 2370373002: Move chrome.bluetoothLowEnergy out of //chrome. (Closed)
Patch Set: build fix Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698