pub const STATUS_NOT_DETERMINED: i32 = 0;
pub const STATUS_GRANTED: i32 = 1;
pub const STATUS_DENIED: i32 = 2;
pub const STATUS_RESTRICTED: i32 = 3;
#[allow(dead_code)]
pub const STATUS_UNSUPPORTED: i32 = 4;
pub fn status() -> i32 {
platform::status()
}
pub fn request() -> i32 {
platform::request()
}
#[cfg(any(target_os = "macos", target_os = "ios"))]
mod platform {
use std::sync::OnceLock;
use objc2::AllocAnyThread;
use objc2_core_bluetooth::{CBCentralManager, CBManager, CBManagerAuthorization};
use super::*;
fn map(auth: CBManagerAuthorization) -> i32 {
if auth == CBManagerAuthorization::AllowedAlways {
STATUS_GRANTED
} else if auth == CBManagerAuthorization::Denied {
STATUS_DENIED
} else if auth == CBManagerAuthorization::Restricted {
STATUS_RESTRICTED
} else {
STATUS_NOT_DETERMINED
}
}
pub fn status() -> i32 {
map(unsafe { CBManager::authorization_class() })
}
pub fn request() -> i32 {
static MANAGER: OnceLock<SendManager> = OnceLock::new();
MANAGER.get_or_init(|| {
let mgr = unsafe {
CBCentralManager::initWithDelegate_queue(
CBCentralManager::alloc(),
None,
None,
)
};
SendManager(mgr)
});
status()
}
struct SendManager(#[allow(dead_code)] objc2::rc::Retained<CBCentralManager>);
unsafe impl Send for SendManager {}
unsafe impl Sync for SendManager {}
}
#[cfg(not(any(target_os = "macos", target_os = "ios")))]
mod platform {
use super::*;
pub fn status() -> i32 {
STATUS_UNSUPPORTED
}
pub fn request() -> i32 {
STATUS_UNSUPPORTED
}
}