blob: 59439c380b786717569fd24c04e02893757177d0 [file] [log] [blame]
Andreas Huberc9410c72016-07-28 12:18:40 -07001#include "Type.h"
2
Andreas Huber881227d2016-08-02 14:20:21 -07003#include "Formatter.h"
Andreas Huber8d3ac0c2016-08-04 14:49:23 -07004#include "ScalarType.h"
Andreas Huber881227d2016-08-02 14:20:21 -07005
6#include <android-base/logging.h>
7
Andreas Huberc9410c72016-07-28 12:18:40 -07008namespace android {
9
10Type::Type() {}
11Type::~Type() {}
12
Andreas Huber5345ec22016-07-29 13:33:27 -070013bool Type::isScope() const {
14 return false;
15}
16
Andreas Hubera2723d22016-07-29 15:36:07 -070017bool Type::isInterface() const {
18 return false;
19}
20
Andreas Huber8d3ac0c2016-08-04 14:49:23 -070021bool Type::isEnum() const {
22 return false;
23}
24
25bool Type::isTypeDef() const {
26 return false;
27}
28
Andreas Huber737080b2016-08-02 15:38:04 -070029const ScalarType *Type::resolveToScalarType() const {
30 return NULL;
31}
32
Andreas Huber8d3ac0c2016-08-04 14:49:23 -070033bool Type::isValidEnumStorageType() const {
34 const ScalarType *scalarType = resolveToScalarType();
35
36 if (scalarType == NULL) {
37 return false;
38 }
39
40 return scalarType->isValidEnumStorageType();
41}
42
Andreas Huber881227d2016-08-02 14:20:21 -070043std::string Type::getCppType(StorageMode, std::string *) const {
44 CHECK(!"Should not be here");
45 return std::string();
46}
47
Andreas Huber2831d512016-08-15 09:33:47 -070048std::string Type::getJavaSuffix() const {
49 CHECK(!"Should not be here");
50 return std::string();
51}
52
Andreas Huber881227d2016-08-02 14:20:21 -070053void Type::emitReaderWriter(
54 Formatter &,
55 const std::string &,
56 const std::string &,
57 bool,
58 bool,
59 ErrorMode) const {
60 CHECK(!"Should not be here");
61}
62
63void Type::emitReaderWriterEmbedded(
64 Formatter &,
65 const std::string &,
66 bool,
67 const std::string &,
68 bool,
69 bool,
70 ErrorMode,
71 const std::string &,
72 const std::string &) const {
73 CHECK(!"Should not be here");
74}
75
Andreas Huber2831d512016-08-15 09:33:47 -070076void Type::emitJavaReaderWriter(
77 Formatter &out,
78 const std::string &parcelObj,
79 const std::string &argName,
80 bool isReader) const {
81 emitJavaReaderWriterWithSuffix(
82 out,
83 parcelObj,
84 argName,
85 isReader,
86 getJavaSuffix(),
87 "" /* extra */);
88}
89
Andreas Huber881227d2016-08-02 14:20:21 -070090void Type::handleError(Formatter &out, ErrorMode mode) const {
91 switch (mode) {
92 case ErrorMode_Ignore:
93 {
Iliyan Malchev549e2592016-08-10 08:59:12 -070094 out << "/* _hidl_err ignored! */\n\n";
Andreas Huber881227d2016-08-02 14:20:21 -070095 break;
96 }
97
98 case ErrorMode_Goto:
99 {
Iliyan Malchev549e2592016-08-10 08:59:12 -0700100 out << "if (_hidl_err != ::android::OK) { goto _hidl_error; }\n\n";
Andreas Huber881227d2016-08-02 14:20:21 -0700101 break;
102 }
103
104 case ErrorMode_Break:
105 {
Iliyan Malchev549e2592016-08-10 08:59:12 -0700106 out << "if (_hidl_err != ::android::OK) { break; }\n\n";
Andreas Huber881227d2016-08-02 14:20:21 -0700107 break;
108 }
Andreas Huber737080b2016-08-02 15:38:04 -0700109
110 case ErrorMode_Return:
111 {
Iliyan Malchev549e2592016-08-10 08:59:12 -0700112 out << "if (_hidl_err != ::android::OK) { return _hidl_err; }\n\n";
Andreas Huber737080b2016-08-02 15:38:04 -0700113 break;
114 }
Andreas Huber881227d2016-08-02 14:20:21 -0700115 }
116}
117
118void Type::handleError2(Formatter &out, ErrorMode mode) const {
119 switch (mode) {
120 case ErrorMode_Goto:
121 {
Iliyan Malchev549e2592016-08-10 08:59:12 -0700122 out << "goto _hidl_error;\n";
Andreas Huber881227d2016-08-02 14:20:21 -0700123 break;
124 }
Andreas Huber737080b2016-08-02 15:38:04 -0700125
Andreas Huber881227d2016-08-02 14:20:21 -0700126 case ErrorMode_Break:
127 {
128 out << "break;\n";
129 break;
130 }
Andreas Huber737080b2016-08-02 15:38:04 -0700131
Andreas Huber881227d2016-08-02 14:20:21 -0700132 case ErrorMode_Ignore:
133 {
Iliyan Malchev549e2592016-08-10 08:59:12 -0700134 out << "/* ignoring _hidl_error! */";
Andreas Huber881227d2016-08-02 14:20:21 -0700135 break;
136 }
Andreas Huber737080b2016-08-02 15:38:04 -0700137
138 case ErrorMode_Return:
139 {
Iliyan Malchev549e2592016-08-10 08:59:12 -0700140 out << "return _hidl_err;\n";
Andreas Huber737080b2016-08-02 15:38:04 -0700141 break;
142 }
Andreas Huber881227d2016-08-02 14:20:21 -0700143 }
144}
145
146void Type::emitReaderWriterEmbeddedForTypeName(
147 Formatter &out,
148 const std::string &name,
149 bool nameIsPointer,
150 const std::string &parcelObj,
151 bool parcelObjIsPointer,
152 bool isReader,
153 ErrorMode mode,
154 const std::string &parentName,
155 const std::string &offsetText,
156 const std::string &typeName,
157 const std::string &childName) const {
158 const std::string parcelObjDeref =
159 parcelObjIsPointer ? ("*" + parcelObj) : parcelObj;
160
161 const std::string parcelObjPointer =
162 parcelObjIsPointer ? parcelObj : ("&" + parcelObj);
163
164 const std::string nameDeref = name + (nameIsPointer ? "->" : ".");
165 const std::string namePointer = nameIsPointer ? name : ("&" + name);
166
Iliyan Malchev549e2592016-08-10 08:59:12 -0700167 out << "_hidl_err = ";
Andreas Huber881227d2016-08-02 14:20:21 -0700168
169 if (isReader) {
170 out << "const_cast<"
171 << typeName
172 << " *>("
173 << namePointer
174 << ")->readEmbeddedFromParcel(\n";
175 } else {
176 out << nameDeref
177 << "writeEmbeddedToParcel(\n";
178 }
179
180 out.indent();
181 out.indent();
182
183 out << (isReader ? parcelObjDeref : parcelObjPointer)
184 << ",\n"
185 << parentName
186 << ",\n"
187 << offsetText;
188
189 if (!childName.empty()) {
190 out << ", &"
191 << childName;
192 }
193
194 out << ");\n\n";
195
196 out.unindent();
197 out.unindent();
198
199 handleError(out, mode);
200}
201
202status_t Type::emitTypeDeclarations(Formatter &) const {
203 return OK;
204}
205
206status_t Type::emitTypeDefinitions(
207 Formatter &, const std::string) const {
208 return OK;
209}
210
Andreas Huber2831d512016-08-15 09:33:47 -0700211status_t Type::emitJavaTypeDeclarations(Formatter &) const {
212 return OK;
213}
214
Andreas Huber881227d2016-08-02 14:20:21 -0700215bool Type::needsEmbeddedReadWrite() const {
216 return false;
217}
218
219bool Type::resultNeedsDeref() const {
220 return false;
221}
222
223std::string Type::getCppType(std::string *extra) const {
224 return getCppType(StorageMode_Stack, extra);
225}
226
227std::string Type::getCppResultType(std::string *extra) const {
228 return getCppType(StorageMode_Result, extra);
229}
230
231std::string Type::getCppArgumentType(std::string *extra) const {
232 return getCppType(StorageMode_Argument, extra);
233}
234
Andreas Huber2831d512016-08-15 09:33:47 -0700235void Type::emitJavaReaderWriterWithSuffix(
236 Formatter &out,
237 const std::string &parcelObj,
238 const std::string &argName,
239 bool isReader,
240 const std::string &suffix,
241 const std::string &extra) const {
242 out << parcelObj
243 << "."
244 << (isReader ? "read" : "write")
245 << suffix
246 << "(";
247
248 if (isReader) {
249 out << extra;
250 } else {
251 out << (extra.empty() ? "" : (extra + ", "));
252 out << argName;
253 }
254
255 out << ");\n";
256}
257
Zhuoyao Zhang5158db42016-08-10 10:25:20 -0700258status_t Type::emitVtsTypeDeclarations(Formatter &) const {
259 return OK;
260}
261
262status_t Type::emitVtsArgumentType(Formatter &out) const {
263 return emitVtsTypeDeclarations(out);
264}
265
Andreas Huberc9410c72016-07-28 12:18:40 -0700266} // namespace android
267