use ffi_utils::ReprC;
use ffi_utils::callback::CallbackArgs;
use ipc::req::permission_set_into_repr_c;
use routing;
use routing::XorName;
use std::ffi::CString;
use std::os::raw::c_char;
#[repr(C)]
#[derive(Copy, Clone, Default, Debug, Eq, Ord, PartialEq, PartialOrd, Serialize, Deserialize)]
pub struct PermissionSet {
pub read: bool,
pub insert: bool,
pub update: bool,
pub delete: bool,
pub manage_permissions: bool,
}
impl ReprC for PermissionSet {
type C = *const PermissionSet;
type Error = ();
unsafe fn clone_from_repr_c(raw: Self::C) -> Result<Self, Self::Error> {
Ok(*raw)
}
}
impl CallbackArgs for PermissionSet {
fn default() -> Self {
permission_set_into_repr_c(routing::PermissionSet::new())
}
}
#[repr(C)]
pub struct AuthReq {
pub app: AppExchangeInfo,
pub app_container: bool,
pub containers: *const ContainerPermissions,
pub containers_len: usize,
pub containers_cap: usize,
}
impl Drop for AuthReq {
#[allow(unsafe_code)]
fn drop(&mut self) {
unsafe {
let _ = Vec::from_raw_parts(
self.containers as *mut ContainerPermissions,
self.containers_len,
self.containers_cap,
);
}
}
}
#[repr(C)]
pub struct ContainersReq {
pub app: AppExchangeInfo,
pub containers: *const ContainerPermissions,
pub containers_len: usize,
pub containers_cap: usize,
}
impl Drop for ContainersReq {
#[allow(unsafe_code)]
fn drop(&mut self) {
unsafe {
let _ = Vec::from_raw_parts(
self.containers as *mut ContainerPermissions,
self.containers_len,
self.containers_cap,
);
}
}
}
#[repr(C)]
pub struct AppExchangeInfo {
pub id: *const c_char,
pub scope: *const c_char,
pub name: *const c_char,
pub vendor: *const c_char,
}
impl Drop for AppExchangeInfo {
#[allow(unsafe_code)]
fn drop(&mut self) {
unsafe {
let _ = CString::from_raw(self.id as *mut _);
if !self.scope.is_null() {
let _ = CString::from_raw(self.scope as *mut _);
}
let _ = CString::from_raw(self.name as *mut _);
let _ = CString::from_raw(self.vendor as *mut _);
}
}
}
#[repr(C)]
pub struct ContainerPermissions {
pub cont_name: *const c_char,
pub access: PermissionSet,
}
impl Drop for ContainerPermissions {
#[allow(unsafe_code)]
fn drop(&mut self) {
unsafe {
let _ = CString::from_raw(self.cont_name as *mut _);
}
}
}
#[repr(C)]
pub struct ShareMDataReq {
pub app: AppExchangeInfo,
pub mdata: *const ShareMData,
pub mdata_len: usize,
pub mdata_cap: usize,
}
impl Drop for ShareMDataReq {
#[allow(unsafe_code)]
fn drop(&mut self) {
unsafe {
let _ = Vec::from_raw_parts(
self.mdata as *mut ShareMData,
self.mdata_len,
self.mdata_cap,
);
}
}
}
#[repr(C)]
pub struct ShareMData {
pub type_tag: u64,
pub name: XorName,
pub perms: PermissionSet,
}