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

// This class is an abstraction for a Chrome OS Downloadable Content (DLC).
//
// A DLC module is a dynamically installed Chrome OS package that is verified
// via verity on device. DLC provides a way to install packages on demand
// instead of bundling all (used/unused) packages into root file system.
//
// This class verfies and mounts a DLC module image. A DLC module can be
// installed via API provided by dlc_service.

#ifndef IMAGELOADER_DLC_H_
#define IMAGELOADER_DLC_H_

#include <string>

#include <base/files/file_path.h>
#include <base/gtest_prod_util.h>

#include "imageloader/helper_process_proxy.h"

namespace imageloader {

// Enum on the two images (A/B) for one DLC module.
// We keep two copies (A/B) for each DLC module in order to sync with platform
// AutoUpdate (A/B update).
enum class AOrB { kDlcA, kDlcB, kUnknown };

class Dlc {
 public:
  explicit Dlc(const std::string& id,
               const std::string& package,
               const base::FilePath& mount_base);
  // Mount the image.
  bool Mount(HelperProcessProxy* proxy, const std::string& a_or_b);

  // Returns the directory where the DLC will be mounted. look at |mount_base_|.
  base::FilePath GetMountPoint();

  // Static version of the above function.
  static base::FilePath GetMountPoint(const base::FilePath& mount_base,
                                      const std::string& id,
                                      const std::string& package);

 private:
  FRIEND_TEST_ALL_PREFIXES(DlcTest, MountDlc);
  // Mount the image from |image_path| to |mount_point| using imageloader.json
  // at |manifest_path| and table at |table_path|
  bool Mount(HelperProcessProxy* proxy,
             const base::FilePath& image_path,
             const base::FilePath& manifest_path,
             const base::FilePath& table_path,
             const base::FilePath& mount_point);

  // Get the path to the DLC manifest (imageloader.json)
  base::FilePath GetManifestPath();

  // Get the path to the table file.
  base::FilePath GetTablePath();

  // Get the path to the DLC image itself.
  base::FilePath GetImagePath(const AOrB a_or_b);

  // ID of the DLC module image.
  std::string id_;

  // Package ID of the DLC module image.
  std::string package_;

  // The base directory where we need to mount the image. The DLC image will be
  // mounted at |mount_base|/|id_|/|package_|/a_or_b.
  base::FilePath mount_base_;

  DISALLOW_COPY_AND_ASSIGN(Dlc);
};

}  // namespace imageloader

#endif  // IMAGELOADER_DLC_H_
