Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(204)

Side by Side Diff: jingle/glue/pseudotcp_adapter.cc

Issue 8831001: base::Bind: Convert Socket::Write. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix alignment. Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « jingle/glue/pseudotcp_adapter.h ('k') | jingle/glue/pseudotcp_adapter_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « jingle/glue/pseudotcp_adapter.h ('k') | jingle/glue/pseudotcp_adapter_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698