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; |
} |