1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "content/browser/android/java/java_type.h" 6 7 #include "base/logging.h" 8 9 namespace content { 10 namespace { 11 JavaTypeFromJNIName(const std::string & jni_name)12JavaType JavaTypeFromJNIName(const std::string& jni_name) { 13 JavaType result; 14 DCHECK(!jni_name.empty()); 15 switch (jni_name[0]) { 16 case 'Z': 17 result.type = JavaType::TypeBoolean; 18 break; 19 case 'B': 20 result.type = JavaType::TypeByte; 21 break; 22 case 'C': 23 result.type = JavaType::TypeChar; 24 break; 25 case 'S': 26 result.type = JavaType::TypeShort; 27 break; 28 case 'I': 29 result.type = JavaType::TypeInt; 30 break; 31 case 'J': 32 result.type = JavaType::TypeLong; 33 break; 34 case 'F': 35 result.type = JavaType::TypeFloat; 36 break; 37 case 'D': 38 result.type = JavaType::TypeDouble; 39 break; 40 case '[': 41 result.type = JavaType::TypeArray; 42 // LIVECONNECT_COMPLIANCE: We don't support multi-dimensional arrays, so 43 // there's no need to populate the inner types. 44 break; 45 case 'L': 46 result.type = jni_name == "Ljava.lang.String;" ? 47 JavaType::TypeString : 48 JavaType::TypeObject; 49 break; 50 default: 51 // Includes void (V). 52 NOTREACHED(); 53 } 54 return result; 55 } 56 57 } // namespace 58 JavaType()59JavaType::JavaType() { 60 } 61 JavaType(const JavaType & other)62JavaType::JavaType(const JavaType& other) { 63 *this = other; 64 } 65 ~JavaType()66JavaType::~JavaType() { 67 } 68 operator =(const JavaType & other)69JavaType& JavaType::operator=(const JavaType& other) { 70 type = other.type; 71 if (other.inner_type) { 72 DCHECK_EQ(JavaType::TypeArray, type); 73 inner_type.reset(new JavaType(*other.inner_type)); 74 } else { 75 inner_type.reset(); 76 } 77 return *this; 78 } 79 CreateFromBinaryName(const std::string & binary_name)80JavaType JavaType::CreateFromBinaryName(const std::string& binary_name) { 81 JavaType result; 82 DCHECK(!binary_name.empty()); 83 if (binary_name == "boolean") { 84 result.type = JavaType::TypeBoolean; 85 } else if (binary_name == "byte") { 86 result.type = JavaType::TypeByte; 87 } else if (binary_name == "char") { 88 result.type = JavaType::TypeChar; 89 } else if (binary_name == "short") { 90 result.type = JavaType::TypeShort; 91 } else if (binary_name == "int") { 92 result.type = JavaType::TypeInt; 93 } else if (binary_name == "long") { 94 result.type = JavaType::TypeLong; 95 } else if (binary_name == "float") { 96 result.type = JavaType::TypeFloat; 97 } else if (binary_name == "double") { 98 result.type = JavaType::TypeDouble; 99 } else if (binary_name == "void") { 100 result.type = JavaType::TypeVoid; 101 } else if (binary_name[0] == '[') { 102 result.type = JavaType::TypeArray; 103 // The inner type of an array is represented in JNI format. 104 result.inner_type.reset(new JavaType(JavaTypeFromJNIName( 105 binary_name.substr(1)))); 106 } else if (binary_name == "java.lang.String") { 107 result.type = JavaType::TypeString; 108 } else { 109 result.type = JavaType::TypeObject; 110 } 111 return result; 112 } 113 114 } // namespace content 115