1ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver/*
2ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver * Copyright 2013, Google Inc.
3ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver * All rights reserved.
4ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver *
5ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver * Redistribution and use in source and binary forms, with or without
6ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver * modification, are permitted provided that the following conditions are
7ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver * met:
8ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver *
9ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver *     * Redistributions of source code must retain the above copyright
10ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver * notice, this list of conditions and the following disclaimer.
11ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver *     * Redistributions in binary form must reproduce the above
12ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver * copyright notice, this list of conditions and the following disclaimer
13ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver * in the documentation and/or other materials provided with the
14ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver * distribution.
15ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver *     * Neither the name of Google Inc. nor the names of its
16ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver * contributors may be used to endorse or promote products derived from
17ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver * this software without specific prior written permission.
18ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver *
19ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver */
31ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver
32ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruverpackage org.jf.dexlib2.dexbacked.raw;
33ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver
34ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruverimport org.jf.dexlib2.dexbacked.DexBackedDexFile;
358f8b67f65ec3390e92cce7d710e5b1eaabd4e248Ben Gruverimport org.jf.dexlib2.dexbacked.raw.util.DexAnnotator;
366fb7190811d6b05bbe45efc3c23b705e8e8845ecBen Gruverimport org.jf.dexlib2.util.AnnotatedBytes;
37ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver
38ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruverimport javax.annotation.Nonnull;
398f8b67f65ec3390e92cce7d710e5b1eaabd4e248Ben Gruverimport javax.annotation.Nullable;
40ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver
41ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruverpublic class MapItem {
42ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver    public static final int ITEM_SIZE = 12;
43ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver
44ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver    public static final int TYPE_OFFSET = 0;
45ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver    public static final int SIZE_OFFSET = 4;
46ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver    public static final int OFFSET_OFFSET = 8;
47ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver
48ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver    private final DexBackedDexFile dexFile;
49ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver    private final int offset;
50ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver
51ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver    public MapItem(DexBackedDexFile dexFile, int offset) {
52ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver        this.dexFile = dexFile;
53ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver        this.offset = offset;
54ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver    }
55ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver
56ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver    public int getType() {
57ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver        return dexFile.readUshort(offset + TYPE_OFFSET);
58ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver    }
59ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver
60ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver    @Nonnull
61ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver    public String getName() {
62ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver        return ItemType.getItemTypeName(getType());
63ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver    }
64ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver
65ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver    public int getItemCount() {
66ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver        return dexFile.readSmallUint(offset + SIZE_OFFSET);
67ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver    }
68ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver
69ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver    public int getOffset() {
70ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver        return dexFile.readSmallUint(offset + OFFSET_OFFSET);
71ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver    }
726fb7190811d6b05bbe45efc3c23b705e8e8845ecBen Gruver
736fb7190811d6b05bbe45efc3c23b705e8e8845ecBen Gruver    @Nonnull
748f8b67f65ec3390e92cce7d710e5b1eaabd4e248Ben Gruver    public static SectionAnnotator makeAnnotator(@Nonnull DexAnnotator annotator, @Nonnull MapItem mapItem) {
758f8b67f65ec3390e92cce7d710e5b1eaabd4e248Ben Gruver        return new SectionAnnotator(annotator, mapItem) {
766fb7190811d6b05bbe45efc3c23b705e8e8845ecBen Gruver            @Nonnull @Override public String getItemName() {
776fb7190811d6b05bbe45efc3c23b705e8e8845ecBen Gruver                return "map_item";
786fb7190811d6b05bbe45efc3c23b705e8e8845ecBen Gruver            }
796fb7190811d6b05bbe45efc3c23b705e8e8845ecBen Gruver
806fb7190811d6b05bbe45efc3c23b705e8e8845ecBen Gruver            @Override
818f8b67f65ec3390e92cce7d710e5b1eaabd4e248Ben Gruver            protected void annotateItem(@Nonnull AnnotatedBytes out, int itemIndex, @Nullable String itemIdentity) {
826fb7190811d6b05bbe45efc3c23b705e8e8845ecBen Gruver                int itemType = dexFile.readUshort(out.getCursor());
836fb7190811d6b05bbe45efc3c23b705e8e8845ecBen Gruver                out.annotate(2, "type = 0x%x: %s", itemType, ItemType.getItemTypeName(itemType));
846fb7190811d6b05bbe45efc3c23b705e8e8845ecBen Gruver
856fb7190811d6b05bbe45efc3c23b705e8e8845ecBen Gruver                out.annotate(2, "unused");
866fb7190811d6b05bbe45efc3c23b705e8e8845ecBen Gruver
876fb7190811d6b05bbe45efc3c23b705e8e8845ecBen Gruver                int size = dexFile.readSmallUint(out.getCursor());
886fb7190811d6b05bbe45efc3c23b705e8e8845ecBen Gruver                out.annotate(4, "size = %d", size);
896fb7190811d6b05bbe45efc3c23b705e8e8845ecBen Gruver
906fb7190811d6b05bbe45efc3c23b705e8e8845ecBen Gruver                int offset = dexFile.readSmallUint(out.getCursor());
916fb7190811d6b05bbe45efc3c23b705e8e8845ecBen Gruver                out.annotate(4, "offset = 0x%x", offset);
926fb7190811d6b05bbe45efc3c23b705e8e8845ecBen Gruver            }
936fb7190811d6b05bbe45efc3c23b705e8e8845ecBen Gruver
948f8b67f65ec3390e92cce7d710e5b1eaabd4e248Ben Gruver            @Override public void annotateSection(@Nonnull AnnotatedBytes out) {
958f8b67f65ec3390e92cce7d710e5b1eaabd4e248Ben Gruver                out.moveTo(sectionOffset);
966fb7190811d6b05bbe45efc3c23b705e8e8845ecBen Gruver                int mapItemCount = dexFile.readSmallUint(out.getCursor());
976fb7190811d6b05bbe45efc3c23b705e8e8845ecBen Gruver                out.annotate(4, "size = %d", mapItemCount);
986fb7190811d6b05bbe45efc3c23b705e8e8845ecBen Gruver
9984dd76e52b1283bef7bc9a529a241690ea2191b8Ben Gruver                super.annotateSectionInner(out, mapItemCount);
1006fb7190811d6b05bbe45efc3c23b705e8e8845ecBen Gruver            }
1016fb7190811d6b05bbe45efc3c23b705e8e8845ecBen Gruver        };
1026fb7190811d6b05bbe45efc3c23b705e8e8845ecBen Gruver    }
103ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver}
104