blob: 1551c60f72131c2beacf01db8677a8bfa327bccd [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_SERIAL_SERIAL_API_H_
#define EXTENSIONS_BROWSER_API_SERIAL_SERIAL_API_H_
#include <memory>
#include <string>
#include <vector>
#include "extensions/browser/api/api_resource_manager.h"
#include "extensions/browser/api/async_api_function.h"
#include "extensions/common/api/serial.h"
#include "services/device/public/mojom/serial.mojom.h"
namespace extensions {
class SerialConnection;
namespace api {
class SerialPortManager;
class SerialAsyncApiFunction : public AsyncApiFunction {
public:
SerialAsyncApiFunction();
protected:
~SerialAsyncApiFunction() override;
// AsyncApiFunction:
bool PrePrepare() override;
bool Respond() override;
SerialConnection* GetSerialConnection(int api_resource_id);
void RemoveSerialConnection(int api_resource_id);
ApiResourceManager<SerialConnection>* manager_;
};
class SerialGetDevicesFunction : public ExtensionFunction {
public:
DECLARE_EXTENSION_FUNCTION("serial.getDevices", SERIAL_GETDEVICES)
SerialGetDevicesFunction();
protected:
~SerialGetDevicesFunction() override;
// ExtensionFunction:
ResponseAction Run() override;
private:
void OnGotDevices(std::vector<device::mojom::SerialPortInfoPtr> devices);
DISALLOW_COPY_AND_ASSIGN(SerialGetDevicesFunction);
};
class SerialConnectFunction : public SerialAsyncApiFunction {
public:
DECLARE_EXTENSION_FUNCTION("serial.connect", SERIAL_CONNECT)
SerialConnectFunction();
protected:
~SerialConnectFunction() override;
// AsyncApiFunction:
bool Prepare() override;
void AsyncWorkStart() override;
private:
void OnConnected(bool success);
void FinishConnect(bool connected,
bool got_complete_info,
std::unique_ptr<serial::ConnectionInfo> info);
std::unique_ptr<serial::Connect::Params> params_;
// SerialPortManager is owned by a BrowserContext.
SerialPortManager* serial_port_manager_;
// This connection is created within SerialConnectFunction.
// From there its ownership is transferred to the
// ApiResourceManager<SerialConnection> upon success.
std::unique_ptr<SerialConnection> connection_;
device::mojom::SerialPortPtrInfo serial_port_info_;
};
class SerialUpdateFunction : public SerialAsyncApiFunction {
public:
DECLARE_EXTENSION_FUNCTION("serial.update", SERIAL_UPDATE)
SerialUpdateFunction();
protected:
~SerialUpdateFunction() override;
// AsyncApiFunction:
bool Prepare() override;
void AsyncWorkStart() override;
private:
void OnUpdated(bool success);
std::unique_ptr<serial::Update::Params> params_;
};
class SerialDisconnectFunction : public SerialAsyncApiFunction {
public:
DECLARE_EXTENSION_FUNCTION("serial.disconnect", SERIAL_DISCONNECT)
SerialDisconnectFunction();
protected:
~SerialDisconnectFunction() override;
// AsyncApiFunction:
bool Prepare() override;
void AsyncWorkStart() override;
private:
void OnCloseComplete();
std::unique_ptr<serial::Disconnect::Params> params_;
};
class SerialSetPausedFunction : public SerialAsyncApiFunction {
public:
DECLARE_EXTENSION_FUNCTION("serial.setPaused", SERIAL_SETPAUSED)
SerialSetPausedFunction();
protected:
~SerialSetPausedFunction() override;
// AsyncApiFunction:
bool Prepare() override;
void Work() override;
private:
std::unique_ptr<serial::SetPaused::Params> params_;
SerialPortManager* serial_port_manager_;
};
class SerialGetInfoFunction : public SerialAsyncApiFunction {
public:
DECLARE_EXTENSION_FUNCTION("serial.getInfo", SERIAL_GETINFO)
SerialGetInfoFunction();
protected:
~SerialGetInfoFunction() override;
// AsyncApiFunction:
bool Prepare() override;
void AsyncWorkStart() override;
private:
void OnGotInfo(bool got_complete_info,
std::unique_ptr<serial::ConnectionInfo> info);
std::unique_ptr<serial::GetInfo::Params> params_;
};
class SerialGetConnectionsFunction : public SerialAsyncApiFunction {
public:
DECLARE_EXTENSION_FUNCTION("serial.getConnections", SERIAL_GETCONNECTIONS)
SerialGetConnectionsFunction();
protected:
~SerialGetConnectionsFunction() override;
// AsyncApiFunction:
bool Prepare() override;
void AsyncWorkStart() override;
private:
void OnGotOne(int connection_id,
bool got_complete_info,
std::unique_ptr<serial::ConnectionInfo> info);
void OnGotAll();
size_t count_ = 0;
std::vector<serial::ConnectionInfo> infos_;
};
class SerialSendFunction : public SerialAsyncApiFunction {
public:
DECLARE_EXTENSION_FUNCTION("serial.send", SERIAL_SEND)
SerialSendFunction();
protected:
~SerialSendFunction() override;
// AsyncApiFunction:
bool Prepare() override;
void AsyncWorkStart() override;
private:
void OnSendComplete(uint32_t bytes_sent, serial::SendError error);
std::unique_ptr<serial::Send::Params> params_;
};
class SerialFlushFunction : public SerialAsyncApiFunction {
public:
DECLARE_EXTENSION_FUNCTION("serial.flush", SERIAL_FLUSH)
SerialFlushFunction();
protected:
~SerialFlushFunction() override;
// AsyncApiFunction:
bool Prepare() override;
void AsyncWorkStart() override;
private:
void OnFlushed(bool success);
std::unique_ptr<serial::Flush::Params> params_;
};
class SerialGetControlSignalsFunction : public SerialAsyncApiFunction {
public:
DECLARE_EXTENSION_FUNCTION("serial.getControlSignals",
SERIAL_GETCONTROLSIGNALS)
SerialGetControlSignalsFunction();
protected:
~SerialGetControlSignalsFunction() override;
// AsyncApiFunction:
bool Prepare() override;
void AsyncWorkStart() override;
private:
void OnGotControlSignals(
std::unique_ptr<serial::DeviceControlSignals> signals);
std::unique_ptr<serial::GetControlSignals::Params> params_;
};
class SerialSetControlSignalsFunction : public SerialAsyncApiFunction {
public:
DECLARE_EXTENSION_FUNCTION("serial.setControlSignals",
SERIAL_SETCONTROLSIGNALS)
SerialSetControlSignalsFunction();
protected:
~SerialSetControlSignalsFunction() override;
// AsyncApiFunction:
bool Prepare() override;
void AsyncWorkStart() override;
private:
void OnSetControlSignals(bool success);
std::unique_ptr<serial::SetControlSignals::Params> params_;
};
class SerialSetBreakFunction : public SerialAsyncApiFunction {
public:
DECLARE_EXTENSION_FUNCTION("serial.setBreak", SERIAL_SETBREAK)
SerialSetBreakFunction();
protected:
~SerialSetBreakFunction() override;
// AsyncApiFunction:
bool Prepare() override;
void AsyncWorkStart() override;
private:
void OnSetBreak(bool success);
std::unique_ptr<serial::SetBreak::Params> params_;
};
class SerialClearBreakFunction : public SerialAsyncApiFunction {
public:
DECLARE_EXTENSION_FUNCTION("serial.clearBreak", SERIAL_CLEARBREAK)
SerialClearBreakFunction();
protected:
~SerialClearBreakFunction() override;
// AsyncApiFunction:
bool Prepare() override;
void AsyncWorkStart() override;
private:
void OnClearBreak(bool success);
std::unique_ptr<serial::ClearBreak::Params> params_;
};
} // namespace api
} // namespace extensions
namespace mojo {
template <>
struct TypeConverter<extensions::api::serial::DeviceInfo,
device::mojom::SerialPortInfoPtr> {
static extensions::api::serial::DeviceInfo Convert(
const device::mojom::SerialPortInfoPtr& input);
};
} // namespace mojo
#endif // EXTENSIONS_BROWSER_API_SERIAL_SERIAL_API_H_