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