StringType.cpp revision 4ed1347cd29e6e07acad368891bb03078c798aba
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 "StringType.h" 18c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 19a72e0d2be173cebf62f728b9d215808bd862f219Iliyan Malchev#include <hidl-util/Formatter.h> 20c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 21c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Hubernamespace android { 22c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 23c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas HuberStringType::StringType() {} 24c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 25979e099f1163ff75beed5776cd01fb409b90a0cdSteven Morelandvoid StringType::addNamedTypesToSet(std::set<const FQName> &) const { 26979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland // do nothing 27979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland} 28979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland 29979e099f1163ff75beed5776cd01fb409b90a0cdSteven Morelandstd::string StringType::getCppType(StorageMode mode, 30979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland bool specifyNamespaces) const { 31979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland const std::string base = 32979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland std::string(specifyNamespaces ? "::android::hardware::" : "") 33979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland + "hidl_string"; 34881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 35881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber switch (mode) { 36881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber case StorageMode_Stack: 37881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber return base; 38881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 39881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber case StorageMode_Argument: 40881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber return "const " + base + "&"; 41881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 42881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber case StorageMode_Result: 43881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber return "const " + base + "*"; 44881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber } 45881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 46881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 474ed1347cd29e6e07acad368891bb03078c798abaYifan Hongstd::string StringType::getJavaType(bool /* forInitializer */) const { 482831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber return "String"; 492831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber} 502831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 512831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huberstd::string StringType::getJavaSuffix() const { 522831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber return "String"; 532831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber} 542831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 55c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhangstd::string StringType::getVtsType() const { 56c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang return "TYPE_STRING"; 57c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang} 58c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang 59881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid StringType::emitReaderWriter( 60881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &out, 61881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &name, 62881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parcelObj, 63881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool parcelObjIsPointer, 64881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool isReader, 65881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode mode) const { 66549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev const std::string parentName = "_hidl_" + name + "_parent"; 67881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out << "size_t " << parentName << ";\n\n"; 68881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 69881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string parcelObjDeref = 70881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber parcelObj + (parcelObjIsPointer ? "->" : "."); 71881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 72881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber if (isReader) { 73881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out << name 748a82ff7ce6b5c0288b5239e25e1cbd1f5d8e3d27Andreas Huber << " = (const ::android::hardware::hidl_string *)" 75881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << parcelObjDeref 76881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << "readBuffer(" 77881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << "&" 78881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << parentName 79881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << ");\n"; 80881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 81881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out << "if (" 82881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << name 83881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << " == nullptr) {\n"; 84881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 85881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out.indent(); 86881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 87549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev out << "_hidl_err = ::android::UNKNOWN_ERROR;\n"; 88881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber handleError2(out, mode); 89881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 90881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out.unindent(); 91881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out << "}\n\n"; 92881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber } else { 93549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev out << "_hidl_err = " 94881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << parcelObjDeref 95881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << "writeBuffer(&" 96881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << name 97881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << ", sizeof(" 98881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << name 99881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << "), &" 100881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << parentName 101881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << ");\n"; 102881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 103881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber handleError(out, mode); 104881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber } 105881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 106881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber emitReaderWriterEmbedded( 107881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out, 108f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber 0 /* depth */, 109881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber name, 110be2a3737675b83dd61b52c11f0d7549fa1276739Yifan Hong name /* sanitizedName */, 111881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber isReader /* nameIsPointer */, 112881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber parcelObj, 113881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber parcelObjIsPointer, 114881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber isReader, 115881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber mode, 116881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber parentName, 117881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber "0 /* parentOffset */"); 118881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 119881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 120881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid StringType::emitReaderWriterEmbedded( 121881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &out, 122f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber size_t /* depth */, 123881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &name, 124be2a3737675b83dd61b52c11f0d7549fa1276739Yifan Hong const std::string & /*sanitizedName*/, 125881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool nameIsPointer, 126881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parcelObj, 127881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool parcelObjIsPointer, 128881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool isReader, 129881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode mode, 130881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parentName, 131881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &offsetText) const { 132881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber emitReaderWriterEmbeddedForTypeName( 133881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out, 134881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber name, 135881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber nameIsPointer, 136881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber parcelObj, 137881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber parcelObjIsPointer, 138881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber isReader, 139881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber mode, 140881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber parentName, 141881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber offsetText, 1428a82ff7ce6b5c0288b5239e25e1cbd1f5d8e3d27Andreas Huber "::android::hardware::hidl_string", 143881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber "" /* childName */); 144881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 145881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 14685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid StringType::emitJavaFieldInitializer( 14785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber Formatter &out, const std::string &fieldName) const { 14885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber out << "String " 14985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << fieldName 15085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << " = new String();\n"; 15185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber} 15285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 15385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid StringType::emitJavaFieldReaderWriter( 15485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber Formatter &out, 1554c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber size_t /* depth */, 156709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber const std::string &parcelName, 15785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &blobName, 15885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &fieldName, 15985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &offset, 16085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber bool isReader) const { 16185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber if (isReader) { 162709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber out << "\n" 163709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber << parcelName 164709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber << ".readEmbeddedBuffer(\n"; 16585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 16685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber out.indent(); 16785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber out.indent(); 16885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 16985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber out << blobName 17085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << ".handle(),\n" 17185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << offset 17285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << " + 0 /* offsetof(hidl_string, mBuffer) */);\n\n"; 17385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 17485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber out.unindent(); 17585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber out.unindent(); 17685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 17785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber out << fieldName 17885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << " = " 17985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << blobName 18085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << ".getString(" 18185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << offset 18285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << ");\n"; 18385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 18485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber return; 18585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber } 18685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 18785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber out << blobName 18885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << ".putString(" 18985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << offset 19085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << ", " 19185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << fieldName 19285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << ");\n"; 19385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber} 19485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 195881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberbool StringType::needsEmbeddedReadWrite() const { 196881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber return true; 197881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 198881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 199881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberbool StringType::resultNeedsDeref() const { 200881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber return true; 201881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 202881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 2035158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhangstatus_t StringType::emitVtsTypeDeclarations(Formatter &out) const { 2045158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang out << "type: TYPE_STRING\n"; 2055158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang return OK; 2065158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang} 2075158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang 20885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid StringType::getAlignmentAndSize(size_t *align, size_t *size) const { 20985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber *align = 8; // hidl_string 21085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber *size = 24; 21185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber} 21285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 213c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber} // namespace android 214c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 215