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
use byteorder::{BigEndian, WriteBytesExt};
use crate::{
actors::actor_type::ActorType,
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 EventPacketWriter {
event_working_bytes: Vec<u8>,
event_count: u8,
}
impl EventPacketWriter {
pub fn new() -> EventPacketWriter {
EventPacketWriter {
event_working_bytes: Vec::<u8>::new(),
event_count: 0,
}
}
pub fn has_bytes(&self) -> bool {
return self.event_count != 0;
}
pub fn get_bytes(&mut self, out_bytes: &mut Vec<u8>) {
if self.event_count != 0 {
out_bytes.write_u8(ManagerType::Event as u8).unwrap();
out_bytes.write_u8(self.event_count).unwrap();
out_bytes.append(&mut self.event_working_bytes);
self.event_count = 0;
}
}
pub fn bytes_number(&self) -> usize {
return self.event_working_bytes.len();
}
pub fn write_event<T: EventType, U: ActorType>(
&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);
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.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;
}
}
}