emote_psb/
header.rs

1/*
2 * Created on Fri Dec 25 2020
3 *
4 * Copyright (c) storycraft. Licensed under the MIT Licence.
5 */
6
7use std::io::{Read, Write};
8
9use crate::PsbError;
10
11use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
12
13/// PSB file header
14#[derive(Debug, Clone, Copy)]
15pub struct PsbHeader {
16
17    /// Version. (1, 2, 3, 4)
18    pub version: u16,
19    /// != 0 if encrypted
20    pub encryption: u16
21
22}
23
24impl PsbHeader {
25
26    /// Read header from current position.
27    /// Returns read size, ScnHeader tuple.
28    pub fn from_bytes(stream: &mut impl Read) -> Result<(u64, Self), PsbError> {
29        let version = stream.read_u16::<LittleEndian>()?;
30        let encryption = stream.read_u16::<LittleEndian>()?;
31
32        Ok((4, Self {
33            version,
34            encryption
35        }))
36    }
37
38    /// Write scn header to stream.
39    /// Returns written size.
40    pub fn write_bytes(&self, stream: &mut impl Write) -> Result<u64, PsbError> {
41        stream.write_u16::<LittleEndian>(self.version)?;
42        stream.write_u16::<LittleEndian>(self.encryption)?;
43        
44        Ok(8)
45    }
46
47}
48
49/// MDF (compressed psb) file header
50pub struct MdfHeader {
51
52    /// Compressed size
53    pub size: u32
54
55}
56
57impl MdfHeader {
58
59    /// Read header from current position.
60    /// Returns read size, MdfHeader tuple.
61    pub fn from_bytes(stream: &mut impl Read) -> Result<(u64, Self), PsbError> {
62        Ok((4, Self { size: stream.read_u32::<LittleEndian>()? }))
63    }
64
65    /// Write mdf header to stream.
66    /// Returns written size.
67    pub fn write_bytes(&self, stream: &mut impl Write) -> Result<u64, PsbError> {
68        stream.write_u32::<LittleEndian>(self.size)?;
69        
70        Ok(4)
71    }
72
73}