blob: 8c157d8dd77c7d2af3dbae3eac65e681e85b109d [file] [log] [blame]
// Copyright 2014 The Chromium Authors
// 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_SOCKET_BLUETOOTH_SOCKET_API_H_
#define EXTENSIONS_BROWSER_API_BLUETOOTH_SOCKET_BLUETOOTH_SOCKET_API_H_
#include <stddef.h>
#include <optional>
#include <string>
#include <unordered_set>
#include <vector>
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/values.h"
#include "content/public/browser/browser_thread.h"
#include "device/bluetooth/bluetooth_adapter.h"
#include "extensions/browser/api/api_resource_manager.h"
#include "extensions/browser/api/bluetooth_socket/bluetooth_api_socket.h"
#include "extensions/browser/extension_function.h"
#include "extensions/browser/extension_function_histogram_value.h"
#include "extensions/common/api/bluetooth_socket.h"
namespace device {
class BluetoothSocket;
}
namespace net {
class IOBuffer;
}
namespace extensions {
namespace api {
class BluetoothSocketEventDispatcher;
// Asynchronous API function that performs its work on the BluetoothApiSocket
// thread while providing methods to manage resources of that class. This
// follows the pattern of AsyncApiFunction, but does not derive from it,
// because BluetoothApiSocket methods must be called on the UI Thread.
class BluetoothSocketAsyncApiFunction : public ExtensionFunction {
public:
BluetoothSocketAsyncApiFunction();
protected:
~BluetoothSocketAsyncApiFunction() override;
// ExtensionFunction:
bool PreRunValidation(std::string* error) override;
content::BrowserThread::ID work_thread_id() const;
int AddSocket(BluetoothApiSocket* socket);
BluetoothApiSocket* GetSocket(int api_resource_id);
void RemoveSocket(int api_resource_id);
std::unordered_set<int>* GetSocketIds();
private:
raw_ptr<ApiResourceManager<BluetoothApiSocket>> manager_;
};
class BluetoothSocketCreateFunction : public BluetoothSocketAsyncApiFunction {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothSocket.create", BLUETOOTHSOCKET_CREATE)
BluetoothSocketCreateFunction();
BluetoothSocketCreateFunction(const BluetoothSocketCreateFunction&) = delete;
BluetoothSocketCreateFunction& operator=(
const BluetoothSocketCreateFunction&) = delete;
protected:
~BluetoothSocketCreateFunction() override;
ResponseAction Run() override;
};
class BluetoothSocketUpdateFunction : public BluetoothSocketAsyncApiFunction {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothSocket.update", BLUETOOTHSOCKET_UPDATE)
BluetoothSocketUpdateFunction();
BluetoothSocketUpdateFunction(const BluetoothSocketUpdateFunction&) = delete;
BluetoothSocketUpdateFunction& operator=(
const BluetoothSocketUpdateFunction&) = delete;
protected:
~BluetoothSocketUpdateFunction() override;
// ExtensionFunction:
ResponseAction Run() override;
};
class BluetoothSocketSetPausedFunction
: public BluetoothSocketAsyncApiFunction {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothSocket.setPaused",
BLUETOOTHSOCKET_SETPAUSED)
BluetoothSocketSetPausedFunction();
BluetoothSocketSetPausedFunction(const BluetoothSocketSetPausedFunction&) =
delete;
BluetoothSocketSetPausedFunction& operator=(
const BluetoothSocketSetPausedFunction&) = delete;
protected:
~BluetoothSocketSetPausedFunction() override;
// ExtensionFunction:
ResponseAction Run() override;
};
class BluetoothSocketListenFunction : public BluetoothSocketAsyncApiFunction {
public:
BluetoothSocketListenFunction();
virtual bool CreateParams() = 0;
virtual void CreateService(
scoped_refptr<device::BluetoothAdapter> adapter,
const device::BluetoothUUID& uuid,
const std::optional<std::string>& name,
device::BluetoothAdapter::CreateServiceCallback callback,
device::BluetoothAdapter::CreateServiceErrorCallback error_callback) = 0;
virtual base::Value::List CreateResults() = 0;
virtual int socket_id() const = 0;
virtual const std::string& uuid() const = 0;
// ExtensionFunction:
ResponseAction Run() override;
bool PreRunValidation(std::string* error) override;
protected:
~BluetoothSocketListenFunction() override;
virtual void OnGetAdapter(scoped_refptr<device::BluetoothAdapter> adapter);
virtual void OnCreateService(scoped_refptr<device::BluetoothSocket> socket);
virtual void OnCreateServiceError(const std::string& message);
raw_ptr<BluetoothSocketEventDispatcher> socket_event_dispatcher_ = nullptr;
};
class BluetoothSocketListenUsingRfcommFunction
: public BluetoothSocketListenFunction {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothSocket.listenUsingRfcomm",
BLUETOOTHSOCKET_LISTENUSINGRFCOMM)
BluetoothSocketListenUsingRfcommFunction();
// BluetoothSocketListenFunction:
int socket_id() const override;
const std::string& uuid() const override;
bool CreateParams() override;
void CreateService(scoped_refptr<device::BluetoothAdapter> adapter,
const device::BluetoothUUID& uuid,
const std::optional<std::string>& name,
device::BluetoothAdapter::CreateServiceCallback callback,
device::BluetoothAdapter::CreateServiceErrorCallback
error_callback) override;
base::Value::List CreateResults() override;
protected:
~BluetoothSocketListenUsingRfcommFunction() override;
private:
std::optional<bluetooth_socket::ListenUsingRfcomm::Params> params_;
};
class BluetoothSocketListenUsingL2capFunction
: public BluetoothSocketListenFunction {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothSocket.listenUsingL2cap",
BLUETOOTHSOCKET_LISTENUSINGL2CAP)
BluetoothSocketListenUsingL2capFunction();
// BluetoothSocketListenFunction:
int socket_id() const override;
const std::string& uuid() const override;
bool CreateParams() override;
void CreateService(scoped_refptr<device::BluetoothAdapter> adapter,
const device::BluetoothUUID& uuid,
const std::optional<std::string>& name,
device::BluetoothAdapter::CreateServiceCallback callback,
device::BluetoothAdapter::CreateServiceErrorCallback
error_callback) override;
base::Value::List CreateResults() override;
protected:
~BluetoothSocketListenUsingL2capFunction() override;
private:
std::optional<bluetooth_socket::ListenUsingL2cap::Params> params_;
};
class BluetoothSocketAbstractConnectFunction :
public BluetoothSocketAsyncApiFunction {
public:
BluetoothSocketAbstractConnectFunction();
protected:
~BluetoothSocketAbstractConnectFunction() override;
// ExtensionFunction:
bool PreRunValidation(std::string* error) override;
ResponseAction Run() override;
// Subclasses should implement this method to connect to the service
// registered with `uuid` on the `device`.
virtual void ConnectToService(device::BluetoothDevice* device,
const device::BluetoothUUID& uuid) = 0;
virtual void OnConnect(scoped_refptr<device::BluetoothSocket> socket);
virtual void OnConnectError(const std::string& message);
private:
virtual void OnGetAdapter(scoped_refptr<device::BluetoothAdapter> adapter);
std::optional<bluetooth_socket::Connect::Params> params_;
raw_ptr<BluetoothSocketEventDispatcher> socket_event_dispatcher_ = nullptr;
};
class BluetoothSocketConnectFunction :
public BluetoothSocketAbstractConnectFunction {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothSocket.connect", BLUETOOTHSOCKET_CONNECT)
BluetoothSocketConnectFunction();
protected:
~BluetoothSocketConnectFunction() override;
// BluetoothSocketAbstractConnectFunction:
void ConnectToService(device::BluetoothDevice* device,
const device::BluetoothUUID& uuid) override;
};
class BluetoothSocketDisconnectFunction
: public BluetoothSocketAsyncApiFunction {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothSocket.disconnect",
BLUETOOTHSOCKET_DISCONNECT)
BluetoothSocketDisconnectFunction();
BluetoothSocketDisconnectFunction(const BluetoothSocketDisconnectFunction&) =
delete;
BluetoothSocketDisconnectFunction& operator=(
const BluetoothSocketDisconnectFunction&) = delete;
protected:
~BluetoothSocketDisconnectFunction() override;
// ExtensionFunction:
ResponseAction Run() override;
private:
virtual void OnSuccess();
};
class BluetoothSocketCloseFunction : public BluetoothSocketAsyncApiFunction {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothSocket.close", BLUETOOTHSOCKET_CLOSE)
BluetoothSocketCloseFunction();
BluetoothSocketCloseFunction(const BluetoothSocketCloseFunction&) = delete;
BluetoothSocketCloseFunction& operator=(const BluetoothSocketCloseFunction&) =
delete;
protected:
~BluetoothSocketCloseFunction() override;
// ExtensionFunction:
ResponseAction Run() override;
};
class BluetoothSocketSendFunction : public BluetoothSocketAsyncApiFunction {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothSocket.send", BLUETOOTHSOCKET_SEND)
BluetoothSocketSendFunction();
BluetoothSocketSendFunction(const BluetoothSocketSendFunction&) = delete;
BluetoothSocketSendFunction& operator=(const BluetoothSocketSendFunction&) =
delete;
protected:
~BluetoothSocketSendFunction() override;
// ExtensionFunction:
ResponseAction Run() override;
private:
void OnSuccess(int bytes_sent);
void OnError(BluetoothApiSocket::ErrorReason reason,
const std::string& message);
std::optional<bluetooth_socket::Send::Params> params_;
scoped_refptr<net::IOBuffer> io_buffer_;
size_t io_buffer_size_;
};
class BluetoothSocketGetInfoFunction : public BluetoothSocketAsyncApiFunction {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothSocket.getInfo", BLUETOOTHSOCKET_GETINFO)
BluetoothSocketGetInfoFunction();
BluetoothSocketGetInfoFunction(const BluetoothSocketGetInfoFunction&) =
delete;
BluetoothSocketGetInfoFunction& operator=(
const BluetoothSocketGetInfoFunction&) = delete;
protected:
~BluetoothSocketGetInfoFunction() override;
// ExtensionFunction:
ResponseAction Run() override;
};
class BluetoothSocketGetSocketsFunction
: public BluetoothSocketAsyncApiFunction {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothSocket.getSockets",
BLUETOOTHSOCKET_GETSOCKETS)
BluetoothSocketGetSocketsFunction();
protected:
~BluetoothSocketGetSocketsFunction() override;
// ExtensionFunction:
ResponseAction Run() override;
};
} // namespace api
} // namespace extensions
#endif // EXTENSIONS_BROWSER_API_BLUETOOTH_SOCKET_BLUETOOTH_SOCKET_API_H_