StringType.cpp revision 85eabdbe56720dcdcf130e5ca83129d47b143768
1c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#include "StringType.h" 2c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 3c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#include "Formatter.h" 4c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 5c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Hubernamespace android { 6c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 7c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas HuberStringType::StringType() {} 8c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 9881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberstd::string StringType::getCppType(StorageMode mode, std::string *extra) const { 10881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber extra->clear(); 11881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 128a82ff7ce6b5c0288b5239e25e1cbd1f5d8e3d27Andreas Huber const std::string base = "::android::hardware::hidl_string"; 13881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 14881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber switch (mode) { 15881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber case StorageMode_Stack: 16881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber return base; 17881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 18881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber case StorageMode_Argument: 19881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber return "const " + base + "&"; 20881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 21881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber case StorageMode_Result: 22881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber return "const " + base + "*"; 23881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber } 24881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 25881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 262831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huberstd::string StringType::getJavaType() const { 272831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber return "String"; 282831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber} 292831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 302831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huberstd::string StringType::getJavaSuffix() const { 312831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber return "String"; 322831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber} 332831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber 34881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid StringType::emitReaderWriter( 35881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &out, 36881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &name, 37881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parcelObj, 38881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool parcelObjIsPointer, 39881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool isReader, 40881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode mode) const { 41549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev const std::string parentName = "_hidl_" + name + "_parent"; 42881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out << "size_t " << parentName << ";\n\n"; 43881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 44881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string parcelObjDeref = 45881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber parcelObj + (parcelObjIsPointer ? "->" : "."); 46881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 47881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber if (isReader) { 48881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out << name 498a82ff7ce6b5c0288b5239e25e1cbd1f5d8e3d27Andreas Huber << " = (const ::android::hardware::hidl_string *)" 50881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << parcelObjDeref 51881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << "readBuffer(" 52881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << "&" 53881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << parentName 54881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << ");\n"; 55881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 56881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out << "if (" 57881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << name 58881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << " == nullptr) {\n"; 59881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 60881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out.indent(); 61881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 62549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev out << "_hidl_err = ::android::UNKNOWN_ERROR;\n"; 63881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber handleError2(out, mode); 64881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 65881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out.unindent(); 66881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out << "}\n\n"; 67881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber } else { 68549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev out << "_hidl_err = " 69881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << parcelObjDeref 70881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << "writeBuffer(&" 71881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << name 72881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << ", sizeof(" 73881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << name 74881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << "), &" 75881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << parentName 76881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber << ");\n"; 77881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 78881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber handleError(out, mode); 79881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber } 80881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 81881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber emitReaderWriterEmbedded( 82881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out, 83881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber name, 84881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber isReader /* nameIsPointer */, 85881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber parcelObj, 86881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber parcelObjIsPointer, 87881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber isReader, 88881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber mode, 89881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber parentName, 90881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber "0 /* parentOffset */"); 91881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 92881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 93881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid StringType::emitReaderWriterEmbedded( 94881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber Formatter &out, 95881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &name, 96881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool nameIsPointer, 97881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parcelObj, 98881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool parcelObjIsPointer, 99881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber bool isReader, 100881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber ErrorMode mode, 101881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &parentName, 102881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber const std::string &offsetText) const { 103881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber emitReaderWriterEmbeddedForTypeName( 104881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber out, 105881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber name, 106881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber nameIsPointer, 107881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber parcelObj, 108881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber parcelObjIsPointer, 109881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber isReader, 110881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber mode, 111881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber parentName, 112881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber offsetText, 1138a82ff7ce6b5c0288b5239e25e1cbd1f5d8e3d27Andreas Huber "::android::hardware::hidl_string", 114881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber "" /* childName */); 115881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 116881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 11785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid StringType::emitJavaFieldInitializer( 11885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber Formatter &out, const std::string &fieldName) const { 11985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber out << "String " 12085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << fieldName 12185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << " = new String();\n"; 12285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber} 12385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 12485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid StringType::emitJavaFieldReaderWriter( 12585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber Formatter &out, 12685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &blobName, 12785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &fieldName, 12885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber const std::string &offset, 12985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber bool isReader) const { 13085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber if (isReader) { 13185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber out << "\nparcel.readEmbeddedBuffer(\n"; 13285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 13385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber out.indent(); 13485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber out.indent(); 13585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 13685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber out << blobName 13785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << ".handle(),\n" 13885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << offset 13985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << " + 0 /* offsetof(hidl_string, mBuffer) */);\n\n"; 14085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 14185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber out.unindent(); 14285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber out.unindent(); 14385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 14485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber out << fieldName 14585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << " = " 14685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << blobName 14785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << ".getString(" 14885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << offset 14985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << ");\n"; 15085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 15185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber return; 15285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber } 15385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 15485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber out << blobName 15585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << ".putString(" 15685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << offset 15785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << ", " 15885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << fieldName 15985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber << ");\n"; 16085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber} 16185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 162881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberbool StringType::needsEmbeddedReadWrite() const { 163881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber return true; 164881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 165881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 166881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberbool StringType::resultNeedsDeref() const { 167881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber return true; 168881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber} 169881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber 1705158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhangstatus_t StringType::emitVtsTypeDeclarations(Formatter &out) const { 1715158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang out << "type: TYPE_STRING\n"; 1725158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang return OK; 1735158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang} 1745158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang 17585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid StringType::getAlignmentAndSize(size_t *align, size_t *size) const { 17685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber *align = 8; // hidl_string 17785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber *size = 24; 17885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber} 17985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber 180c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber} // namespace android 181c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber 182