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 3483f77f51aa888998486c0c9ad693047480b060b0Ben Gruverimport org.jf.dexlib2.Opcodes; 35cc3be5df1e6cf941ee3fab4a6f78a3c08922be59Ben Gruverimport org.jf.dexlib2.dexbacked.BaseDexBuffer; 36ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruverimport org.jf.dexlib2.dexbacked.DexBackedDexFile; 37ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruverimport org.jf.dexlib2.dexbacked.util.FixedSizeList; 38ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruverimport org.jf.dexlib2.util.AnnotatedBytes; 39ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver 40ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruverimport javax.annotation.Nonnull; 41cd12f13ffc2e67e674d82060076a450051b0371bBen Gruverimport javax.annotation.Nullable; 42ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruverimport java.io.IOException; 43ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruverimport java.io.Writer; 44132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruverimport java.util.Arrays; 45ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruverimport java.util.List; 46ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver 4712659ec7db2876fee690a4192d6aefe71ac27b73Ben Gruverpublic class RawDexFile extends DexBackedDexFile { 48ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver @Nonnull public final HeaderItem headerItem; 49ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver 5083f77f51aa888998486c0c9ad693047480b060b0Ben Gruver public RawDexFile(@Nonnull Opcodes opcodes, @Nonnull BaseDexBuffer buf) { 5183f77f51aa888998486c0c9ad693047480b060b0Ben Gruver super(opcodes, buf); 52cc3be5df1e6cf941ee3fab4a6f78a3c08922be59Ben Gruver this.headerItem = new HeaderItem(this); 53cc3be5df1e6cf941ee3fab4a6f78a3c08922be59Ben Gruver } 54cc3be5df1e6cf941ee3fab4a6f78a3c08922be59Ben Gruver 5583f77f51aa888998486c0c9ad693047480b060b0Ben Gruver public RawDexFile(@Nonnull Opcodes opcodes, @Nonnull byte[] buf) { 5683f77f51aa888998486c0c9ad693047480b060b0Ben Gruver super(opcodes, buf); 57cc3be5df1e6cf941ee3fab4a6f78a3c08922be59Ben Gruver this.headerItem = new HeaderItem(this); 58ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver } 59ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver 6083f77f51aa888998486c0c9ad693047480b060b0Ben Gruver @Nonnull 61132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver public byte[] readByteRange(int start, int length) { 62132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver return Arrays.copyOfRange(getBuf(), start, start+length); 63132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver } 64132eeaedf7d0980397fbdac41e1a7aebff01adbfBen Gruver 65ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver public int getMapOffset() { 66ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver return headerItem.getMapOffset(); 67ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver } 68ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver 69cd12f13ffc2e67e674d82060076a450051b0371bBen Gruver @Nullable 70cd12f13ffc2e67e674d82060076a450051b0371bBen Gruver public MapItem getMapItemForSection(int itemType) { 71cd12f13ffc2e67e674d82060076a450051b0371bBen Gruver for (MapItem mapItem: getMapItems()) { 72cd12f13ffc2e67e674d82060076a450051b0371bBen Gruver if (mapItem.getType() == itemType) { 73cd12f13ffc2e67e674d82060076a450051b0371bBen Gruver return mapItem; 74cd12f13ffc2e67e674d82060076a450051b0371bBen Gruver } 75cd12f13ffc2e67e674d82060076a450051b0371bBen Gruver } 76cd12f13ffc2e67e674d82060076a450051b0371bBen Gruver return null; 77cd12f13ffc2e67e674d82060076a450051b0371bBen Gruver } 78cd12f13ffc2e67e674d82060076a450051b0371bBen Gruver 79ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver public List<MapItem> getMapItems() { 80ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver final int mapOffset = getMapOffset(); 81cc3be5df1e6cf941ee3fab4a6f78a3c08922be59Ben Gruver final int mapSize = readSmallUint(mapOffset); 82ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver 83ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver return new FixedSizeList<MapItem>() { 84ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver @Override 85ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver public MapItem readItem(int index) { 86ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver int mapItemOffset = mapOffset + 4 + index * MapItem.ITEM_SIZE; 87cc3be5df1e6cf941ee3fab4a6f78a3c08922be59Ben Gruver return new MapItem(RawDexFile.this, mapItemOffset); 88ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver } 89ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver 90ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver @Override public int size() { 91ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver return mapSize; 92ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver } 93ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver }; 94ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver } 95ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver 968f8b67f65ec3390e92cce7d710e5b1eaabd4e248Ben Gruver public void writeAnnotations(@Nonnull Writer out, @Nonnull AnnotatedBytes annotatedBytes) throws IOException { 97cc3be5df1e6cf941ee3fab4a6f78a3c08922be59Ben Gruver annotatedBytes.writeAnnotations(out, getBuf()); 98ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver } 99ff32d5cc147d4777b19e19692b3b196ddc460b51Ben Gruver} 100