rtc_dtls/
compression_methods.rs

1use shared::error::Result;
2
3use byteorder::{ReadBytesExt, WriteBytesExt};
4use std::io::{Read, Write};
5
6#[derive(Copy, Clone, Debug, PartialEq, Eq)]
7pub enum CompressionMethodId {
8    Null = 0,
9    Unsupported,
10}
11
12impl From<u8> for CompressionMethodId {
13    fn from(val: u8) -> Self {
14        match val {
15            0 => CompressionMethodId::Null,
16            _ => CompressionMethodId::Unsupported,
17        }
18    }
19}
20
21#[derive(Clone, Debug, PartialEq, Eq)]
22pub struct CompressionMethods {
23    pub ids: Vec<CompressionMethodId>,
24}
25
26impl CompressionMethods {
27    pub fn size(&self) -> usize {
28        1 + self.ids.len()
29    }
30
31    pub fn marshal<W: Write>(&self, writer: &mut W) -> Result<()> {
32        writer.write_u8(self.ids.len() as u8)?;
33
34        for id in &self.ids {
35            writer.write_u8(*id as u8)?;
36        }
37
38        Ok(writer.flush()?)
39    }
40
41    pub fn unmarshal<R: Read>(reader: &mut R) -> Result<Self> {
42        let compression_methods_count = reader.read_u8()? as usize;
43        let mut ids = vec![];
44        for _ in 0..compression_methods_count {
45            let id = reader.read_u8()?.into();
46            if id != CompressionMethodId::Unsupported {
47                ids.push(id);
48            }
49        }
50
51        Ok(CompressionMethods { ids })
52    }
53}
54
55pub fn default_compression_methods() -> CompressionMethods {
56    CompressionMethods {
57        ids: vec![CompressionMethodId::Null],
58    }
59}