1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "device/serial/serial_connection.h" 6 7#include "base/bind.h" 8#include "device/serial/buffer.h" 9#include "device/serial/data_sink_receiver.h" 10#include "device/serial/data_source_sender.h" 11#include "device/serial/serial_io_handler.h" 12 13namespace device { 14 15SerialConnection::SerialConnection( 16 scoped_refptr<SerialIoHandler> io_handler, 17 mojo::InterfaceRequest<serial::DataSink> sink, 18 mojo::InterfaceRequest<serial::DataSource> source) 19 : io_handler_(io_handler) { 20 receiver_ = mojo::WeakBindToRequest( 21 new DataSinkReceiver(base::Bind(&SerialConnection::OnSendPipeReady, 22 base::Unretained(this)), 23 base::Bind(&SerialConnection::OnSendCancelled, 24 base::Unretained(this)), 25 base::Bind(base::DoNothing)), 26 &sink); 27 sender_ = mojo::WeakBindToRequest( 28 new DataSourceSender(base::Bind(&SerialConnection::OnReceivePipeReady, 29 base::Unretained(this)), 30 base::Bind(base::DoNothing)), 31 &source); 32} 33 34SerialConnection::~SerialConnection() { 35 receiver_->ShutDown(); 36 sender_->ShutDown(); 37 io_handler_->CancelRead(serial::RECEIVE_ERROR_DISCONNECTED); 38 io_handler_->CancelWrite(serial::SEND_ERROR_DISCONNECTED); 39} 40 41void SerialConnection::GetInfo( 42 const mojo::Callback<void(serial::ConnectionInfoPtr)>& callback) { 43 callback.Run(io_handler_->GetPortInfo()); 44} 45 46void SerialConnection::SetOptions(serial::ConnectionOptionsPtr options, 47 const mojo::Callback<void(bool)>& callback) { 48 callback.Run(io_handler_->ConfigurePort(*options)); 49 io_handler_->CancelRead(device::serial::RECEIVE_ERROR_NONE); 50} 51 52void SerialConnection::SetControlSignals( 53 serial::HostControlSignalsPtr signals, 54 const mojo::Callback<void(bool)>& callback) { 55 callback.Run(io_handler_->SetControlSignals(*signals)); 56} 57 58void SerialConnection::GetControlSignals( 59 const mojo::Callback<void(serial::DeviceControlSignalsPtr)>& callback) { 60 callback.Run(io_handler_->GetControlSignals()); 61} 62 63void SerialConnection::Flush(const mojo::Callback<void(bool)>& callback) { 64 callback.Run(io_handler_->Flush()); 65} 66 67void SerialConnection::OnSendCancelled(int32_t error) { 68 io_handler_->CancelWrite(static_cast<serial::SendError>(error)); 69} 70 71void SerialConnection::OnSendPipeReady(scoped_ptr<ReadOnlyBuffer> buffer) { 72 io_handler_->Write(buffer.Pass()); 73} 74 75void SerialConnection::OnReceivePipeReady(scoped_ptr<WritableBuffer> buffer) { 76 io_handler_->Read(buffer.Pass()); 77} 78 79} // namespace device 80