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

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

Issue 8801004: base::Bind: Convert StreamSocket::Connect. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Build fixes. 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
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 16 matching lines...) Expand all
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); 33 net::OldCompletionCallback* callback);
34 int Write(net::IOBuffer* buffer, int buffer_size, 34 int Write(net::IOBuffer* buffer, int buffer_size,
35 net::OldCompletionCallback* callback); 35 net::OldCompletionCallback* callback);
36 int Connect(net::OldCompletionCallback* callback); 36 int Connect(net::OldCompletionCallback* callback);
37 int Connect(const net::CompletionCallback& callback);
37 void Disconnect(); 38 void Disconnect();
38 bool IsConnected() const; 39 bool IsConnected() const;
39 40
40 // cricket::IPseudoTcpNotify interface. 41 // cricket::IPseudoTcpNotify interface.
41 // These notifications are triggered from NotifyPacket. 42 // These notifications are triggered from NotifyPacket.
42 virtual void OnTcpOpen(cricket::PseudoTcp* tcp) OVERRIDE; 43 virtual void OnTcpOpen(cricket::PseudoTcp* tcp) OVERRIDE;
43 virtual void OnTcpReadable(cricket::PseudoTcp* tcp) OVERRIDE; 44 virtual void OnTcpReadable(cricket::PseudoTcp* tcp) OVERRIDE;
44 virtual void OnTcpWriteable(cricket::PseudoTcp* tcp) OVERRIDE; 45 virtual void OnTcpWriteable(cricket::PseudoTcp* tcp) OVERRIDE;
45 // This is triggered by NotifyClock or NotifyPacket. 46 // This is triggered by NotifyClock or NotifyPacket.
46 virtual void OnTcpClosed(cricket::PseudoTcp* tcp, uint32 error) OVERRIDE; 47 virtual void OnTcpClosed(cricket::PseudoTcp* tcp, uint32 error) OVERRIDE;
(...skipping 14 matching lines...) Expand all
61 62
62 // These may trigger callbacks, so the holder must hold a reference on 63 // These may trigger callbacks, so the holder must hold a reference on
63 // the stack while calling them. 64 // the stack while calling them.
64 void DoReadFromSocket(); 65 void DoReadFromSocket();
65 void HandleReadResults(int result); 66 void HandleReadResults(int result);
66 void HandleTcpClock(); 67 void HandleTcpClock();
67 68
68 // This re-sets |timer| without triggering callbacks. 69 // This re-sets |timer| without triggering callbacks.
69 void AdjustClock(); 70 void AdjustClock();
70 71
71 net::OldCompletionCallback* connect_callback_; 72 net::OldCompletionCallback* old_connect_callback_;
73 net::CompletionCallback connect_callback_;
72 net::OldCompletionCallback* read_callback_; 74 net::OldCompletionCallback* read_callback_;
73 net::OldCompletionCallback* write_callback_; 75 net::OldCompletionCallback* write_callback_;
74 76
75 cricket::PseudoTcp pseudo_tcp_; 77 cricket::PseudoTcp pseudo_tcp_;
76 scoped_ptr<net::Socket> socket_; 78 scoped_ptr<net::Socket> socket_;
77 79
78 scoped_refptr<net::IOBuffer> read_buffer_; 80 scoped_refptr<net::IOBuffer> read_buffer_;
79 int read_buffer_size_; 81 int read_buffer_size_;
80 scoped_refptr<net::IOBuffer> write_buffer_; 82 scoped_refptr<net::IOBuffer> write_buffer_;
81 int write_buffer_size_; 83 int write_buffer_size_;
82 84
83 bool socket_write_pending_; 85 bool socket_write_pending_;
84 scoped_refptr<net::IOBuffer> socket_read_buffer_; 86 scoped_refptr<net::IOBuffer> socket_read_buffer_;
85 87
86 net::OldCompletionCallbackImpl<Core> socket_read_callback_; 88 net::OldCompletionCallbackImpl<Core> socket_read_callback_;
87 net::OldCompletionCallbackImpl<Core> socket_write_callback_; 89 net::OldCompletionCallbackImpl<Core> socket_write_callback_;
88 90
89 base::OneShotTimer<Core> timer_; 91 base::OneShotTimer<Core> timer_;
90 92
91 DISALLOW_COPY_AND_ASSIGN(Core); 93 DISALLOW_COPY_AND_ASSIGN(Core);
92 }; 94 };
93 95
94 96
95 PseudoTcpAdapter::Core::Core(net::Socket* socket) 97 PseudoTcpAdapter::Core::Core(net::Socket* socket)
96 : connect_callback_(NULL), 98 : old_connect_callback_(NULL),
97 read_callback_(NULL), 99 read_callback_(NULL),
98 write_callback_(NULL), 100 write_callback_(NULL),
99 ALLOW_THIS_IN_INITIALIZER_LIST(pseudo_tcp_(this, 0)), 101 ALLOW_THIS_IN_INITIALIZER_LIST(pseudo_tcp_(this, 0)),
100 socket_(socket), 102 socket_(socket),
101 socket_write_pending_(false), 103 socket_write_pending_(false),
102 ALLOW_THIS_IN_INITIALIZER_LIST( 104 ALLOW_THIS_IN_INITIALIZER_LIST(
103 socket_read_callback_(this, &PseudoTcpAdapter::Core::OnRead)), 105 socket_read_callback_(this, &PseudoTcpAdapter::Core::OnRead)),
104 ALLOW_THIS_IN_INITIALIZER_LIST( 106 ALLOW_THIS_IN_INITIALIZER_LIST(
105 socket_write_callback_(this, &PseudoTcpAdapter::Core::OnWritten)) { 107 socket_write_callback_(this, &PseudoTcpAdapter::Core::OnWritten)) {
106 // Doesn't trigger callbacks. 108 // Doesn't trigger callbacks.
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 // Reference the Core in case a callback deletes the adapter. 166 // Reference the Core in case a callback deletes the adapter.
165 scoped_refptr<Core> core(this); 167 scoped_refptr<Core> core(this);
166 168
167 // Start the connection attempt. 169 // Start the connection attempt.
168 int result = pseudo_tcp_.Connect(); 170 int result = pseudo_tcp_.Connect();
169 if (result < 0) 171 if (result < 0)
170 return net::ERR_FAILED; 172 return net::ERR_FAILED;
171 173
172 AdjustClock(); 174 AdjustClock();
173 175
176 old_connect_callback_ = callback;
177 connect_callback_.Reset();
178 DoReadFromSocket();
179
180 return net::ERR_IO_PENDING;
181 }
182
183 int PseudoTcpAdapter::Core::Connect(const net::CompletionCallback& callback) {
184 DCHECK_EQ(pseudo_tcp_.State(), cricket::PseudoTcp::TCP_LISTEN);
185
186 // Reference the Core in case a callback deletes the adapter.
187 scoped_refptr<Core> core(this);
188
189 // Start the connection attempt.
190 int result = pseudo_tcp_.Connect();
191 if (result < 0)
192 return net::ERR_FAILED;
193
194 AdjustClock();
195
196 old_connect_callback_ = NULL;
174 connect_callback_ = callback; 197 connect_callback_ = callback;
175 DoReadFromSocket(); 198 DoReadFromSocket();
176 199
177 return net::ERR_IO_PENDING; 200 return net::ERR_IO_PENDING;
178 } 201 }
179 202
180 void PseudoTcpAdapter::Core::Disconnect() { 203 void PseudoTcpAdapter::Core::Disconnect() {
181 // Don't dispatch outstanding callbacks, as mandated by net::StreamSocket. 204 // Don't dispatch outstanding callbacks, as mandated by net::StreamSocket.
182 read_callback_ = NULL; 205 read_callback_ = NULL;
183 read_buffer_ = NULL; 206 read_buffer_ = NULL;
184 write_callback_ = NULL; 207 write_callback_ = NULL;
185 write_buffer_ = NULL; 208 write_buffer_ = NULL;
186 connect_callback_ = NULL; 209 old_connect_callback_ = NULL;
210 connect_callback_.Reset();
187 211
188 // TODO(wez): Connect should succeed if called after Disconnect, which 212 // TODO(wez): Connect should succeed if called after Disconnect, which
189 // PseudoTcp doesn't support, so we need to teardown the internal PseudoTcp 213 // PseudoTcp doesn't support, so we need to teardown the internal PseudoTcp
190 // and create a new one in Connect. 214 // and create a new one in Connect.
191 // TODO(wez): Close sets a shutdown flag inside PseudoTcp but has no other 215 // TODO(wez): Close sets a shutdown flag inside PseudoTcp but has no other
192 // effect. This should be addressed in PseudoTcp, really. 216 // effect. This should be addressed in PseudoTcp, really.
193 // In the meantime we can fake OnTcpClosed notification and tear down the 217 // In the meantime we can fake OnTcpClosed notification and tear down the
194 // PseudoTcp. 218 // PseudoTcp.
195 pseudo_tcp_.Close(true); 219 pseudo_tcp_.Close(true);
196 } 220 }
197 221
198 bool PseudoTcpAdapter::Core::IsConnected() const { 222 bool PseudoTcpAdapter::Core::IsConnected() const {
199 return pseudo_tcp_.State() == PseudoTcp::TCP_ESTABLISHED; 223 return pseudo_tcp_.State() == PseudoTcp::TCP_ESTABLISHED;
200 } 224 }
201 225
202 void PseudoTcpAdapter::Core::OnTcpOpen(PseudoTcp* tcp) { 226 void PseudoTcpAdapter::Core::OnTcpOpen(PseudoTcp* tcp) {
203 DCHECK(tcp == &pseudo_tcp_); 227 DCHECK(tcp == &pseudo_tcp_);
204 228
205 if (connect_callback_) { 229 if (old_connect_callback_) {
206 net::OldCompletionCallback* callback = connect_callback_; 230 net::OldCompletionCallback* callback = old_connect_callback_;
207 connect_callback_ = NULL; 231 old_connect_callback_ = NULL;
208 callback->Run(net::OK); 232 callback->Run(net::OK);
233 } else if (!connect_callback_.is_null()) {
234 net::CompletionCallback callback = connect_callback_;
235 connect_callback_.Reset();
236 callback.Run(net::OK);
209 } 237 }
210 238
211 OnTcpReadable(tcp); 239 OnTcpReadable(tcp);
212 OnTcpWriteable(tcp); 240 OnTcpWriteable(tcp);
213 } 241 }
214 242
215 void PseudoTcpAdapter::Core::OnTcpReadable(PseudoTcp* tcp) { 243 void PseudoTcpAdapter::Core::OnTcpReadable(PseudoTcp* tcp) {
216 DCHECK_EQ(tcp, &pseudo_tcp_); 244 DCHECK_EQ(tcp, &pseudo_tcp_);
217 if (!read_callback_) 245 if (!read_callback_)
218 return; 246 return;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
250 278
251 net::OldCompletionCallback* callback = write_callback_; 279 net::OldCompletionCallback* callback = write_callback_;
252 write_callback_ = NULL; 280 write_callback_ = NULL;
253 write_buffer_ = NULL; 281 write_buffer_ = NULL;
254 callback->Run(result); 282 callback->Run(result);
255 } 283 }
256 284
257 void PseudoTcpAdapter::Core::OnTcpClosed(PseudoTcp* tcp, uint32 error) { 285 void PseudoTcpAdapter::Core::OnTcpClosed(PseudoTcp* tcp, uint32 error) {
258 DCHECK_EQ(tcp, &pseudo_tcp_); 286 DCHECK_EQ(tcp, &pseudo_tcp_);
259 287
260 if (connect_callback_) { 288 if (old_connect_callback_) {
261 net::OldCompletionCallback* callback = connect_callback_; 289 net::OldCompletionCallback* callback = old_connect_callback_;
262 connect_callback_ = NULL; 290 old_connect_callback_ = NULL;
263 callback->Run(net::MapSystemError(error)); 291 callback->Run(net::MapSystemError(error));
292 } else if (!connect_callback_.is_null()) {
293 net::CompletionCallback callback = connect_callback_;
294 connect_callback_.Reset();
295 callback.Run(net::MapSystemError(error));
264 } 296 }
265 297
266 if (read_callback_) { 298 if (read_callback_) {
267 net::OldCompletionCallback* callback = read_callback_; 299 net::OldCompletionCallback* callback = read_callback_;
268 read_callback_ = NULL; 300 read_callback_ = NULL;
269 callback->Run(net::MapSystemError(error)); 301 callback->Run(net::MapSystemError(error));
270 } 302 }
271 303
272 if (write_callback_) { 304 if (write_callback_) {
273 net::OldCompletionCallback* callback = write_callback_; 305 net::OldCompletionCallback* callback = write_callback_;
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
423 int PseudoTcpAdapter::Connect(net::OldCompletionCallback* callback) { 455 int PseudoTcpAdapter::Connect(net::OldCompletionCallback* callback) {
424 DCHECK(CalledOnValidThread()); 456 DCHECK(CalledOnValidThread());
425 457
426 // net::StreamSocket requires that Connect return OK if already connected. 458 // net::StreamSocket requires that Connect return OK if already connected.
427 if (IsConnected()) 459 if (IsConnected())
428 return net::OK; 460 return net::OK;
429 461
430 return core_->Connect(callback); 462 return core_->Connect(callback);
431 } 463 }
432 464
465 int PseudoTcpAdapter::Connect(const net::CompletionCallback& callback) {
466 DCHECK(CalledOnValidThread());
467
468 // net::StreamSocket requires that Connect return OK if already connected.
469 if (IsConnected())
470 return net::OK;
471
472 return core_->Connect(callback);
473 }
474
433 void PseudoTcpAdapter::Disconnect() { 475 void PseudoTcpAdapter::Disconnect() {
434 DCHECK(CalledOnValidThread()); 476 DCHECK(CalledOnValidThread());
435 core_->Disconnect(); 477 core_->Disconnect();
436 } 478 }
437 479
438 bool PseudoTcpAdapter::IsConnected() const { 480 bool PseudoTcpAdapter::IsConnected() const {
439 return core_->IsConnected(); 481 return core_->IsConnected();
440 } 482 }
441 483
442 bool PseudoTcpAdapter::IsConnectedAndIdle() const { 484 bool PseudoTcpAdapter::IsConnectedAndIdle() const {
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
501 DCHECK(CalledOnValidThread()); 543 DCHECK(CalledOnValidThread());
502 core_->SetAckDelay(delay_ms); 544 core_->SetAckDelay(delay_ms);
503 } 545 }
504 546
505 void PseudoTcpAdapter::SetNoDelay(bool no_delay) { 547 void PseudoTcpAdapter::SetNoDelay(bool no_delay) {
506 DCHECK(CalledOnValidThread()); 548 DCHECK(CalledOnValidThread());
507 core_->SetNoDelay(no_delay); 549 core_->SetNoDelay(no_delay);
508 } 550 }
509 551
510 } // namespace jingle_glue 552 } // namespace jingle_glue
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698