1c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver/* 2c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * Copyright 2012, Google Inc. 3c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * All rights reserved. 4c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * 5c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * Redistribution and use in source and binary forms, with or without 6c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * modification, are permitted provided that the following conditions are 7c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * met: 8c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * 9c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * * Redistributions of source code must retain the above copyright 10c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * notice, this list of conditions and the following disclaimer. 11c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * * Redistributions in binary form must reproduce the above 12c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * copyright notice, this list of conditions and the following disclaimer 13c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * in the documentation and/or other materials provided with the 14c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * distribution. 15c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * * Neither the name of Google Inc. nor the names of its 16c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * contributors may be used to endorse or promote products derived from 17c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * this software without specific prior written permission. 18c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * 19c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver */ 31c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver 32c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruverpackage org.jf.dexlib2; 33c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver 349057764c22f050848748aac0ab31921d334c3e16Ben Gruverimport org.jf.dexlib2.iface.reference.*; 359057764c22f050848748aac0ab31921d334c3e16Ben Gruverimport org.jf.util.ExceptionWithContext; 369057764c22f050848748aac0ab31921d334c3e16Ben Gruver 3785b31462241daf1d5d5e7b5e94ca926e46dff971Ben Gruverpublic final class ReferenceType { 3870aa787967e18fd782f47a0b5508271637577c30Ben Gruver public static final int STRING = 0; 3970aa787967e18fd782f47a0b5508271637577c30Ben Gruver public static final int TYPE = 1; 4070aa787967e18fd782f47a0b5508271637577c30Ben Gruver public static final int FIELD = 2; 4170aa787967e18fd782f47a0b5508271637577c30Ben Gruver public static final int METHOD = 3; 4270aa787967e18fd782f47a0b5508271637577c30Ben Gruver public static final int NONE = 4; 4385b31462241daf1d5d5e7b5e94ca926e46dff971Ben Gruver 44f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver public static String toString(int referenceType) { 45f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver switch (referenceType) { 46f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver case STRING: 47f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver return "string"; 48f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver case TYPE: 49f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver return "type"; 50f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver case FIELD: 51f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver return "field"; 52f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver case METHOD: 53f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver return "method"; 54f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver default: 559057764c22f050848748aac0ab31921d334c3e16Ben Gruver throw new InvalidReferenceTypeException(referenceType); 569057764c22f050848748aac0ab31921d334c3e16Ben Gruver } 579057764c22f050848748aac0ab31921d334c3e16Ben Gruver } 589057764c22f050848748aac0ab31921d334c3e16Ben Gruver 599057764c22f050848748aac0ab31921d334c3e16Ben Gruver public static int getReferenceType(Reference reference) { 609057764c22f050848748aac0ab31921d334c3e16Ben Gruver if (reference instanceof StringReference) { 619057764c22f050848748aac0ab31921d334c3e16Ben Gruver return STRING; 629057764c22f050848748aac0ab31921d334c3e16Ben Gruver } else if (reference instanceof TypeReference) { 639057764c22f050848748aac0ab31921d334c3e16Ben Gruver return TYPE; 649057764c22f050848748aac0ab31921d334c3e16Ben Gruver } else if (reference instanceof FieldReference) { 659057764c22f050848748aac0ab31921d334c3e16Ben Gruver return FIELD; 669057764c22f050848748aac0ab31921d334c3e16Ben Gruver } else if (reference instanceof MethodReference) { 679057764c22f050848748aac0ab31921d334c3e16Ben Gruver return METHOD; 689057764c22f050848748aac0ab31921d334c3e16Ben Gruver } else { 699057764c22f050848748aac0ab31921d334c3e16Ben Gruver throw new IllegalStateException("Invalid reference"); 709057764c22f050848748aac0ab31921d334c3e16Ben Gruver } 719057764c22f050848748aac0ab31921d334c3e16Ben Gruver } 729057764c22f050848748aac0ab31921d334c3e16Ben Gruver 739057764c22f050848748aac0ab31921d334c3e16Ben Gruver /** 749057764c22f050848748aac0ab31921d334c3e16Ben Gruver * Validate a specific reference type. Note that the NONE placeholder is specifically not considered valid here. 759057764c22f050848748aac0ab31921d334c3e16Ben Gruver * 769057764c22f050848748aac0ab31921d334c3e16Ben Gruver * @throws InvalidReferenceTypeException 779057764c22f050848748aac0ab31921d334c3e16Ben Gruver */ 789057764c22f050848748aac0ab31921d334c3e16Ben Gruver public static void validateReferenceType(int referenceType) { 799057764c22f050848748aac0ab31921d334c3e16Ben Gruver if (referenceType < 0 || referenceType > 3) { 809057764c22f050848748aac0ab31921d334c3e16Ben Gruver throw new InvalidReferenceTypeException(referenceType); 819057764c22f050848748aac0ab31921d334c3e16Ben Gruver } 829057764c22f050848748aac0ab31921d334c3e16Ben Gruver } 839057764c22f050848748aac0ab31921d334c3e16Ben Gruver 849057764c22f050848748aac0ab31921d334c3e16Ben Gruver public static class InvalidReferenceTypeException extends ExceptionWithContext { 859057764c22f050848748aac0ab31921d334c3e16Ben Gruver private final int referenceType; 869057764c22f050848748aac0ab31921d334c3e16Ben Gruver 879057764c22f050848748aac0ab31921d334c3e16Ben Gruver public InvalidReferenceTypeException(int referenceType) { 889057764c22f050848748aac0ab31921d334c3e16Ben Gruver super("Invalid reference type: %d", referenceType); 899057764c22f050848748aac0ab31921d334c3e16Ben Gruver this.referenceType = referenceType; 909057764c22f050848748aac0ab31921d334c3e16Ben Gruver } 919057764c22f050848748aac0ab31921d334c3e16Ben Gruver 929057764c22f050848748aac0ab31921d334c3e16Ben Gruver public InvalidReferenceTypeException(int referenceType, String message, Object... formatArgs) { 939057764c22f050848748aac0ab31921d334c3e16Ben Gruver super(message, formatArgs); 949057764c22f050848748aac0ab31921d334c3e16Ben Gruver this.referenceType = referenceType; 959057764c22f050848748aac0ab31921d334c3e16Ben Gruver } 969057764c22f050848748aac0ab31921d334c3e16Ben Gruver 979057764c22f050848748aac0ab31921d334c3e16Ben Gruver public int getReferenceType() { 989057764c22f050848748aac0ab31921d334c3e16Ben Gruver return referenceType; 99f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver } 100f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver } 101f7d6d5fadec6276246194a55b6aefe4815b50aceBen Gruver 10285b31462241daf1d5d5e7b5e94ca926e46dff971Ben Gruver private ReferenceType() {} 103c05d8d40e0160037cd2294dbcd82ba3101d9a834Ben Gruver}