Пример #1
0
        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;
            }
        }
Пример #2
0
        /// <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));
        }
Пример #3
0
        /// <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));
        }
Пример #4
0
        public static SwfHeader ReadSwfHeader(this ISwfStreamReader reader)
        {
            var header = new SwfHeader {
                FrameSize  = reader.ReadRect(),
                FrameRate  = reader.ReadFixedPoint8(),
                FrameCount = reader.ReadUInt16()
            };

            return(header);
        }
Пример #5
0
        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);
            }
        }
Пример #6
0
        /// <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);
        }
Пример #7
0
        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);
        }
Пример #8
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();
        }
Пример #9
0
        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");
        }
Пример #10
0
 public static void WriteSwfHeader(this ISwfStreamWriter writer, SwfHeader header)
 {
     writer.WriteRect(header.FrameSize);
     writer.WriteFixedPoint8(header.FrameRate);
     writer.WriteUInt16(header.FrameCount);
 }
Пример #11
0
        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);
            }
        }