use std::io::Cursor;
use super::binary_reader::WzBinaryReader;
use super::header::WzHeader;
pub fn dummy_header(file_size: u64) -> WzHeader {
WzHeader::dummy(file_size)
}
pub fn make_reader(data: Vec<u8>) -> WzBinaryReader<Cursor<Vec<u8>>> {
let header = dummy_header(data.len() as u64);
WzBinaryReader::new(Cursor::new(data), [0; 4], header, 0)
}
pub fn make_reader_with_header(
data: Vec<u8>,
data_start: u32,
file_size: u64,
) -> WzBinaryReader<Cursor<Vec<u8>>> {
let header = WzHeader {
ident: "PKG1".to_string(),
file_size,
data_start,
copyright: String::new(),
};
WzBinaryReader::new(Cursor::new(data), [0; 4], header, 0)
}
pub fn encode_wz_ascii(s: &str) -> Vec<u8> {
let len = s.len();
assert!(len > 0 && len < 128);
let indicator = -(len as i8);
let mut out = vec![indicator as u8];
let mut mask: u8 = 0xAA;
for b in s.bytes() {
out.push(b ^ mask); mask = mask.wrapping_add(1);
}
out
}
pub fn encode_wz_unicode(s: &str) -> Vec<u8> {
let chars: Vec<u16> = s.encode_utf16().collect();
let len = chars.len();
assert!(len > 0 && len < 127);
let mut out = vec![len as u8]; let mut mask: u16 = 0xAAAA;
for ch in &chars {
let encrypted = ch ^ mask; out.extend_from_slice(&encrypted.to_le_bytes());
mask = mask.wrapping_add(1);
}
out
}
pub fn encode_wz_offset(cur_pos: u32, desired: u32) -> [u8; 4] {
use crate::crypto::constants::WZ_OFFSET_CONSTANT;
let mut v = cur_pos ^ 0xFFFF_FFFF;
v = v.wrapping_mul(0); v = v.wrapping_sub(WZ_OFFSET_CONSTANT);
v = v.rotate_left(v & 0x1F);
(v ^ desired).to_le_bytes()
}
pub fn string_block(s: &str) -> Vec<u8> {
let mut out = vec![0x73u8]; out.extend_from_slice(&encode_wz_ascii(s));
out
}
pub fn property_image_header() -> Vec<u8> {
let mut out = vec![0x73u8]; out.extend_from_slice(&encode_wz_ascii("Property"));
out.extend_from_slice(&0u16.to_le_bytes()); out
}
pub fn build_image_with_property(name: &str, value_bytes: &[u8]) -> Vec<u8> {
let mut data = property_image_header();
data.push(1); data.extend_from_slice(&string_block(name)); data.extend_from_slice(value_bytes); data
}
pub fn build_extended_property(type_name: &str, inner_after_type: &[u8]) -> Vec<u8> {
let mut inner = vec![0x73u8]; inner.extend_from_slice(&encode_wz_ascii(type_name));
inner.extend_from_slice(inner_after_type);
let mut value = vec![0x09u8];
value.extend_from_slice(&(inner.len() as u32).to_le_bytes()); value.extend_from_slice(&inner);
value
}