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

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

Issue 8824006: Migrate net/socket/socket.h, net/socket/stream_socket.h to base::Bind(). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: small win fix 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
csilv 2011/12/09 00:42:00 nit: include base/bind.h, base/bind_helpers.h
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"
11 #include "net/base/completion_callback.h" 11 #include "net/base/completion_callback.h"
12 #include "net/base/io_buffer.h" 12 #include "net/base/io_buffer.h"
13 #include "net/base/net_errors.h" 13 #include "net/base/net_errors.h"
14 #include "net/base/net_util.h" 14 #include "net/base/net_util.h"
15 15
16 using cricket::PseudoTcp; 16 using cricket::PseudoTcp;
17 17
18 namespace { 18 namespace {
19 const int kReadBufferSize = 65536; // Maximum size of a packet. 19 const int kReadBufferSize = 65536; // Maximum size of a packet.
20 const uint16 kDefaultMtu = 1280; 20 const uint16 kDefaultMtu = 1280;
21 } // namespace 21 } // namespace
22 22
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698