blob: 34da64bfaaa6af9b756f7bbeae597db0e676854c [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 CHROME_BROWSER_EXTENSIONS_API_BLUETOOTH_SOCKET_BLUETOOTH_SOCKET_API_H_
#define CHROME_BROWSER_EXTENSIONS_API_BLUETOOTH_SOCKET_BLUETOOTH_SOCKET_API_H_
#include <string>
#include "base/containers/hash_tables.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "chrome/browser/extensions/api/bluetooth_socket/bluetooth_api_socket.h"
#include "chrome/common/extensions/api/bluetooth_socket.h"
#include "device/bluetooth/bluetooth_adapter.h"
#include "extensions/browser/api/api_resource_manager.h"
#include "extensions/browser/api/async_api_function.h"
#include "extensions/browser/extension_function.h"
#include "extensions/browser/extension_function_histogram_value.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 AsyncExtensionFunction {
public:
BluetoothSocketAsyncApiFunction();
protected:
virtual ~BluetoothSocketAsyncApiFunction();
// AsyncExtensionFunction:
virtual bool RunAsync() OVERRIDE;
bool PrePrepare();
bool Respond();
void AsyncWorkCompleted();
virtual bool Prepare() = 0;
virtual void Work();
virtual void AsyncWorkStart();
content::BrowserThread::ID work_thread_id() const;
int AddSocket(BluetoothApiSocket* socket);
BluetoothApiSocket* GetSocket(int api_resource_id);
void RemoveSocket(int api_resource_id);
base::hash_set<int>* GetSocketIds();
private:
ApiResourceManager<BluetoothApiSocket>* manager_;
};
class BluetoothSocketCreateFunction : public BluetoothSocketAsyncApiFunction {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothSocket.create", BLUETOOTHSOCKET_CREATE);
BluetoothSocketCreateFunction();
protected:
virtual ~BluetoothSocketCreateFunction();
// BluetoothSocketAsyncApiFunction:
virtual bool Prepare() OVERRIDE;
virtual void Work() OVERRIDE;
private:
scoped_ptr<bluetooth_socket::Create::Params> params_;
};
class BluetoothSocketUpdateFunction : public BluetoothSocketAsyncApiFunction {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothSocket.update", BLUETOOTHSOCKET_UPDATE);
BluetoothSocketUpdateFunction();
protected:
virtual ~BluetoothSocketUpdateFunction();
// BluetoothSocketAsyncApiFunction:
virtual bool Prepare() OVERRIDE;
virtual void Work() OVERRIDE;
private:
scoped_ptr<bluetooth_socket::Update::Params> params_;
};
class BluetoothSocketSetPausedFunction
: public BluetoothSocketAsyncApiFunction {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothSocket.setPaused",
BLUETOOTHSOCKET_SETPAUSED);
BluetoothSocketSetPausedFunction();
protected:
virtual ~BluetoothSocketSetPausedFunction();
// BluetoothSocketAsyncApiFunction:
virtual bool Prepare() OVERRIDE;
virtual void Work() OVERRIDE;
private:
scoped_ptr<bluetooth_socket::SetPaused::Params> params_;
BluetoothSocketEventDispatcher* socket_event_dispatcher_;
};
class BluetoothSocketListenFunction : public BluetoothSocketAsyncApiFunction {
public:
BluetoothSocketListenFunction();
virtual bool CreateParams() = 0;
virtual void CreateService(
scoped_refptr<device::BluetoothAdapter> adapter,
const device::BluetoothUUID& uuid,
scoped_ptr<std::string> name,
const device::BluetoothAdapter::CreateServiceCallback& callback,
const device::BluetoothAdapter::CreateServiceErrorCallback&
error_callback) = 0;
virtual void CreateResults() = 0;
virtual int socket_id() const = 0;
virtual const std::string& uuid() const = 0;
// BluetoothSocketAsyncApiFunction:
virtual bool Prepare() OVERRIDE;
virtual void AsyncWorkStart() OVERRIDE;
protected:
virtual ~BluetoothSocketListenFunction();
virtual void OnGetAdapter(scoped_refptr<device::BluetoothAdapter> adapter);
virtual void OnCreateService(scoped_refptr<device::BluetoothSocket> socket);
virtual void OnCreateServiceError(const std::string& message);
BluetoothSocketEventDispatcher* socket_event_dispatcher_;
};
class BluetoothSocketListenUsingRfcommFunction
: public BluetoothSocketListenFunction {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothSocket.listenUsingRfcomm",
BLUETOOTHSOCKET_LISTENUSINGRFCOMM);
BluetoothSocketListenUsingRfcommFunction();
// BluetoothSocketListenFunction:
virtual int socket_id() const OVERRIDE;
virtual const std::string& uuid() const OVERRIDE;
virtual bool CreateParams() OVERRIDE;
virtual void CreateService(
scoped_refptr<device::BluetoothAdapter> adapter,
const device::BluetoothUUID& uuid,
scoped_ptr<std::string> name,
const device::BluetoothAdapter::CreateServiceCallback& callback,
const device::BluetoothAdapter::CreateServiceErrorCallback&
error_callback) OVERRIDE;
virtual void CreateResults() OVERRIDE;
protected:
virtual ~BluetoothSocketListenUsingRfcommFunction();
private:
scoped_ptr<bluetooth_socket::ListenUsingRfcomm::Params> params_;
};
class BluetoothSocketListenUsingL2capFunction
: public BluetoothSocketListenFunction {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothSocket.listenUsingL2cap",
BLUETOOTHSOCKET_LISTENUSINGL2CAP);
BluetoothSocketListenUsingL2capFunction();
// BluetoothSocketListenFunction:
virtual int socket_id() const OVERRIDE;
virtual const std::string& uuid() const OVERRIDE;
virtual bool CreateParams() OVERRIDE;
virtual void CreateService(
scoped_refptr<device::BluetoothAdapter> adapter,
const device::BluetoothUUID& uuid,
scoped_ptr<std::string> name,
const device::BluetoothAdapter::CreateServiceCallback& callback,
const device::BluetoothAdapter::CreateServiceErrorCallback&
error_callback) OVERRIDE;
virtual void CreateResults() OVERRIDE;
protected:
virtual ~BluetoothSocketListenUsingL2capFunction();
private:
scoped_ptr<bluetooth_socket::ListenUsingL2cap::Params> params_;
};
class BluetoothSocketAbstractConnectFunction :
public BluetoothSocketAsyncApiFunction {
public:
BluetoothSocketAbstractConnectFunction();
protected:
virtual ~BluetoothSocketAbstractConnectFunction();
// BluetoothSocketAsyncApiFunction:
virtual bool Prepare() OVERRIDE;
virtual void AsyncWorkStart() 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);
scoped_ptr<bluetooth_socket::Connect::Params> params_;
BluetoothSocketEventDispatcher* socket_event_dispatcher_;
};
class BluetoothSocketConnectFunction :
public BluetoothSocketAbstractConnectFunction {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothSocket.connect",
BLUETOOTHSOCKET_CONNECT);
BluetoothSocketConnectFunction();
protected:
virtual ~BluetoothSocketConnectFunction();
// BluetoothSocketAbstractConnectFunction:
virtual void ConnectToService(device::BluetoothDevice* device,
const device::BluetoothUUID& uuid) OVERRIDE;
};
class BluetoothSocketDisconnectFunction
: public BluetoothSocketAsyncApiFunction {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothSocket.disconnect",
BLUETOOTHSOCKET_DISCONNECT);
BluetoothSocketDisconnectFunction();
protected:
virtual ~BluetoothSocketDisconnectFunction();
// BluetoothSocketAsyncApiFunction:
virtual bool Prepare() OVERRIDE;
virtual void AsyncWorkStart() OVERRIDE;
private:
virtual void OnSuccess();
scoped_ptr<bluetooth_socket::Disconnect::Params> params_;
};
class BluetoothSocketCloseFunction : public BluetoothSocketAsyncApiFunction {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothSocket.close", BLUETOOTHSOCKET_CLOSE);
BluetoothSocketCloseFunction();
protected:
virtual ~BluetoothSocketCloseFunction();
// BluetoothSocketAsyncApiFunction:
virtual bool Prepare() OVERRIDE;
virtual void Work() OVERRIDE;
private:
scoped_ptr<bluetooth_socket::Close::Params> params_;
};
class BluetoothSocketSendFunction : public BluetoothSocketAsyncApiFunction {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothSocket.send", BLUETOOTHSOCKET_SEND);
BluetoothSocketSendFunction();
protected:
virtual ~BluetoothSocketSendFunction();
// BluetoothSocketAsyncApiFunction:
virtual bool Prepare() OVERRIDE;
virtual void AsyncWorkStart() OVERRIDE;
private:
void OnSuccess(int bytes_sent);
void OnError(BluetoothApiSocket::ErrorReason reason,
const std::string& message);
scoped_ptr<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();
protected:
virtual ~BluetoothSocketGetInfoFunction();
// BluetoothSocketAsyncApiFunction:
virtual bool Prepare() OVERRIDE;
virtual void Work() OVERRIDE;
private:
scoped_ptr<bluetooth_socket::GetInfo::Params> params_;
};
class BluetoothSocketGetSocketsFunction
: public BluetoothSocketAsyncApiFunction {
public:
DECLARE_EXTENSION_FUNCTION("bluetoothSocket.getSockets",
BLUETOOTHSOCKET_GETSOCKETS);
BluetoothSocketGetSocketsFunction();
protected:
virtual ~BluetoothSocketGetSocketsFunction();
// BluetoothSocketAsyncApiFunction:
virtual bool Prepare() OVERRIDE;
virtual void Work() OVERRIDE;
};
} // namespace api
} // namespace extensions
#endif // CHROME_BROWSER_EXTENSIONS_API_BLUETOOTH_SOCKET_BLUETOOTH_SOCKET_API_H_