blob: ba4ec6b9b7689e6d72170d5b48b6ed0a44149531 [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) {
Martijn Coenenac587892016-11-17 15:14:19 +010050 case StorageMode_Compound:
Andreas Huber881227d2016-08-02 14:20:21 -070051 case StorageMode_Stack:
52 return base;
53
54 case StorageMode_Argument:
55 return "const " + base + "&";
56
57 case StorageMode_Result:
Andreas Huber86a112b2016-10-19 14:25:16 -070058 {
59 if (isVectorOfBinders()) {
60 return base;
61 }
62
Andreas Huber881227d2016-08-02 14:20:21 -070063 return "const " + base + "*";
Andreas Huber86a112b2016-10-19 14:25:16 -070064 }
Andreas Huber881227d2016-08-02 14:20:21 -070065 }
66}
67
Yifan Hong4ed13472016-11-02 10:44:11 -070068std::string VectorType::getJavaType(bool /* forInitializer */) const {
Andreas Huber4c865b72016-09-14 15:26:27 -070069
Yifan Hong4ed13472016-11-02 10:44:11 -070070 std::string elementJavaType;
71 if (mElementType->isArray()) {
72 elementJavaType = mElementType->getJavaType();
73 } else {
74 elementJavaType = mElementType->getJavaWrapperType();
75 }
Andreas Huber1b6822b2016-10-18 09:28:40 -070076
Yifan Hong1af73532016-11-09 14:32:58 -080077 return "java.util.ArrayList<"
Yifan Hong4ed13472016-11-02 10:44:11 -070078 + elementJavaType
Andreas Huber1b6822b2016-10-18 09:28:40 -070079 + ">";
Andreas Huber2831d512016-08-15 09:33:47 -070080}
81
Zhuoyao Zhangc5ea9f52016-10-06 15:05:39 -070082std::string VectorType::getVtsType() const {
83 return "TYPE_VECTOR";
84}
85
Andreas Huber881227d2016-08-02 14:20:21 -070086void VectorType::emitReaderWriter(
87 Formatter &out,
88 const std::string &name,
89 const std::string &parcelObj,
90 bool parcelObjIsPointer,
91 bool isReader,
92 ErrorMode mode) const {
Andreas Huber86a112b2016-10-19 14:25:16 -070093 if (isVectorOfBinders()) {
94 emitReaderWriterForVectorOfBinders(
95 out, name, parcelObj, parcelObjIsPointer, isReader, mode);
96
97 return;
98 }
99
Yifan Hong3b320f82016-11-01 15:15:54 -0700100 std::string baseType = mElementType->getCppStackType();
Andreas Huber881227d2016-08-02 14:20:21 -0700101
Iliyan Malchev549e2592016-08-10 08:59:12 -0700102 const std::string parentName = "_hidl_" + name + "_parent";
Andreas Huber881227d2016-08-02 14:20:21 -0700103
104 out << "size_t " << parentName << ";\n\n";
105
106 const std::string parcelObjDeref =
107 parcelObj + (parcelObjIsPointer ? "->" : ".");
108
109 if (isReader) {
110 out << name
Andreas Huber8a82ff72016-08-04 10:29:39 -0700111 << " = (const ::android::hardware::hidl_vec<"
Andreas Huber881227d2016-08-02 14:20:21 -0700112 << baseType
113 << "> *)"
114 << parcelObjDeref
115 << "readBuffer(&"
116 << parentName
117 << ");\n\n";
118
119 out << "if (" << name << " == nullptr) {\n";
120
121 out.indent();
122
Iliyan Malchev549e2592016-08-10 08:59:12 -0700123 out << "_hidl_err = ::android::UNKNOWN_ERROR;\n";
Andreas Huber881227d2016-08-02 14:20:21 -0700124 handleError2(out, mode);
125
126 out.unindent();
127 out << "}\n\n";
128 } else {
Iliyan Malchev549e2592016-08-10 08:59:12 -0700129 out << "_hidl_err = "
Andreas Huber881227d2016-08-02 14:20:21 -0700130 << parcelObjDeref
131 << "writeBuffer(&"
132 << name
133 << ", sizeof("
134 << name
135 << "), &"
136 << parentName
137 << ");\n";
138
139 handleError(out, mode);
140 }
141
142 emitReaderWriterEmbedded(
143 out,
Andreas Huberf9d49f12016-09-12 14:58:36 -0700144 0 /* depth */,
Andreas Huber881227d2016-08-02 14:20:21 -0700145 name,
Yifan Hongbe2a3732016-10-05 13:33:41 -0700146 name /* sanitizedName */ ,
Andreas Huber881227d2016-08-02 14:20:21 -0700147 isReader /* nameIsPointer */,
148 parcelObj,
149 parcelObjIsPointer,
150 isReader,
151 mode,
152 parentName,
153 "0 /* parentOffset */");
154}
155
Andreas Huber86a112b2016-10-19 14:25:16 -0700156void VectorType::emitReaderWriterForVectorOfBinders(
157 Formatter &out,
158 const std::string &name,
159 const std::string &parcelObj,
160 bool parcelObjIsPointer,
161 bool isReader,
162 ErrorMode mode) const {
163 const std::string parcelObjDeref =
164 parcelObj + (parcelObjIsPointer ? "->" : ".");
165
166 if (isReader) {
167 out << "{\n";
168 out.indent();
169
170 const std::string sizeName = "_hidl_" + name + "_size";
171
172 out << "uint64_t "
173 << sizeName
174 << ";\n";
175
176 out << "_hidl_err = "
177 << parcelObjDeref
178 << "readUint64(&"
179 << sizeName
180 << ");\n";
181
182 handleError(out, mode);
183
184 out << name
185 << ".resize("
186 << sizeName
187 << ");\n\n"
188 << "for (size_t _hidl_index = 0; _hidl_index < "
189 << sizeName
190 << "; ++_hidl_index) {\n";
191
192 out.indent();
193
Yifan Hong3b320f82016-11-01 15:15:54 -0700194 out << mElementType->getCppStackType(true /* specifyNamespaces */)
Andreas Huber86a112b2016-10-19 14:25:16 -0700195 << " _hidl_binder;\n";
196
197 mElementType->emitReaderWriter(
198 out,
199 "_hidl_binder",
200 parcelObj,
201 parcelObjIsPointer,
202 isReader,
203 mode);
204
205 out << name
206 << "[_hidl_index] = _hidl_binder;\n";
207
208 out.unindent();
209 out << "}\n";
210
211 out.unindent();
212 out << "}\n";
213 } else {
214 out << "_hidl_err = "
215 << parcelObjDeref
216 << "writeUint64("
217 << name
218 << ".size());\n";
219
220 handleError(out, mode);
221
222 out << "for (size_t _hidl_index = 0; _hidl_index < "
223 << name
224 << ".size(); ++_hidl_index) {\n";
225
226 out.indent();
227
228 mElementType->emitReaderWriter(
229 out,
230 name + "[_hidl_index]",
231 parcelObj,
232 parcelObjIsPointer,
233 isReader,
234 mode);
235
236 out.unindent();
237 out << "}\n";
238 }
239}
240
Andreas Huber881227d2016-08-02 14:20:21 -0700241void VectorType::emitReaderWriterEmbedded(
242 Formatter &out,
Andreas Huberf9d49f12016-09-12 14:58:36 -0700243 size_t depth,
Andreas Huber881227d2016-08-02 14:20:21 -0700244 const std::string &name,
Yifan Hongbe2a3732016-10-05 13:33:41 -0700245 const std::string &sanitizedName,
Andreas Huber881227d2016-08-02 14:20:21 -0700246 bool nameIsPointer,
247 const std::string &parcelObj,
248 bool parcelObjIsPointer,
249 bool isReader,
250 ErrorMode mode,
251 const std::string &parentName,
252 const std::string &offsetText) const {
Yifan Hong3b320f82016-11-01 15:15:54 -0700253 std::string baseType = getCppStackType();
Andreas Huber881227d2016-08-02 14:20:21 -0700254
Yifan Hongbe2a3732016-10-05 13:33:41 -0700255 const std::string childName = "_hidl_" + sanitizedName + "_child";
Andreas Huber881227d2016-08-02 14:20:21 -0700256 out << "size_t " << childName << ";\n\n";
257
258 emitReaderWriterEmbeddedForTypeName(
259 out,
260 name,
261 nameIsPointer,
262 parcelObj,
263 parcelObjIsPointer,
264 isReader,
265 mode,
266 parentName,
267 offsetText,
268 baseType,
Yifan Hong244e82d2016-11-11 11:13:57 -0800269 childName,
270 "::android::hardware");
Andreas Huber881227d2016-08-02 14:20:21 -0700271
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 Hong859e53f2016-11-14 19:08:24 -0800372 const std::string nameDerefed = (nameIsPointer ? "*" : "") + name;
Yifan Hong3b320f82016-11-01 15:15:54 -0700373 std::string elementType = mElementType->getCppStackType();
Yifan Hongbf459bc2016-08-23 16:50:37 -0700374
375 std::string myChildName = childName, myChildOffset = childOffsetText;
376
377 if(myChildName.empty() && myChildOffset.empty()) {
378 myChildName = "_hidl_" + sanitizedName + "_child";
379 myChildOffset = "0";
380
381 out << "size_t " << myChildName << ";\n";
Yifan Hong859e53f2016-11-14 19:08:24 -0800382 out << "_hidl_err = ::android::hardware::findInParcel("
383 << nameDerefed << ", "
Yifan Hongbf459bc2016-08-23 16:50:37 -0700384 << (parcelObjIsPointer ? "*" : "") << parcelObj << ", "
385 << "&" << myChildName
386 << ");\n";
387
388 handleError(out, mode);
389 }
390
391 std::string iteratorName = "_hidl_index_" + std::to_string(depth);
392
393 out << "for (size_t "
394 << iteratorName
395 << " = 0; "
396 << iteratorName
397 << " < "
398 << nameDeref
399 << "size(); ++"
400 << iteratorName
401 << ") {\n";
402
403 out.indent();
404
405 mElementType->emitResolveReferencesEmbedded(
406 out,
407 depth + 1,
408 (nameIsPointer ? "(*" + name + ")" : name) + "[" + iteratorName + "]",
409 sanitizedName + (nameIsPointer ? "_deref" : "") + "_indexed",
410 false /* nameIsPointer */,
411 parcelObj,
412 parcelObjIsPointer,
413 isReader,
414 mode,
415 myChildName,
416 myChildOffset + " + " +
Yifan Hong3b320f82016-11-01 15:15:54 -0700417 iteratorName + " * sizeof(" + elementType + ")");
Yifan Hongbf459bc2016-08-23 16:50:37 -0700418
419 out.unindent();
420
421 out << "}\n\n";
422}
423
Andreas Huberf630bc82016-09-09 14:52:25 -0700424void VectorType::emitJavaReaderWriter(
425 Formatter &out,
426 const std::string &parcelObj,
427 const std::string &argName,
428 bool isReader) const {
429 if (mElementType->isCompoundType()) {
Andreas Huber4c865b72016-09-14 15:26:27 -0700430
Andreas Huberf630bc82016-09-09 14:52:25 -0700431 if (isReader) {
Yifan Hong4ed13472016-11-02 10:44:11 -0700432 out << mElementType->getJavaType()
Andreas Huberf630bc82016-09-09 14:52:25 -0700433 << ".readVectorFromParcel("
434 << parcelObj
435 << ");\n";
436 } else {
Yifan Hong4ed13472016-11-02 10:44:11 -0700437 out << mElementType->getJavaType()
Andreas Huberf630bc82016-09-09 14:52:25 -0700438 << ".writeVectorToParcel("
439 << parcelObj
440 << ", "
441 << argName
442 << ");\n";
443 }
444
445 return;
446 }
447
Andreas Huber1b6822b2016-10-18 09:28:40 -0700448 if (mElementType->isArray()) {
449 if (isReader) {
Andreas Huber1b6822b2016-10-18 09:28:40 -0700450 out << " new "
Yifan Hong4ed13472016-11-02 10:44:11 -0700451 << getJavaType(false /* forInitializer */)
Andreas Huber1b6822b2016-10-18 09:28:40 -0700452 << "();\n";
453 }
454
455 out << "{\n";
456 out.indent();
457
Yifan Hong1af73532016-11-09 14:32:58 -0800458 out << "android.os.HwBlob _hidl_blob = ";
Andreas Huber1b6822b2016-10-18 09:28:40 -0700459
460 if (isReader) {
461 out << parcelObj
462 << ".readBuffer();\n";
463 } else {
464 size_t align, size;
465 getAlignmentAndSize(&align, &size);
466
Yifan Hong1af73532016-11-09 14:32:58 -0800467 out << "new android.os.HwBlob("
Andreas Huber1b6822b2016-10-18 09:28:40 -0700468 << 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 {
Yifan Hong4ed13472016-11-02 10:44:11 -0700502 std::string javaType = getJavaType(false /* forInitializer */);
Andreas Huberf03332a2016-09-22 15:35:43 -0700503
Andreas Huber1b6822b2016-10-18 09:28:40 -0700504 out << "final "
505 << javaType
506 << " "
Andreas Huber85eabdb2016-08-25 11:24:49 -0700507 << fieldName
Andreas Huber1b6822b2016-10-18 09:28:40 -0700508 << " = new "
509 << javaType
510 << "();\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700511}
512
513void VectorType::emitJavaFieldReaderWriter(
514 Formatter &out,
Andreas Huber4c865b72016-09-14 15:26:27 -0700515 size_t depth,
Andreas Huber709b62d2016-09-19 11:21:18 -0700516 const std::string &parcelName,
Andreas Huber85eabdb2016-08-25 11:24:49 -0700517 const std::string &blobName,
518 const std::string &fieldName,
519 const std::string &offset,
520 bool isReader) const {
Andreas Huberf630bc82016-09-09 14:52:25 -0700521 VectorType::EmitJavaFieldReaderWriterForElementType(
Andreas Huber709b62d2016-09-19 11:21:18 -0700522 out,
523 depth,
524 mElementType,
525 parcelName,
526 blobName,
527 fieldName,
528 offset,
529 isReader);
Andreas Huberf630bc82016-09-09 14:52:25 -0700530}
531
532// static
533void VectorType::EmitJavaFieldReaderWriterForElementType(
534 Formatter &out,
Andreas Huber4c865b72016-09-14 15:26:27 -0700535 size_t depth,
Andreas Huberf630bc82016-09-09 14:52:25 -0700536 const Type *elementType,
Andreas Huber709b62d2016-09-19 11:21:18 -0700537 const std::string &parcelName,
Andreas Huberf630bc82016-09-09 14:52:25 -0700538 const std::string &blobName,
539 const std::string &fieldName,
540 const std::string &offset,
541 bool isReader) {
Andreas Huber85eabdb2016-08-25 11:24:49 -0700542 if (isReader) {
543 out << "{\n";
544 out.indent();
545
Yifan Hong1af73532016-11-09 14:32:58 -0800546 out << "android.os.HwBlob childBlob = "
Andreas Huber709b62d2016-09-19 11:21:18 -0700547 << parcelName
548 << ".readEmbeddedBuffer(\n";
549
Andreas Huber85eabdb2016-08-25 11:24:49 -0700550 out.indent();
551 out.indent();
552
553 out << blobName
554 << ".handle(),\n"
555 << offset
556 << " + 0 /* offsetof(hidl_vec<T>, mBuffer) */);\n\n";
557
558 out.unindent();
559 out.unindent();
560
561 out << fieldName << ".clear();\n";
Pavel Maltsevcfa79342016-11-21 22:50:18 -0800562 out << "int _hidl_vec_size = "
Andreas Huber85eabdb2016-08-25 11:24:49 -0700563 << blobName
Pavel Maltsevcfa79342016-11-21 22:50:18 -0800564 << ".getInt32("
Andreas Huber85eabdb2016-08-25 11:24:49 -0700565 << offset
566 << " + 8 /* offsetof(hidl_vec<T>, mSize) */);\n";
567
Andreas Huber4c865b72016-09-14 15:26:27 -0700568 std::string iteratorName = "_hidl_index_" + std::to_string(depth);
569
570 out << "for (int "
571 << iteratorName
572 << " = 0; "
573 << iteratorName
574 << " < _hidl_vec_size; "
575 << "++"
576 << iteratorName
577 << ") {\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700578
579 out.indent();
580
Andreas Huberf630bc82016-09-09 14:52:25 -0700581 elementType->emitJavaFieldInitializer(out, "_hidl_vec_element");
Andreas Huber85eabdb2016-08-25 11:24:49 -0700582
583 size_t elementAlign, elementSize;
Andreas Huberf630bc82016-09-09 14:52:25 -0700584 elementType->getAlignmentAndSize(&elementAlign, &elementSize);
Andreas Huber85eabdb2016-08-25 11:24:49 -0700585
Andreas Huberf630bc82016-09-09 14:52:25 -0700586 elementType->emitJavaFieldReaderWriter(
Andreas Huber85eabdb2016-08-25 11:24:49 -0700587 out,
Andreas Huber4c865b72016-09-14 15:26:27 -0700588 depth + 1,
Andreas Huber709b62d2016-09-19 11:21:18 -0700589 parcelName,
Andreas Huber85eabdb2016-08-25 11:24:49 -0700590 "childBlob",
591 "_hidl_vec_element",
Andreas Huber4c865b72016-09-14 15:26:27 -0700592 iteratorName + " * " + std::to_string(elementSize),
Andreas Huber85eabdb2016-08-25 11:24:49 -0700593 true /* isReader */);
594
Andreas Huber1b6822b2016-10-18 09:28:40 -0700595 out << fieldName
596 << ".add(_hidl_vec_element);\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700597
598 out.unindent();
599
600 out << "}\n";
601
602 out.unindent();
603 out << "}\n";
604
605 return;
606 }
607
608 out << "{\n";
609 out.indent();
610
Pavel Maltsevcfa79342016-11-21 22:50:18 -0800611 out << "int _hidl_vec_size = "
Andreas Huber85eabdb2016-08-25 11:24:49 -0700612 << fieldName
613 << ".size();\n";
614
615 out << blobName
Pavel Maltsevcfa79342016-11-21 22:50:18 -0800616 << ".putInt32("
Andreas Huber85eabdb2016-08-25 11:24:49 -0700617 << offset
618 << " + 8 /* offsetof(hidl_vec<T>, mSize) */, _hidl_vec_size);\n";
619
620 out << blobName
621 << ".putBool("
622 << offset
Pavel Maltsevcfa79342016-11-21 22:50:18 -0800623 << " + 12 /* offsetof(hidl_vec<T>, mOwnsBuffer) */, false);\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700624
625 size_t elementAlign, elementSize;
Andreas Huberf630bc82016-09-09 14:52:25 -0700626 elementType->getAlignmentAndSize(&elementAlign, &elementSize);
Andreas Huber85eabdb2016-08-25 11:24:49 -0700627
628 // XXX make HwBlob constructor take a long instead of an int?
Yifan Hong1af73532016-11-09 14:32:58 -0800629 out << "android.os.HwBlob childBlob = new android.os.HwBlob((int)(_hidl_vec_size * "
Andreas Huber85eabdb2016-08-25 11:24:49 -0700630 << elementSize
631 << "));\n";
632
Andreas Huber4c865b72016-09-14 15:26:27 -0700633 std::string iteratorName = "_hidl_index_" + std::to_string(depth);
634
635 out << "for (int "
636 << iteratorName
637 << " = 0; "
638 << iteratorName
639 << " < _hidl_vec_size; "
640 << "++"
641 << iteratorName
642 << ") {\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700643
644 out.indent();
645
Andreas Huberf630bc82016-09-09 14:52:25 -0700646 elementType->emitJavaFieldReaderWriter(
Andreas Huber85eabdb2016-08-25 11:24:49 -0700647 out,
Andreas Huber4c865b72016-09-14 15:26:27 -0700648 depth + 1,
Andreas Huber709b62d2016-09-19 11:21:18 -0700649 parcelName,
Andreas Huber85eabdb2016-08-25 11:24:49 -0700650 "childBlob",
Andreas Huberf1abc2a2016-09-28 09:14:43 -0700651 fieldName + ".get(" + iteratorName + ")",
Andreas Huber4c865b72016-09-14 15:26:27 -0700652 iteratorName + " * " + std::to_string(elementSize),
Andreas Huber85eabdb2016-08-25 11:24:49 -0700653 false /* isReader */);
654
655 out.unindent();
656
657 out << "}\n";
658
659 out << blobName
660 << ".putBlob("
661 << offset
662 << " + 0 /* offsetof(hidl_vec<T>, mBuffer) */, childBlob);\n";
663
664 out.unindent();
665 out << "}\n";
666}
667
Andreas Huber881227d2016-08-02 14:20:21 -0700668bool VectorType::needsEmbeddedReadWrite() const {
669 return true;
670}
671
Yifan Hongbf459bc2016-08-23 16:50:37 -0700672bool VectorType::needsResolveReferences() const {
673 return mElementType->needsResolveReferences();
674}
675
Andreas Huber881227d2016-08-02 14:20:21 -0700676bool VectorType::resultNeedsDeref() const {
Andreas Huber86a112b2016-10-19 14:25:16 -0700677 return !isVectorOfBinders();
Andreas Huber881227d2016-08-02 14:20:21 -0700678}
679
Zhuoyao Zhang5158db42016-08-10 10:25:20 -0700680status_t VectorType::emitVtsTypeDeclarations(Formatter &out) const {
Zhuoyao Zhangc5ea9f52016-10-06 15:05:39 -0700681 out << "type: " << getVtsType() << "\n";
682 out << "vector_value: {\n";
Zhuoyao Zhang5158db42016-08-10 10:25:20 -0700683 out.indent();
684 status_t err = mElementType->emitVtsTypeDeclarations(out);
685 if (err != OK) {
686 return err;
687 }
688 out.unindent();
689 out << "}\n";
690 return OK;
691}
692
Zhuoyao Zhang864c7712016-08-16 15:35:28 -0700693status_t VectorType::emitVtsAttributeType(Formatter &out) const {
694 out << "type: TYPE_VECTOR\n" << "vector_value: {\n";
695 out.indent();
696 status_t status = mElementType->emitVtsAttributeType(out);
697 if (status != OK) {
698 return status;
699 }
700 out.unindent();
701 out << "}\n";
702 return OK;
703}
704
Andreas Huber70a59e12016-08-16 12:57:01 -0700705bool VectorType::isJavaCompatible() const {
Andreas Huberf03332a2016-09-22 15:35:43 -0700706 if (!mElementType->isJavaCompatible()) {
707 return false;
708 }
709
710 if (mElementType->isArray()) {
711 return static_cast<ArrayType *>(mElementType)->countDimensions() == 1;
712 }
713
Andreas Huber1b6822b2016-10-18 09:28:40 -0700714 if (mElementType->isVector()) {
715 return false;
716 }
717
Andreas Huber86a112b2016-10-19 14:25:16 -0700718 if (isVectorOfBinders()) {
719 return false;
720 }
721
Andreas Huberf03332a2016-09-22 15:35:43 -0700722 return true;
Andreas Huber70a59e12016-08-16 12:57:01 -0700723}
724
Andreas Huber85eabdb2016-08-25 11:24:49 -0700725void VectorType::getAlignmentAndSize(size_t *align, size_t *size) const {
726 *align = 8; // hidl_vec<T>
Pavel Maltsevcfa79342016-11-21 22:50:18 -0800727 *size = 16;
Andreas Huber85eabdb2016-08-25 11:24:49 -0700728}
729
Andreas Huberc9410c72016-07-28 12:18:40 -0700730} // namespace android
731