blob: 5b6caf144083d922fa721fc4db43b667d88fbbee [file] [log] [blame]
Andreas Huber1aec3972016-08-26 09:26:32 -07001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Andreas Huberc9410c72016-07-28 12:18:40 -070017#include "VectorType.h"
18
Andreas Huberf03332a2016-09-22 15:35:43 -070019#include "ArrayType.h"
20
Iliyan Malcheva72e0d22016-09-09 11:03:08 -070021#include <hidl-util/Formatter.h>
Andreas Huber881227d2016-08-02 14:20:21 -070022#include <android-base/logging.h>
23
Andreas Huberc9410c72016-07-28 12:18:40 -070024namespace android {
25
Yifan Hongbf459bc2016-08-23 16:50:37 -070026VectorType::VectorType() {
Andreas Huberc9410c72016-07-28 12:18:40 -070027}
28
Steven Moreland979e0992016-09-07 09:18:08 -070029void VectorType::addNamedTypesToSet(std::set<const FQName> &set) const {
30 mElementType->addNamedTypesToSet(set);
31}
32
Andreas Huber86a112b2016-10-19 14:25:16 -070033bool VectorType::isVector() const {
34 return true;
35}
36
37bool VectorType::isVectorOfBinders() const {
38 return mElementType->isBinder();
39}
40
Steven Moreland979e0992016-09-07 09:18:08 -070041std::string VectorType::getCppType(StorageMode mode,
Steven Moreland979e0992016-09-07 09:18:08 -070042 bool specifyNamespaces) const {
Andreas Huber881227d2016-08-02 14:20:21 -070043 const std::string base =
Steven Moreland979e0992016-09-07 09:18:08 -070044 std::string(specifyNamespaces ? "::android::hardware::" : "")
45 + "hidl_vec<"
Yifan Hong3b320f82016-11-01 15:15:54 -070046 + mElementType->getCppStackType( specifyNamespaces)
Andreas Huber881227d2016-08-02 14:20:21 -070047 + ">";
48
Andreas Huber881227d2016-08-02 14:20:21 -070049 switch (mode) {
50 case StorageMode_Stack:
51 return base;
52
53 case StorageMode_Argument:
54 return "const " + base + "&";
55
56 case StorageMode_Result:
Andreas Huber86a112b2016-10-19 14:25:16 -070057 {
58 if (isVectorOfBinders()) {
59 return base;
60 }
61
Andreas Huber881227d2016-08-02 14:20:21 -070062 return "const " + base + "*";
Andreas Huber86a112b2016-10-19 14:25:16 -070063 }
Andreas Huber881227d2016-08-02 14:20:21 -070064 }
65}
66
Yifan Hong4ed13472016-11-02 10:44:11 -070067std::string VectorType::getJavaType(bool /* forInitializer */) const {
Andreas Huber4c865b72016-09-14 15:26:27 -070068
Yifan Hong4ed13472016-11-02 10:44:11 -070069 std::string elementJavaType;
70 if (mElementType->isArray()) {
71 elementJavaType = mElementType->getJavaType();
72 } else {
73 elementJavaType = mElementType->getJavaWrapperType();
74 }
Andreas Huber1b6822b2016-10-18 09:28:40 -070075
76 return "ArrayList<"
Yifan Hong4ed13472016-11-02 10:44:11 -070077 + elementJavaType
Andreas Huber1b6822b2016-10-18 09:28:40 -070078 + ">";
Andreas Huber2831d512016-08-15 09:33:47 -070079}
80
Zhuoyao Zhangc5ea9f52016-10-06 15:05:39 -070081std::string VectorType::getVtsType() const {
82 return "TYPE_VECTOR";
83}
84
Andreas Huber881227d2016-08-02 14:20:21 -070085void VectorType::emitReaderWriter(
86 Formatter &out,
87 const std::string &name,
88 const std::string &parcelObj,
89 bool parcelObjIsPointer,
90 bool isReader,
91 ErrorMode mode) const {
Andreas Huber86a112b2016-10-19 14:25:16 -070092 if (isVectorOfBinders()) {
93 emitReaderWriterForVectorOfBinders(
94 out, name, parcelObj, parcelObjIsPointer, isReader, mode);
95
96 return;
97 }
98
Yifan Hong3b320f82016-11-01 15:15:54 -070099 std::string baseType = mElementType->getCppStackType();
Andreas Huber881227d2016-08-02 14:20:21 -0700100
Iliyan Malchev549e2592016-08-10 08:59:12 -0700101 const std::string parentName = "_hidl_" + name + "_parent";
Andreas Huber881227d2016-08-02 14:20:21 -0700102
103 out << "size_t " << parentName << ";\n\n";
104
105 const std::string parcelObjDeref =
106 parcelObj + (parcelObjIsPointer ? "->" : ".");
107
108 if (isReader) {
109 out << name
Andreas Huber8a82ff72016-08-04 10:29:39 -0700110 << " = (const ::android::hardware::hidl_vec<"
Andreas Huber881227d2016-08-02 14:20:21 -0700111 << baseType
112 << "> *)"
113 << parcelObjDeref
114 << "readBuffer(&"
115 << parentName
116 << ");\n\n";
117
118 out << "if (" << name << " == nullptr) {\n";
119
120 out.indent();
121
Iliyan Malchev549e2592016-08-10 08:59:12 -0700122 out << "_hidl_err = ::android::UNKNOWN_ERROR;\n";
Andreas Huber881227d2016-08-02 14:20:21 -0700123 handleError2(out, mode);
124
125 out.unindent();
126 out << "}\n\n";
127 } else {
Iliyan Malchev549e2592016-08-10 08:59:12 -0700128 out << "_hidl_err = "
Andreas Huber881227d2016-08-02 14:20:21 -0700129 << parcelObjDeref
130 << "writeBuffer(&"
131 << name
132 << ", sizeof("
133 << name
134 << "), &"
135 << parentName
136 << ");\n";
137
138 handleError(out, mode);
139 }
140
141 emitReaderWriterEmbedded(
142 out,
Andreas Huberf9d49f12016-09-12 14:58:36 -0700143 0 /* depth */,
Andreas Huber881227d2016-08-02 14:20:21 -0700144 name,
Yifan Hongbe2a3732016-10-05 13:33:41 -0700145 name /* sanitizedName */ ,
Andreas Huber881227d2016-08-02 14:20:21 -0700146 isReader /* nameIsPointer */,
147 parcelObj,
148 parcelObjIsPointer,
149 isReader,
150 mode,
151 parentName,
152 "0 /* parentOffset */");
153}
154
Andreas Huber86a112b2016-10-19 14:25:16 -0700155void VectorType::emitReaderWriterForVectorOfBinders(
156 Formatter &out,
157 const std::string &name,
158 const std::string &parcelObj,
159 bool parcelObjIsPointer,
160 bool isReader,
161 ErrorMode mode) const {
162 const std::string parcelObjDeref =
163 parcelObj + (parcelObjIsPointer ? "->" : ".");
164
165 if (isReader) {
166 out << "{\n";
167 out.indent();
168
169 const std::string sizeName = "_hidl_" + name + "_size";
170
171 out << "uint64_t "
172 << sizeName
173 << ";\n";
174
175 out << "_hidl_err = "
176 << parcelObjDeref
177 << "readUint64(&"
178 << sizeName
179 << ");\n";
180
181 handleError(out, mode);
182
183 out << name
184 << ".resize("
185 << sizeName
186 << ");\n\n"
187 << "for (size_t _hidl_index = 0; _hidl_index < "
188 << sizeName
189 << "; ++_hidl_index) {\n";
190
191 out.indent();
192
Yifan Hong3b320f82016-11-01 15:15:54 -0700193 out << mElementType->getCppStackType(true /* specifyNamespaces */)
Andreas Huber86a112b2016-10-19 14:25:16 -0700194 << " _hidl_binder;\n";
195
196 mElementType->emitReaderWriter(
197 out,
198 "_hidl_binder",
199 parcelObj,
200 parcelObjIsPointer,
201 isReader,
202 mode);
203
204 out << name
205 << "[_hidl_index] = _hidl_binder;\n";
206
207 out.unindent();
208 out << "}\n";
209
210 out.unindent();
211 out << "}\n";
212 } else {
213 out << "_hidl_err = "
214 << parcelObjDeref
215 << "writeUint64("
216 << name
217 << ".size());\n";
218
219 handleError(out, mode);
220
221 out << "for (size_t _hidl_index = 0; _hidl_index < "
222 << name
223 << ".size(); ++_hidl_index) {\n";
224
225 out.indent();
226
227 mElementType->emitReaderWriter(
228 out,
229 name + "[_hidl_index]",
230 parcelObj,
231 parcelObjIsPointer,
232 isReader,
233 mode);
234
235 out.unindent();
236 out << "}\n";
237 }
238}
239
Andreas Huber881227d2016-08-02 14:20:21 -0700240void VectorType::emitReaderWriterEmbedded(
241 Formatter &out,
Andreas Huberf9d49f12016-09-12 14:58:36 -0700242 size_t depth,
Andreas Huber881227d2016-08-02 14:20:21 -0700243 const std::string &name,
Yifan Hongbe2a3732016-10-05 13:33:41 -0700244 const std::string &sanitizedName,
Andreas Huber881227d2016-08-02 14:20:21 -0700245 bool nameIsPointer,
246 const std::string &parcelObj,
247 bool parcelObjIsPointer,
248 bool isReader,
249 ErrorMode mode,
250 const std::string &parentName,
251 const std::string &offsetText) const {
Yifan Hong3b320f82016-11-01 15:15:54 -0700252 std::string baseType = getCppStackType();
Andreas Huber881227d2016-08-02 14:20:21 -0700253
Yifan Hongbe2a3732016-10-05 13:33:41 -0700254 const std::string childName = "_hidl_" + sanitizedName + "_child";
Andreas Huber881227d2016-08-02 14:20:21 -0700255 out << "size_t " << childName << ";\n\n";
256
257 emitReaderWriterEmbeddedForTypeName(
258 out,
259 name,
260 nameIsPointer,
261 parcelObj,
262 parcelObjIsPointer,
263 isReader,
264 mode,
265 parentName,
266 offsetText,
267 baseType,
268 childName);
269
270 if (!mElementType->needsEmbeddedReadWrite()) {
271 return;
272 }
273
274 const std::string nameDeref = name + (nameIsPointer ? "->" : ".");
275
Yifan Hong3b320f82016-11-01 15:15:54 -0700276 baseType = mElementType->getCppStackType();
Andreas Huber881227d2016-08-02 14:20:21 -0700277
Andreas Huberf9d49f12016-09-12 14:58:36 -0700278 std::string iteratorName = "_hidl_index_" + std::to_string(depth);
279
280 out << "for (size_t "
281 << iteratorName
282 << " = 0; "
283 << iteratorName
284 << " < "
Andreas Huber881227d2016-08-02 14:20:21 -0700285 << nameDeref
Andreas Huberf9d49f12016-09-12 14:58:36 -0700286 << "size(); ++"
287 << iteratorName
288 << ") {\n";
Andreas Huber881227d2016-08-02 14:20:21 -0700289
290 out.indent();
291
292 mElementType->emitReaderWriterEmbedded(
293 out,
Andreas Huberf9d49f12016-09-12 14:58:36 -0700294 depth + 1,
295 (nameIsPointer ? "(*" + name + ")" : name)
296 + "[" + iteratorName + "]",
Yifan Hongbe2a3732016-10-05 13:33:41 -0700297 sanitizedName + (nameIsPointer ? "_deref" : "") + "_indexed",
Andreas Huber881227d2016-08-02 14:20:21 -0700298 false /* nameIsPointer */,
299 parcelObj,
300 parcelObjIsPointer,
301 isReader,
302 mode,
303 childName,
Yifan Hong3b320f82016-11-01 15:15:54 -0700304 iteratorName + " * sizeof(" + baseType + ")");
Andreas Huber881227d2016-08-02 14:20:21 -0700305
306 out.unindent();
307
308 out << "}\n\n";
309}
310
Yifan Hongbf459bc2016-08-23 16:50:37 -0700311void VectorType::emitResolveReferences(
312 Formatter &out,
313 const std::string &name,
314 bool nameIsPointer,
315 const std::string &parcelObj,
316 bool parcelObjIsPointer,
317 bool isReader,
318 ErrorMode mode) const {
319 emitResolveReferencesEmbeddedHelper(
320 out,
321 0, /* depth */
322 name,
323 name /* sanitizedName */,
324 nameIsPointer,
325 parcelObj,
326 parcelObjIsPointer,
327 isReader,
328 mode,
329 "_hidl_" + name + "_child",
330 "0 /* parentOffset */");
331}
332
333void VectorType::emitResolveReferencesEmbedded(
334 Formatter &out,
335 size_t depth,
336 const std::string &name,
337 const std::string &sanitizedName,
338 bool nameIsPointer,
339 const std::string &parcelObj,
340 bool parcelObjIsPointer,
341 bool isReader,
342 ErrorMode mode,
343 const std::string & /* parentName */,
344 const std::string & /* offsetText */) const {
345 emitResolveReferencesEmbeddedHelper(
346 out, depth, name, sanitizedName, nameIsPointer, parcelObj,
347 parcelObjIsPointer, isReader, mode, "", "");
348}
349
Yifan Hong00f47172016-09-30 14:40:45 -0700350bool VectorType::useParentInEmitResolveReferencesEmbedded() const {
351 // parentName and offsetText is not used in emitResolveReferencesEmbedded
352 return false;
353}
354
Yifan Hongbf459bc2016-08-23 16:50:37 -0700355void VectorType::emitResolveReferencesEmbeddedHelper(
356 Formatter &out,
357 size_t depth,
358 const std::string &name,
359 const std::string &sanitizedName,
360 bool nameIsPointer,
361 const std::string &parcelObj,
362 bool parcelObjIsPointer,
363 bool isReader,
364 ErrorMode mode,
365 const std::string &childName,
366 const std::string &childOffsetText) const {
367 CHECK(needsResolveReferences() && mElementType->needsResolveReferences());
368
369 const std::string nameDeref = name + (nameIsPointer ? "->" : ".");
Yifan Hong3b320f82016-11-01 15:15:54 -0700370 std::string elementType = mElementType->getCppStackType();
Yifan Hongbf459bc2016-08-23 16:50:37 -0700371
372 std::string myChildName = childName, myChildOffset = childOffsetText;
373
374 if(myChildName.empty() && myChildOffset.empty()) {
375 myChildName = "_hidl_" + sanitizedName + "_child";
376 myChildOffset = "0";
377
378 out << "size_t " << myChildName << ";\n";
379 out << "_hidl_err = " << nameDeref << "findInParcel("
380 << (parcelObjIsPointer ? "*" : "") << parcelObj << ", "
381 << "&" << myChildName
382 << ");\n";
383
384 handleError(out, mode);
385 }
386
387 std::string iteratorName = "_hidl_index_" + std::to_string(depth);
388
389 out << "for (size_t "
390 << iteratorName
391 << " = 0; "
392 << iteratorName
393 << " < "
394 << nameDeref
395 << "size(); ++"
396 << iteratorName
397 << ") {\n";
398
399 out.indent();
400
401 mElementType->emitResolveReferencesEmbedded(
402 out,
403 depth + 1,
404 (nameIsPointer ? "(*" + name + ")" : name) + "[" + iteratorName + "]",
405 sanitizedName + (nameIsPointer ? "_deref" : "") + "_indexed",
406 false /* nameIsPointer */,
407 parcelObj,
408 parcelObjIsPointer,
409 isReader,
410 mode,
411 myChildName,
412 myChildOffset + " + " +
Yifan Hong3b320f82016-11-01 15:15:54 -0700413 iteratorName + " * sizeof(" + elementType + ")");
Yifan Hongbf459bc2016-08-23 16:50:37 -0700414
415 out.unindent();
416
417 out << "}\n\n";
418}
419
Andreas Huberf630bc82016-09-09 14:52:25 -0700420void VectorType::emitJavaReaderWriter(
421 Formatter &out,
422 const std::string &parcelObj,
423 const std::string &argName,
424 bool isReader) const {
425 if (mElementType->isCompoundType()) {
Andreas Huber4c865b72016-09-14 15:26:27 -0700426
Andreas Huberf630bc82016-09-09 14:52:25 -0700427 if (isReader) {
Yifan Hong4ed13472016-11-02 10:44:11 -0700428 out << mElementType->getJavaType()
Andreas Huberf630bc82016-09-09 14:52:25 -0700429 << ".readVectorFromParcel("
430 << parcelObj
431 << ");\n";
432 } else {
Yifan Hong4ed13472016-11-02 10:44:11 -0700433 out << mElementType->getJavaType()
Andreas Huberf630bc82016-09-09 14:52:25 -0700434 << ".writeVectorToParcel("
435 << parcelObj
436 << ", "
437 << argName
438 << ");\n";
439 }
440
441 return;
442 }
443
Andreas Huber1b6822b2016-10-18 09:28:40 -0700444 if (mElementType->isArray()) {
445 if (isReader) {
Andreas Huber1b6822b2016-10-18 09:28:40 -0700446 out << " new "
Yifan Hong4ed13472016-11-02 10:44:11 -0700447 << getJavaType(false /* forInitializer */)
Andreas Huber1b6822b2016-10-18 09:28:40 -0700448 << "();\n";
449 }
450
451 out << "{\n";
452 out.indent();
453
454 out << "HwBlob _hidl_blob = ";
455
456 if (isReader) {
457 out << parcelObj
458 << ".readBuffer();\n";
459 } else {
460 size_t align, size;
461 getAlignmentAndSize(&align, &size);
462
463 out << "new HwBlob("
464 << size
465 << " /* size */);\n";
466 }
467
468 emitJavaFieldReaderWriter(
469 out,
470 0 /* depth */,
471 parcelObj,
472 "_hidl_blob",
473 argName,
474 "0 /* offset */",
475 isReader);
476
477 if (!isReader) {
478 out << parcelObj << ".writeBuffer(_hidl_blob);\n";
479 };
480
481 out.unindent();
482 out << "}\n";
483
484 return;
485 }
486
Andreas Huberf630bc82016-09-09 14:52:25 -0700487 emitJavaReaderWriterWithSuffix(
488 out,
489 parcelObj,
490 argName,
491 isReader,
492 mElementType->getJavaSuffix() + "Vector",
493 "" /* extra */);
494}
495
Andreas Huber85eabdb2016-08-25 11:24:49 -0700496void VectorType::emitJavaFieldInitializer(
497 Formatter &out, const std::string &fieldName) const {
Yifan Hong4ed13472016-11-02 10:44:11 -0700498 std::string javaType = getJavaType(false /* forInitializer */);
Andreas Huberf03332a2016-09-22 15:35:43 -0700499
Andreas Huber1b6822b2016-10-18 09:28:40 -0700500 out << "final "
501 << javaType
502 << " "
Andreas Huber85eabdb2016-08-25 11:24:49 -0700503 << fieldName
Andreas Huber1b6822b2016-10-18 09:28:40 -0700504 << " = new "
505 << javaType
506 << "();\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700507}
508
509void VectorType::emitJavaFieldReaderWriter(
510 Formatter &out,
Andreas Huber4c865b72016-09-14 15:26:27 -0700511 size_t depth,
Andreas Huber709b62d2016-09-19 11:21:18 -0700512 const std::string &parcelName,
Andreas Huber85eabdb2016-08-25 11:24:49 -0700513 const std::string &blobName,
514 const std::string &fieldName,
515 const std::string &offset,
516 bool isReader) const {
Andreas Huberf630bc82016-09-09 14:52:25 -0700517 VectorType::EmitJavaFieldReaderWriterForElementType(
Andreas Huber709b62d2016-09-19 11:21:18 -0700518 out,
519 depth,
520 mElementType,
521 parcelName,
522 blobName,
523 fieldName,
524 offset,
525 isReader);
Andreas Huberf630bc82016-09-09 14:52:25 -0700526}
527
528// static
529void VectorType::EmitJavaFieldReaderWriterForElementType(
530 Formatter &out,
Andreas Huber4c865b72016-09-14 15:26:27 -0700531 size_t depth,
Andreas Huberf630bc82016-09-09 14:52:25 -0700532 const Type *elementType,
Andreas Huber709b62d2016-09-19 11:21:18 -0700533 const std::string &parcelName,
Andreas Huberf630bc82016-09-09 14:52:25 -0700534 const std::string &blobName,
535 const std::string &fieldName,
536 const std::string &offset,
537 bool isReader) {
Andreas Huber85eabdb2016-08-25 11:24:49 -0700538 if (isReader) {
539 out << "{\n";
540 out.indent();
541
Andreas Huber709b62d2016-09-19 11:21:18 -0700542 out << "HwBlob childBlob = "
543 << parcelName
544 << ".readEmbeddedBuffer(\n";
545
Andreas Huber85eabdb2016-08-25 11:24:49 -0700546 out.indent();
547 out.indent();
548
549 out << blobName
550 << ".handle(),\n"
551 << offset
552 << " + 0 /* offsetof(hidl_vec<T>, mBuffer) */);\n\n";
553
554 out.unindent();
555 out.unindent();
556
557 out << fieldName << ".clear();\n";
558 out << "long _hidl_vec_size = "
559 << blobName
560 << ".getInt64("
561 << offset
562 << " + 8 /* offsetof(hidl_vec<T>, mSize) */);\n";
563
Andreas Huber4c865b72016-09-14 15:26:27 -0700564 std::string iteratorName = "_hidl_index_" + std::to_string(depth);
565
566 out << "for (int "
567 << iteratorName
568 << " = 0; "
569 << iteratorName
570 << " < _hidl_vec_size; "
571 << "++"
572 << iteratorName
573 << ") {\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700574
575 out.indent();
576
Andreas Huberf630bc82016-09-09 14:52:25 -0700577 elementType->emitJavaFieldInitializer(out, "_hidl_vec_element");
Andreas Huber85eabdb2016-08-25 11:24:49 -0700578
579 size_t elementAlign, elementSize;
Andreas Huberf630bc82016-09-09 14:52:25 -0700580 elementType->getAlignmentAndSize(&elementAlign, &elementSize);
Andreas Huber85eabdb2016-08-25 11:24:49 -0700581
Andreas Huberf630bc82016-09-09 14:52:25 -0700582 elementType->emitJavaFieldReaderWriter(
Andreas Huber85eabdb2016-08-25 11:24:49 -0700583 out,
Andreas Huber4c865b72016-09-14 15:26:27 -0700584 depth + 1,
Andreas Huber709b62d2016-09-19 11:21:18 -0700585 parcelName,
Andreas Huber85eabdb2016-08-25 11:24:49 -0700586 "childBlob",
587 "_hidl_vec_element",
Andreas Huber4c865b72016-09-14 15:26:27 -0700588 iteratorName + " * " + std::to_string(elementSize),
Andreas Huber85eabdb2016-08-25 11:24:49 -0700589 true /* isReader */);
590
Andreas Huber1b6822b2016-10-18 09:28:40 -0700591 out << fieldName
592 << ".add(_hidl_vec_element);\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700593
594 out.unindent();
595
596 out << "}\n";
597
598 out.unindent();
599 out << "}\n";
600
601 return;
602 }
603
604 out << "{\n";
605 out.indent();
606
607 out << "long _hidl_vec_size = "
608 << fieldName
609 << ".size();\n";
610
611 out << blobName
612 << ".putInt64("
613 << offset
614 << " + 8 /* offsetof(hidl_vec<T>, mSize) */, _hidl_vec_size);\n";
615
616 out << blobName
617 << ".putBool("
618 << offset
619 << " + 16 /* offsetof(hidl_vec<T>, mOwnsBuffer) */, false);\n";
620
621 size_t elementAlign, elementSize;
Andreas Huberf630bc82016-09-09 14:52:25 -0700622 elementType->getAlignmentAndSize(&elementAlign, &elementSize);
Andreas Huber85eabdb2016-08-25 11:24:49 -0700623
624 // XXX make HwBlob constructor take a long instead of an int?
625 out << "HwBlob childBlob = new HwBlob((int)(_hidl_vec_size * "
626 << elementSize
627 << "));\n";
628
Andreas Huber4c865b72016-09-14 15:26:27 -0700629 std::string iteratorName = "_hidl_index_" + std::to_string(depth);
630
631 out << "for (int "
632 << iteratorName
633 << " = 0; "
634 << iteratorName
635 << " < _hidl_vec_size; "
636 << "++"
637 << iteratorName
638 << ") {\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700639
640 out.indent();
641
Andreas Huberf630bc82016-09-09 14:52:25 -0700642 elementType->emitJavaFieldReaderWriter(
Andreas Huber85eabdb2016-08-25 11:24:49 -0700643 out,
Andreas Huber4c865b72016-09-14 15:26:27 -0700644 depth + 1,
Andreas Huber709b62d2016-09-19 11:21:18 -0700645 parcelName,
Andreas Huber85eabdb2016-08-25 11:24:49 -0700646 "childBlob",
Andreas Huberf1abc2a2016-09-28 09:14:43 -0700647 fieldName + ".get(" + iteratorName + ")",
Andreas Huber4c865b72016-09-14 15:26:27 -0700648 iteratorName + " * " + std::to_string(elementSize),
Andreas Huber85eabdb2016-08-25 11:24:49 -0700649 false /* isReader */);
650
651 out.unindent();
652
653 out << "}\n";
654
655 out << blobName
656 << ".putBlob("
657 << offset
658 << " + 0 /* offsetof(hidl_vec<T>, mBuffer) */, childBlob);\n";
659
660 out.unindent();
661 out << "}\n";
662}
663
Andreas Huber881227d2016-08-02 14:20:21 -0700664bool VectorType::needsEmbeddedReadWrite() const {
665 return true;
666}
667
Yifan Hongbf459bc2016-08-23 16:50:37 -0700668bool VectorType::needsResolveReferences() const {
669 return mElementType->needsResolveReferences();
670}
671
Andreas Huber881227d2016-08-02 14:20:21 -0700672bool VectorType::resultNeedsDeref() const {
Andreas Huber86a112b2016-10-19 14:25:16 -0700673 return !isVectorOfBinders();
Andreas Huber881227d2016-08-02 14:20:21 -0700674}
675
Zhuoyao Zhang5158db42016-08-10 10:25:20 -0700676status_t VectorType::emitVtsTypeDeclarations(Formatter &out) const {
Zhuoyao Zhangc5ea9f52016-10-06 15:05:39 -0700677 out << "type: " << getVtsType() << "\n";
678 out << "vector_value: {\n";
Zhuoyao Zhang5158db42016-08-10 10:25:20 -0700679 out.indent();
680 status_t err = mElementType->emitVtsTypeDeclarations(out);
681 if (err != OK) {
682 return err;
683 }
684 out.unindent();
685 out << "}\n";
686 return OK;
687}
688
Zhuoyao Zhang864c7712016-08-16 15:35:28 -0700689status_t VectorType::emitVtsAttributeType(Formatter &out) const {
690 out << "type: TYPE_VECTOR\n" << "vector_value: {\n";
691 out.indent();
692 status_t status = mElementType->emitVtsAttributeType(out);
693 if (status != OK) {
694 return status;
695 }
696 out.unindent();
697 out << "}\n";
698 return OK;
699}
700
Andreas Huber70a59e12016-08-16 12:57:01 -0700701bool VectorType::isJavaCompatible() const {
Andreas Huberf03332a2016-09-22 15:35:43 -0700702 if (!mElementType->isJavaCompatible()) {
703 return false;
704 }
705
706 if (mElementType->isArray()) {
707 return static_cast<ArrayType *>(mElementType)->countDimensions() == 1;
708 }
709
Andreas Huber1b6822b2016-10-18 09:28:40 -0700710 if (mElementType->isVector()) {
711 return false;
712 }
713
Andreas Huber86a112b2016-10-19 14:25:16 -0700714 if (isVectorOfBinders()) {
715 return false;
716 }
717
Andreas Huberf03332a2016-09-22 15:35:43 -0700718 return true;
Andreas Huber70a59e12016-08-16 12:57:01 -0700719}
720
Andreas Huber85eabdb2016-08-25 11:24:49 -0700721void VectorType::getAlignmentAndSize(size_t *align, size_t *size) const {
722 *align = 8; // hidl_vec<T>
723 *size = 24;
724}
725
Andreas Huberc9410c72016-07-28 12:18:40 -0700726} // namespace android
727