From 023af80bad02bd451c062e3fcb97e239426bcc49 Mon Sep 17 00:00:00 2001 From: Josh Watson Date: Sat, 6 Mar 2021 10:51:14 -0800 Subject: Implementing BackgroundTask --- rust/src/backgroundtask.rs | 117 +++++++++++++++++++++++++++++++++++++++++++++ rust/src/lib.rs | 1 + 2 files changed, 118 insertions(+) create mode 100644 rust/src/backgroundtask.rs (limited to 'rust/src') diff --git a/rust/src/backgroundtask.rs b/rust/src/backgroundtask.rs new file mode 100644 index 00000000..985b8a83 --- /dev/null +++ b/rust/src/backgroundtask.rs @@ -0,0 +1,117 @@ +// Copyright 2021 Vector 35 Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use binaryninjacore_sys::*; + +use std::result; + +use crate::rc::*; +use crate::string::*; + +pub type Result = result::Result; + + +#[derive(PartialEq, Eq, Hash)] +pub struct BackgroundTask { + pub(crate) handle: *mut BNBackgroundTask, +} + +impl BackgroundTask { + pub unsafe fn from_raw(handle: *mut BNBackgroundTask) -> Self { + debug_assert!(!handle.is_null()); + + Self { handle } + } + + pub fn new( + initial_text: S, + can_cancel: bool + ) -> Result> { + let text = initial_text.as_bytes_with_nul(); + + let handle = unsafe { + BNBeginBackgroundTask(text.as_ref().as_ptr() as *mut _, can_cancel) + }; + + if handle.is_null() { + return Err(()); + } + + unsafe { Ok(Ref::new(Self { handle })) } + } + + pub fn can_cancel(&self) -> bool { + unsafe { BNCanCancelBackgroundTask(self.handle) } + } + + pub fn is_cancelled(&self) -> bool { + unsafe { BNIsBackgroundTaskCancelled(self.handle) } + } + + pub fn is_finished(&self) -> bool { + unsafe { BNIsBackgroundTaskFinished(self.handle) } + } + + pub fn get_progress_text(&self) -> BnString { + unsafe { BnString::from_raw(BNGetBackgroundTaskProgressText(self.handle)) } + } + + pub fn cancel(&self) { + unsafe { BNCancelBackgroundTask(self.handle) } + } + + pub fn finish(&self) { + unsafe { BNFinishBackgroundTask(self.handle) } + } + + pub fn set_progress_text(&self, text: S) { + let progress_text = text.as_bytes_with_nul(); + + unsafe { + BNSetBackgroundTaskProgressText( + self.handle, + progress_text.as_ref().as_ptr() as *mut _ + ) + } + } +} + +unsafe impl RefCountable for BackgroundTask { + unsafe fn inc_ref(handle: &Self) -> Ref { + Ref::new(Self { + handle: BNNewBackgroundTaskReference(handle.handle), + }) + } + + unsafe fn dec_ref(handle: &Self) { + BNFreeBackgroundTask(handle.handle); + } +} + +impl AsRef for BackgroundTask { + fn as_ref(&self) -> &Self { + self + } +} + +impl ToOwned for BackgroundTask { + type Owned = Ref; + + fn to_owned(&self) -> Self::Owned { + unsafe { RefCountable::inc_ref(self) } + } +} + +unsafe impl Send for BackgroundTask {} +unsafe impl Sync for BackgroundTask {} \ No newline at end of file diff --git a/rust/src/lib.rs b/rust/src/lib.rs index eba2d8ee..c1d30f47 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -39,6 +39,7 @@ extern crate rayon; mod ffi; pub mod architecture; +pub mod backgroundtask; pub mod basicblock; pub mod binaryview; pub mod callingconvention; -- cgit v1.3.1