1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};

use std::io::{Read, Write, Error};

use crate::io::*;

pub struct PBOHeader {
    pub filename: String,
    pub method: u32,
    pub original: u32,
    pub reserved: u32,
    pub timestamp: u32,
    pub size: u32,
}

impl PBOHeader {
    pub fn read<I: Read>(input: &mut I) -> Result<PBOHeader, Error> {
        Ok(PBOHeader {
            filename: input.read_cstring()?,
            method: input.read_u32::<LittleEndian>()?,
            original: input.read_u32::<LittleEndian>()?,
            reserved: input.read_u32::<LittleEndian>()?,
            timestamp: input.read_u32::<LittleEndian>()?,
            size: input.read_u32::<LittleEndian>()?
        })
    }

    pub fn write<O: Write>(&self, output: &mut O) -> Result<(), Error> {
        output.write_cstring(&self.filename)?;
        output.write_u32::<LittleEndian>(self.method)?;
        output.write_u32::<LittleEndian>(self.original)?;
        output.write_u32::<LittleEndian>(self.reserved)?;
        output.write_u32::<LittleEndian>(self.timestamp)?;
        output.write_u32::<LittleEndian>(self.size)?;
        Ok(())
    }
}

#[test]
fn read() {
    use std::io::{Cursor};
    let header = crate::header::PBOHeader::read(&mut Cursor::new(String::from("images\\mission.jpg��*\\*Wi"))).unwrap();
    assert_eq!(header.filename, "images\\mission.jpg");
    assert_eq!(header.size, 1546304959);
    assert_eq!(header.timestamp, 4022190063);
}