dbus_message_parser/encode/message/
header.rs

1use crate::{
2    encode::{EncodeResult, Encoder},
3    message::MessageHeader,
4    value::{Array, Type, Value},
5};
6use cfg_if::cfg_if;
7use lazy_static::lazy_static;
8use std::convert::TryInto;
9
10lazy_static! {
11    static ref ARRAY_TYPE: Type = "(yv)".try_into().unwrap();
12}
13
14impl Encoder {
15    pub fn message_header(
16        &mut self,
17        message_header: &MessageHeader,
18        body: Option<(u32, Vec<Type>)>,
19    ) -> EncodeResult<()> {
20        let is_le = message_header.is_le;
21
22        // Endianness flag
23        if is_le {
24            self.byte(0x6c)
25        } else {
26            self.byte(0x42)
27        }
28        // Message type
29        self.byte(message_header.message_type as u8);
30        // Message flags
31        self.byte(message_header.message_flags.bits());
32        // Major protocol version
33        self.byte(message_header.version);
34
35        // Add the signature of the body to the header fields
36        let mut fields = message_header.fields.clone();
37        cfg_if! {
38            if #[cfg(target_family = "unix")] {
39                let fds_len = self.fds.len();
40                if fds_len != 0 {
41                    fields.unix_fds = Some(fds_len as u32);
42                }
43            }
44        }
45        let body_length = if let Some((body_length, body_signature)) = body {
46            fields.signature = Some(body_signature);
47            body_length
48        } else {
49            0
50        };
51
52        self.u_32(body_length, is_le);
53        self.u_32(message_header.serial, is_le);
54
55        // Encode the header fields.
56        let headers: Vec<Value> = fields.into();
57        let headers = Array {
58            array: headers,
59            type_: ARRAY_TYPE.clone(),
60        };
61        self.array(&headers, is_le)?;
62
63        Ok(())
64    }
65}