1 /*
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 "HandleType.h"
18
19 #include "HidlTypeAssertion.h"
20
21 #include <hidl-util/Formatter.h>
22 #include <android-base/logging.h>
23
24 namespace android {
25
HandleType()26 HandleType::HandleType() {}
27
isHandle() const28 bool HandleType::isHandle() const {
29 return true;
30 }
31
typeName() const32 std::string HandleType::typeName() const {
33 return "handle";
34 }
35
getCppType(StorageMode mode,bool specifyNamespaces) const36 std::string HandleType::getCppType(StorageMode mode,
37 bool specifyNamespaces) const {
38 const std::string base =
39 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;
51 }
52 }
53
getVtsType() const54 std::string HandleType::getVtsType() const {
55 return "TYPE_HANDLE";
56 }
57
emitReaderWriter(Formatter & out,const std::string & name,const std::string & parcelObj,bool parcelObjIsPointer,bool isReader,ErrorMode mode) const58 void HandleType::emitReaderWriter(
59 Formatter &out,
60 const std::string &name,
61 const std::string &parcelObj,
62 bool parcelObjIsPointer,
63 bool isReader,
64 ErrorMode mode) const {
65 const std::string parcelObjDeref =
66 parcelObj + (parcelObjIsPointer ? "->" : ".");
67
68 if (isReader) {
69 out << "const native_handle_t *"
70 << name << "_ptr;\n\n";
71
72 out << "_hidl_err = "
73 << parcelObjDeref
74 << "readNullableNativeHandleNoDup("
75 << "&" << name << "_ptr"
76 << ");\n\n";
77
78 handleError(out, mode);
79
80 out << name << " = " << name << "_ptr;\n";
81 } else {
82 out << "_hidl_err = ";
83 out << parcelObjDeref
84 << "writeNativeHandleNoDup("
85 << name
86 << ");\n";
87
88 handleError(out, mode);
89 }
90 }
91
useNameInEmitReaderWriterEmbedded(bool isReader) const92 bool HandleType::useNameInEmitReaderWriterEmbedded(bool isReader) const {
93 return !isReader;
94 }
95
emitReaderWriterEmbedded(Formatter & out,size_t,const std::string & name,const std::string & sanitizedName,bool nameIsPointer,const std::string & parcelObj,bool parcelObjIsPointer,bool isReader,ErrorMode mode,const std::string & parentName,const std::string & offsetText) const96 void HandleType::emitReaderWriterEmbedded(
97 Formatter &out,
98 size_t /* depth */,
99 const std::string &name,
100 const std::string &sanitizedName,
101 bool nameIsPointer,
102 const std::string &parcelObj,
103 bool parcelObjIsPointer,
104 bool isReader,
105 ErrorMode mode,
106 const std::string &parentName,
107 const std::string &offsetText) const {
108 if (isReader) {
109 const std::string ptrName = "_hidl_" + sanitizedName + "_ptr";
110
111 out << "const native_handle_t *"
112 << ptrName << ";\n"
113 << "_hidl_err = "
114 << parcelObj
115 << (parcelObjIsPointer ? "->" : ".")
116 << "readNullableEmbeddedNativeHandle(\n";
117
118 out.indent();
119 out.indent();
120
121 out << parentName
122 << ",\n"
123 << offsetText
124 << ",\n"
125 << "&" << ptrName
126 << "\n"
127 << ");\n\n";
128
129 out.unindent();
130 out.unindent();
131
132 handleError(out, mode);
133 } else {
134 out << "_hidl_err = "
135 << parcelObj
136 << (parcelObjIsPointer ? "->" : ".")
137 << "writeEmbeddedNativeHandle(\n";
138
139 out.indent();
140 out.indent();
141
142 out << (nameIsPointer ? ("*" + name) : name)
143 << ",\n"
144 << parentName
145 << ",\n"
146 << offsetText
147 << ");\n\n";
148
149 out.unindent();
150 out.unindent();
151
152 handleError(out, mode);
153 }
154 }
155
needsEmbeddedReadWrite() const156 bool HandleType::needsEmbeddedReadWrite() const {
157 return true;
158 }
159
isJavaCompatible() const160 bool HandleType::isJavaCompatible() const {
161 return false;
162 }
163
164 static HidlTypeAssertion assertion("hidl_handle", 16 /* size */);
getAlignmentAndSize(size_t * align,size_t * size) const165 void HandleType::getAlignmentAndSize(size_t *align, size_t *size) const {
166 *align = 8; // hidl_handle
167 *size = assertion.size();
168 }
169
emitVtsTypeDeclarations(Formatter & out) const170 status_t HandleType::emitVtsTypeDeclarations(Formatter &out) const {
171 out << "type: " << getVtsType() << "\n";
172 return OK;
173 }
174
175 } // namespace android
176
177