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}