1
0
Fork 0
forked from wry/wry
wry/src/ifs/wp_drm_lease_request_v1.rs
2025-02-21 10:44:29 +01:00

85 lines
2.8 KiB
Rust

use {
crate::{
backend::{ConnectorId, DrmDeviceId},
client::{Client, ClientError},
ifs::wp_drm_lease_v1::{WpDrmLeaseV1, WpDrmLeaseV1Lessee},
leaks::Tracker,
object::{Object, Version},
utils::copyhashmap::CopyHashMap,
wire::{WpDrmLeaseConnectorV1Id, WpDrmLeaseRequestV1Id, wp_drm_lease_request_v1::*},
},
std::{cell::Cell, rc::Rc},
thiserror::Error,
};
pub struct WpDrmLeaseRequestV1 {
pub id: WpDrmLeaseRequestV1Id,
pub client: Rc<Client>,
pub tracker: Tracker<Self>,
pub version: Version,
pub device: DrmDeviceId,
pub connectors: CopyHashMap<WpDrmLeaseConnectorV1Id, ConnectorId>,
}
impl WpDrmLeaseRequestV1RequestHandler for WpDrmLeaseRequestV1 {
type Error = WpDrmLeaseRequestV1Error;
fn request_connector(&self, req: RequestConnector, _slf: &Rc<Self>) -> Result<(), Self::Error> {
let c = self.client.lookup(req.connector)?;
if self.device != c.device.device {
return Err(WpDrmLeaseRequestV1Error::MismatchedDevice(c.id));
}
if self.connectors.contains(&c.id) {
return Err(WpDrmLeaseRequestV1Error::RepeatedDevice(c.id));
}
self.connectors.set(c.id, c.connector_id);
Ok(())
}
fn submit(&self, req: Submit, _slf: &Rc<Self>) -> Result<(), Self::Error> {
self.client.remove_obj(self)?;
let obj = Rc::new(WpDrmLeaseV1 {
id: req.id,
client: self.client.clone(),
tracker: Default::default(),
version: self.version,
finished: Cell::new(false),
lease: Default::default(),
});
track!(self.client, obj);
self.client.add_client_obj(&obj)?;
if self.connectors.is_empty() {
return Err(WpDrmLeaseRequestV1Error::EmptyLease);
}
let Some(dev) = self.client.state.drm_devs.get(&self.device) else {
obj.send_finished();
return Ok(());
};
let lessee = Rc::new(WpDrmLeaseV1Lessee { obj });
let connectors: Vec<_> = self.connectors.lock().values().copied().collect();
dev.dev.clone().create_lease(lessee, &connectors);
Ok(())
}
}
object_base! {
self = WpDrmLeaseRequestV1;
version = self.version;
}
impl Object for WpDrmLeaseRequestV1 {}
simple_add_obj!(WpDrmLeaseRequestV1);
#[derive(Debug, Error)]
pub enum WpDrmLeaseRequestV1Error {
#[error(transparent)]
ClientError(Box<ClientError>),
#[error("Connector {0} does not belong to this device")]
MismatchedDevice(WpDrmLeaseConnectorV1Id),
#[error("Connector {0} is already part of this request")]
RepeatedDevice(WpDrmLeaseConnectorV1Id),
#[error("Lease request is empty")]
EmptyLease,
}
efrom!(WpDrmLeaseRequestV1Error, ClientError);