xref: /webrtc/data/src/message/mod.rs (revision ffe74184)
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