chore: switch to num-derive crate
This commit is contained in:
parent
dbb4167e9e
commit
120f94711a
|
@ -11,9 +11,9 @@ description = "Read and write the Adobe Flash SWF file format."
|
|||
[dependencies]
|
||||
clippy = {version = "*", optional = true}
|
||||
byteorder = "1.0"
|
||||
enum_primitive = "0.1.1"
|
||||
flate2 = "1.0"
|
||||
num = "0.1"
|
||||
num-derive = "0.2"
|
||||
num-traits = "0.2"
|
||||
xz2 = "0.1.5"
|
||||
|
||||
[features]
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
enum_from_primitive! {
|
||||
#[allow(dead_code)]
|
||||
#[derive(Debug,PartialEq,Clone,Copy)]
|
||||
#[derive(Debug,PartialEq,Clone,Copy,FromPrimitive)]
|
||||
pub enum OpCode {
|
||||
End = 0x00,
|
||||
|
||||
|
@ -117,4 +116,3 @@ pub enum OpCode {
|
|||
Call = 0x9E,
|
||||
GotoFrame2 = 0x9F,
|
||||
}
|
||||
}
|
||||
|
|
239
src/avm1/read.rs
239
src/avm1/read.rs
|
@ -31,82 +31,83 @@ impl<R: Read> Reader<R> {
|
|||
}
|
||||
|
||||
pub fn read_action(&mut self) -> Result<Option<Action>> {
|
||||
use num_traits::FromPrimitive;
|
||||
|
||||
let (opcode, length) = try!(self.read_opcode_and_length());
|
||||
|
||||
let mut action_reader = Reader::new(self.inner.by_ref().take(length as u64), self.version);
|
||||
|
||||
use num::FromPrimitive;
|
||||
let action = if let Some(op) = OpCode::from_u8(opcode) {
|
||||
match op {
|
||||
OpCode::End => return Ok(None),
|
||||
match op {
|
||||
OpCode::End => return Ok(None),
|
||||
|
||||
OpCode::Add => Action::Add,
|
||||
OpCode::Add2 => Action::Add2,
|
||||
OpCode::And => Action::And,
|
||||
OpCode::AsciiToChar => Action::AsciiToChar,
|
||||
OpCode::BitAnd => Action::BitAnd,
|
||||
OpCode::BitLShift => Action::BitLShift,
|
||||
OpCode::BitOr => Action::BitOr,
|
||||
OpCode::BitRShift => Action::BitRShift,
|
||||
OpCode::BitURShift => Action::BitURShift,
|
||||
OpCode::BitXor => Action::BitXor,
|
||||
OpCode::Call => Action::Call,
|
||||
OpCode::CallFunction => Action::CallFunction,
|
||||
OpCode::CallMethod => Action::CallMethod,
|
||||
OpCode::CastOp => Action::CastOp,
|
||||
OpCode::CharToAscii => Action::CharToAscii,
|
||||
OpCode::CloneSprite => Action::CloneSprite,
|
||||
OpCode::Add => Action::Add,
|
||||
OpCode::Add2 => Action::Add2,
|
||||
OpCode::And => Action::And,
|
||||
OpCode::AsciiToChar => Action::AsciiToChar,
|
||||
OpCode::BitAnd => Action::BitAnd,
|
||||
OpCode::BitLShift => Action::BitLShift,
|
||||
OpCode::BitOr => Action::BitOr,
|
||||
OpCode::BitRShift => Action::BitRShift,
|
||||
OpCode::BitURShift => Action::BitURShift,
|
||||
OpCode::BitXor => Action::BitXor,
|
||||
OpCode::Call => Action::Call,
|
||||
OpCode::CallFunction => Action::CallFunction,
|
||||
OpCode::CallMethod => Action::CallMethod,
|
||||
OpCode::CastOp => Action::CastOp,
|
||||
OpCode::CharToAscii => Action::CharToAscii,
|
||||
OpCode::CloneSprite => Action::CloneSprite,
|
||||
OpCode::ConstantPool => {
|
||||
let mut constants = vec![];
|
||||
for _ in 0..action_reader.read_u16()? {
|
||||
constants.push(action_reader.read_c_string()?);
|
||||
}
|
||||
Action::ConstantPool(constants)
|
||||
}
|
||||
OpCode::Decrement => Action::Decrement,
|
||||
OpCode::DefineFunction => action_reader.read_define_function()?,
|
||||
OpCode::DefineFunction2 => action_reader.read_define_function_2()?,
|
||||
OpCode::DefineLocal => Action::DefineLocal,
|
||||
OpCode::DefineLocal2 => Action::DefineLocal2,
|
||||
OpCode::Delete => Action::Delete,
|
||||
OpCode::Delete2 => Action::Delete2,
|
||||
OpCode::Divide => Action::Divide,
|
||||
OpCode::EndDrag => Action::EndDrag,
|
||||
OpCode::Enumerate => Action::Enumerate,
|
||||
OpCode::Enumerate2 => Action::Enumerate2,
|
||||
OpCode::Equals => Action::Equals,
|
||||
OpCode::Equals2 => Action::Equals2,
|
||||
OpCode::Extends => Action::Extends,
|
||||
OpCode::GetMember => Action::GetMember,
|
||||
OpCode::GetProperty => Action::GetProperty,
|
||||
OpCode::GetTime => Action::GetTime,
|
||||
}
|
||||
OpCode::Decrement => Action::Decrement,
|
||||
OpCode::DefineFunction => action_reader.read_define_function()?,
|
||||
OpCode::DefineFunction2 => action_reader.read_define_function_2()?,
|
||||
OpCode::DefineLocal => Action::DefineLocal,
|
||||
OpCode::DefineLocal2 => Action::DefineLocal2,
|
||||
OpCode::Delete => Action::Delete,
|
||||
OpCode::Delete2 => Action::Delete2,
|
||||
OpCode::Divide => Action::Divide,
|
||||
OpCode::EndDrag => Action::EndDrag,
|
||||
OpCode::Enumerate => Action::Enumerate,
|
||||
OpCode::Enumerate2 => Action::Enumerate2,
|
||||
OpCode::Equals => Action::Equals,
|
||||
OpCode::Equals2 => Action::Equals2,
|
||||
OpCode::Extends => Action::Extends,
|
||||
OpCode::GetMember => Action::GetMember,
|
||||
OpCode::GetProperty => Action::GetProperty,
|
||||
OpCode::GetTime => Action::GetTime,
|
||||
OpCode::GetUrl => Action::GetUrl {
|
||||
url: try!(action_reader.read_c_string()),
|
||||
target: try!(action_reader.read_c_string()),
|
||||
},
|
||||
},
|
||||
OpCode::GetUrl2 => {
|
||||
let flags = try!(action_reader.read_u8());
|
||||
Action::GetUrl2 {
|
||||
is_target_sprite: flags & 0b10 != 0,
|
||||
is_load_vars: flags & 0b1 != 0,
|
||||
send_vars_method: match flags >> 6 {
|
||||
0 => SendVarsMethod::None,
|
||||
1 => SendVarsMethod::Get,
|
||||
2 => SendVarsMethod::Post,
|
||||
send_vars_method: match flags >> 6 {
|
||||
0 => SendVarsMethod::None,
|
||||
1 => SendVarsMethod::Get,
|
||||
2 => SendVarsMethod::Post,
|
||||
_ => {
|
||||
return Err(Error::new(
|
||||
ErrorKind::InvalidData,
|
||||
"Invalid HTTP method in ActionGetUrl2",
|
||||
))
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
OpCode::GetVariable => Action::GetVariable,
|
||||
}
|
||||
OpCode::GetVariable => Action::GetVariable,
|
||||
OpCode::GotoFrame => {
|
||||
let frame = try!(action_reader.read_u16());
|
||||
Action::GotoFrame(frame)
|
||||
}
|
||||
}
|
||||
OpCode::GotoFrame2 => {
|
||||
let flags = try!(action_reader.read_u8());
|
||||
Action::GotoFrame2 {
|
||||
|
@ -117,32 +118,32 @@ impl<R: Read> Reader<R> {
|
|||
0
|
||||
},
|
||||
}
|
||||
}
|
||||
OpCode::GotoLabel => Action::GotoLabel(try!(action_reader.read_c_string())),
|
||||
OpCode::Greater => Action::Greater,
|
||||
OpCode::If => Action::If { offset: try!(action_reader.read_i16()) },
|
||||
OpCode::ImplementsOp => Action::ImplementsOp,
|
||||
OpCode::Increment => Action::Increment,
|
||||
OpCode::InitArray => Action::InitArray,
|
||||
OpCode::InitObject => Action::InitObject,
|
||||
OpCode::InstanceOf => Action::InstanceOf,
|
||||
OpCode::Jump => Action::Jump { offset: try!(action_reader.read_i16()) },
|
||||
OpCode::Less => Action::Less,
|
||||
OpCode::Less2 => Action::Less2,
|
||||
OpCode::MBAsciiToChar => Action::MBAsciiToChar,
|
||||
OpCode::MBCharToAscii => Action::MBCharToAscii,
|
||||
OpCode::MBStringExtract => Action::MBStringExtract,
|
||||
OpCode::MBStringLength => Action::MBStringLength,
|
||||
OpCode::Modulo => Action::Modulo,
|
||||
OpCode::Multiply => Action::Multiply,
|
||||
OpCode::NewMethod => Action::NewMethod,
|
||||
OpCode::NewObject => Action::NewObject,
|
||||
OpCode::NextFrame => Action::NextFrame,
|
||||
OpCode::Not => Action::Not,
|
||||
OpCode::Or => Action::Or,
|
||||
OpCode::Play => Action::Play,
|
||||
OpCode::Pop => Action::Pop,
|
||||
OpCode::PreviousFrame => Action::PreviousFrame,
|
||||
}
|
||||
OpCode::GotoLabel => Action::GotoLabel(try!(action_reader.read_c_string())),
|
||||
OpCode::Greater => Action::Greater,
|
||||
OpCode::If => Action::If { offset: try!(action_reader.read_i16()) },
|
||||
OpCode::ImplementsOp => Action::ImplementsOp,
|
||||
OpCode::Increment => Action::Increment,
|
||||
OpCode::InitArray => Action::InitArray,
|
||||
OpCode::InitObject => Action::InitObject,
|
||||
OpCode::InstanceOf => Action::InstanceOf,
|
||||
OpCode::Jump => Action::Jump { offset: try!(action_reader.read_i16()) },
|
||||
OpCode::Less => Action::Less,
|
||||
OpCode::Less2 => Action::Less2,
|
||||
OpCode::MBAsciiToChar => Action::MBAsciiToChar,
|
||||
OpCode::MBCharToAscii => Action::MBCharToAscii,
|
||||
OpCode::MBStringExtract => Action::MBStringExtract,
|
||||
OpCode::MBStringLength => Action::MBStringLength,
|
||||
OpCode::Modulo => Action::Modulo,
|
||||
OpCode::Multiply => Action::Multiply,
|
||||
OpCode::NewMethod => Action::NewMethod,
|
||||
OpCode::NewObject => Action::NewObject,
|
||||
OpCode::NextFrame => Action::NextFrame,
|
||||
OpCode::Not => Action::Not,
|
||||
OpCode::Or => Action::Or,
|
||||
OpCode::Play => Action::Play,
|
||||
OpCode::Pop => Action::Pop,
|
||||
OpCode::PreviousFrame => Action::PreviousFrame,
|
||||
// TODO: Verify correct version for complex types.
|
||||
OpCode::Push => {
|
||||
let mut values = vec![];
|
||||
|
@ -150,42 +151,42 @@ impl<R: Read> Reader<R> {
|
|||
values.push(value);
|
||||
}
|
||||
Action::Push(values)
|
||||
}
|
||||
OpCode::PushDuplicate => Action::PushDuplicate,
|
||||
OpCode::RandomNumber => Action::RandomNumber,
|
||||
OpCode::RemoveSprite => Action::RemoveSprite,
|
||||
OpCode::Return => Action::Return,
|
||||
OpCode::SetMember => Action::SetMember,
|
||||
OpCode::SetProperty => Action::SetProperty,
|
||||
OpCode::SetTarget => Action::SetTarget(action_reader.read_c_string()?),
|
||||
OpCode::SetTarget2 => Action::SetTarget2,
|
||||
OpCode::SetVariable => Action::SetVariable,
|
||||
OpCode::StackSwap => Action::StackSwap,
|
||||
OpCode::StartDrag => Action::StartDrag,
|
||||
OpCode::Stop => Action::Stop,
|
||||
OpCode::StopSounds => Action::StopSounds,
|
||||
OpCode::StoreRegister => Action::StoreRegister(action_reader.read_u8()?),
|
||||
OpCode::StrictEquals => Action::StrictEquals,
|
||||
OpCode::StringAdd => Action::StringAdd,
|
||||
OpCode::StringEquals => Action::StringEquals,
|
||||
OpCode::StringExtract => Action::StringExtract,
|
||||
OpCode::StringGreater => Action::StringGreater,
|
||||
OpCode::StringLength => Action::StringLength,
|
||||
OpCode::StringLess => Action::StringLess,
|
||||
OpCode::Subtract => Action::Subtract,
|
||||
OpCode::TargetPath => Action::TargetPath,
|
||||
OpCode::Throw => Action::Throw,
|
||||
OpCode::ToggleQuality => Action::ToggleQuality,
|
||||
OpCode::ToInteger => Action::ToInteger,
|
||||
OpCode::ToNumber => Action::ToNumber,
|
||||
OpCode::ToString => Action::ToString,
|
||||
OpCode::Trace => Action::Trace,
|
||||
OpCode::Try => action_reader.read_try()?,
|
||||
OpCode::TypeOf => Action::TypeOf,
|
||||
}
|
||||
OpCode::PushDuplicate => Action::PushDuplicate,
|
||||
OpCode::RandomNumber => Action::RandomNumber,
|
||||
OpCode::RemoveSprite => Action::RemoveSprite,
|
||||
OpCode::Return => Action::Return,
|
||||
OpCode::SetMember => Action::SetMember,
|
||||
OpCode::SetProperty => Action::SetProperty,
|
||||
OpCode::SetTarget => Action::SetTarget(action_reader.read_c_string()?),
|
||||
OpCode::SetTarget2 => Action::SetTarget2,
|
||||
OpCode::SetVariable => Action::SetVariable,
|
||||
OpCode::StackSwap => Action::StackSwap,
|
||||
OpCode::StartDrag => Action::StartDrag,
|
||||
OpCode::Stop => Action::Stop,
|
||||
OpCode::StopSounds => Action::StopSounds,
|
||||
OpCode::StoreRegister => Action::StoreRegister(action_reader.read_u8()?),
|
||||
OpCode::StrictEquals => Action::StrictEquals,
|
||||
OpCode::StringAdd => Action::StringAdd,
|
||||
OpCode::StringEquals => Action::StringEquals,
|
||||
OpCode::StringExtract => Action::StringExtract,
|
||||
OpCode::StringGreater => Action::StringGreater,
|
||||
OpCode::StringLength => Action::StringLength,
|
||||
OpCode::StringLess => Action::StringLess,
|
||||
OpCode::Subtract => Action::Subtract,
|
||||
OpCode::TargetPath => Action::TargetPath,
|
||||
OpCode::Throw => Action::Throw,
|
||||
OpCode::ToggleQuality => Action::ToggleQuality,
|
||||
OpCode::ToInteger => Action::ToInteger,
|
||||
OpCode::ToNumber => Action::ToNumber,
|
||||
OpCode::ToString => Action::ToString,
|
||||
OpCode::Trace => Action::Trace,
|
||||
OpCode::Try => action_reader.read_try()?,
|
||||
OpCode::TypeOf => Action::TypeOf,
|
||||
OpCode::WaitForFrame => Action::WaitForFrame {
|
||||
frame: try!(action_reader.read_u16()),
|
||||
num_actions_to_skip: try!(action_reader.read_u8()),
|
||||
},
|
||||
},
|
||||
OpCode::With => {
|
||||
let code_length = action_reader.read_u16()?;
|
||||
let mut with_reader = Reader::new(
|
||||
|
@ -193,10 +194,10 @@ impl<R: Read> Reader<R> {
|
|||
self.version,
|
||||
);
|
||||
Action::With { actions: with_reader.read_action_list()? }
|
||||
}
|
||||
}
|
||||
OpCode::WaitForFrame2 => Action::WaitForFrame2 {
|
||||
num_actions_to_skip: try!(action_reader.read_u8()),
|
||||
},
|
||||
},
|
||||
}
|
||||
} else {
|
||||
action_reader.read_unknown_action(opcode, length)?
|
||||
|
@ -225,23 +226,23 @@ impl<R: Read> Reader<R> {
|
|||
}
|
||||
|
||||
fn read_push_value(&mut self) -> Result<Value> {
|
||||
let value = match try!(self.read_u8()) {
|
||||
0 => Value::Str(try!(self.read_c_string())),
|
||||
1 => Value::Float(try!(self.read_f32())),
|
||||
2 => Value::Null,
|
||||
3 => Value::Undefined,
|
||||
4 => Value::Register(try!(self.read_u8())),
|
||||
5 => Value::Bool(try!(self.read_u8()) != 0),
|
||||
6 => Value::Double(try!(self.read_f64())),
|
||||
7 => Value::Int(try!(self.read_u32())),
|
||||
8 => Value::ConstantPool(try!(self.read_u8()) as u16),
|
||||
9 => Value::ConstantPool(try!(self.read_u16())),
|
||||
let value = match try!(self.read_u8()) {
|
||||
0 => Value::Str(try!(self.read_c_string())),
|
||||
1 => Value::Float(try!(self.read_f32())),
|
||||
2 => Value::Null,
|
||||
3 => Value::Undefined,
|
||||
4 => Value::Register(try!(self.read_u8())),
|
||||
5 => Value::Bool(try!(self.read_u8()) != 0),
|
||||
6 => Value::Double(try!(self.read_f64())),
|
||||
7 => Value::Int(try!(self.read_u32())),
|
||||
8 => Value::ConstantPool(try!(self.read_u8()) as u16),
|
||||
9 => Value::ConstantPool(try!(self.read_u16())),
|
||||
_ => {
|
||||
return Err(Error::new(
|
||||
ErrorKind::InvalidData,
|
||||
"Invalid value type in ActionPush",
|
||||
))
|
||||
}
|
||||
}
|
||||
};
|
||||
Ok(value)
|
||||
}
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
enum_from_primitive! {
|
||||
#[allow(dead_code)]
|
||||
#[derive(Debug,PartialEq,Clone,Copy)]
|
||||
#[derive(Debug,PartialEq,Clone,Copy,FromPrimitive)]
|
||||
pub enum OpCode {
|
||||
Add = 0xA0,
|
||||
AddI = 0xC5,
|
||||
|
@ -146,4 +145,3 @@ pub enum OpCode {
|
|||
TypeOf = 0x95,
|
||||
URShift = 0xa7,
|
||||
}
|
||||
}
|
||||
|
|
|
@ -517,7 +517,7 @@ impl<R: Read> Reader<R> {
|
|||
|
||||
fn read_op(&mut self) -> Result<Option<Op>> {
|
||||
use avm2::opcode::OpCode;
|
||||
use num::FromPrimitive;
|
||||
use num_traits::FromPrimitive;
|
||||
|
||||
let opcode = match OpCode::from_u8(self.read_u8()?) {
|
||||
Some(o) => o,
|
||||
|
|
|
@ -10,10 +10,10 @@
|
|||
#![cfg_attr(feature = "clippy", plugin(clippy))]
|
||||
|
||||
extern crate byteorder;
|
||||
#[macro_use]
|
||||
extern crate enum_primitive;
|
||||
extern crate flate2;
|
||||
extern crate num;
|
||||
#[macro_use]
|
||||
extern crate num_derive;
|
||||
extern crate num_traits;
|
||||
extern crate xz2;
|
||||
|
||||
pub mod avm1;
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
|
||||
use byteorder::{LittleEndian, ReadBytesExt};
|
||||
use flate2::read::ZlibDecoder;
|
||||
use num::FromPrimitive;
|
||||
use std::collections::HashSet;
|
||||
use std::io::{Error, ErrorKind, Read, Result};
|
||||
use types::*;
|
||||
|
@ -409,6 +408,8 @@ impl<R: Read> Reader<R> {
|
|||
}
|
||||
|
||||
fn read_tag(&mut self) -> Result<Option<Tag>> {
|
||||
use num_traits::FromPrimitive;
|
||||
|
||||
let (tag_code, length) = self.read_tag_code_and_length()?;
|
||||
|
||||
let mut tag_reader = Reader::new(self.input.by_ref().take(length as u64), self.version);
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
enum_from_primitive! {
|
||||
#[allow(dead_code)]
|
||||
#[derive(Debug,PartialEq,Clone,Copy)]
|
||||
#[derive(Debug,PartialEq,Clone,Copy,FromPrimitive)]
|
||||
pub enum TagCode {
|
||||
End = 0,
|
||||
ShowFrame = 1,
|
||||
|
@ -86,4 +85,3 @@ pub enum TagCode {
|
|||
EnableTelemetry = 93,
|
||||
PlaceObject4 = 94,
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue