From 00a0086a961f6423db4e8f7a41c66cc479842d2a Mon Sep 17 00:00:00 2001 From: Mike Welsh Date: Sat, 10 Sep 2016 16:55:09 -0700 Subject: [PATCH] Implement SymbolClass tag --- src/read.rs | 14 +++++++++++++- src/test_data.rs | 9 +++++++++ src/types.rs | 8 +++++++- src/write.rs | 11 +++++++++++ tests/swfs/symbolclass.fla | Bin 0 -> 4382 bytes tests/swfs/symbolclass.swf | Bin 0 -> 570 bytes 6 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 tests/swfs/symbolclass.fla create mode 100644 tests/swfs/symbolclass.swf diff --git a/src/read.rs b/src/read.rs index 8339a86e8..6f0355244 100644 --- a/src/read.rs +++ b/src/read.rs @@ -358,7 +358,7 @@ impl Reader { } Tag::ImportAssets { url: url, imports: imports } }, - + Some(TagCode::SetBackgroundColor) => { Tag::SetBackgroundColor(try!(tag_reader.read_rgb())) }, @@ -379,6 +379,18 @@ impl Reader { tab_index: try!(tag_reader.read_u16()), }, + Some(TagCode::SymbolClass) => { + let num_symbols = try!(tag_reader.read_u16()); + let mut symbols = Vec::with_capacity(num_symbols as usize); + for _ in 0..num_symbols { + symbols.push(SymbolClassLink { + id: try!(tag_reader.read_u16()), + class_name: try!(tag_reader.read_c_string()), + }); + } + Tag::SymbolClass(symbols) + }, + Some(TagCode::ExportAssets) => { let num_exports = try!(tag_reader.read_u16()); let mut exports = Vec::with_capacity(num_exports as usize); diff --git a/src/test_data.rs b/src/test_data.rs index f28981940..5e14e874f 100644 --- a/src/test_data.rs +++ b/src/test_data.rs @@ -335,6 +335,15 @@ pub fn tag_tests() -> Vec { vec![ (1, Tag::ShowFrame, vec![0b01_000000, 0]), + ( + 9, + Tag::SymbolClass(vec![ + SymbolClassLink { id: 2, class_name: "foo.Test".to_string() }, + SymbolClassLink { id: 0, class_name: "DocumentTest".to_string() }, + ]), + read_tag_bytes_from_file("tests/swfs/symbolclass.swf", TagCode::SymbolClass) + ), + (1, Tag::Unknown { tag_code: 512, data: vec![] }, vec![0b00_000000, 0b10000000]), (1, Tag::Unknown { tag_code: 513, data: vec![1, 2] }, vec![0b01_000010, 0b10000000, 1, 2]), ( diff --git a/src/types.rs b/src/types.rs index 1909dccec..18f0dd3e0 100644 --- a/src/types.rs +++ b/src/types.rs @@ -284,7 +284,7 @@ pub enum Tag { ImportAssets { url: String, imports: Vec }, SetBackgroundColor(Color), SetTabIndex { depth: Depth, tab_index: u16 }, - + SymbolClass(Vec), PlaceObject(Box), RemoveObject { depth: Depth, character_id: Option }, @@ -305,6 +305,12 @@ pub struct ExportedAsset { pub name: String, } +#[derive(Debug,PartialEq,Clone)] +pub struct SymbolClassLink { + pub id: CharacterId, + pub class_name: String +} + #[derive(Debug,PartialEq)] pub struct Shape { pub version: u8, diff --git a/src/write.rs b/src/write.rs index 39707026a..6bd5fec71 100644 --- a/src/write.rs +++ b/src/write.rs @@ -405,6 +405,17 @@ impl Writer { try!(self.write_i16(depth)); }, + &Tag::SymbolClass(ref symbols) => { + let len = symbols.iter().map(|e| e.class_name.len() as u32 + 3).sum::() + + 2; + try!(self.write_tag_header(TagCode::SymbolClass, len)); + try!(self.write_u16(symbols.len() as u16)); + for &SymbolClassLink {id, ref class_name} in symbols { + try!(self.write_u16(id)); + try!(self.write_c_string(class_name)); + } + }, + &Tag::FileAttributes(ref attributes) => { try!(self.write_tag_header(TagCode::FileAttributes, 4)); let mut flags = 0u32; diff --git a/tests/swfs/symbolclass.fla b/tests/swfs/symbolclass.fla new file mode 100644 index 0000000000000000000000000000000000000000..38ad679d192cb8ad69f0e3c8864a3ca4234b31d0 GIT binary patch literal 4382 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 b2VZpr>l|);;9n9S9(30Yn%%b>TCVg3#CUKG literal 0 HcmV?d00001