185fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver/*
285fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * Copyright 2013, Google Inc.
385fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * All rights reserved.
485fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver *
585fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * Redistribution and use in source and binary forms, with or without
685fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * modification, are permitted provided that the following conditions are
785fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * met:
885fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver *
985fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver *     * Redistributions of source code must retain the above copyright
1085fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * notice, this list of conditions and the following disclaimer.
1185fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver *     * Redistributions in binary form must reproduce the above
1285fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * copyright notice, this list of conditions and the following disclaimer
1385fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * in the documentation and/or other materials provided with the
1485fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * distribution.
1585fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver *     * Neither the name of Google Inc. nor the names of its
1685fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * contributors may be used to endorse or promote products derived from
1785fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * this software without specific prior written permission.
1885fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver *
1985fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2085fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2185fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2285fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2385fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2485fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2585fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2685fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2785fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2885fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2985fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3085fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver */
3185fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver
3285fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruverpackage org.jf.dexlib2.dexbacked.raw;
3385fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver
3485fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruverimport org.jf.dexlib2.dexbacked.DexBackedDexFile;
358f8b67f65ec3390e92cce7d710e5b1eaabd4e248Ben Gruverimport org.jf.dexlib2.dexbacked.raw.util.DexAnnotator;
3685fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruverimport org.jf.dexlib2.util.AnnotatedBytes;
3785fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver
3885fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruverimport javax.annotation.Nonnull;
398f8b67f65ec3390e92cce7d710e5b1eaabd4e248Ben Gruverimport javax.annotation.Nullable;
4085fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver
4185fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruverpublic class TypeIdItem {
4285fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver    public static final int ITEM_SIZE = 4;
4385fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver
4418b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver    @Nonnull
458f8b67f65ec3390e92cce7d710e5b1eaabd4e248Ben Gruver    public static SectionAnnotator makeAnnotator(@Nonnull DexAnnotator annotator, @Nonnull MapItem mapItem) {
468f8b67f65ec3390e92cce7d710e5b1eaabd4e248Ben Gruver        return new SectionAnnotator(annotator, mapItem) {
4778612c755447a47945d7179a688120856db0a76dBen Gruver            @Nonnull @Override public String getItemName() {
4878612c755447a47945d7179a688120856db0a76dBen Gruver                return "type_id_item";
4978612c755447a47945d7179a688120856db0a76dBen Gruver            }
5085fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver
5178612c755447a47945d7179a688120856db0a76dBen Gruver            @Override
528f8b67f65ec3390e92cce7d710e5b1eaabd4e248Ben Gruver            protected void annotateItem(@Nonnull AnnotatedBytes out, int itemIndex, @Nullable String itemIdentity) {
5378612c755447a47945d7179a688120856db0a76dBen Gruver                int stringIndex = dexFile.readSmallUint(out.getCursor());
5478612c755447a47945d7179a688120856db0a76dBen Gruver                out.annotate(4, StringIdItem.getReferenceAnnotation(dexFile, stringIndex));
5585fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver            }
5685fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver        };
5785fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver    }
5885fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver
5918b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver    @Nonnull
605b71582325a2e9df14f627d731b46a91ee8064c5Ben Gruver    public static String getReferenceAnnotation(@Nonnull DexBackedDexFile dexFile, int typeIndex) {
6185fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver        try {
625b71582325a2e9df14f627d731b46a91ee8064c5Ben Gruver            String typeString = dexFile.getType(typeIndex);
6318b069d17ee8f0fb589c31de0afbbb8240975d14Ben Gruver            return String.format("type_id_item[%d]: %s", typeIndex, typeString);
6485fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver        } catch (Exception ex) {
6585fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver            ex.printStackTrace(System.err);
6685fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver        }
675b71582325a2e9df14f627d731b46a91ee8064c5Ben Gruver        return String.format("type_id_item[%d]", typeIndex);
6885fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver    }
69a2b3cfe5f2c453ee649417ad7c5fc6072ca92588Ben Gruver
70a2b3cfe5f2c453ee649417ad7c5fc6072ca92588Ben Gruver    @Nonnull
71a2b3cfe5f2c453ee649417ad7c5fc6072ca92588Ben Gruver    public static String getOptionalReferenceAnnotation(@Nonnull DexBackedDexFile dexFile, int typeIndex) {
72a2b3cfe5f2c453ee649417ad7c5fc6072ca92588Ben Gruver        if (typeIndex == -1) {
73a2b3cfe5f2c453ee649417ad7c5fc6072ca92588Ben Gruver            return "type_id_item[NO_INDEX]";
74a2b3cfe5f2c453ee649417ad7c5fc6072ca92588Ben Gruver        }
75a2b3cfe5f2c453ee649417ad7c5fc6072ca92588Ben Gruver        return getReferenceAnnotation(dexFile, typeIndex);
76a2b3cfe5f2c453ee649417ad7c5fc6072ca92588Ben Gruver    }
77132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver
78132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver    public static String[] getTypes(@Nonnull RawDexFile dexFile) {
79132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver        MapItem mapItem = dexFile.getMapItemForSection(ItemType.TYPE_ID_ITEM);
80132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver        if (mapItem == null) {
81132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver            return new String[0];
82132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver        }
83132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver
84132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver        int typeCount = mapItem.getItemCount();
85132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver        String[] ret = new String[typeCount];
86132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver        for (int i=0; i<typeCount; i++) {
87132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver            ret[i] = dexFile.getType(i);
88132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver        }
89132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver        return ret;
90132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver    }
9185fa15193d50ce066d34d8d2ad0a469f057daeb5Ben Gruver}
92