Type.cpp revision 30bb6a869be0f3f82497b7b11c71ec9d47652ed0
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 498d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huberbool Type::isEnum() const { 508d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber return false; 518d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber} 528d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 538d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huberbool Type::isTypeDef() const { 548d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber return false; 558d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber} 568d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 57295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huberbool Type::isBinder() const { 58295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huber return false; 59295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huber} 60295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huber 6139fa71827738f6c1340e4523946fe9bf704eef3aAndreas Huberbool Type::isNamedType() const { 6239fa71827738f6c1340e4523946fe9bf704eef3aAndreas Huber return false; 6339fa71827738f6c1340e4523946fe9bf704eef3aAndreas Huber} 6439fa71827738f6c1340e4523946fe9bf704eef3aAndreas Huber 65f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huberbool Type::isCompoundType() const { 66f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huber return false; 67f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huber} 68f630bc8736003dcf4aac3dfe47167beb6beb6c6aAndreas Huber 69709b62dbda6184770bb34470ff550e02c1643e67Andreas Huberbool Type::isArray() const { 70709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber return false; 71709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber} 72709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber 73709b62dbda6184770bb34470ff550e02c1643e67Andreas Huberbool Type::isVector() const { 7499e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen return false; 7599e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen} 7699e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenen 7799e6bebc96d75d1c9b9b8130cd9b880dacb95b01Martijn Coenenbool Type::isPointer() const { 78709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber return false; 79709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber} 80709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber 8130bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Morelandstd::string Type::typeName() const { 8230bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland return ""; 8330bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland} 8430bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland 85737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huberconst ScalarType *Type::resolveToScalarType() const { 86737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber return NULL; 87737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber} 88737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber 898d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huberbool Type::isValidEnumStorageType() const { 908d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber const ScalarType *scalarType = resolveToScalarType(); 918d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 928d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber if (scalarType == NULL) { 938d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber return false; 948d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber } 958d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 968d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber return scalarType->isValidEnumStorageType(); 978d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber} 988d3ac0c6112e02e3a705fd4f9d82e523f10b4287Andreas Huber 993b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hongstd::string Type::getCppType(StorageMode, bool) const { 100881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber CHECK(!"Should not be here"); 101881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber return std::string(); 102881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 103881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 1043b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hongstd::string Type::decorateCppName( 1053b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong const std::string &name, StorageMode mode, bool specifyNamespaces) const { 1063b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong return getCppType(mode, specifyNamespaces) + " " + name; 1073b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong} 1083b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong 1094ed1347cd29e6e07acad368891bb03078c798abaYifan Hongstd::string Type::getJavaType(bool /* forInitializer */) const { 1104c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber CHECK(!"Should not be here"); 1114c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber return std::string(); 1124c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber} 1134c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber 11485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huberstd::string Type::getJavaWrapperType() const { 1154ed1347cd29e6e07acad368891bb03078c798abaYifan Hong return getJavaType(); 11685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber} 11785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 1182831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huberstd::string Type::getJavaSuffix() const { 1192831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber CHECK(!"Should not be here"); 1202831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber return std::string(); 1212831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber} 1222831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 123c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhangstd::string Type::getVtsType() const { 124c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang CHECK(!"Should not be here"); 125c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang return std::string(); 126c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang} 127c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang 128881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::emitReaderWriter( 129881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &, 130881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &, 131881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &, 132881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool, 133881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool, 134881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode) const { 135881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber CHECK(!"Should not be here"); 136881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 137881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 138bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongvoid Type::emitResolveReferences( 139bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong Formatter &, 140bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &, 141bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool, 142bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &, 143bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool, 144bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool, 145bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong ErrorMode) const { 146bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong CHECK(!"Should not be here"); 147bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong} 148bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong 149bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongvoid Type::emitResolveReferencesEmbedded( 150bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong Formatter &, 151bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong size_t, 152bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &, 153bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &, 154bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool, 155bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &, 156bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool, 157bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong bool, 158bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong ErrorMode, 159bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &, 160bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong const std::string &) const { 161bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong CHECK(!"Should not be here"); 162bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong} 163bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong 16400f471711684903fd747e7871edf437ca54ed397Yifan Hongbool Type::useParentInEmitResolveReferencesEmbedded() const { 165244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong return needsResolveReferences(); 166244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong} 167244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong 168244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hongbool Type::useNameInEmitReaderWriterEmbedded(bool) const { 169244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong return needsEmbeddedReadWrite(); 17000f471711684903fd747e7871edf437ca54ed397Yifan Hong} 17100f471711684903fd747e7871edf437ca54ed397Yifan Hong 172881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::emitReaderWriterEmbedded( 173881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &, 174f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber size_t, 175881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &, 176be2a3737675b83dd61b52c11f0d7549fa1276739Yifan Hong const std::string &, 177881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool, 178881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &, 179881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool, 180881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool, 181881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode, 182881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &, 183881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &) const { 184881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber CHECK(!"Should not be here"); 185881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 186881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 1872831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Hubervoid Type::emitJavaReaderWriter( 1882831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber Formatter &out, 1892831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const std::string &parcelObj, 1902831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const std::string &argName, 1912831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber bool isReader) const { 1922831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber emitJavaReaderWriterWithSuffix( 1932831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber out, 1942831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber parcelObj, 1952831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber argName, 1962831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber isReader, 1972831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber getJavaSuffix(), 1982831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber "" /* extra */); 1992831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber} 2002831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 20185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid Type::emitJavaFieldInitializer( 20285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber Formatter &out, 20385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &fieldName) const { 2044ed1347cd29e6e07acad368891bb03078c798abaYifan Hong out << getJavaType() 20585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << " " 20685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << fieldName 20785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << ";\n"; 20885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber} 20985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 21085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid Type::emitJavaFieldReaderWriter( 21185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber Formatter &, 2124c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber size_t, 21385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &, 21485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &, 21585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &, 216709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber const std::string &, 21785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber bool) const { 21885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber CHECK(!"Should not be here"); 21985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber} 22085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 221881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::handleError(Formatter &out, ErrorMode mode) const { 222881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber switch (mode) { 223881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber case ErrorMode_Ignore: 224881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber { 225549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev out << "/* _hidl_err ignored! */\n\n"; 226881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber break; 227881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber } 228881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 229881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber case ErrorMode_Goto: 230881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber { 231549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev out << "if (_hidl_err != ::android::OK) { goto _hidl_error; }\n\n"; 232881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber break; 233881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber } 234881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 235881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber case ErrorMode_Break: 236881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber { 237549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev out << "if (_hidl_err != ::android::OK) { break; }\n\n"; 238881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber break; 239881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber } 240737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber 241737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber case ErrorMode_Return: 242737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber { 243549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev out << "if (_hidl_err != ::android::OK) { return _hidl_err; }\n\n"; 244737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber break; 245737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber } 246881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber } 247881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 248881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 249881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::handleError2(Formatter &out, ErrorMode mode) const { 250881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber switch (mode) { 251881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber case ErrorMode_Goto: 252881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber { 253549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev out << "goto _hidl_error;\n"; 254881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber break; 255881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber } 256737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber 257881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber case ErrorMode_Break: 258881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber { 259881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out << "break;\n"; 260881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber break; 261881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber } 262737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber 263881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber case ErrorMode_Ignore: 264881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber { 265549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev out << "/* ignoring _hidl_error! */"; 266881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber break; 267881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber } 268737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber 269737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber case ErrorMode_Return: 270737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber { 271549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev out << "return _hidl_err;\n"; 272737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber break; 273737080baf85882c45bb322ee2191ae5fd9e1283aAndreas Huber } 274881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber } 275881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 276881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 277881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Type::emitReaderWriterEmbeddedForTypeName( 278881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &out, 279881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &name, 280881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool nameIsPointer, 281881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parcelObj, 282881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool parcelObjIsPointer, 283881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool isReader, 284881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode mode, 285881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parentName, 286881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &offsetText, 287881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &typeName, 288244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong const std::string &childName, 289244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong const std::string &funcNamespace) const { 290244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong 291244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong const std::string parcelObjDeref = 292881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber parcelObjIsPointer ? ("*" + parcelObj) : parcelObj; 293881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 294881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string parcelObjPointer = 295881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber parcelObjIsPointer ? parcelObj : ("&" + parcelObj); 296881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 297244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong const std::string nameDerefed = nameIsPointer ? ("*" + name) : name; 298881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string namePointer = nameIsPointer ? name : ("&" + name); 299881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 300549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev out << "_hidl_err = "; 301881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 302244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong if (!funcNamespace.empty()) { 303244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong out << funcNamespace << "::"; 304244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong } 305244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong 306244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong out << (isReader ? "readEmbeddedFromParcel(\n" : "writeEmbeddedToParcel(\n"); 307244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong 308244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong out.indent(); 309244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong out.indent(); 310244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong 311881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber if (isReader) { 312881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out << "const_cast<" 313881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << typeName 314881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << " *>(" 315881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << namePointer 316244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong << "),\n"; 317881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber } else { 318244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong out << nameDerefed 319244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong << ",\n"; 320881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber } 321881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 322881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out << (isReader ? parcelObjDeref : parcelObjPointer) 323881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << ",\n" 324881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << parentName 325881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << ",\n" 326881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << offsetText; 327881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 328881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber if (!childName.empty()) { 329881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out << ", &" 330881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << childName; 331881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber } 332881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 333881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out << ");\n\n"; 334881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 335881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out.unindent(); 336881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out.unindent(); 337881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 338881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber handleError(out, mode); 339881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 340881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 341881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberstatus_t Type::emitTypeDeclarations(Formatter &) const { 342881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber return OK; 343881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 344881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 345e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huberstatus_t Type::emitGlobalTypeDeclarations(Formatter &) const { 346e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber return OK; 347e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber} 348e3f769aa75dd6be6bb1ba83904def47d9e464769Andreas Huber 349244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hongstatus_t Type::emitGlobalHwDeclarations(Formatter &) const { 350244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong return OK; 351244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong} 352244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong 353881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberstatus_t Type::emitTypeDefinitions( 354881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &, const std::string) const { 355881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber return OK; 356881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 357881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 35885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huberstatus_t Type::emitJavaTypeDeclarations(Formatter &, bool) const { 3592831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber return OK; 3602831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber} 3612831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 362881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberbool Type::needsEmbeddedReadWrite() const { 363881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber return false; 364881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 365881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 366bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongbool Type::needsResolveReferences() const { 367bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong return false; 368bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong} 369bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong 370881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberbool Type::resultNeedsDeref() const { 371881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber return false; 372881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 373881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 3743b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hongstd::string Type::getCppStackType(bool specifyNamespaces) const { 3753b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong return getCppType(StorageMode_Stack, specifyNamespaces); 376881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 377881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 3783b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hongstd::string Type::getCppResultType(bool specifyNamespaces) const { 3793b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong return getCppType(StorageMode_Result, specifyNamespaces); 380881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 381881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 3823b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hongstd::string Type::getCppArgumentType(bool specifyNamespaces) const { 3833b320f8a60e4343bf06319bca3fc949c95eaf326Yifan Hong return getCppType(StorageMode_Argument, specifyNamespaces); 384881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 385881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 3862831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Hubervoid Type::emitJavaReaderWriterWithSuffix( 3872831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber Formatter &out, 3882831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const std::string &parcelObj, 3892831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const std::string &argName, 3902831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber bool isReader, 3912831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const std::string &suffix, 3922831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber const std::string &extra) const { 3932831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber out << parcelObj 3942831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber << "." 3952831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber << (isReader ? "read" : "write") 3962831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber << suffix 3972831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber << "("; 3982831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 3992831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber if (isReader) { 4002831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber out << extra; 4012831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber } else { 4022831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber out << (extra.empty() ? "" : (extra + ", ")); 4032831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber out << argName; 4042831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber } 4052831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 4062831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber out << ");\n"; 4072831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber} 4082831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 4095158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhangstatus_t Type::emitVtsTypeDeclarations(Formatter &) const { 4105158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang return OK; 4115158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang} 4125158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang 413864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhangstatus_t Type::emitVtsAttributeType(Formatter &out) const { 4145158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang return emitVtsTypeDeclarations(out); 4155158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang} 4165158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang 41770a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huberbool Type::isJavaCompatible() const { 41870a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber return true; 41970a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber} 42070a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber 42185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid Type::getAlignmentAndSize(size_t *, size_t *) const { 42285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber CHECK(!"Should not be here"); 42385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber} 42485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 425019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Hubervoid Type::appendToExportedTypesVector( 426019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber std::vector<const Type *> * /* exportedTypes */) const { 427019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber} 428019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 4291c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huberstatus_t Type::emitExportedHeader( 4301c507273be6a1beefbe7ef6ec63992a7cf66c4f8Andreas Huber Formatter & /* out */, bool /* forJava */) const { 431019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber return OK; 432019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber} 433019d21db821ee4ae6dd3858174a0a5cee4d33c25Andreas Huber 434bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong//////////////////////////////////////// 435bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong 436bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan HongTemplatedType::TemplatedType() : mElementType(nullptr) { 437bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong} 43830bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland 439bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hongvoid TemplatedType::setElementType(Type *elementType) { 440bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong CHECK(mElementType == nullptr); // can only be set once. 44130bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland CHECK(isCompatibleElementType(elementType)); 442bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong mElementType = elementType; 443bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong} 444bf459bcedc2ab1a22a9cc290fbcc0a5462e63690Yifan Hong 445c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber} // namespace android 446c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 447