15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/host/setup/host_starter.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/bind.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/guid.h" 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/location.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/thread_task_runner_handle.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/google_api_keys.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/host/pin_hash.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/host/setup/oauth_helper.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kMaxGetTokensRetries = 3; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HostStarter::HostStarter( 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<gaia::GaiaOAuthClient> oauth_client, 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<remoting::ServiceClient> service_client, 2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_refptr<remoting::DaemonController> daemon_controller) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : oauth_client_(oauth_client.Pass()), 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_client_(service_client.Pass()), 2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) daemon_controller_(daemon_controller), 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) consent_to_data_collection_(false), 30424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) unregistering_host_(false), 314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) weak_ptr_factory_(this) { 324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) weak_ptr_ = weak_ptr_factory_.GetWeakPtr(); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_task_runner_ = base::ThreadTaskRunnerHandle::Get(); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HostStarter::~HostStarter() { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<HostStarter> HostStarter::Create( 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& chromoting_hosts_url, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::URLRequestContextGetter* url_request_context_getter) { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<gaia::GaiaOAuthClient> oauth_client( 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch new gaia::GaiaOAuthClient(url_request_context_getter)); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<remoting::ServiceClient> service_client( 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new remoting::ServiceClient( 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromoting_hosts_url, url_request_context_getter)); 4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_refptr<remoting::DaemonController> daemon_controller( 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) remoting::DaemonController::Create()); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return scoped_ptr<HostStarter>( 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new HostStarter(oauth_client.Pass(), service_client.Pass(), 5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) daemon_controller)); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostStarter::StartHost( 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& host_name, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& host_pin, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool consent_to_data_collection, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& auth_code, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& redirect_url, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompletionCallback on_done) { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(main_task_runner_->BelongsToCurrentThread()); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(on_done_.is_null()); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_name_ = host_name; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_pin_ = host_pin; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) consent_to_data_collection_ = consent_to_data_collection; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) on_done_ = on_done; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oauth_client_info_.client_id = 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) google_apis::GetOAuth2ClientID(google_apis::CLIENT_REMOTING); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oauth_client_info_.client_secret = 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) google_apis::GetOAuth2ClientSecret(google_apis::CLIENT_REMOTING); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oauth_client_info_.redirect_uri = redirect_url; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Map the authorization code to refresh and access tokens. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oauth_client_->GetTokensFromAuthCode(oauth_client_info_, auth_code, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMaxGetTokensRetries, this); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostStarter::OnGetTokensResponse( 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& refresh_token, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& access_token, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expires_in_seconds) { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!main_task_runner_->BelongsToCurrentThread()) { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_task_runner_->PostTask(FROM_HERE, base::Bind( 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &HostStarter::OnGetTokensResponse, weak_ptr_, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) refresh_token, access_token, expires_in_seconds)); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) refresh_token_ = refresh_token; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) access_token_ = access_token; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the email corresponding to the access token. 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch oauth_client_->GetUserEmail(access_token_, 1, this); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostStarter::OnRefreshTokenResponse( 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& access_token, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expires_in_seconds) { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We never request a refresh token, so this call is not expected. 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// This function is called twice: once with the host owner credentials, and once 1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// with the service account credentials. 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid HostStarter::OnGetUserEmailResponse(const std::string& user_email) { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!main_task_runner_->BelongsToCurrentThread()) { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_task_runner_->PostTask(FROM_HERE, base::Bind( 106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &HostStarter::OnGetUserEmailResponse, weak_ptr_, user_email)); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (host_owner_.empty()) { 1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // This is the first callback, with the host owner credentials. Store the 1123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // owner's email, and register the host. 1133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) host_owner_ = user_email; 1143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) host_id_ = base::GenerateGUID(); 1153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) key_pair_ = RsaKeyPair::Generate(); 1163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string host_client_id; 1183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) host_client_id = google_apis::GetOAuth2ClientID( 1193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) google_apis::CLIENT_REMOTING_HOST); 1203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) service_client_->RegisterHost( 1223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) host_id_, host_name_, key_pair_->GetPublicKey(), host_client_id, 1233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) access_token_, this); 1243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } else { 1253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // This is the second callback, with the service account credentials. 1263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // This email is the service account's email, used to login to XMPP. 1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) xmpp_login_ = user_email; 1283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) StartHostProcess(); 1293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void HostStarter::OnHostRegistered(const std::string& authorization_code) { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!main_task_runner_->BelongsToCurrentThread()) { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_task_runner_->PostTask(FROM_HERE, base::Bind( 1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) &HostStarter::OnHostRegistered, weak_ptr_, authorization_code)); 1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return; 1373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (authorization_code.empty()) { 1403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // No service account code, start the host with the owner's credentials. 1413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) xmpp_login_ = host_owner_; 1423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) StartHostProcess(); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Received a service account authorization code, update oauth_client_info_ 1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // to use the service account client keys, and get service account tokens. 1483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) oauth_client_info_.client_id = 1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) google_apis::GetOAuth2ClientID( 1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) google_apis::CLIENT_REMOTING_HOST); 1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) oauth_client_info_.client_secret = 1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) google_apis::GetOAuth2ClientSecret( 1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) google_apis::CLIENT_REMOTING_HOST); 1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) oauth_client_info_.redirect_uri = "oob"; 1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) oauth_client_->GetTokensFromAuthCode( 1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) oauth_client_info_, authorization_code, kMaxGetTokensRetries, this); 1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void HostStarter::StartHostProcess() { 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start the host. 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string host_secret_hash = remoting::MakeHostPinHash(host_id_, host_pin_); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::DictionaryValue> config(new base::DictionaryValue()); 1633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (host_owner_ != xmpp_login_) { 1643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) config->SetString("host_owner", host_owner_); 1653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) config->SetString("xmpp_login", xmpp_login_); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config->SetString("oauth_refresh_token", refresh_token_); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config->SetString("host_id", host_id_); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config->SetString("host_name", host_name_); 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) config->SetString("private_key", key_pair_->ToString()); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config->SetString("host_secret_hash", host_secret_hash); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) daemon_controller_->SetConfigAndStart( 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) config.Pass(), consent_to_data_collection_, 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&HostStarter::OnHostStarted, base::Unretained(this))); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostStarter::OnHostStarted(DaemonController::AsyncResult result) { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!main_task_runner_->BelongsToCurrentThread()) { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_task_runner_->PostTask(FROM_HERE, base::Bind( 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &HostStarter::OnHostStarted, weak_ptr_, result)); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result != DaemonController::RESULT_OK) { 184424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) unregistering_host_ = true; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_client_->UnregisterHost(host_id_, access_token_, this); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompletionCallback cb = on_done_; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) on_done_.Reset(); 190424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) cb.Run(START_COMPLETE); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostStarter::OnOAuthError() { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!main_task_runner_->BelongsToCurrentThread()) { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_task_runner_->PostTask(FROM_HERE, base::Bind( 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &HostStarter::OnOAuthError, weak_ptr_)); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompletionCallback cb = on_done_; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) on_done_.Reset(); 201424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (unregistering_host_) { 202424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) LOG(ERROR) << "OAuth error occurred when unregistering host."; 203424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) cb.Run(START_ERROR); 204424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } else { 205424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) cb.Run(OAUTH_ERROR); 206424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostStarter::OnNetworkError(int response_code) { 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!main_task_runner_->BelongsToCurrentThread()) { 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_task_runner_->PostTask(FROM_HERE, base::Bind( 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &HostStarter::OnNetworkError, weak_ptr_, response_code)); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompletionCallback cb = on_done_; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) on_done_.Reset(); 217424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (unregistering_host_) { 218424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) LOG(ERROR) << "Network error occurred when unregistering host."; 219424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) cb.Run(START_ERROR); 220424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } else { 221424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) cb.Run(NETWORK_ERROR); 222424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostStarter::OnHostUnregistered() { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!main_task_runner_->BelongsToCurrentThread()) { 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) main_task_runner_->PostTask(FROM_HERE, base::Bind( 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &HostStarter::OnHostUnregistered, weak_ptr_)); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompletionCallback cb = on_done_; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) on_done_.Reset(); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cb.Run(START_ERROR); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace remoting 237