Skip to main content

enet/
packet.rs

1use {std, ll};
2use bitflags::bitflags;
3
4////////////////////////////////////////////////////////////////////////////////
5//  structs                                                                   //
6////////////////////////////////////////////////////////////////////////////////
7
8/// Outgoing packet for peer `send()`
9#[derive(Clone, Copy, Debug)]
10pub enum Packet <'a> {
11  Allocate {
12    bytes : &'a [u8],
13    flags : Flags
14  },
15  NoAllocate {
16    bytes : &'static [u8],
17    flags : Flags
18  }
19}
20
21/// Received packet
22#[derive(Debug)]
23pub struct PacketRecv {
24  raw : *mut ll::ENetPacket
25}
26
27bitflags! {
28  /// Flags for outgoing packets.
29  ///
30  /// `Flags::empty()` indicates unreliable, sequenced delivery.
31  #[derive(Clone, Copy, Debug)]
32  pub struct Flags : u32 {
33    /// Reliable, sequenced delivery
34    #[allow(clippy::unnecessary_cast)] // on windows ll flags are i32
35    const RELIABLE    = ll::_ENetPacketFlag_ENET_PACKET_FLAG_RELIABLE as u32;
36    /// Unsequenced delivery
37    #[allow(clippy::unnecessary_cast)] // on windows ll flags are i32
38    const UNSEQUENCED = ll::_ENetPacketFlag_ENET_PACKET_FLAG_UNSEQUENCED as u32;
39    /// Packet will be fragmented if it exceeds the MTU
40    #[allow(clippy::unnecessary_cast)] // on windows ll flags are i32
41    const UNRELIABLE_FRAGMENT = ll::_ENetPacketFlag_ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT
42      as u32;
43    /// Packet will not allocate data and user must supply it instead
44    #[allow(clippy::unnecessary_cast)] // on windows ll flags are i32
45    const NO_ALLOCATE = ll::_ENetPacketFlag_ENET_PACKET_FLAG_NO_ALLOCATE as u32;
46    // TODO: choose to expose the packet sent flag?
47    // Whether the packet has been sent from all queues it has been entered into.
48    //#[allow(clippy::unnecessary_cast)] // on windows ll flags are i32
49    //const SENT        = ll::_ENetPacketFlag_ENET_PACKET_FLAG_SENT as u32;
50  }
51}
52
53////////////////////////////////////////////////////////////////////////////////
54//  impls                                                                     //
55////////////////////////////////////////////////////////////////////////////////
56
57impl PacketRecv {
58  /// # Safety
59  ///
60  /// Unsafe: raw pointer could be invalid.
61  #[inline]
62  pub const unsafe fn from_raw (raw : *mut ll::ENetPacket) -> Self {
63    PacketRecv { raw }
64  }
65
66  #[inline]
67  pub fn flags (&self) -> Flags {
68    unsafe { Flags::from_bits ((*self.raw).flags).unwrap() }
69  }
70
71  #[inline]
72  pub fn data_length (&self) -> usize {
73    unsafe { (*self.raw).dataLength }
74  }
75
76  #[inline]
77  pub fn data (&self) -> &[u8] {
78    unsafe {
79      let len = (*self.raw).dataLength;
80      std::slice::from_raw_parts ((*self.raw).data, len)
81    }
82  }
83
84  // TODO: set_packet_free_callback
85}
86impl Drop for PacketRecv {
87  #[inline]
88  fn drop (&mut self) {
89    unsafe { ll::enet_packet_destroy (self.raw) }
90  }
91}