use crate::ffi::arrays::XorNameArray;
use crate::ipc::req::permission_set_into_repr_c;
use ffi_utils::callback::CallbackArgs;
use ffi_utils::{vec_from_raw_parts, ReprC};
use safe_nd::MDataPermissionSet;
use serde::{Deserialize, Serialize};
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 Self;
type Error = ();
unsafe fn clone_from_repr_c(repr_c: Self::C) -> Result<Self, Self::Error> {
Ok(*repr_c)
}
}
impl CallbackArgs for PermissionSet {
fn default() -> Self {
permission_set_into_repr_c(MDataPermissionSet::new())
}
}
#[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 {
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 {
fn drop(&mut self) {
unsafe {
let _ = CString::from_raw(self.cont_name as *mut _);
}
}
}
#[repr(C)]
pub struct AuthReq {
pub app: AppExchangeInfo,
pub app_container: bool,
pub app_permission_transfer_coins: bool,
pub app_permission_perform_mutations: bool,
pub app_permission_get_balance: bool,
pub containers: *const ContainerPermissions,
pub containers_len: usize,
}
impl Drop for AuthReq {
fn drop(&mut self) {
unsafe {
let _ = vec_from_raw_parts(
self.containers as *mut ContainerPermissions,
self.containers_len,
);
}
}
}
#[repr(C)]
pub struct ContainersReq {
pub app: AppExchangeInfo,
pub containers: *const ContainerPermissions,
pub containers_len: usize,
}
impl Drop for ContainersReq {
fn drop(&mut self) {
unsafe {
let _ = vec_from_raw_parts(
self.containers as *mut ContainerPermissions,
self.containers_len,
);
}
}
}
#[repr(C)]
pub struct ShareMData {
pub type_tag: u64,
pub name: XorNameArray,
pub perms: PermissionSet,
}
#[repr(C)]
pub struct ShareMDataRequest {
pub app: AppExchangeInfo,
pub mdata: *const ShareMData,
pub mdata_len: usize,
}
impl Drop for ShareMDataRequest {
fn drop(&mut self) {
unsafe {
let _ = vec_from_raw_parts(self.mdata as *mut ShareMData, self.mdata_len);
}
}
}