blob: 461a05bd6e1735da0e9ce8029e05209dda22b174 [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,
42 std::string *extra,
43 bool specifyNamespaces) const {
Yifan Hongbf459bc2016-08-23 16:50:37 -070044 std::string elementExtra;
Andreas Huber86a112b2016-10-19 14:25:16 -070045 const std::string elementBase =
46 mElementType->getCppType(&elementExtra, specifyNamespaces);
Yifan Hongbf459bc2016-08-23 16:50:37 -070047
Andreas Huber881227d2016-08-02 14:20:21 -070048 const std::string base =
Steven Moreland979e0992016-09-07 09:18:08 -070049 std::string(specifyNamespaces ? "::android::hardware::" : "")
50 + "hidl_vec<"
51 + mElementType->getCppType(extra, specifyNamespaces)
Andreas Huberf9d49f12016-09-12 14:58:36 -070052 + (*extra)
Andreas Huber881227d2016-08-02 14:20:21 -070053 + ">";
54
Andreas Huberf9d49f12016-09-12 14:58:36 -070055 extra->clear();
Andreas Huber881227d2016-08-02 14:20:21 -070056
57 switch (mode) {
58 case StorageMode_Stack:
59 return base;
60
61 case StorageMode_Argument:
62 return "const " + base + "&";
63
64 case StorageMode_Result:
Andreas Huber86a112b2016-10-19 14:25:16 -070065 {
66 if (isVectorOfBinders()) {
67 return base;
68 }
69
Andreas Huber881227d2016-08-02 14:20:21 -070070 return "const " + base + "*";
Andreas Huber86a112b2016-10-19 14:25:16 -070071 }
Andreas Huber881227d2016-08-02 14:20:21 -070072 }
73}
74
Andreas Huber4c865b72016-09-14 15:26:27 -070075std::string VectorType::getJavaType(
76 std::string *extra, bool /* forInitializer */) const {
Andreas Huber1b6822b2016-10-18 09:28:40 -070077 extra->clear();
Andreas Huber4c865b72016-09-14 15:26:27 -070078
79 std::string elementExtra;
Andreas Huber1b6822b2016-10-18 09:28:40 -070080 std::string elementJavaType = mElementType->getJavaType(&elementExtra);
81
82 CHECK(mElementType->isArray() || elementExtra.empty());
83
84 return "ArrayList<"
85 + (mElementType->isArray()
86 ? elementJavaType : mElementType->getJavaWrapperType())
87 + elementExtra
88 + ">";
Andreas Huber2831d512016-08-15 09:33:47 -070089}
90
Zhuoyao Zhangc5ea9f52016-10-06 15:05:39 -070091std::string VectorType::getVtsType() const {
92 return "TYPE_VECTOR";
93}
94
Andreas Huber881227d2016-08-02 14:20:21 -070095void VectorType::emitReaderWriter(
96 Formatter &out,
97 const std::string &name,
98 const std::string &parcelObj,
99 bool parcelObjIsPointer,
100 bool isReader,
101 ErrorMode mode) const {
Andreas Huber86a112b2016-10-19 14:25:16 -0700102 if (isVectorOfBinders()) {
103 emitReaderWriterForVectorOfBinders(
104 out, name, parcelObj, parcelObjIsPointer, isReader, mode);
105
106 return;
107 }
108
Andreas Huber881227d2016-08-02 14:20:21 -0700109 std::string baseExtra;
110 std::string baseType = mElementType->getCppType(&baseExtra);
111
Iliyan Malchev549e2592016-08-10 08:59:12 -0700112 const std::string parentName = "_hidl_" + name + "_parent";
Andreas Huber881227d2016-08-02 14:20:21 -0700113
114 out << "size_t " << parentName << ";\n\n";
115
116 const std::string parcelObjDeref =
117 parcelObj + (parcelObjIsPointer ? "->" : ".");
118
119 if (isReader) {
120 out << name
Andreas Huber8a82ff72016-08-04 10:29:39 -0700121 << " = (const ::android::hardware::hidl_vec<"
Andreas Huber881227d2016-08-02 14:20:21 -0700122 << baseType
Andreas Huberf9d49f12016-09-12 14:58:36 -0700123 << baseExtra
Andreas Huber881227d2016-08-02 14:20:21 -0700124 << "> *)"
125 << parcelObjDeref
126 << "readBuffer(&"
127 << parentName
128 << ");\n\n";
129
130 out << "if (" << name << " == nullptr) {\n";
131
132 out.indent();
133
Iliyan Malchev549e2592016-08-10 08:59:12 -0700134 out << "_hidl_err = ::android::UNKNOWN_ERROR;\n";
Andreas Huber881227d2016-08-02 14:20:21 -0700135 handleError2(out, mode);
136
137 out.unindent();
138 out << "}\n\n";
139 } else {
Iliyan Malchev549e2592016-08-10 08:59:12 -0700140 out << "_hidl_err = "
Andreas Huber881227d2016-08-02 14:20:21 -0700141 << parcelObjDeref
142 << "writeBuffer(&"
143 << name
144 << ", sizeof("
145 << name
146 << "), &"
147 << parentName
148 << ");\n";
149
150 handleError(out, mode);
151 }
152
153 emitReaderWriterEmbedded(
154 out,
Andreas Huberf9d49f12016-09-12 14:58:36 -0700155 0 /* depth */,
Andreas Huber881227d2016-08-02 14:20:21 -0700156 name,
Yifan Hongbe2a3732016-10-05 13:33:41 -0700157 name /* sanitizedName */ ,
Andreas Huber881227d2016-08-02 14:20:21 -0700158 isReader /* nameIsPointer */,
159 parcelObj,
160 parcelObjIsPointer,
161 isReader,
162 mode,
163 parentName,
164 "0 /* parentOffset */");
165}
166
Andreas Huber86a112b2016-10-19 14:25:16 -0700167void VectorType::emitReaderWriterForVectorOfBinders(
168 Formatter &out,
169 const std::string &name,
170 const std::string &parcelObj,
171 bool parcelObjIsPointer,
172 bool isReader,
173 ErrorMode mode) const {
174 const std::string parcelObjDeref =
175 parcelObj + (parcelObjIsPointer ? "->" : ".");
176
177 if (isReader) {
178 out << "{\n";
179 out.indent();
180
181 const std::string sizeName = "_hidl_" + name + "_size";
182
183 out << "uint64_t "
184 << sizeName
185 << ";\n";
186
187 out << "_hidl_err = "
188 << parcelObjDeref
189 << "readUint64(&"
190 << sizeName
191 << ");\n";
192
193 handleError(out, mode);
194
195 out << name
196 << ".resize("
197 << sizeName
198 << ");\n\n"
199 << "for (size_t _hidl_index = 0; _hidl_index < "
200 << sizeName
201 << "; ++_hidl_index) {\n";
202
203 out.indent();
204
205 std::string extra;
206 out << mElementType->getCppType(&extra, true /* specifyNamespaces */)
207 << " _hidl_binder;\n";
208
209 mElementType->emitReaderWriter(
210 out,
211 "_hidl_binder",
212 parcelObj,
213 parcelObjIsPointer,
214 isReader,
215 mode);
216
217 out << name
218 << "[_hidl_index] = _hidl_binder;\n";
219
220 out.unindent();
221 out << "}\n";
222
223 out.unindent();
224 out << "}\n";
225 } else {
226 out << "_hidl_err = "
227 << parcelObjDeref
228 << "writeUint64("
229 << name
230 << ".size());\n";
231
232 handleError(out, mode);
233
234 out << "for (size_t _hidl_index = 0; _hidl_index < "
235 << name
236 << ".size(); ++_hidl_index) {\n";
237
238 out.indent();
239
240 mElementType->emitReaderWriter(
241 out,
242 name + "[_hidl_index]",
243 parcelObj,
244 parcelObjIsPointer,
245 isReader,
246 mode);
247
248 out.unindent();
249 out << "}\n";
250 }
251}
252
Andreas Huber881227d2016-08-02 14:20:21 -0700253void VectorType::emitReaderWriterEmbedded(
254 Formatter &out,
Andreas Huberf9d49f12016-09-12 14:58:36 -0700255 size_t depth,
Andreas Huber881227d2016-08-02 14:20:21 -0700256 const std::string &name,
Yifan Hongbe2a3732016-10-05 13:33:41 -0700257 const std::string &sanitizedName,
Andreas Huber881227d2016-08-02 14:20:21 -0700258 bool nameIsPointer,
259 const std::string &parcelObj,
260 bool parcelObjIsPointer,
261 bool isReader,
262 ErrorMode mode,
263 const std::string &parentName,
264 const std::string &offsetText) const {
265 std::string baseExtra;
266 std::string baseType = Type::getCppType(&baseExtra);
267
Yifan Hongbe2a3732016-10-05 13:33:41 -0700268 const std::string childName = "_hidl_" + sanitizedName + "_child";
Andreas Huber881227d2016-08-02 14:20:21 -0700269 out << "size_t " << childName << ";\n\n";
270
271 emitReaderWriterEmbeddedForTypeName(
272 out,
273 name,
274 nameIsPointer,
275 parcelObj,
276 parcelObjIsPointer,
277 isReader,
278 mode,
279 parentName,
280 offsetText,
281 baseType,
282 childName);
283
284 if (!mElementType->needsEmbeddedReadWrite()) {
285 return;
286 }
287
288 const std::string nameDeref = name + (nameIsPointer ? "->" : ".");
289
290 baseType = mElementType->getCppType(&baseExtra);
291
Andreas Huberf9d49f12016-09-12 14:58:36 -0700292 std::string iteratorName = "_hidl_index_" + std::to_string(depth);
293
294 out << "for (size_t "
295 << iteratorName
296 << " = 0; "
297 << iteratorName
298 << " < "
Andreas Huber881227d2016-08-02 14:20:21 -0700299 << nameDeref
Andreas Huberf9d49f12016-09-12 14:58:36 -0700300 << "size(); ++"
301 << iteratorName
302 << ") {\n";
Andreas Huber881227d2016-08-02 14:20:21 -0700303
304 out.indent();
305
306 mElementType->emitReaderWriterEmbedded(
307 out,
Andreas Huberf9d49f12016-09-12 14:58:36 -0700308 depth + 1,
309 (nameIsPointer ? "(*" + name + ")" : name)
310 + "[" + iteratorName + "]",
Yifan Hongbe2a3732016-10-05 13:33:41 -0700311 sanitizedName + (nameIsPointer ? "_deref" : "") + "_indexed",
Andreas Huber881227d2016-08-02 14:20:21 -0700312 false /* nameIsPointer */,
313 parcelObj,
314 parcelObjIsPointer,
315 isReader,
316 mode,
317 childName,
Andreas Huberf9d49f12016-09-12 14:58:36 -0700318 iteratorName + " * sizeof(" + baseType + baseExtra + ")");
Andreas Huber881227d2016-08-02 14:20:21 -0700319
320 out.unindent();
321
322 out << "}\n\n";
323}
324
Yifan Hongbf459bc2016-08-23 16:50:37 -0700325void VectorType::emitResolveReferences(
326 Formatter &out,
327 const std::string &name,
328 bool nameIsPointer,
329 const std::string &parcelObj,
330 bool parcelObjIsPointer,
331 bool isReader,
332 ErrorMode mode) const {
333 emitResolveReferencesEmbeddedHelper(
334 out,
335 0, /* depth */
336 name,
337 name /* sanitizedName */,
338 nameIsPointer,
339 parcelObj,
340 parcelObjIsPointer,
341 isReader,
342 mode,
343 "_hidl_" + name + "_child",
344 "0 /* parentOffset */");
345}
346
347void VectorType::emitResolveReferencesEmbedded(
348 Formatter &out,
349 size_t depth,
350 const std::string &name,
351 const std::string &sanitizedName,
352 bool nameIsPointer,
353 const std::string &parcelObj,
354 bool parcelObjIsPointer,
355 bool isReader,
356 ErrorMode mode,
357 const std::string & /* parentName */,
358 const std::string & /* offsetText */) const {
359 emitResolveReferencesEmbeddedHelper(
360 out, depth, name, sanitizedName, nameIsPointer, parcelObj,
361 parcelObjIsPointer, isReader, mode, "", "");
362}
363
Yifan Hong00f47172016-09-30 14:40:45 -0700364bool VectorType::useParentInEmitResolveReferencesEmbedded() const {
365 // parentName and offsetText is not used in emitResolveReferencesEmbedded
366 return false;
367}
368
Yifan Hongbf459bc2016-08-23 16:50:37 -0700369void VectorType::emitResolveReferencesEmbeddedHelper(
370 Formatter &out,
371 size_t depth,
372 const std::string &name,
373 const std::string &sanitizedName,
374 bool nameIsPointer,
375 const std::string &parcelObj,
376 bool parcelObjIsPointer,
377 bool isReader,
378 ErrorMode mode,
379 const std::string &childName,
380 const std::string &childOffsetText) const {
381 CHECK(needsResolveReferences() && mElementType->needsResolveReferences());
382
383 const std::string nameDeref = name + (nameIsPointer ? "->" : ".");
384 std::string elementExtra;
385 std::string elementType = mElementType->getCppType(&elementExtra);
386
387 std::string myChildName = childName, myChildOffset = childOffsetText;
388
389 if(myChildName.empty() && myChildOffset.empty()) {
390 myChildName = "_hidl_" + sanitizedName + "_child";
391 myChildOffset = "0";
392
393 out << "size_t " << myChildName << ";\n";
394 out << "_hidl_err = " << nameDeref << "findInParcel("
395 << (parcelObjIsPointer ? "*" : "") << parcelObj << ", "
396 << "&" << myChildName
397 << ");\n";
398
399 handleError(out, mode);
400 }
401
402 std::string iteratorName = "_hidl_index_" + std::to_string(depth);
403
404 out << "for (size_t "
405 << iteratorName
406 << " = 0; "
407 << iteratorName
408 << " < "
409 << nameDeref
410 << "size(); ++"
411 << iteratorName
412 << ") {\n";
413
414 out.indent();
415
416 mElementType->emitResolveReferencesEmbedded(
417 out,
418 depth + 1,
419 (nameIsPointer ? "(*" + name + ")" : name) + "[" + iteratorName + "]",
420 sanitizedName + (nameIsPointer ? "_deref" : "") + "_indexed",
421 false /* nameIsPointer */,
422 parcelObj,
423 parcelObjIsPointer,
424 isReader,
425 mode,
426 myChildName,
427 myChildOffset + " + " +
428 iteratorName + " * sizeof(" + elementType + elementExtra + ")");
429
430 out.unindent();
431
432 out << "}\n\n";
433}
434
Andreas Huberf630bc82016-09-09 14:52:25 -0700435void VectorType::emitJavaReaderWriter(
436 Formatter &out,
437 const std::string &parcelObj,
438 const std::string &argName,
439 bool isReader) const {
440 if (mElementType->isCompoundType()) {
Andreas Huber4c865b72016-09-14 15:26:27 -0700441 std::string extra; // unused, because CompoundType leaves this empty.
442
Andreas Huberf630bc82016-09-09 14:52:25 -0700443 if (isReader) {
Andreas Huber4c865b72016-09-14 15:26:27 -0700444 out << mElementType->getJavaType(&extra)
Andreas Huberf630bc82016-09-09 14:52:25 -0700445 << ".readVectorFromParcel("
446 << parcelObj
447 << ");\n";
448 } else {
Andreas Huber4c865b72016-09-14 15:26:27 -0700449 out << mElementType->getJavaType(&extra)
Andreas Huberf630bc82016-09-09 14:52:25 -0700450 << ".writeVectorToParcel("
451 << parcelObj
452 << ", "
453 << argName
454 << ");\n";
455 }
456
457 return;
458 }
459
Andreas Huber1b6822b2016-10-18 09:28:40 -0700460 if (mElementType->isArray()) {
461 if (isReader) {
462 std::string extra;
463 out << " new "
464 << getJavaType(&extra, false /* forInitializer */)
465 << "();\n";
466 }
467
468 out << "{\n";
469 out.indent();
470
471 out << "HwBlob _hidl_blob = ";
472
473 if (isReader) {
474 out << parcelObj
475 << ".readBuffer();\n";
476 } else {
477 size_t align, size;
478 getAlignmentAndSize(&align, &size);
479
480 out << "new HwBlob("
481 << size
482 << " /* size */);\n";
483 }
484
485 emitJavaFieldReaderWriter(
486 out,
487 0 /* depth */,
488 parcelObj,
489 "_hidl_blob",
490 argName,
491 "0 /* offset */",
492 isReader);
493
494 if (!isReader) {
495 out << parcelObj << ".writeBuffer(_hidl_blob);\n";
496 };
497
498 out.unindent();
499 out << "}\n";
500
501 return;
502 }
503
Andreas Huberf630bc82016-09-09 14:52:25 -0700504 emitJavaReaderWriterWithSuffix(
505 out,
506 parcelObj,
507 argName,
508 isReader,
509 mElementType->getJavaSuffix() + "Vector",
510 "" /* extra */);
511}
512
Andreas Huber85eabdb2016-08-25 11:24:49 -0700513void VectorType::emitJavaFieldInitializer(
514 Formatter &out, const std::string &fieldName) const {
Andreas Huberf03332a2016-09-22 15:35:43 -0700515 std::string extra;
Andreas Huber1b6822b2016-10-18 09:28:40 -0700516 std::string javaType = getJavaType(&extra, false /* forInitializer */);
Andreas Huberf03332a2016-09-22 15:35:43 -0700517
Andreas Huber1b6822b2016-10-18 09:28:40 -0700518 out << "final "
519 << javaType
520 << " "
Andreas Huber85eabdb2016-08-25 11:24:49 -0700521 << fieldName
Andreas Huber1b6822b2016-10-18 09:28:40 -0700522 << " = new "
523 << javaType
524 << "();\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700525}
526
527void VectorType::emitJavaFieldReaderWriter(
528 Formatter &out,
Andreas Huber4c865b72016-09-14 15:26:27 -0700529 size_t depth,
Andreas Huber709b62d2016-09-19 11:21:18 -0700530 const std::string &parcelName,
Andreas Huber85eabdb2016-08-25 11:24:49 -0700531 const std::string &blobName,
532 const std::string &fieldName,
533 const std::string &offset,
534 bool isReader) const {
Andreas Huberf630bc82016-09-09 14:52:25 -0700535 VectorType::EmitJavaFieldReaderWriterForElementType(
Andreas Huber709b62d2016-09-19 11:21:18 -0700536 out,
537 depth,
538 mElementType,
539 parcelName,
540 blobName,
541 fieldName,
542 offset,
543 isReader);
Andreas Huberf630bc82016-09-09 14:52:25 -0700544}
545
546// static
547void VectorType::EmitJavaFieldReaderWriterForElementType(
548 Formatter &out,
Andreas Huber4c865b72016-09-14 15:26:27 -0700549 size_t depth,
Andreas Huberf630bc82016-09-09 14:52:25 -0700550 const Type *elementType,
Andreas Huber709b62d2016-09-19 11:21:18 -0700551 const std::string &parcelName,
Andreas Huberf630bc82016-09-09 14:52:25 -0700552 const std::string &blobName,
553 const std::string &fieldName,
554 const std::string &offset,
555 bool isReader) {
Andreas Huber85eabdb2016-08-25 11:24:49 -0700556 if (isReader) {
557 out << "{\n";
558 out.indent();
559
Andreas Huber709b62d2016-09-19 11:21:18 -0700560 out << "HwBlob childBlob = "
561 << parcelName
562 << ".readEmbeddedBuffer(\n";
563
Andreas Huber85eabdb2016-08-25 11:24:49 -0700564 out.indent();
565 out.indent();
566
567 out << blobName
568 << ".handle(),\n"
569 << offset
570 << " + 0 /* offsetof(hidl_vec<T>, mBuffer) */);\n\n";
571
572 out.unindent();
573 out.unindent();
574
575 out << fieldName << ".clear();\n";
576 out << "long _hidl_vec_size = "
577 << blobName
578 << ".getInt64("
579 << offset
580 << " + 8 /* offsetof(hidl_vec<T>, mSize) */);\n";
581
Andreas Huber4c865b72016-09-14 15:26:27 -0700582 std::string iteratorName = "_hidl_index_" + std::to_string(depth);
583
584 out << "for (int "
585 << iteratorName
586 << " = 0; "
587 << iteratorName
588 << " < _hidl_vec_size; "
589 << "++"
590 << iteratorName
591 << ") {\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700592
593 out.indent();
594
Andreas Huberf630bc82016-09-09 14:52:25 -0700595 elementType->emitJavaFieldInitializer(out, "_hidl_vec_element");
Andreas Huber85eabdb2016-08-25 11:24:49 -0700596
597 size_t elementAlign, elementSize;
Andreas Huberf630bc82016-09-09 14:52:25 -0700598 elementType->getAlignmentAndSize(&elementAlign, &elementSize);
Andreas Huber85eabdb2016-08-25 11:24:49 -0700599
Andreas Huberf630bc82016-09-09 14:52:25 -0700600 elementType->emitJavaFieldReaderWriter(
Andreas Huber85eabdb2016-08-25 11:24:49 -0700601 out,
Andreas Huber4c865b72016-09-14 15:26:27 -0700602 depth + 1,
Andreas Huber709b62d2016-09-19 11:21:18 -0700603 parcelName,
Andreas Huber85eabdb2016-08-25 11:24:49 -0700604 "childBlob",
605 "_hidl_vec_element",
Andreas Huber4c865b72016-09-14 15:26:27 -0700606 iteratorName + " * " + std::to_string(elementSize),
Andreas Huber85eabdb2016-08-25 11:24:49 -0700607 true /* isReader */);
608
Andreas Huber1b6822b2016-10-18 09:28:40 -0700609 out << fieldName
610 << ".add(_hidl_vec_element);\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700611
612 out.unindent();
613
614 out << "}\n";
615
616 out.unindent();
617 out << "}\n";
618
619 return;
620 }
621
622 out << "{\n";
623 out.indent();
624
625 out << "long _hidl_vec_size = "
626 << fieldName
627 << ".size();\n";
628
629 out << blobName
630 << ".putInt64("
631 << offset
632 << " + 8 /* offsetof(hidl_vec<T>, mSize) */, _hidl_vec_size);\n";
633
634 out << blobName
635 << ".putBool("
636 << offset
637 << " + 16 /* offsetof(hidl_vec<T>, mOwnsBuffer) */, false);\n";
638
639 size_t elementAlign, elementSize;
Andreas Huberf630bc82016-09-09 14:52:25 -0700640 elementType->getAlignmentAndSize(&elementAlign, &elementSize);
Andreas Huber85eabdb2016-08-25 11:24:49 -0700641
642 // XXX make HwBlob constructor take a long instead of an int?
643 out << "HwBlob childBlob = new HwBlob((int)(_hidl_vec_size * "
644 << elementSize
645 << "));\n";
646
Andreas Huber4c865b72016-09-14 15:26:27 -0700647 std::string iteratorName = "_hidl_index_" + std::to_string(depth);
648
649 out << "for (int "
650 << iteratorName
651 << " = 0; "
652 << iteratorName
653 << " < _hidl_vec_size; "
654 << "++"
655 << iteratorName
656 << ") {\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700657
658 out.indent();
659
Andreas Huberf630bc82016-09-09 14:52:25 -0700660 elementType->emitJavaFieldReaderWriter(
Andreas Huber85eabdb2016-08-25 11:24:49 -0700661 out,
Andreas Huber4c865b72016-09-14 15:26:27 -0700662 depth + 1,
Andreas Huber709b62d2016-09-19 11:21:18 -0700663 parcelName,
Andreas Huber85eabdb2016-08-25 11:24:49 -0700664 "childBlob",
Andreas Huberf1abc2a2016-09-28 09:14:43 -0700665 fieldName + ".get(" + iteratorName + ")",
Andreas Huber4c865b72016-09-14 15:26:27 -0700666 iteratorName + " * " + std::to_string(elementSize),
Andreas Huber85eabdb2016-08-25 11:24:49 -0700667 false /* isReader */);
668
669 out.unindent();
670
671 out << "}\n";
672
673 out << blobName
674 << ".putBlob("
675 << offset
676 << " + 0 /* offsetof(hidl_vec<T>, mBuffer) */, childBlob);\n";
677
678 out.unindent();
679 out << "}\n";
680}
681
Andreas Huber881227d2016-08-02 14:20:21 -0700682bool VectorType::needsEmbeddedReadWrite() const {
683 return true;
684}
685
Yifan Hongbf459bc2016-08-23 16:50:37 -0700686bool VectorType::needsResolveReferences() const {
687 return mElementType->needsResolveReferences();
688}
689
Andreas Huber881227d2016-08-02 14:20:21 -0700690bool VectorType::resultNeedsDeref() const {
Andreas Huber86a112b2016-10-19 14:25:16 -0700691 return !isVectorOfBinders();
Andreas Huber881227d2016-08-02 14:20:21 -0700692}
693
Zhuoyao Zhang5158db42016-08-10 10:25:20 -0700694status_t VectorType::emitVtsTypeDeclarations(Formatter &out) const {
Zhuoyao Zhangc5ea9f52016-10-06 15:05:39 -0700695 out << "type: " << getVtsType() << "\n";
696 out << "vector_value: {\n";
Zhuoyao Zhang5158db42016-08-10 10:25:20 -0700697 out.indent();
698 status_t err = mElementType->emitVtsTypeDeclarations(out);
699 if (err != OK) {
700 return err;
701 }
702 out.unindent();
703 out << "}\n";
704 return OK;
705}
706
Zhuoyao Zhang864c7712016-08-16 15:35:28 -0700707status_t VectorType::emitVtsAttributeType(Formatter &out) const {
708 out << "type: TYPE_VECTOR\n" << "vector_value: {\n";
709 out.indent();
710 status_t status = mElementType->emitVtsAttributeType(out);
711 if (status != OK) {
712 return status;
713 }
714 out.unindent();
715 out << "}\n";
716 return OK;
717}
718
Andreas Huber70a59e12016-08-16 12:57:01 -0700719bool VectorType::isJavaCompatible() const {
Andreas Huberf03332a2016-09-22 15:35:43 -0700720 if (!mElementType->isJavaCompatible()) {
721 return false;
722 }
723
724 if (mElementType->isArray()) {
725 return static_cast<ArrayType *>(mElementType)->countDimensions() == 1;
726 }
727
Andreas Huber1b6822b2016-10-18 09:28:40 -0700728 if (mElementType->isVector()) {
729 return false;
730 }
731
Andreas Huber86a112b2016-10-19 14:25:16 -0700732 if (isVectorOfBinders()) {
733 return false;
734 }
735
Andreas Huberf03332a2016-09-22 15:35:43 -0700736 return true;
Andreas Huber70a59e12016-08-16 12:57:01 -0700737}
738
Andreas Huber85eabdb2016-08-25 11:24:49 -0700739void VectorType::getAlignmentAndSize(size_t *align, size_t *size) const {
740 *align = 8; // hidl_vec<T>
741 *size = 24;
742}
743
Andreas Huberc9410c72016-07-28 12:18:40 -0700744} // namespace android
745