diff options
| author | Glenn Smith <glenn@vector35.com> | 2022-07-18 19:53:47 -0400 |
|---|---|---|
| committer | Glenn Smith <glenn@vector35.com> | 2022-09-29 21:02:21 -0400 |
| commit | ad27532d344d3bf2995f623002753d2845c6ce20 (patch) | |
| tree | 772db0ae0fc09993fcd3f13f62628cba3414d95b /rust/src/binaryview.rs | |
| parent | 90a3729620e85f66b8fa5d385ead21ac581a1cc5 (diff) | |
[Rust API] Add support for Metadata
Diffstat (limited to 'rust/src/binaryview.rs')
| -rw-r--r-- | rust/src/binaryview.rs | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/rust/src/binaryview.rs b/rust/src/binaryview.rs index a372b778..e64dbb61 100644 --- a/rust/src/binaryview.rs +++ b/rust/src/binaryview.rs @@ -18,10 +18,12 @@ //! TODO : Mirror the Python docs for this use binaryninjacore_sys::*; +use std::convert::TryFrom; pub use binaryninjacore_sys::BNModificationStatus as ModificationStatus; use std::ops; +use std::os::raw::c_char; use std::ptr; use std::result; @@ -36,6 +38,7 @@ use crate::flowgraph::FlowGraph; use crate::function::{Function, NativeBlock}; use crate::linearview::LinearDisassemblyLine; use crate::linearview::LinearViewCursor; +use crate::metadata::Metadata; use crate::platform::Platform; use crate::section::{Section, SectionBuilder}; use crate::segment::{Segment, SegmentBuilder}; @@ -133,7 +136,7 @@ pub trait BinaryViewBase: AsRef<BinaryView> { } pub trait BinaryViewExt: BinaryViewBase { - fn metadata(&self) -> Ref<FileMetadata> { + fn file(&self) -> Ref<FileMetadata> { unsafe { let raw = BNGetFileForView(self.as_ref().handle); @@ -829,6 +832,36 @@ pub trait BinaryViewExt: BinaryViewBase { result } + + fn query_metadata<S: BnStrCompatible>(&self, key: S) -> Option<Ref<Metadata>> { + let value: *mut BNMetadata = unsafe { + BNBinaryViewQueryMetadata( + self.as_ref().handle, + key.as_bytes_with_nul().as_ref().as_ptr() as *const c_char, + ) + }; + if value.is_null() { + None + } else { + Some(unsafe { Metadata::ref_from_raw(value) }) + } + } + + fn get_metadata<T: TryFrom<&Metadata>, S: BnStrCompatible>( + &self, + key: S, + ) -> Option<std::result::Result<T, T::Error>> { + self.query_metadata(key).map(|md| T::try_from(md)) + } + + fn remove_metadata<S: BnStrCompatible>(&self, key: S) { + unsafe { + BNBinaryViewRemoveMetadata( + self.as_ref().handle, + key.as_bytes_with_nul().as_ref().as_ptr() as *const c_char, + ) + }; + } } impl<T: BinaryViewBase> BinaryViewExt for T {} |
