blob: cb567d8e11fa42945ccca2a97ad126f145bb53f9 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
//
// Created by kat on 5/22/23.
//
#include "dscpicker.h"
#include <sharedcacheapi.h>
#include "progresstask.h"
using namespace BinaryNinja;
using namespace SharedCacheAPI;
void DisplayDSCPicker(UIContext* ctx, Ref<BinaryView> dscView)
{
auto getImageNames = [dscView](QVariant var) {
auto controller = SharedCacheController::GetController(*dscView);
if (!controller)
return QStringList();
QStringList entries = {};
for (const auto& img : controller->GetImages())
entries.push_back(QString::fromStdString(img.name));
return entries;
};
auto getChosenImage = [ctx](QVariant var) {
QStringList entries = var.toStringList();
auto choiceDialog = new MetadataChoiceDialog(ctx ? ctx->mainWindow() : nullptr, "Pick Image", "Select", entries);
choiceDialog->AddWidthRequiredByItem(ctx, 300);
choiceDialog->AddHeightRequiredByItem(ctx, 150);
choiceDialog->exec();
if (!choiceDialog->GetChosenEntry().has_value())
return QVariant("");
return QVariant(QString::fromStdString(entries.at((qsizetype)choiceDialog->GetChosenEntry().value().idx).toStdString()));
};
auto loadSelectedImage = [dscView](QVariant var) {
auto selectedImageName = var.toString().toStdString();
if (selectedImageName.empty())
return;
if (auto controller = SharedCacheController::GetController(*dscView))
{
if (const auto selectedImage = controller->GetImageWithName( selectedImageName))
{
controller->ApplyImage(*dscView, *selectedImage);
dscView->AddAnalysisOption("linearsweep");
dscView->AddAnalysisOption("pointersweep");
dscView->UpdateAnalysis();
}
}
};
BackgroundThread::create(ctx ? ctx->mainWindow() : nullptr)
->thenBackground([getImageNames](QVariant var){ return getImageNames(var); })
->thenMainThread([getChosenImage](QVariant var){ return getChosenImage(var); })
->thenBackground([loadSelectedImage](QVariant var){ return loadSelectedImage(var); })
->start();
}
|