type_cpp.cpp revision b7e0117281fde01c6fca3a26f1daed800ff80fa8
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 137389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinclass BinderType : public Type { 138389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin public: 13909af469476ea6d187b52f22113d3b168a887100cChristopher Wiley BinderType(const AidlInterface& interface, const std::string& src_file_name) 14009af469476ea6d187b52f22113d3b168a887100cChristopher Wiley : Type(ValidatableType::KIND_GENERATED, 14109af469476ea6d187b52f22113d3b168a887100cChristopher Wiley interface.GetPackage(), interface.GetName(), 142a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin {GetCppHeader(interface)}, GetCppName(interface), 14309af469476ea6d187b52f22113d3b168a887100cChristopher Wiley "readStrongBinder", "writeStrongBinder", 14457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin kNoArrayType, kNoNullableType, src_file_name, 1452dbab064e029411e230fb86913d58a03dfd18519Casey Dahlin interface.GetLine()), 1462dbab064e029411e230fb86913d58a03dfd18519Casey Dahlin write_cast_(GetRawCppName(interface) + "::asBinder") {} 147389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin virtual ~BinderType() = default; 148389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 149389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin string WriteCast(const string& val) const override { 1502dbab064e029411e230fb86913d58a03dfd18519Casey Dahlin return write_cast_ + "(" + val + ")"; 151389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin } 152389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 153389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin private: 154389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin static string GetCppName(const AidlInterface& interface) { 1552dbab064e029411e230fb86913d58a03dfd18519Casey Dahlin return "::android::sp<" + GetRawCppName(interface) + ">"; 1562dbab064e029411e230fb86913d58a03dfd18519Casey Dahlin } 1572dbab064e029411e230fb86913d58a03dfd18519Casey Dahlin 1582dbab064e029411e230fb86913d58a03dfd18519Casey Dahlin static string GetRawCppName(const AidlInterface& interface) { 159389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin vector<string> name = interface.GetSplitPackage(); 1602dbab064e029411e230fb86913d58a03dfd18519Casey Dahlin string ret; 161389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 162389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin name.push_back(interface.GetName()); 163389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 164389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin for (const auto& term : name) { 165389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin ret += "::" + term; 166389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin } 167389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 1682dbab064e029411e230fb86913d58a03dfd18519Casey Dahlin return ret; 169389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin } 170389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 171389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin static string GetCppHeader(const AidlInterface& interface) { 172389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin vector<string> name = interface.GetSplitPackage(); 173389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin name.push_back(interface.GetName()); 174389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin return Join(name, '/') + ".h"; 175389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin } 1762dbab064e029411e230fb86913d58a03dfd18519Casey Dahlin 1772dbab064e029411e230fb86913d58a03dfd18519Casey Dahlin std::string write_cast_; 178389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}; 179389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin 18057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinclass NullableParcelableArrayType : public ArrayType { 18157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin public: 18257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin NullableParcelableArrayType(const AidlParcelable& parcelable, 18357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin const std::string& src_file_name) 18457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin : ArrayType(ValidatableType::KIND_PARCELABLE, 18557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin parcelable.GetPackage(), parcelable.GetName(), 18657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin {parcelable.GetCppHeader(), "vector"}, 18757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin GetCppName(parcelable), "readParcelableVector", 18857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "writeParcelableVector", kNoArrayType, kNoNullableType, 18957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin src_file_name, parcelable.GetLine()) {} 19057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin virtual ~NullableParcelableArrayType() = default; 19157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 19257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin private: 19357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin static string GetCppName(const AidlParcelable& parcelable) { 19457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return "::std::unique_ptr<::std::vector<std::unique_ptr<" + 19557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin Join(parcelable.GetSplitPackage(), "::") + "::" + 19657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin parcelable.GetName() + ">>>"; 19757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 19857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin}; 19957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 20057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinclass ParcelableArrayType : public ArrayType { 201a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin public: 202a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin ParcelableArrayType(const AidlParcelable& parcelable, 203a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin const std::string& src_file_name) 20457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin : ArrayType(ValidatableType::KIND_PARCELABLE, 20557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin parcelable.GetPackage(), parcelable.GetName(), 20657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin {parcelable.GetCppHeader(), "vector"}, 20757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin GetCppName(parcelable), "readParcelableVector", 20857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "writeParcelableVector", kNoArrayType, 20957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin new NullableParcelableArrayType(parcelable, src_file_name), 21057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin src_file_name, parcelable.GetLine()) {} 21157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin virtual ~ParcelableArrayType() = default; 21257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 21357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin private: 21457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin static string GetCppName(const AidlParcelable& parcelable) { 21557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return "::std::vector<" + Join(parcelable.GetSplitPackage(), "::") + 21657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "::" + parcelable.GetName() + ">"; 21757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin } 21857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin}; 21957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 22057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinclass NullableParcelableType : public Type { 22157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin public: 22257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin NullableParcelableType(const AidlParcelable& parcelable, 22357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin const std::string& src_file_name) 224a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin : Type(ValidatableType::KIND_PARCELABLE, 225a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin parcelable.GetPackage(), parcelable.GetName(), 22657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin {parcelable.GetCppHeader()}, GetCppName(parcelable), 22757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "readParcelable", "writeNullableParcelable", 22857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin kNoArrayType, kNoNullableType, 22957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin src_file_name, parcelable.GetLine()) {} 23057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin virtual ~NullableParcelableType() = default; 231a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin bool CanBeOutParameter() const override { return true; } 232a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin 233a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin private: 234a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin static string GetCppName(const AidlParcelable& parcelable) { 23557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return "::std::unique_ptr<::" + Join(parcelable.GetSplitPackage(), "::") + 236a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin "::" + parcelable.GetName() + ">"; 237a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin } 238a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin}; 239a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin 2409078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wileyclass ParcelableType : public Type { 2419078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley public: 2429078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley ParcelableType(const AidlParcelable& parcelable, 2439078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley const std::string& src_file_name) 2449078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley : Type(ValidatableType::KIND_PARCELABLE, 2459078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley parcelable.GetPackage(), parcelable.GetName(), 246a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin {parcelable.GetCppHeader()}, GetCppName(parcelable), 2479078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley "readParcelable", "writeParcelable", 248a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin new ParcelableArrayType(parcelable, src_file_name), 24957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin new NullableParcelableType(parcelable, src_file_name), 2509078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley src_file_name, parcelable.GetLine()) {} 2519078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley virtual ~ParcelableType() = default; 2529078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley bool CanBeOutParameter() const override { return true; } 2539078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley 2549078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley private: 2559078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley static string GetCppName(const AidlParcelable& parcelable) { 2568cfb5883b7ac0e5d0f8cd6a18640d585356973e5Casey Dahlin return "::" + Join(parcelable.GetSplitPackage(), "::") + 2579078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley "::" + parcelable.GetName(); 2589078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley } 2599078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley}; 2609078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley 26157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinclass NullableStringListType : public Type { 26257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin public: 26357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin NullableStringListType() 26457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin : Type(ValidatableType::KIND_BUILT_IN, "java.util", "List<String>", 26557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin {"utils/String16.h", "vector"}, 26657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "::std::unique_ptr<::std::vector<std::unique_ptr<::android::String16>>>", 26757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "readString16Vector", "writeString16Vector") {} 26857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin virtual ~NullableStringListType() = default; 26957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin bool CanBeOutParameter() const override { return true; } 27057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 27157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin private: 27257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin DISALLOW_COPY_AND_ASSIGN(NullableStringListType); 27357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin}; // class NullableStringListType 27457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 27556c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyclass StringListType : public Type { 27656c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley public: 27756c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley StringListType() 2789ab06237fd51e625286a62fdd4fe5f948e698131Christopher Wiley : Type(ValidatableType::KIND_BUILT_IN, "java.util", "List<java.lang.String>", 279a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin {"utils/String16.h", "vector"}, 280a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin "::std::vector<::android::String16>", 28157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "readString16Vector", "writeString16Vector", 28257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin kNoArrayType, new NullableStringListType()) {} 28356c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley virtual ~StringListType() = default; 28456c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley bool CanBeOutParameter() const override { return true; } 28556c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley 28656c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley private: 28756c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley DISALLOW_COPY_AND_ASSIGN(StringListType); 28856c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}; // class StringListType 28956c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley 29057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinclass NullableBinderListType : public Type { 29157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin public: 29257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin NullableBinderListType() 29357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin : Type(ValidatableType::KIND_BUILT_IN, "java.util", 29457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "List<android.os.IBinder>", {"binder/IBinder.h", "vector"}, 29557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "::std::unique_ptr<::std::vector<::android::sp<::android::IBinder>>>", 29657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "readStrongBinderVector", "writeStrongBinderVector") {} 29757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin virtual ~NullableBinderListType() = default; 29857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin bool CanBeOutParameter() const override { return true; } 29957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 30057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin private: 30157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin DISALLOW_COPY_AND_ASSIGN(NullableBinderListType); 30257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin}; // class NullableBinderListType 30357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 3047ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinclass BinderListType : public Type { 3057ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin public: 3067ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin BinderListType() 3077ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin : Type(ValidatableType::KIND_BUILT_IN, "java.util", 308a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin "List<android.os.IBinder>", {"binder/IBinder.h", "vector"}, 309b8d9e8898c34da45027e56be88d5c9238ea88203Casey Dahlin "::std::vector<::android::sp<::android::IBinder>>", 31057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "readStrongBinderVector", "writeStrongBinderVector", 31157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin kNoArrayType, new NullableBinderListType()) {} 3127ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin virtual ~BinderListType() = default; 3137ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin bool CanBeOutParameter() const override { return true; } 3147ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin 3157ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin private: 3167ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin DISALLOW_COPY_AND_ASSIGN(BinderListType); 3177ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin}; // class BinderListType 3187ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin 319ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley} // namespace 320a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley 32109af469476ea6d187b52f22113d3b168a887100cChristopher WileyType::Type(int kind, 32209af469476ea6d187b52f22113d3b168a887100cChristopher Wiley const std::string& package, 32309af469476ea6d187b52f22113d3b168a887100cChristopher Wiley const std::string& aidl_type, 324a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin const vector<string>& headers, 325b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin const string& cpp_type, 326b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin const string& read_method, 327b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin const string& write_method, 328a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin Type* array_type, 32957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin Type* nullable_type, 33009af469476ea6d187b52f22113d3b168a887100cChristopher Wiley const string& src_file_name, 33109af469476ea6d187b52f22113d3b168a887100cChristopher Wiley int line) 33209af469476ea6d187b52f22113d3b168a887100cChristopher Wiley : ValidatableType(kind, package, aidl_type, src_file_name, line), 333a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin headers_(headers), 334ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlin aidl_type_(aidl_type), 335a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley cpp_type_(cpp_type), 336a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley parcel_read_method_(read_method), 337b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin parcel_write_method_(write_method), 33857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin array_type_(array_type), 33957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin nullable_type_(nullable_type) {} 340a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley 3412cc93169679e222dda71c73814f28a9fb0832166Casey Dahlinbool Type::CanWriteToParcel() const { return true; } 342a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley 3435679952c38925a54b75b087068887002e57f3174Christopher Wileyvoid TypeNamespace::Init() { 34409af469476ea6d187b52f22113d3b168a887100cChristopher Wiley Add(new PrimitiveType( 34509af469476ea6d187b52f22113d3b168a887100cChristopher Wiley ValidatableType::KIND_BUILT_IN, kNoPackage, "byte", 34609af469476ea6d187b52f22113d3b168a887100cChristopher Wiley "cstdint", "int8_t", "readByte", "writeByte", 347b8e49a407e8648afb28ca9bad4bf8434224f0b18Christopher Wiley "readByteVector", "writeByteVector")); 34809af469476ea6d187b52f22113d3b168a887100cChristopher Wiley Add(new PrimitiveType( 34909af469476ea6d187b52f22113d3b168a887100cChristopher Wiley ValidatableType::KIND_BUILT_IN, kNoPackage, "int", 35009af469476ea6d187b52f22113d3b168a887100cChristopher Wiley "cstdint", "int32_t", "readInt32", "writeInt32", 351b8e49a407e8648afb28ca9bad4bf8434224f0b18Christopher Wiley "readInt32Vector", "writeInt32Vector")); 35209af469476ea6d187b52f22113d3b168a887100cChristopher Wiley Add(new PrimitiveType( 35309af469476ea6d187b52f22113d3b168a887100cChristopher Wiley ValidatableType::KIND_BUILT_IN, kNoPackage, "long", 35409af469476ea6d187b52f22113d3b168a887100cChristopher Wiley "cstdint", "int64_t", "readInt64", "writeInt64", 355b8e49a407e8648afb28ca9bad4bf8434224f0b18Christopher Wiley "readInt64Vector", "writeInt64Vector")); 35609af469476ea6d187b52f22113d3b168a887100cChristopher Wiley Add(new PrimitiveType( 35709af469476ea6d187b52f22113d3b168a887100cChristopher Wiley ValidatableType::KIND_BUILT_IN, kNoPackage, "float", 35809af469476ea6d187b52f22113d3b168a887100cChristopher Wiley kNoHeader, "float", "readFloat", "writeFloat", 359b8e49a407e8648afb28ca9bad4bf8434224f0b18Christopher Wiley "readFloatVector", "writeFloatVector")); 36009af469476ea6d187b52f22113d3b168a887100cChristopher Wiley Add(new PrimitiveType( 36109af469476ea6d187b52f22113d3b168a887100cChristopher Wiley ValidatableType::KIND_BUILT_IN, kNoPackage, "double", 36209af469476ea6d187b52f22113d3b168a887100cChristopher Wiley kNoHeader, "double", "readDouble", "writeDouble", 363b8e49a407e8648afb28ca9bad4bf8434224f0b18Christopher Wiley "readDoubleVector", "writeDoubleVector")); 36409af469476ea6d187b52f22113d3b168a887100cChristopher Wiley Add(new PrimitiveType( 36509af469476ea6d187b52f22113d3b168a887100cChristopher Wiley ValidatableType::KIND_BUILT_IN, kNoPackage, "boolean", 36609af469476ea6d187b52f22113d3b168a887100cChristopher Wiley kNoHeader, "bool", "readBool", "writeBool", 367b8e49a407e8648afb28ca9bad4bf8434224f0b18Christopher Wiley "readBoolVector", "writeBoolVector")); 368b8e49a407e8648afb28ca9bad4bf8434224f0b18Christopher Wiley // C++11 defines the char16_t type as a built in for Unicode characters. 36909af469476ea6d187b52f22113d3b168a887100cChristopher Wiley Add(new PrimitiveType( 37009af469476ea6d187b52f22113d3b168a887100cChristopher Wiley ValidatableType::KIND_BUILT_IN, kNoPackage, "char", 37109af469476ea6d187b52f22113d3b168a887100cChristopher Wiley kNoHeader, "char16_t", "readChar", "writeChar", 372b8e49a407e8648afb28ca9bad4bf8434224f0b18Christopher Wiley "readCharVector", "writeCharVector")); 373a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley 37457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin Type* nullable_string_array_type = 3759ab06237fd51e625286a62fdd4fe5f948e698131Christopher Wiley new ArrayType(ValidatableType::KIND_BUILT_IN, "java.lang", "String[]", 376e3946d45804302c6d0423356cbb4341ab911e5acChristopher Wiley {"utils/String16.h", "memory", "vector"}, 37757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "::std::unique_ptr<::std::vector<::std::unique_ptr<::android::String16>>>", 37857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "readString16Vector", "writeString16Vector"); 37957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 38057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin Type* string_array_type = new ArrayType(ValidatableType::KIND_BUILT_IN, 3819ab06237fd51e625286a62fdd4fe5f948e698131Christopher Wiley "java.lang", "String[]", 38257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin {"utils/String16.h", "vector"}, 38357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "::std::vector<::android::String16>", 38457dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "readString16Vector", 38557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "writeString16Vector", kNoArrayType, 38657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin nullable_string_array_type); 38757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 38857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin Type* nullable_string_type = 3899ab06237fd51e625286a62fdd4fe5f948e698131Christopher Wiley new Type(ValidatableType::KIND_BUILT_IN, "java.lang", "String", 390e3946d45804302c6d0423356cbb4341ab911e5acChristopher Wiley {"memory", "utils/String16.h"}, "::std::unique_ptr<::android::String16>", 39157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin "readString16", "writeString16"); 39257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin 3939ab06237fd51e625286a62fdd4fe5f948e698131Christopher Wiley string_type_ = new Type(ValidatableType::KIND_BUILT_IN, "java.lang", "String", 394a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin {"utils/String16.h"}, "::android::String16", 39556c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley "readString16", "writeString16", 39657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin string_array_type, nullable_string_type); 39756c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley Add(string_type_); 398ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley 399b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley using ::android::aidl::kAidlReservedTypePackage; 400b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley using ::android::aidl::kUtf8InCppStringClass; 401b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley 402b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley // This type is a Utf16 string in the parcel, but deserializes to 403b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley // a std::string in Utf8 format when we use it in C++. 404b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley Type* nullable_cpp_utf8_string_array = new ArrayType( 405b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley ValidatableType::KIND_BUILT_IN, 406b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley kAidlReservedTypePackage, StringPrintf("%s[]", kUtf8InCppStringClass), 407b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley {"memory", "string", "vector"}, 408b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley "::std::unique_ptr<::std::vector<::std::unique_ptr<::std::string>>>", 409b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley "readUtf8VectorFromUtf16Vector", "writeUtf8VectorAsUtf16Vector"); 410b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley Type* cpp_utf8_string_array = new ArrayType( 411b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley ValidatableType::KIND_BUILT_IN, 412b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley kAidlReservedTypePackage, StringPrintf("%s[]", kUtf8InCppStringClass), 413b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley {"string", "vector"}, 414b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley "::std::vector<::std::string>", 415b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley "readUtf8VectorFromUtf16Vector", "writeUtf8VectorAsUtf16Vector", 416b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley kNoArrayType, nullable_cpp_utf8_string_array); 417b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley Type* nullable_cpp_utf8_string_type = new Type( 418b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley ValidatableType::KIND_BUILT_IN, 419b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley kAidlReservedTypePackage, kUtf8InCppStringClass, 420b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley {"string", "memory"}, "::std::unique_ptr<::std::string>", 421b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley "readUtf8FromUtf16", "writeUtf8AsUtf16"); 422b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley Add(new Type( 423b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley ValidatableType::KIND_BUILT_IN, 424b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley kAidlReservedTypePackage, kUtf8InCppStringClass, 425b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley {"string"}, "::std::string", "readUtf8FromUtf16", "writeUtf8AsUtf16", 426b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley cpp_utf8_string_array, nullable_cpp_utf8_string_type)); 427b7e0117281fde01c6fca3a26f1daed800ff80fa8Christopher Wiley 4287ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin ibinder_type_ = new Type(ValidatableType::KIND_BUILT_IN, "android.os", 429a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin "IBinder", {"binder/IBinder.h"}, 430b8d9e8898c34da45027e56be88d5c9238ea88203Casey Dahlin "::android::sp<::android::IBinder>", "readStrongBinder", 4317ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin "writeStrongBinder"); 4327ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin Add(ibinder_type_); 4337ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin 4347ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin Add(new BinderListType()); 4357ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin Add(new StringListType()); 4367ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin 43757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin Type* fd_vector_type = new ArrayType( 438a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin ValidatableType::KIND_BUILT_IN, kNoPackage, "FileDescriptor[]", 439a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin {"nativehelper/ScopedFd.h", "vector"}, "::std::vector<::ScopedFd>", 440a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin "readUniqueFileDescriptorVector", "writeUniqueFileDescriptorVector"); 441a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin 442a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin Add(new Type( 443a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin ValidatableType::KIND_BUILT_IN, kNoPackage, "FileDescriptor", 444a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin {"nativehelper/ScopedFd.h"}, "::ScopedFd", 445a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin "readUniqueFileDescriptor", "writeUniqueFileDescriptor", 446a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin fd_vector_type)); 447a4ba4b6868977b26b471860c038c7bbda4470946Casey Dahlin 448ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley void_type_ = new class VoidType(); 44909af469476ea6d187b52f22113d3b168a887100cChristopher Wiley Add(void_type_); 450a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley} 451a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley 452c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlinbool TypeNamespace::AddParcelableType(const AidlParcelable& p, 4539078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley const string& filename) { 454e9351ccad61f2f7fc4a0721480119112c97f049eChristopher Wiley if (p.GetCppHeader().empty()) { 455e9351ccad61f2f7fc4a0721480119112c97f049eChristopher Wiley LOG(ERROR) << "Parcelable " << p.GetCanonicalName() 456e9351ccad61f2f7fc4a0721480119112c97f049eChristopher Wiley << " has no C++ header defined."; 457e9351ccad61f2f7fc4a0721480119112c97f049eChristopher Wiley return false; 458e9351ccad61f2f7fc4a0721480119112c97f049eChristopher Wiley } 459c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin Add(new ParcelableType(p, filename)); 4602cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin return true; 461a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley} 462a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley 463c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlinbool TypeNamespace::AddBinderType(const AidlInterface& b, 46409af469476ea6d187b52f22113d3b168a887100cChristopher Wiley const string& file_name) { 465c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin Add(new BinderType(b, file_name)); 4662cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin return true; 467a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley} 468a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley 46956c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileybool TypeNamespace::AddListType(const std::string& type_name) { 4709ab06237fd51e625286a62fdd4fe5f948e698131Christopher Wiley const Type* contained_type = FindTypeByCanonicalName(type_name); 47156c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley if (!contained_type) { 47256c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley LOG(ERROR) << "Cannot create List<" << type_name << "> because contained " 47356c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley "type cannot be found or is invalid."; 47456c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley return false; 47556c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley } 47656c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley if (contained_type->IsCppPrimitive()) { 47756c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley LOG(ERROR) << "Cannot create List<" << type_name << "> because contained " 47856c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley "type is a primitive in Java and Java List cannot hold " 47956c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley "primitives."; 48056c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley return false; 48156c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley } 48256c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley 4837ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin if (contained_type == StringType() || contained_type == IBinderType()) { 48456c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley return true; 48556c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley } 4867ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin 48756c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley // TODO Support lists of parcelables b/23600712 48856c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley 48956c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley LOG(ERROR) << "aidl-cpp does not yet support List<" << type_name << ">"; 490cd8e89795c331e3e5c75e92d7c7804f389804e08Christopher Wiley return false; 491cd8e89795c331e3e5c75e92d7c7804f389804e08Christopher Wiley} 492cd8e89795c331e3e5c75e92d7c7804f389804e08Christopher Wiley 493cd8e89795c331e3e5c75e92d7c7804f389804e08Christopher Wileybool TypeNamespace::AddMapType(const std::string& /* key_type_name */, 494cd8e89795c331e3e5c75e92d7c7804f389804e08Christopher Wiley const std::string& /* value_type_name */) { 495cd8e89795c331e3e5c75e92d7c7804f389804e08Christopher Wiley // TODO Support list types b/25242025 496cd8e89795c331e3e5c75e92d7c7804f389804e08Christopher Wiley LOG(ERROR) << "aidl does not implement support for typed maps!"; 497cd8e89795c331e3e5c75e92d7c7804f389804e08Christopher Wiley return false; 498a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley} 499a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley 500b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wileybool TypeNamespace::IsValidPackage(const string& package) const { 501b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley if (package.empty()) { 502b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley return false; 503b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley } 504b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley 505b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley auto pieces = Split(package, "."); 506b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley for (const string& piece : pieces) { 507b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley if (is_cpp_keyword(piece)) { 508b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley return false; 509b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley } 510b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley } 511b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley 512b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley return true; 513b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley} 514b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley 51557dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlinconst ValidatableType* TypeNamespace::GetArgType(const AidlArgument& a, 51657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin int arg_index, 51757dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin const std::string& filename) const { 518b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley const string error_prefix = StringPrintf( 519b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley "In file %s line %d parameter %s (%d):\n ", 520b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley filename.c_str(), a.GetLine(), a.GetName().c_str(), arg_index); 521b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley 522b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley // check that the name doesn't match a keyword 523b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley if (is_cpp_keyword(a.GetName().c_str())) { 524b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley cerr << error_prefix << "Argument name is a C++ keyword" 525b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley << endl; 52657dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return nullptr; 527b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley } 528b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley 52957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin return ::android::aidl::TypeNamespace::GetArgType(a, arg_index, filename); 530b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley} 531b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley 532a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley} // namespace cpp 533a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley} // namespace aidl 534a8a2dc0ad258c1390c5d55b302774df357450cafChristopher Wiley} // namespace android 535