blob: b56d3bfd055301432f683cc5b4a21905300b4e4c [file] [log] [blame]
// 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.
#ifndef EXTENSIONS_BROWSER_API_BLUETOOTH_LOW_ENERGY_BLUETOOTH_LOW_ENERGY_API_H_
#define EXTENSIONS_BROWSER_API_BLUETOOTH_LOW_ENERGY_BLUETOOTH_LOW_ENERGY_API_H_
#include <memory>
#include <string>
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "content/public/browser/browser_context.h"
#include "device/bluetooth/bluetooth_advertisement.h"
#include "extensions/browser/api/api_resource_manager.h"
#include "extensions/browser/api/bluetooth_low_energy/bluetooth_api_advertisement.h"
#include "extensions/browser/api/bluetooth_low_energy/bluetooth_low_energy_event_router.h"
#include "extensions/browser/browser_context_keyed_api_factory.h"
#include "extensions/browser/extension_function.h"
#include "extensions/browser/extension_function_histogram_value.h"
namespace extensions {
class BluetoothApiAdvertisement;
class BluetoothLowEnergyEventRouter;
namespace api {
namespace bluetooth_low_energy {
namespace CreateService {
struct Params;
}
namespace CreateCharacteristic {
struct Params;
}
namespace CreateDescriptor {
struct Params;
}
namespace RegisterService {
struct Params;
}
namespace UnregisterService {
struct Params;
}
namespace NotifyCharacteristicValueChanged {
struct Params;
}
namespace RemoveService {
struct Params;
}
namespace SendRequestResponse {
struct Params;
}
} // namespace bluetooth_low_energy
} // namespace api
// The profile-keyed service that manages the bluetoothLowEnergy extension API.
class BluetoothLowEnergyAPI : public BrowserContextKeyedAPI {
public:
static BrowserContextKeyedAPIFactory<BluetoothLowEnergyAPI>*
GetFactoryInstance();
// Convenience method to get the BluetoothLowEnergy API for a browser context.
static BluetoothLowEnergyAPI* Get(content::BrowserContext* context);
explicit BluetoothLowEnergyAPI(content::BrowserContext* context);
~BluetoothLowEnergyAPI() override;
// KeyedService implementation..
void Shutdown() override;
BluetoothLowEnergyEventRouter* event_router() const {
return event_router_.get();
}
// BrowserContextKeyedAPI implementation.
static const char* service_name() { return "BluetoothLowEnergyAPI"; }
static const bool kServiceRedirectedInIncognito = true;
static const bool kServiceIsNULLWhileTesting = true;
private:
friend class BrowserContextKeyedAPIFactory<BluetoothLowEnergyAPI>;
std::unique_ptr<BluetoothLowEnergyEventRouter> event_router_;
DISALLOW_COPY_AND_ASSIGN(BluetoothLowEnergyAPI);
};
namespace api {
// Base class for bluetoothLowEnergy API functions. This class handles some of
// the common logic involved in all API functions, such as checking for
// platform support and returning the correct error.
//
// DEPRECATED: This inherits from AsyncExtensionFunction, which we're trying to
// get rid of for various reasons. Please inherit from the
// BluetoothLowEnergyExtensionFunction class instead.
class BluetoothLowEnergyExtensionFunctionDeprecated
: public AsyncExtensionFunction {
public:
BluetoothLowEnergyExtensionFunctionDeprecated();
protected:
~BluetoothLowEnergyExtensionFunctionDeprecated() override;
// AsyncExtensionFunction override.
bool RunAsync() override;
// Implemented by individual bluetoothLowEnergy extension functions to perform
// the body of the function. This invoked asynchonously after RunAsync after
// the BluetoothLowEnergyEventRouter has obtained a handle on the
// BluetoothAdapter.
virtual bool DoWork() = 0;
private:
DISALLOW_COPY_AND_ASSIGN(BluetoothLowEnergyExtensionFunctionDeprecated);
};
// Replacement for BluetoothLowEnergyExtensionFunctionDeprecated. Has the same
// functionality except that instead of the SendResponse/return combo, we'll
// return our response with Respond().
class BluetoothLowEnergyExtensionFunction : public UIThreadExtensionFunction {
public:
BluetoothLowEnergyExtensionFunction();
protected:
~BluetoothLowEnergyExtensionFunction() override;
// ExtensionFunction override.
ResponseAction Run() override;
// Implemented by individual bluetoothLowEnergy extension functions to perform
// the body of the function. This invoked asynchonously after Run after
// the BluetoothLowEnergyEventRouter has obtained a handle on the
// BluetoothAdapter.
virtual void DoWork() = 0;
BluetoothLowEnergyEventRouter* event_router_;
private:
// Internal method to do common setup before actual DoWork is called.
void PreDoWork();
DISALLOW_COPY_AND_ASSIGN(BluetoothLowEnergyExtensionFunction);
};
// Base class for bluetoothLowEnergy API peripheral mode functions. This class
// handles some of the common logic involved in all API peripheral mode
// functions, such as checking for peripheral permissions and returning the
// correct error.
template <typename Params>
class BLEPeripheralExtensionFunction
: public BluetoothLowEnergyExtensionFunction {
public:
BLEPeripheralExtensionFunction();
protected:
~BLEPeripheralExtensionFunction() override;
// ExtensionFunction override.
ResponseAction Run() override;
// Causes link error on Windows. API will never be on Windows, so #ifdefing.
#if !defined(OS_WIN)
std::unique_ptr<Params> params_;
#else
Params* params_;
#endif
private:
DISALLOW_COPY_AND_ASSIGN(BLEPeripheralExtensionFunction);
};
class BluetoothLowEnergyConnectFunction
: public BluetoothLowEnergyExtensionFunctionDeprecated {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.connect",
BLUETOOTHLOWENERGY_CONNECT);
protected:
~BluetoothLowEnergyConnectFunction() override {}
// BluetoothLowEnergyExtensionFunctionDeprecated override.
bool DoWork() override;
private:
// Success and error callbacks, called by
// BluetoothLowEnergyEventRouter::Connect.
void SuccessCallback();
void ErrorCallback(BluetoothLowEnergyEventRouter::Status status);
};
class BluetoothLowEnergyDisconnectFunction
: public BluetoothLowEnergyExtensionFunctionDeprecated {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.disconnect",
BLUETOOTHLOWENERGY_DISCONNECT);
protected:
~BluetoothLowEnergyDisconnectFunction() override {}
// BluetoothLowEnergyExtensionFunctionDeprecated override.
bool DoWork() override;
private:
// Success and error callbacks, called by
// BluetoothLowEnergyEventRouter::Disconnect.
void SuccessCallback();
void ErrorCallback(BluetoothLowEnergyEventRouter::Status status);
};
class BluetoothLowEnergyGetServiceFunction
: public BluetoothLowEnergyExtensionFunctionDeprecated {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.getService",
BLUETOOTHLOWENERGY_GETSERVICE);
protected:
~BluetoothLowEnergyGetServiceFunction() override {}
// BluetoothLowEnergyExtensionFunctionDeprecated override.
bool DoWork() override;
};
class BluetoothLowEnergyGetServicesFunction
: public BluetoothLowEnergyExtensionFunctionDeprecated {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.getServices",
BLUETOOTHLOWENERGY_GETSERVICES);
protected:
~BluetoothLowEnergyGetServicesFunction() override {}
// BluetoothLowEnergyExtensionFunctionDeprecated override.
bool DoWork() override;
};
class BluetoothLowEnergyGetCharacteristicFunction
: public BluetoothLowEnergyExtensionFunctionDeprecated {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.getCharacteristic",
BLUETOOTHLOWENERGY_GETCHARACTERISTIC);
protected:
~BluetoothLowEnergyGetCharacteristicFunction() override {}
// BluetoothLowEnergyExtensionFunctionDeprecated override.
bool DoWork() override;
};
class BluetoothLowEnergyGetCharacteristicsFunction
: public BluetoothLowEnergyExtensionFunctionDeprecated {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.getCharacteristics",
BLUETOOTHLOWENERGY_GETCHARACTERISTICS);
protected:
~BluetoothLowEnergyGetCharacteristicsFunction() override {}
// BluetoothLowEnergyExtensionFunctionDeprecated override.
bool DoWork() override;
};
class BluetoothLowEnergyGetIncludedServicesFunction
: public BluetoothLowEnergyExtensionFunctionDeprecated {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.getIncludedServices",
BLUETOOTHLOWENERGY_GETINCLUDEDSERVICES);
protected:
~BluetoothLowEnergyGetIncludedServicesFunction() override {}
// BluetoothLowEnergyExtensionFunctionDeprecated override.
bool DoWork() override;
};
class BluetoothLowEnergyGetDescriptorFunction
: public BluetoothLowEnergyExtensionFunctionDeprecated {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.getDescriptor",
BLUETOOTHLOWENERGY_GETDESCRIPTOR);
protected:
~BluetoothLowEnergyGetDescriptorFunction() override {}
// BluetoothLowEnergyExtensionFunctionDeprecated override.
bool DoWork() override;
};
class BluetoothLowEnergyGetDescriptorsFunction
: public BluetoothLowEnergyExtensionFunctionDeprecated {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.getDescriptors",
BLUETOOTHLOWENERGY_GETDESCRIPTORS);
protected:
~BluetoothLowEnergyGetDescriptorsFunction() override {}
// BluetoothLowEnergyExtensionFunctionDeprecated override.
bool DoWork() override;
};
class BluetoothLowEnergyReadCharacteristicValueFunction
: public BluetoothLowEnergyExtensionFunctionDeprecated {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.readCharacteristicValue",
BLUETOOTHLOWENERGY_READCHARACTERISTICVALUE);
protected:
~BluetoothLowEnergyReadCharacteristicValueFunction() override {}
// BluetoothLowEnergyExtensionFunctionDeprecated override.
bool DoWork() override;
private:
// Success and error callbacks, called by
// BluetoothLowEnergyEventRouter::ReadCharacteristicValue.
void SuccessCallback();
void ErrorCallback(BluetoothLowEnergyEventRouter::Status status);
// The instance ID of the requested characteristic.
std::string instance_id_;
};
class BluetoothLowEnergyWriteCharacteristicValueFunction
: public BluetoothLowEnergyExtensionFunctionDeprecated {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.writeCharacteristicValue",
BLUETOOTHLOWENERGY_WRITECHARACTERISTICVALUE);
protected:
~BluetoothLowEnergyWriteCharacteristicValueFunction() override {}
// BluetoothLowEnergyExtensionFunctionDeprecated override.
bool DoWork() override;
private:
// Success and error callbacks, called by
// BluetoothLowEnergyEventRouter::WriteCharacteristicValue.
void SuccessCallback();
void ErrorCallback(BluetoothLowEnergyEventRouter::Status status);
// The instance ID of the requested characteristic.
std::string instance_id_;
};
class BluetoothLowEnergyStartCharacteristicNotificationsFunction
: public BluetoothLowEnergyExtensionFunctionDeprecated {
public:
DECLARE_EXTENSION_FUNCTION(
"bluetoothLowEnergy.startCharacteristicNotifications",
BLUETOOTHLOWENERGY_STARTCHARACTERISTICNOTIFICATIONS);
protected:
~BluetoothLowEnergyStartCharacteristicNotificationsFunction() override {}
// BluetoothLowEnergyExtensionFunctionDeprecated override.
bool DoWork() override;
private:
// Success and error callbacks, called by
// BluetoothLowEnergyEventRouter::StartCharacteristicNotifications.
void SuccessCallback();
void ErrorCallback(BluetoothLowEnergyEventRouter::Status status);
};
class BluetoothLowEnergyStopCharacteristicNotificationsFunction
: public BluetoothLowEnergyExtensionFunctionDeprecated {
public:
DECLARE_EXTENSION_FUNCTION(
"bluetoothLowEnergy.stopCharacteristicNotifications",
BLUETOOTHLOWENERGY_STOPCHARACTERISTICNOTIFICATIONS);
protected:
~BluetoothLowEnergyStopCharacteristicNotificationsFunction() override {}
// BluetoothLowEnergyExtensionFunctionDeprecated override.
bool DoWork() override;
private:
// Success and error callbacks, called by
// BluetoothLowEnergyEventRouter::StopCharacteristicNotifications.
void SuccessCallback();
void ErrorCallback(BluetoothLowEnergyEventRouter::Status status);
};
class BluetoothLowEnergyReadDescriptorValueFunction
: public BluetoothLowEnergyExtensionFunctionDeprecated {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.readDescriptorValue",
BLUETOOTHLOWENERGY_READDESCRIPTORVALUE);
protected:
~BluetoothLowEnergyReadDescriptorValueFunction() override {}
// BluetoothLowEnergyExtensionFunctionDeprecated override.
bool DoWork() override;
private:
// Success and error callbacks, called by
// BluetoothLowEnergyEventRouter::ReadDescriptorValue.
void SuccessCallback();
void ErrorCallback(BluetoothLowEnergyEventRouter::Status status);
// The instance ID of the requested descriptor.
std::string instance_id_;
};
class BluetoothLowEnergyWriteDescriptorValueFunction
: public BluetoothLowEnergyExtensionFunctionDeprecated {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.writeDescriptorValue",
BLUETOOTHLOWENERGY_WRITEDESCRIPTORVALUE);
protected:
~BluetoothLowEnergyWriteDescriptorValueFunction() override {}
// BluetoothLowEnergyExtensionFunctionDeprecated override.
bool DoWork() override;
private:
// Success and error callbacks, called by
// BluetoothLowEnergyEventRouter::WriteDescriptorValue.
void SuccessCallback();
void ErrorCallback(BluetoothLowEnergyEventRouter::Status status);
// The instance ID of the requested descriptor.
std::string instance_id_;
};
class BluetoothLowEnergyAdvertisementFunction
: public BluetoothLowEnergyExtensionFunctionDeprecated {
public:
BluetoothLowEnergyAdvertisementFunction();
protected:
~BluetoothLowEnergyAdvertisementFunction() override;
// Takes ownership.
int AddAdvertisement(BluetoothApiAdvertisement* advertisement);
BluetoothApiAdvertisement* GetAdvertisement(int advertisement_id);
void RemoveAdvertisement(int advertisement_id);
// ExtensionFunction override.
bool RunAsync() override;
private:
void Initialize();
ApiResourceManager<BluetoothApiAdvertisement>* advertisements_manager_;
DISALLOW_COPY_AND_ASSIGN(BluetoothLowEnergyAdvertisementFunction);
};
class BluetoothLowEnergyRegisterAdvertisementFunction
: public BluetoothLowEnergyAdvertisementFunction {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.registerAdvertisement",
BLUETOOTHLOWENERGY_REGISTERADVERTISEMENT);
protected:
~BluetoothLowEnergyRegisterAdvertisementFunction() override {}
// BluetoothLowEnergyExtensionFunctionDeprecated override.
bool DoWork() override;
private:
void SuccessCallback(scoped_refptr<device::BluetoothAdvertisement>);
void ErrorCallback(device::BluetoothAdvertisement::ErrorCode status);
};
class BluetoothLowEnergyUnregisterAdvertisementFunction
: public BluetoothLowEnergyAdvertisementFunction {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.unregisterAdvertisement",
BLUETOOTHLOWENERGY_UNREGISTERADVERTISEMENT);
protected:
~BluetoothLowEnergyUnregisterAdvertisementFunction() override {}
// BluetoothLowEnergyExtensionFunctionDeprecated override.
bool DoWork() override;
private:
void SuccessCallback(int advertisement_id);
void ErrorCallback(int advertisement_id,
device::BluetoothAdvertisement::ErrorCode status);
};
class BluetoothLowEnergySetAdvertisingIntervalFunction
: public BLEPeripheralExtensionFunction<
extensions::api::bluetooth_low_energy::SetAdvertisingInterval::
Params> {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.setAdvertisingInterval",
BLUETOOTHLOWENERGY_SETADVERTISINGINTERVAL);
protected:
~BluetoothLowEnergySetAdvertisingIntervalFunction() override {}
// BluetoothLowEnergyExtensionFunctionDeprecated override.
void DoWork() override;
private:
void SuccessCallback();
void ErrorCallback(device::BluetoothAdvertisement::ErrorCode status);
};
class BluetoothLowEnergyCreateServiceFunction
: public BLEPeripheralExtensionFunction<
extensions::api::bluetooth_low_energy::CreateService::Params> {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.createService",
BLUETOOTHLOWENERGY_CREATESERVICE);
protected:
~BluetoothLowEnergyCreateServiceFunction() override {}
// BluetoothLowEnergyPeripheralExtensionFunction override.
void DoWork() override;
};
class BluetoothLowEnergyCreateCharacteristicFunction
: public BLEPeripheralExtensionFunction<
extensions::api::bluetooth_low_energy::CreateCharacteristic::Params> {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.createCharacteristic",
BLUETOOTHLOWENERGY_CREATECHARACTERISTIC);
protected:
~BluetoothLowEnergyCreateCharacteristicFunction() override {}
// BluetoothLowEnergyPeripheralExtensionFunction override.
void DoWork() override;
};
class BluetoothLowEnergyNotifyCharacteristicValueChangedFunction
: public BLEPeripheralExtensionFunction<
extensions::api::bluetooth_low_energy::
NotifyCharacteristicValueChanged::Params> {
public:
DECLARE_EXTENSION_FUNCTION(
"bluetoothLowEnergy.notifyCharacteristicValueChanged",
BLUETOOTHLOWENERGY_NOTIFYCHARACTERISTICVALUECHANGED);
protected:
~BluetoothLowEnergyNotifyCharacteristicValueChangedFunction() override {}
// BluetoothLowEnergyPeripheralExtensionFunction override.
void DoWork() override;
};
class BluetoothLowEnergyCreateDescriptorFunction
: public BLEPeripheralExtensionFunction<
extensions::api::bluetooth_low_energy::CreateDescriptor::Params> {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.createDescriptor",
BLUETOOTHLOWENERGY_CREATEDESCRIPTOR);
protected:
~BluetoothLowEnergyCreateDescriptorFunction() override {}
// BluetoothLowEnergyPeripheralExtensionFunction override.
void DoWork() override;
};
class BluetoothLowEnergyRegisterServiceFunction
: public BLEPeripheralExtensionFunction<
extensions::api::bluetooth_low_energy::RegisterService::Params> {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.registerService",
BLUETOOTHLOWENERGY_REGISTERSERVICE);
protected:
~BluetoothLowEnergyRegisterServiceFunction() override {}
// BluetoothLowEnergyPeripheralExtensionFunction override.
void DoWork() override;
private:
void SuccessCallback();
void ErrorCallback(BluetoothLowEnergyEventRouter::Status status);
};
class BluetoothLowEnergyUnregisterServiceFunction
: public BLEPeripheralExtensionFunction<
extensions::api::bluetooth_low_energy::UnregisterService::Params> {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.unregisterService",
BLUETOOTHLOWENERGY_UNREGISTERSERVICE);
protected:
~BluetoothLowEnergyUnregisterServiceFunction() override {}
// BluetoothLowEnergyPeripheralExtensionFunction override.
void DoWork() override;
private:
// Success and error callbacks, called by
// BluetoothLowEnergyEventRouter::RegisterService.
void SuccessCallback();
void ErrorCallback(BluetoothLowEnergyEventRouter::Status status);
};
class BluetoothLowEnergyRemoveServiceFunction
: public BLEPeripheralExtensionFunction<
extensions::api::bluetooth_low_energy::RemoveService::Params> {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.removeService",
BLUETOOTHLOWENERGY_REMOVESERVICE);
protected:
~BluetoothLowEnergyRemoveServiceFunction() override {}
// BluetoothLowEnergyPeripheralExtensionFunction override.
void DoWork() override;
};
class BluetoothLowEnergySendRequestResponseFunction
: public BLEPeripheralExtensionFunction<
extensions::api::bluetooth_low_energy::SendRequestResponse::Params> {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothLowEnergy.sendRequestResponse",
BLUETOOTHLOWENERGY_SENDREQUESTRESPONSE);
protected:
~BluetoothLowEnergySendRequestResponseFunction() override {}
// BluetoothLowEnergyPeripheralExtensionFunction override.
void DoWork() override;
};
} // namespace api
} // namespace extensions
#endif // EXTENSIONS_BROWSER_API_BLUETOOTH_LOW_ENERGY_BLUETOOTH_LOW_ENERGY_API_H_