Index: device/serial/serial_connection.cc |
diff --git a/device/serial/serial_connection.cc b/device/serial/serial_connection.cc |
index c59aad205f5e223fd26731d099e99cc79d766df9..0d3e4171c84b64a74c2f9807322448548ecff5bd 100644 |
--- a/device/serial/serial_connection.cc |
+++ b/device/serial/serial_connection.cc |
@@ -4,15 +4,38 @@ |
#include "device/serial/serial_connection.h" |
+#include "base/bind.h" |
+#include "device/serial/buffer.h" |
+#include "device/serial/data_sink_receiver.h" |
+#include "device/serial/data_source_sender.h" |
#include "device/serial/serial_io_handler.h" |
namespace device { |
-SerialConnection::SerialConnection(scoped_refptr<SerialIoHandler> io_handler) |
+SerialConnection::SerialConnection( |
+ scoped_refptr<SerialIoHandler> io_handler, |
+ mojo::InterfaceRequest<serial::DataSink> sink, |
+ mojo::InterfaceRequest<serial::DataSource> source) |
: io_handler_(io_handler) { |
+ receiver_ = mojo::WeakBindToRequest( |
+ new DataSinkReceiver(base::Bind(&SerialConnection::OnSendPipeReady, |
+ base::Unretained(this)), |
+ base::Bind(&SerialConnection::OnSendCancelled, |
+ base::Unretained(this)), |
+ base::Bind(base::DoNothing)), |
+ &sink); |
+ sender_ = mojo::WeakBindToRequest( |
+ new DataSourceSender(base::Bind(&SerialConnection::OnReceivePipeReady, |
+ base::Unretained(this)), |
+ base::Bind(base::DoNothing)), |
+ &source); |
} |
SerialConnection::~SerialConnection() { |
+ receiver_->ShutDown(); |
+ sender_->ShutDown(); |
+ io_handler_->CancelRead(serial::RECEIVE_ERROR_DISCONNECTED); |
+ io_handler_->CancelWrite(serial::SEND_ERROR_DISCONNECTED); |
} |
void SerialConnection::GetInfo( |
@@ -41,4 +64,16 @@ void SerialConnection::Flush(const mojo::Callback<void(bool)>& callback) { |
callback.Run(io_handler_->Flush()); |
} |
+void SerialConnection::OnSendCancelled(int32_t error) { |
+ io_handler_->CancelWrite(static_cast<serial::SendError>(error)); |
+} |
+ |
+void SerialConnection::OnSendPipeReady(scoped_ptr<ReadOnlyBuffer> buffer) { |
+ io_handler_->Write(buffer.Pass()); |
+} |
+ |
+void SerialConnection::OnReceivePipeReady(scoped_ptr<WritableBuffer> buffer) { |
+ io_handler_->Read(buffer.Pass()); |
+} |
+ |
} // namespace device |