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