| // Copyright 2023 The ChromiumOS Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef DLCSERVICE_METADATA_METADATA_H_ |
| #define DLCSERVICE_METADATA_METADATA_H_ |
| |
| #include <cstddef> |
| #include <memory> |
| #include <optional> |
| #include <set> |
| #include <string> |
| #include <string_view> |
| |
| #include <base/files/file_path.h> |
| #include <base/values.h> |
| #include <brillo/brillo_export.h> |
| #include <brillo/compression/compressor_interface.h> |
| |
| #include "dlcservice/metadata/metadata_interface.h" |
| |
| namespace dlcservice::metadata { |
| |
| // The default maximum size of metadata files. |
| BRILLO_EXPORT extern const size_t kMaxMetadataFileSize; |
| // The prefix of metadata files. Metadata files are named in the format |
| // `<kMetadataPrefix><file_id>`. |
| BRILLO_EXPORT extern const std::string_view kMetadataPrefix; |
| |
| // Load DLC metadata for the dlcservice daemon. |
| class BRILLO_EXPORT Metadata : public MetadataInterface { |
| public: |
| explicit Metadata( |
| const base::FilePath& metadata_path, |
| size_t max_file_size = kMaxMetadataFileSize, |
| std::unique_ptr<brillo::CompressorInterface> compressor = nullptr, |
| std::unique_ptr<brillo::CompressorInterface> decompressor = nullptr); |
| ~Metadata() override = default; |
| |
| Metadata(const Metadata&) = delete; |
| Metadata& operator=(const Metadata&) = delete; |
| |
| bool Initialize() override; |
| std::optional<Entry> Get(const DlcId& id) override; |
| bool Set(const DlcId& id, const Entry& entry) override; |
| bool LoadMetadata(const DlcId& id) override; |
| void UpdateFileIds() override; |
| |
| DlcIdList ListDlcIds(const FilterKey& filter_key, |
| const base::Value& filter_val) override; |
| std::optional<std::string> FilterKeyToString( |
| const FilterKey& key_enum) override; |
| |
| const base::Value::Dict& GetCache() const override { return cache_; } |
| const std::set<DlcId>& GetFileIds() const override { return file_ids_; } |
| |
| private: |
| // Estimate the compressed size of given metadata, returns `-1` on error. |
| int CompressionSize(const std::string& metadata); |
| |
| // Flush the cache into the metadata file. |
| bool FlushCache(); |
| |
| // Flush `compressed_metadata_` to a metadata file, and name it |
| // `kMetadataPrefix``file_id`. |
| bool FlushBuffer(const DlcId& file_id); |
| |
| // Get DLC IDs from an indexed manifest field. Returns nullopt on error. |
| std::optional<DlcIdList> GetIndex(const std::string& key); |
| |
| const base::FilePath metadata_path_; |
| // The maximum size of each metadata file, align with the filesystem block |
| // size to get performance and it should be in sync with the chromite. |
| const size_t max_file_size_; |
| // Cache currently loaded and parsed metadata file for read or modify. |
| base::Value::Dict cache_; |
| // The `file_id`s inside current metadata directory. |
| std::set<DlcId> file_ids_; |
| // The buffer for read and write compressed metadata. |
| std::string compressed_metadata_; |
| // The compressor and decompressor for metadata compression/decompression. |
| std::unique_ptr<brillo::CompressorInterface> compressor_; |
| std::unique_ptr<brillo::CompressorInterface> decompressor_; |
| }; |
| |
| } // namespace dlcservice::metadata |
| |
| #endif // DLCSERVICE_METADATA_METADATA_H_ |