15867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com/* 25867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * [The "BSD licence"] 300fc68adf2e39aeb9fed35293f2576bbe729ec4bJesusFreke@JesusFreke.com * Copyright (c) 2010 Ben Gruver (JesusFreke) 45867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * All rights reserved. 55867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * 65867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * Redistribution and use in source and binary forms, with or without 75867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * modification, are permitted provided that the following conditions 85867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * are met: 95867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * 1. Redistributions of source code must retain the above copyright 105867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * notice, this list of conditions and the following disclaimer. 115867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * 2. Redistributions in binary form must reproduce the above copyright 125867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * notice, this list of conditions and the following disclaimer in the 135867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * documentation and/or other materials provided with the distribution. 145867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * 3. The name of the author may not be used to endorse or promote products 155867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * derived from this software without specific prior written permission. 165867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * 175867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 185867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 195867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 205867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 215867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 225867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 235867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 245867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 265867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com */ 285867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 295867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.compackage org.jf.dexlib; 305867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 311ffc028a3bc94b71abb7dee7c9c5083e92fd93c0Ben Gruverimport com.google.common.base.Preconditions; 3216a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.comimport org.jf.dexlib.Util.AlignmentUtils; 335867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.comimport org.jf.dexlib.Util.AnnotatedOutput; 3416a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.comimport org.jf.dexlib.Util.ExceptionWithContext; 355867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.comimport org.jf.dexlib.Util.Input; 365867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 375867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.compublic abstract class Item<T extends Item> implements Comparable<T> { 385867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com /** 395867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * The offset of this item in the dex file, or -1 if not known 405867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com */ 415867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com protected int offset = -1; 425867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 435867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com /** 445867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * The index of this item in the containing section, or -1 if not known 455867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com */ 465867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com protected int index = -1; 475867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 485867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com /** 495867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * The DexFile that this item is associatedr with 505867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com */ 515867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com protected final DexFile dexFile; 525867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 535867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com /** 545867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * The constructor that is used when reading in a <code>DexFile</code> 555867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * @param dexFile the <code>DexFile</code> that this item is associated with 565867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com */ 575867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com protected Item(DexFile dexFile) { 5816a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com assert dexFile != null; 5916a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com 605867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com this.dexFile = dexFile; 615867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com } 625867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 635867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com /** 645867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * Read in the item from the given input stream, and initialize the index 655867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * @param in the <code>Input</code> object to read from 665867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * @param index the index within the containing section of the item being read in 675867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * @param readContext a <code>ReadContext</code> object to hold information that is 685867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * only needed while reading in a file 695867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com */ 705867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com protected void readFrom(Input in, int index, ReadContext readContext) { 7116a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com try { 7216a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com assert AlignmentUtils.isAligned(in.getCursor(), getItemType().ItemAlignment); 7316a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com 7416a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com this.offset = in.getCursor(); 7516a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com this.index = index; 765867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 7716a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com this.readItem(in, readContext); 7816a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com } catch (Exception ex) { 7916a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com throw addExceptionContext(ex); 8016a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com } 815867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com } 825867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 835867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com /** 845867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * Place the item at the given offset and index, and return the offset of the byte following this item 855867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * @param offset The offset to place the item at 865867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * @param index The index of the item within the containing section 875867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * @return The offset of the byte following this item 885867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com */ 895867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com protected int placeAt(int offset, int index) { 9016a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com try { 9116a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com assert AlignmentUtils.isAligned(offset, getItemType().ItemAlignment); 9216a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com assert !dexFile.getInplace() || (offset == this.offset && this.index == index); 9316a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com 9416a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com this.offset = offset; 9516a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com this.index = index; 9616a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com return this.placeItem(offset); 9716a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com } catch (Exception ex) { 9816a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com throw addExceptionContext(ex); 9916a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com } 1005867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com } 1015867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 1025867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com /** 1035867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * Write and annotate this item to the output stream 1045867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * @param out The output stream to write and annotate to 1055867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com */ 1065867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com protected void writeTo(AnnotatedOutput out) { 10716a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com try { 10816a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com assert AlignmentUtils.isAligned(offset, getItemType().ItemAlignment); 10916a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com //ensure that it is being written to the same offset where it was previously placed 11016a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com assert out.getCursor() == offset; 11116a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com 11216a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com if (out.annotates()) { 11316a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com out.annotate(0, "[" + index + "] " + this.getItemType().TypeName); 11416a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com } 11516a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com 11616a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com out.indent(); 11716a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com writeItem(out); 11816a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com out.deindent(); 11916a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com } catch (Exception ex) { 12016a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com throw addExceptionContext(ex); 1215867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com } 1225867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com } 1235867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 1245867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com /** 1255867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * Returns a human readable form of this item 1265867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * @return a human readable form of this item 1275867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com */ 1285867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com public String toString() { 1295867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com return getConciseIdentity(); 1305867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com } 1315867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 1325867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com /** 1335867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * The method in the concrete item subclass that actually reads in the data for the item 1345867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * 1355867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * The logic in this method can assume that the given Input object is valid and is 1365867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * aligned as neccessary. 1375867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * 1385867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * This method is for internal use only 1395867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * @param in the <code>Input</code> object to read from 1405867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * @param readContext a <code>ReadContext</code> object to hold information that is 1415867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * only needed while reading in a file 1425867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com */ 1435867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com protected abstract void readItem(Input in, ReadContext readContext); 1445867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 1455867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com /** 1465867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * The method should finalize the layout of the item and return the offset of the byte 1475867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * immediately following the item. 1485867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * 1495867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * The implementation of this method can assume that the offset argument has already been 1505867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * aligned based on the item's alignment requirements 1515867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * 1525867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * This method is for internal use only 1535867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * @param offset the (pre-aligned) offset to place the item at 1545867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * @return the size of the item, in bytes 1555867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com */ 1565867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com protected abstract int placeItem(int offset); 1575867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 1585867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com /** 1595867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * The method in the concrete item subclass that actually writes and annotates the data 1605867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * for the item. 1615867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * 1625867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * The logic in this method can assume that the given Output object is valid and is 1635867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * aligned as neccessary 1645867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * 1655867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * @param out The <code>AnnotatedOutput</code> object to write/annotate to 1665867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com */ 1675867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com protected abstract void writeItem(AnnotatedOutput out); 1685867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 1695867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com /** 17016a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com * This method is called to add item specific context information to an exception, to identify the "current item" 17116a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com * when the exception occured. It adds the value returned by <code>getConciseIdentity</code> as context for the 17216a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com * exception 17316a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com * @param ex The exception that occured 17416a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com * @return A RuntimeException with additional details about the item added 17516a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com */ 17616a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com protected final RuntimeException addExceptionContext(Exception ex) { 17716a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com return ExceptionWithContext.withContext(ex, getConciseIdentity()); 17816a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com } 17916a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com 18016a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com /** 1815867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * @return An ItemType enum that represents the item type of this item 1825867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com */ 1835867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com public abstract ItemType getItemType(); 1845867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 1855867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com /** 1865867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * @return A concise (human-readable) string value that conveys the identity of this item 1875867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com */ 1885867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com public abstract String getConciseIdentity(); 1895867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 1905867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 1915867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com /** 192d320d6ce8c8b9ea0aa1c661fc4219e4679c1e196Ben Gruver * Note that the item must have been placed before calling this method (See <code>DexFile.place()</code>) 1935867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * @return the offset in the dex file where this item is located 1945867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com */ 1955867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com public int getOffset() { 1961ffc028a3bc94b71abb7dee7c9c5083e92fd93c0Ben Gruver Preconditions.checkState(offset != -1, 1971ffc028a3bc94b71abb7dee7c9c5083e92fd93c0Ben Gruver "The offset is not set until the DexFile containing this item is placed."); 1985867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com return offset; 1995867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com } 2005867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 2015867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com /** 202d320d6ce8c8b9ea0aa1c661fc4219e4679c1e196Ben Gruver * Note that the item must have been placed before calling this method (See <code>DexFile.place()</code>) 203d320d6ce8c8b9ea0aa1c661fc4219e4679c1e196Ben Gruver * @return the index of this item within the item's containing section. 2045867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com */ 2055867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com public int getIndex() { 2061ffc028a3bc94b71abb7dee7c9c5083e92fd93c0Ben Gruver Preconditions.checkState(index != -1, 2071ffc028a3bc94b71abb7dee7c9c5083e92fd93c0Ben Gruver "The index is not set until the DexFile containing this item is placed."); 2085867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com return index; 2095867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com } 2105867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com 2115867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com /** 212d320d6ce8c8b9ea0aa1c661fc4219e4679c1e196Ben Gruver * @return True if this item has been placed, otherwise False 213d320d6ce8c8b9ea0aa1c661fc4219e4679c1e196Ben Gruver */ 214d320d6ce8c8b9ea0aa1c661fc4219e4679c1e196Ben Gruver public boolean isPlaced() { 215d320d6ce8c8b9ea0aa1c661fc4219e4679c1e196Ben Gruver return offset != -1; 216d320d6ce8c8b9ea0aa1c661fc4219e4679c1e196Ben Gruver } 217d320d6ce8c8b9ea0aa1c661fc4219e4679c1e196Ben Gruver 218d320d6ce8c8b9ea0aa1c661fc4219e4679c1e196Ben Gruver /** 2195867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com * @return the <code>DexFile</code> that contains this item 2205867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com */ 2215867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com public DexFile getDexFile() { 2225867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com return dexFile; 2235867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com } 2245867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com} 225