dbus_message_parser/encode/message/
message_struct.rs1use 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 pub fn message(&mut self, message: &Message) -> EncodeResult<()> {
12 let is_le = message.header.is_le;
13 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 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}