Index: remoting/jingle_glue/ssl_socket_adapter.cc |
diff --git a/remoting/jingle_glue/ssl_socket_adapter.cc b/remoting/jingle_glue/ssl_socket_adapter.cc |
index 7414c4b032a38e4015a1a6f8e0424509e6610f29..3df508e043665ec06ea8525498e43ee2508960a8 100644 |
--- a/remoting/jingle_glue/ssl_socket_adapter.cc |
+++ b/remoting/jingle_glue/ssl_socket_adapter.cc |
@@ -188,7 +188,7 @@ void SSLSocketAdapter::OnConnectEvent(talk_base::AsyncSocket* socket) { |
TransportSocket::TransportSocket(talk_base::AsyncSocket* socket, |
SSLSocketAdapter *ssl_adapter) |
: old_read_callback_(NULL), |
- write_callback_(NULL), |
+ old_write_callback_(NULL), |
read_buffer_len_(0), |
write_buffer_len_(0), |
socket_(socket), |
@@ -327,7 +327,25 @@ int TransportSocket::Read(net::IOBuffer* buf, int buf_len, |
int TransportSocket::Write(net::IOBuffer* buf, int buf_len, |
net::OldCompletionCallback* callback) { |
DCHECK(buf); |
- DCHECK(!write_callback_); |
+ DCHECK(!old_write_callback_ && write_callback_.is_null()); |
+ DCHECK(!write_buffer_.get()); |
+ int result = socket_->Send(buf->data(), buf_len); |
+ if (result < 0) { |
+ result = net::MapSystemError(socket_->GetError()); |
+ if (result == net::ERR_IO_PENDING) { |
+ old_write_callback_ = callback; |
+ write_buffer_ = buf; |
+ write_buffer_len_ = buf_len; |
+ } |
+ } |
+ if (result != net::ERR_IO_PENDING) |
+ was_used_to_convey_data_ = true; |
+ return result; |
+} |
+int TransportSocket::Write(net::IOBuffer* buf, int buf_len, |
+ const net::CompletionCallback& callback) { |
+ DCHECK(buf); |
+ DCHECK(!old_write_callback_ && write_callback_.is_null()); |
DCHECK(!write_buffer_.get()); |
int result = socket_->Send(buf->data(), buf_len); |
if (result < 0) { |
@@ -386,13 +404,15 @@ void TransportSocket::OnReadEvent(talk_base::AsyncSocket* socket) { |
} |
void TransportSocket::OnWriteEvent(talk_base::AsyncSocket* socket) { |
- if (write_callback_) { |
+ if (old_write_callback_ || !write_callback_.is_null()) { |
DCHECK(write_buffer_.get()); |
- net::OldCompletionCallback* callback = write_callback_; |
+ net::OldCompletionCallback* old_callback = old_write_callback_; |
+ net::CompletionCallback callback = write_callback_; |
scoped_refptr<net::IOBuffer> buffer = write_buffer_; |
int buffer_len = write_buffer_len_; |
- write_callback_ = NULL; |
+ old_write_callback_ = NULL; |
+ write_callback_.Reset(); |
write_buffer_ = NULL; |
write_buffer_len_ = 0; |
@@ -400,6 +420,7 @@ void TransportSocket::OnWriteEvent(talk_base::AsyncSocket* socket) { |
if (result < 0) { |
result = net::MapSystemError(socket_->GetError()); |
if (result == net::ERR_IO_PENDING) { |
+ old_write_callback_ = old_callback; |
write_callback_ = callback; |
write_buffer_ = buffer; |
write_buffer_len_ = buffer_len; |
@@ -407,7 +428,10 @@ void TransportSocket::OnWriteEvent(talk_base::AsyncSocket* socket) { |
} |
} |
was_used_to_convey_data_ = true; |
- callback->RunWithParams(Tuple1<int>(result)); |
+ if (old_callback) |
+ old_callback->RunWithParams(Tuple1<int>(result)); |
+ else |
+ callback.Run(result); |
} |
} |