Skip to content

Commit 676b116

Browse files
committed
feat!: stub access mode, sync to api changes
1 parent 1f229ea commit 676b116

4 files changed

Lines changed: 117 additions & 35 deletions

File tree

src/dialogs/loader.cpp

Lines changed: 53 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,24 @@
22
#include "support/utils.h"
33
#include <QPushButton>
44

5-
LoaderDialog::LoaderDialog(RDContextSlice ctxslice, QWidget* parent)
6-
: QDialog{parent}, m_ui{this}, m_contextslice{ctxslice} {
5+
LoaderDialog::LoaderDialog(RDTestResultSlice ctxslice, QWidget* parent)
6+
: QDialog{parent}, m_ui{this}, m_testslice{ctxslice} {
77
utils::configure_hex_input(m_ui.leentrypoint);
88
utils::configure_hex_input(m_ui.leaddress);
99
utils::configure_hex_input(m_ui.leoffset);
1010

11+
this->accept_params.min_string = RD_MIN_STRING_LENGTH;
12+
1113
m_ui.gbaddressing->setEnabled(false);
1214
m_ui.leentrypoint->setText(QString{"0"}.repeated(sizeof(u32) * 2));
1315
m_ui.leaddress->setText(QString{"0"}.repeated(sizeof(u32) * 2));
1416
m_ui.leoffset->setText(QString{"0"}.repeated(sizeof(u32) * 2));
1517

1618
this->populate_processors();
1719

18-
for(usize i = 0; i < rd_slice_length(m_contextslice); i++) {
20+
for(usize i = 0; i < rd_slice_length(m_testslice); i++) {
1921
const char* ldr_name =
20-
rd_get_loader_name(rd_slice_at(m_contextslice, i));
22+
rd_testresult_get_loader_name(rd_slice_at(m_testslice, i));
2123
m_ui.lwloaders->addItem(QString::fromUtf8(ldr_name));
2224
}
2325

@@ -30,6 +32,15 @@ LoaderDialog::LoaderDialog(RDContextSlice ctxslice, QWidget* parent)
3032
connect(m_ui.sbminstring, &QSpinBox::valueChanged, this,
3133
&LoaderDialog::update_min_string);
3234

35+
connect(m_ui.rbnewanalysis, &QRadioButton::clicked, this,
36+
&LoaderDialog::update_open_mode);
37+
38+
connect(m_ui.rbopenproject, &QRadioButton::clicked, this,
39+
&LoaderDialog::update_open_mode);
40+
41+
connect(m_ui.rbresumesession, &QRadioButton::clicked, this,
42+
&LoaderDialog::update_open_mode);
43+
3344
connect(m_ui.leentrypoint, &QLineEdit::textChanged, this,
3445
&LoaderDialog::update_entry_point);
3546

@@ -40,20 +51,24 @@ LoaderDialog::LoaderDialog(RDContextSlice ctxslice, QWidget* parent)
4051
&LoaderDialog::update_offset);
4152

4253
// Trigger "on_loader_changed"
43-
if(!rd_slice_is_empty(m_contextslice)) m_ui.lwloaders->setCurrentRow(0);
54+
if(!rd_slice_is_empty(m_testslice)) m_ui.lwloaders->setCurrentRow(0);
4455

4556
this->validate_fields();
57+
this->update_open_mode();
4658
}
4759

4860
void LoaderDialog::on_loader_changed(int currentrow) {
4961
if(currentrow != -1) {
50-
this->context = rd_slice_at(m_contextslice, currentrow);
51-
m_ui.sbminstring->setValue(rd_get_min_string(this->context));
62+
this->sel_test = rd_slice_at(m_testslice, currentrow);
63+
m_ui.sbminstring->setValue(RD_MIN_STRING_LENGTH);
5264

53-
const RDLoaderPlugin* l = rd_get_loader_plugin(this->context);
54-
const RDProcessorPlugin* p = rd_get_processor_plugin(this->context);
65+
const RDLoaderPlugin* l =
66+
rd_testresult_get_loader_plugin(this->sel_test);
67+
const RDProcessorPlugin* p =
68+
rd_testresult_get_processor_plugin(this->sel_test);
5569

56-
m_ui.gbaddressing->setEnabled(l->flags & RD_LF_MANUAL);
70+
m_ui.gbaddressing->setEnabled(m_ui.rbnewanalysis->isChecked() &&
71+
(l->flags & RD_LF_MANUAL));
5772

5873
for(int i = 0; i < m_ui.cbprocessors->count(); i++) {
5974
if(m_ui.cbprocessors->itemData(i).toString() == p->id) {
@@ -66,7 +81,7 @@ void LoaderDialog::on_loader_changed(int currentrow) {
6681
}
6782
else {
6883
m_ui.gbaddressing->setEnabled(false);
69-
this->context = nullptr;
84+
this->sel_test = nullptr;
7085
}
7186

7287
this->validate_fields();
@@ -77,10 +92,11 @@ void LoaderDialog::on_processor_changed(int currentrow) {
7792

7893
if(loaderidx != -1 && currentrow != -1) {
7994
QVariant d = m_ui.cbprocessors->itemData(currentrow);
80-
this->processorplugin = rd_processor_find(qUtf8Printable(d.toString()));
95+
this->accept_params.processorplugin =
96+
rd_processor_find(qUtf8Printable(d.toString()));
8197
}
8298
else
83-
this->processorplugin = nullptr;
99+
this->accept_params.processorplugin = nullptr;
84100

85101
this->validate_fields();
86102
}
@@ -95,37 +111,53 @@ void LoaderDialog::populate_processors() const {
95111
}
96112
}
97113

98-
void LoaderDialog::update_min_string() { // NOLINT
99-
if(!this->context) return;
100-
rd_set_min_string(this->context, m_ui.sbminstring->value());
114+
void LoaderDialog::update_min_string() {
115+
this->accept_params.min_string = m_ui.sbminstring->value();
116+
}
117+
118+
void LoaderDialog::update_open_mode() {
119+
if(m_ui.rbnewanalysis->isChecked())
120+
this->accept_params.mode = RD_AM_NEW;
121+
else if(m_ui.rbopenproject->isChecked())
122+
this->accept_params.mode = RD_AM_PROJECT;
123+
else if(m_ui.rbresumesession->isChecked())
124+
this->accept_params.mode = RD_AM_DATABASE;
125+
else
126+
qFatal("cannot set an open mode");
127+
128+
m_ui.gbloader->setEnabled(m_ui.rbnewanalysis->isChecked() ||
129+
m_ui.rbresumesession->isChecked());
130+
131+
m_ui.gbaddressing->setEnabled(m_ui.rbnewanalysis->isChecked());
101132
}
102133

103134
void LoaderDialog::update_entry_point() {
104-
this->addressing.entrypoint =
135+
this->accept_params.addressing.entrypoint =
105136
m_ui.leentrypoint->text().toULongLong(nullptr, 16);
106137
this->validate_fields();
107138
}
108139

109140
void LoaderDialog::update_address() {
110-
this->addressing.address =
141+
this->accept_params.addressing.address =
111142
m_ui.leentrypoint->text().toULongLong(nullptr, 16);
112143
this->validate_fields();
113144
}
114145

115146
void LoaderDialog::update_offset() {
116-
this->addressing.offset = m_ui.leoffset->text().toULongLong(nullptr, 16);
147+
this->accept_params.addressing.offset =
148+
m_ui.leoffset->text().toULongLong(nullptr, 16);
117149
this->validate_fields();
118150
}
119151

120152
void LoaderDialog::validate_fields() { // NOLINT
121153
QPushButton* pb = m_ui.buttonbox->button(QDialogButtonBox::Ok);
122154

123-
if(!this->context || m_ui.cbprocessors->currentIndex() == -1) {
155+
if(!this->sel_test || m_ui.cbprocessors->currentIndex() == -1) {
124156
pb->setEnabled(false);
125157
return;
126158
}
127159

128-
const RDLoaderPlugin* l = rd_get_loader_plugin(this->context);
160+
const RDLoaderPlugin* l = rd_testresult_get_loader_plugin(this->sel_test);
129161

130162
if(l->flags & RD_LF_MANUAL) {
131163
pb->setEnabled(!m_ui.leentrypoint->text().isEmpty() &&

src/dialogs/loader.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,14 @@ class LoaderDialog: public QDialog {
88
Q_OBJECT
99

1010
public:
11-
explicit LoaderDialog(RDContextSlice ctxslice, QWidget* parent = nullptr);
11+
explicit LoaderDialog(RDTestResultSlice ctxslice,
12+
QWidget* parent = nullptr);
1213

1314
private Q_SLOTS:
1415
void on_loader_changed(int currentrow);
1516
void on_processor_changed(int currentrow);
1617
void update_min_string();
18+
void update_open_mode();
1719
void update_entry_point();
1820
void update_address();
1921
void update_offset();
@@ -23,11 +25,10 @@ private Q_SLOTS:
2325
void populate_processors() const;
2426

2527
public:
26-
RDContext* context;
27-
const RDProcessorPlugin* processorplugin{nullptr};
28-
RDLoadAddressing addressing{};
28+
const RDTestResult* sel_test{nullptr};
29+
RDAcceptParams accept_params{};
2930

3031
private:
3132
ui::LoaderDialog m_ui;
32-
RDContextSlice m_contextslice{};
33+
RDTestResultSlice m_testslice{};
3334
};

src/mainwindow.cpp

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ void MainWindow::open_file(const QString& filepath) {
316316

317317
m_filepath = filepath;
318318

319-
RDContextSlice ctxslice = rd_test(qUtf8Printable(m_filepath));
319+
RDTestResultSlice ctxslice = rd_test(qUtf8Printable(m_filepath));
320320
if(rd_slice_is_empty(ctxslice)) return;
321321

322322
REDasmSettings settings;
@@ -326,12 +326,33 @@ void MainWindow::open_file(const QString& filepath) {
326326
auto* dlgloader = new LoaderDialog(ctxslice, this);
327327

328328
connect(dlgloader, &LoaderDialog::accepted, this, [&, dlgloader]() {
329-
if(rd_accept(dlgloader->context, dlgloader->processorplugin,
330-
&dlgloader->addressing))
331-
this->select_analyzers(dlgloader->context);
332-
else {
333-
rd_destroy(dlgloader->context);
334-
QMessageBox::warning(this, "Loader", "Loading aborted");
329+
QByteArray dbpath;
330+
331+
while(true) {
332+
RDAcceptResult res =
333+
rd_accept(dlgloader->sel_test, &dlgloader->accept_params);
334+
335+
switch(res.status) {
336+
case RD_ACCEPT_OK: this->select_analyzers(res.context); return;
337+
338+
case RD_ACCEPT_FAIL:
339+
QMessageBox::warning(this, "Loader", "Loading aborted");
340+
return;
341+
342+
case RD_ACCEPT_FAIL_WRITE: {
343+
QString newpath = QFileDialog::getExistingDirectory(
344+
this, tr("DB is not writable, select a directory..."));
345+
346+
if(newpath.isEmpty()) {
347+
rd_reject();
348+
return;
349+
}
350+
351+
dbpath = newpath.toUtf8();
352+
dlgloader->accept_params.db_path = dbpath.constData();
353+
break;
354+
}
355+
}
335356
}
336357
});
337358

src/ui/loaderdialog.h

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,17 @@
1010
#include <QLabel>
1111
#include <QLineEdit>
1212
#include <QListWidget>
13+
#include <QRadioButton>
1314
#include <QSpinBox>
1415

1516
namespace ui {
1617

1718
struct LoaderDialog {
1819
QListWidget* lwloaders;
19-
QGroupBox *gboptions, *gbloader, *gbaddressing;
20+
QGroupBox *gbloader, *gbopenmode, *gbaddressing;
2021
QComboBox* cbprocessors;
2122
QSpinBox* sbminstring;
23+
QRadioButton *rbnewanalysis, *rbresumesession, *rbopenproject;
2224
QLineEdit *leentrypoint, *leoffset, *leaddress;
2325
QDialogButtonBox* buttonbox;
2426

@@ -61,6 +63,9 @@ struct LoaderDialog {
6163
}
6264

6365
void setup_loader_part(QVBoxLayout* l) {
66+
auto* hbox = new QHBoxLayout();
67+
68+
// left part
6469
this->gbloader = new QGroupBox();
6570
this->gbloader->setTitle("Loader");
6671

@@ -74,7 +79,30 @@ struct LoaderDialog {
7479
form->setLabelAlignment(Qt::AlignRight);
7580
form->addRow("Processor:", this->cbprocessors);
7681
form->addRow("Min String:", this->sbminstring);
77-
l->addWidget(this->gbloader);
82+
83+
// right part
84+
this->gbopenmode = new QGroupBox();
85+
this->gbopenmode->setTitle("Open Mode");
86+
87+
this->rbnewanalysis = new QRadioButton();
88+
this->rbnewanalysis->setText("New analysis");
89+
this->rbnewanalysis->setChecked(true);
90+
91+
this->rbopenproject = new QRadioButton();
92+
this->rbopenproject->setText("Load project");
93+
94+
this->rbresumesession = new QRadioButton();
95+
this->rbresumesession->setText("Resume session");
96+
97+
auto* vbox = new QVBoxLayout(this->gbopenmode);
98+
vbox->addWidget(this->rbnewanalysis);
99+
vbox->addWidget(this->rbopenproject);
100+
vbox->addWidget(this->rbresumesession);
101+
102+
hbox->addWidget(this->gbloader, 1);
103+
hbox->addWidget(this->gbopenmode);
104+
105+
l->addLayout(hbox);
78106
}
79107

80108
void setup_addressing_part(QVBoxLayout* l) {

0 commit comments

Comments
 (0)