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
3116a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.comimport org.jf.dexlib.Util.ExceptionWithContext;
325867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.comimport org.jf.dexlib.Util.Input;
335867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
345867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.compublic class IndexedSection<T extends Item> extends Section<T> {
355867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
365867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    /**
375867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     * Create a new indexed section
385867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     * @param dexFile The <code>DexFile</code> that this section belongs to
395867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     * @param itemType The itemType that this section will hold
405867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     */
415867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    public IndexedSection(DexFile dexFile, ItemType itemType) {
425867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        super(dexFile, itemType);
435867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    }
445867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
455867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    /** {@inheritDoc} */
465867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    protected void readItems(Input in, ReadContext readContext) {
475867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        for (int i = 0; i < items.size(); i++) {
485867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            T item = (T)ItemFactory.makeItem(ItemType, DexFile);
495867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            items.set(i, item);
505867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            item.readFrom(in, i, readContext);
515867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        }
525867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    }
535867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
545867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    /**
5516a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com     * Gets the item at the specified index in this section, or null if the index is -1
565867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     * @param index the index of the item to get
5716a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com     * @return the item at the specified index in this section, or null if the index is -1
585867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com     */
5916a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com    public T getOptionalItemByIndex(int index) {
605867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        if (index == -1) {
615867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com            return null;
625867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com        }
635867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com
6416a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com        return getItemByIndex(index);
6516a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com    }
6616a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com
6716a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com    /**
6816a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com     * Gets the item at the specified index in this section
6916a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com     * @param index the index of the item to get
7016a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com     * @return the item at the specified index in this section
7116a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com     */
7216a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com    public T getItemByIndex(int index) {
7316a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com        try {
7416a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com            //if index is out of bounds, just let it throw an exception
7516a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com            return items.get(index);
7616a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com        } catch (Exception ex) {
7716a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com            throw ExceptionWithContext.withContext(ex, "Error occured while retrieving the " + this.ItemType.TypeName +
7816a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com                    " item at index " + index);
7916a911620ccf7b530b873fb71cf13e8dcb88ad28JesusFreke@JesusFreke.com        }
805867263eb588f4671400895d1e6b01c01535061bJesusFreke@JesusFreke.com    }
8183b80f81d311b233188c281059aad4a9f5e8b4e6JesusFreke@JesusFreke.com}