Type.cpp revision f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8
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
198d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber#include "ScalarType.h"
20881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
21a72e0d2be173cebf62f728b9d215808bd862f219Iliyan Malchev#include <hidl-util/Formatter.h>
22881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber#include <android-base/logging.h>
23881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
24c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Hubernamespace android {
25c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
26c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas HuberType::Type() {}
27c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas HuberType::~Type() {}
28c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
295345ec2b1b7e4126b77aa2131b231a9eb5ee811dAndreas Huberbool Type::isScope() const {
305345ec2b1b7e4126b77aa2131b231a9eb5ee811dAndreas Huber    return false;
315345ec2b1b7e4126b77aa2131b231a9eb5ee811dAndreas Huber}
325345ec2b1b7e4126b77aa2131b231a9eb5ee811dAndreas Huber
33a2723d26427f7db19777dfed330047253e7a4e1bAndreas Huberbool Type::isInterface() const {
34a2723d26427f7db19777dfed330047253e7a4e1bAndreas Huber    return false;
35a2723d26427f7db19777dfed330047253e7a4e1bAndreas Huber}
36a2723d26427f7db19777dfed330047253e7a4e1bAndreas Huber
378d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huberbool Type::isEnum() const {
388d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    return false;
398d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber}
408d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
418d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huberbool Type::isTypeDef() const {
428d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    return false;
438d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber}
448d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
45295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huberbool Type::isBinder() const {
46295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huber    return false;
47295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huber}
48295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huber
4939fa71827738f6c1340e4523946fe9bf704eef3aAndreas Huberbool Type::isNamedType() const {
5039fa71827738f6c1340e4523946fe9bf704eef3aAndreas Huber    return false;
5139fa71827738f6c1340e4523946fe9bf704eef3aAndreas Huber}
5239fa71827738f6c1340e4523946fe9bf704eef3aAndreas Huber
53f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huberbool Type::isCompoundType() const {
54f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huber    return false;
55f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huber}
56f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huber
57737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huberconst ScalarType *Type::resolveToScalarType() const {
58737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber    return NULL;
59737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber}
60737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
618d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huberbool Type::isValidEnumStorageType() const {
628d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    const ScalarType *scalarType = resolveToScalarType();
638d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
648d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    if (scalarType == NULL) {
658d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber        return false;
668d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    }
678d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
688d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber    return scalarType->isValidEnumStorageType();
698d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber}
708d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber
71979e099f1163ff75beed5776cd01fb409b90a0cdSteven Morelandstd::string Type::getCppType(StorageMode, std::string *, bool) const {
72881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    CHECK(!"Should not be here");
73881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return std::string();
74881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
75881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
7685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huberstd::string Type::getJavaWrapperType() const {
7785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    return getJavaType();
7885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber}
7985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
802831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huberstd::string Type::getJavaSuffix() const {
812831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    CHECK(!"Should not be here");
822831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    return std::string();
832831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
842831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
85881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::emitReaderWriter(
86881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        Formatter &,
87881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &,
88881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &,
89881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool,
90881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool,
91881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode) const {
92881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    CHECK(!"Should not be here");
93881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
94881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
95881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::emitReaderWriterEmbedded(
96881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        Formatter &,
97f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber        size_t,
98881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &,
99881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool,
100881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &,
101881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool,
102881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool,
103881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode,
104881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &,
105881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &) const {
106881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    CHECK(!"Should not be here");
107881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
108881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
1092831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Hubervoid Type::emitJavaReaderWriter(
1102831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        Formatter &out,
1112831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &parcelObj,
1122831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &argName,
1132831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        bool isReader) const {
1142831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    emitJavaReaderWriterWithSuffix(
1152831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            out,
1162831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            parcelObj,
1172831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            argName,
1182831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            isReader,
1192831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            getJavaSuffix(),
1202831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            "" /* extra */);
1212831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
1222831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
12385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid Type::emitJavaFieldInitializer(
12485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        Formatter &out,
12585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &fieldName) const {
12685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    out << getJavaType()
12785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        << " "
12885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        << fieldName
12985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        << ";\n";
13085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber}
13185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
13285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid Type::emitJavaFieldReaderWriter(
13385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        Formatter &,
13485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &,
13585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &,
13685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &,
13785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        bool) const {
13885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    CHECK(!"Should not be here");
13985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber}
14085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
141881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::handleError(Formatter &out, ErrorMode mode) const {
142881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    switch (mode) {
143881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Ignore:
144881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
145549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "/* _hidl_err ignored! */\n\n";
146881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
147881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
148881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
149881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Goto:
150881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
151549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "if (_hidl_err != ::android::OK) { goto _hidl_error; }\n\n";
152881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
153881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
154881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
155881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Break:
156881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
157549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "if (_hidl_err != ::android::OK) { break; }\n\n";
158881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
159881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
160737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
161737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        case ErrorMode_Return:
162737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        {
163549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "if (_hidl_err != ::android::OK) { return _hidl_err; }\n\n";
164737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber            break;
165737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        }
166881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
167881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
168881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
169881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::handleError2(Formatter &out, ErrorMode mode) const {
170881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    switch (mode) {
171881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Goto:
172881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
173549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "goto _hidl_error;\n";
174881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
175881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
176737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
177881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Break:
178881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
179881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            out << "break;\n";
180881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
181881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
182737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
183881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case ErrorMode_Ignore:
184881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        {
185549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "/* ignoring _hidl_error! */";
186881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            break;
187881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        }
188737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber
189737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        case ErrorMode_Return:
190737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        {
191549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev            out << "return _hidl_err;\n";
192737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber            break;
193737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber        }
194881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
195881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
196881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
197881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::emitReaderWriterEmbeddedForTypeName(
198881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        Formatter &out,
199881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &name,
200881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool nameIsPointer,
201881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &parcelObj,
202881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool parcelObjIsPointer,
203881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool isReader,
204881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode mode,
205881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &parentName,
206881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &offsetText,
207881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &typeName,
208881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &childName) const {
209881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    const std::string parcelObjDeref =
210881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        parcelObjIsPointer ? ("*" + parcelObj) : parcelObj;
211881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
212881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    const std::string parcelObjPointer =
213881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        parcelObjIsPointer ? parcelObj : ("&" + parcelObj);
214881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
215881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    const std::string nameDeref = name + (nameIsPointer ? "->" : ".");
216881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    const std::string namePointer = nameIsPointer ? name : ("&" + name);
217881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
218549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev    out << "_hidl_err = ";
219881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
220881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    if (isReader) {
221881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        out << "const_cast<"
222881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << typeName
223881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << " *>("
224881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << namePointer
225881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << ")->readEmbeddedFromParcel(\n";
226881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    } else {
227881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        out << nameDeref
228881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << "writeEmbeddedToParcel(\n";
229881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
230881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
231881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out.indent();
232881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out.indent();
233881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
234881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out << (isReader ? parcelObjDeref : parcelObjPointer)
235881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        << ",\n"
236881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        << parentName
237881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        << ",\n"
238881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        << offsetText;
239881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
240881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    if (!childName.empty()) {
241881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        out << ", &"
242881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << childName;
243881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
244881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
245881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out << ");\n\n";
246881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
247881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out.unindent();
248881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out.unindent();
249881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
250881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    handleError(out, mode);
251881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
252881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
253881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberstatus_t Type::emitTypeDeclarations(Formatter &) const {
254881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return OK;
255881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
256881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
257881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberstatus_t Type::emitTypeDefinitions(
258881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        Formatter &, const std::string) const {
259881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return OK;
260881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
261881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
26285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huberstatus_t Type::emitJavaTypeDeclarations(Formatter &, bool) const {
2632831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    return OK;
2642831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
2652831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
266881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberbool Type::needsEmbeddedReadWrite() const {
267881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return false;
268881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
269881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
270881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberbool Type::resultNeedsDeref() const {
271881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return false;
272881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
273881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
274979e099f1163ff75beed5776cd01fb409b90a0cdSteven Morelandstd::string Type::getCppType(std::string *extra,
275979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland                             bool specifyNamespaces) const {
276979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland    return getCppType(StorageMode_Stack, extra, specifyNamespaces);
277881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
278881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
279979e099f1163ff75beed5776cd01fb409b90a0cdSteven Morelandstd::string Type::getCppResultType(std::string *extra,
280979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland                                   bool specifyNamespaces) const {
281979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland    return getCppType(StorageMode_Result, extra, specifyNamespaces);
282881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
283881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
284979e099f1163ff75beed5776cd01fb409b90a0cdSteven Morelandstd::string Type::getCppArgumentType(std::string *extra,
285979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland                                     bool specifyNamespaces) const {
286979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland    return getCppType(StorageMode_Argument, extra, specifyNamespaces);
287881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
288881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
2892831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Hubervoid Type::emitJavaReaderWriterWithSuffix(
2902831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        Formatter &out,
2912831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &parcelObj,
2922831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &argName,
2932831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        bool isReader,
2942831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &suffix,
2952831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &extra) const {
2962831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    out << parcelObj
2972831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        << "."
2982831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        << (isReader ? "read" : "write")
2992831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        << suffix
3002831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        << "(";
3012831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
3022831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    if (isReader) {
3032831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        out << extra;
3042831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    } else {
3052831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        out << (extra.empty() ? "" : (extra + ", "));
3062831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        out << argName;
3072831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    }
3082831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
3092831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    out << ");\n";
3102831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
3112831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
3125158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhangstatus_t Type::emitVtsTypeDeclarations(Formatter &) const {
3135158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    return OK;
3145158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang}
3155158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
316864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhangstatus_t Type::emitVtsAttributeType(Formatter &out) const {
3175158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    return emitVtsTypeDeclarations(out);
3185158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang}
3195158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
32070a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huberbool Type::isJavaCompatible() const {
32170a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber    return true;
32270a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber}
32370a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber
32485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid Type::getAlignmentAndSize(size_t *, size_t *) const {
32585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    CHECK(!"Should not be here");
32685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber}
32785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
328c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}  // namespace android
329c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
330