diff --git a/src/lib.rs b/src/lib.rs index 21d1600..d26b410 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -222,7 +222,7 @@ enum ChunkState { } pub fn parse_bytes(data: &[u8]) -> XDatabase { - let mut xdb = XDatabase{data: None, children: Vec::new()}; + let mut xdb = XDatabase{data: None, header: None, children: Vec::new()}; let mut state = ChunkState::Header; let mut chunk_header: Option = None; let mut last_type: u32 = 0; @@ -250,7 +250,7 @@ pub fn parse_bytes(data: &[u8]) -> XDatabase { u = usize::try_from(header.end_of_chunk).unwrap() - 12; let ds: DataSet = bincode::deserialize(&data[i..i+u]).unwrap(); info!("val: {:?}", ds); - xdb.children.push(XDataSet { data: ds.clone(), child: match ds.data_type { + 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 @@ -266,7 +266,7 @@ pub fn parse_bytes(data: &[u8]) -> XDatabase { let ai: AlbumItem = bincode::deserialize(&data[i..i+u]).unwrap(); info!("val: {:?}", ai); if let XSomeList::AlbumList(albums) = &mut xdb.find_dataset(4).child { - albums.push(XAlbumItem {data: ai,args: Vec::new()}); + albums.push(XAlbumItem {header: header, data: ai,args: Vec::new()}); } }, ChunkType::TrackList => { @@ -279,7 +279,7 @@ pub fn parse_bytes(data: &[u8]) -> XDatabase { let ti: TrackItem = bincode::deserialize(&data[i..i+u]).unwrap(); info!("val: {:?}", ti); if let XSomeList::TrackList(tracks) = &mut xdb.find_dataset(1).child { - tracks.push(XTrackItem {data: ti,args: Vec::new()}); + tracks.push(XTrackItem {header: header, data: ti,args: Vec::new()}); } }, ChunkType::StringTypes => { @@ -355,7 +355,7 @@ pub fn parse_bytes(data: &[u8]) -> XDatabase { let playlist: Playlist = bincode::deserialize(&data[i..i+u]).unwrap(); info!("playlist: {:?}", playlist); if let XSomeList::Playlists(playlists) = &mut xdb.find_dataset(3).child { - playlists.push(XPlaylist {data: playlist,args: Vec::new()}); + playlists.push(XPlaylist {header: header, data: playlist,args: Vec::new()}); } }, _ => { u = 1; } @@ -399,14 +399,17 @@ fn x_args_to_bytes(args: &Vec) -> Vec { fn to_bytes(xdb: XDatabase) -> Vec { let mut bytes: Vec = Vec::new(); + bytes = [bytes, bincode::serialize(&xdb.header.unwrap()).unwrap()].concat(); bytes = [bytes, bincode::serialize(&xdb.data.unwrap()).unwrap()].concat(); for i in 0..xdb.children.len() { let data_set = xdb.children.get(i).unwrap(); + bytes = [bytes, bincode::serialize(&data_set.header).unwrap()].concat(); bytes = [bytes, bincode::serialize(&data_set.data).unwrap()].concat(); match &data_set.child { XSomeList::Playlists(playlists) => { for u in 0..playlists.len() { let playlist = playlists.get(u).unwrap(); + bytes = [bytes, bincode::serialize(&playlist.header).unwrap()].concat(); bytes = [bytes, bincode::serialize(&playlist.data).unwrap()].concat(); bytes = [bytes, x_args_to_bytes(&playlist.args)].concat(); } @@ -414,6 +417,7 @@ fn to_bytes(xdb: XDatabase) -> Vec { XSomeList::AlbumList(albums) => { for u in 0..albums.len() { let album = albums.get(u).unwrap(); + bytes = [bytes, bincode::serialize(&album.header).unwrap()].concat(); bytes = [bytes, bincode::serialize(&album.data).unwrap()].concat(); bytes = [bytes, x_args_to_bytes(&album.args)].concat(); } @@ -421,6 +425,7 @@ fn to_bytes(xdb: XDatabase) -> Vec { XSomeList::TrackList(tracks) => { for u in 0..tracks.len() { let track = tracks.get(u).unwrap(); + bytes = [bytes, bincode::serialize(&track.header).unwrap()].concat(); bytes = [bytes, bincode::serialize(&track.data).unwrap()].concat(); bytes = [bytes, x_args_to_bytes(&track.args)].concat(); } diff --git a/src/xml.rs b/src/xml.rs index 82a5942..6a17bb1 100644 --- a/src/xml.rs +++ b/src/xml.rs @@ -1,30 +1,35 @@ #[derive(Debug, serde::Serialize)] pub struct XDatabase { + pub header: Option, pub data: Option, pub children: Vec } #[derive(Debug, serde::Serialize)] pub struct XDataSet { + pub header: crate::ChunkHeader, pub data: crate::DataSet, pub child: XSomeList } #[derive(Debug, serde::Serialize)] pub struct XTrackItem { + pub header: crate::ChunkHeader, pub data: crate::TrackItem, pub args: Vec } #[derive(Debug, serde::Serialize)] pub struct XAlbumItem { + pub header: crate::ChunkHeader, pub data: crate::AlbumItem, pub args: Vec } #[derive(Debug, serde::Serialize)] pub struct XPlaylist { + pub header: crate::ChunkHeader, pub data: crate::Playlist, pub args: Vec }