| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "jingle/glue/channel_socket_adapter.h" | 5 #include "jingle/glue/channel_socket_adapter.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 | 8 |
| 9 #include "base/callback.h" | 9 #include "base/callback.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| 11 #include "base/message_loop.h" | 11 #include "base/message_loop.h" |
| 12 #include "net/base/io_buffer.h" | 12 #include "net/base/io_buffer.h" |
| 13 #include "net/base/net_errors.h" | 13 #include "net/base/net_errors.h" |
| 14 #include "third_party/libjingle/source/talk/p2p/base/transportchannel.h" | 14 #include "third_party/libjingle/source/talk/p2p/base/transportchannel.h" |
| 15 | 15 |
| 16 namespace jingle_glue { | 16 namespace jingle_glue { |
| 17 | 17 |
| 18 TransportChannelSocketAdapter::TransportChannelSocketAdapter( | 18 TransportChannelSocketAdapter::TransportChannelSocketAdapter( |
| 19 cricket::TransportChannel* channel) | 19 cricket::TransportChannel* channel) |
| 20 : message_loop_(MessageLoop::current()), | 20 : message_loop_(base::MessageLoop::current()), |
| 21 channel_(channel), | 21 channel_(channel), |
| 22 closed_error_code_(net::OK) { | 22 closed_error_code_(net::OK) { |
| 23 DCHECK(channel_); | 23 DCHECK(channel_); |
| 24 | 24 |
| 25 channel_->SignalReadPacket.connect( | 25 channel_->SignalReadPacket.connect( |
| 26 this, &TransportChannelSocketAdapter::OnNewPacket); | 26 this, &TransportChannelSocketAdapter::OnNewPacket); |
| 27 channel_->SignalWritableState.connect( | 27 channel_->SignalWritableState.connect( |
| 28 this, &TransportChannelSocketAdapter::OnWritableState); | 28 this, &TransportChannelSocketAdapter::OnWritableState); |
| 29 channel_->SignalDestroyed.connect( | 29 channel_->SignalDestroyed.connect( |
| 30 this, &TransportChannelSocketAdapter::OnChannelDestroyed); | 30 this, &TransportChannelSocketAdapter::OnChannelDestroyed); |
| 31 } | 31 } |
| 32 | 32 |
| 33 TransportChannelSocketAdapter::~TransportChannelSocketAdapter() { | 33 TransportChannelSocketAdapter::~TransportChannelSocketAdapter() { |
| 34 if (!destruction_callback_.is_null()) | 34 if (!destruction_callback_.is_null()) |
| 35 destruction_callback_.Run(); | 35 destruction_callback_.Run(); |
| 36 } | 36 } |
| 37 | 37 |
| 38 void TransportChannelSocketAdapter::SetOnDestroyedCallback( | 38 void TransportChannelSocketAdapter::SetOnDestroyedCallback( |
| 39 const base::Closure& callback) { | 39 const base::Closure& callback) { |
| 40 destruction_callback_ = callback; | 40 destruction_callback_ = callback; |
| 41 } | 41 } |
| 42 | 42 |
| 43 int TransportChannelSocketAdapter::Read( | 43 int TransportChannelSocketAdapter::Read( |
| 44 net::IOBuffer* buf, | 44 net::IOBuffer* buf, |
| 45 int buffer_size, | 45 int buffer_size, |
| 46 const net::CompletionCallback& callback) { | 46 const net::CompletionCallback& callback) { |
| 47 DCHECK_EQ(MessageLoop::current(), message_loop_); | 47 DCHECK_EQ(base::MessageLoop::current(), message_loop_); |
| 48 DCHECK(buf); | 48 DCHECK(buf); |
| 49 DCHECK(!callback.is_null()); | 49 DCHECK(!callback.is_null()); |
| 50 CHECK(read_callback_.is_null()); | 50 CHECK(read_callback_.is_null()); |
| 51 | 51 |
| 52 if (!channel_) { | 52 if (!channel_) { |
| 53 DCHECK(closed_error_code_ != net::OK); | 53 DCHECK(closed_error_code_ != net::OK); |
| 54 return closed_error_code_; | 54 return closed_error_code_; |
| 55 } | 55 } |
| 56 | 56 |
| 57 read_callback_ = callback; | 57 read_callback_ = callback; |
| 58 read_buffer_ = buf; | 58 read_buffer_ = buf; |
| 59 read_buffer_size_ = buffer_size; | 59 read_buffer_size_ = buffer_size; |
| 60 | 60 |
| 61 return net::ERR_IO_PENDING; | 61 return net::ERR_IO_PENDING; |
| 62 } | 62 } |
| 63 | 63 |
| 64 int TransportChannelSocketAdapter::Write( | 64 int TransportChannelSocketAdapter::Write( |
| 65 net::IOBuffer* buffer, | 65 net::IOBuffer* buffer, |
| 66 int buffer_size, | 66 int buffer_size, |
| 67 const net::CompletionCallback& callback) { | 67 const net::CompletionCallback& callback) { |
| 68 DCHECK_EQ(MessageLoop::current(), message_loop_); | 68 DCHECK_EQ(base::MessageLoop::current(), message_loop_); |
| 69 DCHECK(buffer); | 69 DCHECK(buffer); |
| 70 DCHECK(!callback.is_null()); | 70 DCHECK(!callback.is_null()); |
| 71 CHECK(write_callback_.is_null()); | 71 CHECK(write_callback_.is_null()); |
| 72 | 72 |
| 73 if (!channel_) { | 73 if (!channel_) { |
| 74 DCHECK(closed_error_code_ != net::OK); | 74 DCHECK(closed_error_code_ != net::OK); |
| 75 return closed_error_code_; | 75 return closed_error_code_; |
| 76 } | 76 } |
| 77 | 77 |
| 78 int result; | 78 int result; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 92 result = net::ERR_IO_PENDING; | 92 result = net::ERR_IO_PENDING; |
| 93 write_callback_ = callback; | 93 write_callback_ = callback; |
| 94 write_buffer_ = buffer; | 94 write_buffer_ = buffer; |
| 95 write_buffer_size_ = buffer_size; | 95 write_buffer_size_ = buffer_size; |
| 96 } | 96 } |
| 97 | 97 |
| 98 return result; | 98 return result; |
| 99 } | 99 } |
| 100 | 100 |
| 101 bool TransportChannelSocketAdapter::SetReceiveBufferSize(int32 size) { | 101 bool TransportChannelSocketAdapter::SetReceiveBufferSize(int32 size) { |
| 102 DCHECK_EQ(MessageLoop::current(), message_loop_); | 102 DCHECK_EQ(base::MessageLoop::current(), message_loop_); |
| 103 return channel_->SetOption(talk_base::Socket::OPT_RCVBUF, size) == 0; | 103 return channel_->SetOption(talk_base::Socket::OPT_RCVBUF, size) == 0; |
| 104 } | 104 } |
| 105 | 105 |
| 106 bool TransportChannelSocketAdapter::SetSendBufferSize(int32 size) { | 106 bool TransportChannelSocketAdapter::SetSendBufferSize(int32 size) { |
| 107 DCHECK_EQ(MessageLoop::current(), message_loop_); | 107 DCHECK_EQ(base::MessageLoop::current(), message_loop_); |
| 108 return channel_->SetOption(talk_base::Socket::OPT_SNDBUF, size) == 0; | 108 return channel_->SetOption(talk_base::Socket::OPT_SNDBUF, size) == 0; |
| 109 } | 109 } |
| 110 | 110 |
| 111 void TransportChannelSocketAdapter::Close(int error_code) { | 111 void TransportChannelSocketAdapter::Close(int error_code) { |
| 112 DCHECK_EQ(MessageLoop::current(), message_loop_); | 112 DCHECK_EQ(base::MessageLoop::current(), message_loop_); |
| 113 | 113 |
| 114 if (!channel_) // Already closed. | 114 if (!channel_) // Already closed. |
| 115 return; | 115 return; |
| 116 | 116 |
| 117 DCHECK(error_code != net::OK); | 117 DCHECK(error_code != net::OK); |
| 118 closed_error_code_ = error_code; | 118 closed_error_code_ = error_code; |
| 119 channel_->SignalReadPacket.disconnect(this); | 119 channel_->SignalReadPacket.disconnect(this); |
| 120 channel_->SignalDestroyed.disconnect(this); | 120 channel_->SignalDestroyed.disconnect(this); |
| 121 channel_ = NULL; | 121 channel_ = NULL; |
| 122 | 122 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 133 write_buffer_ = NULL; | 133 write_buffer_ = NULL; |
| 134 callback.Run(error_code); | 134 callback.Run(error_code); |
| 135 } | 135 } |
| 136 } | 136 } |
| 137 | 137 |
| 138 void TransportChannelSocketAdapter::OnNewPacket( | 138 void TransportChannelSocketAdapter::OnNewPacket( |
| 139 cricket::TransportChannel* channel, | 139 cricket::TransportChannel* channel, |
| 140 const char* data, | 140 const char* data, |
| 141 size_t data_size, | 141 size_t data_size, |
| 142 int flags) { | 142 int flags) { |
| 143 DCHECK_EQ(MessageLoop::current(), message_loop_); | 143 DCHECK_EQ(base::MessageLoop::current(), message_loop_); |
| 144 DCHECK_EQ(channel, channel_); | 144 DCHECK_EQ(channel, channel_); |
| 145 if (!read_callback_.is_null()) { | 145 if (!read_callback_.is_null()) { |
| 146 DCHECK(read_buffer_); | 146 DCHECK(read_buffer_); |
| 147 CHECK_LT(data_size, static_cast<size_t>(std::numeric_limits<int>::max())); | 147 CHECK_LT(data_size, static_cast<size_t>(std::numeric_limits<int>::max())); |
| 148 | 148 |
| 149 if (read_buffer_size_ < static_cast<int>(data_size)) { | 149 if (read_buffer_size_ < static_cast<int>(data_size)) { |
| 150 LOG(WARNING) << "Data buffer is smaller than the received packet. " | 150 LOG(WARNING) << "Data buffer is smaller than the received packet. " |
| 151 << "Dropping the data that doesn't fit."; | 151 << "Dropping the data that doesn't fit."; |
| 152 data_size = read_buffer_size_; | 152 data_size = read_buffer_size_; |
| 153 } | 153 } |
| 154 | 154 |
| 155 memcpy(read_buffer_->data(), data, data_size); | 155 memcpy(read_buffer_->data(), data, data_size); |
| 156 | 156 |
| 157 net::CompletionCallback callback = read_callback_; | 157 net::CompletionCallback callback = read_callback_; |
| 158 read_callback_.Reset(); | 158 read_callback_.Reset(); |
| 159 read_buffer_ = NULL; | 159 read_buffer_ = NULL; |
| 160 | 160 |
| 161 callback.Run(data_size); | 161 callback.Run(data_size); |
| 162 } else { | 162 } else { |
| 163 LOG(WARNING) | 163 LOG(WARNING) |
| 164 << "Data was received without a callback. Dropping the packet."; | 164 << "Data was received without a callback. Dropping the packet."; |
| 165 } | 165 } |
| 166 } | 166 } |
| 167 | 167 |
| 168 void TransportChannelSocketAdapter::OnWritableState( | 168 void TransportChannelSocketAdapter::OnWritableState( |
| 169 cricket::TransportChannel* channel) { | 169 cricket::TransportChannel* channel) { |
| 170 DCHECK_EQ(MessageLoop::current(), message_loop_); | 170 DCHECK_EQ(base::MessageLoop::current(), message_loop_); |
| 171 // Try to send the packet if there is a pending write. | 171 // Try to send the packet if there is a pending write. |
| 172 if (!write_callback_.is_null()) { | 172 if (!write_callback_.is_null()) { |
| 173 int result = channel_->SendPacket(write_buffer_->data(), | 173 int result = channel_->SendPacket(write_buffer_->data(), |
| 174 write_buffer_size_); | 174 write_buffer_size_); |
| 175 if (result < 0) | 175 if (result < 0) |
| 176 result = net::MapSystemError(channel_->GetError()); | 176 result = net::MapSystemError(channel_->GetError()); |
| 177 | 177 |
| 178 if (result != net::ERR_IO_PENDING) { | 178 if (result != net::ERR_IO_PENDING) { |
| 179 net::CompletionCallback callback = write_callback_; | 179 net::CompletionCallback callback = write_callback_; |
| 180 write_callback_.Reset(); | 180 write_callback_.Reset(); |
| 181 write_buffer_ = NULL; | 181 write_buffer_ = NULL; |
| 182 callback.Run(result); | 182 callback.Run(result); |
| 183 } | 183 } |
| 184 } | 184 } |
| 185 } | 185 } |
| 186 | 186 |
| 187 void TransportChannelSocketAdapter::OnChannelDestroyed( | 187 void TransportChannelSocketAdapter::OnChannelDestroyed( |
| 188 cricket::TransportChannel* channel) { | 188 cricket::TransportChannel* channel) { |
| 189 DCHECK_EQ(MessageLoop::current(), message_loop_); | 189 DCHECK_EQ(base::MessageLoop::current(), message_loop_); |
| 190 DCHECK_EQ(channel, channel_); | 190 DCHECK_EQ(channel, channel_); |
| 191 Close(net::ERR_CONNECTION_ABORTED); | 191 Close(net::ERR_CONNECTION_ABORTED); |
| 192 } | 192 } |
| 193 | 193 |
| 194 } // namespace jingle_glue | 194 } // namespace jingle_glue |
| OLD | NEW |