rtc_turn/proto/
chandata.rs1#[cfg(test)]
2mod chandata_test;
3
4use super::channum::*;
5use shared::error::{Error, Result};
6
7const PADDING: usize = 4;
8
9fn nearest_padded_value_length(l: usize) -> usize {
10 let mut n = PADDING * (l / PADDING);
11 if n < l {
12 n += PADDING;
13 }
14 n
15}
16
17const CHANNEL_DATA_LENGTH_SIZE: usize = 2;
18const CHANNEL_DATA_NUMBER_SIZE: usize = CHANNEL_DATA_LENGTH_SIZE;
19const CHANNEL_DATA_HEADER_SIZE: usize = CHANNEL_DATA_LENGTH_SIZE + CHANNEL_DATA_NUMBER_SIZE;
20
21#[derive(Default, Debug)]
24pub struct ChannelData {
25 pub data: Vec<u8>, pub number: ChannelNumber,
27 pub raw: Vec<u8>,
28}
29
30impl PartialEq for ChannelData {
31 fn eq(&self, other: &Self) -> bool {
32 self.data == other.data && self.number == other.number
33 }
34}
35
36impl ChannelData {
37 #[inline]
39 pub fn reset(&mut self) {
40 self.raw.clear();
41 self.data.clear();
42 }
43
44 pub fn encode(&mut self) {
46 self.raw.clear();
47 self.write_header();
48 self.raw.extend_from_slice(&self.data);
49 let padded = nearest_padded_value_length(self.raw.len());
50 let bytes_to_add = padded - self.raw.len();
51 if bytes_to_add > 0 {
52 self.raw.extend_from_slice(&vec![0; bytes_to_add]);
53 }
54 }
55
56 pub fn decode(&mut self) -> Result<()> {
58 let buf = &self.raw;
59 if buf.len() < CHANNEL_DATA_HEADER_SIZE {
60 return Err(Error::ErrUnexpectedEof);
61 }
62 let num = u16::from_be_bytes([buf[0], buf[1]]);
63 self.number = ChannelNumber(num);
64 if !self.number.valid() {
65 return Err(Error::ErrInvalidChannelNumber);
66 }
67 let l = u16::from_be_bytes([
68 buf[CHANNEL_DATA_NUMBER_SIZE],
69 buf[CHANNEL_DATA_NUMBER_SIZE + 1],
70 ]) as usize;
71 if l > buf[CHANNEL_DATA_HEADER_SIZE..].len() {
72 return Err(Error::ErrBadChannelDataLength);
73 }
74 self.data = buf[CHANNEL_DATA_HEADER_SIZE..CHANNEL_DATA_HEADER_SIZE + l].to_vec();
75
76 Ok(())
77 }
78
79 pub fn write_header(&mut self) {
81 if self.raw.len() < CHANNEL_DATA_HEADER_SIZE {
82 self.raw
85 .resize(self.raw.len() + CHANNEL_DATA_HEADER_SIZE, 0);
86 }
87 self.raw[..CHANNEL_DATA_NUMBER_SIZE].copy_from_slice(&self.number.0.to_be_bytes());
88 self.raw[CHANNEL_DATA_NUMBER_SIZE..CHANNEL_DATA_HEADER_SIZE]
89 .copy_from_slice(&(self.data.len() as u16).to_be_bytes());
90 }
91
92 pub fn is_channel_data(buf: &[u8]) -> bool {
94 if buf.len() < CHANNEL_DATA_HEADER_SIZE {
95 return false;
96 }
97
98 if u16::from_be_bytes([
99 buf[CHANNEL_DATA_NUMBER_SIZE],
100 buf[CHANNEL_DATA_NUMBER_SIZE + 1],
101 ]) > buf[CHANNEL_DATA_HEADER_SIZE..].len() as u16
102 {
103 return false;
104 }
105
106 let num = ChannelNumber(u16::from_be_bytes([buf[0], buf[1]]));
108 num.valid()
109 }
110}