From bf0a7c02b95a1555f558306d896c880910a00dce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Tue, 22 Nov 2016 19:49:37 +0100 Subject: [PATCH] reading list of flash tags from iggy file - WIP --- .../decompiler/flash/iggy/IggyExtractor.java | 15 +++--- .../flash/iggy/IggyFlashHeader32.java | 48 ++++++++++++++++-- .../flash/iggy/IggyFlashHeader64.java | 50 +++++++++++++++++-- 3 files changed, 100 insertions(+), 13 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyExtractor.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyExtractor.java index 25d842ed9..4b39b6127 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyExtractor.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyExtractor.java @@ -37,25 +37,26 @@ public class IggyExtractor extends AbstractDataStream implements AutoCloseable { subFileEntries.add(new IggySubFileEntry(this)); } - List indexStreams = new ArrayList<>(); + List indexDatas = new ArrayList<>(); List flashStreams = new ArrayList<>(); for (int i = 0; i < subFileEntries.size(); i++) { IggySubFileEntry entry = subFileEntries.get(i); - ByteArrayDataStream entryStream = getEntryDataStream(i); if (entry.type == IggySubFileEntry.TYPE_INDEX) { - indexStreams.add(entryStream); + indexDatas.add(getEntryData(i)); } else if (entry.type == IggySubFileEntry.TYPE_FLASH) { - flashStreams.add(entryStream); + flashStreams.add(getEntryDataStream(i)); } } + IggyFlashHeader64 fh64 = null; + IggyFlashHeader32 fh32 = null; + for (ByteArrayDataStream fs : flashStreams) { if (is64()) { - IggyFlashHeader64 fh = new IggyFlashHeader64(fs); - System.out.println("" + fh); + fh64 = new IggyFlashHeader64(fs); } else { - IggyFlashHeader32 fh = new IggyFlashHeader32(fs); + fh32 = new IggyFlashHeader32(fs); } } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyFlashHeader32.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyFlashHeader32.java index 458d159fb..da2b5f87b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyFlashHeader32.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyFlashHeader32.java @@ -1,7 +1,13 @@ package com.jpexs.decompiler.flash.iggy; +import com.jpexs.decompiler.flash.iggy.annotations.IggyArrayFieldType; import com.jpexs.decompiler.flash.iggy.annotations.IggyFieldType; +import com.jpexs.decompiler.flash.tags.Tag; +import com.jpexs.decompiler.flash.tags.TagTypeInfo; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; /** * @@ -46,7 +52,7 @@ public class IggyFlashHeader32 implements StructureInterface { long unk_38; @IggyFieldType(DataType.uint32_t) long unk_3C; - float unk_40; + float frame_rate; @IggyFieldType(DataType.uint32_t) long unk_44; @IggyFieldType(DataType.uint32_t) @@ -75,6 +81,11 @@ public class IggyFlashHeader32 implements StructureInterface { long unk_78; // Maybe number of classes / as3 names @IggyFieldType(DataType.uint32_t) long unk_7C; + @IggyFieldType(value = DataType.uint16_t, count = 20) + String name; + + List tagIds = new ArrayList<>(); + List tagIdsExtendedInfo = new ArrayList<>(); // Offset 0x80 (outside header): there are *unk_28* relative offsets that point to flash objects. // The flash objects are in a format different to swf but there is probably a way to convert between them. @@ -104,7 +115,7 @@ public class IggyFlashHeader32 implements StructureInterface { unk_34 = stream.readUI32(); unk_38 = stream.readUI32(); unk_3C = stream.readUI32(); - unk_40 = stream.readFloat(); + frame_rate = stream.readFloat(); unk_44 = stream.readUI32(); unk_48 = stream.readUI32(); unk_4C = stream.readUI32(); @@ -120,6 +131,26 @@ public class IggyFlashHeader32 implements StructureInterface { unk_74 = stream.readUI32(); unk_78 = stream.readUI32(); unk_7C = stream.readUI32(); + StringBuilder nameBuilder = new StringBuilder(); + do { + char c = (char) stream.readUI16(); + if (c == '\0') { + break; + } + nameBuilder.append(c); + } while (true); + name = nameBuilder.toString(); + + while (true) { + long typeLen = stream.readUI16(); //TODO: check whether it's really UI16 - 64bit works with UI32 + if (typeLen == 0) { + break; + } + long tagLength = stream.readUI16(); + int tagType = (int) ((typeLen >>> 6) + 10) & 0x3FF; + tagIds.add(tagType); + tagIdsExtendedInfo.add(tagLength); + } } @Override @@ -148,7 +179,7 @@ public class IggyFlashHeader32 implements StructureInterface { sb.append("unk_34 ").append(unk_34).append("\r\n"); sb.append("unk_38 ").append(unk_38).append("\r\n"); sb.append("unk_3C ").append(unk_3C).append("\r\n"); - sb.append("unk_40 ").append(unk_40).append("\r\n"); + sb.append("frame_rate ").append(frame_rate).append("\r\n"); sb.append("unk_44 ").append(unk_44).append("\r\n"); sb.append("unk_48 ").append(unk_48).append("\r\n"); sb.append("unk_4C ").append(unk_4C).append("\r\n"); @@ -163,6 +194,17 @@ public class IggyFlashHeader32 implements StructureInterface { sb.append("unk_74 ").append(unk_74).append("\r\n"); sb.append("unk_78 ").append(unk_78).append("\r\n"); sb.append("unk_7C ").append(unk_7C).append("\r\n"); + sb.append("name ").append(name).append("\r\n"); + Map map = Tag.getKnownClasses(); + sb.append("tags:").append("\r\n"); + for (int i = 0; i < tagIds.size(); i++) { + TagTypeInfo tti = map.get(tagIds.get(i)); + sb.append(" tag ").append(tagIds.get(i)).append(":").append(tti == null ? "?" : tti.getName()); + if (tagIdsExtendedInfo.get(i) > 0) { + sb.append(" (special: ").append(tagIdsExtendedInfo.get(i)).append(")"); + } + sb.append("\r\n"); + } sb.append("]"); return sb.toString(); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyFlashHeader64.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyFlashHeader64.java index 1328e1c43..3e57f7ea0 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyFlashHeader64.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyFlashHeader64.java @@ -1,7 +1,12 @@ package com.jpexs.decompiler.flash.iggy; import com.jpexs.decompiler.flash.iggy.annotations.IggyFieldType; +import com.jpexs.decompiler.flash.tags.Tag; +import com.jpexs.decompiler.flash.tags.TagTypeInfo; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; /** * @@ -43,7 +48,7 @@ public class IggyFlashHeader64 implements StructureInterface { long unk_50; @IggyFieldType(DataType.uint32_t) long unk_54; - float unk_58; + float frame_rate; @IggyFieldType(DataType.uint32_t) long unk_5C; @IggyFieldType(DataType.uint64_t) @@ -72,7 +77,16 @@ public class IggyFlashHeader64 implements StructureInterface { long unk_B0; // Maybe number of classes / as3 names @IggyFieldType(DataType.uint32_t) long unk_B4; + @IggyFieldType(value = DataType.uint16_t, count = 20) + String name; + List tagIds = new ArrayList<>(); + List tagIdsExtendedInfo = new ArrayList<>(); + + /*@IggyArrayFieldType(value = DataType.uint32_t, count = 20) + long unk_offsets_a[] = new long[20]; + @IggyArrayFieldType(value = DataType.uint32_t, count = 20) + long unk_offsets_b[] = new long[20];*/ // Offset 0xB8 (outside header): there are *unk_40* relative offsets that point to flash objects. // The flash objects are in a format different to swf but there is probably a way to convert between them. // After the offsets, the bodies of objects pointed above, which apparently have a code like 0xFFXX to identify the type of object, followed by a (unique?) identifier @@ -101,7 +115,7 @@ public class IggyFlashHeader64 implements StructureInterface { unk_4C = stream.readUI32(); unk_50 = stream.readUI32(); unk_54 = stream.readUI32(); - unk_58 = stream.readFloat(); + frame_rate = stream.readFloat(); unk_5C = stream.readUI32(); unk_60 = stream.readUI64(); unk_68 = stream.readUI64(); @@ -116,7 +130,26 @@ public class IggyFlashHeader64 implements StructureInterface { unk_AC = stream.readUI32(); unk_B0 = stream.readUI32(); unk_B4 = stream.readUI32(); + StringBuilder nameBuilder = new StringBuilder(); + do { + char c = (char) stream.readUI16(); + if (c == '\0') { + break; + } + nameBuilder.append(c); + } while (true); + name = nameBuilder.toString(); + while (true) { + long typeLen = stream.readUI32(); + if (typeLen == 0) { + break; + } + long tagLength = stream.readUI32(); + int tagType = (int) ((typeLen >>> 6) + 10) & 0x3FF; + tagIds.add(tagType); + tagIdsExtendedInfo.add(tagLength); + } } @Override @@ -144,7 +177,7 @@ public class IggyFlashHeader64 implements StructureInterface { sb.append("unk_4C ").append(unk_4C).append("\r\n"); sb.append("unk_50 ").append(unk_50).append("\r\n"); sb.append("unk_54 ").append(unk_54).append("\r\n"); - sb.append("unk_58 ").append(unk_58).append("\r\n"); + sb.append("frame_rate ").append(frame_rate).append("\r\n"); sb.append("unk_5C ").append(unk_5C).append("\r\n"); sb.append("unk_60 ").append(unk_60).append("\r\n"); sb.append("unk_68 ").append(unk_68).append("\r\n"); @@ -159,6 +192,17 @@ public class IggyFlashHeader64 implements StructureInterface { sb.append("unk_AC ").append(unk_AC).append("\r\n"); sb.append("unk_B0 ").append(unk_B0).append("\r\n"); sb.append("unk_B4 ").append(unk_B4).append("\r\n"); + sb.append("name ").append(name).append("\r\n"); + Map map = Tag.getKnownClasses(); + sb.append("tags:").append("\r\n"); + for (int i = 0; i < tagIds.size(); i++) { + TagTypeInfo tti = map.get(tagIds.get(i)); + sb.append(" tag ").append(tagIds.get(i)).append(":").append(tti == null ? "?" : tti.getName()); + if (tagIdsExtendedInfo.get(i) > 0) { + sb.append(" (special: ").append(tagIdsExtendedInfo.get(i)).append(")"); + } + sb.append("\r\n"); + } sb.append("]"); return sb.toString();