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