17c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver/* 27c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver * Copyright 2012, Google Inc. 37c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver * All rights reserved. 47c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver * 57c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver * Redistribution and use in source and binary forms, with or without 67c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver * modification, are permitted provided that the following conditions are 77c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver * met: 87c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver * 97c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver * * Redistributions of source code must retain the above copyright 107c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver * notice, this list of conditions and the following disclaimer. 117c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver * * Redistributions in binary form must reproduce the above 127c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver * copyright notice, this list of conditions and the following disclaimer 137c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver * in the documentation and/or other materials provided with the 147c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver * distribution. 157c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver * * Neither the name of Google Inc. nor the names of its 167c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver * contributors may be used to endorse or promote products derived from 177c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver * this software without specific prior written permission. 187c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver * 197c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 207c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 217c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 227c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 237c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 247c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 257c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 267c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 277c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 287c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 297c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 307c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver */ 317c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver 327c71ad420dbdfe2e36f205d335a261435181a25bBen Gruverpackage org.jf.dexlib2.dexbacked.value; 337c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver 34b76e75c8bcc11d1e3f348166e2e9f83085154fc8Ben Gruverimport org.jf.dexlib2.base.value.BaseArrayEncodedValue; 3584c1762a62d7fc6638432c6c56e0422aa8cc6939Ben Gruverimport org.jf.dexlib2.dexbacked.DexBackedDexFile; 3636e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruverimport org.jf.dexlib2.dexbacked.DexReader; 3722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruverimport org.jf.dexlib2.dexbacked.util.VariableSizeList; 387c71ad420dbdfe2e36f205d335a261435181a25bBen Gruverimport org.jf.dexlib2.iface.value.ArrayEncodedValue; 397c71ad420dbdfe2e36f205d335a261435181a25bBen Gruverimport org.jf.dexlib2.iface.value.EncodedValue; 407c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver 417c71ad420dbdfe2e36f205d335a261435181a25bBen Gruverimport javax.annotation.Nonnull; 4222c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruverimport java.util.List; 437c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver 44b76e75c8bcc11d1e3f348166e2e9f83085154fc8Ben Gruverpublic class DexBackedArrayEncodedValue extends BaseArrayEncodedValue implements ArrayEncodedValue { 4584c1762a62d7fc6638432c6c56e0422aa8cc6939Ben Gruver @Nonnull public final DexBackedDexFile dexFile; 4612b970ed4dfad768002335503e49c348ea0ed69bBen Gruver private final int elementCount; 477c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver private final int encodedArrayOffset; 487c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver 4936e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver public DexBackedArrayEncodedValue(@Nonnull DexReader reader) { 5084c1762a62d7fc6638432c6c56e0422aa8cc6939Ben Gruver this.dexFile = reader.dexBuf; 5112b970ed4dfad768002335503e49c348ea0ed69bBen Gruver this.elementCount = reader.readSmallUleb128(); 5236e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver this.encodedArrayOffset = reader.getOffset(); 5312b970ed4dfad768002335503e49c348ea0ed69bBen Gruver skipElementsFrom(reader, elementCount); 547c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver } 557c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver 5636e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver public static void skipFrom(@Nonnull DexReader reader) { 577c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver int elementCount = reader.readSmallUleb128(); 5812b970ed4dfad768002335503e49c348ea0ed69bBen Gruver skipElementsFrom(reader, elementCount); 5912b970ed4dfad768002335503e49c348ea0ed69bBen Gruver } 6012b970ed4dfad768002335503e49c348ea0ed69bBen Gruver 6112b970ed4dfad768002335503e49c348ea0ed69bBen Gruver private static void skipElementsFrom(@Nonnull DexReader reader, int elementCount) { 627c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver for (int i=0; i<elementCount; i++) { 637c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver DexBackedEncodedValue.skipFrom(reader); 647c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver } 657c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver } 667c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver 677c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver @Nonnull 687c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver @Override 6922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver public List<? extends EncodedValue> getValue() { 7084c1762a62d7fc6638432c6c56e0422aa8cc6939Ben Gruver return new VariableSizeList<EncodedValue>(dexFile, encodedArrayOffset, elementCount) { 717c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver @Nonnull 727c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver @Override 7312b970ed4dfad768002335503e49c348ea0ed69bBen Gruver protected EncodedValue readNextItem(@Nonnull DexReader dexReader, int index) { 7436e2ee200517b36652a6e8fe1c5aa24ce249765eBen Gruver return DexBackedEncodedValue.readFrom(dexReader); 757c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver } 767c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver }; 777c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver } 787c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver} 79