OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/chrome_async_socket.h" | 5 #include "jingle/glue/chrome_async_socket.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <algorithm> | 8 #include <algorithm> |
9 #include <cstdlib> | 9 #include <cstdlib> |
10 #include <cstring> | 10 #include <cstring> |
11 #include <utility> | 11 #include <utility> |
12 | 12 |
13 #include "base/bind.h" | 13 #include "base/bind.h" |
14 #include "base/compiler_specific.h" | 14 #include "base/compiler_specific.h" |
15 #include "base/logging.h" | 15 #include "base/logging.h" |
16 #include "base/message_loop/message_loop.h" | 16 #include "base/message_loop/message_loop.h" |
17 #include "base/single_thread_task_runner.h" | |
17 #include "jingle/glue/resolving_client_socket_factory.h" | 18 #include "jingle/glue/resolving_client_socket_factory.h" |
18 #include "net/base/address_list.h" | 19 #include "net/base/address_list.h" |
19 #include "net/base/host_port_pair.h" | 20 #include "net/base/host_port_pair.h" |
20 #include "net/base/io_buffer.h" | 21 #include "net/base/io_buffer.h" |
21 #include "net/socket/client_socket_handle.h" | 22 #include "net/socket/client_socket_handle.h" |
22 #include "net/socket/ssl_client_socket.h" | 23 #include "net/socket/ssl_client_socket.h" |
23 #include "net/socket/tcp_client_socket.h" | 24 #include "net/socket/tcp_client_socket.h" |
24 #include "net/ssl/ssl_config_service.h" | 25 #include "net/ssl/ssl_config_service.h" |
25 #include "third_party/webrtc/base/socketaddress.h" | 26 #include "third_party/webrtc/base/socketaddress.h" |
26 | 27 |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
112 int status = transport_socket_->Connect( | 113 int status = transport_socket_->Connect( |
113 base::Bind(&ChromeAsyncSocket::ProcessConnectDone, | 114 base::Bind(&ChromeAsyncSocket::ProcessConnectDone, |
114 weak_ptr_factory_.GetWeakPtr())); | 115 weak_ptr_factory_.GetWeakPtr())); |
115 if (status != net::ERR_IO_PENDING) { | 116 if (status != net::ERR_IO_PENDING) { |
116 // We defer execution of ProcessConnectDone instead of calling it | 117 // We defer execution of ProcessConnectDone instead of calling it |
117 // directly here as the caller may not expect an error/close to | 118 // directly here as the caller may not expect an error/close to |
118 // happen here. This is okay, as from the caller's point of view, | 119 // happen here. This is okay, as from the caller's point of view, |
119 // the connect always happens asynchronously. | 120 // the connect always happens asynchronously. |
120 base::MessageLoop* message_loop = base::MessageLoop::current(); | 121 base::MessageLoop* message_loop = base::MessageLoop::current(); |
121 CHECK(message_loop); | 122 CHECK(message_loop); |
122 message_loop->PostTask( | 123 message_loop->task_runner()->PostTask( |
Sergey Ulanov
2016/06/22 17:42:29
Shouldn't this be ThreadTaskRunnerHandle::get()->P
fdoray
2016/06/22 17:48:06
Done. My script wasn't smart enough for this :)
| |
123 FROM_HERE, | 124 FROM_HERE, base::Bind(&ChromeAsyncSocket::ProcessConnectDone, |
124 base::Bind(&ChromeAsyncSocket::ProcessConnectDone, | 125 weak_ptr_factory_.GetWeakPtr(), status)); |
125 weak_ptr_factory_.GetWeakPtr(), status)); | |
126 } | 126 } |
127 return true; | 127 return true; |
128 } | 128 } |
129 | 129 |
130 // STATE_CONNECTING -> STATE_OPEN | 130 // STATE_CONNECTING -> STATE_OPEN |
131 // read_state_ == IDLE -> read_state_ == POSTED (via PostDoRead()) | 131 // read_state_ == IDLE -> read_state_ == POSTED (via PostDoRead()) |
132 | 132 |
133 void ChromeAsyncSocket::ProcessConnectDone(int status) { | 133 void ChromeAsyncSocket::ProcessConnectDone(int status) { |
134 DCHECK_NE(status, net::ERR_IO_PENDING); | 134 DCHECK_NE(status, net::ERR_IO_PENDING); |
135 DCHECK_EQ(read_state_, IDLE); | 135 DCHECK_EQ(read_state_, IDLE); |
(...skipping 13 matching lines...) Expand all Loading... | |
149 | 149 |
150 // read_state_ == IDLE -> read_state_ == POSTED | 150 // read_state_ == IDLE -> read_state_ == POSTED |
151 | 151 |
152 void ChromeAsyncSocket::PostDoRead() { | 152 void ChromeAsyncSocket::PostDoRead() { |
153 DCHECK(IsOpen()); | 153 DCHECK(IsOpen()); |
154 DCHECK_EQ(read_state_, IDLE); | 154 DCHECK_EQ(read_state_, IDLE); |
155 DCHECK_EQ(read_start_, 0U); | 155 DCHECK_EQ(read_start_, 0U); |
156 DCHECK_EQ(read_end_, 0U); | 156 DCHECK_EQ(read_end_, 0U); |
157 base::MessageLoop* message_loop = base::MessageLoop::current(); | 157 base::MessageLoop* message_loop = base::MessageLoop::current(); |
158 CHECK(message_loop); | 158 CHECK(message_loop); |
159 message_loop->PostTask( | 159 message_loop->task_runner()->PostTask( |
160 FROM_HERE, | 160 FROM_HERE, |
161 base::Bind(&ChromeAsyncSocket::DoRead, | 161 base::Bind(&ChromeAsyncSocket::DoRead, weak_ptr_factory_.GetWeakPtr())); |
162 weak_ptr_factory_.GetWeakPtr())); | |
163 read_state_ = POSTED; | 162 read_state_ = POSTED; |
164 } | 163 } |
165 | 164 |
166 // read_state_ == POSTED -> read_state_ == PENDING | 165 // read_state_ == POSTED -> read_state_ == PENDING |
167 | 166 |
168 void ChromeAsyncSocket::DoRead() { | 167 void ChromeAsyncSocket::DoRead() { |
169 DCHECK(IsOpen()); | 168 DCHECK(IsOpen()); |
170 DCHECK_EQ(read_state_, POSTED); | 169 DCHECK_EQ(read_state_, POSTED); |
171 DCHECK_EQ(read_start_, 0U); | 170 DCHECK_EQ(read_start_, 0U); |
172 DCHECK_EQ(read_end_, 0U); | 171 DCHECK_EQ(read_end_, 0U); |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
283 } | 282 } |
284 | 283 |
285 // write_state_ == IDLE -> write_state_ == POSTED | 284 // write_state_ == IDLE -> write_state_ == POSTED |
286 | 285 |
287 void ChromeAsyncSocket::PostDoWrite() { | 286 void ChromeAsyncSocket::PostDoWrite() { |
288 DCHECK(IsOpen()); | 287 DCHECK(IsOpen()); |
289 DCHECK_EQ(write_state_, IDLE); | 288 DCHECK_EQ(write_state_, IDLE); |
290 DCHECK_GT(write_end_, 0U); | 289 DCHECK_GT(write_end_, 0U); |
291 base::MessageLoop* message_loop = base::MessageLoop::current(); | 290 base::MessageLoop* message_loop = base::MessageLoop::current(); |
292 CHECK(message_loop); | 291 CHECK(message_loop); |
293 message_loop->PostTask( | 292 message_loop->task_runner()->PostTask( |
294 FROM_HERE, | 293 FROM_HERE, |
295 base::Bind(&ChromeAsyncSocket::DoWrite, | 294 base::Bind(&ChromeAsyncSocket::DoWrite, weak_ptr_factory_.GetWeakPtr())); |
296 weak_ptr_factory_.GetWeakPtr())); | |
297 write_state_ = POSTED; | 295 write_state_ = POSTED; |
298 } | 296 } |
299 | 297 |
300 // write_state_ == POSTED -> write_state_ == PENDING | 298 // write_state_ == POSTED -> write_state_ == PENDING |
301 | 299 |
302 void ChromeAsyncSocket::DoWrite() { | 300 void ChromeAsyncSocket::DoWrite() { |
303 DCHECK(IsOpen()); | 301 DCHECK(IsOpen()); |
304 DCHECK_EQ(write_state_, POSTED); | 302 DCHECK_EQ(write_state_, POSTED); |
305 DCHECK_GT(write_end_, 0U); | 303 DCHECK_GT(write_end_, 0U); |
306 // Once we call Write(), we cannot call StartTls() until the write | 304 // Once we call Write(), we cannot call StartTls() until the write |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
406 new net::ClientSocketHandle()); | 404 new net::ClientSocketHandle()); |
407 socket_handle->SetSocket(std::move(transport_socket_)); | 405 socket_handle->SetSocket(std::move(transport_socket_)); |
408 transport_socket_ = resolving_client_socket_factory_->CreateSSLClientSocket( | 406 transport_socket_ = resolving_client_socket_factory_->CreateSSLClientSocket( |
409 std::move(socket_handle), net::HostPortPair(domain_name, 443)); | 407 std::move(socket_handle), net::HostPortPair(domain_name, 443)); |
410 int status = transport_socket_->Connect( | 408 int status = transport_socket_->Connect( |
411 base::Bind(&ChromeAsyncSocket::ProcessSSLConnectDone, | 409 base::Bind(&ChromeAsyncSocket::ProcessSSLConnectDone, |
412 weak_ptr_factory_.GetWeakPtr())); | 410 weak_ptr_factory_.GetWeakPtr())); |
413 if (status != net::ERR_IO_PENDING) { | 411 if (status != net::ERR_IO_PENDING) { |
414 base::MessageLoop* message_loop = base::MessageLoop::current(); | 412 base::MessageLoop* message_loop = base::MessageLoop::current(); |
415 CHECK(message_loop); | 413 CHECK(message_loop); |
416 message_loop->PostTask( | 414 message_loop->task_runner()->PostTask( |
417 FROM_HERE, | 415 FROM_HERE, base::Bind(&ChromeAsyncSocket::ProcessSSLConnectDone, |
418 base::Bind(&ChromeAsyncSocket::ProcessSSLConnectDone, | 416 weak_ptr_factory_.GetWeakPtr(), status)); |
419 weak_ptr_factory_.GetWeakPtr(), status)); | |
420 } | 417 } |
421 return true; | 418 return true; |
422 } | 419 } |
423 | 420 |
424 // STATE_TLS_CONNECTING -> STATE_TLS_OPEN | 421 // STATE_TLS_CONNECTING -> STATE_TLS_OPEN |
425 // read_state_ == IDLE -> read_state_ == POSTED (via PostDoRead()) | 422 // read_state_ == IDLE -> read_state_ == POSTED (via PostDoRead()) |
426 // (maybe) write_state_ == IDLE -> write_state_ == POSTED (via | 423 // (maybe) write_state_ == IDLE -> write_state_ == POSTED (via |
427 // PostDoWrite()) | 424 // PostDoWrite()) |
428 | 425 |
429 void ChromeAsyncSocket::ProcessSSLConnectDone(int status) { | 426 void ChromeAsyncSocket::ProcessSSLConnectDone(int status) { |
(...skipping 10 matching lines...) Expand all Loading... | |
440 } | 437 } |
441 state_ = STATE_TLS_OPEN; | 438 state_ = STATE_TLS_OPEN; |
442 PostDoRead(); | 439 PostDoRead(); |
443 if (write_end_ > 0U) { | 440 if (write_end_ > 0U) { |
444 PostDoWrite(); | 441 PostDoWrite(); |
445 } | 442 } |
446 SignalSSLConnected(); | 443 SignalSSLConnected(); |
447 } | 444 } |
448 | 445 |
449 } // namespace jingle_glue | 446 } // namespace jingle_glue |
OLD | NEW |