| 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 1948c68260afaaeee721e0ba95385ee5488f624b..7414c4b032a38e4015a1a6f8e0424509e6610f29 100644
|
| --- a/remoting/jingle_glue/ssl_socket_adapter.cc
|
| +++ b/remoting/jingle_glue/ssl_socket_adapter.cc
|
| @@ -187,7 +187,7 @@ void SSLSocketAdapter::OnConnectEvent(talk_base::AsyncSocket* socket) {
|
|
|
| TransportSocket::TransportSocket(talk_base::AsyncSocket* socket,
|
| SSLSocketAdapter *ssl_adapter)
|
| - : read_callback_(NULL),
|
| + : old_read_callback_(NULL),
|
| write_callback_(NULL),
|
| read_buffer_len_(0),
|
| write_buffer_len_(0),
|
| @@ -290,7 +290,25 @@ base::TimeDelta TransportSocket::GetConnectTimeMicros() const {
|
| int TransportSocket::Read(net::IOBuffer* buf, int buf_len,
|
| net::OldCompletionCallback* callback) {
|
| DCHECK(buf);
|
| - DCHECK(!read_callback_);
|
| + DCHECK(!old_read_callback_ && read_callback_.is_null());
|
| + DCHECK(!read_buffer_.get());
|
| + int result = socket_->Recv(buf->data(), buf_len);
|
| + if (result < 0) {
|
| + result = net::MapSystemError(socket_->GetError());
|
| + if (result == net::ERR_IO_PENDING) {
|
| + old_read_callback_ = callback;
|
| + read_buffer_ = buf;
|
| + read_buffer_len_ = buf_len;
|
| + }
|
| + }
|
| + if (result != net::ERR_IO_PENDING)
|
| + was_used_to_convey_data_ = true;
|
| + return result;
|
| +}
|
| +int TransportSocket::Read(net::IOBuffer* buf, int buf_len,
|
| + const net::CompletionCallback& callback) {
|
| + DCHECK(buf);
|
| + DCHECK(!old_read_callback_ && read_callback_.is_null());
|
| DCHECK(!read_buffer_.get());
|
| int result = socket_->Recv(buf->data(), buf_len);
|
| if (result < 0) {
|
| @@ -336,13 +354,15 @@ bool TransportSocket::SetSendBufferSize(int32 size) {
|
| }
|
|
|
| void TransportSocket::OnReadEvent(talk_base::AsyncSocket* socket) {
|
| - if (read_callback_) {
|
| + if (old_read_callback_ || !read_callback_.is_null()) {
|
| DCHECK(read_buffer_.get());
|
| - net::OldCompletionCallback* callback = read_callback_;
|
| + net::OldCompletionCallback* old_callback = old_read_callback_;
|
| + net::CompletionCallback callback = read_callback_;
|
| scoped_refptr<net::IOBuffer> buffer = read_buffer_;
|
| int buffer_len = read_buffer_len_;
|
|
|
| - read_callback_ = NULL;
|
| + old_read_callback_ = NULL;
|
| + read_callback_.Reset();
|
| read_buffer_ = NULL;
|
| read_buffer_len_ = 0;
|
|
|
| @@ -350,6 +370,7 @@ void TransportSocket::OnReadEvent(talk_base::AsyncSocket* socket) {
|
| if (result < 0) {
|
| result = net::MapSystemError(socket_->GetError());
|
| if (result == net::ERR_IO_PENDING) {
|
| + old_read_callback_ = old_callback;
|
| read_callback_ = callback;
|
| read_buffer_ = buffer;
|
| read_buffer_len_ = buffer_len;
|
| @@ -357,7 +378,10 @@ void TransportSocket::OnReadEvent(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);
|
| }
|
| }
|
|
|
|
|