wolfpack/msix/
block_map.rs1use std::io::Error;
2use std::io::Write;
3
4use quick_xml::se::to_writer;
5use serde::ser::SerializeStruct;
6use serde::Deserialize;
7use serde::Serialize;
8use serde::Serializer;
9
10#[derive(Deserialize, Debug)]
12#[serde(rename = "BlockMap")]
13pub struct BlockMap {
14 #[serde(rename = "@HashMethod")]
15 pub hash_method: String,
16 #[serde(rename = "File", default)]
17 pub files: Vec<File>,
18}
19
20impl BlockMap {
21 pub fn write<W: Write>(&self, mut writer: W) -> Result<(), Error> {
22 let mut s = String::new();
23 to_writer(&mut s, self).map_err(Error::other)?;
24 writer.write_all(r#"<?xml version="1.0" encoding="UTF-8" standalone="no"?>"#.as_bytes())?;
25 writer.write_all(s.as_bytes())?;
26 Ok(())
27 }
28}
29
30impl Serialize for BlockMap {
31 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
32 where
33 S: Serializer,
34 {
35 let mut state = serializer.serialize_struct("BlockMap", 3)?;
36 state.serialize_field("@xmlns", "http://schemas.microsoft.com/appx/2010/blockmap")?;
37 state.serialize_field("@HashMethod", &self.hash_method)?;
38 state.serialize_field("File", &self.files)?;
39 state.end()
40 }
41}
42
43#[derive(Serialize, Deserialize, Debug)]
44#[serde(rename = "File")]
45pub struct File {
46 #[serde(rename = "@Name")]
47 pub name: String,
48 #[serde(rename = "@Size")]
49 pub size: u64,
50 #[serde(rename = "@LfhSize")]
51 pub lfh_size: u64,
52 #[serde(rename = "Block", default)]
53 pub blocks: Vec<Block>,
54}
55
56#[derive(Serialize, Deserialize, Debug)]
57#[serde(rename = "Block")]
58pub struct Block {
59 #[serde(rename = "@Hash")]
60 pub hash: String,
61 #[serde(rename = "@Size")]
62 pub size: u64,
63}