//===-- ModuleCache.h -------------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef LLDB_TARGET_MODULECACHE_H
#define LLDB_TARGET_MODULECACHE_H

#include "lldb/lldb-forward.h"
#include "lldb/lldb-types.h"

#include "lldb/Host/File.h"
#include "lldb/Utility/FileSpec.h"
#include "lldb/Utility/Status.h"

#include <functional>
#include <string>
#include <unordered_map>

namespace lldb_private {

class Module;
class UUID;

/// \class ModuleCache ModuleCache.h "lldb/Target/ModuleCache.h"
/// A module cache class.
///
/// Caches locally modules that are downloaded from remote targets. Each
/// cached module maintains 2 views:
///  - UUID view:
///  /${CACHE_ROOT}/${PLATFORM_NAME}/.cache/${UUID}/${MODULE_FILENAME}
///  - Sysroot view:
///  /${CACHE_ROOT}/${PLATFORM_NAME}/${HOSTNAME}/${MODULE_FULL_FILEPATH}
///
/// UUID views stores a real module file, whereas Sysroot view holds a symbolic
/// link to UUID-view file.
///
/// Example:
/// UUID view   :
/// /tmp/lldb/remote-
/// linux/.cache/30C94DC6-6A1F-E951-80C3-D68D2B89E576-D5AE213C/libc.so.6
/// Sysroot view: /tmp/lldb/remote-linux/ubuntu/lib/x86_64-linux-gnu/libc.so.6

class ModuleCache {
public:
  using ModuleDownloader =
      std::function<Status(const ModuleSpec &, const FileSpec &)>;
  using SymfileDownloader =
      std::function<Status(const lldb::ModuleSP &, const FileSpec &)>;

  Status GetAndPut(const FileSpec &root_dir_spec, const char *hostname,
                   const ModuleSpec &module_spec,
                   const ModuleDownloader &module_downloader,
                   const SymfileDownloader &symfile_downloader,
                   lldb::ModuleSP &cached_module_sp, bool *did_create_ptr);

private:
  Status Put(const FileSpec &root_dir_spec, const char *hostname,
             const ModuleSpec &module_spec, const FileSpec &tmp_file,
             const FileSpec &target_file);

  Status Get(const FileSpec &root_dir_spec, const char *hostname,
             const ModuleSpec &module_spec, lldb::ModuleSP &cached_module_sp,
             bool *did_create_ptr);

  std::unordered_map<std::string, lldb::ModuleWP> m_loaded_modules;
};

} // namespace lldb_private

#endif // utility_ModuleCache_h_
