Index: remoting/protocol/pepper_transport_socket_adapter.cc |
diff --git a/remoting/protocol/pepper_transport_socket_adapter.cc b/remoting/protocol/pepper_transport_socket_adapter.cc |
index 0385b9bbe1f3f7ac3dad894cd4cde7c5642936a7..4876088de3121db032eb22b2d1cf9a4386bc3e6e 100644 |
--- a/remoting/protocol/pepper_transport_socket_adapter.cc |
+++ b/remoting/protocol/pepper_transport_socket_adapter.cc |
@@ -50,7 +50,7 @@ PepperTransportSocketAdapter::PepperTransportSocketAdapter( |
connected_(false), |
get_address_pending_(false), |
old_read_callback_(NULL), |
- write_callback_(NULL) { |
+ old_write_callback_(NULL) { |
callback_factory_.Initialize(this); |
} |
@@ -112,7 +112,28 @@ int PepperTransportSocketAdapter::Read( |
int PepperTransportSocketAdapter::Write(net::IOBuffer* buf, int buf_len, |
net::OldCompletionCallback* callback) { |
DCHECK(CalledOnValidThread()); |
- DCHECK(!write_callback_); |
+ DCHECK(!old_write_callback_ && write_callback_.is_null()); |
+ DCHECK(!write_buffer_); |
+ |
+ if (!transport_.get()) |
+ return net::ERR_SOCKET_NOT_CONNECTED; |
+ |
+ int result = PPErrorToNetError(transport_->Send( |
+ buf->data(), buf_len, |
+ callback_factory_.NewOptionalCallback( |
+ &PepperTransportSocketAdapter::OnWrite))); |
+ |
+ if (result == net::ERR_IO_PENDING) { |
+ old_write_callback_ = callback; |
+ write_buffer_ = buf; |
+ } |
+ |
+ return result; |
+} |
+int PepperTransportSocketAdapter::Write( |
+ net::IOBuffer* buf, int buf_len, const net::CompletionCallback& callback) { |
+ DCHECK(CalledOnValidThread()); |
+ DCHECK(!old_write_callback_ && write_callback_.is_null()); |
DCHECK(!write_buffer_); |
if (!transport_.get()) |
@@ -336,13 +357,20 @@ void PepperTransportSocketAdapter::OnRead(int32_t result) { |
void PepperTransportSocketAdapter::OnWrite(int32_t result) { |
DCHECK(CalledOnValidThread()); |
- DCHECK(write_callback_); |
+ DCHECK(old_write_callback_ || !write_callback_.is_null()); |
DCHECK(write_buffer_); |
- net::OldCompletionCallback* callback = write_callback_; |
- write_callback_ = NULL; |
- write_buffer_ = NULL; |
- callback->Run(PPErrorToNetError(result)); |
+ if (old_write_callback_) { |
+ net::OldCompletionCallback* callback = old_write_callback_; |
+ old_write_callback_ = NULL; |
+ write_buffer_ = NULL; |
+ callback->Run(PPErrorToNetError(result)); |
+ } else { |
+ net::CompletionCallback callback = write_callback_; |
+ write_callback_.Reset(); |
+ write_buffer_ = NULL; |
+ callback.Run(PPErrorToNetError(result)); |
+ } |
} |
} // namespace protocol |