Chromium Code Reviews| 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..c8f4588e830d79fb372c3e5292dc4613116dbea8 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_); |
|
csilv
2011/12/07 00:03:48
make same as line 61
James Hawkins
2011/12/07 00:19:37
Done.
|
| + |
| + 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()); |
|
csilv
2011/12/07 00:03:48
Do we want this to be a CHECK instead of DCHECK?
csilv
2011/12/07 00:06:42
You can probably disregard this as we do use CHECK
|
| 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()) { |
|
James Hawkins
2011/12/06 23:44:23
This should be else if (!read_callback_.is_null())
James Hawkins
2011/12/06 23:45:04
Done.
|
| + 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."; |