diff --git a/lib/libimhex/include/hex/api/content_registry/provider.hpp b/lib/libimhex/include/hex/api/content_registry/provider.hpp index e3b25f94f..6549ef617 100644 --- a/lib/libimhex/include/hex/api/content_registry/provider.hpp +++ b/lib/libimhex/include/hex/api/content_registry/provider.hpp @@ -19,7 +19,7 @@ EXPORT_MODULE namespace hex { void addProviderName(const UnlocalizedString &unlocalizedName, const char *icon); - using ProviderCreationFunction = std::function()>; + using ProviderCreationFunction = std::function()>; void add(const std::string &typeName, ProviderCreationFunction creationFunction); struct Entry { diff --git a/lib/libimhex/include/hex/api/events/requests_provider.hpp b/lib/libimhex/include/hex/api/events/requests_provider.hpp index db28d42ec..29b5f43aa 100644 --- a/lib/libimhex/include/hex/api/events/requests_provider.hpp +++ b/lib/libimhex/include/hex/api/events/requests_provider.hpp @@ -8,7 +8,7 @@ namespace hex { /** * @brief Creates a provider from its unlocalized name, and add it to the provider list */ - EVENT_DEF(RequestCreateProvider, std::string, bool, bool, hex::prv::Provider **); + EVENT_DEF(RequestCreateProvider, std::string, bool, bool, std::shared_ptr *); /** * @brief Move the data from all PerProvider instances from one provider to another diff --git a/lib/libimhex/include/hex/api/imhex_api/provider.hpp b/lib/libimhex/include/hex/api/imhex_api/provider.hpp index 570f854e1..c5c684e71 100644 --- a/lib/libimhex/include/hex/api/imhex_api/provider.hpp +++ b/lib/libimhex/include/hex/api/imhex_api/provider.hpp @@ -86,7 +86,7 @@ EXPORT_MODULE namespace hex { * @param skipLoadInterface Whether to skip the provider's loading interface (see property documentation) * @param select Whether to select the provider after adding it */ - void add(std::unique_ptr &&provider, bool skipLoadInterface = false, bool select = true); + void add(std::shared_ptr &&provider, bool skipLoadInterface = false, bool select = true); /** * @brief Creates a new provider and adds it to the list of providers @@ -111,7 +111,7 @@ EXPORT_MODULE namespace hex { * @param skipLoadInterface Whether to skip the provider's loading interface (see property documentation) * @param select Whether to select the provider after adding it */ - prv::Provider* createProvider( + std::shared_ptr createProvider( const UnlocalizedString &unlocalizedName, bool skipLoadInterface = false, bool select = true diff --git a/lib/libimhex/source/api/content_registry.cpp b/lib/libimhex/source/api/content_registry.cpp index 59fe1a63c..1100c48b0 100644 --- a/lib/libimhex/source/api/content_registry.cpp +++ b/lib/libimhex/source/api/content_registry.cpp @@ -1119,13 +1119,13 @@ namespace hex { namespace impl { void add(const std::string &typeName, ProviderCreationFunction creationFunction) { - (void)RequestCreateProvider::subscribe([expectedName = typeName, creationFunction](const std::string &name, bool skipLoadInterface, bool selectProvider, prv::Provider **provider) { + (void)RequestCreateProvider::subscribe([expectedName = typeName, creationFunction](const std::string &name, bool skipLoadInterface, bool selectProvider, std::shared_ptr *provider) { if (name != expectedName) return; auto newProvider = creationFunction(); if (provider != nullptr) { - *provider = newProvider.get(); + *provider = newProvider; ImHexApi::Provider::add(std::move(newProvider), skipLoadInterface, selectProvider); } }); diff --git a/lib/libimhex/source/api/imhex_api.cpp b/lib/libimhex/source/api/imhex_api.cpp index 549d13e95..e89fbfca9 100644 --- a/lib/libimhex/source/api/imhex_api.cpp +++ b/lib/libimhex/source/api/imhex_api.cpp @@ -294,8 +294,8 @@ namespace hex { namespace ImHexApi::Provider { static i64 s_currentProvider = -1; - static AutoReset>> s_providers; - static AutoReset>> s_providersToRemove; + static AutoReset>> s_providers; + static AutoReset>> s_providersToRemove; namespace impl { @@ -382,7 +382,7 @@ namespace hex { }); } - void add(std::unique_ptr &&provider, bool skipLoadInterface, bool select) { + void add(std::shared_ptr &&provider, bool skipLoadInterface, bool select) { std::scoped_lock lock(impl::s_providerMutex); if (TaskManager::getRunningTaskCount() > 0) @@ -491,8 +491,8 @@ namespace hex { }); } - prv::Provider* createProvider(const UnlocalizedString &unlocalizedName, bool skipLoadInterface, bool select) { - prv::Provider* result = nullptr; + std::shared_ptr createProvider(const UnlocalizedString &unlocalizedName, bool skipLoadInterface, bool select) { + std::shared_ptr result = nullptr; RequestCreateProvider::post(unlocalizedName, skipLoadInterface, select, &result); return result; diff --git a/plugins/builtin/source/content/events.cpp b/plugins/builtin/source/content/events.cpp index ec1b2e79a..0fdc55500 100644 --- a/plugins/builtin/source/content/events.cpp +++ b/plugins/builtin/source/content/events.cpp @@ -50,17 +50,17 @@ namespace hex::plugin::builtin { } auto provider = ImHexApi::Provider::createProvider("hex.builtin.provider.file", true); - if (auto *fileProvider = dynamic_cast(provider); fileProvider != nullptr) { + if (auto *fileProvider = dynamic_cast(provider.get()); fileProvider != nullptr) { fileProvider->setPath(path); if (!provider->open() || !provider->isAvailable()) { ui::ToastError::open(fmt::format("hex.builtin.provider.error.open"_lang, provider->getErrorMessage())); - TaskManager::doLater([provider] { ImHexApi::Provider::remove(provider); }); + TaskManager::doLater([provider] { ImHexApi::Provider::remove(provider.get()); }); return; } EventProviderOpened::post(fileProvider); AchievementManager::unlockAchievement("hex.builtin.achievement.starting_out", "hex.builtin.achievement.starting_out.open_file.name"); - ImHexApi::Provider::setCurrentProvider(provider); + ImHexApi::Provider::setCurrentProvider(provider.get()); glfwRequestWindowAttention(ImHexApi::System::getMainWindowHandle()); glfwFocusWindow(ImHexApi::System::getMainWindowHandle()); @@ -184,9 +184,9 @@ namespace hex::plugin::builtin { if (name == "Create File") { auto newProvider = hex::ImHexApi::Provider::createProvider("hex.builtin.provider.mem_file", true); if (newProvider != nullptr && !newProvider->open()) - hex::ImHexApi::Provider::remove(newProvider); + hex::ImHexApi::Provider::remove(newProvider.get()); else - EventProviderOpened::post(newProvider); + EventProviderOpened::post(newProvider.get()); } else if (name == "Open File") { fs::openFileBrowser(fs::DialogMode::Open, { }, [](const auto &path) { if (path.extension() == ".hexproj") { @@ -197,9 +197,8 @@ namespace hex::plugin::builtin { } } - auto newProvider = static_cast( - ImHexApi::Provider::createProvider("hex.builtin.provider.file", true) - ); + auto provider = ImHexApi::Provider::createProvider("hex.builtin.provider.file", true); + auto newProvider = static_cast(provider.get()); if (newProvider == nullptr) return; diff --git a/plugins/builtin/source/content/main_menu_items.cpp b/plugins/builtin/source/content/main_menu_items.cpp index 88a325ed8..f42f9fbe2 100644 --- a/plugins/builtin/source/content/main_menu_items.cpp +++ b/plugins/builtin/source/content/main_menu_items.cpp @@ -378,9 +378,9 @@ namespace hex::plugin::builtin { ContentRegistry::UserInterface::addMenuItem({ "hex.builtin.menu.file", "hex.builtin.menu.file.create_file" }, ICON_VS_FILE, 1050, CTRLCMD + Keys::N + AllowWhileTyping + ShowOnWelcomeScreen, [] { auto newProvider = hex::ImHexApi::Provider::createProvider("hex.builtin.provider.mem_file", true); if (newProvider != nullptr && !newProvider->open()) - hex::ImHexApi::Provider::remove(newProvider); + hex::ImHexApi::Provider::remove(newProvider.get()); else - EventProviderOpened::post(newProvider); + EventProviderOpened::post(newProvider.get()); }, noRunningTasks, ContentRegistry::Views::getViewByName("hex.builtin.view.hex_editor.name")); /* Open File */ diff --git a/plugins/builtin/source/content/providers.cpp b/plugins/builtin/source/content/providers.cpp index 2d2261914..e7d933d92 100644 --- a/plugins/builtin/source/content/providers.cpp +++ b/plugins/builtin/source/content/providers.cpp @@ -89,13 +89,13 @@ namespace hex::plugin::builtin { newProvider->loadSettings(providerSettings.at("settings")); loaded = true; } catch (const std::exception &e){ - providerWarnings[newProvider] = e.what(); + providerWarnings[newProvider.get()] = e.what(); } if (loaded) { if (!newProvider->open() || !newProvider->isAvailable() || !newProvider->isReadable()) { - providerWarnings[newProvider] = newProvider->getErrorMessage(); + providerWarnings[newProvider.get()] = newProvider->getErrorMessage(); } else { - EventProviderOpened::post(newProvider); + EventProviderOpened::post(newProvider.get()); } } } diff --git a/plugins/builtin/source/content/providers/memory_file_provider.cpp b/plugins/builtin/source/content/providers/memory_file_provider.cpp index 8d45cb480..f334bca76 100644 --- a/plugins/builtin/source/content/providers/memory_file_provider.cpp +++ b/plugins/builtin/source/content/providers/memory_file_provider.cpp @@ -51,16 +51,16 @@ namespace hex::plugin::builtin { auto newProvider = hex::ImHexApi::Provider::createProvider("hex.builtin.provider.file", true); - if (auto fileProvider = dynamic_cast(newProvider); fileProvider != nullptr) { + if (auto fileProvider = dynamic_cast(newProvider.get()); fileProvider != nullptr) { fileProvider->setPath(path); if (!fileProvider->open()) { - ImHexApi::Provider::remove(newProvider); + ImHexApi::Provider::remove(newProvider.get()); } else { MovePerProviderData::post(this, fileProvider); fileProvider->markDirty(false); - EventProviderOpened::post(newProvider); + EventProviderOpened::post(newProvider.get()); ImHexApi::Provider::remove(this, true); } } diff --git a/plugins/builtin/source/content/recent.cpp b/plugins/builtin/source/content/recent.cpp index 0d56e5801..1e8f3598b 100644 --- a/plugins/builtin/source/content/recent.cpp +++ b/plugins/builtin/source/content/recent.cpp @@ -279,16 +279,16 @@ namespace hex::plugin::builtin::recent { return; } - auto *provider = ImHexApi::Provider::createProvider(recentEntry.type, true); + auto provider = ImHexApi::Provider::createProvider(recentEntry.type, true); if (provider != nullptr) { provider->loadSettings(recentEntry.data); TaskManager::createBlockingTask("hex.builtin.provider.opening", TaskManager::NoProgress, [provider]() { if (!provider->open() || !provider->isAvailable()) { ui::ToastError::open(fmt::format("hex.builtin.provider.error.open"_lang, provider->getErrorMessage())); - TaskManager::doLater([provider] { ImHexApi::Provider::remove(provider); }); + TaskManager::doLater([provider] { ImHexApi::Provider::remove(provider.get()); }); } else { - TaskManager::doLater([provider]{ EventProviderOpened::post(provider); }); + TaskManager::doLater([provider]{ EventProviderOpened::post(provider.get()); }); } }); diff --git a/plugins/builtin/source/content/views/view_bookmarks.cpp b/plugins/builtin/source/content/views/view_bookmarks.cpp index 52a727edb..2de63aad8 100644 --- a/plugins/builtin/source/content/views/view_bookmarks.cpp +++ b/plugins/builtin/source/content/views/view_bookmarks.cpp @@ -390,7 +390,7 @@ namespace hex::plugin::builtin { auto provider = ImHexApi::Provider::get(); TaskManager::doLater([region, provider, name]{ auto newProvider = ImHexApi::Provider::createProvider("hex.builtin.provider.view", true); - if (auto *viewProvider = dynamic_cast(newProvider); viewProvider != nullptr) { + if (auto *viewProvider = dynamic_cast(newProvider.get()); viewProvider != nullptr) { viewProvider->setProvider(region.getStartAddress(), region.getSize(), provider); viewProvider->setName(fmt::format("'{}' View", name)); diff --git a/plugins/builtin/source/content/views/view_hex_editor.cpp b/plugins/builtin/source/content/views/view_hex_editor.cpp index fbb54aab8..85bb58271 100644 --- a/plugins/builtin/source/content/views/view_hex_editor.cpp +++ b/plugins/builtin/source/content/views/view_hex_editor.cpp @@ -1168,7 +1168,7 @@ namespace hex::plugin::builtin { auto selection = ImHexApi::HexEditor::getSelection(); auto newProvider = ImHexApi::Provider::createProvider("hex.builtin.provider.view", true); - if (auto *viewProvider = dynamic_cast(newProvider); viewProvider != nullptr) { + if (auto *viewProvider = dynamic_cast(newProvider.get()); viewProvider != nullptr) { viewProvider->setProvider(selection->getStartAddress(), selection->getSize(), selection->getProvider()); if (viewProvider->open()) EventProviderOpened::post(viewProvider); diff --git a/plugins/builtin/source/content/welcome_screen.cpp b/plugins/builtin/source/content/welcome_screen.cpp index ae59c35bf..30706584a 100644 --- a/plugins/builtin/source/content/welcome_screen.cpp +++ b/plugins/builtin/source/content/welcome_screen.cpp @@ -347,9 +347,9 @@ namespace hex::plugin::builtin { if (ImGuiExt::IconHyperlink(ICON_VS_NEW_FILE, "hex.builtin.welcome.start.create_file"_lang)) { auto newProvider = hex::ImHexApi::Provider::createProvider("hex.builtin.provider.mem_file", true); if (newProvider != nullptr && !newProvider->open()) - hex::ImHexApi::Provider::remove(newProvider); + hex::ImHexApi::Provider::remove(newProvider.get()); else - EventProviderOpened::post(newProvider); + EventProviderOpened::post(newProvider.get()); } if (ImGuiExt::IconHyperlink(ICON_VS_GO_TO_FILE, "hex.builtin.welcome.start.open_file"_lang)) RequestOpenWindow::post("Open File");