mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/jpexs-decompiler.git
synced 2026-09-27 17:50:43 +00:00
AMF3 Dictionary has entries in JSON array with key+value fields.
AMF3 SOL map writing uses stringTable for keys. Ribbon menuitems Nullpointer.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
+21
-22
@@ -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;
|
||||
|
||||
+1
-7
@@ -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));
|
||||
}
|
||||
|
||||
+18
-4
@@ -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<Object, Object> entries = typedObject.getJsObject("entries").getAll();
|
||||
//typedObject.resolve("entries", objectTable, false);
|
||||
//Map<Object, Object> entries = typedObject.getJsObject("entries").getAll();
|
||||
Map<Object, Object> entries = new LinkedHashMap<>();
|
||||
List<Object> 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":
|
||||
|
||||
@@ -136,7 +136,7 @@ public class LsoTag extends Tag {
|
||||
List<Object> 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());
|
||||
|
||||
Reference in New Issue
Block a user