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

Side by Side Diff: extensions/browser/api/cast_channel/cast_socket.cc

Issue 2891923004: [cast_channel] Make cast_channel related files not depend on "cast_channel.h" (Closed)
Patch Set: fix windows compile errors Created 3 years, 6 months 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "extensions/browser/api/cast_channel/cast_socket.h" 5 #include "extensions/browser/api/cast_channel/cast_socket.h"
6 6
7 #include <stdlib.h> 7 #include <stdlib.h>
8 #include <string.h> 8 #include <string.h>
9 9
10 #include <utility> 10 #include <utility>
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 #include "net/socket/client_socket_handle.h" 43 #include "net/socket/client_socket_handle.h"
44 #include "net/socket/ssl_client_socket.h" 44 #include "net/socket/ssl_client_socket.h"
45 #include "net/socket/stream_socket.h" 45 #include "net/socket/stream_socket.h"
46 #include "net/socket/tcp_client_socket.h" 46 #include "net/socket/tcp_client_socket.h"
47 #include "net/ssl/ssl_config_service.h" 47 #include "net/ssl/ssl_config_service.h"
48 #include "net/ssl/ssl_info.h" 48 #include "net/ssl/ssl_info.h"
49 49
50 // Helper for logging data with remote host IP and authentication state. 50 // Helper for logging data with remote host IP and authentication state.
51 // Assumes |ip_endpoint_| of type net::IPEndPoint and |channel_auth_| of enum 51 // Assumes |ip_endpoint_| of type net::IPEndPoint and |channel_auth_| of enum
52 // type ChannelAuthType are available in the current scope. 52 // type ChannelAuthType are available in the current scope.
53 #define CONNECTION_INFO() \ 53 #define CONNECTION_INFO() \
54 "[" << ip_endpoint_.ToString() << ", auth=" << channel_auth_ << "] " 54 "[" << ip_endpoint_.ToString() \
55 << ", auth=" << ::cast_channel::ChannelAuthTypeToString(channel_auth_) \
56 << "] "
55 #define VLOG_WITH_CONNECTION(level) VLOG(level) << CONNECTION_INFO() 57 #define VLOG_WITH_CONNECTION(level) VLOG(level) << CONNECTION_INFO()
56 #define LOG_WITH_CONNECTION(level) LOG(level) << CONNECTION_INFO() 58 #define LOG_WITH_CONNECTION(level) LOG(level) << CONNECTION_INFO()
57 59
58 namespace extensions { 60 namespace extensions {
59 namespace api { 61 namespace api {
60 namespace cast_channel { 62 namespace cast_channel {
61 namespace { 63 namespace {
62 64
63 bool IsTerminalState(proto::ConnectionState state) { 65 bool IsTerminalState(proto::ConnectionState state) {
64 return state == proto::CONN_STATE_FINISHED || 66 return state == proto::CONN_STATE_FINISHED ||
(...skipping 13 matching lines...) Expand all
78 std::unique_ptr<Request>*, 80 std::unique_ptr<Request>*,
79 const net::NetLogWithSource&) override { 81 const net::NetLogWithSource&) override {
80 verify_result->Reset(); 82 verify_result->Reset();
81 verify_result->verified_cert = params.certificate(); 83 verify_result->verified_cert = params.certificate();
82 return net::OK; 84 return net::OK;
83 } 85 }
84 }; 86 };
85 87
86 } // namespace 88 } // namespace
87 89
90 using ChannelError = ::cast_channel::ChannelError;
91 using ChannelAuthType = ::cast_channel::ChannelAuthType;
92 using ReadyState = ::cast_channel::ReadyState;
93
88 CastSocketImpl::CastSocketImpl(const std::string& owner_extension_id, 94 CastSocketImpl::CastSocketImpl(const std::string& owner_extension_id,
89 const net::IPEndPoint& ip_endpoint, 95 const net::IPEndPoint& ip_endpoint,
90 ChannelAuthType channel_auth, 96 ChannelAuthType channel_auth,
91 net::NetLog* net_log, 97 net::NetLog* net_log,
92 const base::TimeDelta& timeout, 98 const base::TimeDelta& timeout,
93 bool keep_alive, 99 bool keep_alive,
94 const scoped_refptr<Logger>& logger, 100 const scoped_refptr<Logger>& logger,
95 uint64_t device_capabilities) 101 uint64_t device_capabilities)
96 : CastSocketImpl(owner_extension_id, 102 : CastSocketImpl(owner_extension_id,
97 ip_endpoint, 103 ip_endpoint,
(...skipping 20 matching lines...) Expand all
118 net_log_(net_log), 124 net_log_(net_log),
119 keep_alive_(keep_alive), 125 keep_alive_(keep_alive),
120 logger_(logger), 126 logger_(logger),
121 auth_context_(auth_context), 127 auth_context_(auth_context),
122 connect_timeout_(timeout), 128 connect_timeout_(timeout),
123 connect_timeout_timer_(new base::OneShotTimer), 129 connect_timeout_timer_(new base::OneShotTimer),
124 is_canceled_(false), 130 is_canceled_(false),
125 device_capabilities_(device_capabilities), 131 device_capabilities_(device_capabilities),
126 audio_only_(false), 132 audio_only_(false),
127 connect_state_(proto::CONN_STATE_START_CONNECT), 133 connect_state_(proto::CONN_STATE_START_CONNECT),
128 error_state_(CHANNEL_ERROR_NONE), 134 error_state_(ChannelError::NONE),
129 ready_state_(READY_STATE_NONE), 135 ready_state_(ReadyState::NONE),
130 auth_delegate_(nullptr) { 136 auth_delegate_(nullptr) {
131 DCHECK(net_log_); 137 DCHECK(net_log_);
132 net_log_source_.type = net::NetLogSourceType::SOCKET; 138 net_log_source_.type = net::NetLogSourceType::SOCKET;
133 net_log_source_.id = net_log_->NextID(); 139 net_log_source_.id = net_log_->NextID();
134 } 140 }
135 141
136 CastSocketImpl::~CastSocketImpl() { 142 CastSocketImpl::~CastSocketImpl() {
137 // Ensure that resources are freed but do not run pending callbacks that 143 // Ensure that resources are freed but do not run pending callbacks that
138 // would result in re-entrancy. 144 // would result in re-entrancy.
139 CloseInternal(); 145 CloseInternal();
140 146
141 if (!connect_callback_.is_null()) 147 if (!connect_callback_.is_null())
142 base::ResetAndReturn(&connect_callback_).Run(CHANNEL_ERROR_UNKNOWN); 148 base::ResetAndReturn(&connect_callback_).Run(ChannelError::UNKNOWN);
143 } 149 }
144 150
145 ReadyState CastSocketImpl::ready_state() const { 151 ReadyState CastSocketImpl::ready_state() const {
146 return ready_state_; 152 return ready_state_;
147 } 153 }
148 154
149 ChannelError CastSocketImpl::error_state() const { 155 ChannelError CastSocketImpl::error_state() const {
150 return error_state_; 156 return error_state_;
151 } 157 }
152 158
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 } 248 }
243 249
244 void CastSocketImpl::SetTransportForTesting( 250 void CastSocketImpl::SetTransportForTesting(
245 std::unique_ptr<CastTransport> transport) { 251 std::unique_ptr<CastTransport> transport) {
246 transport_ = std::move(transport); 252 transport_ = std::move(transport);
247 } 253 }
248 254
249 void CastSocketImpl::Connect(std::unique_ptr<CastTransport::Delegate> delegate, 255 void CastSocketImpl::Connect(std::unique_ptr<CastTransport::Delegate> delegate,
250 base::Callback<void(ChannelError)> callback) { 256 base::Callback<void(ChannelError)> callback) {
251 DCHECK(CalledOnValidThread()); 257 DCHECK(CalledOnValidThread());
252 VLOG_WITH_CONNECTION(1) << "Connect readyState = " << ready_state_; 258 VLOG_WITH_CONNECTION(1) << "Connect readyState = "
259 << ::cast_channel::ReadyStateToString(ready_state_);
253 DCHECK_EQ(proto::CONN_STATE_START_CONNECT, connect_state_); 260 DCHECK_EQ(proto::CONN_STATE_START_CONNECT, connect_state_);
254 261
255 delegate_ = std::move(delegate); 262 delegate_ = std::move(delegate);
256 263
257 if (ready_state_ != READY_STATE_NONE) { 264 if (ready_state_ != ReadyState::NONE) {
258 callback.Run(CHANNEL_ERROR_CONNECT_ERROR); 265 callback.Run(ChannelError::CONNECT_ERROR);
259 return; 266 return;
260 } 267 }
261 268
262 connect_callback_ = callback; 269 connect_callback_ = callback;
263 SetReadyState(READY_STATE_CONNECTING); 270 SetReadyState(ReadyState::CONNECTING);
264 SetConnectState(proto::CONN_STATE_TCP_CONNECT); 271 SetConnectState(proto::CONN_STATE_TCP_CONNECT);
265 272
266 // Set up connection timeout. 273 // Set up connection timeout.
267 if (connect_timeout_.InMicroseconds() > 0) { 274 if (connect_timeout_.InMicroseconds() > 0) {
268 DCHECK(connect_timeout_callback_.IsCancelled()); 275 DCHECK(connect_timeout_callback_.IsCancelled());
269 connect_timeout_callback_.Reset( 276 connect_timeout_callback_.Reset(
270 base::Bind(&CastSocketImpl::OnConnectTimeout, base::Unretained(this))); 277 base::Bind(&CastSocketImpl::OnConnectTimeout, base::Unretained(this)));
271 GetTimer()->Start(FROM_HERE, 278 GetTimer()->Start(FROM_HERE,
272 connect_timeout_, 279 connect_timeout_,
273 connect_timeout_callback_.callback()); 280 connect_timeout_callback_.callback());
274 } 281 }
275 282
276 DoConnectLoop(net::OK); 283 DoConnectLoop(net::OK);
277 } 284 }
278 285
279 CastTransport* CastSocketImpl::transport() const { 286 CastTransport* CastSocketImpl::transport() const {
280 return transport_.get(); 287 return transport_.get();
281 } 288 }
282 289
283 void CastSocketImpl::OnConnectTimeout() { 290 void CastSocketImpl::OnConnectTimeout() {
284 DCHECK(CalledOnValidThread()); 291 DCHECK(CalledOnValidThread());
285 // Stop all pending connection setup tasks and report back to the client. 292 // Stop all pending connection setup tasks and report back to the client.
286 is_canceled_ = true; 293 is_canceled_ = true;
287 VLOG_WITH_CONNECTION(1) << "Timeout while establishing a connection."; 294 VLOG_WITH_CONNECTION(1) << "Timeout while establishing a connection.";
288 SetErrorState(CHANNEL_ERROR_CONNECT_TIMEOUT); 295 SetErrorState(ChannelError::CONNECT_TIMEOUT);
289 DoConnectCallback(); 296 DoConnectCallback();
290 } 297 }
291 298
292 void CastSocketImpl::ResetConnectLoopCallback() { 299 void CastSocketImpl::ResetConnectLoopCallback() {
293 DCHECK(connect_loop_callback_.IsCancelled()); 300 DCHECK(connect_loop_callback_.IsCancelled());
294 connect_loop_callback_.Reset( 301 connect_loop_callback_.Reset(
295 base::Bind(&CastSocketImpl::DoConnectLoop, base::Unretained(this))); 302 base::Bind(&CastSocketImpl::DoConnectLoop, base::Unretained(this)));
296 } 303 }
297 304
298 void CastSocketImpl::PostTaskToStartConnectLoop(int result) { 305 void CastSocketImpl::PostTaskToStartConnectLoop(int result) {
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
342 case proto::CONN_STATE_AUTH_CHALLENGE_SEND_COMPLETE: 349 case proto::CONN_STATE_AUTH_CHALLENGE_SEND_COMPLETE:
343 rv = DoAuthChallengeSendComplete(rv); 350 rv = DoAuthChallengeSendComplete(rv);
344 break; 351 break;
345 case proto::CONN_STATE_AUTH_CHALLENGE_REPLY_COMPLETE: 352 case proto::CONN_STATE_AUTH_CHALLENGE_REPLY_COMPLETE:
346 rv = DoAuthChallengeReplyComplete(rv); 353 rv = DoAuthChallengeReplyComplete(rv);
347 DCHECK(IsTerminalState(connect_state_)); 354 DCHECK(IsTerminalState(connect_state_));
348 break; 355 break;
349 default: 356 default:
350 NOTREACHED() << "Unknown state in connect flow: " << state; 357 NOTREACHED() << "Unknown state in connect flow: " << state;
351 SetConnectState(proto::CONN_STATE_FINISHED); 358 SetConnectState(proto::CONN_STATE_FINISHED);
352 SetErrorState(CHANNEL_ERROR_UNKNOWN); 359 SetErrorState(ChannelError::UNKNOWN);
353 DoConnectCallback(); 360 DoConnectCallback();
354 return; 361 return;
355 } 362 }
356 } while (rv != net::ERR_IO_PENDING && !IsTerminalState(connect_state_)); 363 } while (rv != net::ERR_IO_PENDING && !IsTerminalState(connect_state_));
357 // Exit the state machine if an asynchronous network operation is pending 364 // Exit the state machine if an asynchronous network operation is pending
358 // or if the state machine is in the terminal "finished" state. 365 // or if the state machine is in the terminal "finished" state.
359 366
360 if (IsTerminalState(connect_state_)) { 367 if (IsTerminalState(connect_state_)) {
361 DCHECK_NE(rv, net::ERR_IO_PENDING); 368 DCHECK_NE(rv, net::ERR_IO_PENDING);
362 GetTimer()->Stop(); 369 GetTimer()->Stop();
(...skipping 16 matching lines...) Expand all
379 } 386 }
380 387
381 int CastSocketImpl::DoTcpConnectComplete(int connect_result) { 388 int CastSocketImpl::DoTcpConnectComplete(int connect_result) {
382 VLOG_WITH_CONNECTION(1) << "DoTcpConnectComplete: " << connect_result; 389 VLOG_WITH_CONNECTION(1) << "DoTcpConnectComplete: " << connect_result;
383 logger_->LogSocketEventWithRv(channel_id_, proto::TCP_SOCKET_CONNECT_COMPLETE, 390 logger_->LogSocketEventWithRv(channel_id_, proto::TCP_SOCKET_CONNECT_COMPLETE,
384 connect_result); 391 connect_result);
385 if (connect_result == net::OK) { 392 if (connect_result == net::OK) {
386 SetConnectState(proto::CONN_STATE_SSL_CONNECT); 393 SetConnectState(proto::CONN_STATE_SSL_CONNECT);
387 } else if (connect_result == net::ERR_CONNECTION_TIMED_OUT) { 394 } else if (connect_result == net::ERR_CONNECTION_TIMED_OUT) {
388 SetConnectState(proto::CONN_STATE_FINISHED); 395 SetConnectState(proto::CONN_STATE_FINISHED);
389 SetErrorState(CHANNEL_ERROR_CONNECT_TIMEOUT); 396 SetErrorState(ChannelError::CONNECT_TIMEOUT);
390 } else { 397 } else {
391 SetConnectState(proto::CONN_STATE_FINISHED); 398 SetConnectState(proto::CONN_STATE_FINISHED);
392 SetErrorState(CHANNEL_ERROR_CONNECT_ERROR); 399 SetErrorState(ChannelError::CONNECT_ERROR);
393 } 400 }
394 return connect_result; 401 return connect_result;
395 } 402 }
396 403
397 int CastSocketImpl::DoSslConnect() { 404 int CastSocketImpl::DoSslConnect() {
398 DCHECK(connect_loop_callback_.IsCancelled()); 405 DCHECK(connect_loop_callback_.IsCancelled());
399 VLOG_WITH_CONNECTION(1) << "DoSslConnect"; 406 VLOG_WITH_CONNECTION(1) << "DoSslConnect";
400 SetConnectState(proto::CONN_STATE_SSL_CONNECT_COMPLETE); 407 SetConnectState(proto::CONN_STATE_SSL_CONNECT_COMPLETE);
401 socket_ = CreateSslSocket(std::move(tcp_socket_)); 408 socket_ = CreateSslSocket(std::move(tcp_socket_));
402 409
403 int rv = socket_->Connect( 410 int rv = socket_->Connect(
404 base::Bind(&CastSocketImpl::DoConnectLoop, base::Unretained(this))); 411 base::Bind(&CastSocketImpl::DoConnectLoop, base::Unretained(this)));
405 logger_->LogSocketEventWithRv(channel_id_, proto::SSL_SOCKET_CONNECT, rv); 412 logger_->LogSocketEventWithRv(channel_id_, proto::SSL_SOCKET_CONNECT, rv);
406 return rv; 413 return rv;
407 } 414 }
408 415
409 int CastSocketImpl::DoSslConnectComplete(int result) { 416 int CastSocketImpl::DoSslConnectComplete(int result) {
410 logger_->LogSocketEventWithRv(channel_id_, proto::SSL_SOCKET_CONNECT_COMPLETE, 417 logger_->LogSocketEventWithRv(channel_id_, proto::SSL_SOCKET_CONNECT_COMPLETE,
411 result); 418 result);
412 VLOG_WITH_CONNECTION(1) << "DoSslConnectComplete: " << result; 419 VLOG_WITH_CONNECTION(1) << "DoSslConnectComplete: " << result;
413 if (result == net::OK) { 420 if (result == net::OK) {
414 peer_cert_ = ExtractPeerCert(); 421 peer_cert_ = ExtractPeerCert();
415 422
416 if (!peer_cert_) { 423 if (!peer_cert_) {
417 LOG_WITH_CONNECTION(WARNING) << "Could not extract peer cert."; 424 LOG_WITH_CONNECTION(WARNING) << "Could not extract peer cert.";
418 SetConnectState(proto::CONN_STATE_FINISHED); 425 SetConnectState(proto::CONN_STATE_FINISHED);
419 SetErrorState(CHANNEL_ERROR_AUTHENTICATION_ERROR); 426 SetErrorState(ChannelError::AUTHENTICATION_ERROR);
420 return net::ERR_CERT_INVALID; 427 return net::ERR_CERT_INVALID;
421 } 428 }
422 429
423 // SSL connection succeeded. 430 // SSL connection succeeded.
424 if (!transport_.get()) { 431 if (!transport_.get()) {
425 // Create a channel transport if one wasn't already set (e.g. by test 432 // Create a channel transport if one wasn't already set (e.g. by test
426 // code). 433 // code).
427 transport_.reset(new CastTransportImpl(this->socket_.get(), channel_id_, 434 transport_.reset(new CastTransportImpl(this->socket_.get(), channel_id_,
428 ip_endpoint_, channel_auth_, 435 ip_endpoint_, channel_auth_,
429 logger_)); 436 logger_));
430 } 437 }
431 auth_delegate_ = new AuthTransportDelegate(this); 438 auth_delegate_ = new AuthTransportDelegate(this);
432 transport_->SetReadDelegate(base::WrapUnique(auth_delegate_)); 439 transport_->SetReadDelegate(base::WrapUnique(auth_delegate_));
433 SetConnectState(proto::CONN_STATE_AUTH_CHALLENGE_SEND); 440 SetConnectState(proto::CONN_STATE_AUTH_CHALLENGE_SEND);
434 } else if (result == net::ERR_CONNECTION_TIMED_OUT) { 441 } else if (result == net::ERR_CONNECTION_TIMED_OUT) {
435 SetConnectState(proto::CONN_STATE_FINISHED); 442 SetConnectState(proto::CONN_STATE_FINISHED);
436 SetErrorState(CHANNEL_ERROR_CONNECT_TIMEOUT); 443 SetErrorState(ChannelError::CONNECT_TIMEOUT);
437 } else { 444 } else {
438 SetConnectState(proto::CONN_STATE_FINISHED); 445 SetConnectState(proto::CONN_STATE_FINISHED);
439 SetErrorState(CHANNEL_ERROR_AUTHENTICATION_ERROR); 446 SetErrorState(ChannelError::AUTHENTICATION_ERROR);
440 } 447 }
441 return result; 448 return result;
442 } 449 }
443 450
444 int CastSocketImpl::DoAuthChallengeSend() { 451 int CastSocketImpl::DoAuthChallengeSend() {
445 VLOG_WITH_CONNECTION(1) << "DoAuthChallengeSend"; 452 VLOG_WITH_CONNECTION(1) << "DoAuthChallengeSend";
446 SetConnectState(proto::CONN_STATE_AUTH_CHALLENGE_SEND_COMPLETE); 453 SetConnectState(proto::CONN_STATE_AUTH_CHALLENGE_SEND_COMPLETE);
447 454
448 CastMessage challenge_message; 455 CastMessage challenge_message;
449 CreateAuthChallengeMessage(&challenge_message, auth_context_); 456 CreateAuthChallengeMessage(&challenge_message, auth_context_);
450 VLOG_WITH_CONNECTION(1) << "Sending challenge: " 457 VLOG_WITH_CONNECTION(1) << "Sending challenge: "
451 << CastMessageToString(challenge_message); 458 << CastMessageToString(challenge_message);
452 459
453 ResetConnectLoopCallback(); 460 ResetConnectLoopCallback();
454 transport_->SendMessage(challenge_message, connect_loop_callback_.callback()); 461 transport_->SendMessage(challenge_message, connect_loop_callback_.callback());
455 462
456 // Always return IO_PENDING since the result is always asynchronous. 463 // Always return IO_PENDING since the result is always asynchronous.
457 return net::ERR_IO_PENDING; 464 return net::ERR_IO_PENDING;
458 } 465 }
459 466
460 int CastSocketImpl::DoAuthChallengeSendComplete(int result) { 467 int CastSocketImpl::DoAuthChallengeSendComplete(int result) {
461 VLOG_WITH_CONNECTION(1) << "DoAuthChallengeSendComplete: " << result; 468 VLOG_WITH_CONNECTION(1) << "DoAuthChallengeSendComplete: " << result;
462 if (result < 0) { 469 if (result < 0) {
463 SetConnectState(proto::CONN_STATE_ERROR); 470 SetConnectState(proto::CONN_STATE_ERROR);
464 SetErrorState(CHANNEL_ERROR_SOCKET_ERROR); 471 SetErrorState(ChannelError::CAST_SOCKET_ERROR);
465 logger_->LogSocketEventWithRv(channel_id_, 472 logger_->LogSocketEventWithRv(channel_id_,
466 proto::SEND_AUTH_CHALLENGE_FAILED, result); 473 proto::SEND_AUTH_CHALLENGE_FAILED, result);
467 return result; 474 return result;
468 } 475 }
469 transport_->Start(); 476 transport_->Start();
470 SetConnectState(proto::CONN_STATE_AUTH_CHALLENGE_REPLY_COMPLETE); 477 SetConnectState(proto::CONN_STATE_AUTH_CHALLENGE_REPLY_COMPLETE);
471 return net::ERR_IO_PENDING; 478 return net::ERR_IO_PENDING;
472 } 479 }
473 480
474 CastSocketImpl::AuthTransportDelegate::AuthTransportDelegate( 481 CastSocketImpl::AuthTransportDelegate::AuthTransportDelegate(
475 CastSocketImpl* socket) 482 CastSocketImpl* socket)
476 : socket_(socket), error_state_(CHANNEL_ERROR_NONE) { 483 : socket_(socket), error_state_(ChannelError::NONE) {
477 DCHECK(socket); 484 DCHECK(socket);
478 } 485 }
479 486
480 ChannelError CastSocketImpl::AuthTransportDelegate::error_state() const { 487 ChannelError CastSocketImpl::AuthTransportDelegate::error_state() const {
481 return error_state_; 488 return error_state_;
482 } 489 }
483 490
484 LastErrors CastSocketImpl::AuthTransportDelegate::last_errors() const { 491 LastErrors CastSocketImpl::AuthTransportDelegate::last_errors() const {
485 return last_errors_; 492 return last_errors_;
486 } 493 }
487 494
488 void CastSocketImpl::AuthTransportDelegate::OnError(ChannelError error_state) { 495 void CastSocketImpl::AuthTransportDelegate::OnError(ChannelError error_state) {
489 error_state_ = error_state; 496 error_state_ = error_state;
490 socket_->PostTaskToStartConnectLoop(net::ERR_CONNECTION_FAILED); 497 socket_->PostTaskToStartConnectLoop(net::ERR_CONNECTION_FAILED);
491 } 498 }
492 499
493 void CastSocketImpl::AuthTransportDelegate::OnMessage( 500 void CastSocketImpl::AuthTransportDelegate::OnMessage(
494 const CastMessage& message) { 501 const CastMessage& message) {
495 if (!IsAuthMessage(message)) { 502 if (!IsAuthMessage(message)) {
496 error_state_ = CHANNEL_ERROR_TRANSPORT_ERROR; 503 error_state_ = ChannelError::TRANSPORT_ERROR;
497 socket_->PostTaskToStartConnectLoop(net::ERR_INVALID_RESPONSE); 504 socket_->PostTaskToStartConnectLoop(net::ERR_INVALID_RESPONSE);
498 } else { 505 } else {
499 socket_->challenge_reply_.reset(new CastMessage(message)); 506 socket_->challenge_reply_.reset(new CastMessage(message));
500 socket_->PostTaskToStartConnectLoop(net::OK); 507 socket_->PostTaskToStartConnectLoop(net::OK);
501 } 508 }
502 } 509 }
503 510
504 void CastSocketImpl::AuthTransportDelegate::Start() { 511 void CastSocketImpl::AuthTransportDelegate::Start() {
505 } 512 }
506 513
507 int CastSocketImpl::DoAuthChallengeReplyComplete(int result) { 514 int CastSocketImpl::DoAuthChallengeReplyComplete(int result) {
508 VLOG_WITH_CONNECTION(1) << "DoAuthChallengeReplyComplete: " << result; 515 VLOG_WITH_CONNECTION(1) << "DoAuthChallengeReplyComplete: " << result;
509 516
510 if (auth_delegate_->error_state() != CHANNEL_ERROR_NONE) { 517 if (auth_delegate_->error_state() != ChannelError::NONE) {
511 SetErrorState(auth_delegate_->error_state()); 518 SetErrorState(auth_delegate_->error_state());
512 SetConnectState(proto::CONN_STATE_ERROR); 519 SetConnectState(proto::CONN_STATE_ERROR);
513 return net::ERR_CONNECTION_FAILED; 520 return net::ERR_CONNECTION_FAILED;
514 } 521 }
515 auth_delegate_ = nullptr; 522 auth_delegate_ = nullptr;
516 523
517 if (result < 0) { 524 if (result < 0) {
518 SetConnectState(proto::CONN_STATE_ERROR); 525 SetConnectState(proto::CONN_STATE_ERROR);
519 return result; 526 return result;
520 } 527 }
521 528
522 if (!VerifyChallengeReply()) { 529 if (!VerifyChallengeReply()) {
523 SetErrorState(CHANNEL_ERROR_AUTHENTICATION_ERROR); 530 SetErrorState(ChannelError::AUTHENTICATION_ERROR);
524 SetConnectState(proto::CONN_STATE_ERROR); 531 SetConnectState(proto::CONN_STATE_ERROR);
525 return net::ERR_CONNECTION_FAILED; 532 return net::ERR_CONNECTION_FAILED;
526 } 533 }
527 VLOG_WITH_CONNECTION(1) << "Auth challenge verification succeeded"; 534 VLOG_WITH_CONNECTION(1) << "Auth challenge verification succeeded";
528 535
529 SetConnectState(proto::CONN_STATE_FINISHED); 536 SetConnectState(proto::CONN_STATE_FINISHED);
530 return net::OK; 537 return net::OK;
531 } 538 }
532 539
533 void CastSocketImpl::DoConnectCallback() { 540 void CastSocketImpl::DoConnectCallback() {
534 VLOG(1) << "DoConnectCallback (error_state = " << error_state_ << ")"; 541 VLOG(1) << "DoConnectCallback (error_state = "
542 << ::cast_channel::ChannelErrorToString(error_state_) << ")";
535 if (connect_callback_.is_null()) { 543 if (connect_callback_.is_null()) {
536 DLOG(FATAL) << "Connection callback invoked multiple times."; 544 DLOG(FATAL) << "Connection callback invoked multiple times.";
537 return; 545 return;
538 } 546 }
539 547
540 if (error_state_ == CHANNEL_ERROR_NONE) { 548 if (error_state_ == ChannelError::NONE) {
541 SetReadyState(READY_STATE_OPEN); 549 SetReadyState(ReadyState::OPEN);
542 transport_->SetReadDelegate(std::move(delegate_)); 550 transport_->SetReadDelegate(std::move(delegate_));
543 } else { 551 } else {
544 CloseInternal(); 552 CloseInternal();
545 } 553 }
546 554
547 base::ResetAndReturn(&connect_callback_).Run(error_state_); 555 base::ResetAndReturn(&connect_callback_).Run(error_state_);
548 } 556 }
549 557
550 void CastSocketImpl::Close(const net::CompletionCallback& callback) { 558 void CastSocketImpl::Close(const net::CompletionCallback& callback) {
551 DCHECK(CalledOnValidThread()); 559 DCHECK(CalledOnValidThread());
552 CloseInternal(); 560 CloseInternal();
553 // Run this callback last. It may delete the socket. 561 // Run this callback last. It may delete the socket.
554 callback.Run(net::OK); 562 callback.Run(net::OK);
555 } 563 }
556 564
557 void CastSocketImpl::CloseInternal() { 565 void CastSocketImpl::CloseInternal() {
558 // TODO(mfoltz): Enforce this when CastChannelAPITest is rewritten to create 566 // TODO(mfoltz): Enforce this when CastChannelAPITest is rewritten to create
559 // and free sockets on the same thread. crbug.com/398242 567 // and free sockets on the same thread. crbug.com/398242
560 DCHECK(CalledOnValidThread()); 568 DCHECK(CalledOnValidThread());
561 if (ready_state_ == READY_STATE_CLOSED) { 569 if (ready_state_ == ReadyState::CLOSED) {
562 return; 570 return;
563 } 571 }
564 572
565 VLOG_WITH_CONNECTION(1) << "Close ReadyState = " << ready_state_; 573 VLOG_WITH_CONNECTION(1) << "Close ReadyState = "
574 << ::cast_channel::ReadyStateToString(ready_state_);
566 transport_.reset(); 575 transport_.reset();
567 tcp_socket_.reset(); 576 tcp_socket_.reset();
568 socket_.reset(); 577 socket_.reset();
569 transport_security_state_.reset(); 578 transport_security_state_.reset();
570 if (GetTimer()) { 579 if (GetTimer()) {
571 GetTimer()->Stop(); 580 GetTimer()->Stop();
572 } 581 }
573 582
574 // Cancel callbacks that we queued ourselves to re-enter the connect or read 583 // Cancel callbacks that we queued ourselves to re-enter the connect or read
575 // loops. 584 // loops.
576 connect_loop_callback_.Cancel(); 585 connect_loop_callback_.Cancel();
577 connect_timeout_callback_.Cancel(); 586 connect_timeout_callback_.Cancel();
578 SetReadyState(READY_STATE_CLOSED); 587 SetReadyState(ReadyState::CLOSED);
579 } 588 }
580 589
581 bool CastSocketImpl::CalledOnValidThread() const { 590 bool CastSocketImpl::CalledOnValidThread() const {
582 return thread_checker_.CalledOnValidThread(); 591 return thread_checker_.CalledOnValidThread();
583 } 592 }
584 593
585 base::Timer* CastSocketImpl::GetTimer() { 594 base::Timer* CastSocketImpl::GetTimer() {
586 return connect_timeout_timer_.get(); 595 return connect_timeout_timer_.get();
587 } 596 }
588 597
589 void CastSocketImpl::SetConnectState(proto::ConnectionState connect_state) { 598 void CastSocketImpl::SetConnectState(proto::ConnectionState connect_state) {
590 if (connect_state_ != connect_state) { 599 if (connect_state_ != connect_state) {
591 connect_state_ = connect_state; 600 connect_state_ = connect_state;
592 } 601 }
593 } 602 }
594 603
595 void CastSocketImpl::SetReadyState(ReadyState ready_state) { 604 void CastSocketImpl::SetReadyState(ReadyState ready_state) {
596 if (ready_state_ != ready_state) 605 if (ready_state_ != ready_state)
597 ready_state_ = ready_state; 606 ready_state_ = ready_state;
598 } 607 }
599 608
600 void CastSocketImpl::SetErrorState(ChannelError error_state) { 609 void CastSocketImpl::SetErrorState(ChannelError error_state) {
601 VLOG_WITH_CONNECTION(1) << "SetErrorState " << error_state; 610 VLOG_WITH_CONNECTION(1) << "SetErrorState "
602 DCHECK_EQ(CHANNEL_ERROR_NONE, error_state_); 611 << ::cast_channel::ChannelErrorToString(error_state);
612 DCHECK_EQ(ChannelError::NONE, error_state_);
603 error_state_ = error_state; 613 error_state_ = error_state;
604 delegate_->OnError(error_state_); 614 delegate_->OnError(error_state_);
605 } 615 }
606 616
607 } // namespace cast_channel 617 } // namespace cast_channel
608 } // namespace api 618 } // namespace api
609 } // namespace extensions 619 } // namespace extensions
610 #undef VLOG_WITH_CONNECTION 620 #undef VLOG_WITH_CONNECTION
OLDNEW
« no previous file with comments | « extensions/browser/api/cast_channel/cast_socket.h ('k') | extensions/browser/api/cast_channel/cast_socket_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698