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