summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Potchik <brian@vector35.com>2025-03-29 21:55:04 -0400
committerBrian Potchik <brian@vector35.com>2025-03-29 21:55:04 -0400
commit44c8af1986d2626e44931917c548adece5bc074d (patch)
tree44029bae21d9226ea8b101a079253148faf4056c
parent84dc3cb21aa75f40dae5ab8fdd2f1782e77f5f4c (diff)
Add interim workflow C++ apis for logging.
-rw-r--r--binaryninjaapi.h11
-rw-r--r--ui/uitypes.h1
-rw-r--r--workflow.cpp50
3 files changed, 57 insertions, 5 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h
index 74a0f868..82e6ace1 100644
--- a/binaryninjaapi.h
+++ b/binaryninjaapi.h
@@ -10126,12 +10126,13 @@ namespace BinaryNinja {
*/
bool Step();
- /*! Get the current state of the workflow machine
-
- Returns the current state of the workflow machine.
- \return The current state of the workflow machine
- */
+ // TODO: Add new BNWorkflowMachineStatus structure and cooresponding API
+ // BNWorkflowMachineStatus GetStatus();
+ // TODO remove the following APIs once the above is implemented
std::string GetState();
+ std::pair<bool, bool> GetLogStatus();
+
+ bool SetLogEnabled(bool enable, bool global = false);
std::optional<bool> QueryOverride(const std::string& activity);
bool SetOverride(const std::string& activity, bool enable);
diff --git a/ui/uitypes.h b/ui/uitypes.h
index f950268d..a520dbbe 100644
--- a/ui/uitypes.h
+++ b/ui/uitypes.h
@@ -112,6 +112,7 @@ typedef BinaryNinja::Ref<BinaryNinja::TypeArchive> TypeArchiveRef;
typedef BinaryNinja::Ref<BinaryNinja::TypeLibrary> TypeLibraryRef;
typedef BinaryNinja::Ref<BinaryNinja::WebsocketClient> WebsocketClientRef;
typedef BinaryNinja::Ref<BinaryNinja::WebsocketProvider> WebsocketProviderRef;
+typedef BinaryNinja::Ref<BinaryNinja::Workflow> WorkflowRef;
typedef BinaryNinja::Ref<BinaryNinja::RepoPlugin> RepoPluginRef;
typedef BinaryNinja::Ref<BinaryNinja::Repository> RepositoryRef;
typedef BinaryNinja::Ref<BinaryNinja::RepositoryManager> RepositoryManagerRef;
diff --git a/workflow.cpp b/workflow.cpp
index 9edb6ea6..8e3dc7df 100644
--- a/workflow.cpp
+++ b/workflow.cpp
@@ -207,6 +207,56 @@ string WorkflowMachine::GetState()
}
+std::pair<bool, bool> WorkflowMachine::GetLogStatus()
+{
+ rapidjson::Document request(rapidjson::kObjectType);
+ rapidjson::Document::AllocatorType& allocator = request.GetAllocator();
+ request.AddMember("command", "status", allocator);
+ rapidjson::StringBuffer buffer;
+ rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
+ request.Accept(writer);
+
+ string jsonResult;
+ if (m_function)
+ jsonResult = BNPostWorkflowRequestForFunction(m_function->GetObject(), buffer.GetString());
+ else
+ jsonResult = BNPostWorkflowRequestForBinaryView(m_view->GetObject(), buffer.GetString());
+
+ rapidjson::Document response(rapidjson::kObjectType);
+ response.Parse(jsonResult.c_str());
+ if (response.HasMember("logStatus") && response["logStatus"].HasMember("local") && response["logStatus"].HasMember("global"))
+ return {response["logStatus"]["local"].GetBool(), response["logStatus"]["global"].GetBool()};
+
+ return {false, false};
+}
+
+
+bool WorkflowMachine::SetLogEnabled(bool enable, bool global)
+{
+ rapidjson::Document request(rapidjson::kObjectType);
+ rapidjson::Document::AllocatorType& allocator = request.GetAllocator();
+ request.AddMember("command", "log", allocator);
+ request.AddMember("enable", enable, allocator);
+ request.AddMember("global", global, allocator);
+ rapidjson::StringBuffer buffer;
+ rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
+ request.Accept(writer);
+
+ string jsonResult;
+ if (m_function)
+ jsonResult = BNPostWorkflowRequestForFunction(m_function->GetObject(), buffer.GetString());
+ else
+ jsonResult = BNPostWorkflowRequestForBinaryView(m_view->GetObject(), buffer.GetString());
+
+ rapidjson::Document response(rapidjson::kObjectType);
+ response.Parse(jsonResult.c_str());
+ if (response.HasMember("commandStatus") && response["commandStatus"].HasMember("accepted"))
+ return response["commandStatus"]["accepted"].GetBool();
+
+ return false;
+}
+
+
std::optional<bool> WorkflowMachine::QueryOverride(const string& activity)
{
rapidjson::Document request(rapidjson::kObjectType);