[go: nahoru, domu]

blob: e2d1b29736456393731546c8476e1b229273d7ad [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "remoting/host/setup/host_stopper.h"
#include "base/logging.h"
#include "base/threading/platform_thread.h"
#include "base/values.h"
namespace remoting {
HostStopper::HostStopper(std::unique_ptr<ServiceClient> service_client,
scoped_refptr<DaemonController> daemon_controller)
: service_client_(std::move(service_client)),
daemon_controller_(daemon_controller) {
weak_ptr_ = weak_ptr_factory_.GetWeakPtr();
}
HostStopper::~HostStopper() = default;
void HostStopper::StopLocalHost(std::string access_token,
base::OnceClosure on_done) {
DCHECK(!on_done_);
access_token_ = access_token;
on_done_ = std::move(on_done);
daemon_controller_->GetConfig(
base::BindOnce(&HostStopper::OnConfigLoaded, weak_ptr_));
}
void HostStopper::OnConfigLoaded(absl::optional<base::Value::Dict> config) {
const std::string* hostId = nullptr;
if (!config || !(hostId = config->FindString("host_id"))) {
std::move(on_done_).Run();
return;
}
LOG(INFO) << "Stopping existing host: " << *hostId
<< ". This may take a few seconds.";
service_client_->UnregisterHost(*hostId, access_token_, this);
}
void HostStopper::StopHost() {
daemon_controller_->Stop(base::BindOnce(&HostStopper::OnStopped, weak_ptr_));
}
void HostStopper::OnStopped(DaemonController::AsyncResult) {
bool stopped = false;
for (auto i = 0; !stopped && i < 10; i++) {
stopped =
(daemon_controller_->GetState() == DaemonController::STATE_STOPPED);
if (!stopped) {
base::PlatformThread::Sleep(base::Seconds(1));
}
}
if (!stopped) {
LOG(WARNING) << "Unable to stop existing host process. Setup will "
<< "continue, but you may need to reboot to complete it.";
}
std::move(on_done_).Run();
}
void HostStopper::OnHostRegistered(const std::string& authorization_code) {
NOTREACHED();
}
void HostStopper::OnHostUnregistered() {
StopHost();
}
void HostStopper::OnOAuthError() {
StopHost();
}
void HostStopper::OnNetworkError(int response_code) {
StopHost();
}
} // namespace remoting