diff options
| author | Josh Ferrell <josh@vector35.com> | 2023-03-29 15:41:59 -0400 |
|---|---|---|
| committer | Josh Ferrell <josh@vector35.com> | 2023-03-29 15:41:59 -0400 |
| commit | f270c5099ace1ae496257841a5bdff4bc36f01c1 (patch) | |
| tree | 15f6ba3fd8f9906ed0b51715837648f835c218af | |
| parent | 8d791bc9eb608139c6fd9d99ab0d96ed37561d3a (diff) | |
Add support for warnings to ScriptingInstance
| -rw-r--r-- | binaryninjaapi.h | 3 | ||||
| -rw-r--r-- | binaryninjacore.h | 2 | ||||
| -rw-r--r-- | python/scriptingprovider.py | 36 | ||||
| -rw-r--r-- | scriptingprovider.cpp | 17 | ||||
| -rw-r--r-- | ui/scriptingconsole.h | 2 |
5 files changed, 53 insertions, 7 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 17b65b22..98790d37 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -13541,6 +13541,7 @@ namespace BinaryNinja { BNScriptingOutputListener m_callbacks; static void OutputCallback(void* ctxt, const char* text); + static void WarningCallback(void* ctxt, const char* text); static void ErrorCallback(void* ctxt, const char* text); static void InputReadyStateChangedCallback(void* ctxt, BNScriptingProviderInputReadyState state); @@ -13549,6 +13550,7 @@ namespace BinaryNinja { BNScriptingOutputListener& GetCallbacks() { return m_callbacks; } virtual void NotifyOutput(const std::string& text); + virtual void NotifyWarning(const std::string& text); virtual void NotifyError(const std::string& text); virtual void NotifyInputReadyStateChanged(BNScriptingProviderInputReadyState state); }; @@ -13592,6 +13594,7 @@ namespace BinaryNinja { virtual void Stop(); void Output(const std::string& text); + void Warning(const std::string& text); void Error(const std::string& text); void InputReadyStateChanged(BNScriptingProviderInputReadyState state); BNScriptingProviderInputReadyState GetInputReadyState(); diff --git a/binaryninjacore.h b/binaryninjacore.h index 9a763b39..d0d2955b 100644 --- a/binaryninjacore.h +++ b/binaryninjacore.h @@ -2529,6 +2529,7 @@ extern "C" { void* context; void (*output)(void* ctxt, const char* text); + void (*warning)(void* ctxt, const char* text); void (*error)(void* ctxt, const char* text); void (*inputReadyStateChanged)(void* ctxt, BNScriptingProviderInputReadyState state); }; @@ -5901,6 +5902,7 @@ extern "C" BINARYNINJACOREAPI BNScriptingInstance* BNNewScriptingInstanceReference(BNScriptingInstance* instance); BINARYNINJACOREAPI void BNFreeScriptingInstance(BNScriptingInstance* instance); BINARYNINJACOREAPI void BNNotifyOutputForScriptingInstance(BNScriptingInstance* instance, const char* text); + BINARYNINJACOREAPI void BNNotifyWarningForScriptingInstance(BNScriptingInstance* instance, const char* text); BINARYNINJACOREAPI void BNNotifyErrorForScriptingInstance(BNScriptingInstance* instance, const char* text); BINARYNINJACOREAPI void BNNotifyInputReadyStateForScriptingInstance( BNScriptingInstance* instance, BNScriptingProviderInputReadyState state); diff --git a/python/scriptingprovider.py b/python/scriptingprovider.py index 06ac9170..e18a906a 100644 --- a/python/scriptingprovider.py +++ b/python/scriptingprovider.py @@ -44,10 +44,12 @@ from . import settings from . import binaryview from . import basicblock from . import function -from .log import log_info, log_error, is_output_redirected_to_log +from .log import log_info, log_warn, log_error, is_output_redirected_to_log from .pluginmanager import RepositoryManager from .enums import ScriptingProviderExecuteResult, ScriptingProviderInputReadyState +_WARNING_REGEX = re.compile(r'^\S+:\d+: \w+Warning: ') + class _ThreadActionContext: _actions = [] @@ -76,6 +78,7 @@ class ScriptingOutputListener: self._cb = core.BNScriptingOutputListener() self._cb.context = 0 self._cb.output = self._cb.output.__class__(self._output) + self._cb.warning = self._cb.warning.__class__(self._warning) self._cb.error = self._cb.error.__class__(self._error) self._cb.inputReadyStateChanged = self._cb.inputReadyStateChanged.__class__(self._input_ready_state_changed) core.BNRegisterScriptingInstanceOutputListener(handle, self._cb) @@ -89,6 +92,13 @@ class ScriptingOutputListener: except: log_error(traceback.format_exc()) + def _warning(self, ctxt, text): + try: + self.notify_warning(text) + except: + log_error(traceback.format_exc()) + + def _error(self, ctxt, text): try: self.notify_error(text) @@ -104,6 +114,9 @@ class ScriptingOutputListener: def notify_output(self, text): pass + def notify_warning(self, text): + pass + def notify_error(self, text): pass @@ -293,6 +306,9 @@ class ScriptingInstance: def output(self, text): core.BNNotifyOutputForScriptingInstance(self.handle, text) + def warning(self, text): + core.BNNotifyWarningForScriptingInstance(self.handle, text) + def error(self, text): core.BNNotifyErrorForScriptingInstance(self.handle, text) @@ -421,9 +437,9 @@ class ScriptingProvider(metaclass=_ScriptingProviderMetaclass): class _PythonScriptingInstanceOutput: - def __init__(self, orig, is_error): + def __init__(self, orig, is_error_output): self.orig = orig - self.is_error = is_error + self.is_error_output = is_error_output self.buffer = "" self.encoding = 'UTF-8' self.errors = None @@ -485,8 +501,11 @@ class _PythonScriptingInstanceOutput: line = self.buffer[:i] self.buffer = self.buffer[i + 1:] - if self.is_error: - log_error(line) + if self.is_error_output: + if _WARNING_REGEX.match(line): + log_warn(line) + else: + log_error(line) else: log_info(line) else: @@ -494,8 +513,11 @@ class _PythonScriptingInstanceOutput: else: PythonScriptingInstance._interpreter.value = None try: - if self.is_error: - interpreter.instance.error(data) + if self.is_error_output: + if _WARNING_REGEX.match(data): + interpreter.instance.warning(data) + else: + interpreter.instance.error(data) else: interpreter.instance.output(data) finally: diff --git a/scriptingprovider.cpp b/scriptingprovider.cpp index def9c4c0..c3c4d615 100644 --- a/scriptingprovider.cpp +++ b/scriptingprovider.cpp @@ -8,6 +8,7 @@ ScriptingOutputListener::ScriptingOutputListener() { m_callbacks.context = this; m_callbacks.output = OutputCallback; + m_callbacks.warning = WarningCallback; m_callbacks.error = ErrorCallback; m_callbacks.inputReadyStateChanged = InputReadyStateChangedCallback; } @@ -20,6 +21,13 @@ void ScriptingOutputListener::OutputCallback(void* ctxt, const char* text) } +void ScriptingOutputListener::WarningCallback(void* ctxt, const char* text) +{ + ScriptingOutputListener* listener = (ScriptingOutputListener*)ctxt; + listener->NotifyWarning(text); +} + + void ScriptingOutputListener::ErrorCallback(void* ctxt, const char* text) { ScriptingOutputListener* listener = (ScriptingOutputListener*)ctxt; @@ -37,6 +45,9 @@ void ScriptingOutputListener::InputReadyStateChangedCallback(void* ctxt, BNScrip void ScriptingOutputListener::NotifyOutput(const string&) {} +void ScriptingOutputListener::NotifyWarning(const string&) {} + + void ScriptingOutputListener::NotifyError(const string&) {} @@ -184,6 +195,12 @@ void ScriptingInstance::Output(const string& text) } +void ScriptingInstance::Warning(const string& text) +{ + BNNotifyWarningForScriptingInstance(m_object, text.c_str()); +} + + void ScriptingInstance::Error(const string& text) { BNNotifyErrorForScriptingInstance(m_object, text.c_str()); diff --git a/ui/scriptingconsole.h b/ui/scriptingconsole.h index 21636be5..d9f7d814 100644 --- a/ui/scriptingconsole.h +++ b/ui/scriptingconsole.h @@ -155,6 +155,7 @@ class BINARYNINJAUIAPI ScriptingConsole : public GlobalAreaWidget, BinaryNinja:: { std::string text; bool isError; + bool isWarning; }; QString m_providerName; @@ -210,6 +211,7 @@ class BINARYNINJAUIAPI ScriptingConsole : public GlobalAreaWidget, BinaryNinja:: void addInput(const std::string& text); virtual void NotifyOutput(const std::string& text) override; + virtual void NotifyWarning(const std::string& text) override; virtual void NotifyError(const std::string& text) override; virtual void NotifyInputReadyStateChanged(BNScriptingProviderInputReadyState state) override; virtual void notifyViewChanged(ViewFrame* frame) override; |
