use crate::{ConnectionMethods, Error, Operation, Param, ParamNone, Result, Session, Uuid, raw};
use std::{cell::RefCell, ptr, rc::Rc};
pub struct InnerContext(pub raw::TEEC_Context);
impl Drop for InnerContext {
fn drop(&mut self) {
unsafe {
raw::TEEC_FinalizeContext(&mut self.0);
}
}
}
pub struct Context {
raw: Rc<RefCell<InnerContext>>,
}
unsafe impl Send for Context {}
unsafe impl Sync for Context {}
impl Context {
pub fn new() -> Result<Context> {
let mut raw_ctx = unsafe { std::mem::zeroed() };
match unsafe { raw::TEEC_InitializeContext(ptr::null_mut(), &mut raw_ctx) } {
raw::TEEC_SUCCESS => Ok(Self {
raw: Rc::new(RefCell::new(InnerContext(raw_ctx))),
}),
code => Err(Error::from_raw_error(code)),
}
}
pub fn open_session(&mut self, uuid: Uuid) -> Result<Session> {
Session::new(
self,
uuid,
ConnectionMethods::LoginPublic,
None::<&mut Operation<ParamNone, ParamNone, ParamNone, ParamNone>>,
)
}
pub fn open_session_with_login(
&mut self,
uuid: Uuid,
login: ConnectionMethods,
) -> Result<Session> {
Session::new(
self,
uuid,
login,
None::<&mut Operation<ParamNone, ParamNone, ParamNone, ParamNone>>,
)
}
pub fn open_session_with_operation<A: Param, B: Param, C: Param, D: Param>(
&mut self,
uuid: Uuid,
operation: &mut Operation<A, B, C, D>,
) -> Result<Session> {
Session::new(self, uuid, ConnectionMethods::LoginPublic, Some(operation))
}
}
impl Context {
pub(crate) fn inner_context(&mut self) -> Rc<RefCell<InnerContext>> {
self.raw.clone()
}
}