Index: extensions/browser/api/serial/serial_connection.cc |
diff --git a/extensions/browser/api/serial/serial_connection.cc b/extensions/browser/api/serial/serial_connection.cc |
index 3653597affea6a179cf88cde4361e6b4fe69f965..a81def2b3f7f3ccfaf717d133209764aa77e777c 100644 |
--- a/extensions/browser/api/serial/serial_connection.cc |
+++ b/extensions/browser/api/serial/serial_connection.cc |
@@ -133,6 +133,53 @@ device::serial::StopBits ConvertStopBitsToMojo( |
return device::serial::STOP_BITS_NONE; |
} |
+class SendBuffer : public device::ReadOnlyBuffer { |
+ public: |
+ SendBuffer( |
+ const std::string& data, |
+ const base::Callback<void(int, device::serial::SendError)>& callback) |
+ : data_(data), callback_(callback) {} |
+ virtual ~SendBuffer() {} |
+ virtual const char* GetData() OVERRIDE { return data_.c_str(); } |
+ virtual uint32_t GetSize() OVERRIDE { |
+ return static_cast<uint32_t>(data_.size()); |
+ } |
+ virtual void Done(uint32_t bytes_read) OVERRIDE { |
+ callback_.Run(bytes_read, device::serial::SEND_ERROR_NONE); |
+ } |
+ virtual void DoneWithError(uint32_t bytes_read, int32_t error) OVERRIDE { |
+ callback_.Run(bytes_read, static_cast<device::serial::SendError>(error)); |
+ } |
+ |
+ private: |
+ const std::string data_; |
+ const base::Callback<void(int, device::serial::SendError)> callback_; |
+}; |
+ |
+class ReceiveBuffer : public device::WritableBuffer { |
+ public: |
+ ReceiveBuffer( |
+ scoped_refptr<net::IOBuffer> buffer, |
+ uint32_t size, |
+ const base::Callback<void(int, device::serial::ReceiveError)>& callback) |
+ : buffer_(buffer), size_(size), callback_(callback) {} |
+ virtual ~ReceiveBuffer() {} |
+ virtual char* GetData() OVERRIDE { return buffer_->data(); } |
+ virtual uint32_t GetSize() OVERRIDE { return size_; } |
+ virtual void Done(uint32_t bytes_written) OVERRIDE { |
+ callback_.Run(bytes_written, device::serial::RECEIVE_ERROR_NONE); |
+ } |
+ virtual void DoneWithError(uint32_t bytes_written, int32_t error) OVERRIDE { |
+ callback_.Run(bytes_written, |
+ static_cast<device::serial::ReceiveError>(error)); |
+ } |
+ |
+ private: |
+ scoped_refptr<net::IOBuffer> buffer_; |
+ const uint32_t size_; |
+ const base::Callback<void(int, device::serial::ReceiveError)> callback_; |
+}; |
+ |
} // namespace |
static base::LazyInstance< |
@@ -159,9 +206,6 @@ SerialConnection::SerialConnection(const std::string& port, |
content::BrowserThread::GetMessageLoopProxyForThread( |
content::BrowserThread::FILE))) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- io_handler_->Initialize( |
- base::Bind(&SerialConnection::OnAsyncReadComplete, AsWeakPtr()), |
- base::Bind(&SerialConnection::OnAsyncWriteComplete, AsWeakPtr())); |
} |
SerialConnection::~SerialConnection() { |
@@ -202,7 +246,11 @@ bool SerialConnection::Receive(const ReceiveCompleteCallback& callback) { |
if (!receive_complete_.is_null()) |
return false; |
receive_complete_ = callback; |
- io_handler_->Read(buffer_size_); |
+ receive_buffer_ = new net::IOBuffer(buffer_size_); |
+ io_handler_->Read(scoped_ptr<device::WritableBuffer>(new ReceiveBuffer( |
+ receive_buffer_, |
+ buffer_size_, |
+ base::Bind(&SerialConnection::OnAsyncReadComplete, AsWeakPtr())))); |
receive_timeout_task_.reset(); |
if (receive_timeout_ > 0) { |
receive_timeout_task_.reset(new TimeoutTask( |
@@ -218,7 +266,8 @@ bool SerialConnection::Send(const std::string& data, |
if (!send_complete_.is_null()) |
return false; |
send_complete_ = callback; |
- io_handler_->Write(data); |
+ io_handler_->Write(scoped_ptr<device::ReadOnlyBuffer>(new SendBuffer( |
+ data, base::Bind(&SerialConnection::OnAsyncWriteComplete, AsWeakPtr())))); |
send_timeout_task_.reset(); |
if (send_timeout_ > 0) { |
send_timeout_task_.reset(new TimeoutTask( |
@@ -250,9 +299,6 @@ bool SerialConnection::Configure( |
void SerialConnection::SetIoHandlerForTest( |
scoped_refptr<device::SerialIoHandler> handler) { |
io_handler_ = handler; |
- io_handler_->Initialize( |
- base::Bind(&SerialConnection::OnAsyncReadComplete, AsWeakPtr()), |
- base::Bind(&SerialConnection::OnAsyncWriteComplete, AsWeakPtr())); |
} |
bool SerialConnection::GetInfo(core_api::serial::ConnectionInfo* info) const { |
@@ -309,14 +355,16 @@ void SerialConnection::OnSendTimeout() { |
io_handler_->CancelWrite(device::serial::SEND_ERROR_TIMEOUT); |
} |
-void SerialConnection::OnAsyncReadComplete(const std::string& data, |
+void SerialConnection::OnAsyncReadComplete(int bytes_read, |
device::serial::ReceiveError error) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
DCHECK(!receive_complete_.is_null()); |
ReceiveCompleteCallback callback = receive_complete_; |
receive_complete_.Reset(); |
receive_timeout_task_.reset(); |
- callback.Run(data, ConvertReceiveErrorFromMojo(error)); |
+ callback.Run(std::string(receive_buffer_->data(), bytes_read), |
+ ConvertReceiveErrorFromMojo(error)); |
+ receive_buffer_ = NULL; |
} |
void SerialConnection::OnAsyncWriteComplete(int bytes_sent, |