/* * Copyright (c) 2020, Nicholas Hollett * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include namespace LaunchServer { struct Handler { enum class Type { Default = 0, Application, UserPreferred, UserDefault }; Type handler_type; String name; String executable; HashTable file_types {}; HashTable protocols {}; static String name_from_executable(StringView); void from_executable(Type, String const&); String to_details_str() const; }; class Launcher { public: Launcher(); static Launcher& the(); void load_handlers(String const& af_dir = Desktop::AppFile::APP_FILES_DIRECTORY); void load_config(Core::ConfigFile const&); bool open_url(const URL&, String const& handler_name); Vector handlers_for_url(const URL&); Vector handlers_with_details_for_url(const URL&); private: HashMap m_handlers; HashMap m_protocol_handlers; HashMap m_file_handlers; Handler get_handler_for_executable(Handler::Type, String const&) const; void for_each_handler(String const& key, HashMap& user_preferences, Function f); void for_each_handler_for_path(String const&, Function f); bool open_file_url(const URL&); bool open_with_user_preferences(HashMap const& user_preferences, String const& key, Vector const& arguments, String const& default_program = {}); bool open_with_handler_name(const URL&, String const& handler_name); }; }