package com.intellij.lang.javascript.flex.importer; import com.intellij.openapi.util.io.FileUtil; import com.intellij.psi.stubs.StubElement; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import java.io.*; /** * Produced from abcdump.as */ public class FlexImporter { private static final int ABC_VER = 46 << 16 | 14; private static final int ABC_VER2 = 46 << 16 | 15; private static final int ABC_VER3 = 46 << 16 | 16; private static final int SWF_MAGIC = 67 | 87 << 8 | 83 << 16; private static final int SWF_MAGIC2 = 70 | 87 << 8 | 83 << 16; public static void main(String[] args) throws IOException { if (args.length < 1) { System.out.print("FlexImporter\nusage:\nFlexImporter <filename>"); } else { long started = System.currentTimeMillis(); for (String file : args) { try { String result = dumpContentsFromStream(new BufferedInputStream(new FileInputStream(file)), true); saveStringAsFile(result, file + ".il"); } finally { long total = System.currentTimeMillis() - started; System.out.println("File created... " + total + "ms"); } } } } private static void saveStringAsFile(final String result, final String fileName) throws IOException { FileUtil.writeToFile(new File(fileName), result); } public static String dumpContentsFromStream(final InputStream in, boolean _dumpCode) throws IOException { final AbstractDumpProcessor abcDumper = new AbcDumper(_dumpCode); processFlexByteCode(in, abcDumper); return abcDumper.getResult(); } @NonNls public static String buildInterfaceFromStream(final InputStream in) { try { final AbstractDumpProcessor abcDumper = new AS3InterfaceDumper(); processFlexByteCode(in, abcDumper); final String s = abcDumper.getResult(); //saveStringAsFile(s, File.createTempFile("fleximport", ".as").getPath()); return s; } catch (IOException ex) { return "/* " + ex.getLocalizedMessage() + " */"; } catch (ArrayIndexOutOfBoundsException ex) { return "/* Invalid format */"; } } @NonNls public static void buildStubsInterfaceFromStream(final InputStream in, final StubElement parent) throws Exception { processFlexByteCode(in, new AS3InterfaceStubDumper(parent)); } private static void processFlexByteCode(@NotNull final InputStream in, @NotNull FlexByteCodeInformationProcessor processor) throws IOException { ByteBuffer data = new ByteBuffer(); data.read(in); data.setLittleEndian(); if (data.bytesSize() == 0) return; int version = data.readUnsignedInt(); if (version == ABC_VER || version == ABC_VER2 || version == ABC_VER3) { Abc abc = new Abc(data, processor); abc.dump(""); } else if ((version & SWF_MAGIC) == SWF_MAGIC) { final int delta = 8; data.setPosition(delta); ByteBuffer udata = new ByteBuffer(); udata.setLittleEndian(); data.readBytes(udata, data.bytesSize() - delta); int csize = udata.bytesSize(); udata.uncompress(); processor.dumpStat("decompressed swf " + csize + " -> " + udata.bytesSize() + "\n"); udata.setPosition(0); new Swf(udata, processor); } else if ((version & SWF_MAGIC2) == SWF_MAGIC2) { data.setPosition(8); // skip header and length new Swf(data, processor); } else { processor.hasError("unknown format " + version + ", swf version: " + (version >> 24) + "\n"); } } }