use crate::canvas::Canvas;
use crate::hardware::HotplugInfo;
use crate::transport::{LocalTransport, ServerStatus, Transport};
use crate::Result;
use parking_lot::Mutex;
use std::sync::Arc;
#[derive(Clone)]
pub struct Connection {
con: Arc<Mutex<dyn Transport>>,
}
impl Connection {
pub fn new(connection_type: ConnectionType) -> Result<Self> {
Ok(Self {
con: Arc::new(Mutex::new(make_transport(&connection_type)?)),
})
}
pub fn connect(&self) -> Result<()> {
self.con.lock().connect()
}
pub fn disconnect(&self) -> Result<()> {
self.con.lock().disconnect()
}
pub fn submit_canvas(&self, canvas: &Canvas) -> Result<()> {
self.con.lock().submit_canvas(canvas)
}
pub fn get_server_status(&self) -> Result<ServerStatus> {
self.con.lock().get_server_status()
}
pub fn notify_device_hotplug(&self, hotplug_info: &HotplugInfo) -> Result<()> {
self.con.lock().notify_device_hotplug(hotplug_info)
}
}
impl Drop for Connection {
fn drop(&mut self) {
let _ = self.disconnect();
}
}
#[derive(Debug, Clone)]
pub enum ConnectionType {
Unknown,
Local,
Remote,
}
fn make_transport(_connection_type: &ConnectionType) -> Result<impl Transport> {
LocalTransport::new()
}