summaryrefslogtreecommitdiff
path: root/interaction.cpp
diff options
context:
space:
mode:
authorGlenn Smith <glenn@vector35.com>2022-09-26 23:12:20 -0400
committerGlenn Smith <glenn@vector35.com>2022-09-29 21:02:20 -0400
commit207925956bb8ca0174d40523fda70bfb5bc7bd38 (patch)
tree4d5c8cba9ee2ad2b061f1e420c681a793ad397b8 /interaction.cpp
parent5c8aa2ad6c2c03b37cacad4021f81310be12f375 (diff)
Interaction::RunProgressDialog
Diffstat (limited to 'interaction.cpp')
-rw-r--r--interaction.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/interaction.cpp b/interaction.cpp
index 580e2a39..8bfe4495 100644
--- a/interaction.cpp
+++ b/interaction.cpp
@@ -420,6 +420,18 @@ static bool OpenUrlCallback(void* ctxt, const char* url)
}
+static bool RunProgressDialogCallback(void* ctxt, const char* title, bool canCancel,
+ void (*task)(void*, bool (*)(void*, size_t, size_t), void*), void* taskCtxt)
+{
+ InteractionHandler* handler = (InteractionHandler*)ctxt;
+ return handler->RunProgressDialog(title, canCancel, [=](std::function<bool(size_t, size_t)> progress) {
+ ProgressContext context;
+ context.callback = progress;
+ task(taskCtxt, ProgressCallback, &context);
+ });
+}
+
+
void BinaryNinja::RegisterInteractionHandler(InteractionHandler* handler)
{
BNInteractionHandlerCallbacks cb;
@@ -439,6 +451,7 @@ void BinaryNinja::RegisterInteractionHandler(InteractionHandler* handler)
cb.getFormInput = GetFormInputCallback;
cb.showMessageBox = ShowMessageBoxCallback;
cb.openUrl = OpenUrlCallback;
+ cb.runProgressDialog = RunProgressDialogCallback;
BNRegisterInteractionHandler(&cb);
}
@@ -671,6 +684,29 @@ bool BinaryNinja::OpenUrl(const std::string& url)
}
+struct TaskContext
+{
+ std::function<void(std::function<bool(size_t, size_t)> progress)> callback;
+};
+
+
+static void TaskCallback(void* taskCtxt, bool (*progress)(void*, size_t, size_t), void* progressCtxt)
+{
+ TaskContext* context = (TaskContext*)taskCtxt;
+ context->callback([=](size_t cur, size_t max) {
+ return progress(progressCtxt, cur, max);
+ });
+}
+
+
+bool BinaryNinja::RunProgressDialog(const std::string& title, bool canCancel, std::function<void(std::function<bool(size_t, size_t)> progress)> task)
+{
+ TaskContext context;
+ context.callback = task;
+ return BNRunProgressDialog(title.c_str(), canCancel, TaskCallback, &context);
+}
+
+
ReportCollection::ReportCollection()
{
m_object = BNCreateReportCollection();