virtualization_rs/virtualization/
serial_port.rs

1//! serial port module
2
3use crate::base::{Id, NSFileHandle};
4
5use objc::rc::StrongPtr;
6use objc::{class, msg_send, sel, sel_impl};
7
8/// common configure for serial port attachment
9pub trait VZSerialPortAttachment {
10    fn id(&self) -> Id;
11}
12
13/// builder for VZFileHandleSerialPortAttachment
14/// # Examples
15/// ```rust
16/// let attachement = VZFileHandleSerialPortAttachmentBuilder::new()
17///     .file_handle_for_reading(file_handle_for_reading)
18///     .file_handle_for_writing(file_handle_for_writing)
19///     .build();
20/// ```
21pub struct VZFileHandleSerialPortAttachmentBuilder<R, W> {
22    file_handle_for_reading: R,
23    file_handle_for_writing: W,
24}
25
26impl VZFileHandleSerialPortAttachmentBuilder<(), ()> {
27    pub fn new() -> Self {
28        VZFileHandleSerialPortAttachmentBuilder {
29            file_handle_for_reading: (),
30            file_handle_for_writing: (),
31        }
32    }
33}
34
35impl<R, W> VZFileHandleSerialPortAttachmentBuilder<R, W> {
36    pub fn file_handle_for_reading(
37        self,
38        file_handle_for_reading: NSFileHandle,
39    ) -> VZFileHandleSerialPortAttachmentBuilder<NSFileHandle, W> {
40        VZFileHandleSerialPortAttachmentBuilder {
41            file_handle_for_reading: file_handle_for_reading,
42            file_handle_for_writing: self.file_handle_for_writing,
43        }
44    }
45
46    pub fn file_handle_for_writing(
47        self,
48        file_handle_for_writing: NSFileHandle,
49    ) -> VZFileHandleSerialPortAttachmentBuilder<R, NSFileHandle> {
50        VZFileHandleSerialPortAttachmentBuilder {
51            file_handle_for_reading: self.file_handle_for_reading,
52            file_handle_for_writing: file_handle_for_writing,
53        }
54    }
55}
56
57impl VZFileHandleSerialPortAttachmentBuilder<NSFileHandle, NSFileHandle> {
58    pub fn build(self) -> VZFileHandleSerialPortAttachment {
59        unsafe {
60            VZFileHandleSerialPortAttachment::new(
61                self.file_handle_for_reading,
62                self.file_handle_for_writing,
63            )
64        }
65    }
66}
67
68/// thie struct configure a serial port
69pub struct VZFileHandleSerialPortAttachment(StrongPtr);
70
71impl VZFileHandleSerialPortAttachment {
72    unsafe fn new(
73        file_handle_for_reading: NSFileHandle,
74        file_handle_for_writing: NSFileHandle,
75    ) -> VZFileHandleSerialPortAttachment {
76        let i: Id = msg_send![class!(VZFileHandleSerialPortAttachment), new];
77        let p = StrongPtr::new(
78            msg_send![i, initWithFileHandleForReading:*file_handle_for_reading.0 fileHandleForWriting:*file_handle_for_writing.0],
79        );
80        VZFileHandleSerialPortAttachment(p)
81    }
82}
83
84impl VZSerialPortAttachment for VZFileHandleSerialPortAttachment {
85    fn id(&self) -> Id {
86        *self.0
87    }
88}
89
90/// configure of serial port
91pub trait VZSerialPortConfiguration {
92    fn id(&self) -> Id;
93}
94
95/// configure of serial port through the Virtio interface
96pub struct VZVirtioConsoleDeviceSerialPortConfiguration(StrongPtr);
97
98impl VZVirtioConsoleDeviceSerialPortConfiguration {
99    pub fn new<T: VZSerialPortAttachment>(
100        attachement: T,
101    ) -> VZVirtioConsoleDeviceSerialPortConfiguration {
102        unsafe {
103            let p = StrongPtr::new(msg_send![
104                class!(VZVirtioConsoleDeviceSerialPortConfiguration),
105                new
106            ]);
107            let _: Id = msg_send![*p, setAttachment: attachement.id()];
108            VZVirtioConsoleDeviceSerialPortConfiguration(p)
109        }
110    }
111}
112
113impl VZSerialPortConfiguration for VZVirtioConsoleDeviceSerialPortConfiguration {
114    fn id(&self) -> Id {
115        *self.0
116    }
117}