use { crate::{ object::Version, utils::clonecell::CloneCell, wire::{ jay_ei_session::{Created, Destroyed, Failed, JayEiSessionEventHandler, Release}, JayEiSessionId, }, wl_usr::{usr_object::UsrObject, UsrCon}, }, std::{convert::Infallible, rc::Rc}, uapi::OwnedFd, }; pub struct UsrJayEiSession { pub id: JayEiSessionId, pub con: Rc, pub owner: CloneCell>>, pub version: Version, } pub trait UsrJayEiSessionOwner { fn destroyed(&self) {} fn created(&self, fd: &Rc) { let _ = fd; } fn failed(&self, reason: &str) { let _ = reason; } } impl JayEiSessionEventHandler for UsrJayEiSession { type Error = Infallible; fn destroyed(&self, _ev: Destroyed, _slf: &Rc) -> Result<(), Self::Error> { if let Some(owner) = self.owner.get() { owner.destroyed(); } Ok(()) } fn created(&self, ev: Created, _slf: &Rc) -> Result<(), Self::Error> { if let Some(owner) = self.owner.get() { owner.created(&ev.fd); } Ok(()) } fn failed(&self, ev: Failed<'_>, _slf: &Rc) -> Result<(), Self::Error> { if let Some(owner) = self.owner.get() { owner.failed(ev.reason); } Ok(()) } } usr_object_base! { self = UsrJayEiSession = JayEiSession; version = self.version; } impl UsrObject for UsrJayEiSession { fn destroy(&self) { self.con.request(Release { self_id: self.id }); } fn break_loops(&self) { self.owner.take(); } }