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