mirror of
https://github.com/usatiuk/dhfs.git
synced 2025-10-28 20:47:49 +01:00
Compare commits
3 Commits
6b89dbcc46
...
686cc550db
| Author | SHA1 | Date | |
|---|---|---|---|
| 686cc550db | |||
| b6efcede21 | |||
| e69f6e4bbb |
@@ -28,6 +28,7 @@ if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
|
|||||||
add_link_options(-O3)
|
add_link_options(-O3)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
add_subdirectory(utils)
|
||||||
add_subdirectory(libjvm_wrapper)
|
add_subdirectory(libjvm_wrapper)
|
||||||
add_subdirectory(backend)
|
add_subdirectory(backend)
|
||||||
add_subdirectory(gui)
|
add_subdirectory(gui)
|
||||||
|
|||||||
@@ -6,4 +6,4 @@ add_library(backend
|
|||||||
target_include_directories(backend PRIVATE include)
|
target_include_directories(backend PRIVATE include)
|
||||||
target_include_directories(backend PUBLIC include_public)
|
target_include_directories(backend PUBLIC include_public)
|
||||||
|
|
||||||
target_link_libraries(backend PUBLIC libjvm_wrapper)
|
target_link_libraries(backend PUBLIC libjvm_wrapper utils)
|
||||||
|
|||||||
@@ -6,6 +6,8 @@
|
|||||||
#define DHFSINSTANCE_HPP
|
#define DHFSINSTANCE_HPP
|
||||||
|
|
||||||
#include <jni.h>
|
#include <jni.h>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
enum class DhfsInstanceState {
|
enum class DhfsInstanceState {
|
||||||
RUNNING,
|
RUNNING,
|
||||||
@@ -20,7 +22,7 @@ public:
|
|||||||
|
|
||||||
DhfsInstanceState state();
|
DhfsInstanceState state();
|
||||||
|
|
||||||
void start();
|
void start(const std::string& mount_path, const std::vector<std::string>& extra_options);
|
||||||
|
|
||||||
void stop();
|
void stop();
|
||||||
|
|
||||||
@@ -28,7 +30,7 @@ private:
|
|||||||
DhfsInstanceState _state = DhfsInstanceState::STOPPED;
|
DhfsInstanceState _state = DhfsInstanceState::STOPPED;
|
||||||
|
|
||||||
JavaVM* _jvm = nullptr;
|
JavaVM* _jvm = nullptr;
|
||||||
JNIEnv *_env = nullptr;
|
JNIEnv* _env = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include "Exception.h"
|
||||||
#include "LibjvmWrapper.hpp"
|
#include "LibjvmWrapper.hpp"
|
||||||
|
|
||||||
DhfsInstance::DhfsInstance() {
|
DhfsInstance::DhfsInstance() {
|
||||||
@@ -16,9 +17,10 @@ DhfsInstance::~DhfsInstance() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
DhfsInstanceState DhfsInstance::state() {
|
DhfsInstanceState DhfsInstance::state() {
|
||||||
|
return _state;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DhfsInstance::start() {
|
void DhfsInstance::start(const std::string& mount_path, const std::vector<std::string>& extra_options) {
|
||||||
switch (_state) {
|
switch (_state) {
|
||||||
case DhfsInstanceState::RUNNING:
|
case DhfsInstanceState::RUNNING:
|
||||||
return;
|
return;
|
||||||
@@ -27,15 +29,22 @@ void DhfsInstance::start() {
|
|||||||
default:
|
default:
|
||||||
throw std::runtime_error("Unknown DhfsInstanceState");
|
throw std::runtime_error("Unknown DhfsInstanceState");
|
||||||
}
|
}
|
||||||
|
_state = DhfsInstanceState::RUNNING;
|
||||||
|
|
||||||
JavaVMInitArgs args;
|
JavaVMInitArgs args;
|
||||||
std::vector<JavaVMOption> options;
|
std::vector<JavaVMOption> options;
|
||||||
|
for (const auto& option: extra_options) {
|
||||||
|
options.emplace_back((char*) option.c_str(), nullptr);
|
||||||
|
}
|
||||||
|
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.version = JNI_VERSION_21;
|
||||||
args.nOptions = 0;
|
args.nOptions = options.size();
|
||||||
args.options = options.data();
|
args.options = options.data();
|
||||||
args.ignoreUnrecognized = false;
|
args.ignoreUnrecognized = false;
|
||||||
|
|
||||||
LibjvmWrapper::instance().JNI_CreateJavaVM(&_jvm, (void**) &_env, &args);
|
LibjvmWrapper::instance().get_JNI_CreateJavaVM()(&_jvm, (void**) &_env, &args);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DhfsInstance::stop() {
|
void DhfsInstance::stop() {
|
||||||
@@ -47,4 +56,13 @@ void DhfsInstance::stop() {
|
|||||||
default:
|
default:
|
||||||
throw std::runtime_error("Unknown DhfsInstanceState");
|
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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
find_package(wxWidgets REQUIRED COMPONENTS net core base)
|
find_package(wxWidgets REQUIRED COMPONENTS net core base webview)
|
||||||
if (wxWidgets_USE_FILE) # not defined in CONFIG mode
|
if (wxWidgets_USE_FILE) # not defined in CONFIG mode
|
||||||
include(${wxWidgets_USE_FILE})
|
include(${wxWidgets_USE_FILE})
|
||||||
endif ()
|
endif ()
|
||||||
@@ -11,4 +11,4 @@ add_executable(launcher
|
|||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(launcher ${wxWidgets_LIBRARIES})
|
target_link_libraries(launcher ${wxWidgets_LIBRARIES})
|
||||||
target_link_libraries(launcher backend)
|
target_link_libraries(launcher backend utils)
|
||||||
@@ -30,9 +30,9 @@ MainFrame::MainFrame( wxWindow* parent, wxWindowID id, const wxString& title, co
|
|||||||
gbSizer1->SetFlexibleDirection( wxBOTH );
|
gbSizer1->SetFlexibleDirection( wxBOTH );
|
||||||
gbSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
gbSizer1->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||||
|
|
||||||
m_staticText1 = new wxStaticText( sbSizer4->GetStaticBox(), wxID_ANY, _("Running"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_statusText = new wxStaticText( sbSizer4->GetStaticBox(), wxID_ANY, _("Running"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_staticText1->Wrap( -1 );
|
m_statusText->Wrap( -1 );
|
||||||
gbSizer1->Add( m_staticText1, wxGBPosition( 0, 0 ), wxGBSpan( 1, 1 ), wxALL, 5 );
|
gbSizer1->Add( m_statusText, wxGBPosition( 0, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||||
|
|
||||||
m_startStopButton = new wxButton( sbSizer4->GetStaticBox(), wxID_ANY, _("Start"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_startStopButton = new wxButton( sbSizer4->GetStaticBox(), wxID_ANY, _("Start"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
gbSizer1->Add( m_startStopButton, wxGBPosition( 0, 1 ), wxGBSpan( 1, 1 ), wxALL, 5 );
|
gbSizer1->Add( m_startStopButton, wxGBPosition( 0, 1 ), wxGBSpan( 1, 1 ), wxALL, 5 );
|
||||||
@@ -41,23 +41,86 @@ MainFrame::MainFrame( wxWindow* parent, wxWindowID id, const wxString& title, co
|
|||||||
sbSizer4->Add( gbSizer1, 1, wxEXPAND, 5 );
|
sbSizer4->Add( gbSizer1, 1, wxEXPAND, 5 );
|
||||||
|
|
||||||
|
|
||||||
bSizer2->Add( sbSizer4, 1, wxEXPAND, 5 );
|
bSizer2->Add( sbSizer4, 1, wxALL|wxEXPAND, 5 );
|
||||||
|
|
||||||
wxStaticBoxSizer* sbSizer6;
|
wxStaticBoxSizer* sbSizer6;
|
||||||
sbSizer6 = new wxStaticBoxSizer( new wxStaticBox( m_panel1, wxID_ANY, _("Statistics") ), wxVERTICAL );
|
sbSizer6 = new wxStaticBoxSizer( new wxStaticBox( m_panel1, wxID_ANY, _("Statistics") ), wxVERTICAL );
|
||||||
|
|
||||||
|
|
||||||
bSizer2->Add( sbSizer6, 1, wxEXPAND, 5 );
|
bSizer2->Add( sbSizer6, 1, wxALL|wxEXPAND, 5 );
|
||||||
|
|
||||||
|
|
||||||
m_panel1->SetSizer( bSizer2 );
|
m_panel1->SetSizer( bSizer2 );
|
||||||
m_panel1->Layout();
|
m_panel1->Layout();
|
||||||
bSizer2->Fit( m_panel1 );
|
bSizer2->Fit( m_panel1 );
|
||||||
m_notebook1->AddPage( m_panel1, _("Info"), true );
|
m_notebook1->AddPage( m_panel1, _("Info"), false );
|
||||||
m_panel3 = new wxPanel( m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
m_panel3 = new wxPanel( m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||||
m_notebook1->AddPage( m_panel3, _("Logs"), false );
|
m_notebook1->AddPage( m_panel3, _("Logs"), false );
|
||||||
m_panel2 = new wxPanel( m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
m_panel2 = new wxPanel( m_notebook1, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
|
||||||
|
wxBoxSizer* bSizer5;
|
||||||
|
bSizer5 = new wxBoxSizer( wxVERTICAL );
|
||||||
|
|
||||||
|
wxStaticBoxSizer* sbSizer3;
|
||||||
|
sbSizer3 = new wxStaticBoxSizer( new wxStaticBox( m_panel2, wxID_ANY, _("JVM") ), wxVERTICAL );
|
||||||
|
|
||||||
|
wxGridBagSizer* gbSizer2;
|
||||||
|
gbSizer2 = new wxGridBagSizer( 0, 0 );
|
||||||
|
gbSizer2->SetFlexibleDirection( wxBOTH );
|
||||||
|
gbSizer2->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||||
|
|
||||||
|
m_button2 = new wxButton( sbSizer3->GetStaticBox(), wxID_ANY, _("Reset"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
gbSizer2->Add( m_button2, wxGBPosition( 0, 3 ), wxGBSpan( 1, 1 ), wxALL, 5 );
|
||||||
|
|
||||||
|
|
||||||
|
gbSizer2->Add( 50, 0, wxGBPosition( 0, 2 ), wxGBSpan( 1, 1 ), wxEXPAND, 5 );
|
||||||
|
|
||||||
|
m_javaHomeDirPicker = new wxDirPickerCtrl( sbSizer3->GetStaticBox(), wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, wxDIRP_DEFAULT_STYLE|wxDIRP_USE_TEXTCTRL );
|
||||||
|
gbSizer2->Add( m_javaHomeDirPicker, wxGBPosition( 0, 1 ), wxGBSpan( 1, 1 ), wxALL|wxEXPAND, 5 );
|
||||||
|
|
||||||
|
m_staticText2 = new wxStaticText( sbSizer3->GetStaticBox(), wxID_ANY, _("Java Home"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
m_staticText2->Wrap( -1 );
|
||||||
|
gbSizer2->Add( m_staticText2, wxGBPosition( 0, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||||
|
|
||||||
|
|
||||||
|
gbSizer2->AddGrowableCol( 1 );
|
||||||
|
|
||||||
|
sbSizer3->Add( gbSizer2, 1, wxEXPAND, 5 );
|
||||||
|
|
||||||
|
|
||||||
|
bSizer5->Add( sbSizer3, 1, wxALL|wxEXPAND|wxFIXED_MINSIZE, 5 );
|
||||||
|
|
||||||
|
wxStaticBoxSizer* sbSizer41;
|
||||||
|
sbSizer41 = new wxStaticBoxSizer( new wxStaticBox( m_panel2, wxID_ANY, _("Paths") ), wxVERTICAL );
|
||||||
|
|
||||||
|
wxGridBagSizer* gbSizer3;
|
||||||
|
gbSizer3 = new wxGridBagSizer( 0, 0 );
|
||||||
|
gbSizer3->SetFlexibleDirection( wxBOTH );
|
||||||
|
gbSizer3->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
|
||||||
|
|
||||||
|
m_staticText6 = new wxStaticText( sbSizer41->GetStaticBox(), wxID_ANY, _("Mount path"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
m_staticText6->Wrap( -1 );
|
||||||
|
gbSizer3->Add( m_staticText6, wxGBPosition( 0, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxALL, 5 );
|
||||||
|
|
||||||
|
m_mountPathDirPicker = new wxDirPickerCtrl( sbSizer41->GetStaticBox(), wxID_ANY, wxEmptyString, _("Select a folder"), wxDefaultPosition, wxDefaultSize, wxDIRP_DEFAULT_STYLE|wxDIRP_USE_TEXTCTRL );
|
||||||
|
gbSizer3->Add( m_mountPathDirPicker, wxGBPosition( 0, 1 ), wxGBSpan( 1, 1 ), wxALL|wxEXPAND, 5 );
|
||||||
|
|
||||||
|
|
||||||
|
gbSizer3->AddGrowableCol( 1 );
|
||||||
|
|
||||||
|
sbSizer41->Add( gbSizer3, 1, wxEXPAND, 5 );
|
||||||
|
|
||||||
|
|
||||||
|
bSizer5->Add( sbSizer41, 1, wxALL|wxEXPAND, 5 );
|
||||||
|
|
||||||
|
|
||||||
|
m_panel2->SetSizer( bSizer5 );
|
||||||
|
m_panel2->Layout();
|
||||||
|
bSizer5->Fit( m_panel2 );
|
||||||
m_notebook1->AddPage( m_panel2, _("Settings"), false );
|
m_notebook1->AddPage( m_panel2, _("Settings"), false );
|
||||||
|
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 );
|
||||||
|
|
||||||
bSizer3->Add( m_notebook1, 1, wxALL|wxEXPAND, 5 );
|
bSizer3->Add( m_notebook1, 1, wxALL|wxEXPAND, 5 );
|
||||||
|
|
||||||
@@ -69,6 +132,8 @@ MainFrame::MainFrame( wxWindow* parent, wxWindowID id, const wxString& title, co
|
|||||||
|
|
||||||
// Connect Events
|
// Connect Events
|
||||||
m_startStopButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrame::OnStartStopButtonClick ), NULL, this );
|
m_startStopButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrame::OnStartStopButtonClick ), NULL, this );
|
||||||
|
m_javaHomeDirPicker->Connect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainFrame::OnJavaHomeChanged ), NULL, this );
|
||||||
|
m_mountPathDirPicker->Connect( wxEVT_COMMAND_DIRPICKER_CHANGED, wxFileDirPickerEventHandler( MainFrame::OnMountPathChanged ), NULL, this );
|
||||||
}
|
}
|
||||||
|
|
||||||
MainFrame::~MainFrame()
|
MainFrame::~MainFrame()
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
#include <wx/sizer.h>
|
#include <wx/sizer.h>
|
||||||
#include <wx/statbox.h>
|
#include <wx/statbox.h>
|
||||||
#include <wx/panel.h>
|
#include <wx/panel.h>
|
||||||
|
#include <wx/filepicker.h>
|
||||||
#include <wx/notebook.h>
|
#include <wx/notebook.h>
|
||||||
#include <wx/frame.h>
|
#include <wx/frame.h>
|
||||||
|
|
||||||
@@ -41,18 +42,27 @@ class MainFrame : public wxFrame
|
|||||||
wxStatusBar* m_statusBar1;
|
wxStatusBar* m_statusBar1;
|
||||||
wxNotebook* m_notebook1;
|
wxNotebook* m_notebook1;
|
||||||
wxPanel* m_panel1;
|
wxPanel* m_panel1;
|
||||||
wxStaticText* m_staticText1;
|
wxStaticText* m_statusText;
|
||||||
wxButton* m_startStopButton;
|
wxButton* m_startStopButton;
|
||||||
wxPanel* m_panel3;
|
wxPanel* m_panel3;
|
||||||
wxPanel* m_panel2;
|
wxPanel* m_panel2;
|
||||||
|
wxButton* m_button2;
|
||||||
|
wxDirPickerCtrl* m_javaHomeDirPicker;
|
||||||
|
wxStaticText* m_staticText2;
|
||||||
|
wxStaticText* m_staticText6;
|
||||||
|
wxDirPickerCtrl* m_mountPathDirPicker;
|
||||||
|
wxPanel* m_panel4;
|
||||||
|
wxPanel* m_panel5;
|
||||||
|
|
||||||
// Virtual event handlers, override them in your derived class
|
// Virtual event handlers, override them in your derived class
|
||||||
virtual void OnStartStopButtonClick( wxCommandEvent& event ) { event.Skip(); }
|
virtual void OnStartStopButtonClick( wxCommandEvent& event ) { event.Skip(); }
|
||||||
|
virtual void OnJavaHomeChanged( wxFileDirPickerEvent& event ) { event.Skip(); }
|
||||||
|
virtual void OnMountPathChanged( wxFileDirPickerEvent& event ) { event.Skip(); }
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
MainFrame( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("DHFS"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 500,300 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL, const wxString& name = wxT("DHFS") );
|
MainFrame( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("DHFS"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 499,341 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL, const wxString& name = wxT("DHFS") );
|
||||||
|
|
||||||
~MainFrame();
|
~MainFrame();
|
||||||
|
|
||||||
|
|||||||
@@ -15,11 +15,13 @@
|
|||||||
|
|
||||||
#include "LauncherAppMainFrame.h"
|
#include "LauncherAppMainFrame.h"
|
||||||
#include "wx/taskbar.h"
|
#include "wx/taskbar.h"
|
||||||
|
#include <wx/fileconf.h>
|
||||||
IMPLEMENT_APP(LauncherApp)
|
IMPLEMENT_APP(LauncherApp)
|
||||||
|
|
||||||
// This is executed upon startup, like 'main()' in non-wxWidgets programs.
|
// This is executed upon startup, like 'main()' in non-wxWidgets programs.
|
||||||
bool LauncherApp::OnInit() {
|
bool LauncherApp::OnInit() {
|
||||||
|
wxFileConfig::Get()->SetAppName("DHFS");
|
||||||
|
|
||||||
wxFrame* frame = new LauncherAppMainFrame(NULL);
|
wxFrame* frame = new LauncherAppMainFrame(NULL);
|
||||||
frame->Show(true);
|
frame->Show(true);
|
||||||
SetTopWindow(frame);
|
SetTopWindow(frame);
|
||||||
@@ -31,3 +33,12 @@ bool LauncherApp::OnInit() {
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool LauncherApp::OnExceptionInMainLoop() {
|
||||||
|
try {
|
||||||
|
std::rethrow_exception(std::current_exception());
|
||||||
|
} catch (const std::exception& e) {
|
||||||
|
wxMessageBox(e.what(), "Error", wxOK | wxICON_ERROR | wxCENTRE, GetTopWindow());
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|||||||
@@ -9,7 +9,9 @@
|
|||||||
// containing a statusbar with the text "Hello World"
|
// containing a statusbar with the text "Hello World"
|
||||||
class LauncherApp : public wxApp {
|
class LauncherApp : public wxApp {
|
||||||
public:
|
public:
|
||||||
virtual bool OnInit();
|
virtual bool OnInit() override;
|
||||||
|
|
||||||
|
virtual bool OnExceptionInMainLoop() override;
|
||||||
};
|
};
|
||||||
|
|
||||||
DECLARE_APP(LauncherApp)
|
DECLARE_APP(LauncherApp)
|
||||||
|
|||||||
@@ -1,13 +1,52 @@
|
|||||||
#include "LauncherAppMainFrame.h"
|
#include "LauncherAppMainFrame.h"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <wx/fileconf.h>
|
||||||
|
|
||||||
|
#include "Exception.h"
|
||||||
|
#include "LibjvmWrapper.hpp"
|
||||||
|
|
||||||
LauncherAppMainFrame::LauncherAppMainFrame(wxWindow* parent)
|
LauncherAppMainFrame::LauncherAppMainFrame(wxWindow* parent)
|
||||||
: MainFrame(parent) {
|
: MainFrame(parent) {
|
||||||
|
m_javaHomeDirPicker->SetPath(wxFileConfig::Get()->Read(kJavaHomeSettingsKey));
|
||||||
|
m_mountPathDirPicker->SetPath(wxFileConfig::Get()->Read(kMountPointSettingsKey));
|
||||||
|
wxGridSizer* bSizer4;
|
||||||
|
bSizer4 = new wxGridSizer(1, 0, 0);
|
||||||
|
|
||||||
|
m_panel5->SetSizer(bSizer4);
|
||||||
|
m_panel5->Layout();
|
||||||
|
bSizer4->Fit(m_panel5);
|
||||||
|
m_webView = wxWebView::New(m_panel5, wxID_ANY);
|
||||||
|
bSizer4->Add(m_webView, 0, wxALL | wxEXPAND);
|
||||||
|
m_webView->LoadURL("http://localhost:8080");
|
||||||
}
|
}
|
||||||
|
|
||||||
void LauncherAppMainFrame::OnStartStopButtonClick(wxCommandEvent& event) {
|
void LauncherAppMainFrame::OnStartStopButtonClick(wxCommandEvent& event) {
|
||||||
std::cout << "Hi!" << std::endl;
|
switch (_dhfsInstance.state()) {
|
||||||
_dhfsInstance.start();
|
case DhfsInstanceState::RUNNING:
|
||||||
// TODO: Implement OnStartStopButtonClick
|
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(), {
|
||||||
|
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw Exception("Unhandled switch case");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void LauncherAppMainFrame::OnJavaHomeChanged(wxFileDirPickerEvent& event) {
|
||||||
|
wxFileConfig::Get()->Write(kJavaHomeSettingsKey, event.GetPath());
|
||||||
|
}
|
||||||
|
|
||||||
|
void LauncherAppMainFrame::OnMountPathChanged(wxFileDirPickerEvent& event) {
|
||||||
|
wxFileConfig::Get()->Write(kMountPointSettingsKey, event.GetPath());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,12 +11,19 @@ Subclass of MainFrame, which is generated by wxFormBuilder.
|
|||||||
//// end generated include
|
//// end generated include
|
||||||
|
|
||||||
#include "DhfsInstance.hpp"
|
#include "DhfsInstance.hpp"
|
||||||
|
#include <wx/webview.h>
|
||||||
|
static constexpr auto kJavaHomeSettingsKey = "DHFS/JavaHome";
|
||||||
|
static constexpr auto kMountPointSettingsKey = "DHFS/MountDir";
|
||||||
|
|
||||||
/** Implementing MainFrame */
|
/** Implementing MainFrame */
|
||||||
class LauncherAppMainFrame : public MainFrame {
|
class LauncherAppMainFrame : public MainFrame {
|
||||||
protected:
|
protected:
|
||||||
// Handlers for MainFrame events.
|
// Handlers for MainFrame events.
|
||||||
void OnStartStopButtonClick(wxCommandEvent& event);
|
void OnStartStopButtonClick(wxCommandEvent& event) override;
|
||||||
|
|
||||||
|
void OnJavaHomeChanged(wxFileDirPickerEvent& event) override;
|
||||||
|
|
||||||
|
void OnMountPathChanged(wxFileDirPickerEvent& event) override;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/** Constructor */
|
/** Constructor */
|
||||||
@@ -25,6 +32,8 @@ public:
|
|||||||
//// end generated class members
|
//// end generated class members
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
wxWebView* m_webView;
|
||||||
|
|
||||||
DhfsInstance _dhfsInstance;
|
DhfsInstance _dhfsInstance;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -50,7 +50,7 @@
|
|||||||
<property name="minimum_size">100,50</property>
|
<property name="minimum_size">100,50</property>
|
||||||
<property name="name">MainFrame</property>
|
<property name="name">MainFrame</property>
|
||||||
<property name="pos"></property>
|
<property name="pos"></property>
|
||||||
<property name="size">500,300</property>
|
<property name="size">499,341</property>
|
||||||
<property name="style">wxDEFAULT_FRAME_STYLE</property>
|
<property name="style">wxDEFAULT_FRAME_STYLE</property>
|
||||||
<property name="subclass">; ; forward_declare</property>
|
<property name="subclass">; ; forward_declare</property>
|
||||||
<property name="title">DHFS</property>
|
<property name="title">DHFS</property>
|
||||||
@@ -150,8 +150,8 @@
|
|||||||
<object class="notebookpage" expanded="true">
|
<object class="notebookpage" expanded="true">
|
||||||
<property name="bitmap"></property>
|
<property name="bitmap"></property>
|
||||||
<property name="label">Info</property>
|
<property name="label">Info</property>
|
||||||
<property name="select">1</property>
|
<property name="select">0</property>
|
||||||
<object class="wxPanel" expanded="false">
|
<object class="wxPanel" expanded="true">
|
||||||
<property name="BottomDockable">1</property>
|
<property name="BottomDockable">1</property>
|
||||||
<property name="LeftDockable">1</property>
|
<property name="LeftDockable">1</property>
|
||||||
<property name="RightDockable">1</property>
|
<property name="RightDockable">1</property>
|
||||||
@@ -203,16 +203,16 @@
|
|||||||
<property name="window_extra_style"></property>
|
<property name="window_extra_style"></property>
|
||||||
<property name="window_name"></property>
|
<property name="window_name"></property>
|
||||||
<property name="window_style">wxTAB_TRAVERSAL</property>
|
<property name="window_style">wxTAB_TRAVERSAL</property>
|
||||||
<object class="wxBoxSizer" expanded="false">
|
<object class="wxBoxSizer" expanded="true">
|
||||||
<property name="minimum_size"></property>
|
<property name="minimum_size"></property>
|
||||||
<property name="name">bSizer2</property>
|
<property name="name">bSizer2</property>
|
||||||
<property name="orient">wxVERTICAL</property>
|
<property name="orient">wxVERTICAL</property>
|
||||||
<property name="permission">none</property>
|
<property name="permission">none</property>
|
||||||
<object class="sizeritem" expanded="false">
|
<object class="sizeritem" expanded="true">
|
||||||
<property name="border">5</property>
|
<property name="border">5</property>
|
||||||
<property name="flag">wxEXPAND</property>
|
<property name="flag">wxALL|wxEXPAND</property>
|
||||||
<property name="proportion">1</property>
|
<property name="proportion">1</property>
|
||||||
<object class="wxStaticBoxSizer" expanded="false">
|
<object class="wxStaticBoxSizer" expanded="true">
|
||||||
<property name="id">wxID_ANY</property>
|
<property name="id">wxID_ANY</property>
|
||||||
<property name="label">Status</property>
|
<property name="label">Status</property>
|
||||||
<property name="minimum_size"></property>
|
<property name="minimum_size"></property>
|
||||||
@@ -239,7 +239,7 @@
|
|||||||
<property name="border">5</property>
|
<property name="border">5</property>
|
||||||
<property name="colspan">1</property>
|
<property name="colspan">1</property>
|
||||||
<property name="column">0</property>
|
<property name="column">0</property>
|
||||||
<property name="flag">wxALL</property>
|
<property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
|
||||||
<property name="row">0</property>
|
<property name="row">0</property>
|
||||||
<property name="rowspan">1</property>
|
<property name="rowspan">1</property>
|
||||||
<object class="wxStaticText" expanded="false">
|
<object class="wxStaticText" expanded="false">
|
||||||
@@ -280,7 +280,7 @@
|
|||||||
<property name="minimize_button">0</property>
|
<property name="minimize_button">0</property>
|
||||||
<property name="minimum_size"></property>
|
<property name="minimum_size"></property>
|
||||||
<property name="moveable">1</property>
|
<property name="moveable">1</property>
|
||||||
<property name="name">m_staticText1</property>
|
<property name="name">m_statusText</property>
|
||||||
<property name="pane_border">1</property>
|
<property name="pane_border">1</property>
|
||||||
<property name="pane_position"></property>
|
<property name="pane_position"></property>
|
||||||
<property name="pane_size"></property>
|
<property name="pane_size"></property>
|
||||||
@@ -384,7 +384,7 @@
|
|||||||
</object>
|
</object>
|
||||||
<object class="sizeritem" expanded="false">
|
<object class="sizeritem" expanded="false">
|
||||||
<property name="border">5</property>
|
<property name="border">5</property>
|
||||||
<property name="flag">wxEXPAND</property>
|
<property name="flag">wxALL|wxEXPAND</property>
|
||||||
<property name="proportion">1</property>
|
<property name="proportion">1</property>
|
||||||
<object class="wxStaticBoxSizer" expanded="false">
|
<object class="wxStaticBoxSizer" expanded="false">
|
||||||
<property name="id">wxID_ANY</property>
|
<property name="id">wxID_ANY</property>
|
||||||
@@ -461,7 +461,7 @@
|
|||||||
<property name="bitmap"></property>
|
<property name="bitmap"></property>
|
||||||
<property name="label">Settings</property>
|
<property name="label">Settings</property>
|
||||||
<property name="select">0</property>
|
<property name="select">0</property>
|
||||||
<object class="wxPanel" expanded="true">
|
<object class="wxPanel" expanded="false">
|
||||||
<property name="BottomDockable">1</property>
|
<property name="BottomDockable">1</property>
|
||||||
<property name="LeftDockable">1</property>
|
<property name="LeftDockable">1</property>
|
||||||
<property name="RightDockable">1</property>
|
<property name="RightDockable">1</property>
|
||||||
@@ -513,6 +513,565 @@
|
|||||||
<property name="window_extra_style"></property>
|
<property name="window_extra_style"></property>
|
||||||
<property name="window_name"></property>
|
<property name="window_name"></property>
|
||||||
<property name="window_style">wxTAB_TRAVERSAL</property>
|
<property name="window_style">wxTAB_TRAVERSAL</property>
|
||||||
|
<object class="wxBoxSizer" expanded="false">
|
||||||
|
<property name="minimum_size"></property>
|
||||||
|
<property name="name">bSizer5</property>
|
||||||
|
<property name="orient">wxVERTICAL</property>
|
||||||
|
<property name="permission">none</property>
|
||||||
|
<object class="sizeritem" expanded="false">
|
||||||
|
<property name="border">5</property>
|
||||||
|
<property name="flag">wxALL|wxEXPAND|wxFIXED_MINSIZE</property>
|
||||||
|
<property name="proportion">1</property>
|
||||||
|
<object class="wxStaticBoxSizer" expanded="false">
|
||||||
|
<property name="id">wxID_ANY</property>
|
||||||
|
<property name="label">JVM</property>
|
||||||
|
<property name="minimum_size"></property>
|
||||||
|
<property name="name">sbSizer3</property>
|
||||||
|
<property name="orient">wxVERTICAL</property>
|
||||||
|
<property name="parent">1</property>
|
||||||
|
<property name="permission">none</property>
|
||||||
|
<object class="sizeritem" expanded="false">
|
||||||
|
<property name="border">5</property>
|
||||||
|
<property name="flag">wxEXPAND</property>
|
||||||
|
<property name="proportion">1</property>
|
||||||
|
<object class="wxGridBagSizer" expanded="false">
|
||||||
|
<property name="empty_cell_size"></property>
|
||||||
|
<property name="flexible_direction">wxBOTH</property>
|
||||||
|
<property name="growablecols">1</property>
|
||||||
|
<property name="growablerows"></property>
|
||||||
|
<property name="hgap">0</property>
|
||||||
|
<property name="minimum_size"></property>
|
||||||
|
<property name="name">gbSizer2</property>
|
||||||
|
<property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
|
||||||
|
<property name="permission">none</property>
|
||||||
|
<property name="vgap">0</property>
|
||||||
|
<object class="gbsizeritem" expanded="false">
|
||||||
|
<property name="border">5</property>
|
||||||
|
<property name="colspan">1</property>
|
||||||
|
<property name="column">3</property>
|
||||||
|
<property name="flag">wxALL</property>
|
||||||
|
<property name="row">0</property>
|
||||||
|
<property name="rowspan">1</property>
|
||||||
|
<object class="wxButton" expanded="false">
|
||||||
|
<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="auth_needed">0</property>
|
||||||
|
<property name="best_size"></property>
|
||||||
|
<property name="bg"></property>
|
||||||
|
<property name="bitmap"></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="current"></property>
|
||||||
|
<property name="default">0</property>
|
||||||
|
<property name="default_pane">0</property>
|
||||||
|
<property name="disabled"></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="focus"></property>
|
||||||
|
<property name="font"></property>
|
||||||
|
<property name="gripper">0</property>
|
||||||
|
<property name="hidden">0</property>
|
||||||
|
<property name="id">wxID_ANY</property>
|
||||||
|
<property name="label">Reset</property>
|
||||||
|
<property name="margins"></property>
|
||||||
|
<property name="markup">0</property>
|
||||||
|
<property name="max_size"></property>
|
||||||
|
<property name="maximize_button">0</property>
|
||||||
|
<property name="maximum_size"></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_button2</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="position"></property>
|
||||||
|
<property name="pressed"></property>
|
||||||
|
<property name="resize">Resizable</property>
|
||||||
|
<property name="show">1</property>
|
||||||
|
<property name="size"></property>
|
||||||
|
<property name="style"></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="window_extra_style"></property>
|
||||||
|
<property name="window_name"></property>
|
||||||
|
<property name="window_style"></property>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
|
<object class="gbsizeritem" expanded="false">
|
||||||
|
<property name="border">5</property>
|
||||||
|
<property name="colspan">1</property>
|
||||||
|
<property name="column">2</property>
|
||||||
|
<property name="flag">wxEXPAND</property>
|
||||||
|
<property name="row">0</property>
|
||||||
|
<property name="rowspan">1</property>
|
||||||
|
<object class="spacer" expanded="false">
|
||||||
|
<property name="height">0</property>
|
||||||
|
<property name="permission">protected</property>
|
||||||
|
<property name="width">50</property>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
|
<object class="gbsizeritem" expanded="false">
|
||||||
|
<property name="border">5</property>
|
||||||
|
<property name="colspan">1</property>
|
||||||
|
<property name="column">1</property>
|
||||||
|
<property name="flag">wxALL|wxEXPAND</property>
|
||||||
|
<property name="row">0</property>
|
||||||
|
<property name="rowspan">1</property>
|
||||||
|
<object class="wxDirPickerCtrl" expanded="false">
|
||||||
|
<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="message">Select a folder</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_javaHomeDirPicker</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">wxDIRP_DEFAULT_STYLE|wxDIRP_USE_TEXTCTRL</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>
|
||||||
|
<event name="OnDirChanged">OnJavaHomeChanged</event>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
|
<object class="gbsizeritem" expanded="false">
|
||||||
|
<property name="border">5</property>
|
||||||
|
<property name="colspan">1</property>
|
||||||
|
<property name="column">0</property>
|
||||||
|
<property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
|
||||||
|
<property name="row">0</property>
|
||||||
|
<property name="rowspan">1</property>
|
||||||
|
<object class="wxStaticText" expanded="false">
|
||||||
|
<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="label">Java Home</property>
|
||||||
|
<property name="markup">0</property>
|
||||||
|
<property name="max_size"></property>
|
||||||
|
<property name="maximize_button">0</property>
|
||||||
|
<property name="maximum_size"></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_staticText2</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"></property>
|
||||||
|
<property name="subclass">; ; forward_declare</property>
|
||||||
|
<property name="toolbar_pane">0</property>
|
||||||
|
<property name="tooltip"></property>
|
||||||
|
<property name="window_extra_style"></property>
|
||||||
|
<property name="window_name"></property>
|
||||||
|
<property name="window_style"></property>
|
||||||
|
<property name="wrap">-1</property>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
|
<object class="sizeritem" expanded="false">
|
||||||
|
<property name="border">5</property>
|
||||||
|
<property name="flag">wxALL|wxEXPAND</property>
|
||||||
|
<property name="proportion">1</property>
|
||||||
|
<object class="wxStaticBoxSizer" expanded="false">
|
||||||
|
<property name="id">wxID_ANY</property>
|
||||||
|
<property name="label">Paths</property>
|
||||||
|
<property name="minimum_size"></property>
|
||||||
|
<property name="name">sbSizer41</property>
|
||||||
|
<property name="orient">wxVERTICAL</property>
|
||||||
|
<property name="parent">1</property>
|
||||||
|
<property name="permission">none</property>
|
||||||
|
<object class="sizeritem" expanded="false">
|
||||||
|
<property name="border">5</property>
|
||||||
|
<property name="flag">wxEXPAND</property>
|
||||||
|
<property name="proportion">1</property>
|
||||||
|
<object class="wxGridBagSizer" expanded="false">
|
||||||
|
<property name="empty_cell_size"></property>
|
||||||
|
<property name="flexible_direction">wxBOTH</property>
|
||||||
|
<property name="growablecols">1</property>
|
||||||
|
<property name="growablerows"></property>
|
||||||
|
<property name="hgap">0</property>
|
||||||
|
<property name="minimum_size"></property>
|
||||||
|
<property name="name">gbSizer3</property>
|
||||||
|
<property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
|
||||||
|
<property name="permission">none</property>
|
||||||
|
<property name="vgap">0</property>
|
||||||
|
<object class="gbsizeritem" expanded="false">
|
||||||
|
<property name="border">5</property>
|
||||||
|
<property name="colspan">1</property>
|
||||||
|
<property name="column">0</property>
|
||||||
|
<property name="flag">wxALIGN_CENTER_VERTICAL|wxALL</property>
|
||||||
|
<property name="row">0</property>
|
||||||
|
<property name="rowspan">1</property>
|
||||||
|
<object class="wxStaticText" expanded="false">
|
||||||
|
<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="label">Mount path</property>
|
||||||
|
<property name="markup">0</property>
|
||||||
|
<property name="max_size"></property>
|
||||||
|
<property name="maximize_button">0</property>
|
||||||
|
<property name="maximum_size"></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_staticText6</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"></property>
|
||||||
|
<property name="subclass">; ; forward_declare</property>
|
||||||
|
<property name="toolbar_pane">0</property>
|
||||||
|
<property name="tooltip"></property>
|
||||||
|
<property name="window_extra_style"></property>
|
||||||
|
<property name="window_name"></property>
|
||||||
|
<property name="window_style"></property>
|
||||||
|
<property name="wrap">-1</property>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
|
<object class="gbsizeritem" expanded="false">
|
||||||
|
<property name="border">5</property>
|
||||||
|
<property name="colspan">1</property>
|
||||||
|
<property name="column">1</property>
|
||||||
|
<property name="flag">wxALL|wxEXPAND</property>
|
||||||
|
<property name="row">0</property>
|
||||||
|
<property name="rowspan">1</property>
|
||||||
|
<object class="wxDirPickerCtrl" expanded="false">
|
||||||
|
<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="message">Select a folder</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_mountPathDirPicker</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">wxDIRP_DEFAULT_STYLE|wxDIRP_USE_TEXTCTRL</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>
|
||||||
|
<event name="OnDirChanged">OnMountPathChanged</event>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
|
<object class="notebookpage" expanded="true">
|
||||||
|
<property name="bitmap"></property>
|
||||||
|
<property name="label">Advanced Settings</property>
|
||||||
|
<property name="select">0</property>
|
||||||
|
<object class="wxPanel" 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="min_size"></property>
|
||||||
|
<property name="minimize_button">0</property>
|
||||||
|
<property name="minimum_size"></property>
|
||||||
|
<property name="moveable">1</property>
|
||||||
|
<property name="name">m_panel4</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="subclass">; ; forward_declare</property>
|
||||||
|
<property name="toolbar_pane">0</property>
|
||||||
|
<property name="tooltip"></property>
|
||||||
|
<property name="window_extra_style"></property>
|
||||||
|
<property name="window_name"></property>
|
||||||
|
<property name="window_style">wxTAB_TRAVERSAL</property>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
|
<object class="notebookpage" expanded="true">
|
||||||
|
<property name="bitmap"></property>
|
||||||
|
<property name="label">a page</property>
|
||||||
|
<property name="select">1</property>
|
||||||
|
<object class="wxPanel" 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="min_size"></property>
|
||||||
|
<property name="minimize_button">0</property>
|
||||||
|
<property name="minimum_size"></property>
|
||||||
|
<property name="moveable">1</property>
|
||||||
|
<property name="name">m_panel5</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="subclass">; ; forward_declare</property>
|
||||||
|
<property name="toolbar_pane">0</property>
|
||||||
|
<property name="tooltip"></property>
|
||||||
|
<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>
|
</object>
|
||||||
</object>
|
</object>
|
||||||
|
|||||||
@@ -7,4 +7,6 @@ target_include_directories(libjvm_wrapper PRIVATE include)
|
|||||||
target_include_directories(libjvm_wrapper PUBLIC include_public)
|
target_include_directories(libjvm_wrapper PUBLIC include_public)
|
||||||
|
|
||||||
find_package(JNI REQUIRED)
|
find_package(JNI REQUIRED)
|
||||||
target_include_directories(libjvm_wrapper PUBLIC ${JNI_INCLUDE_DIRS})
|
target_include_directories(libjvm_wrapper PUBLIC ${JNI_INCLUDE_DIRS})
|
||||||
|
|
||||||
|
target_link_libraries(libjvm_wrapper PUBLIC utils)
|
||||||
@@ -4,21 +4,30 @@
|
|||||||
|
|
||||||
#ifndef LIBJVMWRAPPER_HPP
|
#ifndef LIBJVMWRAPPER_HPP
|
||||||
#define LIBJVMWRAPPER_HPP
|
#define LIBJVMWRAPPER_HPP
|
||||||
#include <jni.h>
|
|
||||||
|
|
||||||
|
#include <jni.h>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
class LibjvmWrapper {
|
class LibjvmWrapper {
|
||||||
public:
|
public:
|
||||||
static LibjvmWrapper& instance();
|
static LibjvmWrapper& instance();
|
||||||
|
|
||||||
decltype(JNI_CreateJavaVM)* JNI_CreateJavaVM;
|
void setJavaHome(const std::string& javaHome);
|
||||||
|
|
||||||
|
decltype(JNI_CreateJavaVM)* get_JNI_CreateJavaVM();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void load();
|
||||||
|
|
||||||
|
void unload();
|
||||||
|
|
||||||
LibjvmWrapper();
|
LibjvmWrapper();
|
||||||
|
|
||||||
~LibjvmWrapper();
|
~LibjvmWrapper();
|
||||||
|
|
||||||
void* _lib_handle;
|
void* _lib_handle = nullptr;
|
||||||
|
decltype(JNI_CreateJavaVM)* WJNI_CreateJavaVM = nullptr;
|
||||||
|
std::string _java_home;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,8 +6,7 @@
|
|||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
#include <jni.h>
|
#include <jni.h>
|
||||||
|
|
||||||
static constexpr auto LIBJVM_PATH =
|
#include "Exception.h"
|
||||||
"/Library/Java/JavaVirtualMachines/zulu-21.jdk/Contents/Home/lib/server/libjvm.dylib";
|
|
||||||
|
|
||||||
LibjvmWrapper& LibjvmWrapper::instance() {
|
LibjvmWrapper& LibjvmWrapper::instance() {
|
||||||
static LibjvmWrapper instance;
|
static LibjvmWrapper instance;
|
||||||
@@ -15,11 +14,46 @@ LibjvmWrapper& LibjvmWrapper::instance() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
LibjvmWrapper::LibjvmWrapper() {
|
LibjvmWrapper::LibjvmWrapper() {
|
||||||
_lib_handle = dlopen(LIBJVM_PATH, RTLD_NOW | RTLD_GLOBAL);
|
}
|
||||||
JNI_CreateJavaVM = reinterpret_cast<decltype(JNI_CreateJavaVM)>(
|
|
||||||
|
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"));
|
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() {
|
LibjvmWrapper::~LibjvmWrapper() {
|
||||||
dlclose(_lib_handle);
|
unload();
|
||||||
|
}
|
||||||
|
|
||||||
|
void LibjvmWrapper::setJavaHome(const std::string& javaHome) {
|
||||||
|
unload();
|
||||||
|
_java_home = javaHome;
|
||||||
}
|
}
|
||||||
|
|||||||
7
launcher/utils/CMakeLists.txt
Normal file
7
launcher/utils/CMakeLists.txt
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
add_library(utils
|
||||||
|
src/Exception.cpp
|
||||||
|
include_public/Exception.h
|
||||||
|
)
|
||||||
|
|
||||||
|
target_include_directories(utils PRIVATE include)
|
||||||
|
target_include_directories(utils PUBLIC include_public)
|
||||||
30
launcher/utils/include_public/Exception.h
Normal file
30
launcher/utils/include_public/Exception.h
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
//
|
||||||
|
// Created by Stepan Usatiuk on 01.05.2023.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef SEMBACKUP_EXCEPTION_H
|
||||||
|
#define SEMBACKUP_EXCEPTION_H
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
/// Custom exception class that uses execinfo to append a stacktrace to the exception message
|
||||||
|
class Exception : public std::runtime_error {
|
||||||
|
public:
|
||||||
|
Exception(const std::string& text);
|
||||||
|
Exception(const char* text);
|
||||||
|
|
||||||
|
private:
|
||||||
|
/// Static function to get the current stacktrace
|
||||||
|
static std::string getStacktrace();
|
||||||
|
};
|
||||||
|
|
||||||
|
class ErrnoException : public Exception {
|
||||||
|
public:
|
||||||
|
ErrnoException(const std::string& text) : Exception(text + " " + std::strerror(errno)) {}
|
||||||
|
ErrnoException(const char* text) : Exception(std::string(text) + " " + std::strerror(errno)) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // SEMBACKUP_EXCEPTION_H
|
||||||
37
launcher/utils/src/Exception.cpp
Normal file
37
launcher/utils/src/Exception.cpp
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
//
|
||||||
|
// Created by Stepan Usatiuk on 01.05.2023.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "Exception.h"
|
||||||
|
|
||||||
|
#include <execinfo.h>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
|
#include <openssl/err.h>
|
||||||
|
|
||||||
|
Exception::Exception(const std::string& text) : runtime_error(text + "\n" + getStacktrace()) {
|
||||||
|
}
|
||||||
|
|
||||||
|
Exception::Exception(const char* text) : runtime_error(std::string(text) + "\n" + getStacktrace()) {
|
||||||
|
}
|
||||||
|
|
||||||
|
// Based on: https://www.gnu.org/software/libc/manual/html_node/Backtraces.html
|
||||||
|
std::string Exception::getStacktrace() {
|
||||||
|
std::vector<void*> functions(50);
|
||||||
|
char** strings;
|
||||||
|
int n;
|
||||||
|
|
||||||
|
n = backtrace(functions.data(), 50);
|
||||||
|
strings = backtrace_symbols(functions.data(), n);
|
||||||
|
|
||||||
|
std::stringstream out;
|
||||||
|
|
||||||
|
if (strings != nullptr) {
|
||||||
|
out << "Stacktrace:" << std::endl;
|
||||||
|
for (int i = 0; i < n; i++)
|
||||||
|
out << strings[i] << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(strings);
|
||||||
|
return out.str();
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user