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 // This file implements a standalone host process for Me2Me. | 5 // This file implements a standalone host process for Me2Me. |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/callback.h" | 10 #include "base/callback.h" |
(...skipping 26 matching lines...) Expand all Loading... |
37 #include "remoting/base/util.h" | 37 #include "remoting/base/util.h" |
38 #include "remoting/host/branding.h" | 38 #include "remoting/host/branding.h" |
39 #include "remoting/host/chromoting_host.h" | 39 #include "remoting/host/chromoting_host.h" |
40 #include "remoting/host/chromoting_host_context.h" | 40 #include "remoting/host/chromoting_host_context.h" |
41 #include "remoting/host/chromoting_messages.h" | 41 #include "remoting/host/chromoting_messages.h" |
42 #include "remoting/host/config_file_watcher.h" | 42 #include "remoting/host/config_file_watcher.h" |
43 #include "remoting/host/config_watcher.h" | 43 #include "remoting/host/config_watcher.h" |
44 #include "remoting/host/desktop_environment.h" | 44 #include "remoting/host/desktop_environment.h" |
45 #include "remoting/host/desktop_session_connector.h" | 45 #include "remoting/host/desktop_session_connector.h" |
46 #include "remoting/host/dns_blackhole_checker.h" | 46 #include "remoting/host/dns_blackhole_checker.h" |
| 47 #include "remoting/host/gcd_rest_client.h" |
| 48 #include "remoting/host/gcd_state_updater.h" |
47 #include "remoting/host/heartbeat_sender.h" | 49 #include "remoting/host/heartbeat_sender.h" |
48 #include "remoting/host/host_change_notification_listener.h" | 50 #include "remoting/host/host_change_notification_listener.h" |
49 #include "remoting/host/host_config.h" | 51 #include "remoting/host/host_config.h" |
50 #include "remoting/host/host_event_logger.h" | 52 #include "remoting/host/host_event_logger.h" |
51 #include "remoting/host/host_exit_codes.h" | 53 #include "remoting/host/host_exit_codes.h" |
52 #include "remoting/host/host_main.h" | 54 #include "remoting/host/host_main.h" |
53 #include "remoting/host/host_status_logger.h" | 55 #include "remoting/host/host_status_logger.h" |
54 #include "remoting/host/ipc_constants.h" | 56 #include "remoting/host/ipc_constants.h" |
55 #include "remoting/host/ipc_desktop_environment.h" | 57 #include "remoting/host/ipc_desktop_environment.h" |
56 #include "remoting/host/ipc_host_event_logger.h" | 58 #include "remoting/host/ipc_host_event_logger.h" |
57 #include "remoting/host/logging.h" | 59 #include "remoting/host/logging.h" |
58 #include "remoting/host/me2me_desktop_environment.h" | 60 #include "remoting/host/me2me_desktop_environment.h" |
59 #include "remoting/host/oauth_token_getter_impl.h" | 61 #include "remoting/host/oauth_token_getter_impl.h" |
60 #include "remoting/host/pairing_registry_delegate.h" | 62 #include "remoting/host/pairing_registry_delegate.h" |
61 #include "remoting/host/policy_watcher.h" | 63 #include "remoting/host/policy_watcher.h" |
62 #include "remoting/host/session_manager_factory.h" | 64 #include "remoting/host/session_manager_factory.h" |
63 #include "remoting/host/shutdown_watchdog.h" | 65 #include "remoting/host/shutdown_watchdog.h" |
64 #include "remoting/host/signaling_connector.h" | 66 #include "remoting/host/signaling_connector.h" |
65 #include "remoting/host/single_window_desktop_environment.h" | 67 #include "remoting/host/single_window_desktop_environment.h" |
66 #include "remoting/host/third_party_auth_config.h" | 68 #include "remoting/host/third_party_auth_config.h" |
67 #include "remoting/host/token_validator_factory_impl.h" | 69 #include "remoting/host/token_validator_factory_impl.h" |
68 #include "remoting/host/usage_stats_consent.h" | 70 #include "remoting/host/usage_stats_consent.h" |
69 #include "remoting/host/username.h" | 71 #include "remoting/host/username.h" |
70 #include "remoting/host/video_frame_recorder_host_extension.h" | 72 #include "remoting/host/video_frame_recorder_host_extension.h" |
71 #include "remoting/protocol/me2me_host_authenticator_factory.h" | 73 #include "remoting/protocol/me2me_host_authenticator_factory.h" |
72 #include "remoting/protocol/network_settings.h" | 74 #include "remoting/protocol/network_settings.h" |
73 #include "remoting/protocol/pairing_registry.h" | 75 #include "remoting/protocol/pairing_registry.h" |
74 #include "remoting/protocol/port_range.h" | 76 #include "remoting/protocol/port_range.h" |
75 #include "remoting/protocol/token_validator.h" | 77 #include "remoting/protocol/token_validator.h" |
| 78 #include "remoting/signaling/push_notification_subscriber.h" |
76 #include "remoting/signaling/xmpp_signal_strategy.h" | 79 #include "remoting/signaling/xmpp_signal_strategy.h" |
77 | 80 |
78 #if defined(OS_POSIX) | 81 #if defined(OS_POSIX) |
79 #include <signal.h> | 82 #include <signal.h> |
80 #include <sys/types.h> | 83 #include <sys/types.h> |
81 #include <unistd.h> | 84 #include <unistd.h> |
82 #include "base/file_descriptor_posix.h" | 85 #include "base/file_descriptor_posix.h" |
83 #include "remoting/host/pam_authorization_factory_posix.h" | 86 #include "remoting/host/pam_authorization_factory_posix.h" |
84 #include "remoting/host/posix/signal_handler.h" | 87 #include "remoting/host/posix/signal_handler.h" |
85 #endif // defined(OS_POSIX) | 88 #endif // defined(OS_POSIX) |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
298 IPC::PlatformFileForTransit unprivileged_key); | 301 IPC::PlatformFileForTransit unprivileged_key); |
299 #endif // defined(OS_WIN) | 302 #endif // defined(OS_WIN) |
300 | 303 |
301 // Crashes the process in response to a daemon's request. The daemon passes | 304 // Crashes the process in response to a daemon's request. The daemon passes |
302 // the location of the code that detected the fatal error resulted in this | 305 // the location of the code that detected the fatal error resulted in this |
303 // request. | 306 // request. |
304 void OnCrash(const std::string& function_name, | 307 void OnCrash(const std::string& function_name, |
305 const std::string& file_name, | 308 const std::string& file_name, |
306 const int& line_number); | 309 const int& line_number); |
307 | 310 |
| 311 bool using_gcd() { return !gcd_device_id_.empty(); } |
| 312 |
308 scoped_ptr<ChromotingHostContext> context_; | 313 scoped_ptr<ChromotingHostContext> context_; |
309 | 314 |
310 // Accessed on the UI thread. | 315 // Accessed on the UI thread. |
311 scoped_ptr<IPC::ChannelProxy> daemon_channel_; | 316 scoped_ptr<IPC::ChannelProxy> daemon_channel_; |
312 | 317 |
313 // XMPP server/remoting bot configuration (initialized from the command line). | 318 // XMPP server/remoting bot configuration (initialized from the command line). |
314 XmppSignalStrategy::XmppServerConfig xmpp_server_config_; | 319 XmppSignalStrategy::XmppServerConfig xmpp_server_config_; |
315 std::string directory_bot_jid_; | 320 std::string directory_bot_jid_; |
316 | 321 |
317 // Created on the UI thread but used from the network thread. | 322 // Created on the UI thread but used from the network thread. |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
350 ThirdPartyAuthConfig third_party_auth_config_; | 355 ThirdPartyAuthConfig third_party_auth_config_; |
351 bool enable_gnubby_auth_; | 356 bool enable_gnubby_auth_; |
352 | 357 |
353 // Boolean to change flow, where necessary, if we're | 358 // Boolean to change flow, where necessary, if we're |
354 // capturing a window instead of the entire desktop. | 359 // capturing a window instead of the entire desktop. |
355 bool enable_window_capture_; | 360 bool enable_window_capture_; |
356 | 361 |
357 // Used to specify which window to stream, if enabled. | 362 // Used to specify which window to stream, if enabled. |
358 webrtc::WindowId window_id_; | 363 webrtc::WindowId window_id_; |
359 | 364 |
360 // |heartbeat_sender_| and |signaling_connector_| have to be destroyed before | 365 // Must outlive |gcd_state_updater_| and |signaling_connector_|. |
361 // |signal_strategy_| because their destructors need to call | 366 scoped_ptr<OAuthTokenGetter> oauth_token_getter_; |
362 // signal_strategy_->RemoveListener(this) | 367 |
| 368 // Must outlive |signaling_connector_|, |gcd_subscriber_|, and |
| 369 // |heartbeat_sender_|. |
363 scoped_ptr<SignalStrategy> signal_strategy_; | 370 scoped_ptr<SignalStrategy> signal_strategy_; |
| 371 |
364 scoped_ptr<SignalingConnector> signaling_connector_; | 372 scoped_ptr<SignalingConnector> signaling_connector_; |
365 scoped_ptr<HeartbeatSender> heartbeat_sender_; | 373 scoped_ptr<HeartbeatSender> heartbeat_sender_; |
| 374 scoped_ptr<GcdStateUpdater> gcd_state_updater_; |
| 375 scoped_ptr<PushNotificationSubscriber> gcd_subscriber_; |
366 | 376 |
367 scoped_ptr<HostChangeNotificationListener> host_change_notification_listener_; | 377 scoped_ptr<HostChangeNotificationListener> host_change_notification_listener_; |
368 scoped_ptr<HostStatusLogger> host_status_logger_; | 378 scoped_ptr<HostStatusLogger> host_status_logger_; |
369 scoped_ptr<HostEventLogger> host_event_logger_; | 379 scoped_ptr<HostEventLogger> host_event_logger_; |
370 | 380 |
371 scoped_ptr<ChromotingHost> host_; | 381 scoped_ptr<ChromotingHost> host_; |
372 | 382 |
373 // Used to keep this HostProcess alive until it is shutdown. | 383 // Used to keep this HostProcess alive until it is shutdown. |
374 scoped_refptr<HostProcess> self_; | 384 scoped_refptr<HostProcess> self_; |
375 | 385 |
(...skipping 922 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1298 HOST_LOG << "Policy disables gnubby auth."; | 1308 HOST_LOG << "Policy disables gnubby auth."; |
1299 } | 1309 } |
1300 | 1310 |
1301 if (desktop_environment_factory_) | 1311 if (desktop_environment_factory_) |
1302 desktop_environment_factory_->SetEnableGnubbyAuth(enable_gnubby_auth_); | 1312 desktop_environment_factory_->SetEnableGnubbyAuth(enable_gnubby_auth_); |
1303 | 1313 |
1304 return true; | 1314 return true; |
1305 } | 1315 } |
1306 | 1316 |
1307 void HostProcess::InitializeSignaling() { | 1317 void HostProcess::InitializeSignaling() { |
1308 DCHECK(!host_id_.empty()); // |ApplyConfig| should already have been run. | 1318 DCHECK(!host_id_.empty()); // ApplyConfig() should already have been run. |
1309 DCHECK(!signal_strategy_); | 1319 DCHECK(!signal_strategy_); |
| 1320 DCHECK(!oauth_token_getter_); |
| 1321 DCHECK(!signaling_connector_); |
| 1322 DCHECK(!gcd_state_updater_); |
| 1323 DCHECK(!gcd_subscriber_); |
| 1324 DCHECK(!heartbeat_sender_); |
1310 | 1325 |
1311 // Create SignalStrategy. | 1326 // Create SignalStrategy. |
1312 XmppSignalStrategy* xmpp_signal_strategy = new XmppSignalStrategy( | 1327 XmppSignalStrategy* xmpp_signal_strategy = new XmppSignalStrategy( |
1313 net::ClientSocketFactory::GetDefaultFactory(), | 1328 net::ClientSocketFactory::GetDefaultFactory(), |
1314 context_->url_request_context_getter(), xmpp_server_config_); | 1329 context_->url_request_context_getter(), xmpp_server_config_); |
1315 signal_strategy_.reset(xmpp_signal_strategy); | 1330 signal_strategy_.reset(xmpp_signal_strategy); |
1316 | 1331 |
1317 // Create SignalingConnector. | 1332 // Create SignalingConnector. |
1318 scoped_ptr<DnsBlackholeChecker> dns_blackhole_checker(new DnsBlackholeChecker( | 1333 scoped_ptr<DnsBlackholeChecker> dns_blackhole_checker(new DnsBlackholeChecker( |
1319 context_->url_request_context_getter(), talkgadget_prefix_)); | 1334 context_->url_request_context_getter(), talkgadget_prefix_)); |
1320 scoped_ptr<OAuthTokenGetter::OAuthCredentials> oauth_credentials( | 1335 scoped_ptr<OAuthTokenGetter::OAuthCredentials> oauth_credentials( |
1321 new OAuthTokenGetter::OAuthCredentials(xmpp_server_config_.username, | 1336 new OAuthTokenGetter::OAuthCredentials(xmpp_server_config_.username, |
1322 oauth_refresh_token_, | 1337 oauth_refresh_token_, |
1323 use_service_account_)); | 1338 use_service_account_)); |
1324 scoped_ptr<OAuthTokenGetter> oauth_token_getter(new OAuthTokenGetterImpl( | 1339 oauth_token_getter_.reset(new OAuthTokenGetterImpl( |
1325 oauth_credentials.Pass(), context_->url_request_context_getter(), false, | 1340 oauth_credentials.Pass(), context_->url_request_context_getter(), false, |
1326 gcd_device_id_.empty())); | 1341 !using_gcd())); |
1327 signaling_connector_.reset(new SignalingConnector( | 1342 signaling_connector_.reset(new SignalingConnector( |
1328 xmpp_signal_strategy, dns_blackhole_checker.Pass(), | 1343 xmpp_signal_strategy, dns_blackhole_checker.Pass(), |
1329 oauth_token_getter.Pass(), | 1344 oauth_token_getter_.get(), |
1330 base::Bind(&HostProcess::OnAuthFailed, base::Unretained(this)))); | 1345 base::Bind(&HostProcess::OnAuthFailed, base::Unretained(this)))); |
1331 | 1346 |
1332 // Create HeartbeatSender. | 1347 if (using_gcd()) { |
1333 heartbeat_sender_.reset(new HeartbeatSender( | 1348 // Create objects to manage GCD state. |
1334 base::Bind(&HostProcess::OnHeartbeatSuccessful, base::Unretained(this)), | 1349 ServiceUrls* service_urls = ServiceUrls::GetInstance(); |
1335 base::Bind(&HostProcess::OnUnknownHostIdError, base::Unretained(this)), | 1350 scoped_ptr<GcdRestClient> gcd_rest_client(new GcdRestClient( |
1336 host_id_, xmpp_signal_strategy, key_pair_, directory_bot_jid_)); | 1351 service_urls->gcd_base_url(), gcd_device_id_, |
| 1352 context_->url_request_context_getter(), oauth_token_getter_.get())); |
| 1353 gcd_state_updater_.reset( |
| 1354 new GcdStateUpdater(base::Bind(&HostProcess::OnHeartbeatSuccessful, |
| 1355 base::Unretained(this)), |
| 1356 base::Bind(&HostProcess::OnUnknownHostIdError, |
| 1357 base::Unretained(this)), |
| 1358 signal_strategy_.get(), gcd_rest_client.Pass())); |
| 1359 |
| 1360 PushNotificationSubscriber::Subscription sub; |
| 1361 sub.channel = "cloud_devices"; |
| 1362 PushNotificationSubscriber::SubscriptionList subs; |
| 1363 subs.push_back(sub); |
| 1364 gcd_subscriber_.reset( |
| 1365 new PushNotificationSubscriber(signal_strategy_.get(), subs)); |
| 1366 } else { |
| 1367 // Create HeartbeatSender. |
| 1368 heartbeat_sender_.reset(new HeartbeatSender( |
| 1369 base::Bind(&HostProcess::OnHeartbeatSuccessful, base::Unretained(this)), |
| 1370 base::Bind(&HostProcess::OnUnknownHostIdError, base::Unretained(this)), |
| 1371 host_id_, signal_strategy_.get(), key_pair_, directory_bot_jid_)); |
| 1372 } |
1337 } | 1373 } |
1338 | 1374 |
1339 void HostProcess::StartHostIfReady() { | 1375 void HostProcess::StartHostIfReady() { |
1340 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 1376 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
1341 DCHECK_EQ(state_, HOST_STARTING); | 1377 DCHECK_EQ(state_, HOST_STARTING); |
1342 | 1378 |
1343 // Start the host if both the config and the policies are loaded. | 1379 // Start the host if both the config and the policies are loaded. |
1344 if (!serialized_config_.empty()) { | 1380 if (!serialized_config_.empty()) { |
1345 if (policy_state_ == POLICY_LOADED) { | 1381 if (policy_state_ == POLICY_LOADED) { |
1346 StartHost(); | 1382 StartHost(); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1402 } | 1438 } |
1403 | 1439 |
1404 // TODO(simonmorris): Get the maximum session duration from a policy. | 1440 // TODO(simonmorris): Get the maximum session duration from a policy. |
1405 #if defined(OS_LINUX) | 1441 #if defined(OS_LINUX) |
1406 host_->SetMaximumSessionDuration(base::TimeDelta::FromHours(20)); | 1442 host_->SetMaximumSessionDuration(base::TimeDelta::FromHours(20)); |
1407 #endif | 1443 #endif |
1408 | 1444 |
1409 host_change_notification_listener_.reset(new HostChangeNotificationListener( | 1445 host_change_notification_listener_.reset(new HostChangeNotificationListener( |
1410 this, host_id_, signal_strategy_.get(), directory_bot_jid_)); | 1446 this, host_id_, signal_strategy_.get(), directory_bot_jid_)); |
1411 | 1447 |
1412 host_status_logger_.reset( | 1448 if (using_gcd()) { |
1413 new HostStatusLogger(host_->AsWeakPtr(), ServerLogEntry::ME2ME, | 1449 // TODO(jrw): Implement logging for GCD hosts. |
1414 signal_strategy_.get(), directory_bot_jid_)); | 1450 HOST_LOG << "Logging not implemented for GCD hosts."; |
| 1451 } else { |
| 1452 host_status_logger_.reset(new HostStatusLogger( |
| 1453 host_->AsWeakPtr(), ServerLogEntry::ME2ME, |
| 1454 signal_strategy_.get(), directory_bot_jid_)); |
| 1455 } |
1415 | 1456 |
1416 // Set up reporting the host status notifications. | 1457 // Set up reporting the host status notifications. |
1417 #if defined(REMOTING_MULTI_PROCESS) | 1458 #if defined(REMOTING_MULTI_PROCESS) |
1418 host_event_logger_.reset( | 1459 host_event_logger_.reset( |
1419 new IpcHostEventLogger(host_->AsWeakPtr(), daemon_channel_.get())); | 1460 new IpcHostEventLogger(host_->AsWeakPtr(), daemon_channel_.get())); |
1420 #else // !defined(REMOTING_MULTI_PROCESS) | 1461 #else // !defined(REMOTING_MULTI_PROCESS) |
1421 host_event_logger_ = | 1462 host_event_logger_ = |
1422 HostEventLogger::Create(host_->AsWeakPtr(), kApplicationName); | 1463 HostEventLogger::Create(host_->AsWeakPtr(), kApplicationName); |
1423 #endif // !defined(REMOTING_MULTI_PROCESS) | 1464 #endif // !defined(REMOTING_MULTI_PROCESS) |
1424 | 1465 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1478 host_status_logger_.reset(); | 1519 host_status_logger_.reset(); |
1479 host_change_notification_listener_.reset(); | 1520 host_change_notification_listener_.reset(); |
1480 | 1521 |
1481 // Before shutting down HostSignalingManager, send the |host_offline_reason| | 1522 // Before shutting down HostSignalingManager, send the |host_offline_reason| |
1482 // if possible (i.e. if we have the config). | 1523 // if possible (i.e. if we have the config). |
1483 if (!serialized_config_.empty()) { | 1524 if (!serialized_config_.empty()) { |
1484 if (!signal_strategy_) | 1525 if (!signal_strategy_) |
1485 InitializeSignaling(); | 1526 InitializeSignaling(); |
1486 | 1527 |
1487 HOST_LOG << "SendHostOfflineReason: sending " << host_offline_reason << "."; | 1528 HOST_LOG << "SendHostOfflineReason: sending " << host_offline_reason << "."; |
1488 heartbeat_sender_->SetHostOfflineReason( | 1529 if (heartbeat_sender_) { |
1489 host_offline_reason, | 1530 heartbeat_sender_->SetHostOfflineReason( |
1490 base::TimeDelta::FromSeconds(kHostOfflineReasonTimeoutSeconds), | 1531 host_offline_reason, |
1491 base::Bind(&HostProcess::OnHostOfflineReasonAck, this)); | 1532 base::TimeDelta::FromSeconds(kHostOfflineReasonTimeoutSeconds), |
| 1533 base::Bind(&HostProcess::OnHostOfflineReasonAck, this)); |
| 1534 } |
| 1535 if (gcd_state_updater_) { |
| 1536 gcd_state_updater_->SetHostOfflineReason( |
| 1537 host_offline_reason, |
| 1538 base::TimeDelta::FromSeconds(kHostOfflineReasonTimeoutSeconds), |
| 1539 base::Bind(&HostProcess::OnHostOfflineReasonAck, this)); |
| 1540 } |
1492 return; // Shutdown will resume after OnHostOfflineReasonAck. | 1541 return; // Shutdown will resume after OnHostOfflineReasonAck. |
1493 } | 1542 } |
1494 | 1543 |
1495 // Continue the shutdown without sending the host offline reason. | 1544 // Continue the shutdown without sending the host offline reason. |
1496 HOST_LOG << "Can't send offline reason (" << host_offline_reason << ") " | 1545 HOST_LOG << "Can't send offline reason (" << host_offline_reason << ") " |
1497 << "without a valid host config."; | 1546 << "without a valid host config."; |
1498 OnHostOfflineReasonAck(false); | 1547 OnHostOfflineReasonAck(false); |
1499 } | 1548 } |
1500 | 1549 |
1501 void HostProcess::OnHostOfflineReasonAck(bool success) { | 1550 void HostProcess::OnHostOfflineReasonAck(bool success) { |
1502 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); | 1551 DCHECK(context_->network_task_runner()->BelongsToCurrentThread()); |
1503 DCHECK(!host_); // Assert that the host is really offline at this point. | 1552 DCHECK(!host_); // Assert that the host is really offline at this point. |
1504 | 1553 |
1505 HOST_LOG << "SendHostOfflineReason " << (success ? "succeeded." : "failed."); | 1554 HOST_LOG << "SendHostOfflineReason " << (success ? "succeeded." : "failed."); |
1506 heartbeat_sender_.reset(); | 1555 heartbeat_sender_.reset(); |
| 1556 oauth_token_getter_.reset(); |
1507 signaling_connector_.reset(); | 1557 signaling_connector_.reset(); |
1508 signal_strategy_.reset(); | 1558 signal_strategy_.reset(); |
| 1559 gcd_state_updater_.reset(); |
| 1560 gcd_subscriber_.reset(); |
1509 | 1561 |
1510 if (state_ == HOST_GOING_OFFLINE_TO_RESTART) { | 1562 if (state_ == HOST_GOING_OFFLINE_TO_RESTART) { |
1511 SetState(HOST_STARTING); | 1563 SetState(HOST_STARTING); |
1512 StartHostIfReady(); | 1564 StartHostIfReady(); |
1513 } else if (state_ == HOST_GOING_OFFLINE_TO_STOP) { | 1565 } else if (state_ == HOST_GOING_OFFLINE_TO_STOP) { |
1514 SetState(HOST_STOPPED); | 1566 SetState(HOST_STOPPED); |
1515 | 1567 |
1516 shutdown_watchdog_->SetExitCode(*exit_code_out_); | 1568 shutdown_watchdog_->SetExitCode(*exit_code_out_); |
1517 shutdown_watchdog_->Arm(); | 1569 shutdown_watchdog_->Arm(); |
1518 | 1570 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1577 base::TimeDelta::FromSeconds(kShutdownTimeoutSeconds)); | 1629 base::TimeDelta::FromSeconds(kShutdownTimeoutSeconds)); |
1578 new HostProcess(context.Pass(), &exit_code, &shutdown_watchdog); | 1630 new HostProcess(context.Pass(), &exit_code, &shutdown_watchdog); |
1579 | 1631 |
1580 // Run the main (also UI) message loop until the host no longer needs it. | 1632 // Run the main (also UI) message loop until the host no longer needs it. |
1581 message_loop.Run(); | 1633 message_loop.Run(); |
1582 | 1634 |
1583 return exit_code; | 1635 return exit_code; |
1584 } | 1636 } |
1585 | 1637 |
1586 } // namespace remoting | 1638 } // namespace remoting |
OLD | NEW |