diff options
| author | Glenn Smith <glenn@vector35.com> | 2022-09-26 23:12:20 -0400 |
|---|---|---|
| committer | Glenn Smith <glenn@vector35.com> | 2022-09-29 21:02:20 -0400 |
| commit | 207925956bb8ca0174d40523fda70bfb5bc7bd38 (patch) | |
| tree | 4d5c8cba9ee2ad2b061f1e420c681a793ad397b8 /interaction.cpp | |
| parent | 5c8aa2ad6c2c03b37cacad4021f81310be12f375 (diff) | |
Interaction::RunProgressDialog
Diffstat (limited to 'interaction.cpp')
| -rw-r--r-- | interaction.cpp | 36 |
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(); |
