diff --git a/outdb b/outdb index c070eec..ac85d77 100644 Binary files a/outdb and b/outdb differ diff --git a/src/main.rs b/src/main.rs index ee06ae5..519ebb9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -24,8 +24,8 @@ impl From<[u8; 4]> for ChunkType { match value { [0x6D, 0x68, 0x62, 0x64] => ChunkType::Database, [0x6D, 0x68, 0x73, 0x64] => ChunkType::DataSet, - [0x6D, 0x68, 0x69, 0x61] => ChunkType::AlbumList, - [0x6D, 0x68, 0x6C, 0x61] => ChunkType::AlbumItem, + [0x6D, 0x68, 0x69, 0x61] => ChunkType::AlbumItem, + [0x6D, 0x68, 0x6C, 0x61] => ChunkType::AlbumList, [0x6D, 0x68, 0x6C, 0x74] => ChunkType::TrackList, [0x6D, 0x68, 0x69, 0x74] => ChunkType::TrackItem, [0x6D, 0x68, 0x6F, 0x64] => ChunkType::StringTypes, @@ -41,8 +41,8 @@ impl From for [u8; 4] { match value { ChunkType::Database => [0x6D, 0x68, 0x62, 0x64], ChunkType::DataSet => [0x6D, 0x68, 0x73, 0x64], - ChunkType::AlbumList => [0x6D, 0x68, 0x69, 0x61], - ChunkType::AlbumItem => [0x6D, 0x68, 0x6C, 0x61], + ChunkType::AlbumItem => [0x6D, 0x68, 0x69, 0x61], + ChunkType::AlbumList => [0x6D, 0x68, 0x6C, 0x61], ChunkType::TrackList => [0x6D, 0x68, 0x6C, 0x74], ChunkType::TrackItem => [0x6D, 0x68, 0x69, 0x74], ChunkType::StringTypes => [0x6D, 0x68, 0x6F, 0x64], @@ -250,11 +250,11 @@ pub fn parse_bytes(data: &[u8]) -> XDatabase { ChunkType::DataSet => { u = usize::try_from(header.end_of_chunk).unwrap() - 12; let ds: DataSet = bincode::deserialize(&data[i..i+u]).unwrap(); - info!("val: {:?}", ds); + info!("DataSet: {:?}", ds); xdb.children.push(XDataSet { header: header, data: ds.clone(), child: match ds.data_type { 3 => XSomeList::Playlists(Vec::new()), // Playlist List 4 => XSomeList::AlbumList(Vec::new()), // Album List - _ => XSomeList::TrackList(Vec::new()) // 1 Track List + _ => XSomeList::TrackList(Vec::new()) // Track List (1) }}); }, ChunkType::AlbumList => { @@ -266,6 +266,7 @@ pub fn parse_bytes(data: &[u8]) -> XDatabase { u = usize::try_from(header.end_of_chunk).unwrap() - 12; let ai: AlbumItem = bincode::deserialize(&data[i..i+u]).unwrap(); info!("val: {:?}", ai); + info!("AlbumItem: {}", u); if let XSomeList::AlbumList(albums) = &mut xdb.find_dataset(4).child { albums.push(XAlbumItem {header: header, data: ai,args: Vec::new()}); } @@ -501,11 +502,13 @@ fn to_bytes(xdb: XDatabase) -> Vec { pl_bytes.append(&mut bincode::serialize(&playlist.data).unwrap()); pl_bytes.append(&mut args); } - let mhlp = ChunkHeader { chunk_type: ChunkType::PlaylistList.into(), end_of_chunk: 12, 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(); - bytes.append(&mut generate_header(ChunkType::DataSet, 4, mhlp.len())); + bytes.append(&mut generate_header(ChunkType::DataSet, 84, mhlp.len())); bytes.append(&mut bincode::serialize(&data_set.data).unwrap()); + bytes.append(&mut generate_zeroes(92)); bytes.append(&mut mhlp); + bytes.append(&mut generate_zeroes(92)); bytes.append(&mut pl_bytes); }, XSomeList::AlbumList(albums) => { @@ -513,15 +516,18 @@ fn to_bytes(xdb: XDatabase) -> Vec { for u in 0..albums.len() { let album = albums.get(u).unwrap(); let mut args = x_args_to_bytes(&album.args); - al_bytes.append(&mut generate_header(ChunkType::AlbumItem, 20,args.len())); + al_bytes.append(&mut generate_header(ChunkType::AlbumItem, 76,args.len())); al_bytes.append(&mut bincode::serialize(&album.data).unwrap()); + al_bytes.append(&mut generate_zeroes(68)); al_bytes.append(&mut args); } - let mhla = ChunkHeader { chunk_type: ChunkType::AlbumList.into(), end_of_chunk: 12, children_count: albums.len() as u32 }; + let mhla = ChunkHeader { chunk_type: ChunkType::AlbumList.into(), end_of_chunk: 92, children_count: albums.len() as u32 }; let mut mhla = bincode::serialize(&mhla).unwrap(); - bytes.append(&mut generate_header(ChunkType::DataSet, 4, mhla.len())); + bytes.append(&mut generate_header(ChunkType::DataSet, 84, mhla.len())); bytes.append(&mut bincode::serialize(&data_set.data).unwrap()); + bytes.append(&mut generate_zeroes(92)); bytes.append(&mut mhla); + bytes.append(&mut generate_zeroes(92)); bytes.append(&mut al_bytes); }, XSomeList::TrackList(tracks) => { @@ -529,15 +535,18 @@ fn to_bytes(xdb: XDatabase) -> Vec { for u in 0..tracks.len() { let track = tracks.get(u).unwrap(); let mut args = x_args_to_bytes(&track.args); - tr_bytes.append(&mut generate_header(ChunkType::TrackItem, 292,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 generate_zeroes(332)); tr_bytes.append(&mut args); } - let mhlt = ChunkHeader { chunk_type: ChunkType::TrackList.into(), end_of_chunk: 12, children_count: tracks.len() as u32 }; + let mhlt = ChunkHeader { chunk_type: ChunkType::TrackList.into(), end_of_chunk: 92, children_count: tracks.len() as u32 }; let mut mhlt = bincode::serialize(&mhlt).unwrap(); - bytes.append(&mut generate_header(ChunkType::DataSet, 4, mhlt.len())); + bytes.append(&mut generate_header(ChunkType::DataSet, 84, mhlt.len())); bytes.append(&mut bincode::serialize(&data_set.data).unwrap()); + bytes.append(&mut generate_zeroes(92)); bytes.append(&mut mhlt); + bytes.append(&mut generate_zeroes(92)); bytes.append(&mut tr_bytes); } } @@ -564,7 +573,7 @@ fn main() { Ok(n) => { let data = &buf[..n]; let xdb = parse_bytes(data); - //info!("XDB: {:?}", xdb); + info!("XDB: {:?}", xdb); //let mut op = File::create("outdb").unwrap(); //info!("Write res: {:?}", op.write(&to_bytes(xdb))); },