/** * @file src/app_catalog_policy.h * @brief Pure application artwork and stable-ID catalog policy. */ #pragma once #include #include #include #include #include #include #include #include #include #include namespace proc::catalog { using byte_buffer_t = std::vector; using image_reader_t = std::function(const std::string &)>; bool has_png_signature(std::span bytes); std::string asset_path(const std::string &assets_root, const std::string &relative_path); bool machine_image_path_is_confined( const std::string &image_path, const std::string &assets_root, const std::string &covers_root); std::string validate_image_path( std::string image_path, const std::string &assets_root, const std::string &default_image, const image_reader_t &read_image); std::tuple calculate_ids( const std::string &app_name, const std::string &app_uuid, const std::string &legacy_image_identity, int index); std::tuple calculate_versioned_ids( const std::string &app_uuid, const std::string &cover_fingerprint, int index); struct alias_state_t { std::string current_id; std::string cover_fingerprint; std::set aliases; }; struct app_identity_t { std::string name; std::string uuid; std::string legacy_image_identity; std::string art_version; std::string id; std::vector aliases; }; void assign_compatible_id( app_identity_t &app, int index, std::set &occupied_ids, std::map &persisted, std::set &active_uuids, bool &state_changed); void prune_and_filter_aliases( std::vector &apps, std::map &persisted, const std::set &active_uuids, bool &state_changed); std::optional resolve_app( const std::vector &apps, std::string app_id, const std::string &app_uuid = {}); } // namespace proc::catalog