use super::*;
use crate::versions::protocol87702::byte_aligned::{ReplaySHeader, SVersion};
use nom::bytes::complete::*;
use nom::error::dbg_dmp;
use nom_mpq::MPQ;
use nom_mpq::parser::peek_hex;
#[derive(Debug, PartialEq, Clone)]
pub struct ProtocolHeader {
pub m_signature: Vec<u8>,
pub m_version: SVersion,
}
impl ProtocolHeader {
#[tracing::instrument(level = "debug", skip(input), fields(input = peek_hex(input)))]
pub fn parse(input: &[u8]) -> S2ProtoResult<&[u8], Self> {
let (tail, _) = validate_struct_tag(input)?;
let (tail, _) = dbg_dmp(tag(&b"\x12"[..]), "Protocol Header struct size")(tail)?;
let (tail, m_signature) = Self::parse_m_signature(tail)?;
let (tail, _) = dbg_dmp(tag(&b"\x02"[..]), "Protocol Header.Version struct Tag")(tail)?;
let (tail, m_version) = SVersion::parse(tail)?;
Ok((
tail,
Self {
m_signature,
m_version,
},
))
}
#[tracing::instrument(level = "debug", skip(input), fields(input = peek_hex(input)))]
pub fn parse_m_signature(input: &[u8]) -> S2ProtoResult<&[u8], Vec<u8>> {
let (tail, _) = dbg_dmp(tag(&b"\x00"[..]), "m_signature field tag")(input)?;
let (tail, m_signature) = tagged_blob(tail)?;
Ok((tail, m_signature))
}
}
pub fn read_protocol_header(mpq: &MPQ) -> S2ProtoResult<&[u8], ReplaySHeader> {
let user_data = mpq
.user_data
.as_ref()
.expect("Unable to locate protocol version, missing user data in MPQ");
ReplaySHeader::parse(&user_data.content)
}