ipmb/
message.rs

1use crate::{EndpointID, Error, Label, MemoryRegion, Object, Selector, Version};
2use serde::{Deserialize, Serialize};
3use type_uuid::{Bytes, TypeUuid};
4
5pub struct Message<T> {
6    pub(crate) selector: Selector,
7    pub payload: T,
8    pub objects: Vec<Object>,
9    pub memory_regions: Vec<MemoryRegion>,
10}
11
12impl<T: MessageBox> Message<T> {
13    pub fn new(mut selector: Selector, payload: T) -> Self {
14        selector.uuid = payload.uuid();
15
16        Self {
17            selector,
18            payload,
19            objects: vec![],
20            memory_regions: vec![],
21        }
22    }
23}
24
25pub trait MessageBox: Send + 'static {
26    fn decode(uuid: Bytes, data: &[u8]) -> Result<Self, Error>
27    where
28        Self: Sized;
29
30    fn encode(&self) -> Result<Vec<u8>, Error>;
31
32    fn uuid(&self) -> Bytes;
33}
34
35/// A predefined message type.
36#[derive(Debug, Serialize, Deserialize, TypeUuid)]
37#[uuid = "dd95ba8e-1279-47cf-925e-83e614e79588"]
38pub struct BytesMessage {
39    pub format: u16,
40    #[serde(with = "serde_bytes")]
41    pub data: Vec<u8>,
42}
43
44#[cfg(windows)]
45#[derive(Debug, Serialize, Deserialize, TypeUuid)]
46#[uuid = "fbf88372-d2cd-425a-a183-133f8f119df2"]
47pub struct FetchProcessHandleMessage {
48    pub pid: u32,
49    pub reply_pipe: String,
50}
51
52#[derive(Debug, Serialize, Deserialize, TypeUuid)]
53#[uuid = "b2c1deb3-3091-4a74-a99c-c8e8d710d4b2"]
54pub struct ConnectMessage {
55    pub version: Version,
56    pub token: String,
57    pub label: Label,
58}
59
60#[derive(Debug, Serialize, Deserialize, TypeUuid)]
61#[uuid = "c3de9eb4-c310-4c14-9747-093d62c09998"]
62pub enum ConnectMessageAck {
63    Ok(EndpointID),
64    ErrVersion(Version),
65    ErrToken,
66}
67
68impl<T: TypeUuid + Serialize + for<'de> Deserialize<'de> + Send + 'static> MessageBox for T {
69    fn decode(uuid: Bytes, data: &[u8]) -> Result<Self, Error>
70    where
71        Self: Sized,
72    {
73        if uuid == T::UUID {
74            crate::decode(data)
75        } else {
76            Err(Error::TypeUuidNotFound)
77        }
78    }
79
80    fn encode(&self) -> Result<Vec<u8>, Error> {
81        crate::encode(self)
82    }
83
84    fn uuid(&self) -> Bytes {
85        T::UUID
86    }
87}