mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/jpexs-decompiler.git
synced 2026-06-19 02:41:55 +00:00
A few events export related
This commit is contained in:
25
trunk/src/com/jpexs/asdec/EventListener.java
Normal file
25
trunk/src/com/jpexs/asdec/EventListener.java
Normal file
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* Copyright (C) 2010-2012 JPEXS
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.jpexs.asdec;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Jindra
|
||||
*/
|
||||
public interface EventListener {
|
||||
public void handleEvent(String event,Object data);
|
||||
}
|
||||
@@ -171,6 +171,13 @@ public class Main {
|
||||
FileInputStream fis = new FileInputStream(file);
|
||||
InputStream bis = new BufferedInputStream(fis);
|
||||
SWF locswf = new SWF(bis);
|
||||
locswf.addEventListener(new EventListener() {
|
||||
public void handleEvent(String event, Object data) {
|
||||
if (event.equals("export")) {
|
||||
startWork((String) data);
|
||||
}
|
||||
}
|
||||
});
|
||||
return locswf;
|
||||
}
|
||||
|
||||
@@ -179,72 +186,6 @@ public class Main {
|
||||
swf.saveTo(new FileOutputStream(outfile));
|
||||
}
|
||||
|
||||
public static boolean exportSWF(String inFile, String outdir, boolean isPcode) throws Exception {
|
||||
SWF swf = parseSWF(inFile);
|
||||
boolean asV3Found = false;
|
||||
for (Tag t : swf.tags) {
|
||||
if (t instanceof DoABCTag) {
|
||||
((DoABCTag) t).abc.export(outdir, isPcode);
|
||||
asV3Found = true;
|
||||
}
|
||||
}
|
||||
if (!asV3Found) {
|
||||
List<Object> list2 = new ArrayList<Object>();
|
||||
list2.addAll(swf.tags);
|
||||
return exportNode(TagNode.createTagList(list2), outdir, isPcode);
|
||||
}
|
||||
return asV3Found;
|
||||
}
|
||||
|
||||
public static boolean exportNode(List<TagNode> nodeList, String outdir, boolean isPcode) {
|
||||
File dir = new File(outdir);
|
||||
if (!dir.exists()) {
|
||||
dir.mkdirs();
|
||||
}
|
||||
List<String> existingNames = new ArrayList<String>();
|
||||
for (TagNode node : nodeList) {
|
||||
String name = "";
|
||||
if (node.tag instanceof TagName) {
|
||||
name = ((TagName) node.tag).getName();
|
||||
} else {
|
||||
name = node.tag.toString();
|
||||
}
|
||||
int i = 1;
|
||||
String baseName = name;
|
||||
while (existingNames.contains(name)) {
|
||||
i++;
|
||||
name = baseName + "_" + i;
|
||||
}
|
||||
existingNames.add(name);
|
||||
if (node.subItems.isEmpty()) {
|
||||
if (node.tag instanceof ASMSource) {
|
||||
try {
|
||||
String f = outdir + File.separatorChar + name + ".as";
|
||||
Main.startWork("Exporting " + f + " ...");
|
||||
String ret = "";
|
||||
if (isPcode) {
|
||||
ret = ((ASMSource) node.tag).getASMSource(10); //TODO:Ensure correct version here
|
||||
} else {
|
||||
List<com.jpexs.asdec.action.Action> as = ((ASMSource) node.tag).getActions(10);//TODO:Ensure correct version here
|
||||
com.jpexs.asdec.action.Action.setActionsAddresses(as, 0, 10);//TODO:Ensure correct version here
|
||||
ret = (Highlighting.stripHilights(com.jpexs.asdec.action.Action.actionsToSource(as, 10))); //TODO:Ensure correct version here
|
||||
}
|
||||
|
||||
|
||||
FileOutputStream fos = new FileOutputStream(f);
|
||||
fos.write(ret.getBytes());
|
||||
fos.close();
|
||||
} catch (Exception ex) {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
exportNode(node.subItems, outdir + File.separatorChar + name, isPcode);
|
||||
}
|
||||
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private static class OpenFileWorker extends SwingWorker {
|
||||
|
||||
@Override
|
||||
@@ -542,7 +483,15 @@ public class Main {
|
||||
boolean exportOK = true;
|
||||
try {
|
||||
printHeader();
|
||||
exportOK = exportSWF(inFile.getAbsolutePath(), outDir.getAbsolutePath(), exportFormat.equals("pcode"));
|
||||
SWF exfile = new SWF(new FileInputStream(inFile));
|
||||
exfile.addEventListener(new EventListener() {
|
||||
public void handleEvent(String event, Object data) {
|
||||
if (event.equals("export")) {
|
||||
System.out.println((String) data);
|
||||
}
|
||||
}
|
||||
});
|
||||
exportOK = exfile.exportActionScript(outDir.getAbsolutePath(), exportFormat.equals("pcode"));
|
||||
} catch (Exception ex) {
|
||||
exportOK = false;
|
||||
System.err.print("FAIL: Exporting Failed on Exception - ");
|
||||
|
||||
@@ -17,10 +17,16 @@
|
||||
package com.jpexs.asdec;
|
||||
|
||||
import SevenZip.Compression.LZMA.Encoder;
|
||||
import com.jpexs.asdec.action.TagNode;
|
||||
import com.jpexs.asdec.helpers.Highlighting;
|
||||
import com.jpexs.asdec.tags.ASMSource;
|
||||
import com.jpexs.asdec.tags.DoABCTag;
|
||||
import com.jpexs.asdec.tags.Tag;
|
||||
import com.jpexs.asdec.tags.TagName;
|
||||
import com.jpexs.asdec.types.RECT;
|
||||
import java.io.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.zip.DeflaterOutputStream;
|
||||
import java.util.zip.InflaterInputStream;
|
||||
@@ -277,4 +283,95 @@ public class SWF {
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
public boolean exportActionScript(String outdir, boolean isPcode) throws Exception {
|
||||
boolean asV3Found = false;
|
||||
final EventListener evl=new EventListener(){
|
||||
|
||||
public void handleEvent(String event, Object data) {
|
||||
if(event.equals("export")){
|
||||
informListeners(event, data);
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
for (Tag t : tags) {
|
||||
if (t instanceof DoABCTag) {
|
||||
((DoABCTag) t).abc.addEventListener(evl);
|
||||
((DoABCTag) t).abc.export(outdir, isPcode);
|
||||
asV3Found = true;
|
||||
}
|
||||
}
|
||||
if (!asV3Found) {
|
||||
List<Object> list2 = new ArrayList<Object>();
|
||||
list2.addAll(tags);
|
||||
return exportNode(TagNode.createTagList(list2), outdir, isPcode);
|
||||
}
|
||||
return asV3Found;
|
||||
}
|
||||
|
||||
private boolean exportNode(List<TagNode> nodeList, String outdir, boolean isPcode) {
|
||||
File dir = new File(outdir);
|
||||
if (!dir.exists()) {
|
||||
dir.mkdirs();
|
||||
}
|
||||
List<String> existingNames = new ArrayList<String>();
|
||||
for (TagNode node : nodeList) {
|
||||
String name = "";
|
||||
if (node.tag instanceof TagName) {
|
||||
name = ((TagName) node.tag).getName();
|
||||
} else {
|
||||
name = node.tag.toString();
|
||||
}
|
||||
int i = 1;
|
||||
String baseName = name;
|
||||
while (existingNames.contains(name)) {
|
||||
i++;
|
||||
name = baseName + "_" + i;
|
||||
}
|
||||
existingNames.add(name);
|
||||
if (node.subItems.isEmpty()) {
|
||||
if (node.tag instanceof ASMSource) {
|
||||
try {
|
||||
String f = outdir + File.separatorChar + name + ".as";
|
||||
informListeners("export", "Exporting " + f + " ...");
|
||||
String ret = "";
|
||||
if (isPcode) {
|
||||
ret = ((ASMSource) node.tag).getASMSource(10); //TODO:Ensure correct version here
|
||||
} else {
|
||||
List<com.jpexs.asdec.action.Action> as = ((ASMSource) node.tag).getActions(10);//TODO:Ensure correct version here
|
||||
com.jpexs.asdec.action.Action.setActionsAddresses(as, 0, 10);//TODO:Ensure correct version here
|
||||
ret = (Highlighting.stripHilights(com.jpexs.asdec.action.Action.actionsToSource(as, 10))); //TODO:Ensure correct version here
|
||||
}
|
||||
|
||||
|
||||
FileOutputStream fos = new FileOutputStream(f);
|
||||
fos.write(ret.getBytes());
|
||||
fos.close();
|
||||
} catch (Exception ex) {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
exportNode(node.subItems, outdir + File.separatorChar + name, isPcode);
|
||||
}
|
||||
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
protected HashSet<EventListener> listeners=new HashSet<EventListener>();
|
||||
|
||||
public void addEventListener(EventListener listener){
|
||||
listeners.add(listener);
|
||||
}
|
||||
public void removeEventListener(EventListener listener){
|
||||
listeners.remove(listener);
|
||||
}
|
||||
protected void informListeners(String event,Object data){
|
||||
for(EventListener listener:listeners){
|
||||
listener.handleEvent(event, data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
*/
|
||||
package com.jpexs.asdec.abc;
|
||||
|
||||
import com.jpexs.asdec.EventListener;
|
||||
import com.jpexs.asdec.Main;
|
||||
import com.jpexs.asdec.abc.avm2.AVM2Code;
|
||||
import com.jpexs.asdec.abc.avm2.ConstantPool;
|
||||
@@ -34,6 +35,7 @@ import com.jpexs.asdec.helpers.Helper;
|
||||
import com.jpexs.asdec.helpers.Highlighting;
|
||||
import java.io.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Stack;
|
||||
@@ -56,6 +58,22 @@ public class ABC {
|
||||
public static final int MINORwithDECIMAL = 17;
|
||||
public static final boolean AUTOINIT_STATIC_VARIABLES = false;
|
||||
|
||||
protected HashSet<EventListener> listeners=new HashSet<EventListener>();
|
||||
|
||||
public void addEventListener(EventListener listener){
|
||||
listeners.add(listener);
|
||||
}
|
||||
public void removeEventListener(EventListener listener){
|
||||
listeners.remove(listener);
|
||||
}
|
||||
protected void informListeners(String event,Object data){
|
||||
for(EventListener listener:listeners){
|
||||
listener.handleEvent(event, data);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public int deobfuscateIdentifiers() {
|
||||
int ret = 0;
|
||||
for (int i = 1; i < constants.constant_multiname.length; i++) {
|
||||
@@ -721,7 +739,7 @@ public class ABC {
|
||||
if ((packageName != null) && (!packageName.equals(""))) {
|
||||
fullName = packageName + "." + fullName;
|
||||
}
|
||||
Main.startWork("Exporting " + (i + 1) + "/" + instance_info.length + " " + fullName + " ...");
|
||||
informListeners("export", "Exporting " + (i + 1) + "/" + instance_info.length + " " + fullName + " ...");
|
||||
File outDir = new File(directory + File.separatorChar + packageName.replace('.', File.separatorChar));
|
||||
if (!outDir.exists()) {
|
||||
outDir.mkdirs();
|
||||
|
||||
@@ -19,6 +19,7 @@ package com.jpexs.asdec.abc.gui;
|
||||
import com.jpexs.asdec.Configuration;
|
||||
import com.jpexs.asdec.Main;
|
||||
import com.jpexs.asdec.abc.ABC;
|
||||
import com.jpexs.asdec.EventListener;
|
||||
import com.jpexs.asdec.abc.gui.tablemodels.*;
|
||||
import com.jpexs.asdec.gui.LoadingPanel;
|
||||
import com.jpexs.asdec.gui.View;
|
||||
@@ -417,11 +418,9 @@ public class MainFrame extends JFrame implements ActionListener, ItemListener {
|
||||
(new Thread() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
for (DoABCTag tag : list) {
|
||||
tag.abc.export(selFile, isPcode);
|
||||
}
|
||||
} catch (IOException ignored) {
|
||||
try {
|
||||
Main.swf.exportActionScript(selFile, isPcode);
|
||||
} catch (Exception ignored) {
|
||||
JOptionPane.showMessageDialog(null, "Cannot write to the file");
|
||||
}
|
||||
Main.stopWork();
|
||||
|
||||
@@ -335,9 +335,7 @@ public class MainFrame extends JFrame implements TreeSelectionListener, ActionLi
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
List<Object> list2 = new ArrayList<Object>();
|
||||
list2.addAll(list);
|
||||
Main.exportNode(TagNode.createTagList(list2), selFile, isPcode);
|
||||
Main.swf.exportActionScript(selFile, isPcode);
|
||||
} catch (Exception ignored) {
|
||||
JOptionPane.showMessageDialog(null, "Cannot write to the file");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user