/* * Copyright (C) 2010-2016 JPEXS, All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3.0 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. */ package com.jpexs.decompiler.flash.abc.types; import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.ClassPath; import com.jpexs.decompiler.flash.abc.ScriptPack; import com.jpexs.decompiler.flash.abc.types.traits.Trait; import com.jpexs.decompiler.flash.abc.types.traits.Traits; import com.jpexs.decompiler.flash.types.annotations.Internal; import com.jpexs.decompiler.graph.DottedChain; import java.util.ArrayList; import java.util.List; /** * * @author JPEXS */ public class ScriptInfo { @Internal private boolean modified = true; public void setModified(boolean modified) { this.modified = modified; } public boolean isModified() { return modified; } @Internal public boolean deleted; public int init_index; //MethodInfo public Traits traits; public ScriptInfo() { traits = new Traits(); } public ScriptInfo(Traits traits) { this.traits = traits; } public List<ScriptPack> getPacks(ABC abc, int scriptIndex, String packagePrefix, List<ABC> allAbcs) { List<ScriptPack> ret = new ArrayList<>(); List<Integer> otherTraits = new ArrayList<>(); for (int j = 0; j < traits.traits.size(); j++) { Trait t = traits.traits.get(j); Multiname name = t.getName(abc); Namespace ns = name.getNamespace(abc.constants); if (!((ns.kind == Namespace.KIND_PACKAGE_INTERNAL) || (ns.kind == Namespace.KIND_PACKAGE))) { otherTraits.add(j); } } for (int j = 0; j < traits.traits.size(); j++) { Trait t = traits.traits.get(j); Multiname name = t.getName(abc); Namespace ns = name.getNamespace(abc.constants); if ((ns.kind == Namespace.KIND_PACKAGE_INTERNAL) || (ns.kind == Namespace.KIND_PACKAGE)) { DottedChain packageName = ns.getName(abc.constants); // assume not null package String objectName = name.getName(abc.constants, null, true, false); String namespaceSuffix = name.getNamespaceSuffix(); List<Integer> traitIndices = new ArrayList<>(); traitIndices.add(j); if (!otherTraits.isEmpty()) { traitIndices.addAll(otherTraits); otherTraits.clear(); } if (packagePrefix == null || packageName.toPrintableString(true).startsWith(packagePrefix)) { ClassPath cp = new ClassPath(packageName, objectName, namespaceSuffix); ret.add(new ScriptPack(cp, abc, allAbcs, scriptIndex, traitIndices)); } } } if (ret.size() == 1) { ret.get(0).isSimple = true; } if (ret.isEmpty() && !otherTraits.isEmpty()) { //no public/package internal traits to determine common pack name //make each trait separate pack for (int traitIndex : otherTraits) { Trait t = traits.traits.get(traitIndex); Multiname name = t.getName(abc); Namespace ns = name.getNamespace(abc.constants); DottedChain packageName = ns.getName(abc.constants); String objectName = name.getName(abc.constants, null, true, false); String namespaceSuffix = name.getNamespaceSuffix(); List<Integer> traitIndices = new ArrayList<>(); traitIndices.add(traitIndex); ClassPath cp = new ClassPath(packageName, objectName, namespaceSuffix); ret.add(new ScriptPack(cp, abc, allAbcs, scriptIndex, traitIndices)); } } return ret; } public int removeTraps(int scriptIndex, ABC abc, String path) throws InterruptedException { return traits.removeTraps(scriptIndex, -1, true, abc, path); } @Override public String toString() { return "method_index=" + init_index + "\r\n" + traits.toString(); } public String toString(ABC abc, List<DottedChain> fullyQualifiedNames) { return "method_index=" + init_index + "\r\n" + traits.toString(abc, fullyQualifiedNames); } public void delete(ABC abc, boolean d) { deleted = d; abc.method_info.get(init_index).delete(abc, d); traits.delete(abc, d); } }