webrtc_mdns/message/
packer.rs1use super::*;
2use crate::error::*;
3
4pub(crate) fn pack_bytes(mut msg: Vec<u8>, field: &[u8]) -> Vec<u8> {
6 msg.extend_from_slice(field);
7 msg
8}
9
10pub(crate) fn unpack_bytes(msg: &[u8], off: usize, field: &mut [u8]) -> Result<usize> {
11 let new_off = off + field.len();
12 if new_off > msg.len() {
13 return Err(Error::ErrBaseLen);
14 }
15 field.copy_from_slice(&msg[off..new_off]);
16 Ok(new_off)
17}
18
19pub(crate) fn pack_uint16(mut msg: Vec<u8>, field: u16) -> Vec<u8> {
21 msg.extend_from_slice(&field.to_be_bytes());
22 msg
23}
24
25pub(crate) fn unpack_uint16(msg: &[u8], off: usize) -> Result<(u16, usize)> {
26 if off + UINT16LEN > msg.len() {
27 return Err(Error::ErrBaseLen);
28 }
29
30 Ok((
31 (msg[off] as u16) << 8 | (msg[off + 1] as u16),
32 off + UINT16LEN,
33 ))
34}
35
36pub(crate) fn skip_uint16(msg: &[u8], off: usize) -> Result<usize> {
37 if off + UINT16LEN > msg.len() {
38 return Err(Error::ErrBaseLen);
39 }
40 Ok(off + UINT16LEN)
41}
42
43pub(crate) fn pack_uint32(mut msg: Vec<u8>, field: u32) -> Vec<u8> {
45 msg.extend_from_slice(&field.to_be_bytes());
46 msg
47}
48
49pub(crate) fn unpack_uint32(msg: &[u8], off: usize) -> Result<(u32, usize)> {
50 if off + UINT32LEN > msg.len() {
51 return Err(Error::ErrBaseLen);
52 }
53 let v = (msg[off] as u32) << 24
54 | (msg[off + 1] as u32) << 16
55 | (msg[off + 2] as u32) << 8
56 | (msg[off + 3] as u32);
57 Ok((v, off + UINT32LEN))
58}
59
60pub(crate) fn skip_uint32(msg: &[u8], off: usize) -> Result<usize> {
61 if off + UINT32LEN > msg.len() {
62 return Err(Error::ErrBaseLen);
63 }
64 Ok(off + UINT32LEN)
65}
66
67pub(crate) fn pack_str(mut msg: Vec<u8>, field: &str) -> Result<Vec<u8>> {
69 let l = field.len();
70 if l > 255 {
71 return Err(Error::ErrStringTooLong);
72 }
73 msg.push(l as u8);
74 msg.extend_from_slice(field.as_bytes());
75 Ok(msg)
76}
77
78pub(crate) fn unpack_str(msg: &[u8], off: usize) -> Result<(String, usize)> {
79 if off >= msg.len() {
80 return Err(Error::ErrBaseLen);
81 }
82 let begin_off = off + 1;
83 let end_off = begin_off + msg[off] as usize;
84 if end_off > msg.len() {
85 return Err(Error::ErrCalcLen);
86 }
87
88 Ok((
89 String::from_utf8(msg[begin_off..end_off].to_vec())?,
90 end_off,
91 ))
92}