host_stopper.cc 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "remoting/host/setup/host_stopper.h"
  5. #include "base/logging.h"
  6. #include "base/threading/platform_thread.h"
  7. #include "base/values.h"
  8. namespace remoting {
  9. HostStopper::HostStopper(std::unique_ptr<ServiceClient> service_client,
  10. scoped_refptr<DaemonController> daemon_controller)
  11. : service_client_(std::move(service_client)),
  12. daemon_controller_(daemon_controller) {
  13. weak_ptr_ = weak_ptr_factory_.GetWeakPtr();
  14. }
  15. HostStopper::~HostStopper() = default;
  16. void HostStopper::StopLocalHost(std::string access_token,
  17. base::OnceClosure on_done) {
  18. DCHECK(!on_done_);
  19. access_token_ = access_token;
  20. on_done_ = std::move(on_done);
  21. daemon_controller_->GetConfig(
  22. base::BindOnce(&HostStopper::OnConfigLoaded, weak_ptr_));
  23. }
  24. void HostStopper::OnConfigLoaded(absl::optional<base::Value::Dict> config) {
  25. const std::string* hostId = nullptr;
  26. if (!config || !(hostId = config->FindString("host_id"))) {
  27. std::move(on_done_).Run();
  28. return;
  29. }
  30. LOG(INFO) << "Stopping existing host: " << *hostId
  31. << ". This may take a few seconds.";
  32. service_client_->UnregisterHost(*hostId, access_token_, this);
  33. }
  34. void HostStopper::StopHost() {
  35. daemon_controller_->Stop(base::BindOnce(&HostStopper::OnStopped, weak_ptr_));
  36. }
  37. void HostStopper::OnStopped(DaemonController::AsyncResult) {
  38. bool stopped = false;
  39. for (auto i = 0; !stopped && i < 10; i++) {
  40. stopped =
  41. (daemon_controller_->GetState() == DaemonController::STATE_STOPPED);
  42. if (!stopped)
  43. base::PlatformThread::Sleep(base::Seconds(1));
  44. }
  45. if (!stopped)
  46. LOG(WARNING) << "Unable to stop existing host process. Setup will "
  47. << "continue, but you may need to reboot to complete it.";
  48. std::move(on_done_).Run();
  49. }
  50. void HostStopper::OnHostRegistered(const std::string& authorization_code) {
  51. NOTREACHED();
  52. }
  53. void HostStopper::OnHostUnregistered() {
  54. StopHost();
  55. }
  56. void HostStopper::OnOAuthError() {
  57. StopHost();
  58. }
  59. void HostStopper::OnNetworkError(int response_code) {
  60. StopHost();
  61. }
  62. } // namespace remoting