diff options
| author | martin <martincharles07@gmail.com> | 2024-02-06 13:47:04 -0600 |
|---|---|---|
| committer | Kyle Martin <krm504@nyu.edu> | 2024-03-18 17:41:29 -0400 |
| commit | bdd012af7941c7d17b97b3e69628a7bc7cc2411e (patch) | |
| tree | 02a098cad353aa942a3ce1243624637c6b540024 /rust/src/binaryview.rs | |
| parent | b20cda6edfe7a19c29ae2b622527aa7d521db91c (diff) | |
add register_binary_view_event
Diffstat (limited to 'rust/src/binaryview.rs')
| -rw-r--r-- | rust/src/binaryview.rs | 61 |
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, + ); + } +} |
