Skip to content

Commit 37e8a55

Browse files
committed
fix: [plugin] fix bug with custom kaitai struct running
1 parent 7f8b113 commit 37e8a55

File tree

3 files changed

+41
-14
lines changed

3 files changed

+41
-14
lines changed

src/hobbits-plugins/analyzers/KaitaiStruct/kaitaistruct.cpp

+20-10
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,11 @@
1010
#include <QDirIterator>
1111
#include "hobbitspython.h"
1212

13-
1413
KaitaiStruct::KaitaiStruct()
1514
{
1615
QList<ParameterDelegate::ParameterInfo> infos = {
17-
{"katai_struct_yaml", QJsonValue::String, true},
18-
{"precompiled_py_file", QJsonValue::String, true}
16+
{PARAM_KSY, QJsonValue::String, true},
17+
{PARAM_PY, QJsonValue::String, true}
1918
};
2019

2120
m_delegate = QSharedPointer<ParameterDelegateUi>(
@@ -90,8 +89,10 @@ QSharedPointer<const AnalyzerResult> KaitaiStruct::analyzeBits(
9089

9190
progress->setProgressPercent(10);
9291

93-
if (parameters.contains("kaitai_struct_yaml")
94-
&& !parameters.value("kaitai_struct_yaml").toString().isEmpty()) {
92+
QString kscOutput = "";
93+
94+
if (parameters.contains(PARAM_KSY)
95+
&& !parameters.value(PARAM_KSY).toString().isEmpty()) {
9596
QString kscPath = SettingsManager::getPrivateSetting(KAITAI_PATH_KEY).toString();
9697
if (kscPath.isEmpty()) {
9798
return AnalyzerResult::error("A Kaitai Struct Compiler path must be specified");
@@ -104,7 +105,7 @@ QSharedPointer<const AnalyzerResult> KaitaiStruct::analyzeBits(
104105
if (!ksy.open(QIODevice::Truncate | QIODevice::WriteOnly)) {
105106
return AnalyzerResult::error("Could not open ksy file for writing");
106107
}
107-
ksy.write(parameters.value("katai_struct_yaml").toString().toLocal8Bit());
108+
ksy.write(parameters.value(PARAM_KSY).toString().toLocal8Bit());
108109
ksy.close();
109110

110111
progress->setProgressPercent(20);
@@ -135,21 +136,23 @@ QSharedPointer<const AnalyzerResult> KaitaiStruct::analyzeBits(
135136
if (errorFile.open(QIODevice::ReadOnly)) {
136137
errorOutput = errorFile.readAll();
137138
errorFile.close();
139+
kscOutput += QString("stderr:\n%2").arg(errorOutput);
138140
}
139141

140142
if (stdoutFile.open(QIODevice::ReadOnly)) {
141143
stdOutput = stdoutFile.readAll();
142144
stdoutFile.close();
145+
kscOutput += QString("stdout:\n%2").arg(stdOutput);
143146
}
144147

145148
if (!errorOutput.isEmpty()) {
146-
return AnalyzerResult::error(QString("kaitai-struct-compiler error:\n%1\n\nstdout: %2").arg(errorOutput).arg(stdOutput));
149+
return AnalyzerResult::error(QString("kaitai-struct-compiler error:\n%1").arg(kscOutput));
147150
}
148151

149152
}
150-
else if (parameters.contains("precompiled_py_file")
151-
&& !parameters.value("precompiled_py_file").toString().isEmpty()) {
152-
QString precompiledFilePath = parameters.value("precompiled_py_file").toString();
153+
else if (parameters.contains(PARAM_PY)
154+
&& !parameters.value(PARAM_PY).toString().isEmpty()) {
155+
QString precompiledFilePath = parameters.value(PARAM_PY).toString();
153156
QFileInfo info(precompiledFilePath);
154157
QFile::copy(precompiledFilePath, dir.filePath(info.fileName()));
155158
}
@@ -249,6 +252,13 @@ QSharedPointer<const AnalyzerResult> KaitaiStruct::analyzeBits(
249252
QSharedPointer<BitInfo> bitInfo = BitInfo::copyFromContainer(container);
250253
bitInfo->addHighlights(highlights);
251254

255+
if (!kscOutput.isEmpty()) {
256+
bitInfo->setMetadata(KSC_OUT_LABEL, kscOutput);
257+
}
258+
if (!output.isEmpty()) {
259+
bitInfo->setMetadata(PYTHON_OUT_LABEL, output);
260+
}
261+
252262
return AnalyzerResult::result(bitInfo, parameters);
253263
}
254264

src/hobbits-plugins/analyzers/KaitaiStruct/kaitaistructform.cpp

+16-4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <QFileDialog>
66
#include "settingsmanager.h"
77
#include <QDirIterator>
8+
#include "kaitaistruct.h"
89

910
KaitaiStructForm::KaitaiStructForm(QSharedPointer<ParameterDelegate> delegate) :
1011
ui(new Ui::KaitaiStructForm()),
@@ -13,9 +14,7 @@ KaitaiStructForm::KaitaiStructForm(QSharedPointer<ParameterDelegate> delegate) :
1314
{
1415
ui->setupUi(this);
1516

16-
m_paramHelper->addTextEditStringParameter("katai_struct_yaml", ui->te_ksy);
17-
18-
m_paramHelper->addParameter("katai_struct_yaml",
17+
m_paramHelper->addParameter(PARAM_KSY,
1918
[this](QJsonValue value) {
2019
if (value.toString().isEmpty()) {
2120
return false;
@@ -31,7 +30,7 @@ KaitaiStructForm::KaitaiStructForm(QSharedPointer<ParameterDelegate> delegate) :
3130
return QJsonValue(ui->te_ksy->toPlainText());
3231
});
3332

34-
m_paramHelper->addParameter("precompiled_py_file",
33+
m_paramHelper->addParameter(PARAM_PY,
3534
[this](QJsonValue value) {
3635
if (value.toString().isEmpty()) {
3736
return false;
@@ -161,6 +160,7 @@ void KaitaiStructForm::previewBitsUiImpl(QSharedPointer<BitContainerPreview> con
161160
m_highlightNav->setContainer(container);
162161
if (container.isNull()) {
163162
m_highlightNav->setTitle("");
163+
ui->te_output->clear();
164164
}
165165
else {
166166
QString resultLabel = container->info()->metadata(KAITAI_RESULT_LABEL).toString();
@@ -169,5 +169,17 @@ void KaitaiStructForm::previewBitsUiImpl(QSharedPointer<BitContainerPreview> con
169169
resultLabel += "...";
170170
}
171171
m_highlightNav->setTitle(resultLabel);
172+
173+
QString outText = "";
174+
QVariant kscOutput = container->info()->metadata(KSC_OUT_LABEL);
175+
if (kscOutput.isValid()) {
176+
outText += kscOutput.toString() + "\n\n";
177+
}
178+
QVariant pyOutput = container->info()->metadata(PYTHON_OUT_LABEL);
179+
if (pyOutput.isValid()) {
180+
outText += pyOutput.toString();
181+
}
182+
ui->te_output->setPlainText(outText);
183+
172184
}
173185
}

src/hobbits-plugins/analyzers/KaitaiStruct/kaitaistructform.h

+5
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ const QString KAITAI_PATH_KEY = "kaitai_struct_compiler_path";
99
const QString KSY_PATH_KEY = "ksy_directory_path";
1010
const QString KAITAI_STRUCT_CATEGORY = "kaitai_struct";
1111
const QString KAITAI_RESULT_LABEL = "kaitai_struct_result_label";
12+
const QString KSC_OUT_LABEL = "KSC Output";
13+
const QString PYTHON_OUT_LABEL = "Kaitai Python Output";
14+
15+
const QString PARAM_KSY = "kaitai_struct_yaml";
16+
const QString PARAM_PY = "precompiled_py_file";
1217

1318
namespace Ui
1419
{

0 commit comments

Comments
 (0)