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:
Jindra Petřík
2024-11-10 19:50:55 +01:00
parent 58c9d2f2cc
commit 4942acd05b
12 changed files with 50 additions and 47 deletions
@@ -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);
@@ -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;
@@ -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));
}
@@ -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());