small fix

This commit is contained in:
Michael Wain 2025-02-17 03:01:08 +03:00
parent 5135e1999c
commit c9135b64dd

View File

@ -100,6 +100,66 @@ pub mod deserializer {
} }
} }
pub mod serializer {
use crate::artworkdb::aobjects::ADatabase;
use crate::artworkdb::objects::{ChunkHeader, ChunkType};
pub fn to_bytes(adb: ADatabase) -> Vec<u8> {
let mut bytes: Vec<u8> = Vec::new();
for i in 0..(adb.children.len()) {
let data_set = adb.children.get(i).unwrap();
for img in data_set.child.iter() {
let mut args = Vec::new();
for arg in img.args.iter() {
let mut argv = Vec::new();
match arg.data.tag_type {
3 => {
let mut str_b = string_to_ipod16(arg.str.as_ref().unwrap());
str_b = [3u32.to_le_bytes().to_vec(), 0u32.to_le_bytes().to_vec(), 0u32.to_le_bytes().to_vec(), (str_b.len() as u32).to_le_bytes().to_vec(), 2u32.to_le_bytes().to_vec(), 0u32.to_le_bytes().to_vec(), str_b ].concat();
argv.append(&mut generate_header(ChunkType::LocationTag, 12, str_b.len()));
argv.append(&mut str_b);
},
_ => { // 2
let mut data = [2u32.to_le_bytes(), 0u32.to_le_bytes(), 0u32.to_le_bytes()].concat();
argv.append(&mut generate_header(ChunkType::LocationTag, 12, 0));
argv.append(&mut data);
}
}
if let Some(name) = &arg.child {
args.append(&mut generate_header(ChunkType::ImageName, 76, argv.len()));
args.append(&mut bincode::serialize(name).unwrap());
}
args.append(&mut argv);
}
if img.data.is_some() {
let mut item = Vec::new();
item.append(&mut generate_header(ChunkType::ImageItem, 40, args.len()));
item.append(&mut bincode::serialize(img.data.as_ref().unwrap()).unwrap());
}
if img.file.is_some() {
}
}
}
bytes
}
fn string_to_ipod16(str: &str) -> Vec<u8> {
str.encode_utf16().flat_map(|f| [f as u8, (f >> 8) as u8]).collect()
}
fn generate_header(ct: ChunkType, header_size: usize, data_len: usize) -> Vec<u8> {
let header_size = 12 + header_size as u32;
let header = ChunkHeader{ chunk_type: ct.into(), end_of_chunk: header_size, children_count: header_size + data_len as u32};
bincode::serialize(&header).unwrap()
}
}
pub mod aobjects { pub mod aobjects {
use crate::artworkdb::objects::{ChunkHeader, DataSet, Database, ImageFile, ImageItem, ImageName, LocationTag}; use crate::artworkdb::objects::{ChunkHeader, DataSet, Database, ImageFile, ImageItem, ImageName, LocationTag};