replace AtionScript from command line

This commit is contained in:
2014-09-02 23:38:56 +02:00
parent f62156584b
commit 9b54c8db8f
14 changed files with 131 additions and 104 deletions
@@ -27,6 +27,7 @@ import com.jpexs.decompiler.flash.abc.ClassPath;
import com.jpexs.decompiler.flash.abc.RenameType;
import com.jpexs.decompiler.flash.abc.ScriptPack;
import com.jpexs.decompiler.flash.abc.avm2.parser.script.ActionScriptParser;
import com.jpexs.decompiler.flash.action.parser.ParseException;
import com.jpexs.decompiler.flash.configuration.Configuration;
import com.jpexs.decompiler.flash.configuration.ConfigurationItem;
import com.jpexs.decompiler.flash.exporters.BinaryDataExporter;
@@ -73,6 +74,7 @@ import com.jpexs.decompiler.flash.types.ColorTransform;
import com.jpexs.decompiler.flash.types.RECT;
import com.jpexs.decompiler.flash.types.sound.SoundFormat;
import com.jpexs.decompiler.flash.xfl.FLAVersion;
import com.jpexs.decompiler.graph.CompilationException;
import com.jpexs.helpers.Helper;
import com.jpexs.helpers.Path;
import com.jpexs.helpers.streams.SeekableInputStream;
@@ -251,8 +253,8 @@ public class CommandLineArgumentParser {
out.println(" ...converts FlashPaper SWF file <infile> to PDF <outfile>. Use -zoom parameter to specify image quality.");
out.println(" " + (cnt++) + ") -zoom <N>");
out.println(" ...apply zoom during export (currently for FlashPaper conversion only)");
out.println(" " + (cnt++) + ") -replace <infile> <outfile> <characterId> <importDataFile>");
out.println(" ...replaces the data of the specified BinaryData, Image or DefineSound tag");
out.println(" " + (cnt++) + ") -replace <infile> <outfile> (<characterId1>|<sctipName1>) <importDataFile1> [(<characterId2>|<sctipName2>) <importDataFile2>]...");
out.println(" ...replaces the data of the specified BinaryData, Image, DefineSound tag or Script");
out.println();
out.println("Examples:");
out.println("java -jar ffdec.jar myfile.swf");
@@ -1350,14 +1352,38 @@ public class CommandLineArgumentParser {
if (asms.containsKey(objectToReplace)) {
found = true;
// replace AS1/2
// todo: implement
String repFile = args.remove();
String as = Helper.readTextFile(repFile);
ASMSource src = asms.get(objectToReplace);
com.jpexs.decompiler.flash.action.parser.script.ActionScriptParser par = new com.jpexs.decompiler.flash.action.parser.script.ActionScriptParser(swf.version);
try {
src.setActions(par.actionsFromString(as));
} catch (ParseException ex) {
System.err.println("%error% on line %line%".replace("%error%", ex.text).replace("%line%", "" + ex.line));
System.exit(1);
} catch (CompilationException ex) {
System.err.println("%error% on line %line%".replace("%error%", ex.text).replace("%line%", "" + ex.line));
System.exit(1);
}
src.setModified();
} else {
List<MyEntry<ClassPath, ScriptPack>> packs = swf.getAS3Packs();
for (MyEntry<ClassPath, ScriptPack> entry : packs) {
if (entry.toString().equals(objectToReplace)) {
found = true;
// replace AS3
// todo: implement
String repFile = args.remove();
String as = Helper.readTextFile(repFile);
ScriptPack pack = entry.getValue();
try {
pack.abc.replaceSciptPack(pack, as);
} catch (com.jpexs.decompiler.flash.abc.avm2.parser.ParseException ex) {
System.err.println("%error% on line %line%".replace("%error%", ex.text).replace("%line%", "" + ex.line));
System.exit(1);
} catch (CompilationException ex) {
System.err.println("%error% on line %line%".replace("%error%", ex.text).replace("%line%", "" + ex.line));
System.exit(1);
}
}
}
}
@@ -1433,7 +1459,7 @@ public class CommandLineArgumentParser {
SWF swf = new SWF(is, Configuration.parallelSpeedUp.get());
List<MyEntry<ClassPath, ScriptPack>> packs = swf.getAS3Packs();
for (MyEntry<ClassPath, ScriptPack> entry : packs) {
System.out.println(entry.key.toString());
System.out.println(entry.getKey().toString());
}
}
} catch (IOException | InterruptedException e) {
@@ -17,7 +17,6 @@
package com.jpexs.decompiler.flash.gui;
import com.jpexs.decompiler.flash.SWF;
import com.jpexs.decompiler.flash.exporters.ShapeExporter;
import com.jpexs.decompiler.flash.exporters.commonshape.Matrix;
import com.jpexs.decompiler.flash.gui.player.MediaDisplay;
import com.jpexs.decompiler.flash.tags.DefineButtonSoundTag;
@@ -73,7 +72,6 @@ public final class ImagePanel extends JPanel implements ActionListener, MediaDis
static final String ACTION_SELECT_BKCOLOR = "SELECTCOLOR";
//private JLabel label = new JLabel();
private Timelined timelined;
private boolean stillFrame = false;
private Timer timer;
@@ -81,7 +79,7 @@ public final class ImagePanel extends JPanel implements ActionListener, MediaDis
private SWF swf;
private boolean loaded;
private int mouseButton;
private JLabel debugLabel = new JLabel("-");
private final JLabel debugLabel = new JLabel("-");
private DepthState stateUnderCursor = null;
private MouseEvent lastMouseEvent = null;
private final List<SoundTagPlayer> soundPlayers = new ArrayList<>();
@@ -48,7 +48,6 @@ import javax.swing.JDialog;
import javax.swing.JEditorPane;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.SwingUtilities;
import org.pushingpixels.flamingo.api.common.AbstractCommandButton;
import org.pushingpixels.flamingo.api.common.CommandButtonDisplayState;
@@ -64,7 +64,6 @@ import com.jpexs.decompiler.flash.gui.dumpview.DumpTreeModel;
import com.jpexs.decompiler.flash.gui.dumpview.DumpViewPanel;
import com.jpexs.decompiler.flash.gui.player.FlashPlayerPanel;
import com.jpexs.decompiler.flash.gui.timeline.TimelineViewPanel;
import com.jpexs.decompiler.flash.gui.timeline.TimelinePanel;
import com.jpexs.decompiler.flash.gui.treenodes.SWFBundleNode;
import com.jpexs.decompiler.flash.gui.treenodes.SWFNode;
import com.jpexs.decompiler.flash.gui.treenodes.StringNode;
@@ -26,7 +26,6 @@ import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.GetLocal0Ins;
import com.jpexs.decompiler.flash.abc.avm2.instructions.other.ReturnVoidIns;
import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.PushScopeIns;
import com.jpexs.decompiler.flash.abc.avm2.parser.ParseException;
import com.jpexs.decompiler.flash.abc.avm2.parser.script.ActionScriptParser;
import com.jpexs.decompiler.flash.abc.types.ABCException;
import com.jpexs.decompiler.flash.abc.types.MethodBody;
import com.jpexs.decompiler.flash.abc.types.MethodInfo;
@@ -59,8 +58,6 @@ import com.jpexs.decompiler.flash.gui.abc.tablemodels.UIntTableModel;
import com.jpexs.decompiler.flash.helpers.Freed;
import com.jpexs.decompiler.flash.helpers.collections.MyEntry;
import com.jpexs.decompiler.flash.tags.ABCContainerTag;
import com.jpexs.decompiler.flash.tags.SymbolClassTag;
import com.jpexs.decompiler.flash.tags.Tag;
import com.jpexs.decompiler.flash.treenodes.TreeNode;
import com.jpexs.decompiler.graph.CompilationException;
import com.jpexs.helpers.CancellableWorker;
@@ -171,7 +168,7 @@ public class ABCPanel extends JPanel implements ItemListener, ActionListener, Se
pos++;
String workText = AppStrings.translate("work.searching");
String decAdd = "";
if (!decompiledTextArea.isCached(item.value)) {
if (!decompiledTextArea.isCached(item.getValue())) {
decAdd = ", " + AppStrings.translate("work.decompiling");
}
@@ -180,18 +177,18 @@ public class ABCPanel extends JPanel implements ItemListener, ActionListener, Se
@Override
public Void doInBackground() throws Exception {
decompiledTextArea.cacheScriptPack(item.value, swf.abcList);
if (pat.matcher(decompiledTextArea.getCachedText(item.value)).find()) {
decompiledTextArea.cacheScriptPack(item.getValue(), swf.abcList);
if (pat.matcher(decompiledTextArea.getCachedText(item.getValue())).find()) {
ABCPanelSearchResult searchResult = new ABCPanelSearchResult();
searchResult.scriptPack = item.value;
searchResult.classPath = item.key;
searchResult.scriptPack = item.getValue();
searchResult.classPath = item.getKey();
found.add(searchResult);
}
return null;
}
};
worker.execute();
Main.startWork(workText + " \"" + txt + "\"" + decAdd + " - (" + pos + "/" + allpacks.size() + ") " + item.key.toString() + "... ", worker);
Main.startWork(workText + " \"" + txt + "\"" + decAdd + " - (" + pos + "/" + allpacks.size() + ") " + item.getKey().toString() + "... ", worker);
worker.get();
} catch (InterruptedException ex) {
break;
@@ -668,8 +665,8 @@ public class ABCPanel extends JPanel implements ItemListener, ActionListener, Se
ClassesListTreeModel clModel = (ClassesListTreeModel) scriptsNode.getItem();
ScriptPack pack = null;
for (MyEntry<ClassPath, ScriptPack> item : clModel.getList()) {
if (item.key.toString().equals(name)) {
pack = item.value;
if (item.getKey().toString().equals(name)) {
pack = item.getValue();
break;
}
}
@@ -777,37 +774,16 @@ public class ABCPanel extends JPanel implements ItemListener, ActionListener, Se
break;
case ACTION_SAVE_DECOMPILED:
ScriptPack pack = decompiledTextArea.getScriptLeaf();
String scriptName = pack.getPathScriptName() + ".as";
int oldIndex = pack.scriptIndex;
int newIndex = abc.script_info.size();
String documentClass = "";
loopt:
for (Tag t : swf.tags) {
if (t instanceof SymbolClassTag) {
SymbolClassTag sc = (SymbolClassTag) t;
for (int i = 0; i < sc.tags.length; i++) {
if (sc.tags[i] == 0) {
documentClass = sc.names[i];
break loopt;
}
}
}
}
boolean isDocumentClass = documentClass.equals(pack.getPath().toString());
try {
abc.script_info.get(oldIndex).delete(abc, true);
ActionScriptParser.compile(decompiledTextArea.getText(), abc, new ArrayList<ABC>(), isDocumentClass, scriptName);
//Move newly added script to its position
abc.script_info.set(oldIndex, abc.script_info.get(newIndex));
abc.script_info.remove(newIndex);
abc.pack(); //removes old classes/methods
((Tag) abc.parentTag).setModified(true);
lastDecompiled = decompiledTextArea.getText();
String as = decompiledTextArea.getText();
abc.replaceSciptPack(pack, as);
lastDecompiled = as;
mainPanel.updateClassesList();
List<MyEntry<ClassPath, ScriptPack>> packs = abc.script_info.get(oldIndex).getPacks(abc, oldIndex);
if (!packs.isEmpty()) {
hilightScript(swf, packs.get(0).key.toString());
hilightScript(swf, packs.get(0).getKey().toString());
}
//decompiledTextArea.setClassIndex(-1);
//navigator.setClassIndex(-1, oldIndex);
@@ -120,13 +120,13 @@ public class ClassesListTreeModel implements TreeModel, TreeElementItem {
filter = (filter == null || filter.isEmpty()) ? null : filter.toLowerCase();
for (MyEntry<ClassPath, ScriptPack> item : list) {
if (filter != null) {
if (!item.key.toString().toLowerCase().contains(filter)) {
if (!item.getKey().toString().toLowerCase().contains(filter)) {
continue;
}
}
//String nsName = path.contains(".") ? path.substring(path.lastIndexOf(".") + 1) : path;
//String packageName = path.contains(".") ? path.substring(0, path.lastIndexOf(".")) : "";
classTree.add(item.key.className, item.key.packageStr, item.value);
classTree.add(item.getKey().className, item.getKey().packageStr, item.getValue());
}
}
@@ -43,7 +43,6 @@ import com.jpexs.decompiler.flash.helpers.HilightedText;
import com.jpexs.decompiler.flash.helpers.HilightedTextWriter;
import com.jpexs.decompiler.flash.helpers.hilight.Highlighting;
import com.jpexs.decompiler.flash.tags.base.ASMSource;
import com.jpexs.decompiler.flash.treenodes.TreeNode;
import com.jpexs.decompiler.graph.CompilationException;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.helpers.Cache;
@@ -16,16 +16,9 @@
*/
package com.jpexs.decompiler.flash.gui.timeline;
import com.jpexs.decompiler.flash.gui.AppFrame;
import com.jpexs.decompiler.flash.gui.ImagePanel;
import com.jpexs.decompiler.flash.gui.View;
import com.jpexs.decompiler.flash.timeline.Timelined;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Image;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JPanel;
import javax.swing.JSplitPane;