1a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley/* 2a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley * Copyright (C) 2015, The Android Open Source Project 3a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley * 4a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley * Licensed under the Apache License, Version 2.0 (the "License"); 5a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley * you may not use this file except in compliance with the License. 6a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley * You may obtain a copy of the License at 7a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley * 8a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley * http://www.apache.org/licenses/LICENSE-2.0 9a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley * 10a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley * Unless required by applicable law or agreed to in writing, software 11a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley * distributed under the License is distributed on an "AS IS" BASIS, 12a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley * See the License for the specific language governing permissions and 14a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley * limitations under the License. 15a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley */ 16a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley 17a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley#include "type_cpp.h" 18a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley 19b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley#include <algorithm> 20b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley#include <iostream> 21389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin#include <vector> 22b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley 230a62067f35e957493bc37c4b42dfdcfc16353831Elliott Hughes#include <android-base/stringprintf.h> 240a62067f35e957493bc37c4b42dfdcfc16353831Elliott Hughes#include <android-base/strings.h> 25b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley 26a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley#include "logging.h" 27a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley 28b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wileyusing std::cerr; 29b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wileyusing std::endl; 308a6579721e9390d8ed2cb49e0146a025194799f6Christopher Wileyusing std::set; 31a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wileyusing std::string; 32a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wileyusing std::unique_ptr; 33389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinusing std::vector; 34a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley 35b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wileyusing android::base::Split; 36389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinusing android::base::Join; 37b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wileyusing android::base::StringPrintf; 38b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley 39a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wileynamespace android { 40a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wileynamespace aidl { 41a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wileynamespace cpp { 42ad3392747003a30928da6cd206e41f66398c2062Christopher Wileynamespace { 43ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley 4409af469476ea6d187b52f22113d3b168a887100cChristopher Wileyconst char kNoPackage[] = ""; 4509af469476ea6d187b52f22113d3b168a887100cChristopher Wileyconst char kNoHeader[] = ""; 4609af469476ea6d187b52f22113d3b168a887100cChristopher Wileyconst char kNoValidMethod[] = ""; 47a2f77c40fb6287895e2030055c0104eac0a1f73aCasey DahlinType* const kNoArrayType = nullptr; 4857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey DahlinType* const kNoNullableType = nullptr; 4909af469476ea6d187b52f22113d3b168a887100cChristopher Wiley 50b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wileybool is_cpp_keyword(const std::string& str) { 51b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley static const std::vector<std::string> kCppKeywords{ 52b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley "alignas", "alignof", "and", "and_eq", "asm", "auto", "bitand", "bitor", 53b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley "bool", "break", "case", "catch", "char", "char16_t", "char32_t", "class", 54b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley "compl", "concept", "const", "constexpr", "const_cast", "continue", 55b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley "decltype", "default", "delete", "do", "double", "dynamic_cast", "else", 56b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley "enum", "explicit", "export", "extern", "false", "float", "for", "friend", 57b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley "goto", "if", "inline", "int", "long", "mutable", "namespace", "new", 58b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley "noexcept", "not", "not_eq", "nullptr", "operator", "or", "or_eq", 59b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley "private", "protected", "public", "register", "reinterpret_cast", 60b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley "requires", "return", "short", "signed", "sizeof", "static", 61b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley "static_assert", "static_cast", "struct", "switch", "template", "this", 62b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley "thread_local", "throw", "true", "try", "typedef", "typeid", "typename", 63b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley "union", "unsigned", "using", "virtual", "void", "volatile", "wchar_t", 64b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley "while", "xor", "xor_eq", 65b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley }; 66b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley return std::find(kCppKeywords.begin(), kCppKeywords.end(), str) != 67b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley kCppKeywords.end(); 68b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley} 69b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley 70ad3392747003a30928da6cd206e41f66398c2062Christopher Wileyclass VoidType : public Type { 71ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley public: 7209af469476ea6d187b52f22113d3b168a887100cChristopher Wiley VoidType() : Type(ValidatableType::KIND_BUILT_IN, kNoPackage, "void", 73a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin {}, "void", kNoValidMethod, kNoValidMethod) {} 74ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley virtual ~VoidType() = default; 75ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley bool CanBeOutParameter() const override { return false; } 76ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley bool CanWriteToParcel() const override { return false; } 77ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}; // class VoidType 78ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley 79a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlinclass PrimitiveType : public Type { 80a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin public: 81a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin PrimitiveType(int kind, // from ValidatableType 82a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin const std::string& package, 83a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin const std::string& aidl_type, 84a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin const std::string& header, 85a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin const std::string& cpp_type, 86a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin const std::string& read_method, 87a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin const std::string& write_method, 88a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin const std::string& read_array_method, 89a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin const std::string& write_array_method) 90a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin : Type(kind, package, aidl_type, {header}, cpp_type, read_method, 9157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin write_method, PrimitiveArrayType(kind, package, aidl_type, 9257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin header, cpp_type, 9357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin read_array_method, 9457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin write_array_method)) {} 9557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 96a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin virtual ~PrimitiveType() = default; 97a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin bool IsCppPrimitive() const override { return true; } 98a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin bool CanBeOutParameter() const override { return is_array_; } 99a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin 100a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin protected: 10157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin static PrimitiveType* PrimitiveArrayType(int kind, // from ValidatableType 10257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin const std::string& package, 10357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin const std::string& aidl_type, 10457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin const std::string& header, 10557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin const std::string& cpp_type, 10657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin const std::string& read_method, 10757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin const std::string& write_method) { 10857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin PrimitiveType* nullable = 10957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin new PrimitiveType(kind, package, aidl_type + "[]", header, 11057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "::std::unique_ptr<::std::vector<" + cpp_type + ">>", 11157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin read_method, write_method); 11257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 11357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return new PrimitiveType(kind, package, aidl_type + "[]", header, 11457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "::std::vector<" + cpp_type + ">", 11557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin read_method, write_method, nullable); 11657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 11757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 118a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin PrimitiveType(int kind, // from ValidatableType 119a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin const std::string& package, 120a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin const std::string& aidl_type, 121a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin const std::string& header, 122a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin const std::string& cpp_type, 123a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin const std::string& read_method, 12457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin const std::string& write_method, 12557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin Type* nullable_type = nullptr) 126a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin : Type(kind, package, aidl_type, {header, "vector"}, cpp_type, read_method, 12757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin write_method, kNoArrayType, nullable_type) { 128a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin is_array_ = true; 129a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin } 130a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin 131a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin private: 132a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin bool is_array_ = false; 133a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin 134a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin DISALLOW_COPY_AND_ASSIGN(PrimitiveType); 135a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin}; // class PrimitiveType 136a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin 137671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlinclass ByteType : public Type { 138671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin public: 139671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin ByteType() : ByteType(false, "byte", "int8_t", "readByte", "writeByte", 140671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin new ByteType(true, "byte[]", "::std::vector<uint8_t>", "readByteVector", 141671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin "writeByteVector", kNoArrayType, 142671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin new ByteType(true, "byte[]", 143671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin "::std::unique_ptr<::std::vector<uint8_t>>", 144671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin "readByteVector", "writeByteVector", kNoArrayType, 145671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin kNoNullableType)), kNoNullableType) {} 146671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin 147671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin virtual ~ByteType() = default; 148671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin bool IsCppPrimitive() const override { return true; } 149671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin bool CanBeOutParameter() const override { return is_array_; } 150671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin 151671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin protected: 152671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin ByteType(bool is_array, 153671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin const std::string& name, 154671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin const std::string& cpp_type, 155671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin const std::string& read_method, 156671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin const std::string& write_method, 157671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin Type* array_type, 158671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin Type* nullable_type) 159671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin : Type(ValidatableType::KIND_BUILT_IN, kNoPackage, name, {"cstdint"}, 160671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin cpp_type, read_method, write_method, array_type, nullable_type), 161671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin is_array_(is_array) {} 162671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin 163671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin private: 164671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin bool is_array_ = false; 165671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin 166671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin DISALLOW_COPY_AND_ASSIGN(ByteType); 167671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin}; // class PrimitiveType 168671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin 169389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinclass BinderType : public Type { 170389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin public: 17109af469476ea6d187b52f22113d3b168a887100cChristopher Wiley BinderType(const AidlInterface& interface, const std::string& src_file_name) 17209af469476ea6d187b52f22113d3b168a887100cChristopher Wiley : Type(ValidatableType::KIND_GENERATED, 17309af469476ea6d187b52f22113d3b168a887100cChristopher Wiley interface.GetPackage(), interface.GetName(), 174a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin {GetCppHeader(interface)}, GetCppName(interface), 17509af469476ea6d187b52f22113d3b168a887100cChristopher Wiley "readStrongBinder", "writeStrongBinder", 17657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin kNoArrayType, kNoNullableType, src_file_name, 1772dbab064e029411e230fb86913d58a03dfd18519Casey Dahlin interface.GetLine()), 1782dbab064e029411e230fb86913d58a03dfd18519Casey Dahlin write_cast_(GetRawCppName(interface) + "::asBinder") {} 179389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin virtual ~BinderType() = default; 180389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 181389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin string WriteCast(const string& val) const override { 1822dbab064e029411e230fb86913d58a03dfd18519Casey Dahlin return write_cast_ + "(" + val + ")"; 183389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin } 184389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 185389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin private: 186389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin static string GetCppName(const AidlInterface& interface) { 1872dbab064e029411e230fb86913d58a03dfd18519Casey Dahlin return "::android::sp<" + GetRawCppName(interface) + ">"; 1882dbab064e029411e230fb86913d58a03dfd18519Casey Dahlin } 1892dbab064e029411e230fb86913d58a03dfd18519Casey Dahlin 1902dbab064e029411e230fb86913d58a03dfd18519Casey Dahlin static string GetRawCppName(const AidlInterface& interface) { 191389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin vector<string> name = interface.GetSplitPackage(); 1922dbab064e029411e230fb86913d58a03dfd18519Casey Dahlin string ret; 193389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 194389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin name.push_back(interface.GetName()); 195389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 196389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin for (const auto& term : name) { 197389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin ret += "::" + term; 198389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin } 199389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 2002dbab064e029411e230fb86913d58a03dfd18519Casey Dahlin return ret; 201389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin } 202389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 203389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin static string GetCppHeader(const AidlInterface& interface) { 204389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin vector<string> name = interface.GetSplitPackage(); 205389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin name.push_back(interface.GetName()); 206389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin return Join(name, '/') + ".h"; 207389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin } 2082dbab064e029411e230fb86913d58a03dfd18519Casey Dahlin 2092dbab064e029411e230fb86913d58a03dfd18519Casey Dahlin std::string write_cast_; 210389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}; 211389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 21257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinclass NullableParcelableArrayType : public ArrayType { 21357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin public: 21457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin NullableParcelableArrayType(const AidlParcelable& parcelable, 21557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin const std::string& src_file_name) 21657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin : ArrayType(ValidatableType::KIND_PARCELABLE, 21757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin parcelable.GetPackage(), parcelable.GetName(), 21857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin {parcelable.GetCppHeader(), "vector"}, 21957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin GetCppName(parcelable), "readParcelableVector", 22057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "writeParcelableVector", kNoArrayType, kNoNullableType, 22157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin src_file_name, parcelable.GetLine()) {} 22257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin virtual ~NullableParcelableArrayType() = default; 22357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 22457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin private: 22557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin static string GetCppName(const AidlParcelable& parcelable) { 22657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return "::std::unique_ptr<::std::vector<std::unique_ptr<" + 22757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin Join(parcelable.GetSplitPackage(), "::") + "::" + 22857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin parcelable.GetName() + ">>>"; 22957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 23057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin}; 23157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 23257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinclass ParcelableArrayType : public ArrayType { 233a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin public: 234a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin ParcelableArrayType(const AidlParcelable& parcelable, 235a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin const std::string& src_file_name) 23657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin : ArrayType(ValidatableType::KIND_PARCELABLE, 23757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin parcelable.GetPackage(), parcelable.GetName(), 23857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin {parcelable.GetCppHeader(), "vector"}, 23957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin GetCppName(parcelable), "readParcelableVector", 24057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "writeParcelableVector", kNoArrayType, 24157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin new NullableParcelableArrayType(parcelable, src_file_name), 24257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin src_file_name, parcelable.GetLine()) {} 24357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin virtual ~ParcelableArrayType() = default; 24457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 24557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin private: 24657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin static string GetCppName(const AidlParcelable& parcelable) { 24757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return "::std::vector<" + Join(parcelable.GetSplitPackage(), "::") + 24857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "::" + parcelable.GetName() + ">"; 24957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 25057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin}; 25157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 25257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinclass NullableParcelableType : public Type { 25357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin public: 25457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin NullableParcelableType(const AidlParcelable& parcelable, 25557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin const std::string& src_file_name) 256a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin : Type(ValidatableType::KIND_PARCELABLE, 257a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin parcelable.GetPackage(), parcelable.GetName(), 25857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin {parcelable.GetCppHeader()}, GetCppName(parcelable), 25957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "readParcelable", "writeNullableParcelable", 26057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin kNoArrayType, kNoNullableType, 26157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin src_file_name, parcelable.GetLine()) {} 26257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin virtual ~NullableParcelableType() = default; 263a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin bool CanBeOutParameter() const override { return true; } 264a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin 265a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin private: 266a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin static string GetCppName(const AidlParcelable& parcelable) { 26757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return "::std::unique_ptr<::" + Join(parcelable.GetSplitPackage(), "::") + 268a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin "::" + parcelable.GetName() + ">"; 269a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin } 270a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin}; 271a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin 2729078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wileyclass ParcelableType : public Type { 2739078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley public: 2749078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley ParcelableType(const AidlParcelable& parcelable, 2759078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley const std::string& src_file_name) 2769078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley : Type(ValidatableType::KIND_PARCELABLE, 2779078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley parcelable.GetPackage(), parcelable.GetName(), 278a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin {parcelable.GetCppHeader()}, GetCppName(parcelable), 2799078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley "readParcelable", "writeParcelable", 280a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin new ParcelableArrayType(parcelable, src_file_name), 28157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin new NullableParcelableType(parcelable, src_file_name), 2829078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley src_file_name, parcelable.GetLine()) {} 2839078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley virtual ~ParcelableType() = default; 2849078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley bool CanBeOutParameter() const override { return true; } 2859078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley 2869078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley private: 2879078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley static string GetCppName(const AidlParcelable& parcelable) { 2888cfb5883b7ac0e5d0f8cd6a18640d585356973e5Casey Dahlin return "::" + Join(parcelable.GetSplitPackage(), "::") + 2899078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley "::" + parcelable.GetName(); 2909078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley } 2919078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley}; 2929078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley 29357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinclass NullableStringListType : public Type { 29457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin public: 29557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin NullableStringListType() 2965d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley : Type(ValidatableType::KIND_BUILT_IN, 2975d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley "java.util", "List<" + string(kStringCanonicalName) + ">", 2985d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley {"utils/String16.h", "memory", "vector"}, 29957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "::std::unique_ptr<::std::vector<std::unique_ptr<::android::String16>>>", 30057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "readString16Vector", "writeString16Vector") {} 30157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin virtual ~NullableStringListType() = default; 30257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin bool CanBeOutParameter() const override { return true; } 30357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 30457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin private: 30557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin DISALLOW_COPY_AND_ASSIGN(NullableStringListType); 30657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin}; // class NullableStringListType 30757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 30856c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyclass StringListType : public Type { 30956c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley public: 31056c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley StringListType() 3115d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley : Type(ValidatableType::KIND_BUILT_IN, 3125d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley "java.util", "List<" + string(kStringCanonicalName) + ">", 313a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin {"utils/String16.h", "vector"}, 314a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin "::std::vector<::android::String16>", 31557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "readString16Vector", "writeString16Vector", 31657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin kNoArrayType, new NullableStringListType()) {} 31756c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley virtual ~StringListType() = default; 31856c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley bool CanBeOutParameter() const override { return true; } 31956c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley 32056c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley private: 32156c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley DISALLOW_COPY_AND_ASSIGN(StringListType); 32256c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}; // class StringListType 32356c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley 3245d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wileyclass NullableUtf8InCppStringListType : public Type { 3255d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley public: 3265d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley NullableUtf8InCppStringListType() 3275d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley : Type(ValidatableType::KIND_BUILT_IN, 3285d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley "java.util", "List<" + string(kUtf8InCppStringCanonicalName) + ">", 3295d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley {"memory", "string", "vector"}, 3305d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley "::std::unique_ptr<::std::vector<std::unique_ptr<::std::string>>>", 3315d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley "readUtf8VectorFromUtf16Vector", "writeUtf8VectorAsUtf16Vector") {} 3325d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley virtual ~NullableUtf8InCppStringListType() = default; 3335d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley bool CanBeOutParameter() const override { return true; } 3345d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley 3355d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley private: 3365d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley DISALLOW_COPY_AND_ASSIGN(NullableUtf8InCppStringListType); 3375d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley}; // class NullableUtf8InCppStringListType 3385d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley 3395d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wileyclass Utf8InCppStringListType : public Type { 3405d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley public: 3415d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley Utf8InCppStringListType() 3425d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley : Type(ValidatableType::KIND_BUILT_IN, 3435d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley "java.util", "List<" + string(kUtf8InCppStringCanonicalName) + ">", 3445d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley {"string", "vector"}, 3455d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley "::std::vector<::std::string>", 3465d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley "readUtf8VectorFromUtf16Vector", "writeUtf8VectorAsUtf16Vector", 3475d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley kNoArrayType, new NullableUtf8InCppStringListType()) {} 3485d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley virtual ~Utf8InCppStringListType() = default; 3495d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley bool CanBeOutParameter() const override { return true; } 3505d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley 3515d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley private: 3525d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley DISALLOW_COPY_AND_ASSIGN(Utf8InCppStringListType); 3535d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley}; // class Utf8InCppStringListType 3545d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley 35557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinclass NullableBinderListType : public Type { 35657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin public: 35757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin NullableBinderListType() 35857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin : Type(ValidatableType::KIND_BUILT_IN, "java.util", 35957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "List<android.os.IBinder>", {"binder/IBinder.h", "vector"}, 36057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "::std::unique_ptr<::std::vector<::android::sp<::android::IBinder>>>", 36157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "readStrongBinderVector", "writeStrongBinderVector") {} 36257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin virtual ~NullableBinderListType() = default; 36357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin bool CanBeOutParameter() const override { return true; } 36457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 36557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin private: 36657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin DISALLOW_COPY_AND_ASSIGN(NullableBinderListType); 36757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin}; // class NullableBinderListType 36857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 3697ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinclass BinderListType : public Type { 3707ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin public: 3717ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin BinderListType() 3727ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin : Type(ValidatableType::KIND_BUILT_IN, "java.util", 373a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin "List<android.os.IBinder>", {"binder/IBinder.h", "vector"}, 374b8d9e8898c34da45027e56be88d5c9238ea88203Casey Dahlin "::std::vector<::android::sp<::android::IBinder>>", 37557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "readStrongBinderVector", "writeStrongBinderVector", 37657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin kNoArrayType, new NullableBinderListType()) {} 3777ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin virtual ~BinderListType() = default; 3787ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin bool CanBeOutParameter() const override { return true; } 3797ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin 3807ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin private: 3817ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin DISALLOW_COPY_AND_ASSIGN(BinderListType); 3827ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin}; // class BinderListType 3837ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin 384ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley} // namespace 385a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley 38609af469476ea6d187b52f22113d3b168a887100cChristopher WileyType::Type(int kind, 38709af469476ea6d187b52f22113d3b168a887100cChristopher Wiley const std::string& package, 38809af469476ea6d187b52f22113d3b168a887100cChristopher Wiley const std::string& aidl_type, 389a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin const vector<string>& headers, 390b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin const string& cpp_type, 391b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin const string& read_method, 392b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin const string& write_method, 393a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin Type* array_type, 39457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin Type* nullable_type, 39509af469476ea6d187b52f22113d3b168a887100cChristopher Wiley const string& src_file_name, 39609af469476ea6d187b52f22113d3b168a887100cChristopher Wiley int line) 39709af469476ea6d187b52f22113d3b168a887100cChristopher Wiley : ValidatableType(kind, package, aidl_type, src_file_name, line), 398a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin headers_(headers), 399ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlin aidl_type_(aidl_type), 400a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley cpp_type_(cpp_type), 401a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley parcel_read_method_(read_method), 402b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin parcel_write_method_(write_method), 40357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin array_type_(array_type), 40457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin nullable_type_(nullable_type) {} 405a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley 4062cc93169679e222dda71c73814f28a9fb0832166Casey Dahlinbool Type::CanWriteToParcel() const { return true; } 407a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley 4085679952c38925a54b75b087068887002e57f3174Christopher Wileyvoid TypeNamespace::Init() { 409671bc9c62855ab1134466cf5371e773d222706c2Casey Dahlin Add(new ByteType()); 41009af469476ea6d187b52f22113d3b168a887100cChristopher Wiley Add(new PrimitiveType( 41109af469476ea6d187b52f22113d3b168a887100cChristopher Wiley ValidatableType::KIND_BUILT_IN, kNoPackage, "int", 41209af469476ea6d187b52f22113d3b168a887100cChristopher Wiley "cstdint", "int32_t", "readInt32", "writeInt32", 413b8e49a407e8648afb28ca9bad4bf8434224f0b18Christopher Wiley "readInt32Vector", "writeInt32Vector")); 41409af469476ea6d187b52f22113d3b168a887100cChristopher Wiley Add(new PrimitiveType( 41509af469476ea6d187b52f22113d3b168a887100cChristopher Wiley ValidatableType::KIND_BUILT_IN, kNoPackage, "long", 41609af469476ea6d187b52f22113d3b168a887100cChristopher Wiley "cstdint", "int64_t", "readInt64", "writeInt64", 417b8e49a407e8648afb28ca9bad4bf8434224f0b18Christopher Wiley "readInt64Vector", "writeInt64Vector")); 41809af469476ea6d187b52f22113d3b168a887100cChristopher Wiley Add(new PrimitiveType( 41909af469476ea6d187b52f22113d3b168a887100cChristopher Wiley ValidatableType::KIND_BUILT_IN, kNoPackage, "float", 42009af469476ea6d187b52f22113d3b168a887100cChristopher Wiley kNoHeader, "float", "readFloat", "writeFloat", 421b8e49a407e8648afb28ca9bad4bf8434224f0b18Christopher Wiley "readFloatVector", "writeFloatVector")); 42209af469476ea6d187b52f22113d3b168a887100cChristopher Wiley Add(new PrimitiveType( 42309af469476ea6d187b52f22113d3b168a887100cChristopher Wiley ValidatableType::KIND_BUILT_IN, kNoPackage, "double", 42409af469476ea6d187b52f22113d3b168a887100cChristopher Wiley kNoHeader, "double", "readDouble", "writeDouble", 425b8e49a407e8648afb28ca9bad4bf8434224f0b18Christopher Wiley "readDoubleVector", "writeDoubleVector")); 42609af469476ea6d187b52f22113d3b168a887100cChristopher Wiley Add(new PrimitiveType( 42709af469476ea6d187b52f22113d3b168a887100cChristopher Wiley ValidatableType::KIND_BUILT_IN, kNoPackage, "boolean", 42809af469476ea6d187b52f22113d3b168a887100cChristopher Wiley kNoHeader, "bool", "readBool", "writeBool", 429b8e49a407e8648afb28ca9bad4bf8434224f0b18Christopher Wiley "readBoolVector", "writeBoolVector")); 430b8e49a407e8648afb28ca9bad4bf8434224f0b18Christopher Wiley // C++11 defines the char16_t type as a built in for Unicode characters. 43109af469476ea6d187b52f22113d3b168a887100cChristopher Wiley Add(new PrimitiveType( 43209af469476ea6d187b52f22113d3b168a887100cChristopher Wiley ValidatableType::KIND_BUILT_IN, kNoPackage, "char", 43309af469476ea6d187b52f22113d3b168a887100cChristopher Wiley kNoHeader, "char16_t", "readChar", "writeChar", 434b8e49a407e8648afb28ca9bad4bf8434224f0b18Christopher Wiley "readCharVector", "writeCharVector")); 435a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley 43657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin Type* nullable_string_array_type = 4379ab06237fd51e625286a62fdd4fe5f948e698131Christopher Wiley new ArrayType(ValidatableType::KIND_BUILT_IN, "java.lang", "String[]", 438e3946d45804302c6d0423356cbb4341ab911e5acChristopher Wiley {"utils/String16.h", "memory", "vector"}, 43957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "::std::unique_ptr<::std::vector<::std::unique_ptr<::android::String16>>>", 44057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "readString16Vector", "writeString16Vector"); 44157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 44257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin Type* string_array_type = new ArrayType(ValidatableType::KIND_BUILT_IN, 4439ab06237fd51e625286a62fdd4fe5f948e698131Christopher Wiley "java.lang", "String[]", 44457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin {"utils/String16.h", "vector"}, 44557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "::std::vector<::android::String16>", 44657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "readString16Vector", 44757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "writeString16Vector", kNoArrayType, 44857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin nullable_string_array_type); 44957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 45057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin Type* nullable_string_type = 4519ab06237fd51e625286a62fdd4fe5f948e698131Christopher Wiley new Type(ValidatableType::KIND_BUILT_IN, "java.lang", "String", 452e3946d45804302c6d0423356cbb4341ab911e5acChristopher Wiley {"memory", "utils/String16.h"}, "::std::unique_ptr<::android::String16>", 45357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "readString16", "writeString16"); 45457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 4559ab06237fd51e625286a62fdd4fe5f948e698131Christopher Wiley string_type_ = new Type(ValidatableType::KIND_BUILT_IN, "java.lang", "String", 456a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin {"utils/String16.h"}, "::android::String16", 45756c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley "readString16", "writeString16", 45857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin string_array_type, nullable_string_type); 45956c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley Add(string_type_); 460ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley 461b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley using ::android::aidl::kAidlReservedTypePackage; 462b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley using ::android::aidl::kUtf8InCppStringClass; 463b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley 464b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley // This type is a Utf16 string in the parcel, but deserializes to 465b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley // a std::string in Utf8 format when we use it in C++. 466b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley Type* nullable_cpp_utf8_string_array = new ArrayType( 467b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley ValidatableType::KIND_BUILT_IN, 468b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley kAidlReservedTypePackage, StringPrintf("%s[]", kUtf8InCppStringClass), 469b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley {"memory", "string", "vector"}, 470b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley "::std::unique_ptr<::std::vector<::std::unique_ptr<::std::string>>>", 471b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley "readUtf8VectorFromUtf16Vector", "writeUtf8VectorAsUtf16Vector"); 472b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley Type* cpp_utf8_string_array = new ArrayType( 473b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley ValidatableType::KIND_BUILT_IN, 474b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley kAidlReservedTypePackage, StringPrintf("%s[]", kUtf8InCppStringClass), 475b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley {"string", "vector"}, 476b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley "::std::vector<::std::string>", 477b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley "readUtf8VectorFromUtf16Vector", "writeUtf8VectorAsUtf16Vector", 478b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley kNoArrayType, nullable_cpp_utf8_string_array); 479b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley Type* nullable_cpp_utf8_string_type = new Type( 480b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley ValidatableType::KIND_BUILT_IN, 481b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley kAidlReservedTypePackage, kUtf8InCppStringClass, 482b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley {"string", "memory"}, "::std::unique_ptr<::std::string>", 483b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley "readUtf8FromUtf16", "writeUtf8AsUtf16"); 484b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley Add(new Type( 485b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley ValidatableType::KIND_BUILT_IN, 486b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley kAidlReservedTypePackage, kUtf8InCppStringClass, 487b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley {"string"}, "::std::string", "readUtf8FromUtf16", "writeUtf8AsUtf16", 488b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley cpp_utf8_string_array, nullable_cpp_utf8_string_type)); 489b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley 4907ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin ibinder_type_ = new Type(ValidatableType::KIND_BUILT_IN, "android.os", 491a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin "IBinder", {"binder/IBinder.h"}, 492b8d9e8898c34da45027e56be88d5c9238ea88203Casey Dahlin "::android::sp<::android::IBinder>", "readStrongBinder", 4937ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin "writeStrongBinder"); 4947ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin Add(ibinder_type_); 4957ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin 4967ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin Add(new BinderListType()); 4977ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin Add(new StringListType()); 4985d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley Add(new Utf8InCppStringListType()); 4997ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin 50057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin Type* fd_vector_type = new ArrayType( 501a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin ValidatableType::KIND_BUILT_IN, kNoPackage, "FileDescriptor[]", 502a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin {"nativehelper/ScopedFd.h", "vector"}, "::std::vector<::ScopedFd>", 503a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin "readUniqueFileDescriptorVector", "writeUniqueFileDescriptorVector"); 504a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin 505a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin Add(new Type( 506a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin ValidatableType::KIND_BUILT_IN, kNoPackage, "FileDescriptor", 507a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin {"nativehelper/ScopedFd.h"}, "::ScopedFd", 508a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin "readUniqueFileDescriptor", "writeUniqueFileDescriptor", 509a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin fd_vector_type)); 510a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin 511ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley void_type_ = new class VoidType(); 51209af469476ea6d187b52f22113d3b168a887100cChristopher Wiley Add(void_type_); 513a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley} 514a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley 515c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlinbool TypeNamespace::AddParcelableType(const AidlParcelable& p, 5169078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley const string& filename) { 517e9351ccad61f2f7fc4a0721480119112c97f049eChristopher Wiley if (p.GetCppHeader().empty()) { 518e9351ccad61f2f7fc4a0721480119112c97f049eChristopher Wiley LOG(ERROR) << "Parcelable " << p.GetCanonicalName() 519e9351ccad61f2f7fc4a0721480119112c97f049eChristopher Wiley << " has no C++ header defined."; 520e9351ccad61f2f7fc4a0721480119112c97f049eChristopher Wiley return false; 521e9351ccad61f2f7fc4a0721480119112c97f049eChristopher Wiley } 522c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin Add(new ParcelableType(p, filename)); 5232cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin return true; 524a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley} 525a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley 526c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlinbool TypeNamespace::AddBinderType(const AidlInterface& b, 52709af469476ea6d187b52f22113d3b168a887100cChristopher Wiley const string& file_name) { 528c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin Add(new BinderType(b, file_name)); 5292cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin return true; 530a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley} 531a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley 53256c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileybool TypeNamespace::AddListType(const std::string& type_name) { 5339ab06237fd51e625286a62fdd4fe5f948e698131Christopher Wiley const Type* contained_type = FindTypeByCanonicalName(type_name); 53456c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley if (!contained_type) { 53556c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley LOG(ERROR) << "Cannot create List<" << type_name << "> because contained " 53656c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley "type cannot be found or is invalid."; 53756c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley return false; 53856c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley } 53956c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley if (contained_type->IsCppPrimitive()) { 54056c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley LOG(ERROR) << "Cannot create List<" << type_name << "> because contained " 54156c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley "type is a primitive in Java and Java List cannot hold " 54256c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley "primitives."; 54356c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley return false; 54456c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley } 54556c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley 5465d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley if (contained_type->CanonicalName() == kStringCanonicalName || 5475d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley contained_type->CanonicalName() == kUtf8InCppStringCanonicalName || 5485d9bc936e45b5ffe487b1807b4a028dc3dc4df9fChristopher Wiley contained_type == IBinderType()) { 54956c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley return true; 55056c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley } 5517ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin 55256c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley // TODO Support lists of parcelables b/23600712 55356c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley 55456c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley LOG(ERROR) << "aidl-cpp does not yet support List<" << type_name << ">"; 555cd8e89795c331e3e5c75e92d7c7804f389804e08Christopher Wiley return false; 556cd8e89795c331e3e5c75e92d7c7804f389804e08Christopher Wiley} 557cd8e89795c331e3e5c75e92d7c7804f389804e08Christopher Wiley 558cd8e89795c331e3e5c75e92d7c7804f389804e08Christopher Wileybool TypeNamespace::AddMapType(const std::string& /* key_type_name */, 559cd8e89795c331e3e5c75e92d7c7804f389804e08Christopher Wiley const std::string& /* value_type_name */) { 560cd8e89795c331e3e5c75e92d7c7804f389804e08Christopher Wiley // TODO Support list types b/25242025 561cd8e89795c331e3e5c75e92d7c7804f389804e08Christopher Wiley LOG(ERROR) << "aidl does not implement support for typed maps!"; 562cd8e89795c331e3e5c75e92d7c7804f389804e08Christopher Wiley return false; 563a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley} 564a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley 565b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wileybool TypeNamespace::IsValidPackage(const string& package) const { 566b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley if (package.empty()) { 567b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley return false; 568b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley } 569b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley 570b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley auto pieces = Split(package, "."); 571b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley for (const string& piece : pieces) { 572b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley if (is_cpp_keyword(piece)) { 573b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley return false; 574b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley } 575b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley } 576b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley 577b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley return true; 578b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley} 579b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley 58057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinconst ValidatableType* TypeNamespace::GetArgType(const AidlArgument& a, 58157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin int arg_index, 58257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin const std::string& filename) const { 583b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley const string error_prefix = StringPrintf( 584b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley "In file %s line %d parameter %s (%d):\n ", 585b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley filename.c_str(), a.GetLine(), a.GetName().c_str(), arg_index); 586b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley 587b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley // check that the name doesn't match a keyword 588b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley if (is_cpp_keyword(a.GetName().c_str())) { 589b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley cerr << error_prefix << "Argument name is a C++ keyword" 590b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley << endl; 59157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return nullptr; 592b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley } 593b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley 59457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return ::android::aidl::TypeNamespace::GetArgType(a, arg_index, filename); 595b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley} 596b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley 597a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley} // namespace cpp 598a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley} // namespace aidl 599a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley} // namespace android 600