dbus_message_parser/encode/message/
header.rs1use 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 if is_le {
24 self.byte(0x6c)
25 } else {
26 self.byte(0x42)
27 }
28 self.byte(message_header.message_type as u8);
30 self.byte(message_header.message_flags.bits());
32 self.byte(message_header.version);
34
35 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 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}