1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
|
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_ASH_BRUSCHETTA_BRUSCHETTA_INSTALLER_IMPL_H_
#define CHROME_BROWSER_ASH_BRUSCHETTA_BRUSCHETTA_INSTALLER_IMPL_H_
#include <memory>
#include <optional>
#include "base/memory/raw_ptr.h"
#include "base/values.h"
#include "chrome/browser/ash/bruschetta/bruschetta_download.h"
#include "chrome/browser/ash/bruschetta/bruschetta_installer.h"
#include "chrome/browser/ash/bruschetta/bruschetta_util.h"
#include "chrome/browser/ash/guest_os/guest_os_dlc_helper.h"
#include "chromeos/ash/components/dbus/attestation/interface.pb.h"
#include "chromeos/ash/components/dbus/vm_concierge/concierge_service.pb.h"
#include "components/download/public/background_service/download_metadata.h"
#include "url/gurl.h"
class PrefService;
class Profile;
namespace bruschetta {
class BruschettaDownload;
class BruschettaInstallerImpl : public BruschettaInstaller {
public:
// Public for a free function in the .cc file, not actually part of the public
// interface.
struct Fds;
BruschettaInstallerImpl(Profile* profile,
PrefService& local_state,
base::OnceClosure close_callback);
BruschettaInstallerImpl(const BruschettaInstallerImpl&) = delete;
BruschettaInstallerImpl& operator=(const BruschettaInstallerImpl&) = delete;
~BruschettaInstallerImpl() override;
void Cancel() override;
void Install(std::string vm_name, std::string config_id) override;
void AddObserver(Observer* observer) override;
void RemoveObserver(Observer* observer) override;
void SetDownloadFactoryForTesting(
base::RepeatingCallback<std::unique_ptr<BruschettaDownload>(void)>
callback) {
download_factory_ = std::move(callback);
}
private:
using DownloadCallback =
base::OnceCallback<void(const download::CompletionInfo&)>;
bool MaybeClose();
void StartDownload(GURL url, DownloadCallback callback);
void InstallToolsDlc();
void OnToolsDlcInstalled(
guest_os::GuestOsDlcInstallation::Result install_result);
void InstallFirmwareDlc();
void OnFirmwareDlcInstalled(
guest_os::GuestOsDlcInstallation::Result install_result);
void DownloadBootDisk();
void OnBootDiskDownloaded(base::FilePath path, std::string hash);
void DownloadPflash();
void OnPflashDownloaded(base::FilePath path, std::string hash);
void OpenFds();
void OnOpenFds(std::unique_ptr<Fds> fds);
void EnsureConciergeAvailable();
void OnConciergeAvailable(bool service_is_available);
void CreateVmDisk();
void OnCreateVmDisk(
std::optional<vm_tools::concierge::CreateDiskImageResponse> result);
void InstallPflash();
void OnInstallPflash(
std::optional<vm_tools::concierge::SuccessFailureResponse> result);
void ClearVek();
void OnClearVek(const attestation::DeleteKeysReply& result);
void StartVm();
void OnStartVm(RunningVmPolicy launch_policy,
std::optional<vm_tools::concierge::StartVmResponse> result);
void LaunchTerminal();
void NotifyObserver(State state);
void Error(BruschettaInstallResult error);
bool install_running_ = false;
std::string vm_name_;
std::string config_id_;
base::Value::Dict config_;
base::FilePath boot_disk_path_;
base::FilePath pflash_path_;
std::string disk_path_;
std::unique_ptr<Fds> fds_;
std::unique_ptr<guest_os::GuestOsDlcInstallation> in_progress_dlc_;
const raw_ptr<Profile> profile_;
// The downloaded files get deleted once these go out of scope.
std::unique_ptr<BruschettaDownload> boot_disk_download_;
std::unique_ptr<BruschettaDownload> pflash_download_;
base::RepeatingCallback<std::unique_ptr<BruschettaDownload>(void)>
download_factory_;
base::OnceClosure close_closure_;
raw_ptr<Observer> observer_ = nullptr;
base::WeakPtrFactory<BruschettaInstallerImpl> weak_ptr_factory_{this};
};
} // namespace bruschetta
#endif // CHROME_BROWSER_ASH_BRUSCHETTA_BRUSCHETTA_INSTALLER_IMPL_H_
|