blob: 79b7f99c5c34fe4956e50ce5263673767a12964c [file] [log] [blame]
// Copyright 2016 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 IMAGELOADER_IMAGELOADER_IMPL_H_
#define IMAGELOADER_IMAGELOADER_IMPL_H_
#include <map>
#include <string>
#include <utility>
#include <vector>
#include <base/files/file_path.h>
#include <base/gtest_prod_util.h>
#include <base/macros.h>
#include "imageloader/helper_process_proxy.h"
namespace imageloader {
using Keys = std::vector<std::vector<uint8_t>>;
struct ImageLoaderConfig {
ImageLoaderConfig(const Keys& keys,
const char* storage_path,
const char* mount_path)
: keys(keys), storage_dir(storage_path), mount_path(mount_path) {}
Keys keys;
base::FilePath storage_dir;
base::FilePath mount_path;
};
class ImageLoaderImpl {
public:
// Instantiate an object with a configuration object.
explicit ImageLoaderImpl(ImageLoaderConfig config)
: config_(std::move(config)) {}
ImageLoaderImpl(const ImageLoaderImpl&) = delete;
ImageLoaderImpl& operator=(const ImageLoaderImpl&) = delete;
// Register a component.
bool RegisterComponent(const std::string& name,
const std::string& version,
const std::string& component_folder_abs_path);
// Remove a component.
bool RemoveComponent(const std::string& name);
// Enumerates all mount point paths with prefix of |parent_dir| and returns
// them with |paths|. If |dry_run| is true, no mount points are unmounted.
// If |dry_run| is false, all mount points returned in |paths| are unmounted.
bool CleanupAll(bool dry_run,
const base::FilePath& parent_dir,
std::vector<std::string>* paths,
HelperProcessProxy* proxy);
// Cleanup a mount point at |path|.
bool Cleanup(const base::FilePath& path, HelperProcessProxy* proxy);
// Cleanup a DLC module image mount point given DLC |id| and |package|.
bool UnloadDlcImage(const std::string& id,
const std::string& package,
HelperProcessProxy* proxy);
// Get component version given component name.
std::string GetComponentVersion(const std::string& name);
// Get component metadata given component name.
bool GetComponentMetadata(const std::string& name,
std::map<std::string, std::string>* out_metadata);
// Load the specified component. This returns the mount point or an empty
// string on failure.
std::string LoadComponent(const std::string& name, HelperProcessProxy* proxy);
// Load the specified DLC module image. This returns the mount point or an
// empty string on failure.
std::string LoadDlcImage(const std::string& id,
const std::string& package,
const std::string& a_or_b,
HelperProcessProxy* proxy);
// Load the specified component at a set mount point.
bool LoadComponent(const std::string& name,
const std::string& mount_point,
HelperProcessProxy* proxy);
// Load the specified component from the given path.
std::string LoadComponentAtPath(const std::string& name,
const base::FilePath& absolute_path,
HelperProcessProxy* proxy);
// The directory hierarchy for a component consists of the storage_root (i.e.
// `/var/lib/imageloader`), the component_root
// (`/var/lib/imageloader/ComponentName`), and the version folder (i.e.
// `/var/lib/imageloader/ComponentName/23.0.0.205`). That is:
// [storage_root]/
// [storage_root]/[component_root]
// [storage_root]/[component_root]/[version]
//
// Inside the `component_root` there is a current version hint file:
// [storage_root]/[component_root]/latest-version
// Return the path to latest-version file for |component_name|.
base::FilePath GetLatestVersionFilePath(const std::string& component_name);
// Return the path to the [component_root] folder for |component_name|.
base::FilePath GetComponentRoot(const std::string& component_name);
// Return the path to a given version of |component_name|.
base::FilePath GetVersionPath(const std::string& component_name,
const std::string& version);
// Return the path to the current version of |component_name|.
bool GetPathToCurrentComponentVersion(const std::string& component_name,
base::FilePath* result);
private:
FRIEND_TEST_ALL_PREFIXES(ImageLoaderTest, RemoveImageAtPathRemovable);
FRIEND_TEST_ALL_PREFIXES(ImageLoaderTest, RemoveImageAtPathNotRemovable);
FRIEND_TEST_ALL_PREFIXES(ImageLoaderTest, ValidIdTest);
// The configuration traits.
ImageLoaderConfig config_;
// Remove component if removable.
bool RemoveComponentAtPath(const std::string& name,
const base::FilePath& component_root,
const base::FilePath& component_path);
// Report if a component name is valid or not.
static bool IsIdValid(const std::string& id);
};
} // namespace imageloader
#endif // IMAGELOADER_IMAGELOADER_IMPL_H_