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