diff options
| author | Brian Potchik <brian@vector35.com> | 2025-03-29 21:55:04 -0400 |
|---|---|---|
| committer | Brian Potchik <brian@vector35.com> | 2025-03-29 21:55:04 -0400 |
| commit | 44c8af1986d2626e44931917c548adece5bc074d (patch) | |
| tree | 44029bae21d9226ea8b101a079253148faf4056c | |
| parent | 84dc3cb21aa75f40dae5ab8fdd2f1782e77f5f4c (diff) | |
Add interim workflow C++ apis for logging.
| -rw-r--r-- | binaryninjaapi.h | 11 | ||||
| -rw-r--r-- | ui/uitypes.h | 1 | ||||
| -rw-r--r-- | workflow.cpp | 50 |
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); |
