mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/jpexs-decompiler.git
synced 2026-07-08 08:18:13 +00:00
replace AtionScript from command line
This commit is contained in:
@@ -855,8 +855,8 @@ public final class SWF implements TreeItem, Timelined {
|
||||
List<MyEntry<ClassPath, ScriptPack>> ret = new ArrayList<>();
|
||||
for (MyEntry<ClassPath, ScriptPack> item : packs) {
|
||||
for (MyEntry<ClassPath, ScriptPack> itemOld : ret) {
|
||||
if (item.key.equals(itemOld.key)) {
|
||||
logger.log(Level.SEVERE, "Duplicate pack path found (" + itemOld.key + ")!");
|
||||
if (item.getKey().equals(itemOld.getKey())) {
|
||||
logger.log(Level.SEVERE, "Duplicate pack path found (" + itemOld.getKey() + ")!");
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -968,7 +968,7 @@ public final class SWF implements TreeItem, Timelined {
|
||||
@Override
|
||||
public Void call() throws Exception {
|
||||
for (MyEntry<ClassPath, ScriptPack> item : packs) {
|
||||
ExportPackTask task = new ExportPackTask(handler, cnt, packs.size(), item.key, item.value, outdir, abcTags, exportMode, parallel);
|
||||
ExportPackTask task = new ExportPackTask(handler, cnt, packs.size(), item.getKey(), item.getValue(), outdir, abcTags, exportMode, parallel);
|
||||
ret.add(task.call());
|
||||
}
|
||||
return null;
|
||||
@@ -983,7 +983,7 @@ public final class SWF implements TreeItem, Timelined {
|
||||
ExecutorService executor = Executors.newFixedThreadPool(Configuration.parallelThreadCount.get());
|
||||
List<Future<File>> futureResults = new ArrayList<>();
|
||||
for (MyEntry<ClassPath, ScriptPack> item : packs) {
|
||||
Future<File> future = executor.submit(new ExportPackTask(handler, cnt, packs.size(), item.key, item.value, outdir, abcTags, exportMode, parallel));
|
||||
Future<File> future = executor.submit(new ExportPackTask(handler, cnt, packs.size(), item.getKey(), item.getValue(), outdir, abcTags, exportMode, parallel));
|
||||
futureResults.add(future);
|
||||
}
|
||||
|
||||
@@ -1970,7 +1970,7 @@ public final class SWF implements TreeItem, Timelined {
|
||||
informListeners("rename", "");
|
||||
int fc = 0;
|
||||
for (MyEntry<DirectValueActionItem, ConstantPool> it : allVariableNames) {
|
||||
String name = it.key.toStringNoH(it.value);
|
||||
String name = it.getKey().toStringNoH(it.getValue());
|
||||
deobfuscation.allVariableNamesStr.add(name);
|
||||
}
|
||||
|
||||
@@ -2029,10 +2029,10 @@ public final class SWF implements TreeItem, Timelined {
|
||||
|
||||
List<GraphTargetItem> vars = new ArrayList<>();
|
||||
for (MyEntry<GraphTargetItem, GraphTargetItem> item : cti.vars) {
|
||||
vars.add(item.key);
|
||||
vars.add(item.getKey());
|
||||
}
|
||||
for (MyEntry<GraphTargetItem, GraphTargetItem> item : cti.staticVars) {
|
||||
vars.add(item.key);
|
||||
vars.add(item.getKey());
|
||||
}
|
||||
for (GraphTargetItem gti : vars) {
|
||||
if (gti instanceof DirectValueActionItem) {
|
||||
@@ -2139,7 +2139,7 @@ public final class SWF implements TreeItem, Timelined {
|
||||
HashSet<String> stringsNoVarH = new HashSet<>();
|
||||
List<DirectValueActionItem> allVariableNamesDv = new ArrayList<>();
|
||||
for (MyEntry<DirectValueActionItem, ConstantPool> it : allVariableNames) {
|
||||
allVariableNamesDv.add(it.key);
|
||||
allVariableNamesDv.add(it.getKey());
|
||||
}
|
||||
for (DirectValueActionItem ti : allStrings.keySet()) {
|
||||
if (!allVariableNamesDv.contains(ti)) {
|
||||
@@ -2150,22 +2150,22 @@ public final class SWF implements TreeItem, Timelined {
|
||||
int vc = 0;
|
||||
for (MyEntry<DirectValueActionItem, ConstantPool> it : allVariableNames) {
|
||||
vc++;
|
||||
String name = it.key.toStringNoH(it.value);
|
||||
String changed = deobfuscation.deobfuscateName(name, false, usageTypes.get(it.key), deobfuscated, renameType, selected);
|
||||
String name = it.getKey().toStringNoH(it.getValue());
|
||||
String changed = deobfuscation.deobfuscateName(name, false, usageTypes.get(it.getKey()), deobfuscated, renameType, selected);
|
||||
if (changed != null) {
|
||||
boolean addNew = false;
|
||||
String h = System.identityHashCode(it.key) + "_" + name;
|
||||
String h = System.identityHashCode(it.getKey()) + "_" + name;
|
||||
if (stringsNoVarH.contains(h)) {
|
||||
addNew = true;
|
||||
}
|
||||
ActionPush pu = (ActionPush) it.key.src;
|
||||
ActionPush pu = (ActionPush) it.getKey().src;
|
||||
if (pu.replacement == null) {
|
||||
pu.replacement = new ArrayList<>();
|
||||
pu.replacement.addAll(pu.values);
|
||||
}
|
||||
if (pu.replacement.get(it.key.pos) instanceof ConstantIndex) {
|
||||
ConstantIndex ci = (ConstantIndex) pu.replacement.get(it.key.pos);
|
||||
ConstantPool pool = it.value;
|
||||
if (pu.replacement.get(it.getKey().pos) instanceof ConstantIndex) {
|
||||
ConstantIndex ci = (ConstantIndex) pu.replacement.get(it.getKey().pos);
|
||||
ConstantPool pool = it.getValue();
|
||||
if (pool == null) {
|
||||
continue;
|
||||
}
|
||||
@@ -2179,7 +2179,7 @@ public final class SWF implements TreeItem, Timelined {
|
||||
pool.constants.set(ci.index, changed);
|
||||
}
|
||||
} else {
|
||||
pu.replacement.set(it.key.pos, changed);
|
||||
pu.replacement.set(it.getKey().pos, changed);
|
||||
}
|
||||
ret++;
|
||||
}
|
||||
|
||||
@@ -25,6 +25,8 @@ import com.jpexs.decompiler.flash.abc.avm2.UnknownInstructionCode;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.instructions.executing.CallPropertyIns;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.PushStringIns;
|
||||
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.ClassInfo;
|
||||
import com.jpexs.decompiler.flash.abc.types.InstanceInfo;
|
||||
@@ -56,6 +58,9 @@ import com.jpexs.decompiler.flash.abc.usages.TypeNameMultinameUsage;
|
||||
import com.jpexs.decompiler.flash.helpers.SWFDecompilerPlugin;
|
||||
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.graph.CompilationException;
|
||||
import com.jpexs.helpers.MemoryInputStream;
|
||||
import com.jpexs.helpers.utf8.Utf8PrintWriter;
|
||||
import java.io.IOException;
|
||||
@@ -1004,17 +1009,17 @@ public class ABC {
|
||||
name = name.substring(0, name.length() - 2);
|
||||
|
||||
for (MyEntry<ClassPath, ScriptPack> en : allPacks) {
|
||||
if (en.key.toString().startsWith(name)) {
|
||||
ret.add(en.value);
|
||||
if (en.getKey().toString().startsWith(name)) {
|
||||
ret.add(en.getValue());
|
||||
}
|
||||
}
|
||||
} else if (name.endsWith(".*") || name.equals("*") || name.endsWith(".+") || name.equals("+")) {
|
||||
name = name.substring(0, name.length() - 1);
|
||||
for (MyEntry<ClassPath, ScriptPack> en : allPacks) {
|
||||
if (en.key.toString().startsWith(name)) {
|
||||
String rem = name.isEmpty() ? en.key.toString() : en.key.toString().substring(name.length());
|
||||
if (en.getKey().toString().startsWith(name)) {
|
||||
String rem = name.isEmpty() ? en.getKey().toString() : en.getKey().toString().substring(name.length());
|
||||
if (!rem.contains(".")) {
|
||||
ret.add(en.value);
|
||||
ret.add(en.getValue());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1031,8 +1036,8 @@ public class ABC {
|
||||
public ScriptPack findScriptPackByPath(String name) {
|
||||
List<MyEntry<ClassPath, ScriptPack>> packs = getScriptPacks();
|
||||
for (MyEntry<ClassPath, ScriptPack> en : packs) {
|
||||
if (en.key.toString().equals(name)) {
|
||||
return en.value;
|
||||
if (en.getKey().toString().equals(name)) {
|
||||
return en.getValue();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
@@ -1148,6 +1153,34 @@ public class ABC {
|
||||
method_info.remove(index);
|
||||
}
|
||||
|
||||
public void replaceSciptPack(ScriptPack pack, String as) throws ParseException, CompilationException, IOException, InterruptedException {
|
||||
String scriptName = pack.getPathScriptName() + ".as";
|
||||
int oldIndex = pack.scriptIndex;
|
||||
int newIndex = 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());
|
||||
|
||||
script_info.get(oldIndex).delete(this, true);
|
||||
ActionScriptParser.compile(as, this, new ArrayList<ABC>(), isDocumentClass, scriptName);
|
||||
//Move newly added script to its position
|
||||
script_info.set(oldIndex, script_info.get(newIndex));
|
||||
script_info.remove(newIndex);
|
||||
pack(); //removes old classes/methods
|
||||
((Tag) parentTag).setModified(true);
|
||||
}
|
||||
|
||||
public void pack() {
|
||||
for (int c = 0; c < instance_info.size(); c++) {
|
||||
if (instance_info.get(c).deleted) {
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library.
|
||||
* License along with this library.
|
||||
*/
|
||||
package com.jpexs.decompiler.flash.action.model.clauses;
|
||||
|
||||
import com.jpexs.decompiler.flash.SourceGeneratorLocalData;
|
||||
@@ -91,7 +92,7 @@ public class ClassActionItem extends ActionItem implements Block {
|
||||
}
|
||||
uninitializedVars.addAll(allMembers);
|
||||
for (MyEntry<GraphTargetItem, GraphTargetItem> v : vars) {
|
||||
for (MyEntry<GraphTargetItem, GraphTargetItem> v : vars) {
|
||||
String s = v.getKey().toStringNoQuotes(LocalData.empty);
|
||||
if (uninitializedVars.contains(s)) {
|
||||
uninitializedVars.remove(s);
|
||||
}
|
||||
@@ -169,9 +170,9 @@ public class ClassActionItem extends ActionItem implements Block {
|
||||
|
||||
for (MyEntry<GraphTargetItem, GraphTargetItem> item : vars) {
|
||||
writer.append("var ");
|
||||
writer.append("var ");
|
||||
item.getKey().toStringNoQuotes(writer, localData);
|
||||
writer.append(" = ");
|
||||
writer.append(" = ");
|
||||
item.getValue().toString(writer, localData);
|
||||
writer.append(";").newLine();
|
||||
}
|
||||
for (String v : uninitializedVars) {
|
||||
@@ -181,9 +182,9 @@ public class ClassActionItem extends ActionItem implements Block {
|
||||
}
|
||||
for (MyEntry<GraphTargetItem, GraphTargetItem> item : staticVars) {
|
||||
writer.append("static var ");
|
||||
writer.append("static var ");
|
||||
item.getKey().toStringNoQuotes(writer, localData);
|
||||
writer.append(" = ");
|
||||
writer.append(" = ");
|
||||
item.getValue().toString(writer, localData);
|
||||
writer.append(";").newLine();
|
||||
}
|
||||
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library.
|
||||
* License along with this library.
|
||||
*/
|
||||
package com.jpexs.decompiler.flash.action.parser.script;
|
||||
|
||||
import com.jpexs.decompiler.flash.SWF;
|
||||
@@ -690,14 +691,14 @@ public class ActionSourceGenerator implements SourceGenerator {
|
||||
}
|
||||
for (MyEntry<GraphTargetItem, GraphTargetItem> en : staticVars) {
|
||||
ifbody.add(new ActionPush(new RegisterNumber(1/*static*/)));
|
||||
ifbody.add(new ActionPush(new RegisterNumber(1/*static*/)));
|
||||
ifbody.add(new ActionPush(getName(en.key)));
|
||||
ifbody.add(new ActionPush(getName(en.getKey())));
|
||||
ifbody.addAll(toActionList(en.getValue().toSource(localData, this)));
|
||||
ifbody.add(new ActionSetMember());
|
||||
}
|
||||
for (MyEntry<GraphTargetItem, GraphTargetItem> en : vars) {
|
||||
ifbody.add(new ActionPush(new RegisterNumber(2/*instance*/)));
|
||||
ifbody.add(new ActionPush(new RegisterNumber(2/*instance*/)));
|
||||
ifbody.add(new ActionPush(getName(en.key)));
|
||||
ifbody.add(new ActionPush(getName(en.getKey())));
|
||||
ifbody.addAll(toActionList(en.getValue().toSource(localData, this)));
|
||||
ifbody.add(new ActionSetMember());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library.
|
||||
* License along with this library.
|
||||
*/
|
||||
package com.jpexs.decompiler.flash.helpers.collections;
|
||||
|
||||
import java.util.Map.Entry;
|
||||
@@ -26,8 +27,8 @@ import java.util.Objects;
|
||||
*/
|
||||
public class MyEntry<K, V> implements Entry<K, V> {
|
||||
|
||||
|
||||
public K key;
|
||||
private final K key;
|
||||
private V value;
|
||||
|
||||
public MyEntry(K key, V value) {
|
||||
this.key = key;
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library.
|
||||
* License along with this library.
|
||||
*/
|
||||
package com.jpexs.decompiler.flash.helpers.collections;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -44,7 +45,7 @@ public class MyMap<K, V> implements Map<K, V> {
|
||||
@Override
|
||||
public boolean containsKey(Object key) {
|
||||
for (MyEntry<K, V> kv : values) {
|
||||
for (MyEntry<K, V> kv : values) {
|
||||
if (kv.getKey().equals(key)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -54,7 +55,7 @@ public class MyMap<K, V> implements Map<K, V> {
|
||||
@Override
|
||||
public boolean containsValue(Object value) {
|
||||
for (MyEntry<K, V> kv : values) {
|
||||
for (MyEntry<K, V> kv : values) {
|
||||
if (kv.getValue().equals(value)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -64,8 +65,8 @@ public class MyMap<K, V> implements Map<K, V> {
|
||||
@Override
|
||||
public V get(Object key) {
|
||||
for (MyEntry<K, V> kv : values) {
|
||||
for (MyEntry<K, V> kv : values) {
|
||||
if (kv.key.equals(key)) {
|
||||
if (kv.getKey().equals(key)) {
|
||||
return kv.getValue();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
@@ -74,8 +75,8 @@ public class MyMap<K, V> implements Map<K, V> {
|
||||
@Override
|
||||
public V put(K key, V value) {
|
||||
for (MyEntry<K, V> kv : values) {
|
||||
for (MyEntry<K, V> kv : values) {
|
||||
if (kv.key.equals(key)) {
|
||||
if (kv.getKey().equals(key)) {
|
||||
kv.setValue(value);
|
||||
return value;
|
||||
}
|
||||
}
|
||||
@@ -87,9 +88,9 @@ public class MyMap<K, V> implements Map<K, V> {
|
||||
public V remove(Object key) {
|
||||
for (int i = 0; i < values.size(); i++) {
|
||||
MyEntry<K, V> kv = values.get(i);
|
||||
MyEntry<K, V> kv = values.get(i);
|
||||
if (kv.getKey().equals(key)) {
|
||||
values.remove(i);
|
||||
values.remove(i);
|
||||
return kv.getValue();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
@@ -111,7 +112,7 @@ public class MyMap<K, V> implements Map<K, V> {
|
||||
public Set<K> keySet() {
|
||||
Set<K> ret = new MySet<>();
|
||||
for (MyEntry<K, V> kv : values) {
|
||||
for (MyEntry<K, V> kv : values) {
|
||||
ret.add(kv.getKey());
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
@@ -120,7 +121,7 @@ public class MyMap<K, V> implements Map<K, V> {
|
||||
public Collection<V> values() {
|
||||
Collection<V> ret = new ArrayList<>();
|
||||
for (MyEntry<K, V> kv : values) {
|
||||
for (MyEntry<K, V> kv : values) {
|
||||
ret.add(kv.getValue());
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user