summaryrefslogtreecommitdiff
path: root/plugins/warp/ui/shared/fetchdialog.cpp
diff options
context:
space:
mode:
authorMason Reed <mason@vector35.com>2025-10-07 14:32:48 -0400
committerMason Reed <mason@vector35.com>2025-10-07 14:33:34 -0400
commit4a227e0523391bc026bf96c3c31d44a39cac1701 (patch)
treecc603b899a446fb469a0be3ae4c2c77e6351c091 /plugins/warp/ui/shared/fetchdialog.cpp
parent3e24f6ab0b373d8718e26a19ac296044cc0d19c6 (diff)
[WARP] Format UI plugin
Diffstat (limited to 'plugins/warp/ui/shared/fetchdialog.cpp')
-rw-r--r--plugins/warp/ui/shared/fetchdialog.cpp325
1 files changed, 160 insertions, 165 deletions
diff --git a/plugins/warp/ui/shared/fetchdialog.cpp b/plugins/warp/ui/shared/fetchdialog.cpp
index 1d18aa92..328f00c2 100644
--- a/plugins/warp/ui/shared/fetchdialog.cpp
+++ b/plugins/warp/ui/shared/fetchdialog.cpp
@@ -11,236 +11,231 @@
using namespace BinaryNinja;
-static void AddListItem(QListWidget *list, const QString &value)
+static void AddListItem(QListWidget* list, const QString& value)
{
- if (value.trimmed().isEmpty())
- return;
- // Avoid duplicates
- for (int i = 0; i < list->count(); ++i)
- if (list->item(i)->text().compare(value, Qt::CaseInsensitive) == 0)
- return;
- list->addItem(value.trimmed());
+ if (value.trimmed().isEmpty())
+ return;
+ // Avoid duplicates
+ for (int i = 0; i < list->count(); ++i)
+ if (list->item(i)->text().compare(value, Qt::CaseInsensitive) == 0)
+ return;
+ list->addItem(value.trimmed());
}
-WarpFetchDialog::WarpFetchDialog(BinaryViewRef bv,
- std::shared_ptr<WarpFetcher> fetcher,
- QWidget *parent)
- : QDialog(parent), m_fetchProcessor(std::move(fetcher)), m_bv(std::move(bv))
+WarpFetchDialog::WarpFetchDialog(BinaryViewRef bv, std::shared_ptr<WarpFetcher> fetcher, QWidget* parent) :
+ QDialog(parent), m_fetchProcessor(std::move(fetcher)), m_bv(std::move(bv))
{
- setWindowTitle("Fetch WARP Functions");
+ setWindowTitle("Fetch WARP Functions");
- auto form = new QFormLayout();
- m_containerCombo = new QComboBox(this);
- populateContainers();
- m_containerCombo->addItem("All Containers"); // index 0 for "all"
- for (const auto &c: m_containers)
- m_containerCombo->addItem(QString::fromStdString(c->GetName()));
+ auto form = new QFormLayout();
+ m_containerCombo = new QComboBox(this);
+ populateContainers();
+ m_containerCombo->addItem("All Containers"); // index 0 for "all"
+ for (const auto& c : m_containers)
+ m_containerCombo->addItem(QString::fromStdString(c->GetName()));
- // Tags editor
- m_tagsList = new QListWidget(this);
- m_addTagBtn = new QPushButton(this);
- m_addTagBtn->setText("+");
- m_addTagBtn->setToolTip("Add tag");
- m_removeTagBtn = new QPushButton(this);
- m_removeTagBtn->setText("-");
- m_removeTagBtn->setToolTip("Remove selected tag(s)");
- m_resetTagBtn = new QPushButton(this);
- m_resetTagBtn->setText("Reset");
- m_resetTagBtn->setToolTip("Reset tags to: official, trusted");
- auto tagBtnRow = new QHBoxLayout();
- tagBtnRow->addWidget(m_addTagBtn);
- tagBtnRow->addWidget(m_removeTagBtn);
- tagBtnRow->addWidget(m_resetTagBtn);
- tagBtnRow->addStretch();
- auto tagCol = new QVBoxLayout();
- tagCol->addWidget(m_tagsList);
- tagCol->addLayout(tagBtnRow);
- auto tagWrapper = new QWidget(this);
- tagWrapper->setLayout(tagCol);
+ // Tags editor
+ m_tagsList = new QListWidget(this);
+ m_addTagBtn = new QPushButton(this);
+ m_addTagBtn->setText("+");
+ m_addTagBtn->setToolTip("Add tag");
+ m_removeTagBtn = new QPushButton(this);
+ m_removeTagBtn->setText("-");
+ m_removeTagBtn->setToolTip("Remove selected tag(s)");
+ m_resetTagBtn = new QPushButton(this);
+ m_resetTagBtn->setText("Reset");
+ m_resetTagBtn->setToolTip("Reset tags to: official, trusted");
+ auto tagBtnRow = new QHBoxLayout();
+ tagBtnRow->addWidget(m_addTagBtn);
+ tagBtnRow->addWidget(m_removeTagBtn);
+ tagBtnRow->addWidget(m_resetTagBtn);
+ tagBtnRow->addStretch();
+ auto tagCol = new QVBoxLayout();
+ tagCol->addWidget(m_tagsList);
+ tagCol->addLayout(tagBtnRow);
+ auto tagWrapper = new QWidget(this);
+ tagWrapper->setLayout(tagCol);
- // Make tags list compact with a fixed maximum height and no vertical expansion
- m_tagsList->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
- m_tagsList->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
- m_tagsList->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
- m_tagsList->setMaximumHeight(120);
- m_tagsList->setToolTip("A source must have atleast ONE of these tags to be considered");
+ // Make tags list compact with a fixed maximum height and no vertical expansion
+ m_tagsList->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
+ m_tagsList->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
+ m_tagsList->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+ m_tagsList->setMaximumHeight(120);
+ m_tagsList->setToolTip("A source must have atleast ONE of these tags to be considered");
- // Defaults from processor tags
- for (const auto &t: GetAllowedTagsFromView(m_bv))
- AddListItem(m_tagsList, QString::fromStdString(t));
+ // Defaults from processor tags
+ for (const auto& t : GetAllowedTagsFromView(m_bv))
+ AddListItem(m_tagsList, QString::fromStdString(t));
- // Batch size and matcher checkbox
- m_batchSize = new QSpinBox(this);
- m_batchSize->setRange(10, 1000);
- m_batchSize->setValue(GetBatchSizeFromView(m_bv));
- m_batchSize->setToolTip("Number of functions to fetch in each batch");
+ // Batch size and matcher checkbox
+ m_batchSize = new QSpinBox(this);
+ m_batchSize->setRange(10, 1000);
+ m_batchSize->setValue(GetBatchSizeFromView(m_bv));
+ m_batchSize->setToolTip("Number of functions to fetch in each batch");
- m_rerunMatcher = new QCheckBox("Re-run matcher after fetch", this);
- m_rerunMatcher->setChecked(true);
+ m_rerunMatcher = new QCheckBox("Re-run matcher after fetch", this);
+ m_rerunMatcher->setChecked(true);
- m_clearProcessed = new QCheckBox("Refetch all functions", this);
- m_clearProcessed->setToolTip("Clears the processed cache before fetching again, this will refetch all functions in the view");
- m_clearProcessed->setChecked(false);
+ m_clearProcessed = new QCheckBox("Refetch all functions", this);
+ m_clearProcessed->setToolTip(
+ "Clears the processed cache before fetching again, this will refetch all functions in the view");
+ m_clearProcessed->setChecked(false);
- form->addRow(new QLabel("Container: "), m_containerCombo);
- form->addRow(new QLabel("Allowed Tags: "), tagWrapper);
- form->addRow(new QLabel("Batch Size: "), m_batchSize);
- form->addRow(m_rerunMatcher);
- form->addRow(m_clearProcessed);
+ form->addRow(new QLabel("Container: "), m_containerCombo);
+ form->addRow(new QLabel("Allowed Tags: "), tagWrapper);
+ form->addRow(new QLabel("Batch Size: "), m_batchSize);
+ form->addRow(m_rerunMatcher);
+ form->addRow(m_clearProcessed);
- auto buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this);
- connect(buttons, &QDialogButtonBox::accepted, this, &WarpFetchDialog::onAccept);
- connect(buttons, &QDialogButtonBox::rejected, this, &WarpFetchDialog::onReject);
+ auto buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, this);
+ connect(buttons, &QDialogButtonBox::accepted, this, &WarpFetchDialog::onAccept);
+ connect(buttons, &QDialogButtonBox::rejected, this, &WarpFetchDialog::onReject);
- auto root = new QVBoxLayout(this);
- root->addLayout(form);
- root->addWidget(buttons);
- setLayout(root);
+ auto root = new QVBoxLayout(this);
+ root->addLayout(form);
+ root->addWidget(buttons);
+ setLayout(root);
- // Wire buttons
- connect(m_addTagBtn, &QPushButton::clicked, this, &WarpFetchDialog::onAddTag);
- connect(m_removeTagBtn, &QPushButton::clicked, this, &WarpFetchDialog::onRemoveTag);
- connect(m_resetTagBtn, &QPushButton::clicked, this, &WarpFetchDialog::onResetTags);
+ // Wire buttons
+ connect(m_addTagBtn, &QPushButton::clicked, this, &WarpFetchDialog::onAddTag);
+ connect(m_removeTagBtn, &QPushButton::clicked, this, &WarpFetchDialog::onRemoveTag);
+ connect(m_resetTagBtn, &QPushButton::clicked, this, &WarpFetchDialog::onResetTags);
}
void WarpFetchDialog::populateContainers()
{
- m_containers = Warp::Container::All();
+ m_containers = Warp::Container::All();
}
void WarpFetchDialog::onAddTag()
{
- bool ok = false;
- const auto text = QInputDialog::getText(this, "Add Tag", "Tag:", QLineEdit::Normal, {}, &ok);
- if (ok)
- AddListItem(m_tagsList, text);
+ bool ok = false;
+ const auto text = QInputDialog::getText(this, "Add Tag", "Tag:", QLineEdit::Normal, {}, &ok);
+ if (ok)
+ AddListItem(m_tagsList, text);
}
void WarpFetchDialog::onRemoveTag()
{
- for (auto *item: m_tagsList->selectedItems())
- delete item;
+ for (auto* item : m_tagsList->selectedItems())
+ delete item;
}
void WarpFetchDialog::onResetTags()
{
- m_tagsList->clear();
- AddListItem(m_tagsList, "official");
- AddListItem(m_tagsList, "trusted");
+ m_tagsList->clear();
+ AddListItem(m_tagsList, "official");
+ AddListItem(m_tagsList, "trusted");
}
std::vector<Warp::SourceTag> WarpFetchDialog::collectTags() const
{
- std::vector<Warp::SourceTag> out;
- out.reserve(m_tagsList->count());
- for (int i = 0; i < m_tagsList->count(); ++i)
- out.emplace_back(m_tagsList->item(i)->text().trimmed().toStdString());
- return out;
+ std::vector<Warp::SourceTag> out;
+ out.reserve(m_tagsList->count());
+ for (int i = 0; i < m_tagsList->count(); ++i)
+ out.emplace_back(m_tagsList->item(i)->text().trimmed().toStdString());
+ return out;
}
void WarpFetchDialog::onAccept()
{
- const int idx = m_containerCombo->currentIndex();
- std::optional<size_t> containerIndex;
- if (idx > 0) // 0 == All Containers
- containerIndex = static_cast<size_t>(idx - 1);
+ const int idx = m_containerCombo->currentIndex();
+ std::optional<size_t> containerIndex;
+ if (idx > 0) // 0 == All Containers
+ containerIndex = static_cast<size_t>(idx - 1);
- const auto batch = static_cast<size_t>(m_batchSize->value());
- const bool rerun = m_rerunMatcher->isChecked();
+ const auto batch = static_cast<size_t>(m_batchSize->value());
+ const bool rerun = m_rerunMatcher->isChecked();
- const auto tags = collectTags();
- // Persist tags to the view settings.
- SetTagsToView(m_bv, tags);
+ const auto tags = collectTags();
+ // Persist tags to the view settings.
+ SetTagsToView(m_bv, tags);
- if (m_clearProcessed->isChecked())
- m_fetchProcessor->ClearProcessed();
+ if (m_clearProcessed->isChecked())
+ m_fetchProcessor->ClearProcessed();
- // Execute the network fetch in batches
- runBatchedFetch(containerIndex, tags, batch, rerun);
+ // Execute the network fetch in batches
+ runBatchedFetch(containerIndex, tags, batch, rerun);
- accept();
+ accept();
}
void WarpFetchDialog::onReject()
{
- const auto tags = collectTags();
- // Persist tags to the view settings.
- SetTagsToView(m_bv, tags);
- reject();
+ const auto tags = collectTags();
+ // Persist tags to the view settings.
+ SetTagsToView(m_bv, tags);
+ reject();
}
-void WarpFetchDialog::runBatchedFetch(const std::optional<size_t> &containerIndex,
- const std::vector<Warp::SourceTag> &allowedTags,
- size_t batchSize,
- bool rerunMatcher)
+void WarpFetchDialog::runBatchedFetch(const std::optional<size_t>& containerIndex,
+ const std::vector<Warp::SourceTag>& allowedTags, size_t batchSize, bool rerunMatcher)
{
- if (!m_bv)
- return;
- // Collect functions in the view and enqueue them to the shared fetcher
- std::vector<Ref<Function>> funcs = m_bv->GetAnalysisFunctionList();
- if (funcs.empty())
- return;
- const size_t totalFuncs = funcs.size();
- const size_t totalBatches = (totalFuncs + batchSize - 1) / batchSize;
+ if (!m_bv)
+ return;
+ // Collect functions in the view and enqueue them to the shared fetcher
+ std::vector<Ref<Function>> funcs = m_bv->GetAnalysisFunctionList();
+ if (funcs.empty())
+ return;
+ const size_t totalFuncs = funcs.size();
+ const size_t totalBatches = (totalFuncs + batchSize - 1) / batchSize;
- // Create a background task to show progress in the UI
- Ref<BackgroundTask> task = new BackgroundTask("Fetching WARP functions (0 / " + std::to_string(totalBatches) + ")", false);
+ // Create a background task to show progress in the UI
+ Ref<BackgroundTask> task =
+ new BackgroundTask("Fetching WARP functions (0 / " + std::to_string(totalBatches) + ")", false);
- auto fetcher = m_fetchProcessor;
- auto bv = m_bv;
+ auto fetcher = m_fetchProcessor;
+ auto bv = m_bv;
- // TODO: Too many captures in this thing lol.
- WorkerInteractiveEnqueue([fetcher, bv, funcs = std::move(funcs), batchSize, rerunMatcher, task, allowedTags]() mutable {
- size_t processed = 0;
- size_t batchIndex = 0;
+ // TODO: Too many captures in this thing lol.
+ WorkerInteractiveEnqueue(
+ [fetcher, bv, funcs = std::move(funcs), batchSize, rerunMatcher, task, allowedTags]() mutable {
+ size_t processed = 0;
+ size_t batchIndex = 0;
- while (processed < funcs.size())
- {
- const size_t remaining = funcs.size() - processed;
- const size_t thisBatchCount = std::min(batchSize, remaining);
+ while (processed < funcs.size())
+ {
+ const size_t remaining = funcs.size() - processed;
+ const size_t thisBatchCount = std::min(batchSize, remaining);
- for (size_t i = 0; i < thisBatchCount; ++i)
- fetcher->AddPendingFunction(funcs[processed + i]);
+ for (size_t i = 0; i < thisBatchCount; ++i)
+ fetcher->AddPendingFunction(funcs[processed + i]);
- fetcher->FetchPendingFunctions(allowedTags);
+ fetcher->FetchPendingFunctions(allowedTags);
- ++batchIndex;
- processed += thisBatchCount;
+ ++batchIndex;
+ processed += thisBatchCount;
- task->SetProgressText("Fetching WARP functions (" + std::to_string(batchIndex) + " / " + std::to_string((funcs.size() + batchSize - 1) / batchSize) + ")");
- }
+ task->SetProgressText("Fetching WARP functions (" + std::to_string(batchIndex) + " / "
+ + std::to_string((funcs.size() + batchSize - 1) / batchSize) + ")");
+ }
- task->Finish();
- // TODO: Print how long it took?
- Logger("WARP Fetcher").LogInfo("Finished fetching WARP functions...");
+ task->Finish();
+ // TODO: Print how long it took?
+ Logger("WARP Fetcher").LogInfo("Finished fetching WARP functions...");
- if (rerunMatcher && bv)
- Warp::RunMatcher(*bv);
- });
+ if (rerunMatcher && bv)
+ Warp::RunMatcher(*bv);
+ });
}
void RegisterWarpFetchFunctionsCommand()
{
- // Register a UI action and bind it globally. Add it to the Tools menu.
- const QString actionName = "WARP\\Fetch";
- if (!UIAction::isActionRegistered(actionName))
- UIAction::registerAction(actionName);
+ // Register a UI action and bind it globally. Add it to the Tools menu.
+ const QString actionName = "WARP\\Fetch";
+ if (!UIAction::isActionRegistered(actionName))
+ UIAction::registerAction(actionName);
- UIActionHandler::globalActions()->bindAction(
- actionName,
- UIAction(
- [](const UIActionContext &context) {
- if (const BinaryViewRef bv = context.binaryView; bv)
- {
- WarpFetchDialog dlg(bv, WarpFetcher::Global(), nullptr);
- dlg.exec();
- }
- },
- [](const UIActionContext &context) {
- return context.binaryView != nullptr;
- }
- )
- );
+ UIActionHandler::globalActions()->bindAction(actionName,
+ UIAction(
+ [](const UIActionContext& context) {
+ if (const BinaryViewRef bv = context.binaryView; bv)
+ {
+ WarpFetchDialog dlg(bv, WarpFetcher::Global(), nullptr);
+ dlg.exec();
+ }
+ },
+ [](const UIActionContext& context) { return context.binaryView != nullptr; }));
- Menu::mainMenu("Plugins")->addAction(actionName, "Plugins");
+ Menu::mainMenu("Plugins")->addAction(actionName, "Plugins");
}