blob: b3e72359d90b9983dfe4733bbe223d6938d2c08a [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 Hong3b320f82016-11-01 15:15:54 -0700371 std::string elementType = mElementType->getCppStackType();
Yifan Hongbf459bc2016-08-23 16:50:37 -0700372
373 std::string myChildName = childName, myChildOffset = childOffsetText;
374
375 if(myChildName.empty() && myChildOffset.empty()) {
376 myChildName = "_hidl_" + sanitizedName + "_child";
377 myChildOffset = "0";
378
379 out << "size_t " << myChildName << ";\n";
380 out << "_hidl_err = " << nameDeref << "findInParcel("
381 << (parcelObjIsPointer ? "*" : "") << parcelObj << ", "
382 << "&" << myChildName
383 << ");\n";
384
385 handleError(out, mode);
386 }
387
388 std::string iteratorName = "_hidl_index_" + std::to_string(depth);
389
390 out << "for (size_t "
391 << iteratorName
392 << " = 0; "
393 << iteratorName
394 << " < "
395 << nameDeref
396 << "size(); ++"
397 << iteratorName
398 << ") {\n";
399
400 out.indent();
401
402 mElementType->emitResolveReferencesEmbedded(
403 out,
404 depth + 1,
405 (nameIsPointer ? "(*" + name + ")" : name) + "[" + iteratorName + "]",
406 sanitizedName + (nameIsPointer ? "_deref" : "") + "_indexed",
407 false /* nameIsPointer */,
408 parcelObj,
409 parcelObjIsPointer,
410 isReader,
411 mode,
412 myChildName,
413 myChildOffset + " + " +
Yifan Hong3b320f82016-11-01 15:15:54 -0700414 iteratorName + " * sizeof(" + elementType + ")");
Yifan Hongbf459bc2016-08-23 16:50:37 -0700415
416 out.unindent();
417
418 out << "}\n\n";
419}
420
Andreas Huberf630bc82016-09-09 14:52:25 -0700421void VectorType::emitJavaReaderWriter(
422 Formatter &out,
423 const std::string &parcelObj,
424 const std::string &argName,
425 bool isReader) const {
426 if (mElementType->isCompoundType()) {
Andreas Huber4c865b72016-09-14 15:26:27 -0700427
Andreas Huberf630bc82016-09-09 14:52:25 -0700428 if (isReader) {
Yifan Hong4ed13472016-11-02 10:44:11 -0700429 out << mElementType->getJavaType()
Andreas Huberf630bc82016-09-09 14:52:25 -0700430 << ".readVectorFromParcel("
431 << parcelObj
432 << ");\n";
433 } else {
Yifan Hong4ed13472016-11-02 10:44:11 -0700434 out << mElementType->getJavaType()
Andreas Huberf630bc82016-09-09 14:52:25 -0700435 << ".writeVectorToParcel("
436 << parcelObj
437 << ", "
438 << argName
439 << ");\n";
440 }
441
442 return;
443 }
444
Andreas Huber1b6822b2016-10-18 09:28:40 -0700445 if (mElementType->isArray()) {
446 if (isReader) {
Andreas Huber1b6822b2016-10-18 09:28:40 -0700447 out << " new "
Yifan Hong4ed13472016-11-02 10:44:11 -0700448 << getJavaType(false /* forInitializer */)
Andreas Huber1b6822b2016-10-18 09:28:40 -0700449 << "();\n";
450 }
451
452 out << "{\n";
453 out.indent();
454
Yifan Hong1af73532016-11-09 14:32:58 -0800455 out << "android.os.HwBlob _hidl_blob = ";
Andreas Huber1b6822b2016-10-18 09:28:40 -0700456
457 if (isReader) {
458 out << parcelObj
459 << ".readBuffer();\n";
460 } else {
461 size_t align, size;
462 getAlignmentAndSize(&align, &size);
463
Yifan Hong1af73532016-11-09 14:32:58 -0800464 out << "new android.os.HwBlob("
Andreas Huber1b6822b2016-10-18 09:28:40 -0700465 << size
466 << " /* size */);\n";
467 }
468
469 emitJavaFieldReaderWriter(
470 out,
471 0 /* depth */,
472 parcelObj,
473 "_hidl_blob",
474 argName,
475 "0 /* offset */",
476 isReader);
477
478 if (!isReader) {
479 out << parcelObj << ".writeBuffer(_hidl_blob);\n";
480 };
481
482 out.unindent();
483 out << "}\n";
484
485 return;
486 }
487
Andreas Huberf630bc82016-09-09 14:52:25 -0700488 emitJavaReaderWriterWithSuffix(
489 out,
490 parcelObj,
491 argName,
492 isReader,
493 mElementType->getJavaSuffix() + "Vector",
494 "" /* extra */);
495}
496
Andreas Huber85eabdb2016-08-25 11:24:49 -0700497void VectorType::emitJavaFieldInitializer(
498 Formatter &out, const std::string &fieldName) const {
Yifan Hong4ed13472016-11-02 10:44:11 -0700499 std::string javaType = getJavaType(false /* forInitializer */);
Andreas Huberf03332a2016-09-22 15:35:43 -0700500
Andreas Huber1b6822b2016-10-18 09:28:40 -0700501 out << "final "
502 << javaType
503 << " "
Andreas Huber85eabdb2016-08-25 11:24:49 -0700504 << fieldName
Andreas Huber1b6822b2016-10-18 09:28:40 -0700505 << " = new "
506 << javaType
507 << "();\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700508}
509
510void VectorType::emitJavaFieldReaderWriter(
511 Formatter &out,
Andreas Huber4c865b72016-09-14 15:26:27 -0700512 size_t depth,
Andreas Huber709b62d2016-09-19 11:21:18 -0700513 const std::string &parcelName,
Andreas Huber85eabdb2016-08-25 11:24:49 -0700514 const std::string &blobName,
515 const std::string &fieldName,
516 const std::string &offset,
517 bool isReader) const {
Andreas Huberf630bc82016-09-09 14:52:25 -0700518 VectorType::EmitJavaFieldReaderWriterForElementType(
Andreas Huber709b62d2016-09-19 11:21:18 -0700519 out,
520 depth,
521 mElementType,
522 parcelName,
523 blobName,
524 fieldName,
525 offset,
526 isReader);
Andreas Huberf630bc82016-09-09 14:52:25 -0700527}
528
529// static
530void VectorType::EmitJavaFieldReaderWriterForElementType(
531 Formatter &out,
Andreas Huber4c865b72016-09-14 15:26:27 -0700532 size_t depth,
Andreas Huberf630bc82016-09-09 14:52:25 -0700533 const Type *elementType,
Andreas Huber709b62d2016-09-19 11:21:18 -0700534 const std::string &parcelName,
Andreas Huberf630bc82016-09-09 14:52:25 -0700535 const std::string &blobName,
536 const std::string &fieldName,
537 const std::string &offset,
538 bool isReader) {
Andreas Huber85eabdb2016-08-25 11:24:49 -0700539 if (isReader) {
540 out << "{\n";
541 out.indent();
542
Yifan Hong1af73532016-11-09 14:32:58 -0800543 out << "android.os.HwBlob childBlob = "
Andreas Huber709b62d2016-09-19 11:21:18 -0700544 << parcelName
545 << ".readEmbeddedBuffer(\n";
546
Andreas Huber85eabdb2016-08-25 11:24:49 -0700547 out.indent();
548 out.indent();
549
550 out << blobName
551 << ".handle(),\n"
552 << offset
553 << " + 0 /* offsetof(hidl_vec<T>, mBuffer) */);\n\n";
554
555 out.unindent();
556 out.unindent();
557
558 out << fieldName << ".clear();\n";
559 out << "long _hidl_vec_size = "
560 << blobName
561 << ".getInt64("
562 << offset
563 << " + 8 /* offsetof(hidl_vec<T>, mSize) */);\n";
564
Andreas Huber4c865b72016-09-14 15:26:27 -0700565 std::string iteratorName = "_hidl_index_" + std::to_string(depth);
566
567 out << "for (int "
568 << iteratorName
569 << " = 0; "
570 << iteratorName
571 << " < _hidl_vec_size; "
572 << "++"
573 << iteratorName
574 << ") {\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700575
576 out.indent();
577
Andreas Huberf630bc82016-09-09 14:52:25 -0700578 elementType->emitJavaFieldInitializer(out, "_hidl_vec_element");
Andreas Huber85eabdb2016-08-25 11:24:49 -0700579
580 size_t elementAlign, elementSize;
Andreas Huberf630bc82016-09-09 14:52:25 -0700581 elementType->getAlignmentAndSize(&elementAlign, &elementSize);
Andreas Huber85eabdb2016-08-25 11:24:49 -0700582
Andreas Huberf630bc82016-09-09 14:52:25 -0700583 elementType->emitJavaFieldReaderWriter(
Andreas Huber85eabdb2016-08-25 11:24:49 -0700584 out,
Andreas Huber4c865b72016-09-14 15:26:27 -0700585 depth + 1,
Andreas Huber709b62d2016-09-19 11:21:18 -0700586 parcelName,
Andreas Huber85eabdb2016-08-25 11:24:49 -0700587 "childBlob",
588 "_hidl_vec_element",
Andreas Huber4c865b72016-09-14 15:26:27 -0700589 iteratorName + " * " + std::to_string(elementSize),
Andreas Huber85eabdb2016-08-25 11:24:49 -0700590 true /* isReader */);
591
Andreas Huber1b6822b2016-10-18 09:28:40 -0700592 out << fieldName
593 << ".add(_hidl_vec_element);\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700594
595 out.unindent();
596
597 out << "}\n";
598
599 out.unindent();
600 out << "}\n";
601
602 return;
603 }
604
605 out << "{\n";
606 out.indent();
607
608 out << "long _hidl_vec_size = "
609 << fieldName
610 << ".size();\n";
611
612 out << blobName
613 << ".putInt64("
614 << offset
615 << " + 8 /* offsetof(hidl_vec<T>, mSize) */, _hidl_vec_size);\n";
616
617 out << blobName
618 << ".putBool("
619 << offset
620 << " + 16 /* offsetof(hidl_vec<T>, mOwnsBuffer) */, false);\n";
621
622 size_t elementAlign, elementSize;
Andreas Huberf630bc82016-09-09 14:52:25 -0700623 elementType->getAlignmentAndSize(&elementAlign, &elementSize);
Andreas Huber85eabdb2016-08-25 11:24:49 -0700624
625 // XXX make HwBlob constructor take a long instead of an int?
Yifan Hong1af73532016-11-09 14:32:58 -0800626 out << "android.os.HwBlob childBlob = new android.os.HwBlob((int)(_hidl_vec_size * "
Andreas Huber85eabdb2016-08-25 11:24:49 -0700627 << elementSize
628 << "));\n";
629
Andreas Huber4c865b72016-09-14 15:26:27 -0700630 std::string iteratorName = "_hidl_index_" + std::to_string(depth);
631
632 out << "for (int "
633 << iteratorName
634 << " = 0; "
635 << iteratorName
636 << " < _hidl_vec_size; "
637 << "++"
638 << iteratorName
639 << ") {\n";
Andreas Huber85eabdb2016-08-25 11:24:49 -0700640
641 out.indent();
642
Andreas Huberf630bc82016-09-09 14:52:25 -0700643 elementType->emitJavaFieldReaderWriter(
Andreas Huber85eabdb2016-08-25 11:24:49 -0700644 out,
Andreas Huber4c865b72016-09-14 15:26:27 -0700645 depth + 1,
Andreas Huber709b62d2016-09-19 11:21:18 -0700646 parcelName,
Andreas Huber85eabdb2016-08-25 11:24:49 -0700647 "childBlob",
Andreas Huberf1abc2a2016-09-28 09:14:43 -0700648 fieldName + ".get(" + iteratorName + ")",
Andreas Huber4c865b72016-09-14 15:26:27 -0700649 iteratorName + " * " + std::to_string(elementSize),
Andreas Huber85eabdb2016-08-25 11:24:49 -0700650 false /* isReader */);
651
652 out.unindent();
653
654 out << "}\n";
655
656 out << blobName
657 << ".putBlob("
658 << offset
659 << " + 0 /* offsetof(hidl_vec<T>, mBuffer) */, childBlob);\n";
660
661 out.unindent();
662 out << "}\n";
663}
664
Andreas Huber881227d2016-08-02 14:20:21 -0700665bool VectorType::needsEmbeddedReadWrite() const {
666 return true;
667}
668
Yifan Hongbf459bc2016-08-23 16:50:37 -0700669bool VectorType::needsResolveReferences() const {
670 return mElementType->needsResolveReferences();
671}
672
Andreas Huber881227d2016-08-02 14:20:21 -0700673bool VectorType::resultNeedsDeref() const {
Andreas Huber86a112b2016-10-19 14:25:16 -0700674 return !isVectorOfBinders();
Andreas Huber881227d2016-08-02 14:20:21 -0700675}
676
Zhuoyao Zhang5158db42016-08-10 10:25:20 -0700677status_t VectorType::emitVtsTypeDeclarations(Formatter &out) const {
Zhuoyao Zhangc5ea9f52016-10-06 15:05:39 -0700678 out << "type: " << getVtsType() << "\n";
679 out << "vector_value: {\n";
Zhuoyao Zhang5158db42016-08-10 10:25:20 -0700680 out.indent();
681 status_t err = mElementType->emitVtsTypeDeclarations(out);
682 if (err != OK) {
683 return err;
684 }
685 out.unindent();
686 out << "}\n";
687 return OK;
688}
689
Zhuoyao Zhang864c7712016-08-16 15:35:28 -0700690status_t VectorType::emitVtsAttributeType(Formatter &out) const {
691 out << "type: TYPE_VECTOR\n" << "vector_value: {\n";
692 out.indent();
693 status_t status = mElementType->emitVtsAttributeType(out);
694 if (status != OK) {
695 return status;
696 }
697 out.unindent();
698 out << "}\n";
699 return OK;
700}
701
Andreas Huber70a59e12016-08-16 12:57:01 -0700702bool VectorType::isJavaCompatible() const {
Andreas Huberf03332a2016-09-22 15:35:43 -0700703 if (!mElementType->isJavaCompatible()) {
704 return false;
705 }
706
707 if (mElementType->isArray()) {
708 return static_cast<ArrayType *>(mElementType)->countDimensions() == 1;
709 }
710
Andreas Huber1b6822b2016-10-18 09:28:40 -0700711 if (mElementType->isVector()) {
712 return false;
713 }
714
Andreas Huber86a112b2016-10-19 14:25:16 -0700715 if (isVectorOfBinders()) {
716 return false;
717 }
718
Andreas Huberf03332a2016-09-22 15:35:43 -0700719 return true;
Andreas Huber70a59e12016-08-16 12:57:01 -0700720}
721
Andreas Huber85eabdb2016-08-25 11:24:49 -0700722void VectorType::getAlignmentAndSize(size_t *align, size_t *size) const {
723 *align = 8; // hidl_vec<T>
724 *size = 24;
725}
726
Andreas Huberc9410c72016-07-28 12:18:40 -0700727} // namespace android
728