binaryninja/repository/
plugin.rsuse crate::rc::{Array, CoreArrayProvider, CoreArrayProviderInner, Guard, Ref, RefCountable};
use crate::repository::{PluginStatus, PluginType};
use crate::string::BnString;
use crate::VersionInfo;
use binaryninjacore_sys::*;
use std::ffi::c_char;
use std::fmt::Debug;
use std::path::PathBuf;
use std::ptr::NonNull;
use std::time::{Duration, SystemTime, UNIX_EPOCH};
#[repr(transparent)]
pub struct RepositoryPlugin {
handle: NonNull<BNRepoPlugin>,
}
impl RepositoryPlugin {
pub(crate) unsafe fn from_raw(handle: NonNull<BNRepoPlugin>) -> Self {
Self { handle }
}
pub(crate) unsafe fn ref_from_raw(handle: NonNull<BNRepoPlugin>) -> Ref<Self> {
Ref::new(Self { handle })
}
pub fn apis(&self) -> Array<BnString> {
let mut count = 0;
let result = unsafe { BNPluginGetApis(self.handle.as_ptr(), &mut count) };
assert!(!result.is_null());
unsafe { Array::new(result, count, ()) }
}
pub fn author(&self) -> String {
let result = unsafe { BNPluginGetAuthor(self.handle.as_ptr()) };
assert!(!result.is_null());
unsafe { BnString::into_string(result as *mut c_char) }
}
pub fn description(&self) -> String {
let result = unsafe { BNPluginGetDescription(self.handle.as_ptr()) };
assert!(!result.is_null());
unsafe { BnString::into_string(result as *mut c_char) }
}
pub fn license_text(&self) -> String {
let result = unsafe { BNPluginGetLicenseText(self.handle.as_ptr()) };
assert!(!result.is_null());
unsafe { BnString::into_string(result as *mut c_char) }
}
pub fn long_description(&self) -> String {
let result = unsafe { BNPluginGetLongdescription(self.handle.as_ptr()) };
assert!(!result.is_null());
unsafe { BnString::into_string(result as *mut c_char) }
}
pub fn minimum_version_info(&self) -> VersionInfo {
let result = unsafe { BNPluginGetMinimumVersionInfo(self.handle.as_ptr()) };
VersionInfo::from_owned_raw(result)
}
pub fn maximum_version_info(&self) -> VersionInfo {
let result = unsafe { BNPluginGetMaximumVersionInfo(self.handle.as_ptr()) };
VersionInfo::from_owned_raw(result)
}
pub fn name(&self) -> String {
let result = unsafe { BNPluginGetName(self.handle.as_ptr()) };
assert!(!result.is_null());
unsafe { BnString::into_string(result as *mut c_char) }
}
pub fn project_url(&self) -> String {
let result = unsafe { BNPluginGetProjectUrl(self.handle.as_ptr()) };
assert!(!result.is_null());
unsafe { BnString::into_string(result as *mut c_char) }
}
pub fn package_url(&self) -> String {
let result = unsafe { BNPluginGetPackageUrl(self.handle.as_ptr()) };
assert!(!result.is_null());
unsafe { BnString::into_string(result as *mut c_char) }
}
pub fn author_url(&self) -> String {
let result = unsafe { BNPluginGetAuthorUrl(self.handle.as_ptr()) };
assert!(!result.is_null());
unsafe { BnString::into_string(result as *mut c_char) }
}
pub fn version(&self) -> String {
let result = unsafe { BNPluginGetVersion(self.handle.as_ptr()) };
assert!(!result.is_null());
unsafe { BnString::into_string(result as *mut c_char) }
}
pub fn commit(&self) -> String {
let result = unsafe { BNPluginGetCommit(self.handle.as_ptr()) };
assert!(!result.is_null());
unsafe { BnString::into_string(result as *mut c_char) }
}
pub fn path(&self) -> PathBuf {
let result = unsafe { BNPluginGetPath(self.handle.as_ptr()) };
assert!(!result.is_null());
let result_str = unsafe { BnString::into_string(result as *mut c_char) };
PathBuf::from(result_str)
}
pub fn subdir(&self) -> PathBuf {
let result = unsafe { BNPluginGetSubdir(self.handle.as_ptr()) };
assert!(!result.is_null());
let result_str = unsafe { BnString::into_string(result as *mut c_char) };
PathBuf::from(result_str)
}
pub fn dependencies(&self) -> String {
let result = unsafe { BNPluginGetDependencies(self.handle.as_ptr()) };
assert!(!result.is_null());
unsafe { BnString::into_string(result as *mut c_char) }
}
pub fn is_installed(&self) -> bool {
unsafe { BNPluginIsInstalled(self.handle.as_ptr()) }
}
pub fn is_enabled(&self) -> bool {
unsafe { BNPluginIsEnabled(self.handle.as_ptr()) }
}
pub fn status(&self) -> PluginStatus {
unsafe { BNPluginGetPluginStatus(self.handle.as_ptr()) }
}
pub fn types(&self) -> Array<PluginType> {
let mut count = 0;
let result = unsafe { BNPluginGetPluginTypes(self.handle.as_ptr(), &mut count) };
assert!(!result.is_null());
unsafe { Array::new(result, count, ()) }
}
pub fn enable(&self, force: bool) -> bool {
unsafe { BNPluginEnable(self.handle.as_ptr(), force) }
}
pub fn disable(&self) -> bool {
unsafe { BNPluginDisable(self.handle.as_ptr()) }
}
pub fn install(&self) -> bool {
unsafe { BNPluginInstall(self.handle.as_ptr()) }
}
pub fn install_dependencies(&self) -> bool {
unsafe { BNPluginInstallDependencies(self.handle.as_ptr()) }
}
pub fn uninstall(&self) -> bool {
unsafe { BNPluginUninstall(self.handle.as_ptr()) }
}
pub fn updated(&self) -> bool {
unsafe { BNPluginUpdate(self.handle.as_ptr()) }
}
pub fn platforms(&self) -> Array<BnString> {
let mut count = 0;
let result = unsafe { BNPluginGetPlatforms(self.handle.as_ptr(), &mut count) };
assert!(!result.is_null());
unsafe { Array::new(result, count, ()) }
}
pub fn repository(&self) -> String {
let result = unsafe { BNPluginGetRepository(self.handle.as_ptr()) };
assert!(!result.is_null());
unsafe { BnString::into_string(result as *mut c_char) }
}
pub fn is_being_deleted(&self) -> bool {
unsafe { BNPluginIsBeingDeleted(self.handle.as_ptr()) }
}
pub fn is_being_updated(&self) -> bool {
unsafe { BNPluginIsBeingUpdated(self.handle.as_ptr()) }
}
pub fn is_running(&self) -> bool {
unsafe { BNPluginIsRunning(self.handle.as_ptr()) }
}
pub fn is_update_pending(&self) -> bool {
unsafe { BNPluginIsUpdatePending(self.handle.as_ptr()) }
}
pub fn is_disable_pending(&self) -> bool {
unsafe { BNPluginIsDisablePending(self.handle.as_ptr()) }
}
pub fn is_delete_pending(&self) -> bool {
unsafe { BNPluginIsDeletePending(self.handle.as_ptr()) }
}
pub fn is_updated_available(&self) -> bool {
unsafe { BNPluginIsUpdateAvailable(self.handle.as_ptr()) }
}
pub fn are_dependencies_being_installed(&self) -> bool {
unsafe { BNPluginAreDependenciesBeingInstalled(self.handle.as_ptr()) }
}
pub fn project_data(&self) -> String {
let result = unsafe { BNPluginGetProjectData(self.handle.as_ptr()) };
assert!(!result.is_null());
unsafe { BnString::into_string(result) }
}
pub fn last_update(&self) -> SystemTime {
let result = unsafe { BNPluginGetLastUpdate(self.handle.as_ptr()) };
UNIX_EPOCH + Duration::from_secs(result)
}
}
impl Debug for RepositoryPlugin {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("RepositoryPlugin")
.field("name", &self.name())
.field("version", &self.version())
.field("author", &self.author())
.field("description", &self.description())
.field("minimum_version_info", &self.minimum_version_info())
.field("maximum_version_info", &self.maximum_version_info())
.field("last_update", &self.last_update())
.field("status", &self.status())
.finish()
}
}
impl ToOwned for RepositoryPlugin {
type Owned = Ref<Self>;
fn to_owned(&self) -> Self::Owned {
unsafe { RefCountable::inc_ref(self) }
}
}
unsafe impl RefCountable for RepositoryPlugin {
unsafe fn inc_ref(handle: &Self) -> Ref<Self> {
Self::ref_from_raw(NonNull::new(BNNewPluginReference(handle.handle.as_ptr())).unwrap())
}
unsafe fn dec_ref(handle: &Self) {
BNFreePlugin(handle.handle.as_ptr())
}
}
impl CoreArrayProvider for RepositoryPlugin {
type Raw = *mut BNRepoPlugin;
type Context = ();
type Wrapped<'a> = Guard<'a, Self>;
}
unsafe impl CoreArrayProviderInner for RepositoryPlugin {
unsafe fn free(raw: *mut Self::Raw, _count: usize, _context: &Self::Context) {
BNFreeRepositoryPluginList(raw)
}
unsafe fn wrap_raw<'a>(raw: &'a Self::Raw, context: &'a Self::Context) -> Self::Wrapped<'a> {
Guard::new(Self::from_raw(NonNull::new(*raw).unwrap()), context)
}
}