feat: Added basic network interface support
This commit is contained in:
parent
e685d65be8
commit
c006062540
2
lib/external/libwolv
vendored
2
lib/external/libwolv
vendored
@ -1 +1 @@
|
|||||||
Subproject commit 7b441291cd8f13c5d15e104d46b82a3fc493adcf
|
Subproject commit 6b02f52077093975cae49d7fa337b1e490b51841
|
@ -12,6 +12,7 @@
|
|||||||
#include <span>
|
#include <span>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <string_view>
|
#include <string_view>
|
||||||
|
#include <thread>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
@ -813,6 +814,35 @@ namespace hex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace BackgroundServices {
|
||||||
|
|
||||||
|
namespace impl {
|
||||||
|
using Callback = std::function<void()>;
|
||||||
|
|
||||||
|
struct Service {
|
||||||
|
std::string name;
|
||||||
|
std::jthread thread;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<Service> &getServices();
|
||||||
|
void stopServices();
|
||||||
|
}
|
||||||
|
|
||||||
|
void registerService(const std::string &unlocalizedName, const impl::Callback &callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace CommunicationInterface {
|
||||||
|
|
||||||
|
namespace impl {
|
||||||
|
using NetworkCallback = std::function<nlohmann::json(const nlohmann::json &)>;
|
||||||
|
|
||||||
|
std::map<std::string, NetworkCallback> &getNetworkEndpoints();
|
||||||
|
}
|
||||||
|
|
||||||
|
void registerNetworkEndpoint(const std::string &endpoint, const impl::NetworkCallback &callback);
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include <hex/data_processor/node.hpp>
|
#include <hex/data_processor/node.hpp>
|
||||||
|
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
#include <nlohmann/json.hpp>
|
#include <nlohmann/json.hpp>
|
||||||
|
|
||||||
@ -787,4 +788,62 @@ namespace hex {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace ContentRegistry::BackgroundServices {
|
||||||
|
|
||||||
|
namespace impl {
|
||||||
|
|
||||||
|
std::vector<Service> &getServices() {
|
||||||
|
static std::vector<Service> services;
|
||||||
|
|
||||||
|
return services;
|
||||||
|
}
|
||||||
|
|
||||||
|
void stopServices() {
|
||||||
|
for (auto &service : getServices()) {
|
||||||
|
service.thread.request_stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto &service : getServices()) {
|
||||||
|
service.thread.join();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void registerService(const std::string &unlocalizedName, const impl::Callback &callback) {
|
||||||
|
log::debug("Registered new background service: {}", unlocalizedName);
|
||||||
|
|
||||||
|
impl::getServices().push_back(impl::Service {
|
||||||
|
unlocalizedName,
|
||||||
|
std::jthread([callback](const std::stop_token &stopToken){
|
||||||
|
while (!stopToken.stop_requested()) {
|
||||||
|
callback();
|
||||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(50));
|
||||||
|
}
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace ContentRegistry::CommunicationInterface {
|
||||||
|
|
||||||
|
namespace impl {
|
||||||
|
|
||||||
|
std::map<std::string, NetworkCallback> &getNetworkEndpoints() {
|
||||||
|
static std::map<std::string, NetworkCallback> endpoints;
|
||||||
|
|
||||||
|
return endpoints;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void registerNetworkEndpoint(const std::string &endpoint, const impl::NetworkCallback &callback) {
|
||||||
|
log::debug("Registered new network endpoint: {}", endpoint);
|
||||||
|
|
||||||
|
impl::getNetworkEndpoints().insert({ endpoint, callback });
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -325,6 +325,11 @@ namespace hex::init {
|
|||||||
ContentRegistry::FileHandler::impl::getEntries().clear();
|
ContentRegistry::FileHandler::impl::getEntries().clear();
|
||||||
ContentRegistry::Hashes::impl::getHashes().clear();
|
ContentRegistry::Hashes::impl::getHashes().clear();
|
||||||
|
|
||||||
|
ContentRegistry::BackgroundServices::impl::stopServices();
|
||||||
|
ContentRegistry::BackgroundServices::impl::getServices().clear();
|
||||||
|
|
||||||
|
ContentRegistry::CommunicationInterface::impl::getNetworkEndpoints().clear();
|
||||||
|
|
||||||
LayoutManager::reset();
|
LayoutManager::reset();
|
||||||
|
|
||||||
ThemeManager::reset();
|
ThemeManager::reset();
|
||||||
|
@ -164,7 +164,9 @@ namespace hex {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this->m_windowTitle = title;
|
this->m_windowTitle = title;
|
||||||
glfwSetWindowTitle(this->m_window, title.c_str());
|
|
||||||
|
if (this->m_window != nullptr)
|
||||||
|
glfwSetWindowTitle(this->m_window, title.c_str());
|
||||||
});
|
});
|
||||||
|
|
||||||
constexpr static auto CrashBackupFileName = "crash_backup.hexproj";
|
constexpr static auto CrashBackupFileName = "crash_backup.hexproj";
|
||||||
@ -1012,6 +1014,8 @@ namespace hex {
|
|||||||
void Window::exitGLFW() {
|
void Window::exitGLFW() {
|
||||||
glfwDestroyWindow(this->m_window);
|
glfwDestroyWindow(this->m_window);
|
||||||
glfwTerminate();
|
glfwTerminate();
|
||||||
|
|
||||||
|
this->m_window = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window::exitImGui() {
|
void Window::exitImGui() {
|
||||||
|
@ -6,7 +6,9 @@ project(builtin)
|
|||||||
add_library(${PROJECT_NAME} SHARED
|
add_library(${PROJECT_NAME} SHARED
|
||||||
source/plugin_builtin.cpp
|
source/plugin_builtin.cpp
|
||||||
|
|
||||||
|
source/content/background_services.cpp
|
||||||
source/content/command_palette_commands.cpp
|
source/content/command_palette_commands.cpp
|
||||||
|
source/content/communication_interface.cpp
|
||||||
source/content/data_inspector.cpp
|
source/content/data_inspector.cpp
|
||||||
source/content/pl_builtin_functions.cpp
|
source/content/pl_builtin_functions.cpp
|
||||||
source/content/pl_pragmas.cpp
|
source/content/pl_pragmas.cpp
|
||||||
|
@ -421,6 +421,7 @@
|
|||||||
"hex.builtin.setting.general.auto_load_patterns": "Auto-load supported pattern",
|
"hex.builtin.setting.general.auto_load_patterns": "Auto-load supported pattern",
|
||||||
"hex.builtin.setting.general.check_for_updates": "Check for updates on startup",
|
"hex.builtin.setting.general.check_for_updates": "Check for updates on startup",
|
||||||
"hex.builtin.setting.general.enable_unicode": "Load all unicode characters",
|
"hex.builtin.setting.general.enable_unicode": "Load all unicode characters",
|
||||||
|
"hex.builtin.setting.general.network_interface": "Enable network interface",
|
||||||
"hex.builtin.setting.general.save_recent_providers": "Save recently used providers",
|
"hex.builtin.setting.general.save_recent_providers": "Save recently used providers",
|
||||||
"hex.builtin.setting.general.show_tips": "Show tips on startup",
|
"hex.builtin.setting.general.show_tips": "Show tips on startup",
|
||||||
"hex.builtin.setting.general.sync_pattern_source": "Sync pattern source code between providers",
|
"hex.builtin.setting.general.sync_pattern_source": "Sync pattern source code between providers",
|
||||||
|
58
plugins/builtin/source/content/background_services.cpp
Normal file
58
plugins/builtin/source/content/background_services.cpp
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
#include <hex/api/content_registry.hpp>
|
||||||
|
#include <hex/api/localization.hpp>
|
||||||
|
#include <hex/api/event.hpp>
|
||||||
|
|
||||||
|
#include <wolv/net/socket_server.hpp>
|
||||||
|
|
||||||
|
#include <hex/helpers/logger.hpp>
|
||||||
|
|
||||||
|
#include <nlohmann/json.hpp>
|
||||||
|
|
||||||
|
namespace hex::plugin::builtin {
|
||||||
|
|
||||||
|
static bool networkInterfaceServiceEnabled = false;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
void handleNetworkInterfaceService() {
|
||||||
|
if (!networkInterfaceServiceEnabled) {
|
||||||
|
std::this_thread::yield();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
static wolv::net::SocketServer networkInterfaceServer(51337);
|
||||||
|
networkInterfaceServer.accept([](auto, const std::vector<u8> &data) -> std::vector<u8> {
|
||||||
|
nlohmann::json result;
|
||||||
|
|
||||||
|
try {
|
||||||
|
auto json = nlohmann::json::parse(data.begin(), data.end());
|
||||||
|
|
||||||
|
const auto &endpoints = ContentRegistry::CommunicationInterface::impl::getNetworkEndpoints();
|
||||||
|
if (auto callback = endpoints.find(json["endpoint"].get<std::string>()); callback != endpoints.end()) {
|
||||||
|
auto responseData = callback->second(json["data"]);
|
||||||
|
|
||||||
|
result["status"] = "success";
|
||||||
|
result["data"] = responseData;
|
||||||
|
}
|
||||||
|
} catch (const std::exception &e) {
|
||||||
|
log::error("Network interface service error: {}", e.what());
|
||||||
|
|
||||||
|
result["status"] = "error";
|
||||||
|
result["data"]["error"] = e.what();
|
||||||
|
}
|
||||||
|
|
||||||
|
auto resultString = result.dump();
|
||||||
|
return { resultString.begin(), resultString.end() };
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void registerBackgroundServices() {
|
||||||
|
EventManager::subscribe<EventSettingsChanged>([]{
|
||||||
|
networkInterfaceServiceEnabled = bool(ContentRegistry::Settings::read("hex.builtin.setting.general", "hex.builtin.setting.general.network_interface", 0));
|
||||||
|
});
|
||||||
|
|
||||||
|
ContentRegistry::BackgroundServices::registerService("hex.builtin.background_service.network_interface"_lang, handleNetworkInterfaceService);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
17
plugins/builtin/source/content/communication_interface.cpp
Normal file
17
plugins/builtin/source/content/communication_interface.cpp
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#include <hex/api/content_registry.hpp>
|
||||||
|
|
||||||
|
#include <nlohmann/json.hpp>
|
||||||
|
|
||||||
|
namespace hex::plugin::builtin {
|
||||||
|
|
||||||
|
void registerNetworkEndpoints() {
|
||||||
|
ContentRegistry::CommunicationInterface::registerNetworkEndpoint("pattern_editor/set_code", [](const nlohmann::json &data) -> nlohmann::json {
|
||||||
|
auto code = data["code"].get<std::string>();
|
||||||
|
|
||||||
|
EventManager::post<RequestSetPatternLanguageCode>(code);
|
||||||
|
|
||||||
|
return { };
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -113,6 +113,17 @@ namespace hex::plugin::builtin {
|
|||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
ContentRegistry::Settings::add("hex.builtin.setting.general", "hex.builtin.setting.general.network_interface", 0, [](auto name, nlohmann::json &setting) {
|
||||||
|
static bool enabled = static_cast<int>(setting);
|
||||||
|
|
||||||
|
if (ImGui::Checkbox(name.data(), &enabled)) {
|
||||||
|
setting = static_cast<int>(enabled);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
/* Interface */
|
/* Interface */
|
||||||
|
|
||||||
ContentRegistry::Settings::add("hex.builtin.setting.interface", "hex.builtin.setting.interface.color", "Dark", [](auto name, nlohmann::json &setting) {
|
ContentRegistry::Settings::add("hex.builtin.setting.interface", "hex.builtin.setting.interface.color", "Dark", [](auto name, nlohmann::json &setting) {
|
||||||
|
@ -724,6 +724,7 @@ namespace hex::plugin::builtin {
|
|||||||
|
|
||||||
EventManager::subscribe<RequestSetPatternLanguageCode>(this, [this](const std::string &code) {
|
EventManager::subscribe<RequestSetPatternLanguageCode>(this, [this](const std::string &code) {
|
||||||
this->m_textEditor.SetText(code);
|
this->m_textEditor.SetText(code);
|
||||||
|
this->m_hasUnevaluatedChanges = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
EventManager::subscribe<EventSettingsChanged>(this, [this] {
|
EventManager::subscribe<EventSettingsChanged>(this, [this] {
|
||||||
|
@ -28,6 +28,8 @@ namespace hex::plugin::builtin {
|
|||||||
void registerThemeHandlers();
|
void registerThemeHandlers();
|
||||||
void registerStyleHandlers();
|
void registerStyleHandlers();
|
||||||
void registerThemes();
|
void registerThemes();
|
||||||
|
void registerBackgroundServices();
|
||||||
|
void registerNetworkEndpoints();
|
||||||
|
|
||||||
void addFooterItems();
|
void addFooterItems();
|
||||||
void addToolbarItems();
|
void addToolbarItems();
|
||||||
@ -64,6 +66,8 @@ IMHEX_PLUGIN_SETUP("Built-in", "WerWolv", "Default ImHex functionality") {
|
|||||||
registerThemeHandlers();
|
registerThemeHandlers();
|
||||||
registerStyleHandlers();
|
registerStyleHandlers();
|
||||||
registerThemes();
|
registerThemes();
|
||||||
|
registerBackgroundServices();
|
||||||
|
registerNetworkEndpoints();
|
||||||
|
|
||||||
addFooterItems();
|
addFooterItems();
|
||||||
addToolbarItems();
|
addToolbarItems();
|
||||||
|
Loading…
Reference in New Issue
Block a user