SWF inner Classes and Symbols

by bkzen
SWF 内の public なクラスと Symbol を表示する。
♥14 | Line 96 | Modified 2010-12-21 10:50:53 | MIT License
play

ActionScript3 source code

/**
 * Copyright bkzen ( http://wonderfl.net/user/bkzen )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/sDvj
 */

package  
{
    import com.bit101.components.PushButton;
    import com.bit101.components.TextArea;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.FileFilter;
    import flash.net.FileReference;
    import flash.utils.ByteArray;
    import org.libspark.swfassist.io.ByteArrayInputStream;
    import org.libspark.swfassist.swf.io.ReadingContext;
    import org.libspark.swfassist.swf.io.SWFReader;
    import org.libspark.swfassist.swf.structures.Asset;
    import org.libspark.swfassist.swf.structures.SWF;
    import org.libspark.swfassist.swf.tags.AbstractTag;
    import org.libspark.swfassist.swf.tags.DoABC;
    import org.libspark.swfassist.swf.tags.SymbolClass;
    import org.libspark.swfassist.swf.tags.TagCodeConstants;
    
    /**
     * SWF 内の public なクラスとシンボル一覧
     * @author jc at bk-zen.com
     */
    [SWF (backgroundColor = "0xFFFFFF", frameRate = "30", width = "465", height = "465")]
    public class SWFInnerClassViewer extends Sprite 
    {
        private var loadBtn: PushButton;
        private var file: FileReference;
        private var symbols: Array;
        private var classes: Array;
        private var text: TextArea;
        
        public function SWFInnerClassViewer() 
        {
            file = new FileReference();
            file.addEventListener(Event.SELECT, onSelectSWF);
            file.addEventListener(Event.COMPLETE, onLoadSWF);
            loadBtn = new PushButton(this, 0, 0, "load swf", onClickLoad);
            text = new TextArea(this, 0, loadBtn.height, "");
            text.setSize(stage.stageWidth, stage.stageHeight - loadBtn.height);
        }
        
        private function onClickLoad(e: Event):void 
        {
            file.browse([new FileFilter("swf", "*.swf")]);
        }
        
        private function onSelectSWF(e:Event):void 
        {
            symbols = [], classes = [];
            file.load();
        }
        
        private function onLoadSWF(e:Event):void 
        {
            var swfReader: SWFReader = new SWFReader();
            var context: ReadingContext = new ReadingContext();
            context.needsABCData = true;
            var swf: SWF = swfReader.readSWF(new ByteArrayInputStream(file.data), context);
            var tags: Array = swf.tags.tags, i: int, n: int = swf.tags.numTags;
            for (i = 0; i < n; i ++)
            {
                var t: AbstractTag = tags[i];
                read(t);
            }
            symbols.sort();
            classes.sort();
            text.text  = "--- Symbols ---\n" + symbols.join("\n");
            text.text += "\n--- Classes ---\n" + classes.join("\n");
        }
        
        private function read(t:AbstractTag):void 
        {
            var i: int, n: int, a: Array, name: String;
            switch (t.code)
            {
                case TagCodeConstants.TAG_SYMBOL_CLASS:
                    a = SymbolClass(t).symbols, n = a.length;
                    for (i = 0; i < n; i ++)
                    {
                        if (a[i] is Asset)
                        {
                            name = (a[i] as Asset).name;
                            if (name.indexOf("__Packages.") == 0 && classes.indexOf(name) < 0) classes.push(name);
                            else if (symbols.indexOf(name) < 0) symbols.push(name);
                        }
                    }
                break;
                case TagCodeConstants.TAG_DO_ABC:
                    a = getNamesByABC(new ByteArrayInputStream(DoABC(t).abcData)), n = a.length;
                    for (i = 0; i < n; i ++)
                    {
                        classes.push(a[i]);
                    }
                break;
            }
        }
        
        private function getNamesByABC(abcData:ByteArrayInputStream): Array
        {
            var res: Array = [];
            var str: String = abcData.readUTF();
            if (str) res.push(str.replace(/\//g, "."));
            return res;
        }
    }
}

Forked