diff --git a/trunk/src/com/jpexs/decompiler/flash/Main.java b/trunk/src/com/jpexs/decompiler/flash/Main.java index 41a61d5cf..60dd4cede 100644 --- a/trunk/src/com/jpexs/decompiler/flash/Main.java +++ b/trunk/src/com/jpexs/decompiler/flash/Main.java @@ -411,8 +411,9 @@ public class Main { System.out.println(" ...opens SWF file with the decompiler GUI"); System.out.println(" 3) -proxy (-PXXX)"); System.out.println(" ...auto start proxy in the tray. Optional parameter -P specifies port for proxy. Defaults to 55555. "); - System.out.println(" 4) -export (as|pcode|image|shape|movie|sound) outdirectory infile"); + System.out.println(" 4) -export (as|pcode|image|shape|movie|sound) outdirectory infile [-selectas3class class1 class2 ...]"); System.out.println(" ...export infile sources to outdirectory as AsctionScript code (\"as\" argument) or as PCode (\"pcode\" argument), images, shapes or movies"); + System.out.println(" When \"as\" or \"pcode\" type specified, optional \"-selectas3class\" parameter can be passed to export only selected classes (ActionScript 3 only)"); System.out.println(" 5) -dumpSWF infile"); System.out.println(" ...dumps list of SWF tags to console"); System.out.println(" 6) -compress infile outfile"); @@ -425,6 +426,7 @@ public class Main { System.out.println("java -jar FFDec.jar -proxy"); System.out.println("java -jar FFDec.jar -proxy -P1234"); System.out.println("java -jar FFDec.jar -export as \"C:\\decompiled\\\" myfile.swf"); + System.out.println("java -jar FFDec.jar -export as \"C:\\decompiled\\\" myfile.swf -selectas3class com.example.MyClass com.example.SecondClass"); System.out.println("java -jar FFDec.jar -export pcode \"C:\\decompiled\\\" myfile.swf"); System.out.println("java -jar FFDec.jar -dumpSWF myfile.swf"); System.out.println("java -jar FFDec.jar -compress myfile.swf myfiledec.swf"); @@ -524,7 +526,14 @@ public class Main { exfile.exportShapes(outDir.getAbsolutePath()); exportOK = true; } else if (exportFormat.equals("as") || exportFormat.equals("pcode")) { - exportOK = exfile.exportActionScript(outDir.getAbsolutePath(), exportFormat.equals("pcode")); + if ((pos + 5 < args.length) && (args[pos + 4].equals("-selectas3class"))) { + exportOK = true; + for (int i = pos + 5; i < args.length; i++) { + exportOK = exportOK && exfile.exportAS3Class(args[i], outDir.getAbsolutePath(), exportFormat.equals("pcode")); + } + } else { + exportOK = exfile.exportActionScript(outDir.getAbsolutePath(), exportFormat.equals("pcode")); + } } else if (exportFormat.equals("movie")) { exfile.exportMovies(outDir.getAbsolutePath()); exportOK = true; diff --git a/trunk/src/com/jpexs/decompiler/flash/SWF.java b/trunk/src/com/jpexs/decompiler/flash/SWF.java index cd0a9071c..ea3ade984 100644 --- a/trunk/src/com/jpexs/decompiler/flash/SWF.java +++ b/trunk/src/com/jpexs/decompiler/flash/SWF.java @@ -17,6 +17,7 @@ package com.jpexs.decompiler.flash; import SevenZip.Compression.LZMA.Encoder; +import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.action.Action; import com.jpexs.decompiler.flash.action.ActionGraphSource; import com.jpexs.decompiler.flash.action.swf4.ActionEquals; @@ -380,6 +381,37 @@ public class SWF { return true; } + public boolean exportAS3Class(String className, String outdir, boolean isPcode) throws Exception { + List abcTags = new ArrayList(); + + for (Tag t : tags) { + if (t instanceof ABCContainerTag) { + ABCContainerTag cnt = (ABCContainerTag) t; + abcTags.add(cnt); + } + } + for (int i = 0; i < abcTags.size(); i++) { + ABC abc = abcTags.get(i).getABC(); + int scriptIndex = abc.findScriptByPath(className); + if (scriptIndex > -1) { + String cnt = ""; + if (abc.script_info.length > 1) { + cnt = "script " + (i + 1) + "/" + abc.script_info.length + " "; + } + String path = abc.script_info[scriptIndex].getPath(abc); + String packageName = path.substring(0, path.lastIndexOf(".")); + if (packageName.equals("")) { + path = path.substring(1); + } + String exStr = "Exporting " + "tag " + (i + 1) + "/" + abcTags.size() + " " + cnt + path + " ..."; + informListeners("export", exStr); + abc.script_info[scriptIndex].export(abc, abcTags, outdir, isPcode); + return true; + } + } + return false; + } + public boolean exportActionScript(String outdir, boolean isPcode) throws Exception { boolean asV3Found = false; final EventListener evl = new EventListener() { diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/ABC.java b/trunk/src/com/jpexs/decompiler/flash/abc/ABC.java index 4a600cced..f3cd9d909 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/ABC.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/ABC.java @@ -872,4 +872,13 @@ public class ABC { } return -1; } + public int findScriptByPath(String name) { + for (int c = 0; c < script_info.length; c++) { + String s = script_info[c].getPath(this); + if (name.equals(s)) { + return c; + } + } + return -1; + } } diff --git a/trunk/src/com/jpexs/decompiler/flash/graph/Graph.java b/trunk/src/com/jpexs/decompiler/flash/graph/Graph.java index c4c49c7a9..33db9edd8 100644 --- a/trunk/src/com/jpexs/decompiler/flash/graph/Graph.java +++ b/trunk/src/com/jpexs/decompiler/flash/graph/Graph.java @@ -1019,7 +1019,7 @@ public class Graph { checkContinueAtTheEnd(retw, whileTrueLoop); List finalCommands = forFinalCommands.get(whileTrueLoop); IfItem ifi = null; - if (!finalCommands.isEmpty()) { + if ((finalCommands!=null) && !finalCommands.isEmpty()) { if (finalCommands.get(finalCommands.size() - 1) instanceof IfItem) { ifi = (IfItem) finalCommands.get(finalCommands.size() - 1); finalCommands.remove(finalCommands.size() - 1);