/* * [The "BSD licence"] * Copyright (c) 2010 Ben Gruver (JesusFreke) * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.jf.dexlib; import java.util.TreeMap; /** * Enumeration of all the top-level item types. */ public enum ItemType { TYPE_HEADER_ITEM( 0x0000, 17, 4, "header_item"), TYPE_STRING_ID_ITEM( 0x0001, 0, 4, "string_id_item"), TYPE_TYPE_ID_ITEM( 0x0002, 1, 4, "type_id_item"), TYPE_PROTO_ID_ITEM( 0x0003, 2, 4, "proto_id_item"), TYPE_FIELD_ID_ITEM( 0x0004, 3, 4, "field_id_item"), TYPE_METHOD_ID_ITEM( 0x0005, 4, 4, "method_id_item"), TYPE_CLASS_DEF_ITEM( 0x0006, 5, 4, "class_def_item"), TYPE_MAP_LIST( 0x1000, 16, 4, "map_list"), TYPE_TYPE_LIST( 0x1001, 6, 4, "type_list"), TYPE_ANNOTATION_SET_REF_LIST( 0x1002, 7, 4, "annotation_set_ref_list"), TYPE_ANNOTATION_SET_ITEM( 0x1003, 8, 4, "annotation_set_item"), TYPE_CLASS_DATA_ITEM( 0x2000, 9, 1, "class_data_item"), TYPE_CODE_ITEM( 0x2001, 10, 4, "code_item"), TYPE_STRING_DATA_ITEM( 0x2002, 11, 1, "string_data_item"), TYPE_DEBUG_INFO_ITEM( 0x2003, 12, 1, "debug_info_item"), TYPE_ANNOTATION_ITEM( 0x2004, 13, 1, "annotation_item"), TYPE_ENCODED_ARRAY_ITEM( 0x2005, 14, 1, "encoded_array_item"), TYPE_ANNOTATIONS_DIRECTORY_ITEM(0x2006, 15, 4, "annotations_directory_item"); /** A map to facilitate looking up an <code>ItemType</code> by ordinal */ private final static TreeMap<Integer, ItemType> itemTypeIntegerMap; /** builds the <code>itemTypeIntegerMap</code> object */ static { itemTypeIntegerMap = new TreeMap<Integer, ItemType>(); for (ItemType itemType: ItemType.values()) { itemTypeIntegerMap.put(itemType.MapValue, itemType); } } /** * value when represented in a MapItem */ public final int MapValue; /** * name of the type */ public final String TypeName; /** * index for this item's section */ public final int SectionIndex; /** * the alignment for this item type */ public final int ItemAlignment; /** * Constructs an instance. * * @param mapValue value when represented in a MapItem * @param sectionIndex index for this item's section * @param itemAlignment the byte alignment required by this item * @param typeName non-null; name of the type */ private ItemType(int mapValue, int sectionIndex, int itemAlignment, String typeName) { this.MapValue = mapValue; this.SectionIndex = sectionIndex; this.ItemAlignment = itemAlignment; this.TypeName = typeName; } /** * Converts an int value to the corresponding ItemType enum value, * or null if the value isn't a valid ItemType value * * @param itemType the int value to convert to an ItemType * @return the ItemType enum value corresponding to itemType, or null * if not a valid ItemType value */ public static ItemType fromInt(int itemType) { return itemTypeIntegerMap.get(itemType); } /** * Returns true if this is an indexed item, or false if its an offsetted item * @return true if this is an indexed item, or false if its an offsetted item */ public boolean isIndexedItem() { return MapValue <= 0x1000; } }