Skip to content

Commit ba0d94b

Browse files
authored
Merge pull request #137 from Mahlet-Inc/develop
Develop
2 parents 071d7a5 + df12015 commit ba0d94b

File tree

7 files changed

+53
-16
lines changed

7 files changed

+53
-16
lines changed

.releaserc.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,9 @@
5050
"name": "hobbits-${nextRelease.version}-win2019.zip"
5151
},
5252
{
53-
"path": "hobbits/mac_1014_release/mac_1014_release.tar.gz",
54-
"label": "Hobbits (64-bit Mac OSX 10.14)",
55-
"name": "hobbits-${nextRelease.version}-mac1014.tgz"
53+
"path": "hobbits/mac_1015_release/mac_1015_release.tar.gz",
54+
"label": "Hobbits (64-bit Mac OSX 10.15)",
55+
"name": "hobbits-${nextRelease.version}-mac1015.tgz"
5656
},
5757
{
5858
"path": "hobbits/mac_11_release/mac_11_release.tar.gz",

README.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,11 @@ documentation and/or watch
2626
```
2727
conan remote add hobbitsconan https://helloadam.jfrog.io/artifactory/api/conan/conan
2828
```
29-
3. Use conan to get/build dependencies, then build and package hobbits:
29+
3. You might need libudev and patchelf for all of the conan steps to work. Ubuntu example:
30+
```
31+
sudo apt-get install -y libudev-dev patchelf
32+
```
33+
4. Use conan to get/build dependencies, then build and package hobbits:
3034
```
3135
mkdir build
3236
cd build

azure-pipelines.yml

+3-3
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,13 @@ jobs:
5252
parameters:
5353
artifactName: win_2016_release
5454

55-
- job: Mac1014
55+
- job: Mac1015
5656
pool:
57-
vmImage: 'macOS-10.14'
57+
vmImage: 'macOS-10.15'
5858
steps:
5959
- template: ci/mac.yml
6060
parameters:
61-
artifactName: mac_1014_release
61+
artifactName: mac_1015_release
6262

6363
- job: Mac11
6464
pool:

ci/ubuntu-setup.yml

+3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ steps:
1111
- script: sudo apt-get -y install ninja-build
1212
displayName: 'Install Ninja'
1313

14+
- script: sudo apt-get -y install libudev-dev patchelf
15+
displayName: 'Install libudev and patchelf'
16+
1417
- task: UsePythonVersion@0
1518
inputs:
1619
versionSpec: '3.7'

conanfile.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def set_version(self):
3131

3232
requires = [
3333
("qt/5.15.2"),
34-
("hobbits-cpython/3.9.7"),
34+
("hobbits-cpython/3.9.10"),
3535
("pffft/cci.20210511"),
3636
("libusb/1.0.24")
3737
]

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

+15-3
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@ QSharedPointer<const AnalyzerResult> KaitaiStruct::analyzeBits(
9191

9292
QString kscOutput = "";
9393

94+
QString pyDepDir = dir.filePath("pydeps");
95+
96+
QString baseName = "";
97+
9498
if (parameters.contains(PARAM_KSY)
9599
&& !parameters.value(PARAM_KSY).toString().isEmpty()) {
96100
QString kscPath = SettingsManager::getPrivateSetting(KAITAI_PATH_KEY).toString();
@@ -108,12 +112,14 @@ QSharedPointer<const AnalyzerResult> KaitaiStruct::analyzeBits(
108112
ksy.write(parameters.value(PARAM_KSY).toString().toLocal8Bit());
109113
ksy.close();
110114

115+
HobbitsPython::recursiveDirCopy(":/kaitaidata/ksy/common", dir.filePath("common"));
116+
111117
progress->setProgressPercent(20);
112118

113119
#ifdef Q_OS_WIN
114120
QStringList kscAgs = {"/C", kscPath, "--debug", "--ksc-json-output", "-t", "python", ksy.fileName()};
115121
#else
116-
QStringList kscAgs = {"--debug", "--ksc-json-output", "-t", "python", ksy.fileName()};
122+
QStringList kscAgs = {"--debug", "--ksc-json-output", "-t", "python", "-I", ".", ksy.fileName()};
117123
#endif
118124
QProcess kscProcess;
119125
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
@@ -156,6 +162,11 @@ QSharedPointer<const AnalyzerResult> KaitaiStruct::analyzeBits(
156162
continue;
157163
}
158164
QJsonObject obj = json.value(key).toObject();
165+
166+
if (obj.contains("firstSpecName") && obj.value("firstSpecName").isString()) {
167+
baseName = obj.value("firstSpecName").toString();
168+
}
169+
159170
if (!obj.contains("errors") || !obj.value("errors").isArray()) {
160171
continue;
161172
}
@@ -199,22 +210,23 @@ QSharedPointer<const AnalyzerResult> KaitaiStruct::analyzeBits(
199210
&& !parameters.value(PARAM_PY).toString().isEmpty()) {
200211
QString precompiledFilePath = parameters.value(PARAM_PY).toString();
201212
QFileInfo info(precompiledFilePath);
213+
baseName = info.baseName();
202214
QFile::copy(precompiledFilePath, dir.filePath(info.fileName()));
215+
HobbitsPython::recursiveDirCopy(":/kaitaidata/ksy_py/common", dir.path());
203216
}
204217
else {
205218
return AnalyzerResult::error("Invalid parameters - must have a precompiled py or a custom ksy spec");
206219
}
207220

208221
progress->setProgressPercent(40);
209222

210-
211-
QString pyDepDir = dir.filePath("pydeps");
212223
HobbitsPython::recursiveDirCopy(":/kaitaistruct/scripts/dependencies", pyDepDir);
213224

214225
auto pyRequest = PythonRequest::create(":/kaitaistruct/scripts/runner.py")->setFunctionName("parse_data");
215226
pyRequest->addPathExtension(pyDepDir);
216227
pyRequest->addArg(PythonArg::qString(inputBitFile.fileName()));
217228
pyRequest->addArg(PythonArg::qString(outputRangeFile.fileName()));
229+
pyRequest->addArg(PythonArg::qString(baseName));
218230
auto watcher = HobbitsPython::getInstance().runProcessScript(pyRequest, true);
219231
watcher->watcher()->future().waitForFinished();
220232
auto result = watcher->result();

src/hobbits-plugins/analyzers/KaitaiStruct/scripts/runner.py

+23-5
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import binascii
88
import traceback
99
from enum import Enum
10+
import shutil
1011

1112
from kaitaistruct import KaitaiStruct
1213

@@ -146,15 +147,32 @@ def parse_struct(struct, sections, prefix="", parent_offset = 0, base_io=None, b
146147

147148

148149

149-
def parse_data(input_filename, output_filename, action_progress):
150+
def parse_data(input_filename, output_filename, base_name, action_progress):
150151
# locate the compiled struct module
151152
scripts = glob.glob(os.path.join(os.path.dirname(input_filename), '*.py'))
152153
if len(scripts) < 1:
153154
raise FileNotFoundError('Could not find the expected python kaitai parser - did the kaitai struct compiler fail?')
154-
module_file = os.path.basename(scripts[0])
155-
sys.path.append(os.path.dirname(scripts[0]))
156-
package_name = os.path.splitext(module_file)[0]
157-
class_name = "".join([s.capitalize() for s in package_name.split("_")])
155+
156+
if len(scripts) > 1:
157+
thedir = os.path.dirname(input_filename)
158+
allparsers = os.path.join(thedir, 'concatenated_parsers.py')
159+
with open(allparsers,'wb') as concat:
160+
for script in scripts:
161+
with open(script,'rb') as fd:
162+
shutil.copyfileobj(fd, concat)
163+
164+
module_file = os.path.basename(allparsers)
165+
sys.path.append(os.path.dirname(allparsers))
166+
package_name = os.path.splitext(module_file)[0]
167+
if not base_name:
168+
base_name = os.path.splitext(os.path.basename(scripts[0]))[0]
169+
class_name = "".join([s.capitalize() for s in base_name.split("_")])
170+
171+
else:
172+
module_file = os.path.basename(scripts[0])
173+
sys.path.append(os.path.dirname(scripts[0]))
174+
package_name = os.path.splitext(module_file)[0]
175+
class_name = "".join([s.capitalize() for s in package_name.split("_")])
158176
try:
159177
del sys.modules[package_name]
160178
except KeyError:

0 commit comments

Comments
 (0)