Skip to content

Commit bb85a97

Browse files
committed
Update Render Layer registration in Rust API
The unit tests were not updated and the enum was kept with extremely long names, so I just added a simple wrapper.
1 parent 5b988a6 commit bb85a97

File tree

2 files changed

+58
-8
lines changed

2 files changed

+58
-8
lines changed

rust/src/render_layer.rs

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,60 @@ use binaryninjacore_sys::*;
1111
use std::ffi::{c_char, c_void};
1212
use std::ptr::NonNull;
1313

14-
pub type RenderLayerDefaultEnableState = BNRenderLayerDefaultEnableState;
14+
/// The state in which the [`RenderLayer`] will be registered with.
15+
#[repr(u32)]
16+
pub enum RenderLayerDefaultState {
17+
/// Register the [`RenderLayer`] as disabled, the user must then enable it via the UI.
18+
///
19+
/// This is the default registration value.
20+
Disabled = 0,
21+
/// Register the [`RenderLayer`] as enabled, the user must then disable it via the UI.
22+
Enabled = 1,
23+
/// Use this if you do not want the render layer to be adjustable via the UI.
24+
AlwaysEnabled = 2,
25+
}
26+
27+
impl From<BNRenderLayerDefaultEnableState> for RenderLayerDefaultState {
28+
fn from(value: BNRenderLayerDefaultEnableState) -> Self {
29+
match value {
30+
BNRenderLayerDefaultEnableState::DisabledByDefaultRenderLayerDefaultEnableState => {
31+
Self::Disabled
32+
}
33+
BNRenderLayerDefaultEnableState::EnabledByDefaultRenderLayerDefaultEnableState => {
34+
Self::Enabled
35+
}
36+
BNRenderLayerDefaultEnableState::AlwaysEnabledRenderLayerDefaultEnableState => {
37+
Self::AlwaysEnabled
38+
}
39+
}
40+
}
41+
}
42+
43+
impl From<RenderLayerDefaultState> for BNRenderLayerDefaultEnableState {
44+
fn from(value: RenderLayerDefaultState) -> Self {
45+
match value {
46+
RenderLayerDefaultState::Disabled => {
47+
Self::DisabledByDefaultRenderLayerDefaultEnableState
48+
}
49+
RenderLayerDefaultState::Enabled => Self::EnabledByDefaultRenderLayerDefaultEnableState,
50+
RenderLayerDefaultState::AlwaysEnabled => {
51+
Self::AlwaysEnabledRenderLayerDefaultEnableState
52+
}
53+
}
54+
}
55+
}
56+
57+
impl Default for RenderLayerDefaultState {
58+
fn default() -> Self {
59+
Self::Disabled
60+
}
61+
}
1562

1663
/// Register a [`RenderLayer`] with the API.
1764
pub fn register_render_layer<S: BnStrCompatible, T: RenderLayer>(
1865
name: S,
1966
render_layer: T,
20-
enable_state: RenderLayerDefaultEnableState,
67+
default_state: RenderLayerDefaultState,
2168
) -> (&'static mut T, CoreRenderLayer) {
2269
let render_layer = Box::leak(Box::new(render_layer));
2370
let mut callback = BNRenderLayerCallbacks {
@@ -30,7 +77,7 @@ pub fn register_render_layer<S: BnStrCompatible, T: RenderLayer>(
3077
BNRegisterRenderLayer(
3178
name.into_bytes_with_nul().as_ref().as_ptr() as *const _,
3279
&mut callback,
33-
enable_state,
80+
default_state.into(),
3481
)
3582
};
3683
let core = CoreRenderLayer::from_raw(NonNull::new(result).unwrap());
@@ -263,8 +310,9 @@ impl CoreRenderLayer {
263310
NonNull::new(result).map(Self::from_raw)
264311
}
265312

266-
pub fn default_enable_state(&self) -> RenderLayerDefaultEnableState {
267-
unsafe { BNGetRenderLayerDefaultEnableState(self.handle.as_ptr()) }
313+
pub fn default_state(&self) -> RenderLayerDefaultState {
314+
let raw = unsafe { BNGetRenderLayerDefaultEnableState(self.handle.as_ptr()) };
315+
RenderLayerDefaultState::from(raw)
268316
}
269317

270318
pub fn apply_to_flow_graph(&self, graph: &FlowGraph) {

rust/tests/render_layer.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ fn session() -> Session {
1717
fn test_render_layer_register(_session: &Session) {
1818
struct EmptyRenderLayer;
1919
impl RenderLayer for EmptyRenderLayer {}
20-
register_render_layer("Test Render Layer", EmptyRenderLayer);
20+
register_render_layer("Test Render Layer", EmptyRenderLayer, Default::default());
2121
CoreRenderLayer::render_layer_by_name("Test Render Layer").expect("Failed to get render layer");
2222
}
2323

@@ -37,7 +37,8 @@ fn test_render_layer_linear_view(_session: &Session) {
3737
lines
3838
}
3939
}
40-
let (_, nop_render_layer) = register_render_layer("Nop Render Layer", NopRenderLayer);
40+
let (_, nop_render_layer) =
41+
register_render_layer("Nop Render Layer", NopRenderLayer, Default::default());
4142

4243
// Create linear view object stuff
4344
let settings = DisassemblySettings::new();
@@ -81,7 +82,8 @@ fn test_render_layer_linear_view(_session: &Session) {
8182
lines
8283
}
8384
}
84-
let (_, adding_render_layer) = register_render_layer("Add Render Layer", AddRenderLayer);
85+
let (_, adding_render_layer) =
86+
register_render_layer("Add Render Layer", AddRenderLayer, Default::default());
8587

8688
// Calling lines() again should now have the render layer applied.
8789
cursor.add_render_layer(&adding_render_layer);

0 commit comments

Comments
 (0)