diff --git a/trunk/src/com/jpexs/decompiler/flash/SWF.java b/trunk/src/com/jpexs/decompiler/flash/SWF.java index 042d030b9..d9a288c09 100644 --- a/trunk/src/com/jpexs/decompiler/flash/SWF.java +++ b/trunk/src/com/jpexs/decompiler/flash/SWF.java @@ -1539,7 +1539,7 @@ public final class SWF implements TreeItem, Timelined { tim = getTimeline(); } else { tim = ((Timelined) characters.get(containerId)).getTimeline(); - path = File.separator + characters.get(containerId).getExportFileName(); + path = File.separator + Helper.makeFileName(characters.get(containerId).getExportFileName()); } if (frames == null) { int frameCnt = tim.frames.size(); diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java index a83662d8d..39956e048 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java @@ -22,7 +22,6 @@ import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; import com.jpexs.decompiler.flash.abc.avm2.instructions.arithmetic.NotIns; -import com.jpexs.decompiler.flash.abc.avm2.instructions.comparison.StrictEqualsIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.construction.ConstructSuperIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.construction.NewActivationIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.construction.NewCatchIns; @@ -33,9 +32,7 @@ import com.jpexs.decompiler.flash.abc.avm2.instructions.jumps.IfTrueIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.jumps.JumpIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.jumps.LookupSwitchIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.GetLocal0Ins; -import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.GetLocalIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.KillIns; -import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.SetLocalIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.other.FindPropertyStrictIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.other.GetLexIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.other.GetScopeObjectIns; @@ -60,7 +57,6 @@ import com.jpexs.decompiler.flash.abc.avm2.model.AVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.BooleanAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.FloatValueAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.IntegerValueAVM2Item; -import com.jpexs.decompiler.flash.abc.avm2.model.LocalRegAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.NullAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.ReturnValueAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.ReturnVoidAVM2Item; @@ -111,8 +107,6 @@ import com.jpexs.decompiler.graph.model.UnboundedTypeItem; import com.jpexs.decompiler.graph.model.WhileItem; import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.lang.reflect.Array; -import java.util.AbstractList; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -1243,7 +1237,7 @@ public class AVM2SourceGenerator implements SourceGenerator { List registerNames = new ArrayList<>(); List registerTypes = new ArrayList<>(); - registerTypes.add(pkg.equals("") ? className : pkg + "." + className); + registerTypes.add(pkg.isEmpty() ? className : pkg + "." + className); registerNames.add("this"); for (GraphTargetItem t : paramTypes) { registerTypes.add(t.toString()); diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NameAVM2Item.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NameAVM2Item.java index 771ae1753..5446c03dd 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NameAVM2Item.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NameAVM2Item.java @@ -221,8 +221,8 @@ public class NameAVM2Item extends AssignableAVM2Item { if (variableName != null && regNumber == -1 && slotNumber == -1 && ns == null) { throw new RuntimeException("No register or slot set for " + variableName); } - if (definition && assignedValue == null) { - return new ArrayList(); + if (definition && assignedValue == null) { + return new ArrayList<>(); } AVM2SourceGenerator g = (AVM2SourceGenerator) generator; Reference ns_temp = new Reference<>(-1); diff --git a/trunk/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java b/trunk/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java index f6d0cf086..aa3b792fd 100644 --- a/trunk/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java +++ b/trunk/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java @@ -526,7 +526,7 @@ public class PreviewPanel extends JSplitPane implements ActionListener { /*FileAttributesTag fa = new FileAttributesTag(); sos2.writeTag(fa); */ - new SetBackgroundColorTag(null, new RGB(backgroundColor)).writeTag(sos2); + new SetBackgroundColorTag(swf, new RGB(backgroundColor)).writeTag(sos2); if (tagObj instanceof FrameNodeItem) { FrameNodeItem fn = (FrameNodeItem) tagObj; @@ -589,12 +589,12 @@ public class PreviewPanel extends JSplitPane implements ActionListener { mat.translateX += width / 2; mat.translateY += height / 2; } - new PlaceObject2Tag(null, false, false, false, false, false, true, false, true, depth, chid, mat, null, 0, null, 0, null).writeTag(sos2); + new PlaceObject2Tag(swf, false, false, false, false, false, true, false, true, depth, chid, mat, null, 0, null, 0, null).writeTag(sos2); } } } - new ShowFrameTag(null).writeTag(sos2); + new ShowFrameTag(swf).writeTag(sos2); } else { if (tagObj instanceof DefineBitsTag) { @@ -663,23 +663,23 @@ public class PreviewPanel extends JSplitPane implements ActionListener { rec.add(tr); mat.translateX = x * width / cols; mat.translateY = y * height / rows; - new DefineTextTag(null, 999 + f, new RECT(0, width, 0, height), new MATRIX(), rec).writeTag(sos2); - new PlaceObject2Tag(null, false, false, false, true, false, true, true, false, 1 + f, 999 + f, mat, null, 0, null, 0, null).writeTag(sos2); + new DefineTextTag(swf, 999 + f, new RECT(0, width, 0, height), new MATRIX(), rec).writeTag(sos2); + new PlaceObject2Tag(swf, false, false, false, true, false, true, true, false, 1 + f, 999 + f, mat, null, 0, null, 0, null).writeTag(sos2); x++; } - new ShowFrameTag(null).writeTag(sos2); + new ShowFrameTag(swf).writeTag(sos2); } else if ((tagObj instanceof DefineMorphShapeTag) || (tagObj instanceof DefineMorphShape2Tag)) { - new PlaceObject2Tag(null, false, false, false, true, false, true, true, false, 1, chtId, mat, null, 0, null, 0, null).writeTag(sos2); - new ShowFrameTag(null).writeTag(sos2); + new PlaceObject2Tag(swf, false, false, false, true, false, true, true, false, 1, chtId, mat, null, 0, null, 0, null).writeTag(sos2); + new ShowFrameTag(swf).writeTag(sos2); int numFrames = 100; for (int ratio = 0; ratio < 65536; ratio += 65536 / numFrames) { - new PlaceObject2Tag(null, false, false, false, true, false, true, false, true, 1, chtId, mat, null, ratio, null, 0, null).writeTag(sos2); - new ShowFrameTag(null).writeTag(sos2); + new PlaceObject2Tag(swf, false, false, false, true, false, true, false, true, 1, chtId, mat, null, ratio, null, 0, null).writeTag(sos2); + new ShowFrameTag(swf).writeTag(sos2); } } else if (tagObj instanceof SoundStreamHeadTypeTag) { for (SoundStreamBlockTag blk : soundFrames) { blk.writeTag(sos2); - new ShowFrameTag(null).writeTag(sos2); + new ShowFrameTag(swf).writeTag(sos2); } } else if (tagObj instanceof DefineSoundTag) { ExportAssetsTag ea = new ExportAssetsTag(); @@ -708,7 +708,7 @@ public class PreviewPanel extends JSplitPane implements ActionListener { + "Stop", swf.version, false); doa.setActions(actions); doa.writeTag(sos2); - new ShowFrameTag(null).writeTag(sos2); + new ShowFrameTag(swf).writeTag(sos2); actions = ASMParser.parse(0, 0, false, "ConstantPool \"_root\" \"my_sound\" \"Sound\" \"my_define_sound\" \"attachSound\" \"start\"\n" @@ -735,7 +735,7 @@ public class PreviewPanel extends JSplitPane implements ActionListener { + "Stop", swf.version, false); doa.setActions(actions); doa.writeTag(sos2); - new ShowFrameTag(null).writeTag(sos2); + new ShowFrameTag(swf).writeTag(sos2); actions = ASMParser.parse(0, 0, false, "ConstantPool \"_root\" \"my_sound\" \"Sound\" \"my_define_sound\" \"attachSound\" \"onSoundComplete\" \"start\" \"execParam\"\n" @@ -779,22 +779,22 @@ public class PreviewPanel extends JSplitPane implements ActionListener { + "Stop", swf.version, false); doa.setActions(actions); doa.writeTag(sos2); - new ShowFrameTag(null).writeTag(sos2); + new ShowFrameTag(swf).writeTag(sos2); actions = ASMParser.parse(0, 0, false, "StopSounds\n" + "Stop", swf.version, false); doa.setActions(actions); doa.writeTag(sos2); - new ShowFrameTag(null).writeTag(sos2); + new ShowFrameTag(swf).writeTag(sos2); - new ShowFrameTag(null).writeTag(sos2); + new ShowFrameTag(swf).writeTag(sos2); if (flashPanel != null) { flashPanel.specialPlayback = true; } } else if (tagObj instanceof DefineVideoStreamTag) { - new PlaceObject2Tag(null, false, false, false, false, false, true, true, false, 1, chtId, mat, null, 0, null, 0, null).writeTag(sos2); + new PlaceObject2Tag(swf, false, false, false, false, false, true, true, false, 1, chtId, mat, null, 0, null, 0, null).writeTag(sos2); List frs = new ArrayList<>(videoFrames.values()); Collections.sort(frs, new Comparator() { @Override @@ -807,20 +807,20 @@ public class PreviewPanel extends JSplitPane implements ActionListener { for (VideoFrameTag f : frs) { if (!first) { ratio++; - new PlaceObject2Tag(null, false, false, false, true, false, false, false, true, 1, 0, null, null, ratio, null, 0, null).writeTag(sos2); + new PlaceObject2Tag(swf, false, false, false, true, false, false, false, true, 1, 0, null, null, ratio, null, 0, null).writeTag(sos2); } f.writeTag(sos2); - new ShowFrameTag(null).writeTag(sos2); + new ShowFrameTag(swf).writeTag(sos2); first = false; } } else { - new PlaceObject2Tag(null, false, false, false, true, false, true, true, false, 1, chtId, mat, null, 0, null, 0, null).writeTag(sos2); - new ShowFrameTag(null).writeTag(sos2); + new PlaceObject2Tag(swf, false, false, false, true, false, true, true, false, 1, chtId, mat, null, 0, null, 0, null).writeTag(sos2); + new ShowFrameTag(swf).writeTag(sos2); } }//not showframe - new EndTag(null).writeTag(sos2); + new EndTag(swf).writeTag(sos2); data = baos.toByteArray(); } diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/DoInitActionTag.java b/trunk/src/com/jpexs/decompiler/flash/tags/DoInitActionTag.java index 0fd786687..f99358411 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/DoInitActionTag.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/DoInitActionTag.java @@ -198,7 +198,7 @@ public class DoInitActionTag extends CharacterIdTag implements ASMSource { } else { pathParts = new String[]{expName}; } - return Helper.makeFileName(pathParts[pathParts.length - 1]); + return pathParts[pathParts.length - 1]; } @Override diff --git a/trunk/src/com/jpexs/decompiler/flash/tags/Tag.java b/trunk/src/com/jpexs/decompiler/flash/tags/Tag.java index 4115ef60a..a0b908901 100644 --- a/trunk/src/com/jpexs/decompiler/flash/tags/Tag.java +++ b/trunk/src/com/jpexs/decompiler/flash/tags/Tag.java @@ -134,7 +134,10 @@ public class Tag implements NeedsCharacters, Exportable, ContainerItem, Serializ this.data = data; this.pos = pos; this.swf = swf; - if (data == null) {//it is tag build by constructor + if (swf == null) { + throw new Error("swf parameter cannot be null."); + } + if (data == null) { // it is tag build by constructor this.data = new byte[0]; modified = true; } diff --git a/trunk/src/com/jpexs/decompiler/flash/treenodes/TagNode.java b/trunk/src/com/jpexs/decompiler/flash/treenodes/TagNode.java index 74024513a..577ec55cb 100644 --- a/trunk/src/com/jpexs/decompiler/flash/treenodes/TagNode.java +++ b/trunk/src/com/jpexs/decompiler/flash/treenodes/TagNode.java @@ -103,7 +103,7 @@ public class TagNode extends ContainerNode { for (TreeNode node : nodeList) { String name = ""; if (node.item instanceof Exportable) { - name = ((Exportable) node.item).getExportFileName(); + name = Helper.makeFileName(((Exportable) node.item).getExportFileName()); } else { name = Helper.makeFileName(node.item.toString()); } @@ -116,19 +116,21 @@ public class TagNode extends ContainerNode { existingNames.add(name); if (node.subNodes.isEmpty()) { if ((node.item instanceof ASMSource) && (node.export)) { - if (!dir.exists()) { - if (!dir.mkdirs()) { - if (!dir.exists()) { - continue; - } - } - } boolean retry; do { retry = false; try { - String f = outdir + name + ".as"; int currentIndex = index.getAndIncrement(); + + if (!dir.exists()) { + if (!dir.mkdirs()) { + if (!dir.exists()) { + throw new IOException("Cannot create directory " + outdir); + } + } + } + + String f = outdir + name + ".as"; if (ev != null) { ev.handleEvent("exporting", "Exporting " + currentIndex + "/" + count + " " + f); }