blob: 3243cd48d6bcd13e47dcb9626e9ca43cc9d2b393 [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
19#include <hidl-util/Formatter.h>
20#include <android-base/logging.h>
21
22namespace android {
23
24MemoryType::MemoryType() {}
25
26void MemoryType::addNamedTypesToSet(std::set<const FQName> &) const {
27 // do nothing
28}
29
30std::string MemoryType::getCppType(StorageMode mode,
31 bool specifyNamespaces) const {
32 const std::string base =
33 std::string(specifyNamespaces ? "::android::hardware::" : "")
34 + "hidl_memory";
35
36 switch (mode) {
37 case StorageMode_Stack:
38 return base;
39
40 case StorageMode_Argument:
41 return "const " + base + "&";
42
43 case StorageMode_Result:
44 return "const " + base + "*";
45 }
46}
47
48std::string MemoryType::getVtsType() const {
Keun Soo Yimb349e012017-01-06 16:51:32 -080049 return "TYPE_HIDL_MEMORY";
Martijn Coenen99e6beb2016-12-01 15:48:42 +010050}
51
52void MemoryType::emitReaderWriter(
53 Formatter &out,
54 const std::string &name,
55 const std::string &parcelObj,
56 bool parcelObjIsPointer,
57 bool isReader,
58 ErrorMode mode) const {
59 const std::string parentName = "_hidl_" + name + "_parent";
60 out << "size_t " << parentName << ";\n\n";
61
62 const std::string parcelObjDeref =
63 parcelObj + (parcelObjIsPointer ? "->" : ".");
64
65 if (isReader) {
Martijn Coenen6a082c62017-01-11 12:47:02 +010066 out << "_hidl_err = "
Martijn Coenen99e6beb2016-12-01 15:48:42 +010067 << parcelObjDeref
Martijn Coenen6a082c62017-01-11 12:47:02 +010068 << "readBuffer(&"
Martijn Coenen99e6beb2016-12-01 15:48:42 +010069 << parentName
Martijn Coenen6a082c62017-01-11 12:47:02 +010070 << ", "
71 << " reinterpret_cast<const void **>("
72 << "&" << name
73 << "));\n\n";
Martijn Coenen99e6beb2016-12-01 15:48:42 +010074
Martijn Coenen6a082c62017-01-11 12:47:02 +010075 handleError(out, mode);
Martijn Coenen99e6beb2016-12-01 15:48:42 +010076 } else {
77 out << "_hidl_err = "
78 << parcelObjDeref
79 << "writeBuffer(&"
80 << name
81 << ", sizeof("
82 << name
83 << "), &"
84 << parentName
85 << ");\n";
86
87 handleError(out, mode);
88 }
89
90 emitReaderWriterEmbedded(
91 out,
92 0 /* depth */,
93 name,
94 name /* sanitizedName */,
95 isReader /* nameIsPointer */,
96 parcelObj,
97 parcelObjIsPointer,
98 isReader,
99 mode,
100 parentName,
101 "0 /* parentOffset */");
102}
103
104void MemoryType::emitReaderWriterEmbedded(
105 Formatter &out,
106 size_t /* depth */,
107 const std::string &name,
108 const std::string & /*sanitizedName*/,
109 bool nameIsPointer,
110 const std::string &parcelObj,
111 bool parcelObjIsPointer,
112 bool isReader,
113 ErrorMode mode,
114 const std::string &parentName,
115 const std::string &offsetText) const {
116 emitReaderWriterEmbeddedForTypeName(
117 out,
118 name,
119 nameIsPointer,
120 parcelObj,
121 parcelObjIsPointer,
122 isReader,
123 mode,
124 parentName,
125 offsetText,
126 "::android::hardware::hidl_memory",
127 "" /* childName */,
128 "::android::hardware");
129}
130
131bool MemoryType::needsEmbeddedReadWrite() const {
132 return true;
133}
134
135bool MemoryType::resultNeedsDeref() const {
136 return true;
137}
138
139bool MemoryType::isJavaCompatible() const {
140 return false;
141}
142
143void MemoryType::getAlignmentAndSize(size_t *align, size_t *size) const {
144 *align = *size = 8;
145}
146
147status_t MemoryType::emitVtsTypeDeclarations(Formatter &out) const {
148 out << "type: " << getVtsType() << "\n";
149 return OK;
150}
151
152} // namespace android
153