blob: db3510cd1a284e4687b0fe1f6680142028907850 [file] [log] [blame]
// Copyright 2020 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "vm_tools/concierge/dlc_helper.h"
#include <memory>
#include <string>
#include <utility>
#include "base/logging.h"
#include "base/optional.h"
#include "dbus/scoped_dbus_error.h"
#include "dlcservice/proto_bindings/dlcservice.pb.h"
#include "dlcservice/dbus-proxies.h" // NOLINT (build/include_alpha)
#include <base/check.h>
namespace vm_tools {
namespace concierge {
DlcHelper::DlcHelper(
std::unique_ptr<org::chromium::DlcServiceInterfaceProxyInterface> handle)
: dlcservice_handle_(std::move(handle)) {}
DlcHelper::DlcHelper(const scoped_refptr<dbus::Bus>& bus)
: DlcHelper(
std::make_unique<org::chromium::DlcServiceInterfaceProxy>(bus)) {}
DlcHelper::~DlcHelper() = default;
base::Optional<std::string> DlcHelper::GetRootPath(const std::string& dlc_id,
std::string* out_error) {
DCHECK(out_error);
dlcservice::DlcState state;
brillo::ErrorPtr error;
if (!dlcservice_handle_->GetDlcState(dlc_id, &state, &error)) {
if (error) {
*out_error = "Error calling dlcservice (code=" + error->GetCode() +
"): " + error->GetMessage();
} else {
*out_error = "Error calling dlcservice: unknown";
}
return base::nullopt;
}
if (state.state() != dlcservice::DlcState_State_INSTALLED) {
*out_error = dlc_id + " was not installed, its state is: " +
std::to_string(state.state());
return base::nullopt;
}
return state.root_path();
}
} // namespace concierge
} // namespace vm_tools