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