1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
use byteorder::{BigEndian, WriteBytesExt};
use crate::{
entities::entity_type::EntityType,
events::{event::Event, event_type::EventType},
manager_type::ManagerType,
manifest::Manifest,
standard_header::StandardHeader,
};
pub const MTU_SIZE: usize = 508 - StandardHeader::bytes_number();
pub struct PacketWriter {
event_working_bytes: Vec<u8>,
event_count: u8,
pub entity_working_bytes: Vec<u8>,
pub entity_message_count: u8,
}
impl PacketWriter {
pub fn new() -> PacketWriter {
PacketWriter {
event_working_bytes: Vec::<u8>::new(),
event_count: 0,
entity_working_bytes: Vec::<u8>::new(),
entity_message_count: 0,
}
}
pub fn has_bytes(&self) -> bool {
return self.event_count != 0 || self.entity_message_count != 0;
}
pub fn get_bytes(&mut self) -> Box<[u8]> {
let mut out_bytes = Vec::<u8>::new();
let mut wrote_manager_type = false;
if self.event_count != 0 {
out_bytes.write_u8(ManagerType::Event as u8).unwrap();
wrote_manager_type = true;
out_bytes.write_u8(self.event_count).unwrap();
out_bytes.append(&mut self.event_working_bytes);
self.event_count = 0;
}
if self.entity_message_count != 0 {
if !wrote_manager_type {
out_bytes.write_u8(ManagerType::Entity as u8).unwrap();
}
out_bytes.write_u8(self.entity_message_count).unwrap();
out_bytes.append(&mut self.entity_working_bytes);
self.entity_message_count = 0;
}
out_bytes.into_boxed_slice()
}
pub fn bytes_number(&self) -> usize {
return self.event_working_bytes.len() + self.entity_working_bytes.len();
}
pub fn write_event<T: EventType, U: EntityType>(
&mut self,
manifest: &Manifest<T, U>,
event: &Box<dyn Event<T>>,
) -> bool {
let mut event_payload_bytes = Vec::<u8>::new();
event.as_ref().write(&mut event_payload_bytes);
if event_payload_bytes.len() > 255 {
error!("cannot encode an event with more than 255 bytes, need to implement this");
}
let mut event_total_bytes = Vec::<u8>::new();
let type_id = event.as_ref().get_type_id();
let naia_id = manifest.get_event_naia_id(&type_id);
event_total_bytes.write_u16::<BigEndian>(naia_id).unwrap();
event_total_bytes
.write_u8(event_payload_bytes.len() as u8)
.unwrap();
event_total_bytes.append(&mut event_payload_bytes);
let mut hypothetical_next_payload_size = self.bytes_number() + event_total_bytes.len();
if self.event_count == 0 {
hypothetical_next_payload_size += 2;
}
if hypothetical_next_payload_size < MTU_SIZE {
self.event_count += 1;
self.event_working_bytes.append(&mut event_total_bytes);
return true;
} else {
return false;
}
}
}