Lazy dump info collecting

This commit is contained in:
honfika
2014-08-10 21:44:53 +02:00
parent 97631dc718
commit 3e0250c9cb
23 changed files with 370 additions and 410 deletions
+2 -4
View File
@@ -540,9 +540,7 @@ public final class SWF implements TreeItem, Timelined {
SWFInputStream sis = new SWFInputStream(this, uncompressedData);
dumpInfo = new DumpInfoSwfNode(this, "rootswf", "", null, 0, 0);
if (Configuration.dumpInfoCollecting.get()) {
sis.dumpInfo = dumpInfo;
}
sis.dumpInfo = dumpInfo;
sis.readBytesEx(3, "signature"); // skip siganture
version = sis.readUI8("version");
fileSize = sis.readUI32("fileSize");
@@ -556,7 +554,7 @@ public final class SWF implements TreeItem, Timelined {
sis.readUI8("tmpFirstByetOfFrameRate"); //tmpFirstByetOfFrameRate
frameRate = sis.readUI8("frameRate");
frameCount = sis.readUI16("frameCount");
List<Tag> tags = sis.readTagList(this, 0, parallelRead, true, !checkOnly, gfx);
List<Tag> tags = sis.readTagList(this, 0, parallelRead, true, !checkOnly);
if (tags.get(tags.size() - 1).getId() == EndTag.ID) {
hasEndTag = true;
tags.remove(tags.size() - 1);
@@ -964,22 +964,20 @@ public class SWFInputStream implements AutoCloseable {
private final int level;
private final boolean parallel;
private final boolean skipUnusualTags;
private final boolean gfx;
public TagResolutionTask(TagStub tag, DumpInfo dumpInfo, int level, boolean parallel, boolean skipUnusualTags, boolean gfx) {
public TagResolutionTask(TagStub tag, DumpInfo dumpInfo, int level, boolean parallel, boolean skipUnusualTags) {
this.tag = tag;
this.dumpInfo = dumpInfo;
this.level = level;
this.parallel = parallel;
this.skipUnusualTags = skipUnusualTags;
this.gfx = gfx;
}
@Override
public Tag call() throws Exception {
DumpInfo di = dumpInfo;
try {
Tag t = resolveTag(tag, level, parallel, skipUnusualTags, gfx);
Tag t = resolveTag(tag, level, parallel, skipUnusualTags);
if (dumpInfo != null && t != null) {
dumpInfo.name = t.getName();
}
@@ -1001,12 +999,11 @@ public class SWFInputStream implements AutoCloseable {
* @param parallel
* @param skipUnusualTags
* @param parseTags
* @param gfx
* @return List of tags
* @throws IOException
* @throws java.lang.InterruptedException
*/
public List<Tag> readTagList(Timelined timelined, int level, boolean parallel, boolean skipUnusualTags, boolean parseTags, boolean gfx) throws IOException, InterruptedException {
public List<Tag> readTagList(Timelined timelined, int level, boolean parallel, boolean skipUnusualTags, boolean parseTags) throws IOException, InterruptedException {
ExecutorService executor = null;
List<Future<Tag>> futureResults = new ArrayList<>();
if (parallel) {
@@ -1020,7 +1017,7 @@ public class SWFInputStream implements AutoCloseable {
long pos = getPos();
newDumpLevel(null, "TAG");
try {
tag = readTag(timelined, level, pos, parseTags && !parallel, parallel, skipUnusualTags, gfx);
tag = readTag(timelined, level, pos, parseTags && !parallel, parallel, skipUnusualTags);
} catch (EOFException | EndOfStreamException ex) {
tag = null;
}
@@ -1048,7 +1045,7 @@ public class SWFInputStream implements AutoCloseable {
switch (tag.getId()) {
case FileAttributesTag.ID: //FileAttributes
if (tag instanceof TagStub) {
tag = resolveTag((TagStub) tag, level, parallel, skipUnusualTags, gfx);
tag = resolveTag((TagStub) tag, level, parallel, skipUnusualTags);
}
FileAttributesTag fileAttributes = (FileAttributesTag) tag;
if (fileAttributes.actionScript3) {
@@ -1091,7 +1088,7 @@ public class SWFInputStream implements AutoCloseable {
}
if (parseTags && doParse && tag instanceof TagStub) {
if (parallel) {
Future<Tag> future = executor.submit(new TagResolutionTask((TagStub) tag, di, level, parallel, skipUnusualTags, gfx));
Future<Tag> future = executor.submit(new TagResolutionTask((TagStub) tag, di, level, parallel, skipUnusualTags));
futureResults.add(future);
}
}
@@ -1117,7 +1114,7 @@ public class SWFInputStream implements AutoCloseable {
return tags;
}
public static Tag resolveTag(TagStub tag, int level, boolean parallel, boolean skipUnusualTags, boolean gfx) throws InterruptedException {
public static Tag resolveTag(TagStub tag, int level, boolean parallel, boolean skipUnusualTags) throws InterruptedException {
Tag ret;
ByteArrayRange data = tag.getOriginalRange();
@@ -1355,7 +1352,7 @@ public class SWFInputStream implements AutoCloseable {
ret = new PlaceObject4Tag(sis, data);
break;
default:
if (gfx) { //GFX tags only in GFX files. There may be incorrect GFX tags in non GFX files
if (swf.gfx) { //GFX tags only in GFX files. There may be incorrect GFX tags in non GFX files
switch (tag.getId()) {
case 1000:
ret = new ExporterInfoTag(sis, data);
@@ -1413,12 +1410,11 @@ public class SWFInputStream implements AutoCloseable {
* @param resolve
* @param parallel
* @param skipUnusualTags
* @param gfx
* @return Tag or null when End tag
* @throws IOException
* @throws java.lang.InterruptedException
*/
public Tag readTag(Timelined timelined, int level, long pos, boolean resolve, boolean parallel, boolean skipUnusualTags, boolean gfx) throws IOException, InterruptedException {
public Tag readTag(Timelined timelined, int level, long pos, boolean resolve, boolean parallel, boolean skipUnusualTags) throws IOException, InterruptedException {
int tagIDTagLength = readUI16("tagIDTagLength");
int tagID = (tagIDTagLength) >> 6;
@@ -1438,15 +1434,20 @@ public class SWFInputStream implements AutoCloseable {
}
ByteArrayRange dataRange = new ByteArrayRange(swf.uncompressedData, (int) pos, (int) (tagLength + headerLength));
skipBytes((int) tagLength);
TagStub tagStub = new TagStub(swf, tagID, "Unresolved", dataRange, tagDataStream);
tagStub.forceWriteAsLong = readLong;
Tag ret = tagStub;
skipBytes((int) tagLength);
if (tagDataStream.dumpInfo == null && dumpInfo != null) {
dumpInfo.tagToResolve = tagStub;
}
if (resolve) {
DumpInfo di = dumpInfo;
try {
ret = resolveTag(tagStub, level, parallel, skipUnusualTags, gfx);
ret = resolveTag(tagStub, level, parallel, skipUnusualTags);
} catch (EndOfStreamException ex) {
tagDataStream.endDumpLevelUntil(di);
logger.log(Level.SEVERE, "Problem in " + timelined.toString(), ex);
@@ -3287,7 +3288,9 @@ public class SWFInputStream implements AutoCloseable {
public SWFInputStream getLimitedStream(int limit) throws IOException {
SWFInputStream sis = new SWFInputStream(swf, is.getAllRead(), startingPos, (int) (is.getPos() + limit));
sis.dumpInfo = dumpInfo;
if (Configuration.lazyDumpInfoCollecting.get()) {
sis.dumpInfo = dumpInfo;
}
sis.seek(is.getPos() + startingPos);
return sis;
}
@@ -97,7 +97,6 @@ import java.util.logging.Logger;
*/
public class Action implements GraphSourceItem {
public Action replaceWith;
private boolean ignored = false;
/**
* Action type identifier
@@ -184,29 +183,9 @@ public class Action implements GraphSourceItem {
/**
* Gets all addresses which are referenced from this action and/or
* subactions
*
* @param version SWF version
* @return List of addresses
* @param refs list of addresses
*/
public List<Long> getAllRefs(int version) {
List<Long> ret = new ArrayList<>();
return ret;
}
/**
* Gets all ActionIf or ActionJump actions from list of actions
*
* @param list List of actions
* @return List of actions
*/
public static List<Action> getActionsAllIfsOrJumps(List<Action> list) {
List<Action> ret = new ArrayList<>();
for (Action a : list) {
if (a instanceof ActionIf || a instanceof ActionJump) {
ret.add(a);
}
}
return ret;
public void getRef(List<Long> refs) {
}
/**
@@ -219,16 +198,15 @@ public class Action implements GraphSourceItem {
public static List<Long> getActionsAllRefs(List<Action> list, int version) {
List<Long> ret = new ArrayList<>();
for (Action a : list) {
if (a.replaceWith != null) {
a.replaceWith.setAddress(a.getAddress(), version, false);
ret.addAll(a.replaceWith.getAllRefs(version));
}
List<Long> part = a.getAllRefs(version);
ret.addAll(part);
a.getRef(ret);
}
return ret;
}
public int getTotalActionLength() {
return actionLength + 1 + ((actionCode >= 0x80) ? 2 : 0);
}
/**
* Sets address of this instruction
*
@@ -408,15 +386,14 @@ public class Action implements GraphSourceItem {
* @param listeners
* @param address
* @param list List of actions
* @param importantOffsets List of important offsets to mark as labels
* @param version SWF version
* @param exportMode PCode or hex?
* @param writer
* @param path
* @return HilightedTextWriter
*/
public static GraphTextWriter actionsToString(List<DisassemblyListener> listeners, long address, List<Action> list, List<Long> importantOffsets, int version, ScriptExportMode exportMode, GraphTextWriter writer, String path) {
return actionsToString(listeners, address, list, importantOffsets, new ArrayList<String>(), version, exportMode, writer, path);
public static GraphTextWriter actionsToString(List<DisassemblyListener> listeners, long address, List<Action> list, int version, ScriptExportMode exportMode, GraphTextWriter writer, String path) {
return actionsToString(listeners, address, list, new ArrayList<String>(), version, exportMode, writer, path);
}
/**
@@ -432,12 +409,9 @@ public class Action implements GraphSourceItem {
* @param path
* @return HilightedTextWriter
*/
private static GraphTextWriter actionsToString(List<DisassemblyListener> listeners, long address, List<Action> list, List<Long> importantOffsets, List<String> constantPool, int version, ScriptExportMode exportMode, GraphTextWriter writer, String path) {
private static GraphTextWriter actionsToString(List<DisassemblyListener> listeners, long address, List<Action> list, List<String> constantPool, int version, ScriptExportMode exportMode, GraphTextWriter writer, String path) {
long offset;
if (importantOffsets == null) {
//setActionsAddresses(list, 0, version);
importantOffsets = getActionsAllRefs(list, version);
}
List<Long> importantOffsets = getActionsAllRefs(list, version);
/*List<ConstantPool> cps = SWFInputStream.getConstantPool(new ArrayList<DisassemblyListener>(), new ActionGraphSource(list, version, new HashMap<Integer, String>(), new HashMap<String, GraphTargetItem>(), new HashMap<String, GraphTargetItem>()), 0, version, path);
if (!cps.isEmpty()) {
setConstantPool(list, cps.get(cps.size() - 1));
@@ -505,15 +479,7 @@ public class Action implements GraphSourceItem {
writer.appendNoHilight(":");
}
if (a.replaceWith != null) {
if (lastPush) {
writer.newLine();
lastPush = false;
}
writer.append("", offset);
writer.appendNoHilight(a.replaceWith.getASMSource(list, importantOffsets, constantPool, version, exportMode));
writer.newLine();
} else if (a.isIgnored()) {
if (a.isIgnored()) {
if (lastPush) {
writer.newLine();
lastPush = false;
@@ -1224,7 +1190,7 @@ public class Action implements GraphSourceItem {
String s = null;
try {
HilightedTextWriter writer = new HilightedTextWriter(Configuration.getCodeFormatting(), false);
Action.actionsToString(new ArrayList<DisassemblyListener>(), address, ret, null, version, ScriptExportMode.PCODE, writer, path);
Action.actionsToString(new ArrayList<DisassemblyListener>(), address, ret, version, ScriptExportMode.PCODE, writer, path);
s = writer.toString();
ret = ASMParser.parse(address, true, s, SWF.DEFAULT_VERSION, false);
} catch (IOException | ParseException ex) {
@@ -141,7 +141,7 @@ public class ActionListReader {
int index = getNextNotNullIndex(actionMap, 0);
if (index != -1 && entryAction != actionMap.get(index)) {
ActionJump jump = new ActionJump(0);
int size = getTotalActionLength(jump);
int size = jump.getTotalActionLength();
jump.setJumpOffset((int) (entryAction.getAddress() - size));
actions.add(jump);
}
@@ -157,7 +157,7 @@ public class ActionListReader {
if (!action.isExit() && !(action instanceof ActionJump)) {
ActionJump jump = new ActionJump(0);
jump.setAddress(action.getAddress(), version);
int size = getTotalActionLength(jump);
int size = jump.getTotalActionLength();
jump.setJumpOffset((int) (nextOffset - action.getAddress() - size));
actions.add(jump);
}
@@ -179,7 +179,7 @@ public class ActionListReader {
aEnd.setAddress(endAddress, version);
actions.add(aEnd);
} else {
endAddress -= getTotalActionLength(aEnd);
endAddress -= aEnd.getTotalActionLength();
}
updateJumps(actions, jumps, containerLastActions, endAddress, version);
@@ -270,17 +270,6 @@ public class ActionListReader {
}
last = a;
}
for (int i = 0; i < retdups.size(); i++) {
Action a = retdups.get(i);
if (a instanceof ActionEnd) {
if (i < retdups.size() - 1) {
ActionJump jmp = new ActionJump(0);
jmp.setJumpOffset(retdups.size() - i - jmp.getBytes(version).length);
a.replaceWith = jmp;
}
}
}
ret = Action.removeNops(0, ret, version, path);
List<Action> reta = new ArrayList<>();
for (Object o : ret) {
@@ -329,17 +318,17 @@ public class ActionListReader {
long target = -1;
if (a instanceof ActionIf) {
ActionIf aIf = (ActionIf) a;
target = aIf.getAddress() + getTotalActionLength(a) + aIf.getJumpOffset();
target = aIf.getAddress() + a.getTotalActionLength() + aIf.getJumpOffset();
} else if (a instanceof ActionJump) {
ActionJump aJump = (ActionJump) a;
target = aJump.getAddress() + getTotalActionLength(a) + aJump.getJumpOffset();
target = aJump.getAddress() + a.getTotalActionLength() + aJump.getJumpOffset();
} else if (a instanceof ActionStore) {
ActionStore aStore = (ActionStore) a;
int storeSize = aStore.getStoreSize();
// skip storeSize + 1 actions (+1 is the current action)
Action targetAction = a;
for (int i = 0; i <= storeSize; i++) {
long address = targetAction.getAddress() + getTotalActionLength(targetAction);
long address = targetAction.getAddress() + targetAction.getTotalActionLength();
targetAction = actionMap.get(address);
if (targetAction == null) {
break;
@@ -387,7 +376,7 @@ public class ActionListReader {
int length = a.getBytes(version).length;
if ((i != actions.size() - 1) && (a instanceof ActionEnd)) {
// placeholder for jump action
length = getTotalActionLength(new ActionJump(0));
length = new ActionJump(0).getTotalActionLength();
}
address += length;
}
@@ -412,7 +401,7 @@ public class ActionListReader {
Action a1 = a;
List<Action> store = new ArrayList<>();
while (true) {
long address = a1.getAddress() + getTotalActionLength(a1);
long address = a1.getAddress() + a1.getTotalActionLength();
a1 = actionMap.get(address);
if (a1 == null || a1 == nextActionAfterStore) {
break;
@@ -433,7 +422,7 @@ public class ActionListReader {
long startAddress = a.getAddress() + container.getHeaderSize();
for (int j = 0; j < lastActions.size(); j++) {
Action lastAction = lastActions.get(j);
int length = (int) (lastAction.getAddress() + getTotalActionLength(lastAction) - startAddress);
int length = (int) (lastAction.getAddress() + lastAction.getTotalActionLength() - startAddress);
container.setContainerSize(j, length);
startAddress += length;
}
@@ -469,7 +458,7 @@ public class ActionListReader {
Action a = actions.get(i);
if ((i != actions.size() - 1) && (a instanceof ActionEnd)) {
ActionJump aJump = new ActionJump(0);
aJump.setJumpOffset((int) (endAddress - a.getAddress() - getTotalActionLength(aJump)));
aJump.setJumpOffset((int) (endAddress - a.getAddress() - aJump.getTotalActionLength()));
aJump.setAddress(a.getAddress(), version);
replaceJumpTargets(jumps, a, aJump);
replaceContainerLastActions(containerLastActions, a, aJump);
@@ -480,9 +469,9 @@ public class ActionListReader {
Action target = jumps.get(a);
long offset;
if (target != null) {
offset = target.getAddress() - a.getAddress() - getTotalActionLength(a);
offset = target.getAddress() - a.getAddress() - a.getTotalActionLength();
} else {
offset = endAddress - a.getAddress() - getTotalActionLength(a);
offset = endAddress - a.getAddress() - a.getTotalActionLength();
}
aIf.setJumpOffset((int) offset);
} else if (a instanceof ActionJump) {
@@ -490,9 +479,9 @@ public class ActionListReader {
Action target = jumps.get(a);
long offset;
if (target != null) {
offset = target.getAddress() - a.getAddress() - getTotalActionLength(a);
offset = target.getAddress() - a.getAddress() - a.getTotalActionLength();
} else {
offset = endAddress - a.getAddress() - getTotalActionLength(a);
offset = endAddress - a.getAddress() - a.getTotalActionLength();
}
aJump.setJumpOffset((int) offset);
}
@@ -531,7 +520,7 @@ public class ActionListReader {
long startIp = actions.get(0).getAddress();
Action lastAction = actions.get(actions.size() - 1);
int lastIdx = (int) lastAction.getAddress();
long endAddress = lastAction.getAddress() + getTotalActionLength(lastAction);
long endAddress = lastAction.getAddress() + lastAction.getTotalActionLength();
List<Action> actionMap = new ArrayList<>(lastIdx);
for (int i = 0; i <= lastIdx; i++) {
@@ -608,16 +597,16 @@ public class ActionListReader {
break;
}
int actionLengthWithHeader = getTotalActionLength(a);
int actionLengthWithHeader = a.getTotalActionLength();
// unknown action, replace with jump
if (a instanceof ActionNop) {
ActionJump aJump = new ActionJump(0);
int jumpLength = getTotalActionLength(aJump);
int jumpLength = aJump.getTotalActionLength();
aJump.setAddress(a.getAddress(), version);
aJump.setJumpOffset(actionLengthWithHeader - jumpLength);
a = aJump;
actionLengthWithHeader = getTotalActionLength(a);
actionLengthWithHeader = a.getTotalActionLength();
}
if (entryAction == null) {
@@ -688,10 +677,6 @@ public class ActionListReader {
return entryAction;
}
private static int getTotalActionLength(Action action) {
return action.actionLength + 1 + ((action.actionCode >= 0x80) ? 2 : 0);
}
private static void ensureCapacity(List<Action> actions, List<Long> nextOffsets, long index) {
while (actions.size() <= index) {
actions.add(null);
@@ -715,7 +700,7 @@ public class ActionListReader {
throw new InterruptedException();
}
int actionLen = getTotalActionLength(a);
int actionLen = a.getTotalActionLength();
if (!visited.containsKey(ip)) {
visited.put(ip, 0);
}
@@ -725,7 +710,7 @@ public class ActionListReader {
for (int i = 0; i < listeners.size(); i++) {
listeners.get(i).progress(AppStrings.translate("disassemblingProgress.deobfuscating"), ip, actions.size());
}
int info = a.actionLength + 1 + ((a.actionCode >= 0x80) ? 2 : 0);
int info = a.getTotalActionLength();
if (a instanceof ActionPush) {
if (cpool != null) {
@@ -457,9 +457,12 @@ public class ASMParser {
lexer = new FlasmLexer(new StringReader(source));
List<Label> labels = new ArrayList<>();
List<Action> ret = parse(ignoreNops, labels, address, lexer, constantPool, version);
List<Action> links = Action.getActionsAllIfsOrJumps(ret);
//Action.setActionsAddresses(ret, address, version);
for (Action link : links) {
for (Action link : ret) {
if (!(link instanceof ActionIf || link instanceof ActionJump)) {
continue;
}
boolean found = false;
String identifier = null;
if (link instanceof ActionJump) {
@@ -473,8 +476,7 @@ public class ASMParser {
break;
}
}
}
if (link instanceof ActionIf) {
} else if (link instanceof ActionIf) {
identifier = ((ActionIf) link).identifier;
for (Label label : labels) {
@@ -485,13 +487,12 @@ public class ASMParser {
}
}
}
if ((link instanceof ActionJump) || (link instanceof ActionIf)) {
if (!found) {
if (throwOnError) {
throw new ParseException("TARGET NOT FOUND - identifier:" + identifier + " addr: ofs" + Helper.formatAddress(link.getAddress()), -1);
} else {
Logger.getLogger(ASMParser.class.getName()).log(Level.SEVERE, "TARGET NOT FOUND - identifier:" + identifier + " addr: ofs" + Helper.formatAddress(link.getAddress()));
}
if (!found) {
if (throwOnError) {
throw new ParseException("TARGET NOT FOUND - identifier:" + identifier + " addr: ofs" + Helper.formatAddress(link.getAddress()), -1);
} else {
Logger.getLogger(ASMParser.class.getName()).log(Level.SEVERE, "TARGET NOT FOUND - identifier:" + identifier + " addr: ofs" + Helper.formatAddress(link.getAddress()));
}
}
}
@@ -28,7 +28,6 @@ import com.jpexs.decompiler.graph.GraphSourceItem;
import com.jpexs.helpers.Helper;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -59,14 +58,8 @@ public class ActionIf extends Action {
}
@Override
public List<Long> getAllRefs(int version) {
List<Long> ret = new ArrayList<>();
ret.add(getRef(version));
return ret;
}
public long getRef(int version) {
return getAddress() + getBytes(version).length + offset;
public void getRef(List<Long> refs) {
refs.add(getAddress() + getTotalActionLength() + offset);
}
@Override
@@ -28,7 +28,6 @@ import com.jpexs.decompiler.graph.GraphSourceItem;
import com.jpexs.helpers.Helper;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -59,14 +58,8 @@ public class ActionJump extends Action {
}
@Override
public List<Long> getAllRefs(int version) {
List<Long> ret = new ArrayList<>();
ret.add(getRef(version));
return ret;
}
public long getRef(int version) {
return getAddress() + getBytes(version).length + offset;
public void getRef(List<Long> refs) {
refs.add(getAddress() + getTotalActionLength() + offset);
}
@Override
@@ -96,9 +96,9 @@ public class Configuration {
@ConfigurationCategory("display")
public static final ConfigurationItem<Boolean> dumpView = null;
@ConfigurationDefaultBoolean(true)
@ConfigurationDefaultBoolean(false)
@ConfigurationCategory("display")
public static final ConfigurationItem<Boolean> dumpInfoCollecting = null;
public static final ConfigurationItem<Boolean> lazyDumpInfoCollecting = null;
@ConfigurationDefaultBoolean(false)
@ConfigurationCategory("ui")
@@ -16,6 +16,7 @@
*/
package com.jpexs.decompiler.flash.dumpview;
import com.jpexs.decompiler.flash.tags.TagStub;
import java.util.ArrayList;
import java.util.List;
@@ -27,6 +28,7 @@ public class DumpInfo {
public String name;
public String type;
public TagStub tagToResolve = null;
public Object previewValue;
@@ -667,7 +667,7 @@ public class GenericTagTreePanel extends GenericTagPanel {
SWFInputStream tagDataStream = new SWFInputStream(swf, data, 0, data.length);
TagStub copy = new TagStub(swf, tag.getId(), "Unresolved", tag.getOriginalRange(), tagDataStream);
copy.forceWriteAsLong = tag.forceWriteAsLong;
this.editedTag = SWFInputStream.resolveTag(copy, 0, false, true, swf.gfx);
this.editedTag = SWFInputStream.resolveTag(copy, 0, false, true);
} catch (InterruptedException ex) {
} catch (IOException ex) {
Logger.getLogger(GenericTagTreePanel.class.getName()).log(Level.SEVERE, null, ex);
@@ -17,10 +17,15 @@
package com.jpexs.decompiler.flash.gui.dumpview;
import com.jpexs.decompiler.flash.SWF;
import com.jpexs.decompiler.flash.SWFInputStream;
import com.jpexs.decompiler.flash.dumpview.DumpInfo;
import com.jpexs.decompiler.flash.tags.TagStub;
import com.jpexs.decompiler.flash.treeitems.SWFList;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
@@ -88,12 +93,26 @@ public class DumpTreeModel implements TreeModel {
@Override
public int getChildCount(Object o) {
return ((DumpInfo) o).getChildCount();
DumpInfo di = (DumpInfo) o;
if (di.tagToResolve != null) {
TagStub tagStub = di.tagToResolve;
try {
SWFInputStream sis = tagStub.getDataStream();
sis.seek(tagStub.getDataPos());
sis.dumpInfo = di;
SWFInputStream.resolveTag(tagStub, 0, false, true);
} catch (InterruptedException | IOException ex) {
Logger.getLogger(DumpTreeModel.class.getName()).log(Level.SEVERE, null, ex);
}
di.tagToResolve = null;
}
return di.getChildCount();
}
@Override
public boolean isLeaf(Object o) {
return ((DumpInfo) o).getChildCount() == 0;
DumpInfo di = (DumpInfo) o;
return (di.tagToResolve == null) && di.getChildCount() == 0;
}
@Override
@@ -60,8 +60,8 @@ config.description.decompile = You can disable AS decompilation, then only P-cod
config.name.dumpView = Dump View
config.description.dumpView = View raw data dump
config.name.dumpInfoCollecting = Dump Info Collecting
config.description.dumpInfoCollecting = Enable/disable information collecting for raw data view
config.name.lazyDumpInfoCollecting = Dump Info Collecting
config.description.lazyDumpInfoCollecting = Enable/disable information collecting for raw data view
config.name.parallelSpeedUp = Parallel SpeedUp
config.description.parallelSpeedUp = Parallelism can speed up decompilation
@@ -256,5 +256,5 @@ config.description.textExportExportFontFace = Vkl\u00e1dat soubory p\u00edsem do
config.name.dumpView = Dump zobrazen\u00ed
config.description.dumpView = Zobrazit dump raw dat
config.name.dumpInfoCollecting = Sb\u011br informac\u00ed pro dump
config.description.dumpInfoCollecting = Povolit/Zak\u00e1zat sb\u011br informac\u00ed pro zobrazen\u00ed raw dat
config.name.lazyDumpInfoCollecting = Sb\u011br informac\u00ed pro dump
config.description.lazyDumpInfoCollecting = Povolit/Zak\u00e1zat sb\u011br informac\u00ed pro zobrazen\u00ed raw dat
@@ -1,259 +1,259 @@
# Copyright (C) 2010-2014 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/>.
advancedSettings.dialog.title = Param\u00e8tres avanc\u00e9s
advancedSettings.restartConfirmation = Vous devez red\u00e9marrer le programme pour que les changements prennent effet. Voulez-vous le red\u00e9marrer maintenant ?
advancedSettings.columns.name = Nom
advancedSettings.columns.value = Valeur
advancedSettings.columns.description = Description
default = D\u00e9faut
config.group.name.export = Export
config.group.description.export = Configuration de l'export
config.group.name.script = Scripts
config.group.description.script = ActionScript decompilation related
config.group.name.update = Mises \u00e0 jour
config.group.description.update = Recherche de mises \u00e0 jour
config.group.name.format = Mise en forme
config.group.description.format = Mise en forme du code ActionScript
config.group.name.limit = Limites
config.group.description.limit = Limites de la d\u00e9compilation du code crypt\u00e9, etc.
config.group.name.ui = Interface
config.group.description.ui = Configuration de l'interface utilisateur
config.group.name.debug = Deboggage
config.group.description.debug = Param\u00e8tres de d\u00e9boggage
config.group.name.display = Affichage
config.group.description.display = Affichage des objets Flash, etc.
config.group.name.decompilation = D\u00e9compilation
config.group.description.decompilation = Fonctions relatives l'int\u00e9gralit\u00e9 de la d\u00e9compilation
config.group.name.other = Autres
config.group.description.other = Autres configurations
config.name.openMultipleFiles = Ouvrir plusieurs fichiers
config.description.openMultipleFiles = Autoiriser l'ouverture de plusieurs fichiers dans une seule fen\u00eatre
config.name.decompile = Afficher les sources ActionScript
config.description.decompile = Vous pouvez d\u00e9sactiver la d\u00e9compilation ActionScript, seul le code Assembleur sera affich\u00e9
config.name.dumpView = Donn\u00e9es brutes
config.description.dumpView = Voir les données brutes
config.name.dumpInfoCollecting = Recueillir les données d'informations brutes
config.description.dumpInfoCollecting = Activer/d\u00e9sactiver l'affichage des donn\u00e9es brutes
config.name.parallelSpeedUp = Acc\u00e9l\u00e9ration parall\u00e8le
config.description.parallelSpeedUp = Le parall\u00e9lisme peut augmenter la vitesse de d\u00e9ompilation
config.name.parallelThreadCount = Nombre de canaux
config.description.parallelThreadCount = Nombre de canaux a utiliser pour l'acc\u00e9l\u00e9ration parall\u00e8le
config.name.autoDeobfuscate = D\u00e9sobfuscation automatique
config.description.autoDeobfuscate = D\u00e9marer la d\u00e9sobfuscation sur l'ensemble des fichiers avant la d\u00e9compilation ActionScript
config.name.cacheOnDisk = Utilisation de la m\u00e9moire cache du disque
config.description.cacheOnDisk = Cache already decompiled parts on hard drive instead of memory
config.name.internalFlashViewer = Utiliser la visionneuse Flash int\u00e9grUse
config.description.internalFlashViewer = Utililser la visionneuse Flash JPEXS au lieu de la visionneuse Flash standard pour afficher les \u00e9l\u00e9ments
config.name.gotoMainClassOnStartup = Aller \u00e0 la classe d'initialisation (AS3)
config.description.gotoMainClassOnStartup = Aller dans la classe de document \u00e0 l'ouverture du fichier AS3
config.name.autoRenameIdentifiers = Renommage automatique des identifiants
config.description.autoRenameIdentifiers = Renommage automatique invalide en chargeant le fichier SWF
config.name.offeredAssociation = (Interne) Association de fichiers SWF d\u00e9j\u00e0 ouvert
config.description.offeredAssociation = La boite de dialogue d'association de fichiers est d\u00e9j\u00e0 ouverte
config.name.decimalAddress = Utiliser l'adressage d\u00e9cimale
config.description.decimalAddress = Utiliser l'adressage d\u00e9cimale au lieu de l'adressage hexad\u00e9cimal
config.name.showAllAddresses = Afficher toutes les adresses
config.description.showAllAddresses = Afficher toutes les instructions ActionScript \u00e0 toutes les adresses
config.name.useFrameCache = Utiliser la md\u00e9j\u00e0moire cache des images
config.description.useFrameCache = Mettre en cache les images avant le nouveau rendu
config.name.useRibbonInterface = Interface Ruban
config.description.useRibbonInterface = D\u00e9cocher pour utiliser l'interface classique sans le menu-ruban
config.name.openFolderAfterFlaExport = Ouvrir le dossier apr\u00e8s l'export FLA
config.description.openFolderAfterFlaExport = Afficher le dossier apr\u00e8s l'export de fichiers FLA
config.name.useDetailedLogging = Journal d\u00e9taill\u00e9
config.description.useDetailedLogging = Les messages d'erreurs et les informations de d\u00e9bogages sont renseign\u00e9s dans le journal d\u00e9taill\u00e9
config.name.debugMode = Mode d\u00e9boggage
config.description.debugMode = Mode for debugging. Turns on debug menu.
config.name.resolveConstants = R\u00e9soudre les constante dans le code assembleur en AS1/2
config.description.resolveConstants = Arr\u00eate d'afficher 'constantxx' au lieu des vraies valeurs dans la fen\u00eatre assembleur
config.name.sublimiter = Limites du sous-programme
config.description.sublimiter = Limites du sous-programme pour du code crypt\u00e9
config.name.exportTimeout = Limite de temps \u00e9coul\u00e9 \u00e0 l'exportation (secondes)
config.description.exportTimeout = Le d\u00e9compileur arr\u00eatera l'exportation d\u00e8 que cette valeur est atteinte
config.name.decompilationTimeoutFile = Limite de temps pour d\u00e9compiler un fichier (secondes)
config.description.decompilationTimeoutFile = Le d\u00e9compileur arr\u00eatera la d\u00e9compilation ActionScript d\u00e8s que cette valeur est atteinte pour un fichier
config.name.paramNamesEnable = Activer les noms de param\u00e9tre en AS3
config.description.paramNamesEnable = L'utilisation des noms de param\u00e9tre en d\u00e8compilant peut causer des probl\u00e8mes parce que le programme officiel CS 5.5 pr\u00e8f\u00e9re Flash ins\u00e8rer des mauvais indices de noms de param\u00e9tres
config.name.displayFileName = Afficher le nom SWF dans la barre de titre
config.description.displayFileName = Afficher l'URL et le nom de fichier dans la barre de titre (Vous pouvez faire des captures d'\u00e8cran)
config.name.debugCopy = Debug recompile
config.description.debugCopy = Tenter de compiler le fichier SWF \u00e0 nouveau apr\u00e8s son ouverture pour s'assurer qu'il produise le m\u00eame code binaire. \u00c0 utiliser uniquement pour le d\u00e9boguage !
config.name.dumpTags = Dump tags to console
config.description.dumpTags = Dump tags to console on reading SWF file
config.name.decompilationTimeoutSingleMethod = AS3: Single method decompilation timeout (seconds)
config.description.decompilationTimeoutSingleMethod = Decompiler will stop ActionScript decompilation after reaching this time in one method
config.name.lastRenameType = (Internal) Last rename type
config.description.lastRenameType = Last used rename identifiers type
config.name.lastSaveDir = (Interne) Dernier dossier de sauvegarde
config.description.lastSaveDir = Dernier dossier de sauvegarde utilis\u00e9
config.name.lastOpenDir = (Interne) Dernier dossier ouvert
config.description.lastOpenDir = Dernier dossier ouvert utilis\u00e9
config.name.lastExportDir = (Interne) Dernier dossier d'export
config.description.lastExportDir = Dernier dossier d'export utilis\u00e9
config.name.locale = Langues
config.description.locale = Param\u00e9tres r\u00e8gionaux
config.name.registerNameFormat = Format du registre des variables
config.description.registerNameFormat = Format du registre local des noms de variables. Utilise %d pour le registre num\u00e8rique.
config.name.maxRecentFileCount = Nb. max. de fichiers r\u00e8cents
config.description.maxRecentFileCount = Nombre maximal de fichiers r\u00e8cents
config.name.recentFiles = (Interne) Fichiers r\u00e8cents
config.description.recentFiles = Fichiers r\u00e8cemment ouverts
config.name.fontPairing = (Internal) Font pairs for import
config.description.fontPairing = Font pairs for importing new characters
config.name.lastUpdatesCheckDate = (Interne) Date de derni\u00e8re Mises \u00e0 jour
config.description.lastUpdatesCheckDate = Date de la derni\u00e8re v\u00e9rification des mises \u00e0 jour sur sur le serveur
config.name.gui.window.width = (Interne) Derni\u00e8re largeur de fen\u00eatre
config.description.gui.window.width = Derni\u00e8re valeur enregistr\u00e9e de la largeur de la fen\u00eatre
config.name.gui.window.height = (Interne) Derni\u00e8re hauteur de fen\u00eatre
config.description.gui.window.height = Derni\u00e7re valeur enregistr\u00e9e de la hauteur de la fen\u00eatre
config.name.gui.window.maximized.horizontal = (Interne) Agrandissement horizontal de la fen\u00eatre
config.description.gui.window.maximized.horizontal = Dernier \u00e9tat de la fen\u00eatre - Agrandissement horizontal
config.name.gui.window.maximized.vertical = (Interne) Agrandissement vertical de la Fen\u00eatre
config.description.gui.window.maximized.vertical = Derni\u00e8r \u00e9tat de la fen\u00eatre - Agrandissement vertical
config.name.gui.avm2.splitPane.dividerLocation = (Interne) Emplacement du s\u00e9parateur AS3
config.description.gui.avm2.splitPane.dividerLocation =
config.name.guiActionSplitPaneDividerLocation = (Interne) Emplacement du s\u00e9parateur AS1/2
config.description.guiActionSplitPaneDividerLocation =
config.name.guiPreviewSplitPaneDividerLocation = (Interne) Aper\u00e7u de l'emplacement du s\u00e9parateur
config.description.guiPreviewSplitPaneDividerLocation =
config.name.gui.splitPane1.dividerLocation = (Interne) Emplacement du s\u00e9parateur 1
config.description.gui.splitPane1.dividerLocation =
config.name.gui.splitPane2.dividerLocation = (Interne) Emplacement du s\u00e9parateur 2
config.description.gui.splitPane2.dividerLocation =
config.name.saveAsExeScaleMode = Enregistrer en tant qu'\u00e9chelle de mode EXE
config.description.saveAsExeScaleMode = Mode de mise \u00e0 l'\u00e9chelle pour un export EXE
config.name.syntaxHighlightLimit = Nb max de caract\u00e8res surlign\u00e9s
config.description.syntaxHighlightLimit = Nombre maximal de caract\u00e8res pour surligner
config.name.guiFontPreviewSampleText = (Internal) Last font preview sample text
config.description.guiFontPreviewSampleText = Last font preview sample text list index
config.name.gui.fontPreviewWindow.width = (Interne) Derni\u00e8re largeur de fen\u00eatre d'aper\u00e7u des polices de caract\u00e8res
config.description.gui.fontPreviewWindow.width =
config.name.gui.fontPreviewWindow.height = (Interne) Derni\u00e8re hauteur de fen\u00eatre d'aper\u00e7u des polices de caract\u00e8res
config.description.gui.fontPreviewWindow.height =
config.name.gui.fontPreviewWindow.posX = (Interne) Derni\u00e8re position X de la fen\u00eatre d'aper\u00e7u des polices de caract\u00e8res
config.description.gui.fontPreviewWindow.posX = Il s'agit de la position de la fen\u00eatre sur l'axe des absisses
config.name.gui.fontPreviewWindow.posY = (Interne) Derni\u00e8re position Y de la fen\u00eatre d'aper\u00e7u des polices de caract\u00e8res
config.description.gui.fontPreviewWindow.posY = Il s'agit de la position de la fen\u00eatre sur l'axe des ordonn\u00e9es
config.name.formatting.indent.size = Nb de caract\u00e8res par indentation
config.description.formatting.indent.size = Nombre d'espaces (ou tabulations) for une indentation
config.name.formatting.indent.useTabs = Indentation
config.description.formatting.indent.useTabs = Utiliser les tabulation au lieu d'espaces pour l'indentation
config.name.beginBlockOnNewLine = Accolades pour les nouvelle lignes
config.description.beginBlockOnNewLine = Commencer les blocs avec des accolades sur les nouvelles lignes
config.name.check.updates.delay = Intervale de v\u00e8rification des mises \u00e0 jour
config.description.check.updates.delay = Intervale minimum entre chaque v\u00e8rification automatique des mises \u00e8 jour lorsque au d\u00e8marrage de l'application
config.name.check.updates.stable = V\u00e8rification des versions stables
config.description.check.updates.stable = V\u00e8rification des mises \u00e0 jour des versions stables
config.name.check.updates.nightly = V\u00e8rification des versions de tests
config.description.check.updates.nightly = V\u00e8rification des mises \u00e0 jour des versions de tests
config.name.check.updates.enabled = V\u00e8rification automatique activ\u00e8e
config.description.check.updates.enabled = V\u00e8rification automatique des mises \u00e0 jour lorsque au d\u00e8marrage de l'application
config.name.export.formats = (Interne) Formats d'export
config.description.export.formats = Derniers formats d'export utilis\u00e8
config.name.textExportSingleFile = Export de textes dans un seul fichier
config.description.textExportSingleFile = Exportation de textes dans un seul fichier plutôt que dans plusieurs
config.name.textExportSingleFileSeparator = S\u00e8parateur de textes dans un fichier d'export de textes
config.description.textExportSingleFileSeparator = Texte \u00e0 ins\u00e8rer entre chaque texte dans un fichier d'export de textes
config.name.textExportSingleFileRecordSeparator = S\u00e8parateur d'enregistrement dans un fichier d'export de textes
config.description.textExportSingleFileRecordSeparator = Texte \u00e0 ins\u00e8rer entre chaque enregistrement dans un fichier d'export de textes
config.name.warning.experimental.as12edit = Alerte lors d'\u00e8dition en AS1/2
config.description.warning.experimental.as12edit = Afficher l'avertissement lors de l'\u00e8dition exp\u00e8rimentale des scripts AS1/2
config.name.warning.experimental.as3edit = Alerte lors d'\u00e8dition en AS3
config.description.warning.experimental.as3edit = Afficher l'avertissement lors de l'\u00e8dition exp\u00e8rimentale des scripts AS3
config.name.packJavaScripts = Paquet JavaScripts
config.description.packJavaScripts = Démarrer le paquet avaScript sur des scripts cr\u00e8\u00e8s lors de l'exportation de dessins.
config.name.textExportExportFontFace = Use font-face in SVG export
config.description.textExportExportFontFace = Embed font files in SVG using font-face instead of shapes
# Copyright (C) 2010-2014 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/>.
advancedSettings.dialog.title = Param\u00e8tres avanc\u00e9s
advancedSettings.restartConfirmation = Vous devez red\u00e9marrer le programme pour que les changements prennent effet. Voulez-vous le red\u00e9marrer maintenant ?
advancedSettings.columns.name = Nom
advancedSettings.columns.value = Valeur
advancedSettings.columns.description = Description
default = D\u00e9faut
config.group.name.export = Export
config.group.description.export = Configuration de l'export
config.group.name.script = Scripts
config.group.description.script = ActionScript decompilation related
config.group.name.update = Mises \u00e0 jour
config.group.description.update = Recherche de mises \u00e0 jour
config.group.name.format = Mise en forme
config.group.description.format = Mise en forme du code ActionScript
config.group.name.limit = Limites
config.group.description.limit = Limites de la d\u00e9compilation du code crypt\u00e9, etc.
config.group.name.ui = Interface
config.group.description.ui = Configuration de l'interface utilisateur
config.group.name.debug = Deboggage
config.group.description.debug = Param\u00e8tres de d\u00e9boggage
config.group.name.display = Affichage
config.group.description.display = Affichage des objets Flash, etc.
config.group.name.decompilation = D\u00e9compilation
config.group.description.decompilation = Fonctions relatives l'int\u00e9gralit\u00e9 de la d\u00e9compilation
config.group.name.other = Autres
config.group.description.other = Autres configurations
config.name.openMultipleFiles = Ouvrir plusieurs fichiers
config.description.openMultipleFiles = Autoiriser l'ouverture de plusieurs fichiers dans une seule fen\u00eatre
config.name.decompile = Afficher les sources ActionScript
config.description.decompile = Vous pouvez d\u00e9sactiver la d\u00e9compilation ActionScript, seul le code Assembleur sera affich\u00e9
config.name.dumpView = Donn\u00e9es brutes
config.description.dumpView = Voir les donn\u00e9es brutes
config.name.lazyDumpInfoCollecting = Recueillir les donn\u00e9es d'informations brutes
config.description.lazyDumpInfoCollecting = Activer/d\u00e9sactiver l'affichage des donn\u00e9es brutes
config.name.parallelSpeedUp = Acc\u00e9l\u00e9ration parall\u00e8le
config.description.parallelSpeedUp = Le parall\u00e9lisme peut augmenter la vitesse de d\u00e9ompilation
config.name.parallelThreadCount = Nombre de canaux
config.description.parallelThreadCount = Nombre de canaux a utiliser pour l'acc\u00e9l\u00e9ration parall\u00e8le
config.name.autoDeobfuscate = D\u00e9sobfuscation automatique
config.description.autoDeobfuscate = D\u00e9marer la d\u00e9sobfuscation sur l'ensemble des fichiers avant la d\u00e9compilation ActionScript
config.name.cacheOnDisk = Utilisation de la m\u00e9moire cache du disque
config.description.cacheOnDisk = Cache already decompiled parts on hard drive instead of memory
config.name.internalFlashViewer = Utiliser la visionneuse Flash int\u00e9grUse
config.description.internalFlashViewer = Utililser la visionneuse Flash JPEXS au lieu de la visionneuse Flash standard pour afficher les \u00e9l\u00e9ments
config.name.gotoMainClassOnStartup = Aller \u00e0 la classe d'initialisation (AS3)
config.description.gotoMainClassOnStartup = Aller dans la classe de document \u00e0 l'ouverture du fichier AS3
config.name.autoRenameIdentifiers = Renommage automatique des identifiants
config.description.autoRenameIdentifiers = Renommage automatique invalide en chargeant le fichier SWF
config.name.offeredAssociation = (Interne) Association de fichiers SWF d\u00e9j\u00e0 ouvert
config.description.offeredAssociation = La boite de dialogue d'association de fichiers est d\u00e9j\u00e0 ouverte
config.name.decimalAddress = Utiliser l'adressage d\u00e9cimale
config.description.decimalAddress = Utiliser l'adressage d\u00e9cimale au lieu de l'adressage hexad\u00e9cimal
config.name.showAllAddresses = Afficher toutes les adresses
config.description.showAllAddresses = Afficher toutes les instructions ActionScript \u00e0 toutes les adresses
config.name.useFrameCache = Utiliser la md\u00e9j\u00e0moire cache des images
config.description.useFrameCache = Mettre en cache les images avant le nouveau rendu
config.name.useRibbonInterface = Interface Ruban
config.description.useRibbonInterface = D\u00e9cocher pour utiliser l'interface classique sans le menu-ruban
config.name.openFolderAfterFlaExport = Ouvrir le dossier apr\u00e8s l'export FLA
config.description.openFolderAfterFlaExport = Afficher le dossier apr\u00e8s l'export de fichiers FLA
config.name.useDetailedLogging = Journal d\u00e9taill\u00e9
config.description.useDetailedLogging = Les messages d'erreurs et les informations de d\u00e9bogages sont renseign\u00e9s dans le journal d\u00e9taill\u00e9
config.name.debugMode = Mode d\u00e9boggage
config.description.debugMode = Mode for debugging. Turns on debug menu.
config.name.resolveConstants = R\u00e9soudre les constante dans le code assembleur en AS1/2
config.description.resolveConstants = Arr\u00eate d'afficher 'constantxx' au lieu des vraies valeurs dans la fen\u00eatre assembleur
config.name.sublimiter = Limites du sous-programme
config.description.sublimiter = Limites du sous-programme pour du code crypt\u00e9
config.name.exportTimeout = Limite de temps \u00e9coul\u00e9 \u00e0 l'exportation (secondes)
config.description.exportTimeout = Le d\u00e9compileur arr\u00eatera l'exportation d\u00e8 que cette valeur est atteinte
config.name.decompilationTimeoutFile = Limite de temps pour d\u00e9compiler un fichier (secondes)
config.description.decompilationTimeoutFile = Le d\u00e9compileur arr\u00eatera la d\u00e9compilation ActionScript d\u00e8s que cette valeur est atteinte pour un fichier
config.name.paramNamesEnable = Activer les noms de param\u00e9tre en AS3
config.description.paramNamesEnable = L'utilisation des noms de param\u00e9tre en d\u00e8compilant peut causer des probl\u00e8mes parce que le programme officiel CS 5.5 pr\u00e8f\u00e9re Flash ins\u00e8rer des mauvais indices de noms de param\u00e9tres
config.name.displayFileName = Afficher le nom SWF dans la barre de titre
config.description.displayFileName = Afficher l'URL et le nom de fichier dans la barre de titre (Vous pouvez faire des captures d'\u00e8cran)
config.name.debugCopy = Debug recompile
config.description.debugCopy = Tenter de compiler le fichier SWF \u00e0 nouveau apr\u00e8s son ouverture pour s'assurer qu'il produise le m\u00eame code binaire. \u00c0 utiliser uniquement pour le d\u00e9boguage !
config.name.dumpTags = Dump tags to console
config.description.dumpTags = Dump tags to console on reading SWF file
config.name.decompilationTimeoutSingleMethod = AS3: Single method decompilation timeout (seconds)
config.description.decompilationTimeoutSingleMethod = Decompiler will stop ActionScript decompilation after reaching this time in one method
config.name.lastRenameType = (Internal) Last rename type
config.description.lastRenameType = Last used rename identifiers type
config.name.lastSaveDir = (Interne) Dernier dossier de sauvegarde
config.description.lastSaveDir = Dernier dossier de sauvegarde utilis\u00e9
config.name.lastOpenDir = (Interne) Dernier dossier ouvert
config.description.lastOpenDir = Dernier dossier ouvert utilis\u00e9
config.name.lastExportDir = (Interne) Dernier dossier d'export
config.description.lastExportDir = Dernier dossier d'export utilis\u00e9
config.name.locale = Langues
config.description.locale = Param\u00e9tres r\u00e8gionaux
config.name.registerNameFormat = Format du registre des variables
config.description.registerNameFormat = Format du registre local des noms de variables. Utilise %d pour le registre num\u00e8rique.
config.name.maxRecentFileCount = Nb. max. de fichiers r\u00e8cents
config.description.maxRecentFileCount = Nombre maximal de fichiers r\u00e8cents
config.name.recentFiles = (Interne) Fichiers r\u00e8cents
config.description.recentFiles = Fichiers r\u00e8cemment ouverts
config.name.fontPairing = (Internal) Font pairs for import
config.description.fontPairing = Font pairs for importing new characters
config.name.lastUpdatesCheckDate = (Interne) Date de derni\u00e8re Mises \u00e0 jour
config.description.lastUpdatesCheckDate = Date de la derni\u00e8re v\u00e9rification des mises \u00e0 jour sur sur le serveur
config.name.gui.window.width = (Interne) Derni\u00e8re largeur de fen\u00eatre
config.description.gui.window.width = Derni\u00e8re valeur enregistr\u00e9e de la largeur de la fen\u00eatre
config.name.gui.window.height = (Interne) Derni\u00e8re hauteur de fen\u00eatre
config.description.gui.window.height = Derni\u00e7re valeur enregistr\u00e9e de la hauteur de la fen\u00eatre
config.name.gui.window.maximized.horizontal = (Interne) Agrandissement horizontal de la fen\u00eatre
config.description.gui.window.maximized.horizontal = Dernier \u00e9tat de la fen\u00eatre - Agrandissement horizontal
config.name.gui.window.maximized.vertical = (Interne) Agrandissement vertical de la Fen\u00eatre
config.description.gui.window.maximized.vertical = Derni\u00e8r \u00e9tat de la fen\u00eatre - Agrandissement vertical
config.name.gui.avm2.splitPane.dividerLocation = (Interne) Emplacement du s\u00e9parateur AS3
config.description.gui.avm2.splitPane.dividerLocation =
config.name.guiActionSplitPaneDividerLocation = (Interne) Emplacement du s\u00e9parateur AS1/2
config.description.guiActionSplitPaneDividerLocation =
config.name.guiPreviewSplitPaneDividerLocation = (Interne) Aper\u00e7u de l'emplacement du s\u00e9parateur
config.description.guiPreviewSplitPaneDividerLocation =
config.name.gui.splitPane1.dividerLocation = (Interne) Emplacement du s\u00e9parateur 1
config.description.gui.splitPane1.dividerLocation =
config.name.gui.splitPane2.dividerLocation = (Interne) Emplacement du s\u00e9parateur 2
config.description.gui.splitPane2.dividerLocation =
config.name.saveAsExeScaleMode = Enregistrer en tant qu'\u00e9chelle de mode EXE
config.description.saveAsExeScaleMode = Mode de mise \u00e0 l'\u00e9chelle pour un export EXE
config.name.syntaxHighlightLimit = Nb max de caract\u00e8res surlign\u00e9s
config.description.syntaxHighlightLimit = Nombre maximal de caract\u00e8res pour surligner
config.name.guiFontPreviewSampleText = (Internal) Last font preview sample text
config.description.guiFontPreviewSampleText = Last font preview sample text list index
config.name.gui.fontPreviewWindow.width = (Interne) Derni\u00e8re largeur de fen\u00eatre d'aper\u00e7u des polices de caract\u00e8res
config.description.gui.fontPreviewWindow.width =
config.name.gui.fontPreviewWindow.height = (Interne) Derni\u00e8re hauteur de fen\u00eatre d'aper\u00e7u des polices de caract\u00e8res
config.description.gui.fontPreviewWindow.height =
config.name.gui.fontPreviewWindow.posX = (Interne) Derni\u00e8re position X de la fen\u00eatre d'aper\u00e7u des polices de caract\u00e8res
config.description.gui.fontPreviewWindow.posX = Il s'agit de la position de la fen\u00eatre sur l'axe des absisses
config.name.gui.fontPreviewWindow.posY = (Interne) Derni\u00e8re position Y de la fen\u00eatre d'aper\u00e7u des polices de caract\u00e8res
config.description.gui.fontPreviewWindow.posY = Il s'agit de la position de la fen\u00eatre sur l'axe des ordonn\u00e9es
config.name.formatting.indent.size = Nb de caract\u00e8res par indentation
config.description.formatting.indent.size = Nombre d'espaces (ou tabulations) for une indentation
config.name.formatting.indent.useTabs = Indentation
config.description.formatting.indent.useTabs = Utiliser les tabulation au lieu d'espaces pour l'indentation
config.name.beginBlockOnNewLine = Accolades pour les nouvelle lignes
config.description.beginBlockOnNewLine = Commencer les blocs avec des accolades sur les nouvelles lignes
config.name.check.updates.delay = Intervale de v\u00e8rification des mises \u00e0 jour
config.description.check.updates.delay = Intervale minimum entre chaque v\u00e8rification automatique des mises \u00e8 jour lorsque au d\u00e8marrage de l'application
config.name.check.updates.stable = V\u00e8rification des versions stables
config.description.check.updates.stable = V\u00e8rification des mises \u00e0 jour des versions stables
config.name.check.updates.nightly = V\u00e8rification des versions de tests
config.description.check.updates.nightly = V\u00e8rification des mises \u00e0 jour des versions de tests
config.name.check.updates.enabled = V\u00e8rification automatique activ\u00e8e
config.description.check.updates.enabled = V\u00e8rification automatique des mises \u00e0 jour lorsque au d\u00e8marrage de l'application
config.name.export.formats = (Interne) Formats d'export
config.description.export.formats = Derniers formats d'export utilis\u00e8
config.name.textExportSingleFile = Export de textes dans un seul fichier
config.description.textExportSingleFile = Exportation de textes dans un seul fichier plut\u00f4t que dans plusieurs
config.name.textExportSingleFileSeparator = S\u00e8parateur de textes dans un fichier d'export de textes
config.description.textExportSingleFileSeparator = Texte \u00e0 ins\u00e8rer entre chaque texte dans un fichier d'export de textes
config.name.textExportSingleFileRecordSeparator = S\u00e8parateur d'enregistrement dans un fichier d'export de textes
config.description.textExportSingleFileRecordSeparator = Texte \u00e0 ins\u00e8rer entre chaque enregistrement dans un fichier d'export de textes
config.name.warning.experimental.as12edit = Alerte lors d'\u00e8dition en AS1/2
config.description.warning.experimental.as12edit = Afficher l'avertissement lors de l'\u00e8dition exp\u00e8rimentale des scripts AS1/2
config.name.warning.experimental.as3edit = Alerte lors d'\u00e8dition en AS3
config.description.warning.experimental.as3edit = Afficher l'avertissement lors de l'\u00e8dition exp\u00e8rimentale des scripts AS3
config.name.packJavaScripts = Paquet JavaScripts
config.description.packJavaScripts = D\u00e9marrer le paquet avaScript sur des scripts cr\u00e8\u00e8s lors de l'exportation de dessins.
config.name.textExportExportFontFace = Use font-face in SVG export
config.description.textExportExportFontFace = Embed font files in SVG using font-face instead of shapes
@@ -60,8 +60,8 @@ config.description.decompile = Kikapcsolhatja az AS visszaford\u00edt\u00e1s\u00
config.name.dumpView = Dump N\u00e9zet
config.description.dumpView = Nyers adatok mutat\u00e1sa
config.name.dumpInfoCollecting = Dump Info Gy\u0171jt\u00e9s
config.description.dumpInfoCollecting = Nyers adat n\u00e9zethez sz\u00fcks\u00e9ges inform\u00e1ci\u00f3k gy\u0171jt\u00e9s\u00e9nek enged\u00e9lyez\u00e9se/letilt\u00e1sa
config.name.lazyDumpInfoCollecting = Dump Info Gy\u0171jt\u00e9s
config.description.lazyDumpInfoCollecting = Nyers adat n\u00e9zethez sz\u00fcks\u00e9ges inform\u00e1ci\u00f3k gy\u0171jt\u00e9s\u00e9nek enged\u00e9lyez\u00e9se/letilt\u00e1sa
config.name.parallelSpeedUp = P\u00e1rhuzamos gyors\u00edt\u00e1s
config.description.parallelSpeedUp = P\u00e1rhuzamos\u00edt\u00e1s fel tudja gyors\u00edtani a visszaford\u00edt\u00e1st
@@ -60,8 +60,8 @@ config.description.decompile = \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435
config.name.dumpView = \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u043e\u0431\u0440\u0430\u0437\u0430
config.description.dumpView = \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0441\u044b\u0440\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445
config.name.dumpInfoCollecting = \u0421\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435 \u043e\u0431\u0440\u0430\u0437\u0430
config.description.dumpInfoCollecting = \u0412\u043a\u043b / \u0412\u044b\u043a\u043b \u0441\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435 \u043e\u0431\u0440\u0430\u0437\u0430
config.name.lazyDumpInfoCollecting = \u0421\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435 \u043e\u0431\u0440\u0430\u0437\u0430
config.description.lazyDumpInfoCollecting = \u0412\u043a\u043b / \u0412\u044b\u043a\u043b \u0441\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435 \u043e\u0431\u0440\u0430\u0437\u0430
config.name.parallelSpeedUp = Parallel SpeedUp
config.description.parallelSpeedUp = \u0420\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043f\u0440\u0438 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0435\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c
@@ -145,7 +145,7 @@ public class DefineButtonTag extends ButtonTag implements ASMSource {
if (actions == null) {
actions = getActions();
}
return Action.actionsToString(listeners, 0, actions, null, swf.version, exportMode, writer, toString()/*FIXME?*/);
return Action.actionsToString(listeners, 0, actions, swf.version, exportMode, writer, toString()/*FIXME?*/);
}
/**
@@ -208,7 +208,7 @@ public class DefineSpriteTag extends CharacterTag implements Container, Drawable
super(sis.getSwf(), ID, "DefineSprite", data);
spriteId = sis.readUI16("spriteId");
frameCount = sis.readUI16("frameCount");
List<Tag> subTags = sis.readTagList(this, level + 1, parallel, skipUnusualTags, true, swf.gfx);
List<Tag> subTags = sis.readTagList(this, level + 1, parallel, skipUnusualTags, true);
if (subTags.size() > 0 && subTags.get(subTags.size() - 1).getId() == EndTag.ID) {
hasEndTag = true;
subTags.remove(subTags.size() - 1);
@@ -95,7 +95,7 @@ public class DoActionTag extends Tag implements ASMSource {
if (actions == null) {
actions = getActions();
}
return Action.actionsToString(listeners, 0, actions, null, swf.version, exportMode, writer, toString()/*FIXME?*/);
return Action.actionsToString(listeners, 0, actions, swf.version, exportMode, writer, toString()/*FIXME?*/);
}
/**
@@ -109,7 +109,7 @@ public class DoInitActionTag extends CharacterIdTag implements ASMSource {
if (actions == null) {
actions = getActions();
}
return Action.actionsToString(listeners, 0, actions, null, swf.version, exportMode, writer, toString()/*FIXME?*/);
return Action.actionsToString(listeners, 0, actions, swf.version, exportMode, writer, toString()/*FIXME?*/);
}
@Override
@@ -164,7 +164,7 @@ public class BUTTONCONDACTION implements ASMSource, Exportable, ContainerItem, S
if (actions == null) {
actions = getActions();
}
return Action.actionsToString(listeners, 0, actions, null, swf.version, exportMode, writer, toString()/*FIXME?*/);
return Action.actionsToString(listeners, 0, actions, swf.version, exportMode, writer, toString()/*FIXME?*/);
}
/**
@@ -180,7 +180,7 @@ public class CLIPACTIONRECORD implements ASMSource, Exportable, ContainerItem, S
if (actions == null) {
actions = getActions();
}
return Action.actionsToString(listeners, 0, actions, null, swf.version, exportMode, writer, toString()/*FIXME?*/);
return Action.actionsToString(listeners, 0, actions, swf.version, exportMode, writer, toString()/*FIXME?*/);
}
/**