1*ffe74184SMartin Algesten #[cfg(test)] 2*ffe74184SMartin Algesten mod message_test; 3*ffe74184SMartin Algesten 4*ffe74184SMartin Algesten pub mod message_channel_ack; 5*ffe74184SMartin Algesten pub mod message_channel_open; 6*ffe74184SMartin Algesten pub mod message_type; 7*ffe74184SMartin Algesten 8*ffe74184SMartin Algesten use message_channel_ack::*; 9*ffe74184SMartin Algesten use message_channel_open::*; 10*ffe74184SMartin Algesten use message_type::*; 11*ffe74184SMartin Algesten 12*ffe74184SMartin Algesten use crate::error::Error; 13*ffe74184SMartin Algesten 14*ffe74184SMartin Algesten use util::marshal::*; 15*ffe74184SMartin Algesten 16*ffe74184SMartin Algesten use bytes::{Buf, BufMut}; 17*ffe74184SMartin Algesten 18*ffe74184SMartin Algesten /// A parsed DataChannel message 19*ffe74184SMartin Algesten #[derive(Eq, PartialEq, Clone, Debug)] 20*ffe74184SMartin Algesten pub enum Message { 21*ffe74184SMartin Algesten DataChannelAck(DataChannelAck), 22*ffe74184SMartin Algesten DataChannelOpen(DataChannelOpen), 23*ffe74184SMartin Algesten } 24*ffe74184SMartin Algesten 25*ffe74184SMartin Algesten impl MarshalSize for Message { marshal_size(&self) -> usize26*ffe74184SMartin Algesten fn marshal_size(&self) -> usize { 27*ffe74184SMartin Algesten match self { 28*ffe74184SMartin Algesten Message::DataChannelAck(m) => m.marshal_size() + MESSAGE_TYPE_LEN, 29*ffe74184SMartin Algesten Message::DataChannelOpen(m) => m.marshal_size() + MESSAGE_TYPE_LEN, 30*ffe74184SMartin Algesten } 31*ffe74184SMartin Algesten } 32*ffe74184SMartin Algesten } 33*ffe74184SMartin Algesten 34*ffe74184SMartin Algesten impl Marshal for Message { marshal_to(&self, mut buf: &mut [u8]) -> Result<usize, util::Error>35*ffe74184SMartin Algesten fn marshal_to(&self, mut buf: &mut [u8]) -> Result<usize, util::Error> { 36*ffe74184SMartin Algesten let mut bytes_written = 0; 37*ffe74184SMartin Algesten let n = self.message_type().marshal_to(buf)?; 38*ffe74184SMartin Algesten buf = &mut buf[n..]; 39*ffe74184SMartin Algesten bytes_written += n; 40*ffe74184SMartin Algesten bytes_written += match self { 41*ffe74184SMartin Algesten Message::DataChannelAck(_) => 0, 42*ffe74184SMartin Algesten Message::DataChannelOpen(open) => open.marshal_to(buf)?, 43*ffe74184SMartin Algesten }; 44*ffe74184SMartin Algesten Ok(bytes_written) 45*ffe74184SMartin Algesten } 46*ffe74184SMartin Algesten } 47*ffe74184SMartin Algesten 48*ffe74184SMartin Algesten impl Unmarshal for Message { unmarshal<B>(buf: &mut B) -> Result<Self, util::Error> where Self: Sized, B: Buf,49*ffe74184SMartin Algesten fn unmarshal<B>(buf: &mut B) -> Result<Self, util::Error> 50*ffe74184SMartin Algesten where 51*ffe74184SMartin Algesten Self: Sized, 52*ffe74184SMartin Algesten B: Buf, 53*ffe74184SMartin Algesten { 54*ffe74184SMartin Algesten if buf.remaining() < MESSAGE_TYPE_LEN { 55*ffe74184SMartin Algesten return Err(Error::UnexpectedEndOfBuffer { 56*ffe74184SMartin Algesten expected: MESSAGE_TYPE_LEN, 57*ffe74184SMartin Algesten actual: buf.remaining(), 58*ffe74184SMartin Algesten } 59*ffe74184SMartin Algesten .into()); 60*ffe74184SMartin Algesten } 61*ffe74184SMartin Algesten 62*ffe74184SMartin Algesten match MessageType::unmarshal(buf)? { 63*ffe74184SMartin Algesten MessageType::DataChannelAck => Ok(Self::DataChannelAck(DataChannelAck {})), 64*ffe74184SMartin Algesten MessageType::DataChannelOpen => { 65*ffe74184SMartin Algesten Ok(Self::DataChannelOpen(DataChannelOpen::unmarshal(buf)?)) 66*ffe74184SMartin Algesten } 67*ffe74184SMartin Algesten } 68*ffe74184SMartin Algesten } 69*ffe74184SMartin Algesten } 70*ffe74184SMartin Algesten 71*ffe74184SMartin Algesten impl Message { message_type(&self) -> MessageType72*ffe74184SMartin Algesten pub fn message_type(&self) -> MessageType { 73*ffe74184SMartin Algesten match self { 74*ffe74184SMartin Algesten Self::DataChannelAck(_) => MessageType::DataChannelAck, 75*ffe74184SMartin Algesten Self::DataChannelOpen(_) => MessageType::DataChannelOpen, 76*ffe74184SMartin Algesten } 77*ffe74184SMartin Algesten } 78*ffe74184SMartin Algesten } 79