blob: d6bfdbb0a9d57172bf265efaf76373cd105db81a [file] [log] [blame]
Martijn Coenen99e6beb2016-12-01 15:48:42 +01001/*
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
17#include "MemoryType.h"
18
Andreas Huber6755e9d2017-04-06 11:09:07 -070019#include "HidlTypeAssertion.h"
20
Martijn Coenen99e6beb2016-12-01 15:48:42 +010021#include <hidl-util/Formatter.h>
22#include <android-base/logging.h>
23
24namespace android {
25
26MemoryType::MemoryType() {}
27
Martijn Coenen99e6beb2016-12-01 15:48:42 +010028std::string MemoryType::getCppType(StorageMode mode,
29 bool specifyNamespaces) const {
30 const std::string base =
31 std::string(specifyNamespaces ? "::android::hardware::" : "")
32 + "hidl_memory";
33
34 switch (mode) {
35 case StorageMode_Stack:
36 return base;
37
38 case StorageMode_Argument:
39 return "const " + base + "&";
40
41 case StorageMode_Result:
42 return "const " + base + "*";
43 }
44}
45
46std::string MemoryType::getVtsType() const {
Keun Soo Yimb349e012017-01-06 16:51:32 -080047 return "TYPE_HIDL_MEMORY";
Martijn Coenen99e6beb2016-12-01 15:48:42 +010048}
49
50void MemoryType::emitReaderWriter(
51 Formatter &out,
52 const std::string &name,
53 const std::string &parcelObj,
54 bool parcelObjIsPointer,
55 bool isReader,
56 ErrorMode mode) const {
57 const std::string parentName = "_hidl_" + name + "_parent";
58 out << "size_t " << parentName << ";\n\n";
59
60 const std::string parcelObjDeref =
61 parcelObj + (parcelObjIsPointer ? "->" : ".");
62
63 if (isReader) {
Martijn Coenen6a082c62017-01-11 12:47:02 +010064 out << "_hidl_err = "
Martijn Coenen99e6beb2016-12-01 15:48:42 +010065 << parcelObjDeref
Martijn Coenenb2a861c2017-04-18 15:54:25 -070066 << "readBuffer("
67 << "sizeof(*"
68 << name
69 << "), &"
Martijn Coenen99e6beb2016-12-01 15:48:42 +010070 << parentName
Martijn Coenen6a082c62017-01-11 12:47:02 +010071 << ", "
72 << " reinterpret_cast<const void **>("
73 << "&" << name
74 << "));\n\n";
Martijn Coenen99e6beb2016-12-01 15:48:42 +010075
Martijn Coenen6a082c62017-01-11 12:47:02 +010076 handleError(out, mode);
Martijn Coenen99e6beb2016-12-01 15:48:42 +010077 } else {
78 out << "_hidl_err = "
79 << parcelObjDeref
80 << "writeBuffer(&"
81 << name
82 << ", sizeof("
83 << name
84 << "), &"
85 << parentName
86 << ");\n";
87
88 handleError(out, mode);
89 }
90
91 emitReaderWriterEmbedded(
92 out,
93 0 /* depth */,
94 name,
95 name /* sanitizedName */,
96 isReader /* nameIsPointer */,
97 parcelObj,
98 parcelObjIsPointer,
99 isReader,
100 mode,
101 parentName,
102 "0 /* parentOffset */");
103}
104
105void MemoryType::emitReaderWriterEmbedded(
106 Formatter &out,
107 size_t /* depth */,
108 const std::string &name,
109 const std::string & /*sanitizedName*/,
110 bool nameIsPointer,
111 const std::string &parcelObj,
112 bool parcelObjIsPointer,
113 bool isReader,
114 ErrorMode mode,
115 const std::string &parentName,
116 const std::string &offsetText) const {
117 emitReaderWriterEmbeddedForTypeName(
118 out,
119 name,
120 nameIsPointer,
121 parcelObj,
122 parcelObjIsPointer,
123 isReader,
124 mode,
125 parentName,
126 offsetText,
127 "::android::hardware::hidl_memory",
128 "" /* childName */,
129 "::android::hardware");
130}
131
132bool MemoryType::needsEmbeddedReadWrite() const {
133 return true;
134}
135
136bool MemoryType::resultNeedsDeref() const {
137 return true;
138}
139
140bool MemoryType::isJavaCompatible() const {
141 return false;
142}
143
Andreas Huber6755e9d2017-04-06 11:09:07 -0700144static HidlTypeAssertion assertion("hidl_memory", 40 /* size */);
Martijn Coenen99e6beb2016-12-01 15:48:42 +0100145void MemoryType::getAlignmentAndSize(size_t *align, size_t *size) const {
Andreas Huber60d3b222017-03-30 09:10:56 -0700146 *align = 8; // hidl_memory
Andreas Huber6755e9d2017-04-06 11:09:07 -0700147 *size = assertion.size();
Martijn Coenen99e6beb2016-12-01 15:48:42 +0100148}
149
150status_t MemoryType::emitVtsTypeDeclarations(Formatter &out) const {
151 out << "type: " << getVtsType() << "\n";
152 return OK;
153}
154
155} // namespace android
156