1 use super::*; 2 3 /// UnknownReportBlock is used to store bytes for any report block 4 /// that has an unknown Report Block Type. 5 #[derive(Debug, Default, PartialEq, Eq, Clone)] 6 pub struct UnknownReportBlock { 7 pub bytes: Bytes, 8 } 9 10 impl fmt::Display for UnknownReportBlock { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result11 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 12 write!(f, "{self:?}") 13 } 14 } 15 16 impl UnknownReportBlock { xr_header(&self) -> XRHeader17 pub fn xr_header(&self) -> XRHeader { 18 XRHeader { 19 block_type: BlockType::Unknown, 20 type_specific: 0, 21 block_length: (self.raw_size() / 4 - 1) as u16, 22 } 23 } 24 } 25 26 impl Packet for UnknownReportBlock { header(&self) -> Header27 fn header(&self) -> Header { 28 Header::default() 29 } 30 31 /// destination_ssrc returns an array of ssrc values that this report block refers to. destination_ssrc(&self) -> Vec<u32>32 fn destination_ssrc(&self) -> Vec<u32> { 33 vec![] 34 } 35 raw_size(&self) -> usize36 fn raw_size(&self) -> usize { 37 XR_HEADER_LENGTH + self.bytes.len() 38 } 39 as_any(&self) -> &(dyn Any + Send + Sync)40 fn as_any(&self) -> &(dyn Any + Send + Sync) { 41 self 42 } equal(&self, other: &(dyn Packet + Send + Sync)) -> bool43 fn equal(&self, other: &(dyn Packet + Send + Sync)) -> bool { 44 other 45 .as_any() 46 .downcast_ref::<UnknownReportBlock>() 47 .map_or(false, |a| self == a) 48 } cloned(&self) -> Box<dyn Packet + Send + Sync>49 fn cloned(&self) -> Box<dyn Packet + Send + Sync> { 50 Box::new(self.clone()) 51 } 52 } 53 54 impl MarshalSize for UnknownReportBlock { marshal_size(&self) -> usize55 fn marshal_size(&self) -> usize { 56 self.raw_size() 57 } 58 } 59 60 impl Marshal for UnknownReportBlock { 61 /// marshal_to encodes the UnknownReportBlock in binary marshal_to(&self, mut buf: &mut [u8]) -> Result<usize>62 fn marshal_to(&self, mut buf: &mut [u8]) -> Result<usize> { 63 if buf.remaining_mut() < self.marshal_size() { 64 return Err(error::Error::BufferTooShort.into()); 65 } 66 67 let h = self.xr_header(); 68 let n = h.marshal_to(buf)?; 69 buf = &mut buf[n..]; 70 71 buf.put(self.bytes.clone()); 72 73 Ok(self.marshal_size()) 74 } 75 } 76 77 impl Unmarshal for UnknownReportBlock { 78 /// Unmarshal decodes the UnknownReportBlock from binary unmarshal<B>(raw_packet: &mut B) -> Result<Self> where Self: Sized, B: Buf,79 fn unmarshal<B>(raw_packet: &mut B) -> Result<Self> 80 where 81 Self: Sized, 82 B: Buf, 83 { 84 if raw_packet.remaining() < XR_HEADER_LENGTH { 85 return Err(error::Error::PacketTooShort.into()); 86 } 87 88 let xr_header = XRHeader::unmarshal(raw_packet)?; 89 let block_length = xr_header.block_length * 4; 90 if raw_packet.remaining() < block_length as usize { 91 return Err(error::Error::PacketTooShort.into()); 92 } 93 94 let bytes = raw_packet.copy_to_bytes(block_length as usize); 95 96 Ok(UnknownReportBlock { bytes }) 97 } 98 } 99