Skip to main content

wolfpack/msix/
block_map.rs

1use 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/// https://learn.microsoft.com/en-us/uwp/schemas/blockmapschema/app-package-block-map
11#[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}