blob: ea557a480a1ce3d4a493d598fc76333a3e25c7bf [file] [log] [blame]
Andreas Huber4b2cf352016-08-31 13:58:19 -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
17#include "PredefinedType.h"
18
19#include "Formatter.h"
20
21#include <android-base/logging.h>
22
23namespace android {
24
25PredefinedType::PredefinedType(const char *name)
26 : mName(name) {
27}
28
29std::string PredefinedType::getCppType(
30 StorageMode mode, std::string *extra) const {
31 extra->clear();
32
33 const std::string base = mName;
34
35 switch (mode) {
36 case StorageMode_Stack:
37 return base;
38
39 case StorageMode_Argument:
40 return "const " + base + "&";
41
42 case StorageMode_Result:
43 return "const " + base + "*";
44 }
45}
46
47std::string PredefinedType::getJavaType() const {
48 CHECK(!"Should not be here");
49 return std::string();
50}
51
52void PredefinedType::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
61 out << "size_t " << parentName << ";\n\n";
62
63 const std::string parcelObjDeref =
64 parcelObj + (parcelObjIsPointer ? "->" : ".");
65
66 if (isReader) {
67 out << name
68 << " = (const "
69 << mName
70 << " *)"
71 << parcelObjDeref
72 << "readBuffer("
73 << "&"
74 << parentName
75 << ");\n";
76
77 out << "if ("
78 << name
79 << " == nullptr) {\n";
80
81 out.indent();
82
83 out << "_hidl_err = ::android::UNKNOWN_ERROR;\n";
84 handleError2(out, mode);
85
86 out.unindent();
87 out << "}\n\n";
88 } else {
89 out << "_hidl_err = "
90 << parcelObjDeref
91 << "writeBuffer(&"
92 << name
93 << ", sizeof("
94 << name
95 << "), &"
96 << parentName
97 << ");\n";
98
99 handleError(out, mode);
100 }
101
102 emitReaderWriterEmbedded(
103 out,
104 name,
105 isReader /* nameIsPointer */,
106 parcelObj,
107 parcelObjIsPointer,
108 isReader,
109 mode,
110 parentName,
111 "0 /* parentOffset */");
112}
113
114void PredefinedType::emitReaderWriterEmbedded(
115 Formatter &out,
116 const std::string &name,
117 bool nameIsPointer,
118 const std::string &parcelObj,
119 bool parcelObjIsPointer,
120 bool isReader,
121 ErrorMode mode,
122 const std::string &parentName,
123 const std::string &offsetText) const {
124 emitReaderWriterEmbeddedForTypeName(
125 out,
126 name,
127 nameIsPointer,
128 parcelObj,
129 parcelObjIsPointer,
130 isReader,
131 mode,
132 parentName,
133 offsetText,
134 mName,
135 "" /* childName */);
136}
137
138bool PredefinedType::isJavaCompatible() const {
139 return false;
140}
141
142bool PredefinedType::needsEmbeddedReadWrite() const {
143 return true;
144}
145
146bool PredefinedType::resultNeedsDeref() const {
147 return true;
148}
149
150} // namespace android
151