xref: /webrtc/rtcp/src/raw_packet.rs (revision 259fddd2)
1 use std::fmt;
2 use std::io::{BufReader, Read, Write};
3 
4 use util::Error;
5 
6 use super::header::*;
7 
8 #[cfg(test)]
9 mod raw_packet_test;
10 
11 // RawPacket represents an unparsed RTCP packet. It's returned by Unmarshal when
12 // a packet with an unknown type is encountered.
13 #[derive(Debug, PartialEq, Default, Clone)]
14 pub struct RawPacket {
15     pub header: Header,
16     pub raw: Vec<u8>,
17 }
18 
19 impl fmt::Display for RawPacket {
20     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
21         write!(f, "RawPacket: {:?}", self.raw)
22     }
23 }
24 
25 //var _ Packet = (*RawPacket)(nil) // assert is a Packet
26 impl RawPacket {
27     fn size(&self) -> usize {
28         self.raw.len()
29     }
30 
31     // Unmarshal decodes the packet from binary.
32     pub fn unmarshal<R: Read>(reader: &mut R) -> Result<Self, Error> {
33         let mut raw_packet = RawPacket::default();
34         reader.read_to_end(&mut raw_packet.raw)?;
35 
36         let mut reader = BufReader::new(raw_packet.raw.as_slice());
37         raw_packet.header = Header::unmarshal(&mut reader)?;
38 
39         Ok(raw_packet)
40     }
41 
42     // Header returns the Header associated with this packet.
43     pub fn header(&self) -> Header {
44         self.header.clone()
45     }
46 
47     // destination_ssrc returns an array of SSRC values that this packet refers to.
48     pub fn destination_ssrc(&self) -> Vec<u32> {
49         vec![]
50     }
51 
52     // Marshal encodes the packet in binary.
53     pub fn marshal<W: Write>(&self, writer: &mut W) -> Result<(), Error> {
54         writer.write_all(&self.raw)?;
55         Ok(())
56     }
57 }
58