1
0
Fork 0
mirror of https://codeberg.org/demostf/parser.git synced 2026-06-04 02:24:12 +02:00

skip messages we dont care about

This commit is contained in:
Robin Appelman 2019-03-17 18:44:33 +01:00
commit 128bf1ceb2
17 changed files with 237 additions and 71 deletions

View file

@ -2,10 +2,11 @@ use bitstream_reader::{BitBuffer, BitStream, LittleEndian};
use num_traits::{PrimInt, Unsigned};
use snap::Decoder;
use crate::{Parse, ParseError, ParserState, ReadResult, Result, Stream};
use crate::demo::packet::stringtable::{
ExtraData, FixedUserdataSize, StringTable, StringTableEntry,
};
use crate::{Parse, ParseError, ParserState, ReadResult, Result, Stream};
use crate::demo::parser::ParseBitSkip;
#[derive(Debug)]
pub struct CreateStringTableMessage {
@ -33,13 +34,13 @@ impl Parse for CreateStringTableMessage {
let max_entries: u16 = stream.read()?;
let encode_bits = log_base2(max_entries);
let entity_count: u16 = stream.read_sized(encode_bits as usize + 1)?;
let bit_count = read_var_int(stream)?;
let length = read_var_int(stream)?;
let fixed_userdata_size = stream.read()?;
let compressed = stream.read()?;
let mut table_data = stream.read_bits(bit_count as usize)?;
let mut table_data = stream.read_bits(length as usize)?;
if compressed {
let decompressed_size: u32 = table_data.read()?;
@ -88,6 +89,23 @@ impl Parse for CreateStringTableMessage {
}
}
impl ParseBitSkip for CreateStringTableMessage {
fn parse_skip(stream: &mut Stream) -> Result<()> {
let _: String = stream.read()?;
let max_entries: u16 = stream.read()?;
let encode_bits = log_base2(max_entries);
let _: u16 = stream.read_sized(encode_bits as usize + 1)?;
let length = read_var_int(stream)?;
let _: Option<FixedUserdataSize> = stream.read()?;
let _: bool = stream.read()?;
stream.skip_bits(length as usize).map_err(ParseError::from)
}
}
#[derive(Debug)]
pub struct UpdateStringTableMessage {
pub entries: Vec<(u16, StringTableEntry)>,
@ -99,9 +117,9 @@ impl Parse for UpdateStringTableMessage {
let table_id = stream.read_sized(5)?;
let changed: u16 = if stream.read()? { stream.read()? } else { 1 };
let len = stream.read_int(20)?;
let length: u32 = stream.read_int(20)?;
let mut data = stream.read_bits(len)?;
let mut data = stream.read_bits(length as usize)?;
let entries = match state.string_tables.get(table_id as usize) {
Some(table) => parse_string_table_update(&mut data, table, changed),
@ -112,6 +130,16 @@ impl Parse for UpdateStringTableMessage {
}
}
impl ParseBitSkip for UpdateStringTableMessage {
fn parse_skip(stream: &mut Stream) -> Result<()> {
let _: u8 = stream.read_sized(5)?;
let _: u16 = if stream.read()? { stream.read()? } else { 1 };
let length: u32 = stream.read_int(20)?;
stream.skip_bits(length as usize).map_err(ParseError::from)
}
}
fn parse_string_table_update(
stream: &mut Stream,
table_meta: &StringTableMeta,
@ -218,7 +246,7 @@ fn read_table_entry(
} else {
None
}
.map(ExtraData::new);
.map(ExtraData::new);
Ok(StringTableEntry { text, extra_data })
}