#include "init/tasks.hpp" #include #include #include #include "views/view_hexeditor.hpp" #include "views/view_pattern.hpp" #include "views/view_pattern_data.hpp" #include "views/view_hashes.hpp" #include "views/view_information.hpp" #include "views/view_help.hpp" #include "views/view_tools.hpp" #include "views/view_strings.hpp" #include "views/view_data_inspector.hpp" #include "views/view_disassembler.hpp" #include "views/view_bookmarks.hpp" #include "views/view_patches.hpp" #include "views/view_command_palette.hpp" #include "views/view_settings.hpp" #include "views/view_data_processor.hpp" #include "views/view_yara.hpp" #include "helpers/plugin_manager.hpp" #include namespace hex::init { static bool checkForUpdates() { hex::Net net; auto releases = net.getJson("https://api.github.com/repos/WerWolv/ImHex/releases/latest"); if (releases.code != 200) return false; if (!releases.response.contains("tag_name") || !releases.response["tag_name"].is_string()) return false; auto currVersion = "v" + std::string(IMHEX_VERSION).substr(0, 5); auto latestVersion = releases.response["tag_name"].get(); if (latestVersion != currVersion) getInitArguments().push_back({ "update-available", latestVersion.data() }); return true; } bool createDirectories() { std::filesystem::create_directories(hex::getPath(ImHexPath::Patterns)[0]); std::filesystem::create_directories(hex::getPath(ImHexPath::PatternsInclude)[0]); std::filesystem::create_directories(hex::getPath(ImHexPath::Magic)[0]); std::filesystem::create_directories(hex::getPath(ImHexPath::Plugins)[0]); std::filesystem::create_directories(hex::getPath(ImHexPath::Resources)[0]); std::filesystem::create_directories(hex::getPath(ImHexPath::Config)[0]); return true; } bool loadDefaultViews() { ContentRegistry::Views::add(); ContentRegistry::Views::add(); ContentRegistry::Views::add(); ContentRegistry::Views::add(); ContentRegistry::Views::add(); ContentRegistry::Views::add(); ContentRegistry::Views::add(); ContentRegistry::Views::add(); ContentRegistry::Views::add(); ContentRegistry::Views::add(); ContentRegistry::Views::add(); ContentRegistry::Views::add(); ContentRegistry::Views::add(); ContentRegistry::Views::add(); ContentRegistry::Views::add(); ContentRegistry::Views::add(); return true; } bool deleteViews() { for (auto &view : SharedData::views) delete view; SharedData::views.clear(); return true; } bool loadPlugins() { for (const auto &dir : hex::getPath(ImHexPath::Plugins)) { PluginManager::load(dir); } if (PluginManager::getPlugins().empty()) { getInitArguments().push_back({ "no-plugins", { } }); return false; } for (const auto &plugin : PluginManager::getPlugins()) { plugin.initializePlugin(); } return true; } bool unloadPlugins() { PluginManager::unload(); return true; } bool loadSettings() { ContentRegistry::Settings::load(); return true; } bool storeSettings() { ContentRegistry::Settings::store(); return true; } std::vector getInitTasks() { return { { "Checking for updates...", checkForUpdates }, { "Creating directories...", createDirectories }, { "Loading default views...", loadDefaultViews }, { "Loading plugins...", loadPlugins }, { "Loading settings...", loadSettings } }; } std::vector getExitTasks() { return { { "Unloading plugins...", unloadPlugins }, { "Saving settings...", storeSettings }, { "Cleaning up views...", deleteViews } }; } std::vector& getInitArguments() { static std::vector initArguments; return initArguments; } }