Chromium Code Reviews| Index: chrome/browser/extensions/api/socket/socket.cc |
| diff --git a/chrome/browser/extensions/api/socket/socket.cc b/chrome/browser/extensions/api/socket/socket.cc |
| index 9dd51ce1cf5fc827a8dfb5f4cbec967bbd3c87a7..79461bb039e1fd840c78beb18725cc0e99a13198 100644 |
| --- a/chrome/browser/extensions/api/socket/socket.cc |
| +++ b/chrome/browser/extensions/api/socket/socket.cc |
| @@ -18,8 +18,7 @@ Socket::Socket(const std::string& address, int port, |
| : APIResource(APIResource::SocketResource, event_notifier), |
| address_(address), |
| port_(port), |
| - is_connected_(false), |
| - read_buffer_(new net::IOBufferWithSize(kMaxRead)) { |
| + is_connected_(false) { |
| } |
| Socket::~Socket() { |
| @@ -27,45 +26,44 @@ Socket::~Socket() { |
| DCHECK(!is_connected_); |
| } |
| -void Socket::OnDataRead(int result) { |
| - std::string message; |
| - if (result >= 0) |
| - message = std::string(read_buffer_->data(), result); |
| - event_notifier()->OnDataRead(result, message); |
| +void Socket::OnDataRead(scoped_refptr<net::IOBuffer> io_buffer, int result) { |
| + // OnDataRead will take ownership of data_value. |
| + ListValue* data_value = new ListValue(); |
| + if (result >= 0) { |
| + size_t bytes_size = static_cast<size_t>(result); |
| + const char* io_buffer_start = io_buffer->data(); |
| + for (size_t i = 0; i < bytes_size; ++i) { |
| + data_value->Set(i, Value::CreateIntegerValue(io_buffer_start[i])); |
| + } |
| + } |
| + event_notifier()->OnDataRead(result, data_value); |
| } |
| void Socket::OnWriteComplete(int result) { |
| event_notifier()->OnWriteComplete(result); |
| } |
| -std::string Socket::Read() { |
| - int result = socket()->Read( |
| - read_buffer_, kMaxRead, |
| - base::Bind(&Socket::OnDataRead, base::Unretained(this))); |
| - if (result == net::ERR_IO_PENDING) |
| - return ""; |
| - if (result < 0) |
| - return ""; |
| - return std::string(read_buffer_->data(), result); |
| +int Socket::Read(scoped_refptr<net::IOBuffer> io_buffer, int io_buffer_len) { |
| + return socket()->Read( |
| + io_buffer.get(), |
| + io_buffer_len, |
| + base::Bind(&Socket::OnDataRead, base::Unretained(this), io_buffer)); |
|
jeremya
2012/04/16 22:28:27
Is it possible that this read will call the callba
miket_OOO
2012/04/16 23:15:53
I can't point you to the code that proves it, but
|
| } |
| -int Socket::Write(const std::string& message) { |
| - int length = message.length(); |
| - scoped_refptr<net::StringIOBuffer> io_buffer( |
| - new net::StringIOBuffer(message)); |
| - scoped_refptr<net::DrainableIOBuffer> buffer( |
| - new net::DrainableIOBuffer(io_buffer, length)); |
| +int Socket::Write(scoped_refptr<net::IOBuffer> io_buffer, int byte_count) { |
| + scoped_refptr<net::DrainableIOBuffer> drainable_buffer( |
| + new net::DrainableIOBuffer(io_buffer.get(), byte_count)); |
| int bytes_sent = 0; |
| - while (buffer->BytesRemaining()) { |
| + while (drainable_buffer->BytesRemaining()) { |
| int result = socket()->Write( |
| - buffer, buffer->BytesRemaining(), |
| + drainable_buffer, drainable_buffer->BytesRemaining(), |
| base::Bind(&Socket::OnWriteComplete, base::Unretained(this))); |
| if (result <= 0) |
| // We pass all errors, including ERROR_IO_PENDING, back to the caller. |
| return bytes_sent > 0 ? bytes_sent : result; |
|
jeremya
2012/04/16 22:28:27
(Side note, since you don't change this behaviour
miket_OOO
2012/04/16 23:15:53
We're OK, but I think the code needs to be refacto
|
| bytes_sent += result; |
| - buffer->DidConsume(result); |
| + drainable_buffer->DidConsume(result); |
| } |
| return bytes_sent; |
| } |