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