From 810ddca7e8bbebc60438ddf8276d1703e6b440c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Wed, 23 Nov 2016 19:24:25 +0100 Subject: [PATCH] Iggy converter stub (not working yet) --- .../jpexs/decompiler/flash/iggy/IggyFile.java | 15 ++++-- .../flash/iggy/IggyFlashHeader64.java | 54 ++++++++++--------- .../flash/iggy/IggyNameAndTagList.java | 24 ++++++--- .../iggy/conversion/IggyToSwfConvertor.java | 36 ++++++------- 4 files changed, 73 insertions(+), 56 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyFile.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyFile.java index becc41534..9d4376b88 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyFile.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyFile.java @@ -62,16 +62,19 @@ public class IggyFile extends AbstractDataStream implements AutoCloseable { } else { hdr = new IggyFlashHeader32(dataStream); } + //System.out.println("hdr=" + hdr); + IggyNameAndTagList nameTagList = new IggyNameAndTagList(dataStream); + //System.out.println("nameTagList=" + nameTagList); headers.add(hdr); - namesAndTagLists.add(new IggyNameAndTagList(dataStream)); + namesAndTagLists.add(nameTagList); flashStreams.add(dataStream); } } for (int i = 0; i < flashStreams.size(); i++) { ByteArrayDataStream flashStream = flashStreams.get(i); List offsets = offsetTables.get(i); - List tagIds = namesAndTagLists.get(i).getTagIds(); - List tagExtended = namesAndTagLists.get(i).getTagIdsExtraInfo(); + List tagIds = namesAndTagLists.get(i).getTagIds(); + List tagExtraInfo = namesAndTagLists.get(i).getTagIdsExtraInfo(); int offsetIndex = 3; //0 = SWF name, 1 = UI16 zero, 2 = tag list List tagDataStreams = new ArrayList<>(); @@ -80,6 +83,7 @@ public class IggyFile extends AbstractDataStream implements AutoCloseable { long startOffset = offsets.get(offsetIndex); long endOffset = offsets.get(offsetIndex + 1); long dataLength = endOffset - startOffset; + long extraInfo = tagExtraInfo.get(t); //TODO: What's this for? flashStream.seek(startOffset, SeekMode.SET); long remLength = dataLength; ByteArrayOutputStream baos = new ByteArrayOutputStream(); @@ -90,6 +94,7 @@ public class IggyFile extends AbstractDataStream implements AutoCloseable { remLength -= readCount; } while (remLength > 0); byte tagBytes[] = baos.toByteArray(); //TODO: optimize speed - without ByteArrayOutputStream + ByteArrayDataStream tagDataStream = new ByteArrayDataStream(tagBytes, is64()); tagDataStreams.add(tagDataStream); offsetIndex++; @@ -691,11 +696,11 @@ public class IggyFile extends AbstractDataStream implements AutoCloseable { return namesAndTagLists.get(swfIndex).getName(); } - public List getSwfTagIds(int swfIndex) { + public List getSwfTagIds(int swfIndex) { return namesAndTagLists.get(swfIndex).getTagIds(); } - public Integer getSwfTagId(int swfIndex, int tagIndex) { + public Long getSwfTagId(int swfIndex, int tagIndex) { return namesAndTagLists.get(swfIndex).getTagIds().get(tagIndex); } 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 024c1fedd..52a05196f 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 @@ -78,10 +78,6 @@ public class IggyFlashHeader64 implements IggyFlashHeaderInterface { @IggyFieldType(DataType.uint32_t) long unk_B4; - /*@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 @@ -92,13 +88,6 @@ public class IggyFlashHeader64 implements IggyFlashHeaderInterface { readFromDataStream(stream); } - private int ofs = 0; - private List offsets; - - private String currentOffset() { - return String.format(" [offset: %d]", offsets.get(ofs++)); - } - /* offsets: name (UI16 chars, zero terminated) @@ -110,7 +99,6 @@ public class IggyFlashHeader64 implements IggyFlashHeaderInterface { */ @Override public void readFromDataStream(AbstractDataStream stream) throws IOException { - this.offsets = offsets; main_offset = stream.readUI64(); as3_section_offset = stream.readUI64(); unk_offset = stream.readUI64(); @@ -153,18 +141,36 @@ public class IggyFlashHeader64 implements IggyFlashHeaderInterface { public String toString() { StringBuilder sb = new StringBuilder(); sb.append("[\r\n"); - sb.append("main_offset ").append(main_offset).append(currentOffset()).append("\r\n"); - sb.append("as3_section_offset ").append(as3_section_offset).append(currentOffset()).append("\r\n"); - sb.append("unk_offset ").append(unk_offset).append(currentOffset()).append("\r\n"); - sb.append("unk_offset2 ").append(unk_offset2).append(currentOffset()).append("\r\n"); - sb.append("unk_offset3 ").append(unk_offset3).append(currentOffset()).append("\r\n"); - sb.append("unk_offset4 ").append(unk_offset4).append(currentOffset()).append("\r\n"); - sb.append("xmin ").append(xmin).append(currentOffset()).append("\r\n"); - sb.append("ymin ").append(ymin).append(currentOffset()).append("\r\n"); - sb.append("xmax ").append(ymax).append(currentOffset()).append("\r\n"); - sb.append("ymax ").append(ymax).append(currentOffset()).append("\r\n"); - sb.append("unk_40 ").append(unk_40).append(currentOffset()).append("\r\n"); - sb.append("unk_44 ").append(unk_44).append(currentOffset()).append("\r\n"); + sb.append("main_offset ").append(main_offset).append("\r\n"); + sb.append("as3_section_offset ").append(as3_section_offset); + sb.append(" global: ").append(main_offset + as3_section_offset); + sb.append("\r\n"); + sb.append("unk_offset ").append(unk_offset); + if (unk_offset != 1) { + sb.append(" global: ").append(main_offset + unk_offset); + } + sb.append("\r\n"); + sb.append("unk_offset2 ").append(unk_offset2); + if (unk_offset2 != 1) { + sb.append(" global: ").append(main_offset + unk_offset2); + } + sb.append("\r\n"); + sb.append("unk_offset3 ").append(unk_offset3); + if (unk_offset3 != 1) { + sb.append(" global: ").append(main_offset + unk_offset3); + } + sb.append("\r\n"); + sb.append("unk_offset4 ").append(unk_offset4); + if (unk_offset4 != 1) { + sb.append(" global: ").append(main_offset + unk_offset4); + } + sb.append("\r\n"); + sb.append("xmin ").append(xmin).append("\r\n"); + sb.append("ymin ").append(ymin).append("\r\n"); + sb.append("xmax ").append(ymax).append("\r\n"); + sb.append("ymax ").append(ymax).append("\r\n"); + sb.append("unk_40 ").append(unk_40).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"); sb.append("unk_50 ").append(unk_50).append("\r\n"); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyNameAndTagList.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyNameAndTagList.java index dc907af8f..36a1cd2ee 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyNameAndTagList.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/IggyNameAndTagList.java @@ -16,12 +16,12 @@ public class IggyNameAndTagList implements StructureInterface { private String name; @IggyArrayFieldType(value = DataType.ubits, count = 10) - private List tagIds; + private List tagIds; @IggyArrayFieldType(value = DataType.uint16_t) private List tagIdsExtraInfo; - public IggyNameAndTagList(String name, List tagIds, List tagIdsExtendedInfo) { + public IggyNameAndTagList(String name, List tagIds, List tagIdsExtendedInfo) { this.name = name; this.tagIds = tagIds; this.tagIdsExtraInfo = tagIdsExtendedInfo; @@ -46,12 +46,11 @@ public class IggyNameAndTagList implements StructureInterface { tagIds = new ArrayList<>(); tagIdsExtraInfo = new ArrayList<>(); while (true) { - long typeLen = stream.readUI32(); - if (typeLen == 0) { + long tagType = stream.readUI32() & 0xffffffffL; + if (tagType == 0) { break; } long tagLength = stream.readUI32(); - int tagType = (int) ((typeLen >>> 6) + 10) & 0x3FF; tagIds.add(tagType); tagIdsExtraInfo.add(tagLength); } @@ -61,7 +60,7 @@ public class IggyNameAndTagList implements StructureInterface { return name; } - public List getTagIds() { + public List getTagIds() { return tagIds; } @@ -74,4 +73,17 @@ public class IggyNameAndTagList implements StructureInterface { throw new UnsupportedOperationException("Not supported yet."); } + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("[\r\n"); + sb.append("name ").append(name).append("\r\n"); + sb.append("tags:").append("\r\n"); + for (int i = 0; i < tagIds.size(); i++) { + sb.append("tag ").append(String.format("%08X", tagIds.get(i))).append(" extra ").append(tagIdsExtraInfo.get(i)).append("\r\n"); + } + sb.append("]"); + return sb.toString(); + } + } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/conversion/IggyToSwfConvertor.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/conversion/IggyToSwfConvertor.java index f45633ea2..1fbc112f8 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/conversion/IggyToSwfConvertor.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/iggy/conversion/IggyToSwfConvertor.java @@ -4,12 +4,15 @@ import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.SWFCompression; import com.jpexs.decompiler.flash.SWFInputStream; import com.jpexs.decompiler.flash.SWFOutputStream; +import com.jpexs.decompiler.flash.iggy.AbstractDataStream; import com.jpexs.decompiler.flash.iggy.IggyFile; import com.jpexs.decompiler.flash.iggy.IggyFlashHeaderInterface; +import com.jpexs.decompiler.flash.iggy.SeekMode; import com.jpexs.decompiler.flash.tags.Tag; import com.jpexs.decompiler.flash.tags.UnknownTag; import com.jpexs.decompiler.flash.types.RECT; import com.jpexs.helpers.ByteArrayRange; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -17,13 +20,13 @@ import java.io.OutputStream; /** * - * TODO: TEST!!! + * Unfinished WIP! * * @author JPEXS */ public class IggyToSwfConvertor { - public SWF[] getAllSwfs(IggyFile file) { + public static SWF[] getAllSwfs(IggyFile file) { SWF[] ret = new SWF[file.getSwfCount()]; for (int i = 0; i < ret.length; i++) { ret[i] = getSwf(file, i); @@ -31,33 +34,34 @@ public class IggyToSwfConvertor { return ret; } - public void exportAllSwfsToDir(IggyFile file, File outputDir) throws IOException { + public static void exportAllSwfsToDir(IggyFile file, File outputDir) throws IOException { for (int swfIndex = 0; swfIndex < file.getSwfCount(); swfIndex++) { exportSwfToDir(file, swfIndex, outputDir); } } - public void exportSwfToDir(IggyFile file, int swfIndex, File outputDir) throws IOException { + public static void exportSwfToDir(IggyFile file, int swfIndex, File outputDir) throws IOException { try (FileOutputStream fos = new FileOutputStream(new File(outputDir, file.getSwfName(swfIndex)))) { exportSwf(file, swfIndex, fos); } } - public void exportSwfToFile(IggyFile file, int swfIndex, File outputFile) throws IOException { + public static void exportSwfToFile(IggyFile file, int swfIndex, File outputFile) throws IOException { try (FileOutputStream fos = new FileOutputStream(outputFile)) { exportSwf(file, swfIndex, fos); } } - public void exportSwf(IggyFile file, int swfIndex, OutputStream output) throws IOException { + public static void exportSwf(IggyFile file, int swfIndex, OutputStream output) throws IOException { SWF swf = getSwf(file, swfIndex); swf.saveTo(output); } - public SWF getSwf(IggyFile file, int swfIndex) { + public static SWF getSwf(IggyFile file, int swfIndex) { SWF swf = new SWF(); swf.compression = SWFCompression.NONE; - swf.frameCount = 1; //FIXME!! + swf.frameCount = 1; //FIXME!! + swf.frameRate = file.getSwfFrameRate(swfIndex); swf.gfx = false; swf.displayRect = new RECT( (int) (file.getSwfXMin(swfIndex) * SWF.unitDivisor), @@ -65,18 +69,8 @@ public class IggyToSwfConvertor { (int) (file.getSwfYMin(swfIndex) * SWF.unitDivisor), (int) (file.getSwfYMax(swfIndex) * SWF.unitDivisor)); swf.version = 9; //FIXME - for (int tagIndex = 0; tagIndex < file.getSwfTagCount(swfIndex); tagIndex++) { - byte[] data = file.getSwfTagData(swfIndex, tagIndex); - int dataLength = data.length; - int tagLength = dataLength; - int tagID = file.getSwfTagId(swfIndex, tagIndex); - long tagExtra = file.getSwfTagExtraInfo(swfIndex, tagIndex); - try { - swf.addTag(new UnknownTag(new SWFInputStream(swf, data), tagID, new ByteArrayRange(data))); - } catch (IOException ex) { - //ignored - } - } - return swf; + + //TODO: Convert tags + throw new UnsupportedOperationException("Not implemented yet"); } }