diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/amf/amf0/Amf0InputStream.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/amf/amf0/Amf0InputStream.java index 2f6fcae2a..156ebb097 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/amf/amf0/Amf0InputStream.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/amf/amf0/Amf0InputStream.java @@ -326,7 +326,7 @@ public class Amf0InputStream extends InputStream { newDumpLevel(name, "value-type"); Object result = null; int marker = readInternal(); - System.err.println("marker " + Integer.toHexString(marker)); + //System.err.println("marker " + Integer.toHexString(marker)); switch (marker) { case Marker.NUMBER: result = readDouble("DOUBLE"); @@ -368,7 +368,6 @@ public class Amf0InputStream extends InputStream { break; case Marker.ECMA_ARRAY: int associativeCount = (int) readU32("associative-count"); - System.err.println("associativeCount = " + associativeCount); EcmaArrayType ea = new EcmaArrayType(); for (int a = 0; a < associativeCount; a++) { String eaKey = readUtf8("key"); @@ -431,9 +430,9 @@ public class Amf0InputStream extends InputStream { throw new IllegalArgumentException("Unsupported type"); } - if (result != null) { + /*if (result != null) { System.err.println("Read: " + Amf0Exporter.amfToString(result, 0, "\r\n", new ArrayList<>(), new HashMap<>(), new HashMap<>())); - } + }*/ endDumpLevel(); return result; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/amf/amf3/Amf3InputStream.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/amf/amf3/Amf3InputStream.java index 53415a61c..06014e702 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/amf/amf3/Amf3InputStream.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/amf/amf3/Amf3InputStream.java @@ -595,7 +595,7 @@ public class Amf3InputStream extends InputStream { endDumpLevel(); LOGGER.log(Level.FINER, "Array value: dense_size={0},assocSize={1}", new Object[]{densePart.size(), assocPart.size()}); result = retArray; - + } else { renameU29O_ref(); int refIndexArray = (int) (arrayU29 >> 1); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/amf/amf3/Amf3Exporter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/amf/amf3/Amf3Exporter.java index c9328628c..c515af71a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/amf/amf3/Amf3Exporter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/exporters/amf/amf3/Amf3Exporter.java @@ -293,17 +293,15 @@ public class Amf3Exporter { if (!at.getAssociativeValues().isEmpty()) { ret.append(newLine); } - if (true) { - int i = 0; - for (String key : at.associativeKeySet()) { - Object val = at.getAssociative(key); - ret.append(indent(level + 2)).append(amfToString(indentStr, newLine, processedObjects, level + 1, key, referenceCount, objectAlias)).append(" : ").append(amfToString(indentStr, newLine, processedObjects, level + 1, val, referenceCount, objectAlias)); - if (i < at.getAssociativeValues().size() - 1) { - ret.append(","); - } - ret.append(newLine); - i++; + int i = 0; + for (String key : at.associativeKeySet()) { + Object val = at.getAssociative(key); + ret.append(indent(level + 2)).append(amfToString(indentStr, newLine, processedObjects, level + 1, key, referenceCount, objectAlias)).append(" : ").append(amfToString(indentStr, newLine, processedObjects, level + 1, val, referenceCount, objectAlias)); + if (i < at.getAssociativeValues().size() - 1) { + ret.append(","); } + ret.append(newLine); + i++; } if (!at.getAssociativeValues().isEmpty()) { ret.append(indent(level + 1)); @@ -316,20 +314,21 @@ public class Amf3Exporter { ret.append(indent(level + 1)).append("\"type\": \"Dictionary\",").append(newLine); ret.append(addId); ret.append(indent(level + 1)).append("\"weakKeys\": ").append(dt.hasWeakKeys()).append(",").append(newLine); - ret.append(indent(level + 1)).append("\"entries\": {").append(newLine); - if (true) { - int i = 0; - for (Object key : dt.keySet()) { - Object val = dt.get(key); - ret.append(indent(level + 1)).append(amfToString(indentStr, newLine, processedObjects, level + 1, key, referenceCount, objectAlias)).append(" : ").append(amfToString(indentStr, newLine, processedObjects, level + 1, val, referenceCount, objectAlias)); - if (i < dt.size() - 1) { - ret.append(","); - } - ret.append(newLine); - i++; + ret.append(indent(level + 1)).append("\"entries\": [").append(newLine); + int i = 0; + for (Object key : dt.keySet()) { + Object val = dt.get(key); + ret.append(indent(level + 2)).append("{").append(newLine); + ret.append(indent(level + 3)).append("\"key\": ").append(amfToString(indentStr, newLine, processedObjects, level + 3, key, referenceCount, objectAlias)).append(",").append(newLine); + ret.append(indent(level + 3)).append("\"value\": ").append(amfToString(indentStr, newLine, processedObjects, level + 3, val, referenceCount, objectAlias)).append(newLine); + ret.append(indent(level + 2)).append("}"); + if (i < dt.size() - 1) { + ret.append(","); } + ret.append(newLine); + i++; } - ret.append(indent(level + 1)).append("}").append(newLine); + ret.append(indent(level + 1)).append("]").append(newLine); ret.append(indent(level)).append("}"); } else if (object instanceof ByteArrayType) { ByteArrayType ba = (ByteArrayType) object; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/amf/amf0/Amf0Importer.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/amf/amf0/Amf0Importer.java index 2e738fbb4..8bd2453b4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/amf/amf0/Amf0Importer.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/amf/amf0/Amf0Importer.java @@ -335,13 +335,7 @@ public class Amf0Importer { Object key = value(objectTable); expectedType(SymbolType.COLON); Object value = value(objectTable); - ret.put(key, value); - if ("id".equals(key)) { - if (!(value instanceof String)) { - throw new AmfParseException("id must be string value", lexer.yyline()); - } - objectTable.put((String) value, BasicType.UNDEFINED); - } + ret.put(key, value); s = lex(); } while (s.isType(SymbolType.COMMA)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/amf/amf3/Amf3Importer.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/amf/amf3/Amf3Importer.java index c4e1b186d..9a93b4140 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/amf/amf3/Amf3Importer.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/importers/amf/amf3/Amf3Importer.java @@ -341,12 +341,12 @@ public class Amf3Importer { expectedType(SymbolType.COLON); Object value = value(objectTable); ret.put(key, value); - if ("id".equals(key)) { + /*if ("id".equals(key)) { if (!(value instanceof String)) { throw new AmfParseException("id must be string value", lexer.yyline()); } objectTable.put((String) value, BasicType.UNDEFINED); - } + }*/ s = lex(); } while (s.isType(SymbolType.COMMA)); } @@ -440,8 +440,22 @@ public class Amf3Importer { break; case "Dictionary": boolean weakKeys = typedObject.getBoolean("weakKeys"); - typedObject.resolve("entries", objectTable, false); - Map entries = typedObject.getJsObject("entries").getAll(); + //typedObject.resolve("entries", objectTable, false); + //Map entries = typedObject.getJsObject("entries").getAll(); + Map entries = new LinkedHashMap<>(); + List entryArray = typedObject.getJsArray("entries").values; + for (Object entry : entryArray) { + if (!(entry instanceof JsObject)) { + throw new AmfParseException("Invalid dictionary entry", lexer.yyline()); + } + JsObject entryJso = (JsObject) entry; + entryJso.resolve("key", objectTable, true); + entryJso.resolve("value", objectTable, true); + + Object key = entryJso.get("key"); + Object value = entryJso.get("value"); + entries.put(key, value); + } resultObject = new DictionaryType(weakKeys, entries); break; case "Reference": diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/sol/LsoTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/sol/LsoTag.java index 089c8bf7a..01cc4397a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/sol/LsoTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/sol/LsoTag.java @@ -136,7 +136,7 @@ public class LsoTag extends Tag { List objectTable = new ArrayList<>(); for(String key: amfValues.keySet()) { try { - a3os.writeUtf8Vr(key, new ArrayList<>()); //Intentionally not using string table + a3os.writeUtf8Vr(key, stringTable); a3os.writeValue(amfValues.get(key), new HashMap<>(), stringTable, traitTable, objectTable); } catch (NoSerializerExistsException ex) { throw new IllegalArgumentException("Serializer not found for class " + ex.getClassName()); diff --git a/libsrc/ffdec_lib/testdata/sharedobjects/data/amf0test.sol b/libsrc/ffdec_lib/testdata/sharedobjects/data/amf0test.sol index 0e4c29a7e..083a44107 100644 Binary files a/libsrc/ffdec_lib/testdata/sharedobjects/data/amf0test.sol and b/libsrc/ffdec_lib/testdata/sharedobjects/data/amf0test.sol differ diff --git a/libsrc/ffdec_lib/testdata/sharedobjects/data/amf3test.sol b/libsrc/ffdec_lib/testdata/sharedobjects/data/amf3test.sol index db6a1aaf3..ba3462a33 100644 Binary files a/libsrc/ffdec_lib/testdata/sharedobjects/data/amf3test.sol and b/libsrc/ffdec_lib/testdata/sharedobjects/data/amf3test.sol differ diff --git a/libsrc/ffdec_lib/testdata/sharedobjects/sharedobjects.swf b/libsrc/ffdec_lib/testdata/sharedobjects/sharedobjects.swf index f0603286c..e3247c0df 100644 Binary files a/libsrc/ffdec_lib/testdata/sharedobjects/sharedobjects.swf and b/libsrc/ffdec_lib/testdata/sharedobjects/sharedobjects.swf differ diff --git a/libsrc/ffdec_lib/testdata/sharedobjects/sharedobjects/DOMDocument.xml b/libsrc/ffdec_lib/testdata/sharedobjects/sharedobjects/DOMDocument.xml index d5950a1f3..6be6c9fad 100644 --- a/libsrc/ffdec_lib/testdata/sharedobjects/sharedobjects/DOMDocument.xml +++ b/libsrc/ffdec_lib/testdata/sharedobjects/sharedobjects/DOMDocument.xml @@ -67,12 +67,6 @@ var key2:Object = { id: 2 }; di[key1] = "First"; di[key2] = "Second"; -var diso:SharedObject = SharedObject.getLocal("dict"); -diso.objectEncoding = ObjectEncoding.AMF3; -diso.data.mydict = di; -diso.flush(); - - var data = { mynumber : 1.5, mybool : true, @@ -169,6 +163,8 @@ function fonLoad(event:MouseEvent):void { + + @@ -187,7 +183,5 @@ function fonLoad(event:MouseEvent):void { - - \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/sharedobjects/sharedobjects/bin/SymDepend.cache b/libsrc/ffdec_lib/testdata/sharedobjects/sharedobjects/bin/SymDepend.cache index 4801afbc1..3866f06b9 100644 Binary files a/libsrc/ffdec_lib/testdata/sharedobjects/sharedobjects/bin/SymDepend.cache and b/libsrc/ffdec_lib/testdata/sharedobjects/sharedobjects/bin/SymDepend.cache differ diff --git a/src/com/jpexs/decompiler/flash/gui/MainFrameRibbonMenu.java b/src/com/jpexs/decompiler/flash/gui/MainFrameRibbonMenu.java index 5aacfc2ad..60de6c804 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainFrameRibbonMenu.java +++ b/src/com/jpexs/decompiler/flash/gui/MainFrameRibbonMenu.java @@ -680,6 +680,9 @@ public class MainFrameRibbonMenu extends MainFrameMenu { @Override public void setMenuEnabled(String path, boolean enabled) { + if (menuItems == null) { + return; + } if (!menuItems.containsKey(path)) { throw new IllegalArgumentException("Menu not found: " + path); }