Type.cpp revision 9df5244c1dd4508cc2e25f8a04d363903912d19c
11aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber/*
21aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * Copyright (C) 2016 The Android Open Source Project
31aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber *
41aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
51aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * you may not use this file except in compliance with the License.
61aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * You may obtain a copy of the License at
71aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber *
81aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
91aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber *
101aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * Unless required by applicable law or agreed to in writing, software
111aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
121aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * See the License for the specific language governing permissions and
141aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * limitations under the License.
151aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber */
161aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber
17c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#include "Type.h"
18c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
197c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber#include "Annotation.h"
208d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber#include "ScalarType.h"
21881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
22a72e0d2be173cebf62f728b9d215808bd862f219Iliyan Malchev#include <hidl-util/Formatter.h>
23881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber#include <android-base/logging.h>
24881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
25c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Hubernamespace android {
26c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
277c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas HuberType::Type()
287c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber    : mAnnotations(nullptr) {
297c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber}
307c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber
31c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas HuberType::~Type() {}
32c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
337c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Hubervoid Type::setAnnotations(std::vector<Annotation *> *annotations) {
347c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber    mAnnotations = annotations;
357c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber}
367c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber
377c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huberconst std::vector<Annotation *> &Type::annotations() const {
387c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber    return *mAnnotations;
397c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber}
407c5ddfb41a806a7bf71581952d06b637a7670cf7Andreas Huber
415345ec2b1b7e4126b77aa2131b231a9eb5ee811dAndreas Huberbool Type::isScope() const {
425345ec2b1b7e4126b77aa2131b231a9eb5ee811dAndreas Huber    return false;
435345ec2b1b7e4126b77aa2131b231a9eb5ee811dAndreas Huber}
445345ec2b1b7e4126b77aa2131b231a9eb5ee811dAndreas Huber
45a2723d26427f7db19777dfed330047253e7a4e1bAndreas Huberbool Type::isInterface() const {
46a2723d26427f7db19777dfed330047253e7a4e1bAndreas Huber    return false;
47a2723d26427f7db19777dfed330047253e7a4e1bAndreas Huber}
48a2723d26427f7db19777dfed330047253e7a4e1bAndreas Huber
49abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hongbool Type::isScalar() const {
50abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong    return false;
51abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong}
52abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong
53abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hongbool Type::isString() const {
54abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong    return false;
55abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong}
56abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong
578d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huberbool Type::isEnum() const {
588d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    return false;
598d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber}
608d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
61abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hongbool Type::isBitField() const {
62abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong    return false;
63abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong}
64abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong
65abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hongbool Type::isHandle() const {
66abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong    return false;
67abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong}
68abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong
698d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huberbool Type::isTypeDef() const {
708d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    return false;
718d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber}
728d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
73295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huberbool Type::isBinder() const {
74295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huber    return false;
75295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huber}
76295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huber
7739fa71827738f6c1340e4523946fe9bf704eef3aAndreas Huberbool Type::isNamedType() const {
7839fa71827738f6c1340e4523946fe9bf704eef3aAndreas Huber    return false;
7939fa71827738f6c1340e4523946fe9bf704eef3aAndreas Huber}
8039fa71827738f6c1340e4523946fe9bf704eef3aAndreas Huber
81f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huberbool Type::isCompoundType() const {
82f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huber    return false;
83f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huber}
84f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huber
85709b62dbda6184770bb34470ff550e02c1643e67Andreas Huberbool Type::isArray() const {
86709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    return false;
87709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber}
88709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber
89709b62dbda6184770bb34470ff550e02c1643e67Andreas Huberbool Type::isVector() const {
9099e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen    return false;
9199e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen}
9299e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen
93abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hongbool Type::isTemplatedType() const {
94abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong    return false;
95abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong}
96abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong
9799e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenenbool Type::isPointer() const {
98709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber    return false;
99709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber}
100709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber
10130bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Morelandstd::string Type::typeName() const {
10230bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland    return "";
10330bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland}
10430bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland
105737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huberconst ScalarType *Type::resolveToScalarType() const {
106737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber    return NULL;
107737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber}
108737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
1098d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huberbool Type::isValidEnumStorageType() const {
1108d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    const ScalarType *scalarType = resolveToScalarType();
1118d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
1128d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    if (scalarType == NULL) {
1138d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber        return false;
1148d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    }
1158d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
1168d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    return scalarType->isValidEnumStorageType();
1178d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber}
1188d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
1199df5244c1dd4508cc2e25f8a04d363903912d19cSteven Morelandbool Type::isElidableType() const {
1209df5244c1dd4508cc2e25f8a04d363903912d19cSteven Moreland    return false;
1219df5244c1dd4508cc2e25f8a04d363903912d19cSteven Moreland}
1229df5244c1dd4508cc2e25f8a04d363903912d19cSteven Moreland
1233b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hongstd::string Type::getCppType(StorageMode, bool) const {
124881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    CHECK(!"Should not be here");
125881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return std::string();
126881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
127881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
1283b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hongstd::string Type::decorateCppName(
1293b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong        const std::string &name, StorageMode mode, bool specifyNamespaces) const {
1303b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong    return getCppType(mode, specifyNamespaces) + " " + name;
1313b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong}
1323b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong
1334ed1347cd29e6e07acad368891bb03078c798abaYifan Hongstd::string Type::getJavaType(bool /* forInitializer */) const {
1344c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber    CHECK(!"Should not be here");
1354c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber    return std::string();
1364c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber}
1374c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber
13885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huberstd::string Type::getJavaWrapperType() const {
1394ed1347cd29e6e07acad368891bb03078c798abaYifan Hong    return getJavaType();
14085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber}
14185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
1422831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huberstd::string Type::getJavaSuffix() const {
1432831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    CHECK(!"Should not be here");
1442831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    return std::string();
1452831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
1462831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
147c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhangstd::string Type::getVtsType() const {
148c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang    CHECK(!"Should not be here");
149c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang    return std::string();
150c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang}
151c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang
152881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::emitReaderWriter(
153881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        Formatter &,
154881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &,
155881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &,
156881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool,
157881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool,
158881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode) const {
159881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    CHECK(!"Should not be here");
160881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
161881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
162bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongvoid Type::emitResolveReferences(
163bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        Formatter &,
164bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        const std::string &,
165bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        bool,
166bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        const std::string &,
167bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        bool,
168bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        bool,
169bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        ErrorMode) const {
170bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    CHECK(!"Should not be here");
171bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
172bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
173bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongvoid Type::emitResolveReferencesEmbedded(
174bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        Formatter &,
175bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        size_t,
176bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        const std::string &,
177bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        const std::string &,
178bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        bool,
179bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        const std::string &,
180bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        bool,
181bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        bool,
182bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        ErrorMode,
183bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        const std::string &,
184bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong        const std::string &) const {
185bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    CHECK(!"Should not be here");
186bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
187bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
18800f471711684903fd747e7871edf437ca54ed397Yifan Hongbool Type::useParentInEmitResolveReferencesEmbedded() const {
189244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    return needsResolveReferences();
190244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong}
191244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong
192244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hongbool Type::useNameInEmitReaderWriterEmbedded(bool) const {
193244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    return needsEmbeddedReadWrite();
19400f471711684903fd747e7871edf437ca54ed397Yifan Hong}
19500f471711684903fd747e7871edf437ca54ed397Yifan Hong
196881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::emitReaderWriterEmbedded(
197881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        Formatter &,
198f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber        size_t,
199881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &,
200be2a3737675b83dd61b52c11f0d7549fa1276739Yifan Hong        const std::string &,
201881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool,
202881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &,
203881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool,
204881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool,
205881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode,
206881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &,
207881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &) const {
208881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    CHECK(!"Should not be here");
209881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
210881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
2112831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Hubervoid Type::emitJavaReaderWriter(
2122831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        Formatter &out,
2132831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &parcelObj,
2142831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &argName,
2152831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        bool isReader) const {
2162831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    emitJavaReaderWriterWithSuffix(
2172831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            out,
2182831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            parcelObj,
2192831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            argName,
2202831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            isReader,
2212831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            getJavaSuffix(),
2222831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            "" /* extra */);
2232831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
2242831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
22585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid Type::emitJavaFieldInitializer(
22685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        Formatter &out,
22785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &fieldName) const {
2284ed1347cd29e6e07acad368891bb03078c798abaYifan Hong    out << getJavaType()
22985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        << " "
23085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        << fieldName
23185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        << ";\n";
23285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber}
23385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
23485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid Type::emitJavaFieldReaderWriter(
23585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        Formatter &,
2364c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber        size_t,
23785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &,
23885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &,
23985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &,
240709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber        const std::string &,
24185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        bool) const {
24285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    CHECK(!"Should not be here");
24385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber}
24485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
245881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::handleError(Formatter &out, ErrorMode mode) const {
246881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    switch (mode) {
247881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Ignore:
248881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
249549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "/* _hidl_err ignored! */\n\n";
250881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
251881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
252881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
253881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Goto:
254881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
255549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "if (_hidl_err != ::android::OK) { goto _hidl_error; }\n\n";
256881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
257881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
258881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
259881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Break:
260881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
261549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "if (_hidl_err != ::android::OK) { break; }\n\n";
262881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
263881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
264737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
265737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        case ErrorMode_Return:
266737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        {
267549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "if (_hidl_err != ::android::OK) { return _hidl_err; }\n\n";
268737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber            break;
269737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        }
270881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
271881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
272881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
273881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::handleError2(Formatter &out, ErrorMode mode) const {
274881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    switch (mode) {
275881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Goto:
276881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
277549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "goto _hidl_error;\n";
278881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
279881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
280737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
281881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Break:
282881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
283881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            out << "break;\n";
284881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
285881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
286737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
287881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Ignore:
288881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
289549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "/* ignoring _hidl_error! */";
290881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
291881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
292737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
293737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        case ErrorMode_Return:
294737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        {
295549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "return _hidl_err;\n";
296737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber            break;
297737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        }
298881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
299881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
300881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
301881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::emitReaderWriterEmbeddedForTypeName(
302881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        Formatter &out,
303881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &name,
304881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool nameIsPointer,
305881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &parcelObj,
306881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool parcelObjIsPointer,
307881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool isReader,
308881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode mode,
309881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &parentName,
310881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &offsetText,
311881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &typeName,
312244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong        const std::string &childName,
313244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong        const std::string &funcNamespace) const {
314244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong
315244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong        const std::string parcelObjDeref =
316881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        parcelObjIsPointer ? ("*" + parcelObj) : parcelObj;
317881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
318881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    const std::string parcelObjPointer =
319881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        parcelObjIsPointer ? parcelObj : ("&" + parcelObj);
320881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
321244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    const std::string nameDerefed = nameIsPointer ? ("*" + name) : name;
322881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    const std::string namePointer = nameIsPointer ? name : ("&" + name);
323881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
324549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev    out << "_hidl_err = ";
325881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
326244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    if (!funcNamespace.empty()) {
327244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong        out << funcNamespace << "::";
328244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    }
329244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong
330244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    out << (isReader ? "readEmbeddedFromParcel(\n" : "writeEmbeddedToParcel(\n");
331244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong
332244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    out.indent();
333244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    out.indent();
334244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong
335881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    if (isReader) {
336881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        out << "const_cast<"
337881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << typeName
338881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << " *>("
339881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << namePointer
340244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong            << "),\n";
341881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    } else {
342244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong        out << nameDerefed
343244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong            << ",\n";
344881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
345881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
346881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out << (isReader ? parcelObjDeref : parcelObjPointer)
347881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        << ",\n"
348881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        << parentName
349881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        << ",\n"
350881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        << offsetText;
351881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
352881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    if (!childName.empty()) {
353881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        out << ", &"
354881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << childName;
355881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
356881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
357881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out << ");\n\n";
358881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
359881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out.unindent();
360881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out.unindent();
361881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
362881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    handleError(out, mode);
363881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
364881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
365881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberstatus_t Type::emitTypeDeclarations(Formatter &) const {
366881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return OK;
367881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
368881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
369e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huberstatus_t Type::emitGlobalTypeDeclarations(Formatter &) const {
370e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber    return OK;
371e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber}
372e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber
373244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hongstatus_t Type::emitGlobalHwDeclarations(Formatter &) const {
374244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong    return OK;
375244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong}
376244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong
377881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberstatus_t Type::emitTypeDefinitions(
378881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        Formatter &, const std::string) const {
379881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return OK;
380881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
381881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
38285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huberstatus_t Type::emitJavaTypeDeclarations(Formatter &, bool) const {
3832831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    return OK;
3842831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
3852831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
386881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberbool Type::needsEmbeddedReadWrite() const {
387881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return false;
388881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
389881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
390bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongbool Type::needsResolveReferences() const {
391bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    return false;
392bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
393bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
394881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberbool Type::resultNeedsDeref() const {
395881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return false;
396881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
397881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
3983b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hongstd::string Type::getCppStackType(bool specifyNamespaces) const {
3993b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong    return getCppType(StorageMode_Stack, specifyNamespaces);
400881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
401881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
4023b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hongstd::string Type::getCppResultType(bool specifyNamespaces) const {
4033b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong    return getCppType(StorageMode_Result, specifyNamespaces);
404881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
405881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
4063b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hongstd::string Type::getCppArgumentType(bool specifyNamespaces) const {
4073b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong    return getCppType(StorageMode_Argument, specifyNamespaces);
408881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
409881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
4102831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Hubervoid Type::emitJavaReaderWriterWithSuffix(
4112831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        Formatter &out,
4122831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &parcelObj,
4132831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &argName,
4142831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        bool isReader,
4152831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &suffix,
4162831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &extra) const {
4172831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    out << parcelObj
4182831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        << "."
4192831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        << (isReader ? "read" : "write")
4202831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        << suffix
4212831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        << "(";
4222831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
4232831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    if (isReader) {
4242831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        out << extra;
4252831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    } else {
4262831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        out << (extra.empty() ? "" : (extra + ", "));
4272831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        out << argName;
4282831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    }
4292831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
4302831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    out << ");\n";
4312831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
4322831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
4335158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhangstatus_t Type::emitVtsTypeDeclarations(Formatter &) const {
4345158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    return OK;
4355158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang}
4365158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
437864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhangstatus_t Type::emitVtsAttributeType(Formatter &out) const {
4385158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    return emitVtsTypeDeclarations(out);
4395158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang}
4405158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
44170a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huberbool Type::isJavaCompatible() const {
44270a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber    return true;
44370a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber}
44470a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber
44585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid Type::getAlignmentAndSize(size_t *, size_t *) const {
44685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    CHECK(!"Should not be here");
44785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber}
44885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
449019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Hubervoid Type::appendToExportedTypesVector(
450019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber        std::vector<const Type *> * /* exportedTypes */) const {
451019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber}
452019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber
4531c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huberstatus_t Type::emitExportedHeader(
4541c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber        Formatter & /* out */, bool /* forJava */) const {
455019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber    return OK;
456019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber}
457019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber
458bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong////////////////////////////////////////
459bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
460bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTemplatedType::TemplatedType() : mElementType(nullptr) {
461bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
46230bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland
463bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongvoid TemplatedType::setElementType(Type *elementType) {
464bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    CHECK(mElementType == nullptr); // can only be set once.
46530bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland    CHECK(isCompatibleElementType(elementType));
466bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong    mElementType = elementType;
467bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong}
468bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong
469abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan HongType *TemplatedType::getElementType() const {
470abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong    return mElementType;
471abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong}
472abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong
473abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hongbool TemplatedType::isTemplatedType() const {
474abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong    return true;
475abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong}
476abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong
477c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}  // namespace android
478c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
479