summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosh Ferrell <josh@vector35.com>2023-03-29 15:41:59 -0400
committerJosh Ferrell <josh@vector35.com>2023-03-29 15:41:59 -0400
commitf270c5099ace1ae496257841a5bdff4bc36f01c1 (patch)
tree15f6ba3fd8f9906ed0b51715837648f835c218af
parent8d791bc9eb608139c6fd9d99ab0d96ed37561d3a (diff)
Add support for warnings to ScriptingInstance
-rw-r--r--binaryninjaapi.h3
-rw-r--r--binaryninjacore.h2
-rw-r--r--python/scriptingprovider.py36
-rw-r--r--scriptingprovider.cpp17
-rw-r--r--ui/scriptingconsole.h2
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;