190f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver/*
290f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver * Copyright 2013, Google Inc.
390f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver * All rights reserved.
490f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver *
590f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver * Redistribution and use in source and binary forms, with or without
690f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver * modification, are permitted provided that the following conditions are
790f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver * met:
890f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver *
990f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver *     * Redistributions of source code must retain the above copyright
1090f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver * notice, this list of conditions and the following disclaimer.
1190f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver *     * Redistributions in binary form must reproduce the above
1290f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver * copyright notice, this list of conditions and the following disclaimer
1390f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver * in the documentation and/or other materials provided with the
1490f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver * distribution.
1590f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver *     * Neither the name of Google Inc. nor the names of its
1690f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver * contributors may be used to endorse or promote products derived from
1790f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver * this software without specific prior written permission.
1890f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver *
1990f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2090f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2190f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2290f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2390f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2490f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2590f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2690f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2790f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2890f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2990f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3090f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver */
3190f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver
3290f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruverpackage org.jf.dexlib2.dexbacked.raw;
3390f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver
34c5abfe4cea91f7ffcbaaa72b8f636534a12629d0Ben Gruverimport org.jf.dexlib2.dexbacked.DexBackedDexFile;
358f8b67f65ec3390e92cce7d710e5b1eaabd4e248Ben Gruverimport org.jf.dexlib2.dexbacked.raw.util.DexAnnotator;
3690f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruverimport org.jf.dexlib2.util.AnnotatedBytes;
3790f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver
3890f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruverimport javax.annotation.Nonnull;
398f8b67f65ec3390e92cce7d710e5b1eaabd4e248Ben Gruverimport javax.annotation.Nullable;
4090f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver
4190f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruverpublic class AnnotationSetRefList {
4290f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver    public static final int SIZE_OFFSET = 0;
4390f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver    public static final int LIST_OFFSET = 4;
4490f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver
4590f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver    @Nonnull
468f8b67f65ec3390e92cce7d710e5b1eaabd4e248Ben Gruver    public static SectionAnnotator makeAnnotator(@Nonnull DexAnnotator annotator, @Nonnull MapItem mapItem) {
478f8b67f65ec3390e92cce7d710e5b1eaabd4e248Ben Gruver        return new SectionAnnotator(annotator, mapItem) {
4890f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver            @Nonnull @Override public String getItemName() {
4990f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver                return "annotation_set_ref_list";
5090f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver            }
5190f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver
5290f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver            @Override
538f8b67f65ec3390e92cce7d710e5b1eaabd4e248Ben Gruver            protected void annotateItem(@Nonnull AnnotatedBytes out, int itemIndex, @Nullable String itemIdentity) {
5490f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver                int size = dexFile.readSmallUint(out.getCursor());
5590f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver                out.annotate(4, "size = %d", size);
5690f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver
5790f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver                for (int i=0; i<size; i++) {
5890f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver                    int annotationSetOffset = dexFile.readSmallUint(out.getCursor());
5990f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver                    out.annotate(4, "annotation_set_item[0x%x]", annotationSetOffset);
6090f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver                }
6190f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver            }
6290f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver
6390f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver            @Override public int getItemAlignment() {
6490f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver                return 4;
6590f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver            }
6690f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver        };
6790f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver    }
68c5abfe4cea91f7ffcbaaa72b8f636534a12629d0Ben Gruver
69c5abfe4cea91f7ffcbaaa72b8f636534a12629d0Ben Gruver    @Nonnull
70c5abfe4cea91f7ffcbaaa72b8f636534a12629d0Ben Gruver    public static String getReferenceAnnotation(@Nonnull DexBackedDexFile dexFile, int annotationSetRefListOffset) {
71c5abfe4cea91f7ffcbaaa72b8f636534a12629d0Ben Gruver        if (annotationSetRefListOffset == 0) {
72c5abfe4cea91f7ffcbaaa72b8f636534a12629d0Ben Gruver            return "annotation_set_ref_list[NO_OFFSET]";
73c5abfe4cea91f7ffcbaaa72b8f636534a12629d0Ben Gruver        }
74c5abfe4cea91f7ffcbaaa72b8f636534a12629d0Ben Gruver        return String.format("annotation_set_ref_list[0x%x]", annotationSetRefListOffset);
75c5abfe4cea91f7ffcbaaa72b8f636534a12629d0Ben Gruver    }
7690f8ea9f1e9175ba33933b163c4b095f578f3d5fBen Gruver}
77