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 17 matching lines...) Expand all Loading... |
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); | 33 net::OldCompletionCallback* callback); |
34 int Read(net::IOBuffer* buffer, int buffer_size, | 34 int Read(net::IOBuffer* buffer, int buffer_size, |
35 const net::CompletionCallback& callback); | 35 const net::CompletionCallback& callback); |
36 int Write(net::IOBuffer* buffer, int buffer_size, | 36 int Write(net::IOBuffer* buffer, int buffer_size, |
37 net::OldCompletionCallback* callback); | 37 net::OldCompletionCallback* callback); |
| 38 int Write(net::IOBuffer* buffer, int buffer_size, |
| 39 const net::CompletionCallback& callback); |
38 int Connect(net::OldCompletionCallback* callback); | 40 int Connect(net::OldCompletionCallback* callback); |
39 int Connect(const net::CompletionCallback& callback); | 41 int Connect(const net::CompletionCallback& callback); |
40 void Disconnect(); | 42 void Disconnect(); |
41 bool IsConnected() const; | 43 bool IsConnected() const; |
42 | 44 |
43 // cricket::IPseudoTcpNotify interface. | 45 // cricket::IPseudoTcpNotify interface. |
44 // These notifications are triggered from NotifyPacket. | 46 // These notifications are triggered from NotifyPacket. |
45 virtual void OnTcpOpen(cricket::PseudoTcp* tcp) OVERRIDE; | 47 virtual void OnTcpOpen(cricket::PseudoTcp* tcp) OVERRIDE; |
46 virtual void OnTcpReadable(cricket::PseudoTcp* tcp) OVERRIDE; | 48 virtual void OnTcpReadable(cricket::PseudoTcp* tcp) OVERRIDE; |
47 virtual void OnTcpWriteable(cricket::PseudoTcp* tcp) OVERRIDE; | 49 virtual void OnTcpWriteable(cricket::PseudoTcp* tcp) OVERRIDE; |
(...skipping 20 matching lines...) Expand all Loading... |
68 void HandleReadResults(int result); | 70 void HandleReadResults(int result); |
69 void HandleTcpClock(); | 71 void HandleTcpClock(); |
70 | 72 |
71 // This re-sets |timer| without triggering callbacks. | 73 // This re-sets |timer| without triggering callbacks. |
72 void AdjustClock(); | 74 void AdjustClock(); |
73 | 75 |
74 net::OldCompletionCallback* old_connect_callback_; | 76 net::OldCompletionCallback* old_connect_callback_; |
75 net::CompletionCallback connect_callback_; | 77 net::CompletionCallback connect_callback_; |
76 net::OldCompletionCallback* old_read_callback_; | 78 net::OldCompletionCallback* old_read_callback_; |
77 net::CompletionCallback read_callback_; | 79 net::CompletionCallback read_callback_; |
78 net::OldCompletionCallback* write_callback_; | 80 net::OldCompletionCallback* old_write_callback_; |
| 81 net::CompletionCallback write_callback_; |
79 | 82 |
80 cricket::PseudoTcp pseudo_tcp_; | 83 cricket::PseudoTcp pseudo_tcp_; |
81 scoped_ptr<net::Socket> socket_; | 84 scoped_ptr<net::Socket> socket_; |
82 | 85 |
83 scoped_refptr<net::IOBuffer> read_buffer_; | 86 scoped_refptr<net::IOBuffer> read_buffer_; |
84 int read_buffer_size_; | 87 int read_buffer_size_; |
85 scoped_refptr<net::IOBuffer> write_buffer_; | 88 scoped_refptr<net::IOBuffer> write_buffer_; |
86 int write_buffer_size_; | 89 int write_buffer_size_; |
87 | 90 |
88 bool socket_write_pending_; | 91 bool socket_write_pending_; |
89 scoped_refptr<net::IOBuffer> socket_read_buffer_; | 92 scoped_refptr<net::IOBuffer> socket_read_buffer_; |
90 | 93 |
91 net::OldCompletionCallbackImpl<Core> socket_read_callback_; | 94 net::OldCompletionCallbackImpl<Core> socket_read_callback_; |
92 net::OldCompletionCallbackImpl<Core> socket_write_callback_; | 95 net::OldCompletionCallbackImpl<Core> socket_write_callback_; |
93 | 96 |
94 base::OneShotTimer<Core> timer_; | 97 base::OneShotTimer<Core> timer_; |
95 | 98 |
96 DISALLOW_COPY_AND_ASSIGN(Core); | 99 DISALLOW_COPY_AND_ASSIGN(Core); |
97 }; | 100 }; |
98 | 101 |
99 | 102 |
100 PseudoTcpAdapter::Core::Core(net::Socket* socket) | 103 PseudoTcpAdapter::Core::Core(net::Socket* socket) |
101 : old_connect_callback_(NULL), | 104 : old_connect_callback_(NULL), |
102 old_read_callback_(NULL), | 105 old_read_callback_(NULL), |
103 write_callback_(NULL), | 106 old_write_callback_(NULL), |
104 ALLOW_THIS_IN_INITIALIZER_LIST(pseudo_tcp_(this, 0)), | 107 ALLOW_THIS_IN_INITIALIZER_LIST(pseudo_tcp_(this, 0)), |
105 socket_(socket), | 108 socket_(socket), |
106 socket_write_pending_(false), | 109 socket_write_pending_(false), |
107 ALLOW_THIS_IN_INITIALIZER_LIST( | 110 ALLOW_THIS_IN_INITIALIZER_LIST( |
108 socket_read_callback_(this, &PseudoTcpAdapter::Core::OnRead)), | 111 socket_read_callback_(this, &PseudoTcpAdapter::Core::OnRead)), |
109 ALLOW_THIS_IN_INITIALIZER_LIST( | 112 ALLOW_THIS_IN_INITIALIZER_LIST( |
110 socket_write_callback_(this, &PseudoTcpAdapter::Core::OnWritten)) { | 113 socket_write_callback_(this, &PseudoTcpAdapter::Core::OnWritten)) { |
111 // Doesn't trigger callbacks. | 114 // Doesn't trigger callbacks. |
112 pseudo_tcp_.NotifyMTU(kDefaultMtu); | 115 pseudo_tcp_.NotifyMTU(kDefaultMtu); |
113 } | 116 } |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
157 read_callback_ = callback; | 160 read_callback_ = callback; |
158 } | 161 } |
159 | 162 |
160 AdjustClock(); | 163 AdjustClock(); |
161 | 164 |
162 return result; | 165 return result; |
163 } | 166 } |
164 | 167 |
165 int PseudoTcpAdapter::Core::Write(net::IOBuffer* buffer, int buffer_size, | 168 int PseudoTcpAdapter::Core::Write(net::IOBuffer* buffer, int buffer_size, |
166 net::OldCompletionCallback* callback) { | 169 net::OldCompletionCallback* callback) { |
167 DCHECK(!write_callback_); | 170 DCHECK(!old_write_callback_ && write_callback_.is_null()); |
168 | 171 |
169 // Reference the Core in case a callback deletes the adapter. | 172 // Reference the Core in case a callback deletes the adapter. |
170 scoped_refptr<Core> core(this); | 173 scoped_refptr<Core> core(this); |
| 174 |
| 175 int result = pseudo_tcp_.Send(buffer->data(), buffer_size); |
| 176 if (result < 0) { |
| 177 result = net::MapSystemError(pseudo_tcp_.GetError()); |
| 178 DCHECK(result < 0); |
| 179 } |
| 180 |
| 181 if (result == net::ERR_IO_PENDING) { |
| 182 write_buffer_ = buffer; |
| 183 write_buffer_size_ = buffer_size; |
| 184 old_write_callback_ = callback; |
| 185 } |
| 186 |
| 187 AdjustClock(); |
| 188 |
| 189 return result; |
| 190 } |
| 191 int PseudoTcpAdapter::Core::Write(net::IOBuffer* buffer, int buffer_size, |
| 192 const net::CompletionCallback& callback) { |
| 193 DCHECK(!old_write_callback_ && write_callback_.is_null()); |
| 194 |
| 195 // Reference the Core in case a callback deletes the adapter. |
| 196 scoped_refptr<Core> core(this); |
171 | 197 |
172 int result = pseudo_tcp_.Send(buffer->data(), buffer_size); | 198 int result = pseudo_tcp_.Send(buffer->data(), buffer_size); |
173 if (result < 0) { | 199 if (result < 0) { |
174 result = net::MapSystemError(pseudo_tcp_.GetError()); | 200 result = net::MapSystemError(pseudo_tcp_.GetError()); |
175 DCHECK(result < 0); | 201 DCHECK(result < 0); |
176 } | 202 } |
177 | 203 |
178 if (result == net::ERR_IO_PENDING) { | 204 if (result == net::ERR_IO_PENDING) { |
179 write_buffer_ = buffer; | 205 write_buffer_ = buffer; |
180 write_buffer_size_ = buffer_size; | 206 write_buffer_size_ = buffer_size; |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
224 DoReadFromSocket(); | 250 DoReadFromSocket(); |
225 | 251 |
226 return net::ERR_IO_PENDING; | 252 return net::ERR_IO_PENDING; |
227 } | 253 } |
228 | 254 |
229 void PseudoTcpAdapter::Core::Disconnect() { | 255 void PseudoTcpAdapter::Core::Disconnect() { |
230 // Don't dispatch outstanding callbacks, as mandated by net::StreamSocket. | 256 // Don't dispatch outstanding callbacks, as mandated by net::StreamSocket. |
231 old_read_callback_ = NULL; | 257 old_read_callback_ = NULL; |
232 read_callback_.Reset(); | 258 read_callback_.Reset(); |
233 read_buffer_ = NULL; | 259 read_buffer_ = NULL; |
234 write_callback_ = NULL; | 260 old_write_callback_ = NULL; |
| 261 write_callback_.Reset(); |
235 write_buffer_ = NULL; | 262 write_buffer_ = NULL; |
236 old_connect_callback_ = NULL; | 263 old_connect_callback_ = NULL; |
237 connect_callback_.Reset(); | 264 connect_callback_.Reset(); |
238 | 265 |
239 // TODO(wez): Connect should succeed if called after Disconnect, which | 266 // TODO(wez): Connect should succeed if called after Disconnect, which |
240 // PseudoTcp doesn't support, so we need to teardown the internal PseudoTcp | 267 // PseudoTcp doesn't support, so we need to teardown the internal PseudoTcp |
241 // and create a new one in Connect. | 268 // and create a new one in Connect. |
242 // TODO(wez): Close sets a shutdown flag inside PseudoTcp but has no other | 269 // TODO(wez): Close sets a shutdown flag inside PseudoTcp but has no other |
243 // effect. This should be addressed in PseudoTcp, really. | 270 // effect. This should be addressed in PseudoTcp, really. |
244 // In the meantime we can fake OnTcpClosed notification and tear down the | 271 // In the meantime we can fake OnTcpClosed notification and tear down the |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
290 } else { | 317 } else { |
291 net::CompletionCallback callback = read_callback_; | 318 net::CompletionCallback callback = read_callback_; |
292 read_callback_.Reset(); | 319 read_callback_.Reset(); |
293 read_buffer_ = NULL; | 320 read_buffer_ = NULL; |
294 callback.Run(result); | 321 callback.Run(result); |
295 } | 322 } |
296 } | 323 } |
297 | 324 |
298 void PseudoTcpAdapter::Core::OnTcpWriteable(PseudoTcp* tcp) { | 325 void PseudoTcpAdapter::Core::OnTcpWriteable(PseudoTcp* tcp) { |
299 DCHECK_EQ(tcp, &pseudo_tcp_); | 326 DCHECK_EQ(tcp, &pseudo_tcp_); |
300 if (!write_callback_) | 327 if (!old_write_callback_ && write_callback_.is_null()) |
301 return; | 328 return; |
302 | 329 |
303 int result = pseudo_tcp_.Send(write_buffer_->data(), write_buffer_size_); | 330 int result = pseudo_tcp_.Send(write_buffer_->data(), write_buffer_size_); |
304 if (result < 0) { | 331 if (result < 0) { |
305 result = net::MapSystemError(pseudo_tcp_.GetError()); | 332 result = net::MapSystemError(pseudo_tcp_.GetError()); |
306 DCHECK(result < 0); | 333 DCHECK(result < 0); |
307 if (result == net::ERR_IO_PENDING) | 334 if (result == net::ERR_IO_PENDING) |
308 return; | 335 return; |
309 } | 336 } |
310 | 337 |
311 AdjustClock(); | 338 AdjustClock(); |
312 | 339 |
313 net::OldCompletionCallback* callback = write_callback_; | 340 if (old_write_callback_) { |
314 write_callback_ = NULL; | 341 net::OldCompletionCallback* callback = old_write_callback_; |
315 write_buffer_ = NULL; | 342 old_write_callback_ = NULL; |
316 callback->Run(result); | 343 write_buffer_ = NULL; |
| 344 callback->Run(result); |
| 345 } else { |
| 346 net::CompletionCallback callback = write_callback_; |
| 347 write_callback_.Reset(); |
| 348 write_buffer_ = NULL; |
| 349 callback.Run(result); |
| 350 } |
317 } | 351 } |
318 | 352 |
319 void PseudoTcpAdapter::Core::OnTcpClosed(PseudoTcp* tcp, uint32 error) { | 353 void PseudoTcpAdapter::Core::OnTcpClosed(PseudoTcp* tcp, uint32 error) { |
320 DCHECK_EQ(tcp, &pseudo_tcp_); | 354 DCHECK_EQ(tcp, &pseudo_tcp_); |
321 | 355 |
322 if (old_connect_callback_) { | 356 if (old_connect_callback_) { |
323 net::OldCompletionCallback* callback = old_connect_callback_; | 357 net::OldCompletionCallback* callback = old_connect_callback_; |
324 old_connect_callback_ = NULL; | 358 old_connect_callback_ = NULL; |
325 callback->Run(net::MapSystemError(error)); | 359 callback->Run(net::MapSystemError(error)); |
326 } else if (!connect_callback_.is_null()) { | 360 } else if (!connect_callback_.is_null()) { |
327 net::CompletionCallback callback = connect_callback_; | 361 net::CompletionCallback callback = connect_callback_; |
328 connect_callback_.Reset(); | 362 connect_callback_.Reset(); |
329 callback.Run(net::MapSystemError(error)); | 363 callback.Run(net::MapSystemError(error)); |
330 } | 364 } |
331 | 365 |
332 if (old_read_callback_) { | 366 if (old_read_callback_) { |
333 net::OldCompletionCallback* callback = old_read_callback_; | 367 net::OldCompletionCallback* callback = old_read_callback_; |
334 old_read_callback_ = NULL; | 368 old_read_callback_ = NULL; |
335 callback->Run(net::MapSystemError(error)); | 369 callback->Run(net::MapSystemError(error)); |
336 } else if (!read_callback_.is_null()) { | 370 } else if (!read_callback_.is_null()) { |
337 net::CompletionCallback callback = read_callback_; | 371 net::CompletionCallback callback = read_callback_; |
338 read_callback_.Reset(); | 372 read_callback_.Reset(); |
339 callback.Run(net::MapSystemError(error)); | 373 callback.Run(net::MapSystemError(error)); |
340 } | 374 } |
341 | 375 |
342 if (write_callback_) { | 376 if (old_write_callback_) { |
343 net::OldCompletionCallback* callback = write_callback_; | 377 net::OldCompletionCallback* callback = old_write_callback_; |
344 write_callback_ = NULL; | 378 old_write_callback_ = NULL; |
345 callback->Run(net::MapSystemError(error)); | 379 callback->Run(net::MapSystemError(error)); |
| 380 } else if (!write_callback_.is_null()) { |
| 381 net::CompletionCallback callback = write_callback_; |
| 382 write_callback_.Reset(); |
| 383 callback.Run(net::MapSystemError(error)); |
346 } | 384 } |
347 } | 385 } |
348 | 386 |
349 void PseudoTcpAdapter::Core::SetAckDelay(int delay_ms) { | 387 void PseudoTcpAdapter::Core::SetAckDelay(int delay_ms) { |
350 pseudo_tcp_.SetOption(cricket::PseudoTcp::OPT_ACKDELAY, delay_ms); | 388 pseudo_tcp_.SetOption(cricket::PseudoTcp::OPT_ACKDELAY, delay_ms); |
351 } | 389 } |
352 | 390 |
353 void PseudoTcpAdapter::Core::SetNoDelay(bool no_delay) { | 391 void PseudoTcpAdapter::Core::SetNoDelay(bool no_delay) { |
354 pseudo_tcp_.SetOption(cricket::PseudoTcp::OPT_NODELAY, no_delay ? 1 : 0); | 392 pseudo_tcp_.SetOption(cricket::PseudoTcp::OPT_NODELAY, no_delay ? 1 : 0); |
355 } | 393 } |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
473 const net::CompletionCallback& callback) { | 511 const net::CompletionCallback& callback) { |
474 DCHECK(CalledOnValidThread()); | 512 DCHECK(CalledOnValidThread()); |
475 return core_->Read(buffer, buffer_size, callback); | 513 return core_->Read(buffer, buffer_size, callback); |
476 } | 514 } |
477 | 515 |
478 int PseudoTcpAdapter::Write(net::IOBuffer* buffer, int buffer_size, | 516 int PseudoTcpAdapter::Write(net::IOBuffer* buffer, int buffer_size, |
479 net::OldCompletionCallback* callback) { | 517 net::OldCompletionCallback* callback) { |
480 DCHECK(CalledOnValidThread()); | 518 DCHECK(CalledOnValidThread()); |
481 return core_->Write(buffer, buffer_size, callback); | 519 return core_->Write(buffer, buffer_size, callback); |
482 } | 520 } |
| 521 int PseudoTcpAdapter::Write(net::IOBuffer* buffer, int buffer_size, |
| 522 const net::CompletionCallback& callback) { |
| 523 DCHECK(CalledOnValidThread()); |
| 524 return core_->Write(buffer, buffer_size, callback); |
| 525 } |
483 | 526 |
484 bool PseudoTcpAdapter::SetReceiveBufferSize(int32 size) { | 527 bool PseudoTcpAdapter::SetReceiveBufferSize(int32 size) { |
485 DCHECK(CalledOnValidThread()); | 528 DCHECK(CalledOnValidThread()); |
486 | 529 |
487 core_->SetReceiveBufferSize(size); | 530 core_->SetReceiveBufferSize(size); |
488 return false; | 531 return false; |
489 } | 532 } |
490 | 533 |
491 bool PseudoTcpAdapter::SetSendBufferSize(int32 size) { | 534 bool PseudoTcpAdapter::SetSendBufferSize(int32 size) { |
492 DCHECK(CalledOnValidThread()); | 535 DCHECK(CalledOnValidThread()); |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
586 DCHECK(CalledOnValidThread()); | 629 DCHECK(CalledOnValidThread()); |
587 core_->SetAckDelay(delay_ms); | 630 core_->SetAckDelay(delay_ms); |
588 } | 631 } |
589 | 632 |
590 void PseudoTcpAdapter::SetNoDelay(bool no_delay) { | 633 void PseudoTcpAdapter::SetNoDelay(bool no_delay) { |
591 DCHECK(CalledOnValidThread()); | 634 DCHECK(CalledOnValidThread()); |
592 core_->SetNoDelay(no_delay); | 635 core_->SetNoDelay(no_delay); |
593 } | 636 } |
594 | 637 |
595 } // namespace jingle_glue | 638 } // namespace jingle_glue |
OLD | NEW |