mirror of
https://codeberg.org/demostf/parser.git
synced 2026-06-03 18:24:05 +02:00
pass parser state to handlers
This commit is contained in:
parent
54965c8fac
commit
74ad7d121f
9 changed files with 70 additions and 20 deletions
|
|
@ -23,7 +23,7 @@ impl MessageHandler for AllMessages {
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_message(&mut self, message: &Message, tick: u32) {
|
fn handle_message(&mut self, message: &Message, tick: u32, _parser_state: &ParserState) {
|
||||||
black_box(message);
|
black_box(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,7 @@ impl MessageHandler for AllMessages {
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_message(&mut self, message: &Message, _tick: u32) {
|
fn handle_message(&mut self, message: &Message, _tick: u32, _parser_state: &ParserState) {
|
||||||
black_box(message);
|
black_box(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,7 @@ impl MessageHandler for PropAnalyzer {
|
||||||
&mut self,
|
&mut self,
|
||||||
parse_tables: &[ParseSendTable],
|
parse_tables: &[ParseSendTable],
|
||||||
_server_classes: &[ServerClass],
|
_server_classes: &[ServerClass],
|
||||||
|
_parser_state: &ParserState,
|
||||||
) {
|
) {
|
||||||
for table in parse_tables {
|
for table in parse_tables {
|
||||||
for prop_def in &table.props {
|
for prop_def in &table.props {
|
||||||
|
|
|
||||||
|
|
@ -378,7 +378,7 @@ impl MessageHandler for Analyser {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_message(&mut self, message: &Message, tick: u32) {
|
fn handle_message(&mut self, message: &Message, tick: u32, _parser_state: &ParserState) {
|
||||||
if self.state.start_tick == 0 {
|
if self.state.start_tick == 0 {
|
||||||
self.state.start_tick = tick;
|
self.state.start_tick = tick;
|
||||||
}
|
}
|
||||||
|
|
@ -392,7 +392,13 @@ impl MessageHandler for Analyser {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_string_entry(&mut self, table: &str, _index: usize, entry: &StringTableEntry) {
|
fn handle_string_entry(
|
||||||
|
&mut self,
|
||||||
|
table: &str,
|
||||||
|
_index: usize,
|
||||||
|
entry: &StringTableEntry,
|
||||||
|
_parser_state: &ParserState,
|
||||||
|
) {
|
||||||
if table == "userinfo" {
|
if table == "userinfo" {
|
||||||
let _ = self.parse_user_info(
|
let _ = self.parse_user_info(
|
||||||
entry.text.as_ref().map(|s| s.as_ref()),
|
entry.text.as_ref().map(|s| s.as_ref()),
|
||||||
|
|
|
||||||
|
|
@ -160,7 +160,7 @@ impl MessageHandler for GameStateAnalyser {
|
||||||
matches!(message_type, MessageType::PacketEntities)
|
matches!(message_type, MessageType::PacketEntities)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_message(&mut self, message: &Message, _tick: u32) {
|
fn handle_message(&mut self, message: &Message, _tick: u32, _parser_state: &ParserState) {
|
||||||
if let Message::PacketEntities(message) = message {
|
if let Message::PacketEntities(message) = message {
|
||||||
for entity in &message.entities {
|
for entity in &message.entities {
|
||||||
self.handle_entity(entity);
|
self.handle_entity(entity);
|
||||||
|
|
@ -172,6 +172,7 @@ impl MessageHandler for GameStateAnalyser {
|
||||||
&mut self,
|
&mut self,
|
||||||
parse_tables: &[ParseSendTable],
|
parse_tables: &[ParseSendTable],
|
||||||
server_classes: &[ServerClass],
|
server_classes: &[ServerClass],
|
||||||
|
_parser_state: &ParserState,
|
||||||
) {
|
) {
|
||||||
for table in parse_tables {
|
for table in parse_tables {
|
||||||
for prop_def in &table.props {
|
for prop_def in &table.props {
|
||||||
|
|
@ -189,7 +190,13 @@ impl MessageHandler for GameStateAnalyser {
|
||||||
.collect();
|
.collect();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_string_entry(&mut self, table: &str, _index: usize, entry: &StringTableEntry) {
|
fn handle_string_entry(
|
||||||
|
&mut self,
|
||||||
|
table: &str,
|
||||||
|
_index: usize,
|
||||||
|
entry: &StringTableEntry,
|
||||||
|
_parser_state: &ParserState,
|
||||||
|
) {
|
||||||
if table == "userinfo" {
|
if table == "userinfo" {
|
||||||
let _ = self.parse_user_info(
|
let _ = self.parse_user_info(
|
||||||
entry.text.as_ref().map(|s| s.as_ref()),
|
entry.text.as_ref().map(|s| s.as_ref()),
|
||||||
|
|
|
||||||
|
|
@ -16,13 +16,32 @@ pub trait MessageHandler {
|
||||||
|
|
||||||
fn handle_header(&mut self, _header: &Header) {}
|
fn handle_header(&mut self, _header: &Header) {}
|
||||||
|
|
||||||
fn handle_message(&mut self, _message: &Message, _tick: u32) {}
|
fn handle_message(&mut self, _message: &Message, _tick: u32, _parser_state: &ParserState) {}
|
||||||
|
|
||||||
fn handle_string_entry(&mut self, _table: &str, _index: usize, _entries: &StringTableEntry) {}
|
fn handle_string_entry(
|
||||||
|
&mut self,
|
||||||
|
_table: &str,
|
||||||
|
_index: usize,
|
||||||
|
_entries: &StringTableEntry,
|
||||||
|
_parser_state: &ParserState,
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
fn handle_data_tables(&mut self, _tables: &[ParseSendTable], _server_classes: &[ServerClass]) {}
|
fn handle_data_tables(
|
||||||
|
&mut self,
|
||||||
|
_tables: &[ParseSendTable],
|
||||||
|
_server_classes: &[ServerClass],
|
||||||
|
_parser_state: &ParserState,
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
fn handle_packet_meta(&mut self, _tick: u32, _meta: &MessagePacketMeta) {}
|
fn handle_packet_meta(
|
||||||
|
&mut self,
|
||||||
|
_tick: u32,
|
||||||
|
_meta: &MessagePacketMeta,
|
||||||
|
_parser_state: &ParserState,
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
fn into_output(self, state: &ParserState) -> Self::Output;
|
fn into_output(self, state: &ParserState) -> Self::Output;
|
||||||
}
|
}
|
||||||
|
|
@ -102,7 +121,8 @@ impl<'a, T: MessageHandler> DemoHandler<'a, T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Packet::Message(packet) | Packet::Signon(packet) => {
|
Packet::Message(packet) | Packet::Signon(packet) => {
|
||||||
self.analyser.handle_packet_meta(packet.tick, &packet.meta);
|
self.analyser
|
||||||
|
.handle_packet_meta(packet.tick, &packet.meta, &self.state_handler);
|
||||||
//self.tick = packet.tick;
|
//self.tick = packet.tick;
|
||||||
for message in packet.messages {
|
for message in packet.messages {
|
||||||
match message {
|
match message {
|
||||||
|
|
@ -151,8 +171,12 @@ impl<'a, T: MessageHandler> DemoHandler<'a, T> {
|
||||||
let entry_index = entry_index as usize;
|
let entry_index = entry_index as usize;
|
||||||
self.state_handler
|
self.state_handler
|
||||||
.handle_string_entry(&table.name, entry_index, &entry);
|
.handle_string_entry(&table.name, entry_index, &entry);
|
||||||
self.analyser
|
self.analyser.handle_string_entry(
|
||||||
.handle_string_entry(&table.name, entry_index, &entry);
|
&table.name,
|
||||||
|
entry_index,
|
||||||
|
&entry,
|
||||||
|
&self.state_handler,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
self.string_table_names.push(table.name);
|
self.string_table_names.push(table.name);
|
||||||
|
|
@ -164,7 +188,8 @@ impl<'a, T: MessageHandler> DemoHandler<'a, T> {
|
||||||
let index = index as usize;
|
let index = index as usize;
|
||||||
self.state_handler
|
self.state_handler
|
||||||
.handle_string_entry(table_name, index, &entry);
|
.handle_string_entry(table_name, index, &entry);
|
||||||
self.analyser.handle_string_entry(table_name, index, &entry);
|
self.analyser
|
||||||
|
.handle_string_entry(table_name, index, &entry, &self.state_handler);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -175,7 +200,7 @@ impl<'a, T: MessageHandler> DemoHandler<'a, T> {
|
||||||
server_classes: Vec<ServerClass>,
|
server_classes: Vec<ServerClass>,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
self.analyser
|
self.analyser
|
||||||
.handle_data_tables(&send_tables, &server_classes);
|
.handle_data_tables(&send_tables, &server_classes, &self.state_handler);
|
||||||
self.state_handler
|
self.state_handler
|
||||||
.handle_data_table(send_tables, server_classes)
|
.handle_data_table(send_tables, server_classes)
|
||||||
}
|
}
|
||||||
|
|
@ -183,7 +208,8 @@ impl<'a, T: MessageHandler> DemoHandler<'a, T> {
|
||||||
pub fn handle_message(&mut self, message: Message<'a>) {
|
pub fn handle_message(&mut self, message: Message<'a>) {
|
||||||
let message_type = message.get_message_type();
|
let message_type = message.get_message_type();
|
||||||
if T::does_handle(message_type) {
|
if T::does_handle(message_type) {
|
||||||
self.analyser.handle_message(&message, self.tick);
|
self.analyser
|
||||||
|
.handle_message(&message, self.tick, &self.state_handler);
|
||||||
}
|
}
|
||||||
self.state_handler.handle_message(message, self.tick);
|
self.state_handler.handle_message(message, self.tick);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ impl MessageHandler for MessageTypeAnalyser {
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_message(&mut self, message: &Message, _tick: u32) {
|
fn handle_message(&mut self, message: &Message, _tick: u32, _parser_state: &ParserState) {
|
||||||
self.packet_types.push(message.get_message_type())
|
self.packet_types.push(message.get_message_type())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -93,7 +93,7 @@ impl MessageHandler for EntityDumper {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_message(&mut self, message: &Message, tick: u32) {
|
fn handle_message(&mut self, message: &Message, tick: u32, _parser_state: &ParserState) {
|
||||||
match message {
|
match message {
|
||||||
Message::PacketEntities(entity_message) => self.entities.extend(
|
Message::PacketEntities(entity_message) => self.entities.extend(
|
||||||
entity_message
|
entity_message
|
||||||
|
|
@ -105,7 +105,12 @@ impl MessageHandler for EntityDumper {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_data_tables(&mut self, tables: &[ParseSendTable], _server_classes: &[ServerClass]) {
|
fn handle_data_tables(
|
||||||
|
&mut self,
|
||||||
|
tables: &[ParseSendTable],
|
||||||
|
_server_classes: &[ServerClass],
|
||||||
|
_parser_state: &ParserState,
|
||||||
|
) {
|
||||||
for table in tables {
|
for table in tables {
|
||||||
for prop_def in &table.props {
|
for prop_def in &table.props {
|
||||||
self.prop_names.insert(
|
self.prop_names.insert(
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,12 @@ impl MessageHandler for SendPropAnalyser {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_data_tables(&mut self, tables: &[ParseSendTable], _server_classes: &[ServerClass]) {
|
fn handle_data_tables(
|
||||||
|
&mut self,
|
||||||
|
tables: &[ParseSendTable],
|
||||||
|
_server_classes: &[ServerClass],
|
||||||
|
_parser_state: &ParserState,
|
||||||
|
) {
|
||||||
for table in tables {
|
for table in tables {
|
||||||
for prop_def in &table.props {
|
for prop_def in &table.props {
|
||||||
self.prop_names.insert(
|
self.prop_names.insert(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue