summaryrefslogtreecommitdiff
path: root/rust/src/binaryview.rs
diff options
context:
space:
mode:
authormartin <martincharles07@gmail.com>2024-02-06 13:47:04 -0600
committerKyle Martin <krm504@nyu.edu>2024-03-18 17:41:29 -0400
commitbdd012af7941c7d17b97b3e69628a7bc7cc2411e (patch)
tree02a098cad353aa942a3ce1243624637c6b540024 /rust/src/binaryview.rs
parentb20cda6edfe7a19c29ae2b622527aa7d521db91c (diff)
add register_binary_view_event
Diffstat (limited to 'rust/src/binaryview.rs')
-rw-r--r--rust/src/binaryview.rs61
1 files changed, 61 insertions, 0 deletions
diff --git a/rust/src/binaryview.rs b/rust/src/binaryview.rs
index ded8115b..e188b650 100644
--- a/rust/src/binaryview.rs
+++ b/rust/src/binaryview.rs
@@ -1534,3 +1534,64 @@ impl std::fmt::Debug for BinaryView {
)
}
}
+
+pub trait BinaryViewEventHandler: 'static + Sync {
+ fn on_event(&self, binary_view: &BinaryView);
+}
+
+pub type BinaryViewEventType = BNBinaryViewEventType;
+
+/// Registers an event listener for binary view events.
+///
+/// # Example
+///
+/// ```rust
+/// use binaryninja::binaryview::{BinaryView, BinaryViewEventHandler, BinaryViewEventType, register_binary_view_event};
+///
+/// struct EventHandlerContext {
+/// // Context holding state available to event handler
+/// }
+///
+/// impl BinaryViewEventHandler for EventHandlerContext {
+/// fn on_event(&mut self, binary_view: &BinaryView) {
+/// // handle event
+/// }
+/// }
+///
+/// #[no_mangle]
+/// pub extern "C" fn CorePluginInit() {
+/// let context = EventHandlerContext { };
+///
+/// register_binary_view_event(
+/// BinaryViewEventType::BinaryViewInitialAnalysisCompletionEvent,
+/// context,
+/// );
+/// }
+/// ```
+pub fn register_binary_view_event<Handler>(event_type: BinaryViewEventType, handler: Handler)
+where
+ Handler: BinaryViewEventHandler,
+{
+ unsafe extern "C" fn on_event<Handler: BinaryViewEventHandler>(
+ ctx: *mut ::std::os::raw::c_void,
+ view: *mut BNBinaryView,
+ ) {
+ ffi_wrap!("EventHandler::on_event", unsafe {
+ let mut context = &mut *(ctx as *mut Handler);
+
+ let handle = BinaryView::from_raw(BNNewViewReference(view));
+ Handler::on_event(&mut context, handle.as_ref());
+ })
+ }
+
+ let boxed = Box::new(handler);
+ let raw = Box::into_raw(boxed);
+
+ unsafe {
+ BNRegisterBinaryViewEvent(
+ event_type,
+ Some(on_event::<Handler>),
+ raw as *mut ::std::os::raw::c_void,
+ );
+ }
+}