summaryrefslogtreecommitdiff
path: root/view/sharedcache/ui/dscpicker.cpp
diff options
context:
space:
mode:
authorMason Reed <mason@vector35.com>2025-03-10 11:05:40 -0400
committerMason Reed <mason@vector35.com>2025-04-02 05:36:54 -0400
commit25cc02431b61097b2adfc2fbc493b648b0300c3b (patch)
treea79d9c4f4f67234d3bf9bda413e8608f479a4cc8 /view/sharedcache/ui/dscpicker.cpp
parentfa85bf28502286c4821427c5d0ed91a7ed46f8f6 (diff)
[SharedCache] Refactor Shared Cache
In absence of a better name, this commit refactors the shared cache code.
Diffstat (limited to 'view/sharedcache/ui/dscpicker.cpp')
-rw-r--r--view/sharedcache/ui/dscpicker.cpp69
1 files changed, 44 insertions, 25 deletions
diff --git a/view/sharedcache/ui/dscpicker.cpp b/view/sharedcache/ui/dscpicker.cpp
index a82da4fc..c6448ff4 100644
--- a/view/sharedcache/ui/dscpicker.cpp
+++ b/view/sharedcache/ui/dscpicker.cpp
@@ -6,37 +6,56 @@
#include <sharedcacheapi.h>
#include "progresstask.h"
-#include <utility>
-
using namespace BinaryNinja;
+using namespace SharedCacheAPI;
void DisplayDSCPicker(UIContext* ctx, Ref<BinaryView> dscView)
{
- BackgroundThread::create(ctx ? ctx->mainWindow() : nullptr)->thenBackground(
- [dscView=dscView](QVariant var) {
- QStringList entries;
- Ref<SharedCacheAPI::SharedCache> cache = new SharedCacheAPI::SharedCache(dscView);
+ static 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;
+ };
+
+ static 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()));
+ };
- for (const auto& img : cache->GetAvailableImages())
- entries.push_back(QString::fromStdString(img));
+ static auto loadSelectedImage = [dscView](QVariant var) {
+ auto selectedImageName = var.toString().toStdString();
+ if (selectedImageName.empty())
+ return;
- return entries;
- })->thenMainThread([ctx](QVariant var){
- QStringList entries = var.toStringList();
+ if (auto controller = SharedCacheController::GetController(*dscView))
+ {
+ if (const auto selectedImage = controller->GetImageWithName( selectedImageName))
+ {
+ controller->ApplyImage(*dscView, *selectedImage);
+ dscView->AddAnalysisOption("linearsweep");
+ dscView->UpdateAnalysis();
+ }
+ }
+ };
- 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(QString::fromStdString(entries.at((qsizetype)choiceDialog->GetChosenEntry().value().idx).toStdString()));
- else
- return QVariant("");
- })->thenBackground([dscView=dscView](QVariant var){
- if (var.toString().isEmpty())
- return;
- Ref<SharedCacheAPI::SharedCache> cache = new SharedCacheAPI::SharedCache(dscView);
- cache->LoadImageWithInstallName(var.toString().toStdString());
- })->start();
+ BackgroundThread::create(ctx ? ctx->mainWindow() : nullptr)
+ ->thenBackground([](QVariant var){ return getImageNames(var); })
+ ->thenMainThread([](QVariant var){ return getChosenImage(var); })
+ ->thenBackground([](QVariant var){ return loadSelectedImage(var); })
+ ->start();
}