mirror of
https://github.com/usatiuk/dhfs.git
synced 2025-10-28 20:47:49 +01:00
dump 3
This commit is contained in:
@@ -29,6 +29,5 @@ if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
endif ()
|
||||
|
||||
add_subdirectory(utils)
|
||||
add_subdirectory(libjvm_wrapper)
|
||||
add_subdirectory(backend)
|
||||
add_subdirectory(gui)
|
||||
|
||||
@@ -1,9 +1,19 @@
|
||||
find_package(wxWidgets REQUIRED COMPONENTS base)
|
||||
if (wxWidgets_USE_FILE) # not defined in CONFIG mode
|
||||
include(${wxWidgets_USE_FILE})
|
||||
endif ()
|
||||
|
||||
add_library(backend
|
||||
src/DhfsInstance.cpp
|
||||
include_public/DhfsInstance.hpp
|
||||
src/DhfsStartOptions.cpp
|
||||
include_public/DhfsStartOptions.hpp
|
||||
src/DhfsWxProcess.cpp
|
||||
include_public/DhfsWxProcess.hpp
|
||||
)
|
||||
|
||||
target_include_directories(backend PRIVATE include)
|
||||
target_include_directories(backend PUBLIC include_public)
|
||||
|
||||
target_link_libraries(backend PUBLIC libjvm_wrapper utils)
|
||||
target_link_libraries(backend PRIVATE ${wxWidgets_LIBRARIES})
|
||||
target_link_libraries(backend PUBLIC utils)
|
||||
|
||||
@@ -5,9 +5,14 @@
|
||||
#ifndef DHFSINSTANCE_HPP
|
||||
#define DHFSINSTANCE_HPP
|
||||
|
||||
#include <jni.h>
|
||||
#include <wx/process.h>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <thread>
|
||||
#include<mutex>
|
||||
|
||||
#include "DhfsStartOptions.hpp"
|
||||
#include "DhfsWxProcess.hpp"
|
||||
|
||||
enum class DhfsInstanceState {
|
||||
RUNNING,
|
||||
@@ -18,19 +23,25 @@ class DhfsInstance {
|
||||
public:
|
||||
DhfsInstance();
|
||||
|
||||
~DhfsInstance();
|
||||
virtual ~DhfsInstance();
|
||||
|
||||
DhfsInstanceState state();
|
||||
|
||||
void start(const std::string& mount_path, const std::vector<std::string>& extra_options);
|
||||
void start(DhfsStartOptions start_options);
|
||||
|
||||
void stop();
|
||||
|
||||
virtual void OnTerminate(int pid, int status) = 0;
|
||||
|
||||
virtual void OnRead(std::string s) = 0;
|
||||
|
||||
protected:
|
||||
std::unique_ptr<wxProcess> process = std::make_unique<DhfsWxProcess>(*this);
|
||||
|
||||
private:
|
||||
DhfsInstanceState _state = DhfsInstanceState::STOPPED;
|
||||
|
||||
JavaVM* _jvm = nullptr;
|
||||
JNIEnv* _env = nullptr;
|
||||
std::thread _readThread;
|
||||
std::mutex _mutex;
|
||||
};
|
||||
|
||||
|
||||
|
||||
25
launcher/backend/include_public/DhfsStartOptions.hpp
Normal file
25
launcher/backend/include_public/DhfsStartOptions.hpp
Normal file
@@ -0,0 +1,25 @@
|
||||
//
|
||||
// Created by Stepan Usatiuk on 25.06.2025.
|
||||
//
|
||||
|
||||
#ifndef DHFSSTARTOPTIONS_HPP
|
||||
#define DHFSSTARTOPTIONS_HPP
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
class DhfsStartOptions {
|
||||
public:
|
||||
std::string java_home;
|
||||
std::string xmx;
|
||||
std::string mount_path;
|
||||
std::string data_path;
|
||||
std::string jar_path;
|
||||
std::string webui_path;
|
||||
std::vector<std::string> extra_options;
|
||||
|
||||
std::vector<std::string> getOptions();
|
||||
};
|
||||
|
||||
|
||||
#endif //DHFSSTARTOPTIONS_HPP
|
||||
24
launcher/backend/include_public/DhfsWxProcess.hpp
Normal file
24
launcher/backend/include_public/DhfsWxProcess.hpp
Normal file
@@ -0,0 +1,24 @@
|
||||
//
|
||||
// Created by Stepan Usatiuk on 25.06.2025.
|
||||
//
|
||||
|
||||
#ifndef DHFSWXPROCESS_HPP
|
||||
#define DHFSWXPROCESS_HPP
|
||||
#include <wx/process.h>
|
||||
|
||||
|
||||
class DhfsInstance;
|
||||
|
||||
class DhfsWxProcess : public wxProcess {
|
||||
public:
|
||||
DhfsWxProcess(DhfsInstance& parent);
|
||||
|
||||
protected:
|
||||
void OnTerminate(int pid, int status) override;
|
||||
|
||||
private:
|
||||
DhfsInstance& _instance;
|
||||
};
|
||||
|
||||
|
||||
#endif //DHFSWXPROCESS_HPP
|
||||
@@ -8,7 +8,6 @@
|
||||
#include <vector>
|
||||
|
||||
#include "Exception.h"
|
||||
#include "LibjvmWrapper.hpp"
|
||||
|
||||
DhfsInstance::DhfsInstance() {
|
||||
}
|
||||
@@ -17,10 +16,12 @@ DhfsInstance::~DhfsInstance() {
|
||||
}
|
||||
|
||||
DhfsInstanceState DhfsInstance::state() {
|
||||
std::lock_guard<std::mutex> lock(_mutex);
|
||||
return _state;
|
||||
}
|
||||
|
||||
void DhfsInstance::start(const std::string& mount_path, const std::vector<std::string>& extra_options) {
|
||||
void DhfsInstance::start(DhfsStartOptions options) {
|
||||
std::lock_guard<std::mutex> lock(_mutex);
|
||||
switch (_state) {
|
||||
case DhfsInstanceState::RUNNING:
|
||||
return;
|
||||
@@ -31,23 +32,39 @@ void DhfsInstance::start(const std::string& mount_path, const std::vector<std::s
|
||||
}
|
||||
_state = DhfsInstanceState::RUNNING;
|
||||
|
||||
JavaVMInitArgs args;
|
||||
std::vector<JavaVMOption> options;
|
||||
for (const auto& option: extra_options) {
|
||||
options.emplace_back((char*) option.c_str(), nullptr);
|
||||
std::vector<char*> args;
|
||||
auto readyOptions = options.getOptions();
|
||||
for (const auto& option: readyOptions) {
|
||||
args.push_back(const_cast<char*>(option.c_str()));
|
||||
}
|
||||
std::string mount_option = "-Ddhfs.fuse.root=";
|
||||
mount_option += mount_path;
|
||||
options.emplace_back((char*) mount_option.c_str(), nullptr);
|
||||
args.version = JNI_VERSION_21;
|
||||
args.nOptions = options.size();
|
||||
args.options = options.data();
|
||||
args.ignoreUnrecognized = false;
|
||||
|
||||
LibjvmWrapper::instance().get_JNI_CreateJavaVM()(&_jvm, (void**) &_env, &args);
|
||||
long ret = wxExecute(args.data(), wxEXEC_ASYNC | wxEXEC_HIDE_CONSOLE | wxEXEC_MAKE_GROUP_LEADER, process.get(),
|
||||
nullptr);
|
||||
if (ret == 0) {
|
||||
_state = DhfsInstanceState::STOPPED;
|
||||
throw Exception("Failed to start DHFS");
|
||||
}
|
||||
|
||||
OnRead("Started! " + std::to_string(ret) + " PID: " + std::to_string(process->GetPid()));
|
||||
|
||||
_readThread = std::thread([&]() {
|
||||
auto stream = process->GetInputStream();
|
||||
while (!stream->Eof()) {
|
||||
char buffer[1024];
|
||||
size_t bytesRead = stream->Read(buffer, sizeof(buffer) - 1).LastRead();
|
||||
if (bytesRead > 0) {
|
||||
buffer[bytesRead] = '\0'; // Null-terminate the string
|
||||
OnRead(std::string(buffer));
|
||||
} else if (bytesRead == 0) {
|
||||
break; // EOF reached
|
||||
}
|
||||
}
|
||||
OnRead("Stream end");
|
||||
});
|
||||
}
|
||||
|
||||
void DhfsInstance::stop() {
|
||||
std::lock_guard<std::mutex> lock(_mutex);
|
||||
switch (_state) {
|
||||
case DhfsInstanceState::RUNNING:
|
||||
break;
|
||||
@@ -57,12 +74,12 @@ void DhfsInstance::stop() {
|
||||
throw std::runtime_error("Unknown DhfsInstanceState");
|
||||
}
|
||||
|
||||
if (_jvm == nullptr)
|
||||
throw Exception("JVM not running");
|
||||
|
||||
JNIEnv* env;
|
||||
_jvm->AttachCurrentThread((void**) &env, nullptr);
|
||||
_jvm->DestroyJavaVM();
|
||||
_jvm = nullptr;
|
||||
_state = DhfsInstanceState::STOPPED;
|
||||
|
||||
int err = wxProcess::Kill(process->GetPid(), wxSIGTERM, wxKILL_CHILDREN);
|
||||
if (err != wxKILL_OK) {
|
||||
throw Exception("Failed to stop DHFS: " + std::to_string(err));
|
||||
}
|
||||
_readThread.join();
|
||||
OnRead("Stopped!");
|
||||
}
|
||||
|
||||
31
launcher/backend/src/DhfsStartOptions.cpp
Normal file
31
launcher/backend/src/DhfsStartOptions.cpp
Normal file
@@ -0,0 +1,31 @@
|
||||
//
|
||||
// Created by Stepan Usatiuk on 25.06.2025.
|
||||
//
|
||||
|
||||
#include "DhfsStartOptions.hpp"
|
||||
|
||||
std::vector<std::string> DhfsStartOptions::getOptions() {
|
||||
std::vector<std::string> out;
|
||||
out.emplace_back(java_home + "/bin/java");
|
||||
out.emplace_back("--enable-preview");
|
||||
out.emplace_back("-Xmx" + xmx);
|
||||
out.emplace_back("-Ddhfs.objects.writeback.limit=16777216");
|
||||
out.emplace_back("-Ddhfs.objects.lru.limit=67108864");
|
||||
out.emplace_back("--add-exports");
|
||||
out.emplace_back("java.base/sun.nio.ch=ALL-UNNAMED");
|
||||
out.emplace_back("--add-exports");
|
||||
out.emplace_back("java.base/jdk.internal.access=ALL-UNNAMED");
|
||||
out.emplace_back("--add-opens=java.base/java.nio=ALL-UNNAMED");
|
||||
// out.emplace_back("-Dquarkus.http.host=0.0.0.0");
|
||||
// out.emplace_back("-Dquarkus.log.category.\"com.usatiuk\".level=INFO");
|
||||
// out.emplace_back("-Dquarkus.log.category.\"com.usatiuk.dhfs\".level=INFO");
|
||||
out.emplace_back("-Ddhfs.fuse.root=" + mount_path);
|
||||
out.emplace_back("-Ddhfs.objects.persistence.root=" + data_path);
|
||||
out.emplace_back("-Ddhfs.webui.root=" + webui_path);
|
||||
for (auto option: extra_options) {
|
||||
out.emplace_back(option);
|
||||
}
|
||||
out.emplace_back("-jar");
|
||||
out.emplace_back(jar_path);
|
||||
return out;
|
||||
}
|
||||
14
launcher/backend/src/DhfsWxProcess.cpp
Normal file
14
launcher/backend/src/DhfsWxProcess.cpp
Normal file
@@ -0,0 +1,14 @@
|
||||
//
|
||||
// Created by Stepan Usatiuk on 25.06.2025.
|
||||
//
|
||||
|
||||
#include "DhfsWxProcess.hpp"
|
||||
|
||||
#include "DhfsInstance.hpp"
|
||||
|
||||
DhfsWxProcess::DhfsWxProcess(DhfsInstance& parent): wxProcess(wxPROCESS_REDIRECT), _instance(parent) {
|
||||
}
|
||||
|
||||
void DhfsWxProcess::OnTerminate(int pid, int status) {
|
||||
_instance.stop();
|
||||
}
|
||||
@@ -8,6 +8,8 @@ add_executable(launcher
|
||||
src/LauncherApp.cpp
|
||||
src/GLauncherApp.cpp
|
||||
src/LauncherAppMainFrame.cpp
|
||||
src/DhfsGuiInstance.cpp
|
||||
src/DhfsGuiInstance.hpp
|
||||
)
|
||||
|
||||
target_link_libraries(launcher ${wxWidgets_LIBRARIES})
|
||||
|
||||
23
launcher/gui/src/DhfsGuiInstance.cpp
Normal file
23
launcher/gui/src/DhfsGuiInstance.cpp
Normal file
@@ -0,0 +1,23 @@
|
||||
//
|
||||
// Created by Stepan Usatiuk on 25.06.2025.
|
||||
//
|
||||
|
||||
#include "DhfsGuiInstance.hpp"
|
||||
|
||||
#include "LauncherAppMainFrame.h"
|
||||
|
||||
DhfsGuiInstance::DhfsGuiInstance(LauncherAppMainFrame& parent): _parent(parent) {
|
||||
}
|
||||
|
||||
void DhfsGuiInstance::OnTerminate(int pid, int status) {
|
||||
wxCommandEvent* event = new wxCommandEvent(SHUTDOWN_EVENT, _parent.GetId());
|
||||
event->SetEventObject(&_parent);
|
||||
_parent.GetEventHandler()->QueueEvent(event);
|
||||
}
|
||||
|
||||
void DhfsGuiInstance::OnRead(std::string s) {
|
||||
wxCommandEvent* event = new wxCommandEvent(NEW_LINE_OUTPUT_EVENT, _parent.GetId());
|
||||
event->SetEventObject(&_parent);
|
||||
event->SetString(std::move(s));
|
||||
_parent.GetEventHandler()->QueueEvent(event);
|
||||
}
|
||||
25
launcher/gui/src/DhfsGuiInstance.hpp
Normal file
25
launcher/gui/src/DhfsGuiInstance.hpp
Normal file
@@ -0,0 +1,25 @@
|
||||
//
|
||||
// Created by Stepan Usatiuk on 25.06.2025.
|
||||
//
|
||||
|
||||
#ifndef DHFSGUIINSTANCE_HPP
|
||||
#define DHFSGUIINSTANCE_HPP
|
||||
#include "DhfsInstance.hpp"
|
||||
|
||||
|
||||
class LauncherAppMainFrame;
|
||||
|
||||
class DhfsGuiInstance : public DhfsInstance {
|
||||
public:
|
||||
DhfsGuiInstance(LauncherAppMainFrame& parent);
|
||||
|
||||
void OnTerminate(int pid, int status) override;
|
||||
|
||||
void OnRead(std::string s) override;
|
||||
|
||||
protected:
|
||||
LauncherAppMainFrame& _parent;
|
||||
};
|
||||
|
||||
|
||||
#endif //DHFSGUIINSTANCE_HPP
|
||||
@@ -53,8 +53,18 @@ MainFrame::MainFrame( wxWindow* parent, wxWindowID id, const wxString& title, co
|
||||
m_panel1->SetSizer( bSizer2 );
|
||||
m_panel1->Layout();
|
||||
bSizer2->Fit( m_panel1 );
|
||||
m_notebook1->AddPage( m_panel1, _("Info"), false );
|
||||
m_notebook1->AddPage( m_panel1, _("Info"), true );
|
||||
m_panel3 = new wxPanel( m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
wxGridSizer* gSizer1;
|
||||
gSizer1 = new wxGridSizer( 1, 1, 0, 0 );
|
||||
|
||||
m_logOutputTextCtrl = new wxTextCtrl( m_panel3, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY );
|
||||
gSizer1->Add( m_logOutputTextCtrl, 0, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
m_panel3->SetSizer( gSizer1 );
|
||||
m_panel3->Layout();
|
||||
gSizer1->Fit( m_panel3 );
|
||||
m_notebook1->AddPage( m_panel3, _("Logs"), false );
|
||||
m_panel2 = new wxPanel( m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
wxBoxSizer* bSizer5;
|
||||
@@ -120,7 +130,7 @@ MainFrame::MainFrame( wxWindow* parent, wxWindowID id, const wxString& title, co
|
||||
m_panel4 = new wxPanel( m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
m_notebook1->AddPage( m_panel4, _("Advanced Settings"), false );
|
||||
m_panel5 = new wxPanel( m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||
m_notebook1->AddPage( m_panel5, _("a page"), true );
|
||||
m_notebook1->AddPage( m_panel5, _("a page"), false );
|
||||
|
||||
bSizer3->Add( m_notebook1, 1, wxALL|wxEXPAND, 5 );
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <wx/sizer.h>
|
||||
#include <wx/statbox.h>
|
||||
#include <wx/panel.h>
|
||||
#include <wx/textctrl.h>
|
||||
#include <wx/filepicker.h>
|
||||
#include <wx/notebook.h>
|
||||
#include <wx/frame.h>
|
||||
@@ -45,6 +46,7 @@ class MainFrame : public wxFrame
|
||||
wxStaticText* m_statusText;
|
||||
wxButton* m_startStopButton;
|
||||
wxPanel* m_panel3;
|
||||
wxTextCtrl* m_logOutputTextCtrl;
|
||||
wxPanel* m_panel2;
|
||||
wxButton* m_button2;
|
||||
wxDirPickerCtrl* m_javaHomeDirPicker;
|
||||
|
||||
@@ -4,7 +4,9 @@
|
||||
#include <wx/fileconf.h>
|
||||
|
||||
#include "Exception.h"
|
||||
#include "LibjvmWrapper.hpp"
|
||||
|
||||
wxDEFINE_EVENT(NEW_LINE_OUTPUT_EVENT, wxCommandEvent);
|
||||
wxDEFINE_EVENT(SHUTDOWN_EVENT, wxCommandEvent);
|
||||
|
||||
LauncherAppMainFrame::LauncherAppMainFrame(wxWindow* parent)
|
||||
: MainFrame(parent) {
|
||||
@@ -19,28 +21,57 @@ LauncherAppMainFrame::LauncherAppMainFrame(wxWindow* parent)
|
||||
m_webView = wxWebView::New(m_panel5, wxID_ANY);
|
||||
bSizer4->Add(m_webView, 0, wxALL | wxEXPAND);
|
||||
m_webView->LoadURL("http://localhost:8080");
|
||||
|
||||
Bind(NEW_LINE_OUTPUT_EVENT, &LauncherAppMainFrame::onNewLineOutput, this);
|
||||
Bind(SHUTDOWN_EVENT, &LauncherAppMainFrame::onShutdown, this);
|
||||
wxFont font = wxFont(wxSize(16, 16),
|
||||
wxFontFamily::wxFONTFAMILY_TELETYPE,
|
||||
wxFontStyle::wxFONTSTYLE_NORMAL,
|
||||
wxFontWeight::wxFONTWEIGHT_NORMAL);
|
||||
m_logOutputTextCtrl->SetFont(font);
|
||||
updateState();
|
||||
}
|
||||
|
||||
void LauncherAppMainFrame::updateState() {
|
||||
switch (_dhfsInstance.state()) {
|
||||
case DhfsInstanceState::RUNNING:
|
||||
m_statusText->SetLabel("Running");
|
||||
m_startStopButton->SetLabel("Stop");
|
||||
m_statusBar1->SetStatusText("Running", 0);
|
||||
break;
|
||||
case DhfsInstanceState::STOPPED: {
|
||||
// wxFileConfig::Get()->Read(kJavaHomeSettingsKey).ToStdString();
|
||||
m_statusText->SetLabel("Stopped");
|
||||
m_startStopButton->SetLabel("Start");
|
||||
m_statusBar1->SetStatusText("Stopped", 0);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
throw Exception("Unhandled switch case");
|
||||
}
|
||||
}
|
||||
|
||||
void LauncherAppMainFrame::OnStartStopButtonClick(wxCommandEvent& event) {
|
||||
switch (_dhfsInstance.state()) {
|
||||
case DhfsInstanceState::RUNNING:
|
||||
m_statusText->SetLabel("Stopped");
|
||||
m_startStopButton->SetLabel("Start");
|
||||
m_statusBar1->SetStatusText("Stopped", 0);
|
||||
_dhfsInstance.stop();
|
||||
break;
|
||||
case DhfsInstanceState::STOPPED:
|
||||
LibjvmWrapper::instance().setJavaHome(wxFileConfig::Get()->Read(kJavaHomeSettingsKey).ToStdString());
|
||||
m_statusText->SetLabel("Running");
|
||||
m_startStopButton->SetLabel("Stop");
|
||||
m_statusBar1->SetStatusText("Running", 0);
|
||||
_dhfsInstance.start(wxFileConfig::Get()->Read(kMountPointSettingsKey).ToStdString(), {
|
||||
case DhfsInstanceState::STOPPED: {
|
||||
DhfsStartOptions options;
|
||||
options.java_home = wxFileConfig::Get()->Read(kJavaHomeSettingsKey);
|
||||
options.xmx = "512m"; // Default memory allocation, can be changed
|
||||
options.mount_path = wxFileConfig::Get()->Read(kMountPointSettingsKey);
|
||||
options.data_path = "/Users/stepus53/dhfs_test/launcher/data";
|
||||
options.jar_path = "/Users/stepus53/projects/dhfs/dhfs-parent/dhfs-fuse/target/quarkus-app/quarkus-run.jar";
|
||||
options.webui_path = "/Users/stepus53/projects/dhfs/webui/dist";
|
||||
|
||||
});
|
||||
_dhfsInstance.start(options);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
throw Exception("Unhandled switch case");
|
||||
}
|
||||
updateState();
|
||||
}
|
||||
|
||||
void LauncherAppMainFrame::OnJavaHomeChanged(wxFileDirPickerEvent& event) {
|
||||
@@ -50,3 +81,12 @@ void LauncherAppMainFrame::OnJavaHomeChanged(wxFileDirPickerEvent& event) {
|
||||
void LauncherAppMainFrame::OnMountPathChanged(wxFileDirPickerEvent& event) {
|
||||
wxFileConfig::Get()->Write(kMountPointSettingsKey, event.GetPath());
|
||||
}
|
||||
|
||||
void LauncherAppMainFrame::onNewLineOutput(wxCommandEvent& event) {
|
||||
m_logOutputTextCtrl->AppendText(event.GetString());
|
||||
}
|
||||
|
||||
void LauncherAppMainFrame::onShutdown(wxCommandEvent& event) {
|
||||
m_logOutputTextCtrl->AppendText("Shutdown");
|
||||
updateState();
|
||||
}
|
||||
|
||||
@@ -10,11 +10,16 @@ Subclass of MainFrame, which is generated by wxFormBuilder.
|
||||
|
||||
//// end generated include
|
||||
|
||||
#include "DhfsInstance.hpp"
|
||||
#include <wx/webview.h>
|
||||
|
||||
#include "DhfsGuiInstance.hpp"
|
||||
|
||||
static constexpr auto kJavaHomeSettingsKey = "DHFS/JavaHome";
|
||||
static constexpr auto kMountPointSettingsKey = "DHFS/MountDir";
|
||||
|
||||
wxDECLARE_EVENT(NEW_LINE_OUTPUT_EVENT, wxCommandEvent);
|
||||
wxDECLARE_EVENT(SHUTDOWN_EVENT, wxCommandEvent);
|
||||
|
||||
/** Implementing MainFrame */
|
||||
class LauncherAppMainFrame : public MainFrame {
|
||||
protected:
|
||||
@@ -25,6 +30,12 @@ protected:
|
||||
|
||||
void OnMountPathChanged(wxFileDirPickerEvent& event) override;
|
||||
|
||||
void onNewLineOutput(wxCommandEvent& event);
|
||||
|
||||
void onShutdown(wxCommandEvent& event);
|
||||
|
||||
void updateState();
|
||||
|
||||
public:
|
||||
/** Constructor */
|
||||
LauncherAppMainFrame(wxWindow* parent);
|
||||
@@ -34,7 +45,7 @@ public:
|
||||
private:
|
||||
wxWebView* m_webView;
|
||||
|
||||
DhfsInstance _dhfsInstance;
|
||||
DhfsGuiInstance _dhfsInstance{*this};
|
||||
};
|
||||
|
||||
#endif // __LauncherAppMainFrame__
|
||||
|
||||
@@ -455,6 +455,80 @@
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style">wxTAB_TRAVERSAL</property>
|
||||
<object class="wxGridSizer" expanded="true">
|
||||
<property name="cols">1</property>
|
||||
<property name="hgap">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">gSizer1</property>
|
||||
<property name="permission">none</property>
|
||||
<property name="rows">1</property>
|
||||
<property name="vgap">0</property>
|
||||
<object class="sizeritem" expanded="true">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxALL|wxEXPAND</property>
|
||||
<property name="proportion">0</property>
|
||||
<object class="wxTextCtrl" expanded="true">
|
||||
<property name="BottomDockable">1</property>
|
||||
<property name="LeftDockable">1</property>
|
||||
<property name="RightDockable">1</property>
|
||||
<property name="TopDockable">1</property>
|
||||
<property name="aui_layer">0</property>
|
||||
<property name="aui_name"></property>
|
||||
<property name="aui_position">0</property>
|
||||
<property name="aui_row">0</property>
|
||||
<property name="best_size"></property>
|
||||
<property name="bg"></property>
|
||||
<property name="caption"></property>
|
||||
<property name="caption_visible">1</property>
|
||||
<property name="center_pane">0</property>
|
||||
<property name="close_button">1</property>
|
||||
<property name="context_help"></property>
|
||||
<property name="context_menu">1</property>
|
||||
<property name="default_pane">0</property>
|
||||
<property name="dock">Dock</property>
|
||||
<property name="dock_fixed">0</property>
|
||||
<property name="docking">Left</property>
|
||||
<property name="drag_accept_files">0</property>
|
||||
<property name="enabled">1</property>
|
||||
<property name="fg"></property>
|
||||
<property name="floatable">1</property>
|
||||
<property name="font"></property>
|
||||
<property name="gripper">0</property>
|
||||
<property name="hidden">0</property>
|
||||
<property name="id">wxID_ANY</property>
|
||||
<property name="max_size"></property>
|
||||
<property name="maximize_button">0</property>
|
||||
<property name="maximum_size"></property>
|
||||
<property name="maxlength">0</property>
|
||||
<property name="min_size"></property>
|
||||
<property name="minimize_button">0</property>
|
||||
<property name="minimum_size"></property>
|
||||
<property name="moveable">1</property>
|
||||
<property name="name">m_textCtrl2</property>
|
||||
<property name="pane_border">1</property>
|
||||
<property name="pane_position"></property>
|
||||
<property name="pane_size"></property>
|
||||
<property name="permission">protected</property>
|
||||
<property name="pin_button">1</property>
|
||||
<property name="pos"></property>
|
||||
<property name="resize">Resizable</property>
|
||||
<property name="show">1</property>
|
||||
<property name="size"></property>
|
||||
<property name="style">wxTE_MULTILINE|wxTE_READONLY</property>
|
||||
<property name="subclass">; ; forward_declare</property>
|
||||
<property name="toolbar_pane">0</property>
|
||||
<property name="tooltip"></property>
|
||||
<property name="validator_data_type"></property>
|
||||
<property name="validator_style">wxFILTER_NONE</property>
|
||||
<property name="validator_type">wxDefaultValidator</property>
|
||||
<property name="validator_variable"></property>
|
||||
<property name="value"></property>
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style"></property>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
<object class="notebookpage" expanded="true">
|
||||
@@ -1055,23 +1129,6 @@
|
||||
<property name="window_extra_style"></property>
|
||||
<property name="window_name"></property>
|
||||
<property name="window_style">wxTAB_TRAVERSAL</property>
|
||||
<object class="wxBoxSizer" expanded="true">
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">bSizer4</property>
|
||||
<property name="orient">wxVERTICAL</property>
|
||||
<property name="permission">none</property>
|
||||
<object class="sizeritem" expanded="true">
|
||||
<property name="border">5</property>
|
||||
<property name="flag">wxEXPAND</property>
|
||||
<property name="proportion">1</property>
|
||||
<object class="wxBoxSizer" expanded="true">
|
||||
<property name="minimum_size"></property>
|
||||
<property name="name">bSizer51</property>
|
||||
<property name="orient">wxHORIZONTAL</property>
|
||||
<property name="permission">none</property>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
</object>
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
add_library(libjvm_wrapper
|
||||
src/LibjvmWrapper.cpp
|
||||
include_public/LibjvmWrapper.hpp
|
||||
)
|
||||
|
||||
target_include_directories(libjvm_wrapper PRIVATE include)
|
||||
target_include_directories(libjvm_wrapper PUBLIC include_public)
|
||||
|
||||
find_package(JNI REQUIRED)
|
||||
target_include_directories(libjvm_wrapper PUBLIC ${JNI_INCLUDE_DIRS})
|
||||
|
||||
target_link_libraries(libjvm_wrapper PUBLIC utils)
|
||||
@@ -1,34 +0,0 @@
|
||||
//
|
||||
// Created by Stepan Usatiuk on 24.06.2025.
|
||||
//
|
||||
|
||||
#ifndef LIBJVMWRAPPER_HPP
|
||||
#define LIBJVMWRAPPER_HPP
|
||||
|
||||
#include <jni.h>
|
||||
#include <string>
|
||||
|
||||
class LibjvmWrapper {
|
||||
public:
|
||||
static LibjvmWrapper& instance();
|
||||
|
||||
void setJavaHome(const std::string& javaHome);
|
||||
|
||||
decltype(JNI_CreateJavaVM)* get_JNI_CreateJavaVM();
|
||||
|
||||
private:
|
||||
void load();
|
||||
|
||||
void unload();
|
||||
|
||||
LibjvmWrapper();
|
||||
|
||||
~LibjvmWrapper();
|
||||
|
||||
void* _lib_handle = nullptr;
|
||||
decltype(JNI_CreateJavaVM)* WJNI_CreateJavaVM = nullptr;
|
||||
std::string _java_home;
|
||||
};
|
||||
|
||||
|
||||
#endif //LIBJVMWRAPPER_HPP
|
||||
@@ -1,59 +0,0 @@
|
||||
//
|
||||
// Created by Stepan Usatiuk on 24.06.2025.
|
||||
//
|
||||
|
||||
#include "LibjvmWrapper.hpp"
|
||||
#include <dlfcn.h>
|
||||
#include <jni.h>
|
||||
|
||||
#include "Exception.h"
|
||||
|
||||
LibjvmWrapper& LibjvmWrapper::instance() {
|
||||
static LibjvmWrapper instance;
|
||||
return instance;
|
||||
}
|
||||
|
||||
LibjvmWrapper::LibjvmWrapper() {
|
||||
}
|
||||
|
||||
void LibjvmWrapper::load() {
|
||||
if (_java_home == "")
|
||||
throw Exception("Java home not set");
|
||||
if (_lib_handle != nullptr)
|
||||
throw Exception("load() called when already loaded");
|
||||
|
||||
std::string javaHomeAppended;
|
||||
javaHomeAppended = _java_home + "/lib/server/libjvm.so";
|
||||
|
||||
_lib_handle = dlopen(javaHomeAppended.c_str(), RTLD_NOW | RTLD_GLOBAL);
|
||||
if (_lib_handle == nullptr)
|
||||
throw Exception(dlerror());
|
||||
WJNI_CreateJavaVM = reinterpret_cast<decltype(WJNI_CreateJavaVM)>(
|
||||
dlsym(_lib_handle, "JNI_CreateJavaVM"));
|
||||
if (WJNI_CreateJavaVM == nullptr)
|
||||
throw Exception(dlerror());
|
||||
}
|
||||
|
||||
void LibjvmWrapper::unload() {
|
||||
if (_lib_handle != nullptr) {
|
||||
dlclose(_lib_handle);
|
||||
_lib_handle = nullptr;
|
||||
WJNI_CreateJavaVM = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
decltype(JNI_CreateJavaVM)* LibjvmWrapper::get_JNI_CreateJavaVM() {
|
||||
if (WJNI_CreateJavaVM == nullptr) {
|
||||
load();
|
||||
}
|
||||
return WJNI_CreateJavaVM;
|
||||
}
|
||||
|
||||
LibjvmWrapper::~LibjvmWrapper() {
|
||||
unload();
|
||||
}
|
||||
|
||||
void LibjvmWrapper::setJavaHome(const std::string& javaHome) {
|
||||
unload();
|
||||
_java_home = javaHome;
|
||||
}
|
||||
@@ -7,8 +7,6 @@
|
||||
#include <execinfo.h>
|
||||
#include <sstream>
|
||||
|
||||
#include <openssl/err.h>
|
||||
|
||||
Exception::Exception(const std::string& text) : runtime_error(text + "\n" + getStacktrace()) {
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user