blob: 56660a6ebcb8a6e6d59c7cdfe5e5cc8c6d126084 [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 "HandleType.h"
18
Andreas Huber6755e9d2017-04-06 11:09:07 -070019#include "HidlTypeAssertion.h"
20
Iliyan Malcheva72e0d22016-09-09 11:03:08 -070021#include <hidl-util/Formatter.h>
Andreas Huber2831d512016-08-15 09:33:47 -070022#include <android-base/logging.h>
23
Andreas Huberc9410c72016-07-28 12:18:40 -070024namespace android {
25
Timur Iskhakov63f39902017-08-29 15:47:29 -070026HandleType::HandleType(Scope* parent) : Type(parent) {}
Andreas Huberc9410c72016-07-28 12:18:40 -070027
Yifan Hongabf73ee2016-12-05 18:47:00 -080028bool HandleType::isHandle() const {
29 return true;
30}
31
Steven Moreland0ecc7b82017-07-19 12:59:23 -070032std::string HandleType::typeName() const {
33 return "handle";
34}
35
Martijn Coenenac587892016-11-17 15:14:19 +010036std::string HandleType::getCppType(StorageMode mode,
Steven Moreland979e0992016-09-07 09:18:08 -070037 bool specifyNamespaces) const {
Steven Moreland979e0992016-09-07 09:18:08 -070038 const std::string base =
Martijn Coenen2f69a5b2016-11-18 15:26:38 +010039 std::string(specifyNamespaces ? "::android::hardware::" : "")
40 + "hidl_handle";
41
42 switch (mode) {
43 case StorageMode_Stack:
44 return base;
45
46 case StorageMode_Argument:
47 return "const " + base + "&";
48
49 case StorageMode_Result:
50 return base;
Martijn Coenenac587892016-11-17 15:14:19 +010051 }
Andreas Huber881227d2016-08-02 14:20:21 -070052}
53
Nirav Atre97b7e9c2018-07-26 19:29:40 -070054std::string HandleType::getJavaType(bool /* forInitializer */) const {
55 return "android.os.NativeHandle";
56}
57
58std::string HandleType::getJavaSuffix() const {
59 return "NativeHandle";
60}
61
Zhuoyao Zhangae83dcd2016-11-29 12:48:28 -080062std::string HandleType::getVtsType() const {
63 return "TYPE_HANDLE";
64}
65
Andreas Huber881227d2016-08-02 14:20:21 -070066void HandleType::emitReaderWriter(
67 Formatter &out,
68 const std::string &name,
69 const std::string &parcelObj,
70 bool parcelObjIsPointer,
71 bool isReader,
72 ErrorMode mode) const {
73 const std::string parcelObjDeref =
74 parcelObj + (parcelObjIsPointer ? "->" : ".");
75
76 if (isReader) {
Martijn Coenen6a082c62017-01-11 12:47:02 +010077 out << "const native_handle_t *"
78 << name << "_ptr;\n\n";
79
80 out << "_hidl_err = "
Andreas Hubere852c7d2016-08-09 13:12:18 -070081 << parcelObjDeref
Martijn Coenen9d97da22017-01-12 17:29:47 +010082 << "readNullableNativeHandleNoDup("
Martijn Coenen6a082c62017-01-11 12:47:02 +010083 << "&" << name << "_ptr"
84 << ");\n\n";
Andreas Huber881227d2016-08-02 14:20:21 -070085
Martijn Coenen6a082c62017-01-11 12:47:02 +010086 handleError(out, mode);
Andreas Huber881227d2016-08-02 14:20:21 -070087
Martijn Coenen6a082c62017-01-11 12:47:02 +010088 out << name << " = " << name << "_ptr;\n";
Andreas Huber881227d2016-08-02 14:20:21 -070089 } else {
Iliyan Malchev549e2592016-08-10 08:59:12 -070090 out << "_hidl_err = ";
Andreas Huber881227d2016-08-02 14:20:21 -070091 out << parcelObjDeref
Andreas Hubere852c7d2016-08-09 13:12:18 -070092 << "writeNativeHandleNoDup("
Andreas Huber881227d2016-08-02 14:20:21 -070093 << name
Andreas Hubere852c7d2016-08-09 13:12:18 -070094 << ");\n";
Andreas Huber881227d2016-08-02 14:20:21 -070095
96 handleError(out, mode);
97 }
98}
99
100void HandleType::emitReaderWriterEmbedded(
101 Formatter &out,
Andreas Huberf9d49f12016-09-12 14:58:36 -0700102 size_t /* depth */,
Andreas Huber881227d2016-08-02 14:20:21 -0700103 const std::string &name,
Nirav Atre97b7e9c2018-07-26 19:29:40 -0700104 const std::string & /* sanitizedName */,
Andreas Huber881227d2016-08-02 14:20:21 -0700105 bool nameIsPointer,
106 const std::string &parcelObj,
107 bool parcelObjIsPointer,
108 bool isReader,
109 ErrorMode mode,
110 const std::string &parentName,
111 const std::string &offsetText) const {
Nirav Atre97b7e9c2018-07-26 19:29:40 -0700112 emitReaderWriterEmbeddedForTypeName(
113 out,
114 name,
115 nameIsPointer,
116 parcelObj,
117 parcelObjIsPointer,
118 isReader,
119 mode,
120 parentName,
121 offsetText,
122 "::android::hardware::hidl_handle",
123 "" /* childName */,
124 "::android::hardware");
125}
126
127void HandleType::emitJavaFieldInitializer(
128 Formatter &out, const std::string &fieldName) const {
129 const std::string fieldDeclaration = getJavaType(false) + " " + fieldName;
130 emitJavaFieldDefaultInitialValue(out, fieldDeclaration);
131}
132
133void HandleType::emitJavaFieldDefaultInitialValue(
134 Formatter &out, const std::string &declaredFieldName) const {
135 out << declaredFieldName
136 << " = new "
137 << getJavaType(true)
138 << "();\n";
139}
140
141void HandleType::emitJavaFieldReaderWriter(
142 Formatter &out,
143 size_t /* depth */,
144 const std::string &parcelName,
145 const std::string &blobName,
146 const std::string &fieldName,
147 const std::string &offset,
148 bool isReader) const {
Andreas Huber881227d2016-08-02 14:20:21 -0700149 if (isReader) {
Nirav Atre97b7e9c2018-07-26 19:29:40 -0700150 out << fieldName
151 << " = "
152 << parcelName
153 << ".readEmbeddedNativeHandle(\n";
Andreas Huber881227d2016-08-02 14:20:21 -0700154
Nirav Atre97b7e9c2018-07-26 19:29:40 -0700155 out.indent(2, [&] {
156 out << blobName
157 << ".handle(),\n"
158 << offset
159 << " + 0 /* offsetof(hidl_handle, mHandle) */);\n\n";
160 });
Andreas Huber881227d2016-08-02 14:20:21 -0700161
Nirav Atre97b7e9c2018-07-26 19:29:40 -0700162 return;
Andreas Huber881227d2016-08-02 14:20:21 -0700163 }
Nirav Atre97b7e9c2018-07-26 19:29:40 -0700164
165 out << blobName
166 << ".putNativeHandle("
167 << offset
168 << ", "
169 << fieldName
170 << ");\n";
Andreas Huber881227d2016-08-02 14:20:21 -0700171}
172
173bool HandleType::needsEmbeddedReadWrite() const {
174 return true;
175}
176
Timur Iskhakov5dc72fe2017-09-07 23:13:44 -0700177bool HandleType::deepIsJavaCompatible(std::unordered_set<const Type*>* /* visited */) const {
Nirav Atre97b7e9c2018-07-26 19:29:40 -0700178 return true;
Andreas Huber70a59e12016-08-16 12:57:01 -0700179}
180
Andreas Huber6755e9d2017-04-06 11:09:07 -0700181static HidlTypeAssertion assertion("hidl_handle", 16 /* size */);
Andreas Huber85eabdb2016-08-25 11:24:49 -0700182void HandleType::getAlignmentAndSize(size_t *align, size_t *size) const {
Andreas Huber60d3b222017-03-30 09:10:56 -0700183 *align = 8; // hidl_handle
Andreas Huber6755e9d2017-04-06 11:09:07 -0700184 *size = assertion.size();
Andreas Huber85eabdb2016-08-25 11:24:49 -0700185}
186
Steven Moreland6ec9eb92018-02-16 14:21:49 -0800187void HandleType::emitVtsTypeDeclarations(Formatter& out) const {
Zhuoyao Zhangae83dcd2016-11-29 12:48:28 -0800188 out << "type: " << getVtsType() << "\n";
Zhuoyao Zhangae83dcd2016-11-29 12:48:28 -0800189}
190
Andreas Huberc9410c72016-07-28 12:18:40 -0700191} // namespace android
192