/* * 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.avm2.AVM2ConstantPool; import com.jpexs.helpers.Helper; /** * * @author JPEXS */ public class ValueKind { public static final int CONSTANT_DecimalOrFloat = 0x02; //decimal or float depending on ABC version public static final int CONSTANT_Int = 0x03;// integer public static final int CONSTANT_UInt = 0x04;// uinteger public static final int CONSTANT_Double = 0x06;// double public static final int CONSTANT_Utf8 = 0x01;// string public static final int CONSTANT_True = 0x0B;// - public static final int CONSTANT_False = 0x0A;// - public static final int CONSTANT_Null = 0x0C;// - public static final int CONSTANT_Undefined = 0x00;// - public static final int CONSTANT_Namespace = 0x08;// namespace public static final int CONSTANT_PackageNamespace = 0x16;// namespace public static final int CONSTANT_PackageInternalNs = 0x17;// Namespace public static final int CONSTANT_ProtectedNamespace = 0x18;// Namespace public static final int CONSTANT_ExplicitNamespace = 0x19;// Namespace public static final int CONSTANT_StaticProtectedNs = 0x1A;// Namespace public static final int CONSTANT_PrivateNs = 0x05;// namespace public static final int CONSTANT_Float4 = 0x1E;// float4 private static final int[] optionalKinds = new int[]{0x03, 0x04, 0x06, 0x02, 0x01, 0x0B, 0x0A, 0x0C, 0x00, 0x08, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x05}; private static final String[] optionalKindNames = new String[]{"Int", "UInt", "Double", "Decimal", "Utf8", "True", "False", "Null", "Undefined", "Namespace", "PackageNamespace", "PackageInternalNs", "ProtectedNamespace", "ExplicitNamespace", "StaticProtectedNs", "PrivateNamespace"}; public int value_index; public int value_kind; public ValueKind() { } public ValueKind(int value_index, int value_kind) { this.value_index = value_index; this.value_kind = value_kind; } public static int nsKindToValueKind(int nsKind) { switch (nsKind) { case Namespace.KIND_EXPLICIT: return CONSTANT_ExplicitNamespace; case Namespace.KIND_NAMESPACE: return CONSTANT_Namespace; case Namespace.KIND_PACKAGE: return CONSTANT_PackageNamespace; case Namespace.KIND_PACKAGE_INTERNAL: return CONSTANT_PackageInternalNs; case Namespace.KIND_PRIVATE: return CONSTANT_PrivateNs; case Namespace.KIND_PROTECTED: return CONSTANT_ProtectedNamespace; case Namespace.KIND_STATIC_PROTECTED: return CONSTANT_StaticProtectedNs; } return 0; } @Override public String toString() { String s = ""; s += value_index + ":"; boolean found = false; for (int i = 0; i < optionalKinds.length; i++) { if (optionalKinds[i] == value_kind) { s += optionalKindNames[i]; found = true; break; } } if (!found) { s += "?"; } return s; } public boolean isNamespace() { switch (value_kind) { case CONSTANT_Namespace: case CONSTANT_PackageInternalNs: case CONSTANT_ProtectedNamespace: case CONSTANT_ExplicitNamespace: case CONSTANT_StaticProtectedNs: case CONSTANT_PrivateNs: return true; default: return false; } } public String toString(AVM2ConstantPool constants) { String ret = "?"; switch (value_kind) { case CONSTANT_Int: ret = "" + constants.getInt(value_index); break; case CONSTANT_UInt: ret = "" + constants.getUInt(value_index); break; case CONSTANT_Double: ret = "" + constants.getDouble(value_index); break; case CONSTANT_DecimalOrFloat: ret = "" + constants.getDecimal(value_index); break; case CONSTANT_Utf8: ret = "\"" + Helper.escapeActionScriptString(constants.getString(value_index)) + "\""; break; case CONSTANT_True: ret = "true"; break; case CONSTANT_False: ret = "false"; break; case CONSTANT_Null: ret = "null"; break; case CONSTANT_Undefined: ret = "undefined"; break; case CONSTANT_Namespace: case CONSTANT_PackageInternalNs: case CONSTANT_ProtectedNamespace: case CONSTANT_ExplicitNamespace: case CONSTANT_StaticProtectedNs: case CONSTANT_PrivateNs: ret = "\"" + constants.getNamespace(value_index).getName(constants).toRawString() + "\""; //assume not null name break; } return ret; } public String toASMString(AVM2ConstantPool constants) { String ret = "?"; switch (value_kind) { case CONSTANT_Int: ret = "Integer(" + constants.getInt(value_index) + ")"; break; case CONSTANT_UInt: ret = "UInteger(" + constants.getUInt(value_index) + ")"; break; case CONSTANT_Double: ret = "Double(" + constants.getDouble(value_index) + ")"; break; case CONSTANT_DecimalOrFloat: ret = "Decimal(" + constants.getDecimal(value_index) + ")"; break; case CONSTANT_Utf8: ret = "Utf8(\"" + Helper.escapeActionScriptString(constants.getString(value_index)) + "\")"; break; case CONSTANT_True: ret = "True"; break; case CONSTANT_False: ret = "False"; break; case CONSTANT_Null: ret = "Null"; break; case CONSTANT_Undefined: ret = "Undefined"; break; case CONSTANT_Namespace: case CONSTANT_PackageInternalNs: case CONSTANT_ProtectedNamespace: case CONSTANT_ExplicitNamespace: case CONSTANT_StaticProtectedNs: case CONSTANT_PrivateNs: ret = constants.getNamespace(value_index).getKindStr() + "(\"" + constants.getNamespace(value_index).getName(constants).toRawString() + "\")"; //assume not null name break; } return ret; } }