blob: da09884bd04b80c1a0668829728b154739afac91 [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
Yifan Hong1af73532016-11-09 14:32:58 -080076 return "java.util.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,
Yifan Hong244e82d2016-11-11 11:13:57 -0800268 childName,
269 "::android::hardware");
Andreas Huber881227d2016-08-02 14:20:21 -0700270
271 if (!mElementType->needsEmbeddedReadWrite()) {
272 return;
273 }
274
275 const std::string nameDeref = name + (nameIsPointer ? "->" : ".");
276
Yifan Hong3b320f82016-11-01 15:15:54 -0700277 baseType = mElementType->getCppStackType();
Andreas Huber881227d2016-08-02 14:20:21 -0700278
Andreas Huberf9d49f12016-09-12 14:58:36 -0700279 std::string iteratorName = "_hidl_index_" + std::to_string(depth);
280
281 out << "for (size_t "
282 << iteratorName
283 << " = 0; "
284 << iteratorName
285 << " < "
Andreas Huber881227d2016-08-02 14:20:21 -0700286 << nameDeref
Andreas Huberf9d49f12016-09-12 14:58:36 -0700287 << "size(); ++"
288 << iteratorName
289 << ") {\n";
Andreas Huber881227d2016-08-02 14:20:21 -0700290
291 out.indent();
292
293 mElementType->emitReaderWriterEmbedded(
294 out,
Andreas Huberf9d49f12016-09-12 14:58:36 -0700295 depth + 1,
296 (nameIsPointer ? "(*" + name + ")" : name)
297 + "[" + iteratorName + "]",
Yifan Hongbe2a3732016-10-05 13:33:41 -0700298 sanitizedName + (nameIsPointer ? "_deref" : "") + "_indexed",
Andreas Huber881227d2016-08-02 14:20:21 -0700299 false /* nameIsPointer */,
300 parcelObj,
301 parcelObjIsPointer,
302 isReader,
303 mode,
304 childName,
Yifan Hong3b320f82016-11-01 15:15:54 -0700305 iteratorName + " * sizeof(" + baseType + ")");
Andreas Huber881227d2016-08-02 14:20:21 -0700306
307 out.unindent();
308
309 out << "}\n\n";
310}
311
Yifan Hongbf459bc2016-08-23 16:50:37 -0700312void VectorType::emitResolveReferences(
313 Formatter &out,
314 const std::string &name,
315 bool nameIsPointer,
316 const std::string &parcelObj,
317 bool parcelObjIsPointer,
318 bool isReader,
319 ErrorMode mode) const {
320 emitResolveReferencesEmbeddedHelper(
321 out,
322 0, /* depth */
323 name,
324 name /* sanitizedName */,
325 nameIsPointer,
326 parcelObj,
327 parcelObjIsPointer,
328 isReader,
329 mode,
330 "_hidl_" + name + "_child",
331 "0 /* parentOffset */");
332}
333
334void VectorType::emitResolveReferencesEmbedded(
335 Formatter &out,
336 size_t depth,
337 const std::string &name,
338 const std::string &sanitizedName,
339 bool nameIsPointer,
340 const std::string &parcelObj,
341 bool parcelObjIsPointer,
342 bool isReader,
343 ErrorMode mode,
344 const std::string & /* parentName */,
345 const std::string & /* offsetText */) const {
346 emitResolveReferencesEmbeddedHelper(
347 out, depth, name, sanitizedName, nameIsPointer, parcelObj,
348 parcelObjIsPointer, isReader, mode, "", "");
349}
350
Yifan Hong00f47172016-09-30 14:40:45 -0700351bool VectorType::useParentInEmitResolveReferencesEmbedded() const {
352 // parentName and offsetText is not used in emitResolveReferencesEmbedded
353 return false;
354}
355
Yifan Hongbf459bc2016-08-23 16:50:37 -0700356void VectorType::emitResolveReferencesEmbeddedHelper(
357 Formatter &out,
358 size_t depth,
359 const std::string &name,
360 const std::string &sanitizedName,
361 bool nameIsPointer,
362 const std::string &parcelObj,
363 bool parcelObjIsPointer,
364 bool isReader,
365 ErrorMode mode,
366 const std::string &childName,
367 const std::string &childOffsetText) const {
368 CHECK(needsResolveReferences() && mElementType->needsResolveReferences());
369
370 const std::string nameDeref = name + (nameIsPointer ? "->" : ".");
Yifan Hong859e53f2016-11-14 19:08:24 -0800371 const std::string nameDerefed = (nameIsPointer ? "*" : "") + name;
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";
Yifan Hong859e53f2016-11-14 19:08:24 -0800381 out << "_hidl_err = ::android::hardware::findInParcel("
382 << nameDerefed << ", "
Yifan Hongbf459bc2016-08-23 16:50:37 -0700383 << (parcelObjIsPointer ? "*" : "") << parcelObj << ", "
384 << "&" << myChildName
385 << ");\n";
386
387 handleError(out, mode);
388 }
389
390 std::string iteratorName = "_hidl_index_" + std::to_string(depth);
391
392 out << "for (size_t "
393 << iteratorName
394 << " = 0; "
395 << iteratorName
396 << " < "
397 << nameDeref
398 << "size(); ++"
399 << iteratorName
400 << ") {\n";
401
402 out.indent();
403
404 mElementType->emitResolveReferencesEmbedded(
405 out,
406 depth + 1,
407 (nameIsPointer ? "(*" + name + ")" : name) + "[" + iteratorName + "]",
408 sanitizedName + (nameIsPointer ? "_deref" : "") + "_indexed",
409 false /* nameIsPointer */,
410 parcelObj,
411 parcelObjIsPointer,
412 isReader,
413 mode,
414 myChildName,
415 myChildOffset + " + " +
Yifan Hong3b320f82016-11-01 15:15:54 -0700416 iteratorName + " * sizeof(" + elementType + ")");
Yifan Hongbf459bc2016-08-23 16:50:37 -0700417
418 out.unindent();
419
420 out << "}\n\n";
421}
422
Andreas Huberf630bc82016-09-09 14:52:25 -0700423void VectorType::emitJavaReaderWriter(
424 Formatter &out,
425 const std::string &parcelObj,
426 const std::string &argName,
427 bool isReader) const {
428 if (mElementType->isCompoundType()) {
Andreas Huber4c865b72016-09-14 15:26:27 -0700429
Andreas Huberf630bc82016-09-09 14:52:25 -0700430 if (isReader) {
Yifan Hong4ed13472016-11-02 10:44:11 -0700431 out << mElementType->getJavaType()
Andreas Huberf630bc82016-09-09 14:52:25 -0700432 << ".readVectorFromParcel("
433 << parcelObj
434 << ");\n";
435 } else {
Yifan Hong4ed13472016-11-02 10:44:11 -0700436 out << mElementType->getJavaType()
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) {
Andreas Huber1b6822b2016-10-18 09:28:40 -0700449 out << " new "
Yifan Hong4ed13472016-11-02 10:44:11 -0700450 << getJavaType(false /* forInitializer */)
Andreas Huber1b6822b2016-10-18 09:28:40 -0700451 << "();\n";
452 }
453
454 out << "{\n";
455 out.indent();
456
Yifan Hong1af73532016-11-09 14:32:58 -0800457 out << "android.os.HwBlob _hidl_blob = ";
Andreas Huber1b6822b2016-10-18 09:28:40 -0700458
459 if (isReader) {
460 out << parcelObj
461 << ".readBuffer();\n";
462 } else {
463 size_t align, size;
464 getAlignmentAndSize(&align, &size);
465
Yifan Hong1af73532016-11-09 14:32:58 -0800466 out << "new android.os.HwBlob("
Andreas Huber1b6822b2016-10-18 09:28:40 -0700467 << size
468 << " /* size */);\n";
469 }
470
471 emitJavaFieldReaderWriter(
472 out,
473 0 /* depth */,
474 parcelObj,
475 "_hidl_blob",
476 argName,
477 "0 /* offset */",
478 isReader);
479
480 if (!isReader) {
481 out << parcelObj << ".writeBuffer(_hidl_blob);\n";
482 };
483
484 out.unindent();
485 out << "}\n";
486
487 return;
488 }
489
Andreas Huberf630bc82016-09-09 14:52:25 -0700490 emitJavaReaderWriterWithSuffix(
491 out,
492 parcelObj,
493 argName,
494 isReader,
495 mElementType->getJavaSuffix() + "Vector",
496 "" /* extra */);
497}
498
Andreas Huber85eabdb2016-08-25 11:24:49 -0700499void VectorType::emitJavaFieldInitializer(
500 Formatter &out, const std::string &fieldName) const {
Yifan Hong4ed13472016-11-02 10:44:11 -0700501 std::string javaType = getJavaType(false /* forInitializer */);
Andreas Huberf03332a2016-09-22 15:35:43 -0700502
Andreas Huber1b6822b2016-10-18 09:28:40 -0700503 out << "final "
504 << javaType
505 << " "
Andreas Huber85eabdb2016-08-25 11:24:49 -0700506 << fieldName
Andreas Huber1b6822b2016-10-18 09:28:40 -0700507 << " = new "
508 << javaType
509 << "();\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700510}
511
512void VectorType::emitJavaFieldReaderWriter(
513 Formatter &out,
Andreas Huber4c865b72016-09-14 15:26:27 -0700514 size_t depth,
Andreas Huber709b62d2016-09-19 11:21:18 -0700515 const std::string &parcelName,
Andreas Huber85eabdb2016-08-25 11:24:49 -0700516 const std::string &blobName,
517 const std::string &fieldName,
518 const std::string &offset,
519 bool isReader) const {
Andreas Huberf630bc82016-09-09 14:52:25 -0700520 VectorType::EmitJavaFieldReaderWriterForElementType(
Andreas Huber709b62d2016-09-19 11:21:18 -0700521 out,
522 depth,
523 mElementType,
524 parcelName,
525 blobName,
526 fieldName,
527 offset,
528 isReader);
Andreas Huberf630bc82016-09-09 14:52:25 -0700529}
530
531// static
532void VectorType::EmitJavaFieldReaderWriterForElementType(
533 Formatter &out,
Andreas Huber4c865b72016-09-14 15:26:27 -0700534 size_t depth,
Andreas Huberf630bc82016-09-09 14:52:25 -0700535 const Type *elementType,
Andreas Huber709b62d2016-09-19 11:21:18 -0700536 const std::string &parcelName,
Andreas Huberf630bc82016-09-09 14:52:25 -0700537 const std::string &blobName,
538 const std::string &fieldName,
539 const std::string &offset,
540 bool isReader) {
Andreas Huber85eabdb2016-08-25 11:24:49 -0700541 if (isReader) {
542 out << "{\n";
543 out.indent();
544
Yifan Hong1af73532016-11-09 14:32:58 -0800545 out << "android.os.HwBlob childBlob = "
Andreas Huber709b62d2016-09-19 11:21:18 -0700546 << parcelName
547 << ".readEmbeddedBuffer(\n";
548
Andreas Huber85eabdb2016-08-25 11:24:49 -0700549 out.indent();
550 out.indent();
551
552 out << blobName
553 << ".handle(),\n"
554 << offset
555 << " + 0 /* offsetof(hidl_vec<T>, mBuffer) */);\n\n";
556
557 out.unindent();
558 out.unindent();
559
560 out << fieldName << ".clear();\n";
561 out << "long _hidl_vec_size = "
562 << blobName
563 << ".getInt64("
564 << offset
565 << " + 8 /* offsetof(hidl_vec<T>, mSize) */);\n";
566
Andreas Huber4c865b72016-09-14 15:26:27 -0700567 std::string iteratorName = "_hidl_index_" + std::to_string(depth);
568
569 out << "for (int "
570 << iteratorName
571 << " = 0; "
572 << iteratorName
573 << " < _hidl_vec_size; "
574 << "++"
575 << iteratorName
576 << ") {\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700577
578 out.indent();
579
Andreas Huberf630bc82016-09-09 14:52:25 -0700580 elementType->emitJavaFieldInitializer(out, "_hidl_vec_element");
Andreas Huber85eabdb2016-08-25 11:24:49 -0700581
582 size_t elementAlign, elementSize;
Andreas Huberf630bc82016-09-09 14:52:25 -0700583 elementType->getAlignmentAndSize(&elementAlign, &elementSize);
Andreas Huber85eabdb2016-08-25 11:24:49 -0700584
Andreas Huberf630bc82016-09-09 14:52:25 -0700585 elementType->emitJavaFieldReaderWriter(
Andreas Huber85eabdb2016-08-25 11:24:49 -0700586 out,
Andreas Huber4c865b72016-09-14 15:26:27 -0700587 depth + 1,
Andreas Huber709b62d2016-09-19 11:21:18 -0700588 parcelName,
Andreas Huber85eabdb2016-08-25 11:24:49 -0700589 "childBlob",
590 "_hidl_vec_element",
Andreas Huber4c865b72016-09-14 15:26:27 -0700591 iteratorName + " * " + std::to_string(elementSize),
Andreas Huber85eabdb2016-08-25 11:24:49 -0700592 true /* isReader */);
593
Andreas Huber1b6822b2016-10-18 09:28:40 -0700594 out << fieldName
595 << ".add(_hidl_vec_element);\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700596
597 out.unindent();
598
599 out << "}\n";
600
601 out.unindent();
602 out << "}\n";
603
604 return;
605 }
606
607 out << "{\n";
608 out.indent();
609
610 out << "long _hidl_vec_size = "
611 << fieldName
612 << ".size();\n";
613
614 out << blobName
615 << ".putInt64("
616 << offset
617 << " + 8 /* offsetof(hidl_vec<T>, mSize) */, _hidl_vec_size);\n";
618
619 out << blobName
620 << ".putBool("
621 << offset
622 << " + 16 /* offsetof(hidl_vec<T>, mOwnsBuffer) */, false);\n";
623
624 size_t elementAlign, elementSize;
Andreas Huberf630bc82016-09-09 14:52:25 -0700625 elementType->getAlignmentAndSize(&elementAlign, &elementSize);
Andreas Huber85eabdb2016-08-25 11:24:49 -0700626
627 // XXX make HwBlob constructor take a long instead of an int?
Yifan Hong1af73532016-11-09 14:32:58 -0800628 out << "android.os.HwBlob childBlob = new android.os.HwBlob((int)(_hidl_vec_size * "
Andreas Huber85eabdb2016-08-25 11:24:49 -0700629 << elementSize
630 << "));\n";
631
Andreas Huber4c865b72016-09-14 15:26:27 -0700632 std::string iteratorName = "_hidl_index_" + std::to_string(depth);
633
634 out << "for (int "
635 << iteratorName
636 << " = 0; "
637 << iteratorName
638 << " < _hidl_vec_size; "
639 << "++"
640 << iteratorName
641 << ") {\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700642
643 out.indent();
644
Andreas Huberf630bc82016-09-09 14:52:25 -0700645 elementType->emitJavaFieldReaderWriter(
Andreas Huber85eabdb2016-08-25 11:24:49 -0700646 out,
Andreas Huber4c865b72016-09-14 15:26:27 -0700647 depth + 1,
Andreas Huber709b62d2016-09-19 11:21:18 -0700648 parcelName,
Andreas Huber85eabdb2016-08-25 11:24:49 -0700649 "childBlob",
Andreas Huberf1abc2a2016-09-28 09:14:43 -0700650 fieldName + ".get(" + iteratorName + ")",
Andreas Huber4c865b72016-09-14 15:26:27 -0700651 iteratorName + " * " + std::to_string(elementSize),
Andreas Huber85eabdb2016-08-25 11:24:49 -0700652 false /* isReader */);
653
654 out.unindent();
655
656 out << "}\n";
657
658 out << blobName
659 << ".putBlob("
660 << offset
661 << " + 0 /* offsetof(hidl_vec<T>, mBuffer) */, childBlob);\n";
662
663 out.unindent();
664 out << "}\n";
665}
666
Andreas Huber881227d2016-08-02 14:20:21 -0700667bool VectorType::needsEmbeddedReadWrite() const {
668 return true;
669}
670
Yifan Hongbf459bc2016-08-23 16:50:37 -0700671bool VectorType::needsResolveReferences() const {
672 return mElementType->needsResolveReferences();
673}
674
Andreas Huber881227d2016-08-02 14:20:21 -0700675bool VectorType::resultNeedsDeref() const {
Andreas Huber86a112b2016-10-19 14:25:16 -0700676 return !isVectorOfBinders();
Andreas Huber881227d2016-08-02 14:20:21 -0700677}
678
Zhuoyao Zhang5158db42016-08-10 10:25:20 -0700679status_t VectorType::emitVtsTypeDeclarations(Formatter &out) const {
Zhuoyao Zhangc5ea9f52016-10-06 15:05:39 -0700680 out << "type: " << getVtsType() << "\n";
681 out << "vector_value: {\n";
Zhuoyao Zhang5158db42016-08-10 10:25:20 -0700682 out.indent();
683 status_t err = mElementType->emitVtsTypeDeclarations(out);
684 if (err != OK) {
685 return err;
686 }
687 out.unindent();
688 out << "}\n";
689 return OK;
690}
691
Zhuoyao Zhang864c7712016-08-16 15:35:28 -0700692status_t VectorType::emitVtsAttributeType(Formatter &out) const {
693 out << "type: TYPE_VECTOR\n" << "vector_value: {\n";
694 out.indent();
695 status_t status = mElementType->emitVtsAttributeType(out);
696 if (status != OK) {
697 return status;
698 }
699 out.unindent();
700 out << "}\n";
701 return OK;
702}
703
Andreas Huber70a59e12016-08-16 12:57:01 -0700704bool VectorType::isJavaCompatible() const {
Andreas Huberf03332a2016-09-22 15:35:43 -0700705 if (!mElementType->isJavaCompatible()) {
706 return false;
707 }
708
709 if (mElementType->isArray()) {
710 return static_cast<ArrayType *>(mElementType)->countDimensions() == 1;
711 }
712
Andreas Huber1b6822b2016-10-18 09:28:40 -0700713 if (mElementType->isVector()) {
714 return false;
715 }
716
Andreas Huber86a112b2016-10-19 14:25:16 -0700717 if (isVectorOfBinders()) {
718 return false;
719 }
720
Andreas Huberf03332a2016-09-22 15:35:43 -0700721 return true;
Andreas Huber70a59e12016-08-16 12:57:01 -0700722}
723
Andreas Huber85eabdb2016-08-25 11:24:49 -0700724void VectorType::getAlignmentAndSize(size_t *align, size_t *size) const {
725 *align = 8; // hidl_vec<T>
726 *size = 24;
727}
728
Andreas Huberc9410c72016-07-28 12:18:40 -0700729} // namespace android
730