1
0
Fork 0
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:
Robin Appelman 2022-08-05 23:43:15 +02:00
commit 74ad7d121f
9 changed files with 70 additions and 20 deletions

View file

@ -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);
} }

View file

@ -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);
} }

View file

@ -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 {

View file

@ -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()),

View file

@ -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()),

View file

@ -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);
} }

View file

@ -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())
} }

View file

@ -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(

View file

@ -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(