composer_utils.rs (3699B) - raw


      1 use std::{io::Error, string::FromUtf8Error};
      2 
      3 #[derive(Debug, Clone)]
      4 pub struct ModuleTag {
      5     tag_type: u8,
      6     buffer: Vec<u8>,
      7 }
      8 
      9 impl ModuleTag {
     10     pub fn new(module_type: u8, buffer: Vec<u8>) -> ModuleTag {
     11         ModuleTag {
     12             tag_type: module_type,
     13             buffer,
     14         }
     15     }
     16 
     17     pub fn to_string(&self) -> Result<String, FromUtf8Error> {
     18         Ok(String::from_utf8(self.buffer.clone())?)
     19     }
     20 
     21     pub fn get_tag_type(&self) -> u8 {
     22         self.tag_type
     23     }
     24 
     25     pub fn get_size(&self) -> usize {
     26         self.buffer.len()
     27     }
     28 
     29     pub fn get_buffer(&self) -> &Vec<u8> {
     30         &self.buffer
     31     }
     32 
     33     pub fn set_buffer(&mut self, buffer: Vec<u8>) {
     34         self.buffer = buffer;
     35     }
     36 }
     37 
     38 #[derive(Debug, Clone)]
     39 pub struct ComposerModule {
     40     tags: Vec<(ModuleTag, ModuleTag)>, // file name => file content
     41 }
     42 
     43 impl ComposerModule {
     44     pub fn parse(buffer: Vec<u8>) -> Result<ComposerModule, Error> {
     45         let mut offset = 0;
     46         let magic = u32::from_be_bytes([buffer[offset], buffer[offset + 1], buffer[offset + 2], buffer[offset + 3]]);
     47 
     48         offset += 4;
     49 
     50         if magic != 0x33c60001 {
     51             return Err(Error::new(std::io::ErrorKind::InvalidData, "Invalid magic"));
     52         }
     53 
     54         // skip content length
     55         offset += 4;
     56 
     57         let mut tags = Vec::new();
     58 
     59         loop {
     60             if offset >= buffer.len() {
     61                 break;
     62             }
     63 
     64             fn read_u24(buffer: &Vec<u8>, offset: &mut usize) -> Result<u32, Error> {
     65                 let b1 = buffer[*offset] as u32;
     66                 let b2 = buffer[*offset + 1] as u32;
     67                 let b3 = buffer[*offset + 2] as u32;
     68                 *offset += 3;
     69                 Ok(b1 | (b2 << 8) | (b3 << 16))
     70             }
     71 
     72             let tag_size = read_u24(&buffer, &mut offset)?;
     73             let tag_type = buffer[offset];
     74             offset += 1;
     75             let tag_buffer = buffer[offset..offset + tag_size as usize].to_vec();
     76             offset += tag_size as usize;
     77 
     78             let padding = 4 - (tag_size % 4);
     79 
     80             if padding != 4 {
     81                 offset += padding as usize;
     82             }
     83 
     84             tags.push(ModuleTag::new(tag_type, tag_buffer));
     85         }
     86 
     87         let tags = tags.chunks(2).map(|chunk| {
     88             (chunk[0].clone(), chunk[1].clone())
     89         }).collect();
     90 
     91         Ok(ComposerModule {
     92             tags,
     93         })
     94     }
     95 
     96     pub fn to_bytes(&self) -> Vec<u8> {
     97         let mut tag_buffer = Vec::new();
     98 
     99         fn write_u24(buffer: &mut Vec<u8>, value: u32) {
    100             buffer.push((value & 0xff) as u8);
    101             buffer.push(((value >> 8) & 0xff) as u8);
    102             buffer.push(((value >> 16) & 0xff) as u8);
    103         }
    104 
    105         fn write_tag(buffer: &mut Vec<u8>, tag: ModuleTag) {
    106             write_u24(buffer, tag.get_size() as u32);
    107             buffer.push(tag.get_tag_type());
    108             buffer.extend(tag.get_buffer());
    109 
    110             let padding = 4 - (tag.get_size() % 4);
    111 
    112             if padding != 4 {
    113                 for _ in 0..padding {
    114                     buffer.push(0);
    115                 }
    116             }
    117         }
    118 
    119         for (tag1, tag2) in &self.tags {
    120             write_tag(&mut tag_buffer, tag1.clone());
    121             write_tag(&mut tag_buffer, tag2.clone());
    122         }
    123 
    124         let mut buffer = Vec::new();
    125 
    126         buffer.extend_from_slice(&[0x33, 0xc6, 0, 1]);
    127         buffer.extend_from_slice(&(tag_buffer.len() as u32).to_le_bytes());
    128         buffer.extend(tag_buffer);
    129 
    130         buffer
    131     }
    132 
    133     pub fn get_tags(&self) -> Vec<(ModuleTag, ModuleTag)> {
    134         self.tags.clone()
    135     }
    136 
    137     pub fn set_tags(&mut self, tags: Vec<(ModuleTag, ModuleTag)>) {
    138         self.tags = tags;
    139     }
    140 }
    141