| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/pseudotcp_adapter.h" | 5 #include "jingle/glue/pseudotcp_adapter.h" |
| 6 | 6 |
| 7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/time.h" | 9 #include "base/time.h" |
| 10 #include "net/base/address_list.h" | 10 #include "net/base/address_list.h" |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 namespace jingle_glue { | 23 namespace jingle_glue { |
| 24 | 24 |
| 25 class PseudoTcpAdapter::Core : public cricket::IPseudoTcpNotify, | 25 class PseudoTcpAdapter::Core : public cricket::IPseudoTcpNotify, |
| 26 public base::RefCounted<Core> { | 26 public base::RefCounted<Core> { |
| 27 public: | 27 public: |
| 28 Core(net::Socket* socket); | 28 Core(net::Socket* socket); |
| 29 virtual ~Core(); | 29 virtual ~Core(); |
| 30 | 30 |
| 31 // Functions used to implement net::StreamSocket. | 31 // Functions used to implement net::StreamSocket. |
| 32 int Read(net::IOBuffer* buffer, int buffer_size, | 32 int Read(net::IOBuffer* buffer, int buffer_size, |
| 33 net::OldCompletionCallback* callback); | |
| 34 int Read(net::IOBuffer* buffer, int buffer_size, | |
| 35 const net::CompletionCallback& callback); | 33 const net::CompletionCallback& callback); |
| 36 int Write(net::IOBuffer* buffer, int buffer_size, | 34 int Write(net::IOBuffer* buffer, int buffer_size, |
| 37 net::OldCompletionCallback* callback); | 35 const net::CompletionCallback& callback); |
| 38 int Connect(net::OldCompletionCallback* callback); | |
| 39 int Connect(const net::CompletionCallback& callback); | 36 int Connect(const net::CompletionCallback& callback); |
| 40 void Disconnect(); | 37 void Disconnect(); |
| 41 bool IsConnected() const; | 38 bool IsConnected() const; |
| 42 | 39 |
| 43 // cricket::IPseudoTcpNotify interface. | 40 // cricket::IPseudoTcpNotify interface. |
| 44 // These notifications are triggered from NotifyPacket. | 41 // These notifications are triggered from NotifyPacket. |
| 45 virtual void OnTcpOpen(cricket::PseudoTcp* tcp) OVERRIDE; | 42 virtual void OnTcpOpen(cricket::PseudoTcp* tcp) OVERRIDE; |
| 46 virtual void OnTcpReadable(cricket::PseudoTcp* tcp) OVERRIDE; | 43 virtual void OnTcpReadable(cricket::PseudoTcp* tcp) OVERRIDE; |
| 47 virtual void OnTcpWriteable(cricket::PseudoTcp* tcp) OVERRIDE; | 44 virtual void OnTcpWriteable(cricket::PseudoTcp* tcp) OVERRIDE; |
| 48 // This is triggered by NotifyClock or NotifyPacket. | 45 // This is triggered by NotifyClock or NotifyPacket. |
| (...skipping 15 matching lines...) Expand all Loading... |
| 64 | 61 |
| 65 // These may trigger callbacks, so the holder must hold a reference on | 62 // These may trigger callbacks, so the holder must hold a reference on |
| 66 // the stack while calling them. | 63 // the stack while calling them. |
| 67 void DoReadFromSocket(); | 64 void DoReadFromSocket(); |
| 68 void HandleReadResults(int result); | 65 void HandleReadResults(int result); |
| 69 void HandleTcpClock(); | 66 void HandleTcpClock(); |
| 70 | 67 |
| 71 // This re-sets |timer| without triggering callbacks. | 68 // This re-sets |timer| without triggering callbacks. |
| 72 void AdjustClock(); | 69 void AdjustClock(); |
| 73 | 70 |
| 74 net::OldCompletionCallback* old_connect_callback_; | |
| 75 net::CompletionCallback connect_callback_; | 71 net::CompletionCallback connect_callback_; |
| 76 net::OldCompletionCallback* old_read_callback_; | |
| 77 net::CompletionCallback read_callback_; | 72 net::CompletionCallback read_callback_; |
| 78 net::OldCompletionCallback* write_callback_; | 73 net::CompletionCallback write_callback_; |
| 79 | 74 |
| 80 cricket::PseudoTcp pseudo_tcp_; | 75 cricket::PseudoTcp pseudo_tcp_; |
| 81 scoped_ptr<net::Socket> socket_; | 76 scoped_ptr<net::Socket> socket_; |
| 82 | 77 |
| 83 scoped_refptr<net::IOBuffer> read_buffer_; | 78 scoped_refptr<net::IOBuffer> read_buffer_; |
| 84 int read_buffer_size_; | 79 int read_buffer_size_; |
| 85 scoped_refptr<net::IOBuffer> write_buffer_; | 80 scoped_refptr<net::IOBuffer> write_buffer_; |
| 86 int write_buffer_size_; | 81 int write_buffer_size_; |
| 87 | 82 |
| 88 bool socket_write_pending_; | 83 bool socket_write_pending_; |
| 89 scoped_refptr<net::IOBuffer> socket_read_buffer_; | 84 scoped_refptr<net::IOBuffer> socket_read_buffer_; |
| 90 | 85 |
| 91 net::OldCompletionCallbackImpl<Core> socket_read_callback_; | |
| 92 net::OldCompletionCallbackImpl<Core> socket_write_callback_; | |
| 93 | |
| 94 base::OneShotTimer<Core> timer_; | 86 base::OneShotTimer<Core> timer_; |
| 95 | 87 |
| 96 DISALLOW_COPY_AND_ASSIGN(Core); | 88 DISALLOW_COPY_AND_ASSIGN(Core); |
| 97 }; | 89 }; |
| 98 | 90 |
| 99 | 91 |
| 100 PseudoTcpAdapter::Core::Core(net::Socket* socket) | 92 PseudoTcpAdapter::Core::Core(net::Socket* socket) |
| 101 : old_connect_callback_(NULL), | 93 : ALLOW_THIS_IN_INITIALIZER_LIST(pseudo_tcp_(this, 0)), |
| 102 old_read_callback_(NULL), | |
| 103 write_callback_(NULL), | |
| 104 ALLOW_THIS_IN_INITIALIZER_LIST(pseudo_tcp_(this, 0)), | |
| 105 socket_(socket), | 94 socket_(socket), |
| 106 socket_write_pending_(false), | 95 socket_write_pending_(false) { |
| 107 ALLOW_THIS_IN_INITIALIZER_LIST( | |
| 108 socket_read_callback_(this, &PseudoTcpAdapter::Core::OnRead)), | |
| 109 ALLOW_THIS_IN_INITIALIZER_LIST( | |
| 110 socket_write_callback_(this, &PseudoTcpAdapter::Core::OnWritten)) { | |
| 111 // Doesn't trigger callbacks. | 96 // Doesn't trigger callbacks. |
| 112 pseudo_tcp_.NotifyMTU(kDefaultMtu); | 97 pseudo_tcp_.NotifyMTU(kDefaultMtu); |
| 113 } | 98 } |
| 114 | 99 |
| 115 PseudoTcpAdapter::Core::~Core() { | 100 PseudoTcpAdapter::Core::~Core() { |
| 116 } | 101 } |
| 117 | 102 |
| 118 int PseudoTcpAdapter::Core::Read(net::IOBuffer* buffer, int buffer_size, | 103 int PseudoTcpAdapter::Core::Read(net::IOBuffer* buffer, int buffer_size, |
| 119 net::OldCompletionCallback* callback) { | 104 const net::CompletionCallback& callback) { |
| 120 DCHECK(!old_read_callback_ && read_callback_.is_null()); | 105 DCHECK(read_callback_.is_null()); |
| 121 | 106 |
| 122 // Reference the Core in case a callback deletes the adapter. | 107 // Reference the Core in case a callback deletes the adapter. |
| 123 scoped_refptr<Core> core(this); | 108 scoped_refptr<Core> core(this); |
| 124 | |
| 125 int result = pseudo_tcp_.Recv(buffer->data(), buffer_size); | |
| 126 if (result < 0) { | |
| 127 result = net::MapSystemError(pseudo_tcp_.GetError()); | |
| 128 DCHECK(result < 0); | |
| 129 } | |
| 130 | |
| 131 if (result == net::ERR_IO_PENDING) { | |
| 132 read_buffer_ = buffer; | |
| 133 read_buffer_size_ = buffer_size; | |
| 134 old_read_callback_ = callback; | |
| 135 } | |
| 136 | |
| 137 AdjustClock(); | |
| 138 | |
| 139 return result; | |
| 140 } | |
| 141 int PseudoTcpAdapter::Core::Read(net::IOBuffer* buffer, int buffer_size, | |
| 142 const net::CompletionCallback& callback) { | |
| 143 DCHECK(!old_read_callback_ && read_callback_.is_null()); | |
| 144 | |
| 145 // Reference the Core in case a callback deletes the adapter. | |
| 146 scoped_refptr<Core> core(this); | |
| 147 | 109 |
| 148 int result = pseudo_tcp_.Recv(buffer->data(), buffer_size); | 110 int result = pseudo_tcp_.Recv(buffer->data(), buffer_size); |
| 149 if (result < 0) { | 111 if (result < 0) { |
| 150 result = net::MapSystemError(pseudo_tcp_.GetError()); | 112 result = net::MapSystemError(pseudo_tcp_.GetError()); |
| 151 DCHECK(result < 0); | 113 DCHECK(result < 0); |
| 152 } | 114 } |
| 153 | 115 |
| 154 if (result == net::ERR_IO_PENDING) { | 116 if (result == net::ERR_IO_PENDING) { |
| 155 read_buffer_ = buffer; | 117 read_buffer_ = buffer; |
| 156 read_buffer_size_ = buffer_size; | 118 read_buffer_size_ = buffer_size; |
| 157 read_callback_ = callback; | 119 read_callback_ = callback; |
| 158 } | 120 } |
| 159 | 121 |
| 160 AdjustClock(); | 122 AdjustClock(); |
| 161 | 123 |
| 162 return result; | 124 return result; |
| 163 } | 125 } |
| 164 | 126 |
| 165 int PseudoTcpAdapter::Core::Write(net::IOBuffer* buffer, int buffer_size, | 127 int PseudoTcpAdapter::Core::Write(net::IOBuffer* buffer, int buffer_size, |
| 166 net::OldCompletionCallback* callback) { | 128 const net::CompletionCallback& callback) { |
| 167 DCHECK(!write_callback_); | 129 DCHECK(write_callback_.is_null()); |
| 168 | 130 |
| 169 // Reference the Core in case a callback deletes the adapter. | 131 // Reference the Core in case a callback deletes the adapter. |
| 170 scoped_refptr<Core> core(this); | 132 scoped_refptr<Core> core(this); |
| 171 | 133 |
| 172 int result = pseudo_tcp_.Send(buffer->data(), buffer_size); | 134 int result = pseudo_tcp_.Send(buffer->data(), buffer_size); |
| 173 if (result < 0) { | 135 if (result < 0) { |
| 174 result = net::MapSystemError(pseudo_tcp_.GetError()); | 136 result = net::MapSystemError(pseudo_tcp_.GetError()); |
| 175 DCHECK(result < 0); | 137 DCHECK(result < 0); |
| 176 } | 138 } |
| 177 | 139 |
| 178 if (result == net::ERR_IO_PENDING) { | 140 if (result == net::ERR_IO_PENDING) { |
| 179 write_buffer_ = buffer; | 141 write_buffer_ = buffer; |
| 180 write_buffer_size_ = buffer_size; | 142 write_buffer_size_ = buffer_size; |
| 181 write_callback_ = callback; | 143 write_callback_ = callback; |
| 182 } | 144 } |
| 183 | 145 |
| 184 AdjustClock(); | 146 AdjustClock(); |
| 185 | 147 |
| 186 return result; | 148 return result; |
| 187 } | 149 } |
| 188 | 150 |
| 189 int PseudoTcpAdapter::Core::Connect(net::OldCompletionCallback* callback) { | |
| 190 DCHECK_EQ(pseudo_tcp_.State(), cricket::PseudoTcp::TCP_LISTEN); | |
| 191 | |
| 192 // Reference the Core in case a callback deletes the adapter. | |
| 193 scoped_refptr<Core> core(this); | |
| 194 | |
| 195 // Start the connection attempt. | |
| 196 int result = pseudo_tcp_.Connect(); | |
| 197 if (result < 0) | |
| 198 return net::ERR_FAILED; | |
| 199 | |
| 200 AdjustClock(); | |
| 201 | |
| 202 old_connect_callback_ = callback; | |
| 203 connect_callback_.Reset(); | |
| 204 DoReadFromSocket(); | |
| 205 | |
| 206 return net::ERR_IO_PENDING; | |
| 207 } | |
| 208 | |
| 209 int PseudoTcpAdapter::Core::Connect(const net::CompletionCallback& callback) { | 151 int PseudoTcpAdapter::Core::Connect(const net::CompletionCallback& callback) { |
| 210 DCHECK_EQ(pseudo_tcp_.State(), cricket::PseudoTcp::TCP_LISTEN); | 152 DCHECK_EQ(pseudo_tcp_.State(), cricket::PseudoTcp::TCP_LISTEN); |
| 211 | 153 |
| 212 // Reference the Core in case a callback deletes the adapter. | 154 // Reference the Core in case a callback deletes the adapter. |
| 213 scoped_refptr<Core> core(this); | 155 scoped_refptr<Core> core(this); |
| 214 | 156 |
| 215 // Start the connection attempt. | 157 // Start the connection attempt. |
| 216 int result = pseudo_tcp_.Connect(); | 158 int result = pseudo_tcp_.Connect(); |
| 217 if (result < 0) | 159 if (result < 0) |
| 218 return net::ERR_FAILED; | 160 return net::ERR_FAILED; |
| 219 | 161 |
| 220 AdjustClock(); | 162 AdjustClock(); |
| 221 | 163 |
| 222 old_connect_callback_ = NULL; | |
| 223 connect_callback_ = callback; | 164 connect_callback_ = callback; |
| 224 DoReadFromSocket(); | 165 DoReadFromSocket(); |
| 225 | 166 |
| 226 return net::ERR_IO_PENDING; | 167 return net::ERR_IO_PENDING; |
| 227 } | 168 } |
| 228 | 169 |
| 229 void PseudoTcpAdapter::Core::Disconnect() { | 170 void PseudoTcpAdapter::Core::Disconnect() { |
| 230 // Don't dispatch outstanding callbacks, as mandated by net::StreamSocket. | 171 // Don't dispatch outstanding callbacks, as mandated by net::StreamSocket. |
| 231 old_read_callback_ = NULL; | |
| 232 read_callback_.Reset(); | 172 read_callback_.Reset(); |
| 233 read_buffer_ = NULL; | 173 read_buffer_ = NULL; |
| 234 write_callback_ = NULL; | 174 write_callback_.Reset(); |
| 235 write_buffer_ = NULL; | 175 write_buffer_ = NULL; |
| 236 old_connect_callback_ = NULL; | |
| 237 connect_callback_.Reset(); | 176 connect_callback_.Reset(); |
| 238 | 177 |
| 239 // TODO(wez): Connect should succeed if called after Disconnect, which | 178 // TODO(wez): Connect should succeed if called after Disconnect, which |
| 240 // PseudoTcp doesn't support, so we need to teardown the internal PseudoTcp | 179 // PseudoTcp doesn't support, so we need to teardown the internal PseudoTcp |
| 241 // and create a new one in Connect. | 180 // and create a new one in Connect. |
| 242 // TODO(wez): Close sets a shutdown flag inside PseudoTcp but has no other | 181 // TODO(wez): Close sets a shutdown flag inside PseudoTcp but has no other |
| 243 // effect. This should be addressed in PseudoTcp, really. | 182 // effect. This should be addressed in PseudoTcp, really. |
| 244 // In the meantime we can fake OnTcpClosed notification and tear down the | 183 // In the meantime we can fake OnTcpClosed notification and tear down the |
| 245 // PseudoTcp. | 184 // PseudoTcp. |
| 246 pseudo_tcp_.Close(true); | 185 pseudo_tcp_.Close(true); |
| 247 } | 186 } |
| 248 | 187 |
| 249 bool PseudoTcpAdapter::Core::IsConnected() const { | 188 bool PseudoTcpAdapter::Core::IsConnected() const { |
| 250 return pseudo_tcp_.State() == PseudoTcp::TCP_ESTABLISHED; | 189 return pseudo_tcp_.State() == PseudoTcp::TCP_ESTABLISHED; |
| 251 } | 190 } |
| 252 | 191 |
| 253 void PseudoTcpAdapter::Core::OnTcpOpen(PseudoTcp* tcp) { | 192 void PseudoTcpAdapter::Core::OnTcpOpen(PseudoTcp* tcp) { |
| 254 DCHECK(tcp == &pseudo_tcp_); | 193 DCHECK(tcp == &pseudo_tcp_); |
| 255 | 194 |
| 256 if (old_connect_callback_) { | 195 if (!connect_callback_.is_null()) { |
| 257 net::OldCompletionCallback* callback = old_connect_callback_; | |
| 258 old_connect_callback_ = NULL; | |
| 259 callback->Run(net::OK); | |
| 260 } else if (!connect_callback_.is_null()) { | |
| 261 net::CompletionCallback callback = connect_callback_; | 196 net::CompletionCallback callback = connect_callback_; |
| 262 connect_callback_.Reset(); | 197 connect_callback_.Reset(); |
| 263 callback.Run(net::OK); | 198 callback.Run(net::OK); |
| 264 } | 199 } |
| 265 | 200 |
| 266 OnTcpReadable(tcp); | 201 OnTcpReadable(tcp); |
| 267 OnTcpWriteable(tcp); | 202 OnTcpWriteable(tcp); |
| 268 } | 203 } |
| 269 | 204 |
| 270 void PseudoTcpAdapter::Core::OnTcpReadable(PseudoTcp* tcp) { | 205 void PseudoTcpAdapter::Core::OnTcpReadable(PseudoTcp* tcp) { |
| 271 DCHECK_EQ(tcp, &pseudo_tcp_); | 206 DCHECK_EQ(tcp, &pseudo_tcp_); |
| 272 if (!old_read_callback_ && read_callback_.is_null()) | 207 if (read_callback_.is_null()) |
| 273 return; | 208 return; |
| 274 | 209 |
| 275 int result = pseudo_tcp_.Recv(read_buffer_->data(), read_buffer_size_); | 210 int result = pseudo_tcp_.Recv(read_buffer_->data(), read_buffer_size_); |
| 276 if (result < 0) { | 211 if (result < 0) { |
| 277 result = net::MapSystemError(pseudo_tcp_.GetError()); | 212 result = net::MapSystemError(pseudo_tcp_.GetError()); |
| 278 DCHECK(result < 0); | 213 DCHECK(result < 0); |
| 279 if (result == net::ERR_IO_PENDING) | 214 if (result == net::ERR_IO_PENDING) |
| 280 return; | 215 return; |
| 281 } | 216 } |
| 282 | 217 |
| 283 AdjustClock(); | 218 AdjustClock(); |
| 284 | 219 |
| 285 if (old_read_callback_) { | 220 net::CompletionCallback callback = read_callback_; |
| 286 net::OldCompletionCallback* callback = old_read_callback_; | 221 read_callback_.Reset(); |
| 287 old_read_callback_ = NULL; | 222 read_buffer_ = NULL; |
| 288 read_buffer_ = NULL; | 223 callback.Run(result); |
| 289 callback->Run(result); | |
| 290 } else { | |
| 291 net::CompletionCallback callback = read_callback_; | |
| 292 read_callback_.Reset(); | |
| 293 read_buffer_ = NULL; | |
| 294 callback.Run(result); | |
| 295 } | |
| 296 } | 224 } |
| 297 | 225 |
| 298 void PseudoTcpAdapter::Core::OnTcpWriteable(PseudoTcp* tcp) { | 226 void PseudoTcpAdapter::Core::OnTcpWriteable(PseudoTcp* tcp) { |
| 299 DCHECK_EQ(tcp, &pseudo_tcp_); | 227 DCHECK_EQ(tcp, &pseudo_tcp_); |
| 300 if (!write_callback_) | 228 if (write_callback_.is_null()) |
| 301 return; | 229 return; |
| 302 | 230 |
| 303 int result = pseudo_tcp_.Send(write_buffer_->data(), write_buffer_size_); | 231 int result = pseudo_tcp_.Send(write_buffer_->data(), write_buffer_size_); |
| 304 if (result < 0) { | 232 if (result < 0) { |
| 305 result = net::MapSystemError(pseudo_tcp_.GetError()); | 233 result = net::MapSystemError(pseudo_tcp_.GetError()); |
| 306 DCHECK(result < 0); | 234 DCHECK(result < 0); |
| 307 if (result == net::ERR_IO_PENDING) | 235 if (result == net::ERR_IO_PENDING) |
| 308 return; | 236 return; |
| 309 } | 237 } |
| 310 | 238 |
| 311 AdjustClock(); | 239 AdjustClock(); |
| 312 | 240 |
| 313 net::OldCompletionCallback* callback = write_callback_; | 241 net::CompletionCallback callback = write_callback_; |
| 314 write_callback_ = NULL; | 242 write_callback_.Reset(); |
| 315 write_buffer_ = NULL; | 243 write_buffer_ = NULL; |
| 316 callback->Run(result); | 244 callback.Run(result); |
| 317 } | 245 } |
| 318 | 246 |
| 319 void PseudoTcpAdapter::Core::OnTcpClosed(PseudoTcp* tcp, uint32 error) { | 247 void PseudoTcpAdapter::Core::OnTcpClosed(PseudoTcp* tcp, uint32 error) { |
| 320 DCHECK_EQ(tcp, &pseudo_tcp_); | 248 DCHECK_EQ(tcp, &pseudo_tcp_); |
| 321 | 249 |
| 322 if (old_connect_callback_) { | 250 if (!connect_callback_.is_null()) { |
| 323 net::OldCompletionCallback* callback = old_connect_callback_; | |
| 324 old_connect_callback_ = NULL; | |
| 325 callback->Run(net::MapSystemError(error)); | |
| 326 } else if (!connect_callback_.is_null()) { | |
| 327 net::CompletionCallback callback = connect_callback_; | 251 net::CompletionCallback callback = connect_callback_; |
| 328 connect_callback_.Reset(); | 252 connect_callback_.Reset(); |
| 329 callback.Run(net::MapSystemError(error)); | 253 callback.Run(net::MapSystemError(error)); |
| 330 } | 254 } |
| 331 | 255 |
| 332 if (old_read_callback_) { | 256 if (!read_callback_.is_null()) { |
| 333 net::OldCompletionCallback* callback = old_read_callback_; | |
| 334 old_read_callback_ = NULL; | |
| 335 callback->Run(net::MapSystemError(error)); | |
| 336 } else if (!read_callback_.is_null()) { | |
| 337 net::CompletionCallback callback = read_callback_; | 257 net::CompletionCallback callback = read_callback_; |
| 338 read_callback_.Reset(); | 258 read_callback_.Reset(); |
| 339 callback.Run(net::MapSystemError(error)); | 259 callback.Run(net::MapSystemError(error)); |
| 340 } | 260 } |
| 341 | 261 |
| 342 if (write_callback_) { | 262 if (!write_callback_.is_null()) { |
| 343 net::OldCompletionCallback* callback = write_callback_; | 263 net::CompletionCallback callback = write_callback_; |
| 344 write_callback_ = NULL; | 264 write_callback_.Reset(); |
| 345 callback->Run(net::MapSystemError(error)); | 265 callback.Run(net::MapSystemError(error)); |
| 346 } | 266 } |
| 347 } | 267 } |
| 348 | 268 |
| 349 void PseudoTcpAdapter::Core::SetAckDelay(int delay_ms) { | 269 void PseudoTcpAdapter::Core::SetAckDelay(int delay_ms) { |
| 350 pseudo_tcp_.SetOption(cricket::PseudoTcp::OPT_ACKDELAY, delay_ms); | 270 pseudo_tcp_.SetOption(cricket::PseudoTcp::OPT_ACKDELAY, delay_ms); |
| 351 } | 271 } |
| 352 | 272 |
| 353 void PseudoTcpAdapter::Core::SetNoDelay(bool no_delay) { | 273 void PseudoTcpAdapter::Core::SetNoDelay(bool no_delay) { |
| 354 pseudo_tcp_.SetOption(cricket::PseudoTcp::OPT_NODELAY, no_delay ? 1 : 0); | 274 pseudo_tcp_.SetOption(cricket::PseudoTcp::OPT_NODELAY, no_delay ? 1 : 0); |
| 355 } | 275 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 372 // returning success for the write, but dropping the packet. PseudoTcp will | 292 // returning success for the write, but dropping the packet. PseudoTcp will |
| 373 // back-off and retransmit, adjusting for the perceived congestion. | 293 // back-off and retransmit, adjusting for the perceived congestion. |
| 374 if (socket_write_pending_) | 294 if (socket_write_pending_) |
| 375 return IPseudoTcpNotify::WR_SUCCESS; | 295 return IPseudoTcpNotify::WR_SUCCESS; |
| 376 | 296 |
| 377 scoped_refptr<net::IOBuffer> write_buffer = new net::IOBuffer(len); | 297 scoped_refptr<net::IOBuffer> write_buffer = new net::IOBuffer(len); |
| 378 memcpy(write_buffer->data(), buffer, len); | 298 memcpy(write_buffer->data(), buffer, len); |
| 379 | 299 |
| 380 // Our underlying socket is datagram-oriented, which means it should either | 300 // Our underlying socket is datagram-oriented, which means it should either |
| 381 // send exactly as many bytes as we requested, or fail. | 301 // send exactly as many bytes as we requested, or fail. |
| 382 int result = socket_->Write(write_buffer, len, &socket_write_callback_); | 302 int result = socket_->Write(write_buffer, len, |
| 303 base::Bind(&PseudoTcpAdapter::Core::OnWritten, |
| 304 base::Unretained(this))); |
| 383 if (result == net::ERR_IO_PENDING) { | 305 if (result == net::ERR_IO_PENDING) { |
| 384 socket_write_pending_ = true; | 306 socket_write_pending_ = true; |
| 385 return IPseudoTcpNotify::WR_SUCCESS; | 307 return IPseudoTcpNotify::WR_SUCCESS; |
| 386 } if (result == net::ERR_MSG_TOO_BIG) { | 308 } if (result == net::ERR_MSG_TOO_BIG) { |
| 387 return IPseudoTcpNotify::WR_TOO_LARGE; | 309 return IPseudoTcpNotify::WR_TOO_LARGE; |
| 388 } else if (result < 0) { | 310 } else if (result < 0) { |
| 389 return IPseudoTcpNotify::WR_FAIL; | 311 return IPseudoTcpNotify::WR_FAIL; |
| 390 } else { | 312 } else { |
| 391 return IPseudoTcpNotify::WR_SUCCESS; | 313 return IPseudoTcpNotify::WR_SUCCESS; |
| 392 } | 314 } |
| 393 } | 315 } |
| 394 | 316 |
| 395 void PseudoTcpAdapter::Core::DoReadFromSocket() { | 317 void PseudoTcpAdapter::Core::DoReadFromSocket() { |
| 396 if (!socket_read_buffer_) | 318 if (!socket_read_buffer_) |
| 397 socket_read_buffer_ = new net::IOBuffer(kReadBufferSize); | 319 socket_read_buffer_ = new net::IOBuffer(kReadBufferSize); |
| 398 | 320 |
| 399 while (true) { | 321 while (true) { |
| 400 int result = socket_->Read(socket_read_buffer_, kReadBufferSize, | 322 int result = socket_->Read(socket_read_buffer_, kReadBufferSize, |
| 401 &socket_read_callback_); | 323 base::Bind(&PseudoTcpAdapter::Core::OnRead, |
| 324 base::Unretained(this))); |
| 402 if (result == net::ERR_IO_PENDING) | 325 if (result == net::ERR_IO_PENDING) |
| 403 break; | 326 break; |
| 404 | 327 |
| 405 HandleReadResults(result); | 328 HandleReadResults(result); |
| 406 } | 329 } |
| 407 } | 330 } |
| 408 | 331 |
| 409 void PseudoTcpAdapter::Core::HandleReadResults(int result) { | 332 void PseudoTcpAdapter::Core::HandleReadResults(int result) { |
| 410 if (result <= 0) { | 333 if (result <= 0) { |
| 411 LOG(ERROR) << "Read returned " << result; | 334 LOG(ERROR) << "Read returned " << result; |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 458 | 381 |
| 459 PseudoTcpAdapter::PseudoTcpAdapter(net::Socket* socket) | 382 PseudoTcpAdapter::PseudoTcpAdapter(net::Socket* socket) |
| 460 : core_(new Core(socket)) { | 383 : core_(new Core(socket)) { |
| 461 } | 384 } |
| 462 | 385 |
| 463 PseudoTcpAdapter::~PseudoTcpAdapter() { | 386 PseudoTcpAdapter::~PseudoTcpAdapter() { |
| 464 Disconnect(); | 387 Disconnect(); |
| 465 } | 388 } |
| 466 | 389 |
| 467 int PseudoTcpAdapter::Read(net::IOBuffer* buffer, int buffer_size, | 390 int PseudoTcpAdapter::Read(net::IOBuffer* buffer, int buffer_size, |
| 468 net::OldCompletionCallback* callback) { | |
| 469 DCHECK(CalledOnValidThread()); | |
| 470 return core_->Read(buffer, buffer_size, callback); | |
| 471 } | |
| 472 int PseudoTcpAdapter::Read(net::IOBuffer* buffer, int buffer_size, | |
| 473 const net::CompletionCallback& callback) { | 391 const net::CompletionCallback& callback) { |
| 474 DCHECK(CalledOnValidThread()); | 392 DCHECK(CalledOnValidThread()); |
| 475 return core_->Read(buffer, buffer_size, callback); | 393 return core_->Read(buffer, buffer_size, callback); |
| 476 } | 394 } |
| 477 | 395 |
| 478 int PseudoTcpAdapter::Write(net::IOBuffer* buffer, int buffer_size, | 396 int PseudoTcpAdapter::Write(net::IOBuffer* buffer, int buffer_size, |
| 479 net::OldCompletionCallback* callback) { | 397 const net::CompletionCallback& callback) { |
| 480 DCHECK(CalledOnValidThread()); | 398 DCHECK(CalledOnValidThread()); |
| 481 return core_->Write(buffer, buffer_size, callback); | 399 return core_->Write(buffer, buffer_size, callback); |
| 482 } | 400 } |
| 483 | 401 |
| 484 bool PseudoTcpAdapter::SetReceiveBufferSize(int32 size) { | 402 bool PseudoTcpAdapter::SetReceiveBufferSize(int32 size) { |
| 485 DCHECK(CalledOnValidThread()); | 403 DCHECK(CalledOnValidThread()); |
| 486 | 404 |
| 487 core_->SetReceiveBufferSize(size); | 405 core_->SetReceiveBufferSize(size); |
| 488 return false; | 406 return false; |
| 489 } | 407 } |
| 490 | 408 |
| 491 bool PseudoTcpAdapter::SetSendBufferSize(int32 size) { | 409 bool PseudoTcpAdapter::SetSendBufferSize(int32 size) { |
| 492 DCHECK(CalledOnValidThread()); | 410 DCHECK(CalledOnValidThread()); |
| 493 | 411 |
| 494 core_->SetSendBufferSize(size); | 412 core_->SetSendBufferSize(size); |
| 495 return false; | 413 return false; |
| 496 } | 414 } |
| 497 | 415 |
| 498 int PseudoTcpAdapter::Connect(net::OldCompletionCallback* callback) { | |
| 499 DCHECK(CalledOnValidThread()); | |
| 500 | |
| 501 // net::StreamSocket requires that Connect return OK if already connected. | |
| 502 if (IsConnected()) | |
| 503 return net::OK; | |
| 504 | |
| 505 return core_->Connect(callback); | |
| 506 } | |
| 507 | |
| 508 int PseudoTcpAdapter::Connect(const net::CompletionCallback& callback) { | 416 int PseudoTcpAdapter::Connect(const net::CompletionCallback& callback) { |
| 509 DCHECK(CalledOnValidThread()); | 417 DCHECK(CalledOnValidThread()); |
| 510 | 418 |
| 511 // net::StreamSocket requires that Connect return OK if already connected. | 419 // net::StreamSocket requires that Connect return OK if already connected. |
| 512 if (IsConnected()) | 420 if (IsConnected()) |
| 513 return net::OK; | 421 return net::OK; |
| 514 | 422 |
| 515 return core_->Connect(callback); | 423 return core_->Connect(callback); |
| 516 } | 424 } |
| 517 | 425 |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 586 DCHECK(CalledOnValidThread()); | 494 DCHECK(CalledOnValidThread()); |
| 587 core_->SetAckDelay(delay_ms); | 495 core_->SetAckDelay(delay_ms); |
| 588 } | 496 } |
| 589 | 497 |
| 590 void PseudoTcpAdapter::SetNoDelay(bool no_delay) { | 498 void PseudoTcpAdapter::SetNoDelay(bool no_delay) { |
| 591 DCHECK(CalledOnValidThread()); | 499 DCHECK(CalledOnValidThread()); |
| 592 core_->SetNoDelay(no_delay); | 500 core_->SetNoDelay(no_delay); |
| 593 } | 501 } |
| 594 | 502 |
| 595 } // namespace jingle_glue | 503 } // namespace jingle_glue |
| OLD | NEW |