blob: 99449abb52ec57fe36e1679253d2afea959f1ba5 [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
Andreas Huber4c865b72016-09-14 15:26:27 -070067std::string VectorType::getJavaType(
68 std::string *extra, bool /* forInitializer */) const {
Andreas Huber1b6822b2016-10-18 09:28:40 -070069 extra->clear();
Andreas Huber4c865b72016-09-14 15:26:27 -070070
71 std::string elementExtra;
Andreas Huber1b6822b2016-10-18 09:28:40 -070072 std::string elementJavaType = mElementType->getJavaType(&elementExtra);
73
74 CHECK(mElementType->isArray() || elementExtra.empty());
75
76 return "ArrayList<"
77 + (mElementType->isArray()
78 ? elementJavaType : mElementType->getJavaWrapperType())
79 + elementExtra
80 + ">";
Andreas Huber2831d512016-08-15 09:33:47 -070081}
82
Zhuoyao Zhangc5ea9f52016-10-06 15:05:39 -070083std::string VectorType::getVtsType() const {
84 return "TYPE_VECTOR";
85}
86
Andreas Huber881227d2016-08-02 14:20:21 -070087void VectorType::emitReaderWriter(
88 Formatter &out,
89 const std::string &name,
90 const std::string &parcelObj,
91 bool parcelObjIsPointer,
92 bool isReader,
93 ErrorMode mode) const {
Andreas Huber86a112b2016-10-19 14:25:16 -070094 if (isVectorOfBinders()) {
95 emitReaderWriterForVectorOfBinders(
96 out, name, parcelObj, parcelObjIsPointer, isReader, mode);
97
98 return;
99 }
100
Yifan Hong3b320f82016-11-01 15:15:54 -0700101 std::string baseType = mElementType->getCppStackType();
Andreas Huber881227d2016-08-02 14:20:21 -0700102
Iliyan Malchev549e2592016-08-10 08:59:12 -0700103 const std::string parentName = "_hidl_" + name + "_parent";
Andreas Huber881227d2016-08-02 14:20:21 -0700104
105 out << "size_t " << parentName << ";\n\n";
106
107 const std::string parcelObjDeref =
108 parcelObj + (parcelObjIsPointer ? "->" : ".");
109
110 if (isReader) {
111 out << name
Andreas Huber8a82ff72016-08-04 10:29:39 -0700112 << " = (const ::android::hardware::hidl_vec<"
Andreas Huber881227d2016-08-02 14:20:21 -0700113 << baseType
114 << "> *)"
115 << parcelObjDeref
116 << "readBuffer(&"
117 << parentName
118 << ");\n\n";
119
120 out << "if (" << name << " == nullptr) {\n";
121
122 out.indent();
123
Iliyan Malchev549e2592016-08-10 08:59:12 -0700124 out << "_hidl_err = ::android::UNKNOWN_ERROR;\n";
Andreas Huber881227d2016-08-02 14:20:21 -0700125 handleError2(out, mode);
126
127 out.unindent();
128 out << "}\n\n";
129 } else {
Iliyan Malchev549e2592016-08-10 08:59:12 -0700130 out << "_hidl_err = "
Andreas Huber881227d2016-08-02 14:20:21 -0700131 << parcelObjDeref
132 << "writeBuffer(&"
133 << name
134 << ", sizeof("
135 << name
136 << "), &"
137 << parentName
138 << ");\n";
139
140 handleError(out, mode);
141 }
142
143 emitReaderWriterEmbedded(
144 out,
Andreas Huberf9d49f12016-09-12 14:58:36 -0700145 0 /* depth */,
Andreas Huber881227d2016-08-02 14:20:21 -0700146 name,
Yifan Hongbe2a3732016-10-05 13:33:41 -0700147 name /* sanitizedName */ ,
Andreas Huber881227d2016-08-02 14:20:21 -0700148 isReader /* nameIsPointer */,
149 parcelObj,
150 parcelObjIsPointer,
151 isReader,
152 mode,
153 parentName,
154 "0 /* parentOffset */");
155}
156
Andreas Huber86a112b2016-10-19 14:25:16 -0700157void VectorType::emitReaderWriterForVectorOfBinders(
158 Formatter &out,
159 const std::string &name,
160 const std::string &parcelObj,
161 bool parcelObjIsPointer,
162 bool isReader,
163 ErrorMode mode) const {
164 const std::string parcelObjDeref =
165 parcelObj + (parcelObjIsPointer ? "->" : ".");
166
167 if (isReader) {
168 out << "{\n";
169 out.indent();
170
171 const std::string sizeName = "_hidl_" + name + "_size";
172
173 out << "uint64_t "
174 << sizeName
175 << ";\n";
176
177 out << "_hidl_err = "
178 << parcelObjDeref
179 << "readUint64(&"
180 << sizeName
181 << ");\n";
182
183 handleError(out, mode);
184
185 out << name
186 << ".resize("
187 << sizeName
188 << ");\n\n"
189 << "for (size_t _hidl_index = 0; _hidl_index < "
190 << sizeName
191 << "; ++_hidl_index) {\n";
192
193 out.indent();
194
Yifan Hong3b320f82016-11-01 15:15:54 -0700195 out << mElementType->getCppStackType(true /* specifyNamespaces */)
Andreas Huber86a112b2016-10-19 14:25:16 -0700196 << " _hidl_binder;\n";
197
198 mElementType->emitReaderWriter(
199 out,
200 "_hidl_binder",
201 parcelObj,
202 parcelObjIsPointer,
203 isReader,
204 mode);
205
206 out << name
207 << "[_hidl_index] = _hidl_binder;\n";
208
209 out.unindent();
210 out << "}\n";
211
212 out.unindent();
213 out << "}\n";
214 } else {
215 out << "_hidl_err = "
216 << parcelObjDeref
217 << "writeUint64("
218 << name
219 << ".size());\n";
220
221 handleError(out, mode);
222
223 out << "for (size_t _hidl_index = 0; _hidl_index < "
224 << name
225 << ".size(); ++_hidl_index) {\n";
226
227 out.indent();
228
229 mElementType->emitReaderWriter(
230 out,
231 name + "[_hidl_index]",
232 parcelObj,
233 parcelObjIsPointer,
234 isReader,
235 mode);
236
237 out.unindent();
238 out << "}\n";
239 }
240}
241
Andreas Huber881227d2016-08-02 14:20:21 -0700242void VectorType::emitReaderWriterEmbedded(
243 Formatter &out,
Andreas Huberf9d49f12016-09-12 14:58:36 -0700244 size_t depth,
Andreas Huber881227d2016-08-02 14:20:21 -0700245 const std::string &name,
Yifan Hongbe2a3732016-10-05 13:33:41 -0700246 const std::string &sanitizedName,
Andreas Huber881227d2016-08-02 14:20:21 -0700247 bool nameIsPointer,
248 const std::string &parcelObj,
249 bool parcelObjIsPointer,
250 bool isReader,
251 ErrorMode mode,
252 const std::string &parentName,
253 const std::string &offsetText) const {
Yifan Hong3b320f82016-11-01 15:15:54 -0700254 std::string baseType = getCppStackType();
Andreas Huber881227d2016-08-02 14:20:21 -0700255
Yifan Hongbe2a3732016-10-05 13:33:41 -0700256 const std::string childName = "_hidl_" + sanitizedName + "_child";
Andreas Huber881227d2016-08-02 14:20:21 -0700257 out << "size_t " << childName << ";\n\n";
258
259 emitReaderWriterEmbeddedForTypeName(
260 out,
261 name,
262 nameIsPointer,
263 parcelObj,
264 parcelObjIsPointer,
265 isReader,
266 mode,
267 parentName,
268 offsetText,
269 baseType,
270 childName);
271
272 if (!mElementType->needsEmbeddedReadWrite()) {
273 return;
274 }
275
276 const std::string nameDeref = name + (nameIsPointer ? "->" : ".");
277
Yifan Hong3b320f82016-11-01 15:15:54 -0700278 baseType = mElementType->getCppStackType();
Andreas Huber881227d2016-08-02 14:20:21 -0700279
Andreas Huberf9d49f12016-09-12 14:58:36 -0700280 std::string iteratorName = "_hidl_index_" + std::to_string(depth);
281
282 out << "for (size_t "
283 << iteratorName
284 << " = 0; "
285 << iteratorName
286 << " < "
Andreas Huber881227d2016-08-02 14:20:21 -0700287 << nameDeref
Andreas Huberf9d49f12016-09-12 14:58:36 -0700288 << "size(); ++"
289 << iteratorName
290 << ") {\n";
Andreas Huber881227d2016-08-02 14:20:21 -0700291
292 out.indent();
293
294 mElementType->emitReaderWriterEmbedded(
295 out,
Andreas Huberf9d49f12016-09-12 14:58:36 -0700296 depth + 1,
297 (nameIsPointer ? "(*" + name + ")" : name)
298 + "[" + iteratorName + "]",
Yifan Hongbe2a3732016-10-05 13:33:41 -0700299 sanitizedName + (nameIsPointer ? "_deref" : "") + "_indexed",
Andreas Huber881227d2016-08-02 14:20:21 -0700300 false /* nameIsPointer */,
301 parcelObj,
302 parcelObjIsPointer,
303 isReader,
304 mode,
305 childName,
Yifan Hong3b320f82016-11-01 15:15:54 -0700306 iteratorName + " * sizeof(" + baseType + ")");
Andreas Huber881227d2016-08-02 14:20:21 -0700307
308 out.unindent();
309
310 out << "}\n\n";
311}
312
Yifan Hongbf459bc2016-08-23 16:50:37 -0700313void VectorType::emitResolveReferences(
314 Formatter &out,
315 const std::string &name,
316 bool nameIsPointer,
317 const std::string &parcelObj,
318 bool parcelObjIsPointer,
319 bool isReader,
320 ErrorMode mode) const {
321 emitResolveReferencesEmbeddedHelper(
322 out,
323 0, /* depth */
324 name,
325 name /* sanitizedName */,
326 nameIsPointer,
327 parcelObj,
328 parcelObjIsPointer,
329 isReader,
330 mode,
331 "_hidl_" + name + "_child",
332 "0 /* parentOffset */");
333}
334
335void VectorType::emitResolveReferencesEmbedded(
336 Formatter &out,
337 size_t depth,
338 const std::string &name,
339 const std::string &sanitizedName,
340 bool nameIsPointer,
341 const std::string &parcelObj,
342 bool parcelObjIsPointer,
343 bool isReader,
344 ErrorMode mode,
345 const std::string & /* parentName */,
346 const std::string & /* offsetText */) const {
347 emitResolveReferencesEmbeddedHelper(
348 out, depth, name, sanitizedName, nameIsPointer, parcelObj,
349 parcelObjIsPointer, isReader, mode, "", "");
350}
351
Yifan Hong00f47172016-09-30 14:40:45 -0700352bool VectorType::useParentInEmitResolveReferencesEmbedded() const {
353 // parentName and offsetText is not used in emitResolveReferencesEmbedded
354 return false;
355}
356
Yifan Hongbf459bc2016-08-23 16:50:37 -0700357void VectorType::emitResolveReferencesEmbeddedHelper(
358 Formatter &out,
359 size_t depth,
360 const std::string &name,
361 const std::string &sanitizedName,
362 bool nameIsPointer,
363 const std::string &parcelObj,
364 bool parcelObjIsPointer,
365 bool isReader,
366 ErrorMode mode,
367 const std::string &childName,
368 const std::string &childOffsetText) const {
369 CHECK(needsResolveReferences() && mElementType->needsResolveReferences());
370
371 const std::string nameDeref = name + (nameIsPointer ? "->" : ".");
Yifan Hong3b320f82016-11-01 15:15:54 -0700372 std::string elementType = mElementType->getCppStackType();
Yifan Hongbf459bc2016-08-23 16:50:37 -0700373
374 std::string myChildName = childName, myChildOffset = childOffsetText;
375
376 if(myChildName.empty() && myChildOffset.empty()) {
377 myChildName = "_hidl_" + sanitizedName + "_child";
378 myChildOffset = "0";
379
380 out << "size_t " << myChildName << ";\n";
381 out << "_hidl_err = " << nameDeref << "findInParcel("
382 << (parcelObjIsPointer ? "*" : "") << parcelObj << ", "
383 << "&" << myChildName
384 << ");\n";
385
386 handleError(out, mode);
387 }
388
389 std::string iteratorName = "_hidl_index_" + std::to_string(depth);
390
391 out << "for (size_t "
392 << iteratorName
393 << " = 0; "
394 << iteratorName
395 << " < "
396 << nameDeref
397 << "size(); ++"
398 << iteratorName
399 << ") {\n";
400
401 out.indent();
402
403 mElementType->emitResolveReferencesEmbedded(
404 out,
405 depth + 1,
406 (nameIsPointer ? "(*" + name + ")" : name) + "[" + iteratorName + "]",
407 sanitizedName + (nameIsPointer ? "_deref" : "") + "_indexed",
408 false /* nameIsPointer */,
409 parcelObj,
410 parcelObjIsPointer,
411 isReader,
412 mode,
413 myChildName,
414 myChildOffset + " + " +
Yifan Hong3b320f82016-11-01 15:15:54 -0700415 iteratorName + " * sizeof(" + elementType + ")");
Yifan Hongbf459bc2016-08-23 16:50:37 -0700416
417 out.unindent();
418
419 out << "}\n\n";
420}
421
Andreas Huberf630bc82016-09-09 14:52:25 -0700422void VectorType::emitJavaReaderWriter(
423 Formatter &out,
424 const std::string &parcelObj,
425 const std::string &argName,
426 bool isReader) const {
427 if (mElementType->isCompoundType()) {
Andreas Huber4c865b72016-09-14 15:26:27 -0700428 std::string extra; // unused, because CompoundType leaves this empty.
429
Andreas Huberf630bc82016-09-09 14:52:25 -0700430 if (isReader) {
Andreas Huber4c865b72016-09-14 15:26:27 -0700431 out << mElementType->getJavaType(&extra)
Andreas Huberf630bc82016-09-09 14:52:25 -0700432 << ".readVectorFromParcel("
433 << parcelObj
434 << ");\n";
435 } else {
Andreas Huber4c865b72016-09-14 15:26:27 -0700436 out << mElementType->getJavaType(&extra)
Andreas Huberf630bc82016-09-09 14:52:25 -0700437 << ".writeVectorToParcel("
438 << parcelObj
439 << ", "
440 << argName
441 << ");\n";
442 }
443
444 return;
445 }
446
Andreas Huber1b6822b2016-10-18 09:28:40 -0700447 if (mElementType->isArray()) {
448 if (isReader) {
449 std::string extra;
450 out << " new "
451 << getJavaType(&extra, false /* forInitializer */)
452 << "();\n";
453 }
454
455 out << "{\n";
456 out.indent();
457
458 out << "HwBlob _hidl_blob = ";
459
460 if (isReader) {
461 out << parcelObj
462 << ".readBuffer();\n";
463 } else {
464 size_t align, size;
465 getAlignmentAndSize(&align, &size);
466
467 out << "new HwBlob("
468 << size
469 << " /* size */);\n";
470 }
471
472 emitJavaFieldReaderWriter(
473 out,
474 0 /* depth */,
475 parcelObj,
476 "_hidl_blob",
477 argName,
478 "0 /* offset */",
479 isReader);
480
481 if (!isReader) {
482 out << parcelObj << ".writeBuffer(_hidl_blob);\n";
483 };
484
485 out.unindent();
486 out << "}\n";
487
488 return;
489 }
490
Andreas Huberf630bc82016-09-09 14:52:25 -0700491 emitJavaReaderWriterWithSuffix(
492 out,
493 parcelObj,
494 argName,
495 isReader,
496 mElementType->getJavaSuffix() + "Vector",
497 "" /* extra */);
498}
499
Andreas Huber85eabdb2016-08-25 11:24:49 -0700500void VectorType::emitJavaFieldInitializer(
501 Formatter &out, const std::string &fieldName) const {
Andreas Huberf03332a2016-09-22 15:35:43 -0700502 std::string extra;
Andreas Huber1b6822b2016-10-18 09:28:40 -0700503 std::string javaType = getJavaType(&extra, false /* forInitializer */);
Andreas Huberf03332a2016-09-22 15:35:43 -0700504
Andreas Huber1b6822b2016-10-18 09:28:40 -0700505 out << "final "
506 << javaType
507 << " "
Andreas Huber85eabdb2016-08-25 11:24:49 -0700508 << fieldName
Andreas Huber1b6822b2016-10-18 09:28:40 -0700509 << " = new "
510 << javaType
511 << "();\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700512}
513
514void VectorType::emitJavaFieldReaderWriter(
515 Formatter &out,
Andreas Huber4c865b72016-09-14 15:26:27 -0700516 size_t depth,
Andreas Huber709b62d2016-09-19 11:21:18 -0700517 const std::string &parcelName,
Andreas Huber85eabdb2016-08-25 11:24:49 -0700518 const std::string &blobName,
519 const std::string &fieldName,
520 const std::string &offset,
521 bool isReader) const {
Andreas Huberf630bc82016-09-09 14:52:25 -0700522 VectorType::EmitJavaFieldReaderWriterForElementType(
Andreas Huber709b62d2016-09-19 11:21:18 -0700523 out,
524 depth,
525 mElementType,
526 parcelName,
527 blobName,
528 fieldName,
529 offset,
530 isReader);
Andreas Huberf630bc82016-09-09 14:52:25 -0700531}
532
533// static
534void VectorType::EmitJavaFieldReaderWriterForElementType(
535 Formatter &out,
Andreas Huber4c865b72016-09-14 15:26:27 -0700536 size_t depth,
Andreas Huberf630bc82016-09-09 14:52:25 -0700537 const Type *elementType,
Andreas Huber709b62d2016-09-19 11:21:18 -0700538 const std::string &parcelName,
Andreas Huberf630bc82016-09-09 14:52:25 -0700539 const std::string &blobName,
540 const std::string &fieldName,
541 const std::string &offset,
542 bool isReader) {
Andreas Huber85eabdb2016-08-25 11:24:49 -0700543 if (isReader) {
544 out << "{\n";
545 out.indent();
546
Andreas Huber709b62d2016-09-19 11:21:18 -0700547 out << "HwBlob childBlob = "
548 << parcelName
549 << ".readEmbeddedBuffer(\n";
550
Andreas Huber85eabdb2016-08-25 11:24:49 -0700551 out.indent();
552 out.indent();
553
554 out << blobName
555 << ".handle(),\n"
556 << offset
557 << " + 0 /* offsetof(hidl_vec<T>, mBuffer) */);\n\n";
558
559 out.unindent();
560 out.unindent();
561
562 out << fieldName << ".clear();\n";
563 out << "long _hidl_vec_size = "
564 << blobName
565 << ".getInt64("
566 << offset
567 << " + 8 /* offsetof(hidl_vec<T>, mSize) */);\n";
568
Andreas Huber4c865b72016-09-14 15:26:27 -0700569 std::string iteratorName = "_hidl_index_" + std::to_string(depth);
570
571 out << "for (int "
572 << iteratorName
573 << " = 0; "
574 << iteratorName
575 << " < _hidl_vec_size; "
576 << "++"
577 << iteratorName
578 << ") {\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700579
580 out.indent();
581
Andreas Huberf630bc82016-09-09 14:52:25 -0700582 elementType->emitJavaFieldInitializer(out, "_hidl_vec_element");
Andreas Huber85eabdb2016-08-25 11:24:49 -0700583
584 size_t elementAlign, elementSize;
Andreas Huberf630bc82016-09-09 14:52:25 -0700585 elementType->getAlignmentAndSize(&elementAlign, &elementSize);
Andreas Huber85eabdb2016-08-25 11:24:49 -0700586
Andreas Huberf630bc82016-09-09 14:52:25 -0700587 elementType->emitJavaFieldReaderWriter(
Andreas Huber85eabdb2016-08-25 11:24:49 -0700588 out,
Andreas Huber4c865b72016-09-14 15:26:27 -0700589 depth + 1,
Andreas Huber709b62d2016-09-19 11:21:18 -0700590 parcelName,
Andreas Huber85eabdb2016-08-25 11:24:49 -0700591 "childBlob",
592 "_hidl_vec_element",
Andreas Huber4c865b72016-09-14 15:26:27 -0700593 iteratorName + " * " + std::to_string(elementSize),
Andreas Huber85eabdb2016-08-25 11:24:49 -0700594 true /* isReader */);
595
Andreas Huber1b6822b2016-10-18 09:28:40 -0700596 out << fieldName
597 << ".add(_hidl_vec_element);\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700598
599 out.unindent();
600
601 out << "}\n";
602
603 out.unindent();
604 out << "}\n";
605
606 return;
607 }
608
609 out << "{\n";
610 out.indent();
611
612 out << "long _hidl_vec_size = "
613 << fieldName
614 << ".size();\n";
615
616 out << blobName
617 << ".putInt64("
618 << offset
619 << " + 8 /* offsetof(hidl_vec<T>, mSize) */, _hidl_vec_size);\n";
620
621 out << blobName
622 << ".putBool("
623 << offset
624 << " + 16 /* offsetof(hidl_vec<T>, mOwnsBuffer) */, false);\n";
625
626 size_t elementAlign, elementSize;
Andreas Huberf630bc82016-09-09 14:52:25 -0700627 elementType->getAlignmentAndSize(&elementAlign, &elementSize);
Andreas Huber85eabdb2016-08-25 11:24:49 -0700628
629 // XXX make HwBlob constructor take a long instead of an int?
630 out << "HwBlob childBlob = new HwBlob((int)(_hidl_vec_size * "
631 << elementSize
632 << "));\n";
633
Andreas Huber4c865b72016-09-14 15:26:27 -0700634 std::string iteratorName = "_hidl_index_" + std::to_string(depth);
635
636 out << "for (int "
637 << iteratorName
638 << " = 0; "
639 << iteratorName
640 << " < _hidl_vec_size; "
641 << "++"
642 << iteratorName
643 << ") {\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700644
645 out.indent();
646
Andreas Huberf630bc82016-09-09 14:52:25 -0700647 elementType->emitJavaFieldReaderWriter(
Andreas Huber85eabdb2016-08-25 11:24:49 -0700648 out,
Andreas Huber4c865b72016-09-14 15:26:27 -0700649 depth + 1,
Andreas Huber709b62d2016-09-19 11:21:18 -0700650 parcelName,
Andreas Huber85eabdb2016-08-25 11:24:49 -0700651 "childBlob",
Andreas Huberf1abc2a2016-09-28 09:14:43 -0700652 fieldName + ".get(" + iteratorName + ")",
Andreas Huber4c865b72016-09-14 15:26:27 -0700653 iteratorName + " * " + std::to_string(elementSize),
Andreas Huber85eabdb2016-08-25 11:24:49 -0700654 false /* isReader */);
655
656 out.unindent();
657
658 out << "}\n";
659
660 out << blobName
661 << ".putBlob("
662 << offset
663 << " + 0 /* offsetof(hidl_vec<T>, mBuffer) */, childBlob);\n";
664
665 out.unindent();
666 out << "}\n";
667}
668
Andreas Huber881227d2016-08-02 14:20:21 -0700669bool VectorType::needsEmbeddedReadWrite() const {
670 return true;
671}
672
Yifan Hongbf459bc2016-08-23 16:50:37 -0700673bool VectorType::needsResolveReferences() const {
674 return mElementType->needsResolveReferences();
675}
676
Andreas Huber881227d2016-08-02 14:20:21 -0700677bool VectorType::resultNeedsDeref() const {
Andreas Huber86a112b2016-10-19 14:25:16 -0700678 return !isVectorOfBinders();
Andreas Huber881227d2016-08-02 14:20:21 -0700679}
680
Zhuoyao Zhang5158db42016-08-10 10:25:20 -0700681status_t VectorType::emitVtsTypeDeclarations(Formatter &out) const {
Zhuoyao Zhangc5ea9f52016-10-06 15:05:39 -0700682 out << "type: " << getVtsType() << "\n";
683 out << "vector_value: {\n";
Zhuoyao Zhang5158db42016-08-10 10:25:20 -0700684 out.indent();
685 status_t err = mElementType->emitVtsTypeDeclarations(out);
686 if (err != OK) {
687 return err;
688 }
689 out.unindent();
690 out << "}\n";
691 return OK;
692}
693
Zhuoyao Zhang864c7712016-08-16 15:35:28 -0700694status_t VectorType::emitVtsAttributeType(Formatter &out) const {
695 out << "type: TYPE_VECTOR\n" << "vector_value: {\n";
696 out.indent();
697 status_t status = mElementType->emitVtsAttributeType(out);
698 if (status != OK) {
699 return status;
700 }
701 out.unindent();
702 out << "}\n";
703 return OK;
704}
705
Andreas Huber70a59e12016-08-16 12:57:01 -0700706bool VectorType::isJavaCompatible() const {
Andreas Huberf03332a2016-09-22 15:35:43 -0700707 if (!mElementType->isJavaCompatible()) {
708 return false;
709 }
710
711 if (mElementType->isArray()) {
712 return static_cast<ArrayType *>(mElementType)->countDimensions() == 1;
713 }
714
Andreas Huber1b6822b2016-10-18 09:28:40 -0700715 if (mElementType->isVector()) {
716 return false;
717 }
718
Andreas Huber86a112b2016-10-19 14:25:16 -0700719 if (isVectorOfBinders()) {
720 return false;
721 }
722
Andreas Huberf03332a2016-09-22 15:35:43 -0700723 return true;
Andreas Huber70a59e12016-08-16 12:57:01 -0700724}
725
Andreas Huber85eabdb2016-08-25 11:24:49 -0700726void VectorType::getAlignmentAndSize(size_t *align, size_t *size) const {
727 *align = 8; // hidl_vec<T>
728 *size = 24;
729}
730
Andreas Huberc9410c72016-07-28 12:18:40 -0700731} // namespace android
732