| Index: jingle/glue/channel_socket_adapter.cc
|
| diff --git a/jingle/glue/channel_socket_adapter.cc b/jingle/glue/channel_socket_adapter.cc
|
| index 64cfa7f6588a656d98e2b56b28c19cde0acad7c8..3e22a35194223f819209141f5f293f6198fae949 100644
|
| --- a/jingle/glue/channel_socket_adapter.cc
|
| +++ b/jingle/glue/channel_socket_adapter.cc
|
| @@ -18,7 +18,7 @@ TransportChannelSocketAdapter::TransportChannelSocketAdapter(
|
| cricket::TransportChannel* channel)
|
| : message_loop_(MessageLoop::current()),
|
| channel_(channel),
|
| - read_callback_(NULL),
|
| + old_read_callback_(NULL),
|
| write_callback_(NULL),
|
| closed_error_code_(net::OK) {
|
| DCHECK(channel_);
|
| @@ -39,7 +39,26 @@ int TransportChannelSocketAdapter::Read(
|
| DCHECK_EQ(MessageLoop::current(), message_loop_);
|
| DCHECK(buf);
|
| DCHECK(callback);
|
| - CHECK(!read_callback_);
|
| + CHECK(!old_read_callback_ && read_callback_.is_null());
|
| +
|
| + if (!channel_) {
|
| + DCHECK(closed_error_code_ != net::OK);
|
| + return closed_error_code_;
|
| + }
|
| +
|
| + old_read_callback_ = callback;
|
| + read_buffer_ = buf;
|
| + read_buffer_size_ = buffer_size;
|
| +
|
| + return net::ERR_IO_PENDING;
|
| +}
|
| +int TransportChannelSocketAdapter::Read(
|
| + net::IOBuffer* buf, int buffer_size,
|
| + const net::CompletionCallback& callback) {
|
| + DCHECK_EQ(MessageLoop::current(), message_loop_);
|
| + DCHECK(buf);
|
| + DCHECK(!callback.is_null());
|
| + CHECK(!old_read_callback_ && read_callback_.is_null());
|
|
|
| if (!channel_) {
|
| DCHECK(closed_error_code_ != net::OK);
|
| @@ -110,11 +129,16 @@ void TransportChannelSocketAdapter::Close(int error_code) {
|
| channel_->SignalDestroyed.disconnect(this);
|
| channel_ = NULL;
|
|
|
| - if (read_callback_) {
|
| - net::OldCompletionCallback* callback = read_callback_;
|
| - read_callback_ = NULL;
|
| + if (old_read_callback_) {
|
| + net::OldCompletionCallback* callback = old_read_callback_;
|
| + old_read_callback_ = NULL;
|
| read_buffer_ = NULL;
|
| callback->Run(error_code);
|
| + } else if (!read_callback_.is_null()) {
|
| + net::CompletionCallback callback = read_callback_;
|
| + read_callback_.Reset();
|
| + read_buffer_ = NULL;
|
| + callback.Run(error_code);
|
| }
|
|
|
| if (write_callback_) {
|
| @@ -129,7 +153,7 @@ void TransportChannelSocketAdapter::OnNewPacket(
|
| cricket::TransportChannel* channel, const char* data, size_t data_size) {
|
| DCHECK_EQ(MessageLoop::current(), message_loop_);
|
| DCHECK_EQ(channel, channel_);
|
| - if (read_callback_) {
|
| + if (old_read_callback_ || !read_callback_.is_null()) {
|
| DCHECK(read_buffer_);
|
| CHECK_LT(data_size, static_cast<size_t>(std::numeric_limits<int>::max()));
|
|
|
| @@ -141,11 +165,17 @@ void TransportChannelSocketAdapter::OnNewPacket(
|
|
|
| memcpy(read_buffer_->data(), data, data_size);
|
|
|
| - net::OldCompletionCallback* callback = read_callback_;
|
| - read_callback_ = NULL;
|
| - read_buffer_ = NULL;
|
| -
|
| - callback->Run(data_size);
|
| + if (old_read_callback_) {
|
| + net::OldCompletionCallback* callback = old_read_callback_;
|
| + old_read_callback_ = NULL;
|
| + read_buffer_ = NULL;
|
| + callback->Run(data_size);
|
| + } else {
|
| + net::CompletionCallback callback = read_callback_;
|
| + read_callback_.Reset();
|
| + read_buffer_ = NULL;
|
| + callback.Run(data_size);
|
| + }
|
| } else {
|
| LOG(WARNING)
|
| << "Data was received without a callback. Dropping the packet.";
|
|
|