summaryrefslogtreecommitdiff
path: root/activity.cpp
diff options
context:
space:
mode:
authorBrian Potchik <brian@vector35.com>2025-01-22 10:48:44 -0500
committerBrian Potchik <brian@vector35.com>2025-01-22 10:48:44 -0500
commit8ba7106948272275534309d10a5a444f26df01ee (patch)
tree557da11f907b4f05d024c0e5d63a5580bd124130 /activity.cpp
parentf1eccb70c2f23fc6665733d8c911b21eb36cbcf5 (diff)
Support eligibility callbacks through the API for Workflow actions.
Diffstat (limited to 'activity.cpp')
-rw-r--r--activity.cpp25
1 files changed, 19 insertions, 6 deletions
diff --git a/activity.cpp b/activity.cpp
index fcc7386a..0bb5858f 100644
--- a/activity.cpp
+++ b/activity.cpp
@@ -5,10 +5,14 @@ using namespace BinaryNinja;
using namespace std;
-Activity::Activity(const string& configuration, const std::function<void(Ref<AnalysisContext> analysisContext)>& action) : m_action(action)
+Activity::Activity(const string& configuration, const std::function<void(Ref<AnalysisContext> analysisContext)>& action,
+ const std::function<bool(Ref<Activity>, Ref<AnalysisContext>)>& eligibility) : m_action(action), m_eligibility(eligibility)
{
// LogError("API-Side Activity Constructed!");
- m_object = BNCreateActivity(configuration.c_str(), this, Run);
+ if (eligibility)
+ m_object = BNCreateActivityWithEligibility(configuration.c_str(), this, RunAction, CheckEligibility);
+ else
+ m_object = BNCreateActivity(configuration.c_str(), this, RunAction);
}
@@ -25,12 +29,21 @@ Activity::~Activity()
}
-void Activity::Run(void* ctxt, BNAnalysisContext* analysisContext)
+void Activity::RunAction(void* ctxt, BNAnalysisContext* analysisContext)
{
- // LogError("API-Side Activity Run!");
- Activity* activity = (Activity*)ctxt;
+ // LogError("API-Side Activity RunAction!");
+ auto boundActivity = static_cast<Activity*>(ctxt);
Ref<AnalysisContext> ac = new AnalysisContext(BNNewAnalysisContextReference(analysisContext));
- activity->m_action(ac);
+ boundActivity->m_action(ac);
+}
+
+
+bool Activity::CheckEligibility(void* ctxt, BNActivity* activity, BNAnalysisContext* analysisContext)
+{
+ auto boundActivity = static_cast<Activity*>(ctxt);
+ Ref<Activity> act = new Activity(BNNewActivityReference(activity));
+ Ref<AnalysisContext> ac = new AnalysisContext(BNNewAnalysisContextReference(analysisContext));
+ return boundActivity->m_eligibility(act, ac);
}