small fix
This commit is contained in:
parent
5135e1999c
commit
c9135b64dd
@ -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};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user