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,
29 pub raw: Vec<u8>,
31}
32
33impl PartialEq for ChannelData {
34 fn eq(&self, other: &Self) -> bool {
35 self.data == other.data && self.number == other.number
36 }
37}
38
39impl ChannelData {
40 #[inline]
42 pub fn reset(&mut self) {
43 self.raw.clear();
44 self.data.clear();
45 }
46
47 pub fn encode(&mut self) {
49 self.raw.clear();
50 self.write_header();
51 self.raw.extend_from_slice(&self.data);
52 let padded = nearest_padded_value_length(self.raw.len());
53 let bytes_to_add = padded - self.raw.len();
54 if bytes_to_add > 0 {
55 self.raw.extend_from_slice(&vec![0; bytes_to_add]);
56 }
57 }
58
59 pub fn decode(&mut self) -> Result<()> {
61 let buf = &self.raw;
62 if buf.len() < CHANNEL_DATA_HEADER_SIZE {
63 return Err(Error::ErrUnexpectedEof);
64 }
65 let num = u16::from_be_bytes([buf[0], buf[1]]);
66 self.number = ChannelNumber(num);
67 if !self.number.valid() {
68 return Err(Error::ErrInvalidChannelNumber);
69 }
70 let l = u16::from_be_bytes([
71 buf[CHANNEL_DATA_NUMBER_SIZE],
72 buf[CHANNEL_DATA_NUMBER_SIZE + 1],
73 ]) as usize;
74 if l > buf[CHANNEL_DATA_HEADER_SIZE..].len() {
75 return Err(Error::ErrBadChannelDataLength);
76 }
77 self.data = buf[CHANNEL_DATA_HEADER_SIZE..CHANNEL_DATA_HEADER_SIZE + l].to_vec();
78
79 Ok(())
80 }
81
82 pub fn write_header(&mut self) {
84 if self.raw.len() < CHANNEL_DATA_HEADER_SIZE {
85 self.raw
88 .resize(self.raw.len() + CHANNEL_DATA_HEADER_SIZE, 0);
89 }
90 self.raw[..CHANNEL_DATA_NUMBER_SIZE].copy_from_slice(&self.number.0.to_be_bytes());
91 self.raw[CHANNEL_DATA_NUMBER_SIZE..CHANNEL_DATA_HEADER_SIZE]
92 .copy_from_slice(&(self.data.len() as u16).to_be_bytes());
93 }
94
95 pub fn is_channel_data(buf: &[u8]) -> bool {
97 if buf.len() < CHANNEL_DATA_HEADER_SIZE {
98 return false;
99 }
100
101 if u16::from_be_bytes([
102 buf[CHANNEL_DATA_NUMBER_SIZE],
103 buf[CHANNEL_DATA_NUMBER_SIZE + 1],
104 ]) > buf[CHANNEL_DATA_HEADER_SIZE..].len() as u16
105 {
106 return false;
107 }
108
109 let num = ChannelNumber(u16::from_be_bytes([buf[0], buf[1]]));
111 num.valid()
112 }
113}