StringType.cpp revision 85eabdbe56720dcdcf130e5ca83129d47b143768
1#include "StringType.h" 2 3#include "Formatter.h" 4 5namespace android { 6 7StringType::StringType() {} 8 9std::string StringType::getCppType(StorageMode mode, std::string *extra) const { 10 extra->clear(); 11 12 const std::string base = "::android::hardware::hidl_string"; 13 14 switch (mode) { 15 case StorageMode_Stack: 16 return base; 17 18 case StorageMode_Argument: 19 return "const " + base + "&"; 20 21 case StorageMode_Result: 22 return "const " + base + "*"; 23 } 24} 25 26std::string StringType::getJavaType() const { 27 return "String"; 28} 29 30std::string StringType::getJavaSuffix() const { 31 return "String"; 32} 33 34void StringType::emitReaderWriter( 35 Formatter &out, 36 const std::string &name, 37 const std::string &parcelObj, 38 bool parcelObjIsPointer, 39 bool isReader, 40 ErrorMode mode) const { 41 const std::string parentName = "_hidl_" + name + "_parent"; 42 out << "size_t " << parentName << ";\n\n"; 43 44 const std::string parcelObjDeref = 45 parcelObj + (parcelObjIsPointer ? "->" : "."); 46 47 if (isReader) { 48 out << name 49 << " = (const ::android::hardware::hidl_string *)" 50 << parcelObjDeref 51 << "readBuffer(" 52 << "&" 53 << parentName 54 << ");\n"; 55 56 out << "if (" 57 << name 58 << " == nullptr) {\n"; 59 60 out.indent(); 61 62 out << "_hidl_err = ::android::UNKNOWN_ERROR;\n"; 63 handleError2(out, mode); 64 65 out.unindent(); 66 out << "}\n\n"; 67 } else { 68 out << "_hidl_err = " 69 << parcelObjDeref 70 << "writeBuffer(&" 71 << name 72 << ", sizeof(" 73 << name 74 << "), &" 75 << parentName 76 << ");\n"; 77 78 handleError(out, mode); 79 } 80 81 emitReaderWriterEmbedded( 82 out, 83 name, 84 isReader /* nameIsPointer */, 85 parcelObj, 86 parcelObjIsPointer, 87 isReader, 88 mode, 89 parentName, 90 "0 /* parentOffset */"); 91} 92 93void StringType::emitReaderWriterEmbedded( 94 Formatter &out, 95 const std::string &name, 96 bool nameIsPointer, 97 const std::string &parcelObj, 98 bool parcelObjIsPointer, 99 bool isReader, 100 ErrorMode mode, 101 const std::string &parentName, 102 const std::string &offsetText) const { 103 emitReaderWriterEmbeddedForTypeName( 104 out, 105 name, 106 nameIsPointer, 107 parcelObj, 108 parcelObjIsPointer, 109 isReader, 110 mode, 111 parentName, 112 offsetText, 113 "::android::hardware::hidl_string", 114 "" /* childName */); 115} 116 117void StringType::emitJavaFieldInitializer( 118 Formatter &out, const std::string &fieldName) const { 119 out << "String " 120 << fieldName 121 << " = new String();\n"; 122} 123 124void StringType::emitJavaFieldReaderWriter( 125 Formatter &out, 126 const std::string &blobName, 127 const std::string &fieldName, 128 const std::string &offset, 129 bool isReader) const { 130 if (isReader) { 131 out << "\nparcel.readEmbeddedBuffer(\n"; 132 133 out.indent(); 134 out.indent(); 135 136 out << blobName 137 << ".handle(),\n" 138 << offset 139 << " + 0 /* offsetof(hidl_string, mBuffer) */);\n\n"; 140 141 out.unindent(); 142 out.unindent(); 143 144 out << fieldName 145 << " = " 146 << blobName 147 << ".getString(" 148 << offset 149 << ");\n"; 150 151 return; 152 } 153 154 out << blobName 155 << ".putString(" 156 << offset 157 << ", " 158 << fieldName 159 << ");\n"; 160} 161 162bool StringType::needsEmbeddedReadWrite() const { 163 return true; 164} 165 166bool StringType::resultNeedsDeref() const { 167 return true; 168} 169 170status_t StringType::emitVtsTypeDeclarations(Formatter &out) const { 171 out << "type: TYPE_STRING\n"; 172 return OK; 173} 174 175void StringType::getAlignmentAndSize(size_t *align, size_t *size) const { 176 *align = 8; // hidl_string 177 *size = 24; 178} 179 180} // namespace android 181 182