blob: fd971dbba969ef7b41ee8ca0a3c96fa65194c931 [file] [log] [blame]
// Copyright 2017 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 "services/device/serial/serial_port_impl.h"
#include "base/single_thread_task_runner.h"
#include "base/task/post_task.h"
#include "device/serial/buffer.h"
#include "mojo/public/cpp/bindings/strong_binding.h"
namespace device {
// static
void SerialPortImpl::Create(
const std::string& path,
mojom::SerialPortRequest request,
scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) {
mojo::MakeStrongBinding(
std::make_unique<SerialPortImpl>(path, ui_task_runner),
std::move(request));
}
SerialPortImpl::SerialPortImpl(
const std::string& path,
scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner)
: path_(path),
io_handler_(device::SerialIoHandler::Create(ui_task_runner)) {}
SerialPortImpl::~SerialPortImpl() = default;
void SerialPortImpl::Open(mojom::SerialConnectionOptionsPtr options,
OpenCallback callback) {
io_handler_->Open(path_, *options, std::move(callback));
}
void SerialPortImpl::Read(uint32_t bytes, ReadCallback callback) {
auto buffer = base::MakeRefCounted<net::IOBuffer>(static_cast<size_t>(bytes));
io_handler_->Read(std::make_unique<ReceiveBuffer>(
buffer, bytes,
base::BindOnce(
[](ReadCallback callback, scoped_refptr<net::IOBuffer> buffer,
int bytes_read, mojom::SerialReceiveError error) {
std::move(callback).Run(
std::vector<uint8_t>(buffer->data(),
buffer->data() + bytes_read),
error);
},
std::move(callback), buffer)));
}
void SerialPortImpl::Write(const std::vector<uint8_t>& data,
WriteCallback callback) {
io_handler_->Write(std::make_unique<SendBuffer>(
data, base::BindOnce(
[](WriteCallback callback, int bytes_sent,
mojom::SerialSendError error) {
std::move(callback).Run(bytes_sent, error);
},
std::move(callback))));
}
void SerialPortImpl::CancelRead(mojom::SerialReceiveError reason) {
io_handler_->CancelRead(reason);
}
void SerialPortImpl::CancelWrite(mojom::SerialSendError reason) {
io_handler_->CancelWrite(reason);
}
void SerialPortImpl::Flush(FlushCallback callback) {
std::move(callback).Run(io_handler_->Flush());
}
void SerialPortImpl::GetControlSignals(GetControlSignalsCallback callback) {
std::move(callback).Run(io_handler_->GetControlSignals());
}
void SerialPortImpl::SetControlSignals(
mojom::SerialHostControlSignalsPtr signals,
SetControlSignalsCallback callback) {
std::move(callback).Run(io_handler_->SetControlSignals(*signals));
}
void SerialPortImpl::ConfigurePort(mojom::SerialConnectionOptionsPtr options,
ConfigurePortCallback callback) {
std::move(callback).Run(io_handler_->ConfigurePort(*options));
}
void SerialPortImpl::GetPortInfo(GetPortInfoCallback callback) {
std::move(callback).Run(io_handler_->GetPortInfo());
}
void SerialPortImpl::SetBreak(SetBreakCallback callback) {
std::move(callback).Run(io_handler_->SetBreak());
}
void SerialPortImpl::ClearBreak(ClearBreakCallback callback) {
std::move(callback).Run(io_handler_->ClearBreak());
}
} // namespace device