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