Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(187)

Unified Diff: extensions/browser/api/serial/serial_connection.cc

Issue 423373002: Convert SerialIoHandler to use buffer interfaces for I/O API methods. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@js-serial
Patch Set: rebase Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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,
« device/serial/buffer.h ('K') | « extensions/browser/api/serial/serial_connection.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698