dbus_message_parser/encode/message/
message_struct.rs

1use crate::encode::{EncodeError, EncodeResult, Encoder};
2use crate::message::Message;
3use crate::value::Type;
4use bytes::BytesMut;
5use cfg_if::cfg_if;
6#[cfg(target_family = "unix")]
7use std::os::unix::io::RawFd;
8
9impl Encoder {
10    /// Encode a `Message` object to a byte array.
11    pub fn message(&mut self, message: &Message) -> EncodeResult<()> {
12        let is_le = message.header.is_le;
13        // Encode the body in another buffer
14        let mut encoder = Encoder::new();
15        let mut body_signature = String::new();
16        for v in &message.body {
17            v.to_signature_string(&mut body_signature, 0, 0, 0)?;
18            encoder.value(v, is_le)?;
19        }
20
21        cfg_if! {
22            if #[cfg(target_family = "unix")] {
23                self.fds = encoder.fds;
24            }
25        }
26
27        let body = encoder.buf;
28        let body_length = body.len() as u32;
29        if body_length == 0 {
30            if body_signature.is_empty() {
31                self.message_header(&message.header, None)?;
32            } else {
33                let body_signature = Type::from_string_to_signature(&body_signature)?;
34                return Err(EncodeError::BodyLengthZero(body_signature));
35            }
36        } else if body_signature.is_empty() {
37            return Err(EncodeError::BodySignatureMissing(body_length));
38        } else {
39            let body_signature = Type::from_string_to_signature(&body_signature)?;
40            let body = Some((body_length, body_signature));
41            self.message_header(&message.header, body)?;
42        }
43
44        // Append the body.
45        self.algin(8);
46        self.buf.extend(body);
47
48        Ok(())
49    }
50}
51
52impl Message {
53    pub fn encode(&self) -> EncodeResult<BytesMut> {
54        let mut encoder = Encoder::new();
55        encoder.message(self)?;
56        Ok(encoder.buf)
57    }
58
59    #[cfg(target_family = "unix")]
60    pub fn encode_with_fds(&self) -> EncodeResult<(BytesMut, Vec<RawFd>)> {
61        let mut encoder = Encoder::new();
62        encoder.message(self)?;
63        let result = (encoder.buf, encoder.fds);
64        Ok(result)
65    }
66}