From 83560802bf865842d9c4981b660d269275e7462a Mon Sep 17 00:00:00 2001 From: "honfika@gmail.com" Date: Sun, 9 Nov 2014 16:15:58 +0100 Subject: [PATCH] config setting to load inner swfs automatically --- .../flash/configuration/Configuration.java | 4 +++ .../flash/tags/DefineBinaryDataTag.java | 32 +++++++++++++++++++ .../decompiler/flash/gui/BinaryPanel.java | 28 +++------------- .../jpexs/decompiler/flash/gui/MainPanel.java | 2 +- .../decompiler/flash/gui/PreviewPanel.java | 6 ++-- .../locales/AdvancedSettingsDialog.properties | 3 ++ 6 files changed, 47 insertions(+), 28 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java index b478193ed..453d25395 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/configuration/Configuration.java @@ -363,6 +363,10 @@ public class Configuration { @ConfigurationCategory("ui") public static final ConfigurationItem tagTreeShowEmptyFolders = null; + @ConfigurationDefaultBoolean(false) + @ConfigurationCategory("ui") + public static final ConfigurationItem autoLoadEmbeddedSwfs = null; + private enum OSId { WINDOWS, OSX, UNIX diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineBinaryDataTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineBinaryDataTag.java index 3a77097e5..7791e4ff0 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineBinaryDataTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineBinaryDataTag.java @@ -19,15 +19,19 @@ package com.jpexs.decompiler.flash.tags; import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.SWFInputStream; import com.jpexs.decompiler.flash.SWFOutputStream; +import com.jpexs.decompiler.flash.configuration.Configuration; import com.jpexs.decompiler.flash.tags.base.CharacterTag; import com.jpexs.decompiler.flash.types.BasicType; import com.jpexs.decompiler.flash.types.annotations.Internal; import com.jpexs.decompiler.flash.types.annotations.Reserved; import com.jpexs.decompiler.flash.types.annotations.SWFType; import com.jpexs.helpers.ByteArrayRange; +import com.jpexs.helpers.utf8.Utf8Helper; +import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.util.Arrays; public class DefineBinaryDataTag extends CharacterTag { @@ -80,10 +84,38 @@ public class DefineBinaryDataTag extends CharacterTag { tag = sis.readUI16("tag"); reserved = sis.readUI32("reserved"); binaryData = sis.readBytesEx(sis.available(), "binaryData"); + + try { + SWF bswf = new SWF(new ByteArrayInputStream(binaryData), Configuration.parallelSpeedUp.get()); + bswf.fileTitle = "(SWF Data)"; + innerSwf = bswf; + } catch (IOException | InterruptedException ex) { + //ignore + } } @Override public int getCharacterId() { return tag; } + + public boolean isSwfData() { + try { + if (binaryData.length > 8) { + String signature = new String(binaryData, 0, 3, Utf8Helper.charset); + if (Arrays.asList( + "FWS", //Uncompressed Flash + "CWS", //ZLib compressed Flash + "ZWS", //LZMA compressed Flash + "GFX", //Uncompressed ScaleForm GFx + "CFX" //Compressed ScaleForm GFx + ).contains(signature)) { + return true; + } + } + } catch (Exception ex) { + } + + return false; + } } diff --git a/src/com/jpexs/decompiler/flash/gui/BinaryPanel.java b/src/com/jpexs/decompiler/flash/gui/BinaryPanel.java index 3e486e6bb..492ab273d 100644 --- a/src/com/jpexs/decompiler/flash/gui/BinaryPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/BinaryPanel.java @@ -76,32 +76,12 @@ public final class BinaryPanel extends JPanel implements ComponentListener { swfInsidePanel.setVisible(false); } - public void setBinaryData(byte[] data, DefineBinaryDataTag binaryDataTag) { + public void setBinaryData(DefineBinaryDataTag binaryDataTag) { this.binaryDataTag = binaryDataTag; - this.data = data; + data = binaryDataTag == null ? null : binaryDataTag.binaryData; if (data != null) { hexEditor.setData(data, null, null); - - boolean binaryIsSwf = false; - if (binaryDataTag != null) { - if (binaryDataTag.innerSwf == null && data.length > 8) { - try { - String signature = new String(data, 0, 3, Utf8Helper.charset); - if (Arrays.asList( - "FWS", //Uncompressed Flash - "CWS", //ZLib compressed Flash - "ZWS", //LZMA compressed Flash - "GFX", //Uncompressed ScaleForm GFx - "CFX" //Compressed ScaleForm GFx - ).contains(signature)) { - binaryIsSwf = true; - } - } catch (Exception ex) { - } - } - } - - swfInsidePanel.setVisible(binaryIsSwf); + swfInsidePanel.setVisible(binaryDataTag.innerSwf == null && binaryDataTag.isSwfData()); } else { hexEditor.setData(new byte[0], null, null); swfInsidePanel.setVisible(false); @@ -112,7 +92,7 @@ public final class BinaryPanel extends JPanel implements ComponentListener { @Override public void componentResized(ComponentEvent e) { - setBinaryData(data, binaryDataTag); + setBinaryData(binaryDataTag); } @Override diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index f4ef5dd10..017642b68 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -2361,7 +2361,7 @@ public final class MainPanel extends JPanel implements ActionListener, TreeSelec } else if (treeItem instanceof DefineBinaryDataTag) { DefineBinaryDataTag binaryTag = (DefineBinaryDataTag) treeItem; showCard(CARDPREVIEWPANEL); - previewPanel.showBinaryPanel(binaryTag.binaryData, binaryTag); + previewPanel.showBinaryPanel(binaryTag); } else if (treeItem instanceof ASMSource) { ensureActionPanel(); showCard(CARDACTIONSCRIPTPANEL); diff --git a/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java b/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java index d02f51df6..a3a4733f6 100644 --- a/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/PreviewPanel.java @@ -422,14 +422,14 @@ public class PreviewPanel extends JSplitPane implements ActionListener { public void clear() { imagePanel.stop(); - binaryPanel.setBinaryData(null, null); + binaryPanel.setBinaryData(null); genericTagPanel.clear(); fontPanel.clear(); } - public void showBinaryPanel(byte[] data, DefineBinaryDataTag binaryDataTag) { + public void showBinaryPanel(DefineBinaryDataTag binaryDataTag) { showCardLeft(BINARY_TAG_CARD); - binaryPanel.setBinaryData(data, binaryDataTag); + binaryPanel.setBinaryData(binaryDataTag); parametersPanel.setVisible(false); } diff --git a/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog.properties b/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog.properties index 67872cb14..0b75578ec 100644 --- a/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog.properties +++ b/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog.properties @@ -290,3 +290,6 @@ config.description.getLocalNamesFromDebugInfo = If debug info present, renames l config.name.tagTreeShowEmptyFolders = Show empty folders config.description.tagTreeShowEmptyFolders = Show empty folders in tag tree. + +config.name.autoLoadEmbeddedSwfs = Auto load embedded SWFs +config.description.autoLoadEmbeddedSwfs = Automaticaly load the embedded SWFs from DefineBinaryData tags.