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 2f4892c89..b3f8196f1 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 @@ -1,6 +1,6 @@ package com.jpexs.decompiler.flash.iggy; -import java.io.ByteArrayInputStream; +import com.jpexs.decompiler.flash.SWF; import java.io.ByteArrayOutputStream; import java.io.EOFException; import java.io.File; @@ -30,11 +30,12 @@ public class IggyExtractor extends AbstractDataStream implements AutoCloseable { private IggyHeader header; private List subFileEntries = new ArrayList<>(); - List> indexTables = new ArrayList<>(); - List> offsetTables = new ArrayList<>(); + private List> indexTables = new ArrayList<>(); + private List> offsetTables = new ArrayList<>(); - List headers = new ArrayList<>(); - List namesAndTagLists = new ArrayList<>(); + private List headers = new ArrayList<>(); + private List namesAndTagLists = new ArrayList<>(); + private List> tagDataTables = new ArrayList<>(); public IggyExtractor(File file) throws IOException { raf = new RandomAccessFile(file, "r"); @@ -67,8 +68,33 @@ public class IggyExtractor extends AbstractDataStream implements AutoCloseable { } } for (int i = 0; i < flashStreams.size(); i++) { + ByteArrayDataStream flashStream = flashStreams.get(i); List offsets = offsetTables.get(i); - //TODO + List tagIds = namesAndTagLists.get(i).getTagIds(); + List tagExtended = namesAndTagLists.get(i).getTagIdsExtendedInfo(); + int offsetIndex = 3; //0 = SWF name, 1 = UI16 zero, 2 = tag list + + List tagDataStreams = new ArrayList<>(); + final int MAX_BUF_SIZE = 4096; + for (int t = 0; t < tagIds.size(); t++) { + long startOffset = offsets.get(offsetIndex); + long endOffset = offsets.get(offsetIndex + 1); + long dataLength = endOffset - startOffset; + flashStream.seek(startOffset, SeekMode.SET); + long remLength = dataLength; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + do { + int readCount = remLength >= MAX_BUF_SIZE ? MAX_BUF_SIZE : (int) remLength; + byte[] buf = flashStream.readBytes(readCount); + baos.write(buf); + remLength -= readCount; + } while (remLength > 0); + byte tagBytes[] = baos.toByteArray(); //TODO: optimize speed - without ByteArrayOutputStream + ByteArrayDataStream tagDataStream = new ByteArrayDataStream(tagBytes, is64()); + tagDataStreams.add(tagDataStream); + offsetIndex++; + } + tagDataTables.add(tagDataStreams); } } @@ -657,4 +683,24 @@ public class IggyExtractor extends AbstractDataStream implements AutoCloseable { } } + public int getSwfCount() { + return tagDataTables.size(); + } + + public String getSwfName(int swfIndex) { + return namesAndTagLists.get(swfIndex).getName(); + } + + public List getSwfTagIds(int swfIndex) { + return namesAndTagLists.get(swfIndex).getTagIds(); + } + + public List getSwfTagExtraInfos(int swfIndex) { + return namesAndTagLists.get(swfIndex).getTagIdsExtendedInfo(); + } + + public SWF extractSwf(int swfIndex) { + return null; //TODO + } + }