diff options
| author | Mason Reed <mason@vector35.com> | 2025-03-10 11:05:40 -0400 |
|---|---|---|
| committer | Mason Reed <mason@vector35.com> | 2025-04-02 05:36:54 -0400 |
| commit | 25cc02431b61097b2adfc2fbc493b648b0300c3b (patch) | |
| tree | a79d9c4f4f67234d3bf9bda413e8608f479a4cc8 /view/sharedcache/ui/dscpicker.cpp | |
| parent | fa85bf28502286c4821427c5d0ed91a7ed46f8f6 (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.cpp | 69 |
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(); } |
