modified: outdb
modified: src/deserializer.rs modified: src/objects.rs modified: src/serializer.rs
This commit is contained in:
parent
564d894846
commit
d4de8dc8e2
@ -186,7 +186,7 @@ pub fn parse_bytes(data: &[u8]) -> XDatabase {
|
|||||||
playlists.push(XPlaylist {header: header, data: playlist,args: Vec::new(), elems: Vec::new()});
|
playlists.push(XPlaylist {header: header, data: playlist,args: Vec::new(), elems: Vec::new()});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
_ => { u = 1; }
|
_ => { u = 1; info!("Unknown stuff happened"); }
|
||||||
}
|
}
|
||||||
i += u;
|
i += u;
|
||||||
chunk_header = None;
|
chunk_header = None;
|
||||||
|
@ -66,7 +66,10 @@ pub struct Database {
|
|||||||
unknown1: [u8; 32],
|
unknown1: [u8; 32],
|
||||||
language: u16,
|
language: u16,
|
||||||
persistent_id: u64,
|
persistent_id: u64,
|
||||||
hash: [u8; 20]
|
hash: [u8; 20],
|
||||||
|
unk: [u8; 30],
|
||||||
|
unk1: [u8; 32],
|
||||||
|
unk2: [u8; 20]
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
|
#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
|
||||||
@ -154,7 +157,14 @@ pub struct TrackItem {
|
|||||||
unk39_hash: [u8; 20],
|
unk39_hash: [u8; 20],
|
||||||
unk40: [u8; 18],
|
unk40: [u8; 18],
|
||||||
album_id: u16,
|
album_id: u16,
|
||||||
mhii_link: u32
|
mhii_link: u32,
|
||||||
|
unk: [u8; 32],
|
||||||
|
unk1: [u8; 32],
|
||||||
|
unk2: [u8; 32],
|
||||||
|
unk3: [u8; 32],
|
||||||
|
unk4: [u8; 32],
|
||||||
|
unk5: [u8; 32],
|
||||||
|
unk6: [u8; 32]
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, PartialEq, Debug)]
|
#[derive(Serialize, Deserialize, PartialEq, Debug)]
|
||||||
@ -210,7 +220,9 @@ pub struct Playlist {
|
|||||||
unk3: u32,
|
unk3: u32,
|
||||||
string_mhod_count: u16,
|
string_mhod_count: u16,
|
||||||
podcast_flag: u16,
|
podcast_flag: u16,
|
||||||
list_sort_order: u32
|
list_sort_order: u32,
|
||||||
|
unk1: [u8; 22],
|
||||||
|
unk2: [u8; 22],
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, PartialEq, Debug)]
|
#[derive(Serialize, Deserialize, PartialEq, Debug)]
|
||||||
|
@ -10,25 +10,7 @@ fn string_to_ipod16(str: &String) -> Vec<u8> {
|
|||||||
fn x_args_to_bytes(args: &Vec<XArgument>) -> Vec<u8> {
|
fn x_args_to_bytes(args: &Vec<XArgument>) -> Vec<u8> {
|
||||||
args.iter()
|
args.iter()
|
||||||
.filter(|arg| arg.arg_type <= 15)
|
.filter(|arg| arg.arg_type <= 15)
|
||||||
.map(|arg| {
|
.map(serialize_string_arg)
|
||||||
let s = string_to_ipod16(&arg.val);
|
|
||||||
let mut b = bincode::serialize(&StringEntry {
|
|
||||||
entry_type: arg.arg_type,
|
|
||||||
unk1: 0,
|
|
||||||
unk2: 0,
|
|
||||||
position: 1,
|
|
||||||
length: s.len() as u32,
|
|
||||||
unknown: 0,
|
|
||||||
unk4: 0
|
|
||||||
}).unwrap();
|
|
||||||
let h = bincode::serialize(&ChunkHeader {
|
|
||||||
chunk_type: ChunkType::StringTypes.into(),
|
|
||||||
end_of_chunk: 0x18,
|
|
||||||
children_count: 16 + 0x18 + s.len() as u32
|
|
||||||
}).unwrap();
|
|
||||||
b = [h, b, s].concat();
|
|
||||||
return b;
|
|
||||||
})
|
|
||||||
.flatten()
|
.flatten()
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
@ -55,7 +37,7 @@ fn serialize_string_arg(xarg: &XArgument) -> Vec<u8> {
|
|||||||
unk2: 0,
|
unk2: 0,
|
||||||
position: 1,
|
position: 1,
|
||||||
length: s.len() as u32,
|
length: s.len() as u32,
|
||||||
unknown: 0,
|
unknown: 1,
|
||||||
unk4: 0
|
unk4: 0
|
||||||
}).unwrap();
|
}).unwrap();
|
||||||
let h = bincode::serialize(&ChunkHeader {
|
let h = bincode::serialize(&ChunkHeader {
|
||||||
@ -113,7 +95,6 @@ pub fn to_bytes(xdb: XDatabase) -> Vec<u8> {
|
|||||||
let mut bytes: Vec<u8> = Vec::new();
|
let mut bytes: Vec<u8> = Vec::new();
|
||||||
for i in 0..xdb.children.len() {
|
for i in 0..xdb.children.len() {
|
||||||
let data_set = xdb.children.get(i).unwrap();
|
let data_set = xdb.children.get(i).unwrap();
|
||||||
info!("Serializer: {:?}", data_set);
|
|
||||||
match &data_set.child {
|
match &data_set.child {
|
||||||
XSomeList::Playlists(playlists) => {
|
XSomeList::Playlists(playlists) => {
|
||||||
let mut pl_bytes = Vec::new();
|
let mut pl_bytes = Vec::new();
|
||||||
@ -128,14 +109,14 @@ pub fn to_bytes(xdb: XDatabase) -> Vec<u8> {
|
|||||||
args.append(&mut a);
|
args.append(&mut a);
|
||||||
}
|
}
|
||||||
|
|
||||||
pl_bytes.append(&mut generate_header(ChunkType::Playlist, 36,args.len()));
|
pl_bytes.append(&mut generate_header(ChunkType::Playlist, 172,args.len()));
|
||||||
pl_bytes.append(&mut bincode::serialize(&playlist.data).unwrap());
|
pl_bytes.append(&mut bincode::serialize(&playlist.data).unwrap());
|
||||||
pl_bytes.append(&mut generate_zeroes(148));
|
pl_bytes.append(&mut generate_zeroes(104));
|
||||||
pl_bytes.append(&mut args);
|
pl_bytes.append(&mut args);
|
||||||
}
|
}
|
||||||
let mhlp = ChunkHeader { chunk_type: ChunkType::PlaylistList.into(), end_of_chunk: 92, children_count: playlists.len() as u32 };
|
let mhlp = ChunkHeader { chunk_type: ChunkType::PlaylistList.into(), end_of_chunk: 92, children_count: playlists.len() as u32 };
|
||||||
let mut mhlp = bincode::serialize(&mhlp).unwrap();
|
let mut mhlp = bincode::serialize(&mhlp).unwrap();
|
||||||
bytes.append(&mut generate_header(ChunkType::DataSet, 84, mhlp.len() + pl_bytes.len() + 808));
|
bytes.append(&mut generate_header(ChunkType::DataSet, 84, mhlp.len() + pl_bytes.len() + 80)); // 728
|
||||||
bytes.append(&mut bincode::serialize(&data_set.data).unwrap());
|
bytes.append(&mut bincode::serialize(&data_set.data).unwrap());
|
||||||
bytes.append(&mut generate_zeroes(92));
|
bytes.append(&mut generate_zeroes(92));
|
||||||
bytes.append(&mut mhlp);
|
bytes.append(&mut mhlp);
|
||||||
@ -168,7 +149,7 @@ pub fn to_bytes(xdb: XDatabase) -> Vec<u8> {
|
|||||||
let mut args = x_args_to_bytes(&track.args);
|
let mut args = x_args_to_bytes(&track.args);
|
||||||
tr_bytes.append(&mut generate_header(ChunkType::TrackItem, 612,args.len()));
|
tr_bytes.append(&mut generate_header(ChunkType::TrackItem, 612,args.len()));
|
||||||
tr_bytes.append(&mut bincode::serialize(&track.data).unwrap());
|
tr_bytes.append(&mut bincode::serialize(&track.data).unwrap());
|
||||||
tr_bytes.append(&mut generate_zeroes(332));
|
tr_bytes.append(&mut generate_zeroes(108));
|
||||||
tr_bytes.append(&mut args);
|
tr_bytes.append(&mut args);
|
||||||
}
|
}
|
||||||
let mhlt = ChunkHeader { chunk_type: ChunkType::TrackList.into(), end_of_chunk: 92, children_count: tracks.len() as u32 };
|
let mhlt = ChunkHeader { chunk_type: ChunkType::TrackList.into(), end_of_chunk: 92, children_count: tracks.len() as u32 };
|
||||||
@ -186,6 +167,6 @@ pub fn to_bytes(xdb: XDatabase) -> Vec<u8> {
|
|||||||
let sdb_len = sdb.len();
|
let sdb_len = sdb.len();
|
||||||
let h = xdb.header.unwrap();
|
let h = xdb.header.unwrap();
|
||||||
bytes = [sdb, generate_zeroes(h.end_of_chunk - sdb_len as u32), bytes].concat();
|
bytes = [sdb, generate_zeroes(h.end_of_chunk - sdb_len as u32), bytes].concat();
|
||||||
bytes = [generate_header(ChunkType::Database, (h.end_of_chunk - 12) as usize, bytes.len()), bytes].concat();
|
bytes = [generate_header(ChunkType::Database, (h.end_of_chunk - 12) as usize, bytes.len() - (h.end_of_chunk - 12) as usize), bytes].concat();
|
||||||
bytes
|
bytes
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user