// 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.

#ifndef VM_TOOLS_CONCIERGE_DLC_HELPER_H_
#define VM_TOOLS_CONCIERGE_DLC_HELPER_H_

#include <memory>
#include <string>

#include "base/memory/scoped_refptr.h"
#include "base/optional.h"

namespace dbus {
class Bus;
}  // namespace dbus

namespace org {
namespace chromium {
class DlcServiceInterfaceProxyInterface;
}
}  // namespace org

namespace vm_tools {
namespace concierge {

class DlcHelper {
 public:
  // Constructs a helper that uses the dbus proxy |handle| to communicate with
  // dlcservice.
  explicit DlcHelper(
      std::unique_ptr<org::chromium::DlcServiceInterfaceProxyInterface> handle);

  // Constructs a helper whose handle was made from the given |bus| using the
  // default settings.
  explicit DlcHelper(const scoped_refptr<dbus::Bus>& bus);

  // We must declare a destructor in order to prevent std::make_unique from
  // thunking a default one in a TL where DlcServiceInterfaceProxyInterface is
  // only forwards declared.
  ~DlcHelper();

  // Determine the path where the |dlc_id| DLC is located. If it is not
  // installed, or some error occurs, returns nullopt and sets |out_error|.
  // Assumes that |out_error| is valid (non-null).
  base::Optional<std::string> GetRootPath(const std::string& dlc_id,
                                          std::string* out_error);

 private:
  std::unique_ptr<org::chromium::DlcServiceInterfaceProxyInterface>
      dlcservice_handle_;
};

}  // namespace concierge
}  // namespace vm_tools

#endif  // VM_TOOLS_CONCIERGE_DLC_HELPER_H_
