public void Parse(byte[] data) { { SwfHeader header; RawData = SwfHeader.GetHeader(data, out header); Header = header; } int offset = Header.HeaderLength; Tags = new List <SwfTag>(); while (true) { SwfTag tag = GetTag(RawData, offset); if (tag == null) { break; } Tags.Add(tag); offset += tag.Length; } }
/// <summary> /// Read swf (header and tags), this is the only public method of <see cref="SwfOp.IO.SwfReader">SwfReader</see> /// </summary> public Swf ReadSwf() { // compressed swf? if (br.PeekChar() == 'C') { inflate(); } SwfHeader header = ReadHeader(); this.version = header.Version; ArrayList tagList = new ArrayList(); while (br.BaseStream.Position < br.BaseStream.Length) { BaseTag b = this.ReadTag(); tagList.Add(b); } ; BaseTag[] tags = new BaseTag[tagList.Count]; tagList.CopyTo(tags, 0); br.Close(); return(new Swf(header, tags)); }
/// <summary> /// Read swf (header and tags), this is the only public method of <see cref="SwfOp.IO.SwfReader">SwfReader</see> /// </summary> public Swf ReadSwf() { // compressed swf? if (br.PeekChar() == 'C') { inflate(); } SwfHeader header = ReadHeader(); this.version = header.Version; ArrayList tagList = new ArrayList(); try { streamEnd = br.BaseStream.Length; while (br.BaseStream.Position < streamEnd) { BaseTag b = this.ReadTag(); tagList.Add(b); } ; } catch (Exception eos) { Console.WriteLine("-- Error: Tag reader error: [" + eos.Message + "]"); } BaseTag[] tags = new BaseTag[tagList.Count]; tagList.CopyTo(tags, 0); br.Close(); return(new Swf(header, tags)); }
public static SwfHeader ReadSwfHeader(this ISwfStreamReader reader) { var header = new SwfHeader { FrameSize = reader.ReadRect(), FrameRate = reader.ReadFixedPoint8(), FrameCount = reader.ReadUInt16() }; return(header); }
public void RunHeaderTest(byte[] source, SwfCompression expectedCompression, byte expectedVersion, int expectedLength) { // use a memory stream for testing using (MemoryStream stream = new MemoryStream(source)) { SwfHeader header = SwfHeader.FromStream(stream); Assert.AreEqual(expectedCompression, header.Compression); Assert.AreEqual(expectedVersion, header.Version); Assert.AreEqual(expectedLength, header.FileLength); } }
/// <summary> /// Reads and parses swf header information into an instance of <see cref="SwfOp.Data.SwfHeader">SwfHeader</see> /// </summary> protected SwfHeader ReadHeader() { SwfHeader h = new SwfHeader( br.ReadChars(3), br.ReadByte(), br.ReadUInt32(), this.ReadRectData(), br.ReadUInt16(), br.ReadUInt16() ); this.version = h.Version; return(h); }
public static int Main(string[] args) { bool preserveComments = false; // parse options passed in from command line OptionSet options = new OptionSet() { { "c|preserve-comments", "Try to preserve comments from ActionScript code in generated JavaScript code", v => preserveComments = v != null } }; List <string> extras; try { extras = options.Parse(args); } catch (OptionException e) { Console.Error.Write("unflash: "); Console.Error.WriteLine(e.Message); return(1); } // extras must have at least one instance: the file uri if (extras.Count == 0) { Console.Error.WriteLine("unflash: Please pass in the location of the SWF file as the first argument"); return(1); } // check to see if the file uri exists string fileUri = extras[0]; if (!File.Exists(fileUri)) { Console.Error.WriteLine(String.Format("unflash: Unable to find file {0}", fileUri)); return(1); } Console.WriteLine("Beginning file read..."); using (FileStream f = File.Open(fileUri, FileMode.Open)) Console.WriteLine(SwfHeader.FromStream(f)); return(0); }
/// <summary> /// Writes the (compressed or uncompressed) swf data to a stream. /// The stream gets flushed and closed afterwards. /// </summary> public void Write(Swf swf) { swf.UpdateData(); // update tag lengths to adapt to bytecode length SwfHeader header = swf.Header; BinaryWriter writer = new BinaryWriter(baseStream, System.Text.Encoding.GetEncoding("ascii")); // ASCII seems to be ok for Flash 5 and 6+ as well BinaryWriter dataWriter = writer; bool isCompressed = (header.Signature[0] == 'C'); if (isCompressed) { // SharpZipLib makes it easy for us, simply chain a Deflater into the stream DeflaterOutputStream def = new DeflaterOutputStream(baseStream); dataWriter = new BinaryWriter(def); } // writer header data, always uncompressed writer.Write(header.Signature); writer.Write(swf.Version); writer.Write(swf.ByteCount); writer.Flush(); // write header data pt.2, using either original stream or deflater stream dataWriter.Write(header.Rect); dataWriter.Write(header.Fps); dataWriter.Write(header.Frames); // write tag data foreach (BaseTag tag in swf) { dataWriter.Write(tag.Data); } // flush + close dataWriter.Flush(); dataWriter.Close(); }
public void WriteSwfHeaderTest() { var hdr = new SwfHeader { FrameSize = new SwfRect { XMin = 0x004, XMax = 0x48f, YMin = 0x008, YMax = 0x0ee }, FrameCount = 10, FrameRate = 12.25 }; var mem = new MemoryStream(); var writer = new SwfStreamWriter(mem); writer.WriteSwfHeader(hdr); mem.Seek(0, SeekOrigin.Begin); Assert.AreEqual(0x60, mem.ReadByte(), "Byte 0"); Assert.AreEqual(0x02, mem.ReadByte(), "Byte 1"); Assert.AreEqual(0x24, mem.ReadByte(), "Byte 2"); Assert.AreEqual(0x78, mem.ReadByte(), "Byte 3"); Assert.AreEqual(0x04, mem.ReadByte(), "Byte 4"); Assert.AreEqual(0x07, mem.ReadByte(), "Byte 5"); Assert.AreEqual(0x70, mem.ReadByte(), "Byte 6"); Assert.AreEqual(64, mem.ReadByte(), "Byte 7"); Assert.AreEqual(12, mem.ReadByte(), "Byte 8"); Assert.AreEqual(10, mem.ReadByte(), "Byte 9"); Assert.AreEqual(0, mem.ReadByte(), "Byte 10"); Assert.AreEqual(mem.Length, mem.Position, "Should reach end of the stream"); }
public static void WriteSwfHeader(this ISwfStreamWriter writer, SwfHeader header) { writer.WriteRect(header.FrameSize); writer.WriteFixedPoint8(header.FrameRate); writer.WriteUInt16(header.FrameCount); }
private void ExploreSWF(Stream stream) { SwfExportTagReader reader = new SwfExportTagReader(stream); Swf swf = null; try { swf = reader.ReadSwf(); } catch (Exception ex) { Errors.Add("Swf error: " + ex.Message); } if (swf == null) { return; } Header = swf.Header; // list tags currentFrame = 0; DeclEntry frame = new DeclEntry("Frame 0"); Frames.Add(frame); foreach (BaseTag tag in swf) { if (tag is ExportTag) { ExportTag exportTag = tag as ExportTag; foreach (string name in exportTag.Names) { if (name.StartsWith("__Packages.")) { string cname = name.Substring(11); Classes.Add(new DeclEntry(cname)); } else { Symbols.Add(new DeclEntry(name)); } } } else if (tag is DoActionTag) { AbcSize += tag.Data.Length; } else if (tag is AbcTag) { ExploreABC((tag as AbcTag).abc); AbcSize += tag.Data.Length; } else if ((TagCodeEnum)tag.TagCode == TagCodeEnum.ShowFrame) { currentFrame++; frame = new DeclEntry("Frame " + currentFrame); Frames.Add(frame); } else if (tag is FrameTag) { frame.Name = (tag as FrameTag).name; } else if (tag is DefineFontTag) { DefineFontTag ftag = tag as DefineFontTag; string style = ""; if (ftag.IsBold) { style += "Bold "; } if (ftag.IsItalics) { style += "Italic "; } Fonts.Add(new DeclEntry(ftag.Name + " (" + style + ftag.GlyphCount + ")")); FontsSize += tag.Size; } else if ((TagCodeEnum)tag.TagCode == TagCodeEnum.FileAttributes) { ParseAttributes(tag); } else if ((TagCodeEnum)tag.TagCode == TagCodeEnum.SetBackgroundColor) { FileAttributes.Background = (tag.Data[2] << 16 | tag.Data[3] << 8 | tag.Data[4]).ToString("X"); while (FileAttributes.Background.Length < 6) { FileAttributes.Background = "0" + FileAttributes.Background; } FileAttributes.Background = "#" + FileAttributes.Background; } if (tag is DoActionTag || tag is AbcTag) { frame.AbcSize += tag.Size; } else if (tag is DefineFontTag) { frame.FontSize += tag.Size; } else { frame.DataSize += tag.Size; } TotalSize += tag.Size; } // empty frame at the end if (Frames.Count > 1 && frame.DataSize == 4) { Frames.Remove(frame); } }