dmg_oxide/
xml.rs

1use crate::blkx::BlkxTable;
2use anyhow::Result;
3use serde::{Deserialize, Serialize};
4
5#[derive(Clone, Debug, Default, Deserialize, Serialize)]
6#[serde(deny_unknown_fields)]
7pub struct Plist {
8    #[serde(rename = "resource-fork")]
9    pub resource_fork: ResourceFork,
10}
11
12impl Plist {
13    pub fn partitions(&self) -> &[Partition] {
14        &self.resource_fork.blkx
15    }
16
17    pub fn add_partition(&mut self, partition: Partition) {
18        self.resource_fork.blkx.push(partition);
19    }
20}
21
22#[derive(Clone, Debug, Default, Deserialize, Serialize)]
23#[serde(deny_unknown_fields)]
24pub struct ResourceFork {
25    pub blkx: Vec<Partition>,
26    #[serde(default)]
27    pub plst: Vec<Partition>,
28}
29
30#[derive(Clone, Debug, Deserialize, Serialize)]
31#[serde(deny_unknown_fields)]
32pub struct Partition {
33    #[serde(rename = "Attributes")]
34    pub attributes: String,
35    #[serde(rename = "CFName")]
36    #[serde(default)]
37    pub cfname: String,
38    #[serde(rename = "Data")]
39    #[serde(with = "serde_bytes")]
40    pub data: Vec<u8>,
41    #[serde(rename = "ID")]
42    pub id: String,
43    #[serde(rename = "Name")]
44    pub name: String,
45}
46
47impl Partition {
48    pub fn new(id: i32, name: String, table: BlkxTable) -> Self {
49        let mut data = vec![];
50        table.write_to(&mut data).unwrap();
51        Self {
52            attributes: "0x0050".to_string(),
53            cfname: name.clone(),
54            data,
55            id: id.to_string(),
56            name,
57        }
58    }
59
60    pub fn table(&self) -> Result<BlkxTable> {
61        BlkxTable::read_from(&mut &self.data[..])
62    }
63}