blob: df4543c80cebccb6ebfe566dfde3eafc688dc9e4 [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 "StringType.h"
18
19#include "Formatter.h"
20
21namespace android {
22
23StringType::StringType() {}
24
Andreas Huber881227d2016-08-02 14:20:21 -070025std::string StringType::getCppType(StorageMode mode, std::string *extra) const {
26 extra->clear();
27
Andreas Huber8a82ff72016-08-04 10:29:39 -070028 const std::string base = "::android::hardware::hidl_string";
Andreas Huber881227d2016-08-02 14:20:21 -070029
30 switch (mode) {
31 case StorageMode_Stack:
32 return base;
33
34 case StorageMode_Argument:
35 return "const " + base + "&";
36
37 case StorageMode_Result:
38 return "const " + base + "*";
39 }
40}
41
Andreas Huber2831d512016-08-15 09:33:47 -070042std::string StringType::getJavaType() const {
43 return "String";
44}
45
46std::string StringType::getJavaSuffix() const {
47 return "String";
48}
49
Andreas Huber881227d2016-08-02 14:20:21 -070050void StringType::emitReaderWriter(
51 Formatter &out,
52 const std::string &name,
53 const std::string &parcelObj,
54 bool parcelObjIsPointer,
55 bool isReader,
56 ErrorMode mode) const {
Iliyan Malchev549e2592016-08-10 08:59:12 -070057 const std::string parentName = "_hidl_" + name + "_parent";
Andreas Huber881227d2016-08-02 14:20:21 -070058 out << "size_t " << parentName << ";\n\n";
59
60 const std::string parcelObjDeref =
61 parcelObj + (parcelObjIsPointer ? "->" : ".");
62
63 if (isReader) {
64 out << name
Andreas Huber8a82ff72016-08-04 10:29:39 -070065 << " = (const ::android::hardware::hidl_string *)"
Andreas Huber881227d2016-08-02 14:20:21 -070066 << parcelObjDeref
67 << "readBuffer("
68 << "&"
69 << parentName
70 << ");\n";
71
72 out << "if ("
73 << name
74 << " == nullptr) {\n";
75
76 out.indent();
77
Iliyan Malchev549e2592016-08-10 08:59:12 -070078 out << "_hidl_err = ::android::UNKNOWN_ERROR;\n";
Andreas Huber881227d2016-08-02 14:20:21 -070079 handleError2(out, mode);
80
81 out.unindent();
82 out << "}\n\n";
83 } else {
Iliyan Malchev549e2592016-08-10 08:59:12 -070084 out << "_hidl_err = "
Andreas Huber881227d2016-08-02 14:20:21 -070085 << parcelObjDeref
86 << "writeBuffer(&"
87 << name
88 << ", sizeof("
89 << name
90 << "), &"
91 << parentName
92 << ");\n";
93
94 handleError(out, mode);
95 }
96
97 emitReaderWriterEmbedded(
98 out,
99 name,
100 isReader /* nameIsPointer */,
101 parcelObj,
102 parcelObjIsPointer,
103 isReader,
104 mode,
105 parentName,
106 "0 /* parentOffset */");
107}
108
109void StringType::emitReaderWriterEmbedded(
110 Formatter &out,
111 const std::string &name,
112 bool nameIsPointer,
113 const std::string &parcelObj,
114 bool parcelObjIsPointer,
115 bool isReader,
116 ErrorMode mode,
117 const std::string &parentName,
118 const std::string &offsetText) const {
119 emitReaderWriterEmbeddedForTypeName(
120 out,
121 name,
122 nameIsPointer,
123 parcelObj,
124 parcelObjIsPointer,
125 isReader,
126 mode,
127 parentName,
128 offsetText,
Andreas Huber8a82ff72016-08-04 10:29:39 -0700129 "::android::hardware::hidl_string",
Andreas Huber881227d2016-08-02 14:20:21 -0700130 "" /* childName */);
131}
132
Andreas Huber85eabdb2016-08-25 11:24:49 -0700133void StringType::emitJavaFieldInitializer(
134 Formatter &out, const std::string &fieldName) const {
135 out << "String "
136 << fieldName
137 << " = new String();\n";
138}
139
140void StringType::emitJavaFieldReaderWriter(
141 Formatter &out,
142 const std::string &blobName,
143 const std::string &fieldName,
144 const std::string &offset,
145 bool isReader) const {
146 if (isReader) {
147 out << "\nparcel.readEmbeddedBuffer(\n";
148
149 out.indent();
150 out.indent();
151
152 out << blobName
153 << ".handle(),\n"
154 << offset
155 << " + 0 /* offsetof(hidl_string, mBuffer) */);\n\n";
156
157 out.unindent();
158 out.unindent();
159
160 out << fieldName
161 << " = "
162 << blobName
163 << ".getString("
164 << offset
165 << ");\n";
166
167 return;
168 }
169
170 out << blobName
171 << ".putString("
172 << offset
173 << ", "
174 << fieldName
175 << ");\n";
176}
177
Andreas Huber881227d2016-08-02 14:20:21 -0700178bool StringType::needsEmbeddedReadWrite() const {
179 return true;
180}
181
182bool StringType::resultNeedsDeref() const {
183 return true;
184}
185
Zhuoyao Zhang5158db42016-08-10 10:25:20 -0700186status_t StringType::emitVtsTypeDeclarations(Formatter &out) const {
187 out << "type: TYPE_STRING\n";
188 return OK;
189}
190
Andreas Huber85eabdb2016-08-25 11:24:49 -0700191void StringType::getAlignmentAndSize(size_t *align, size_t *size) const {
192 *align = 8; // hidl_string
193 *size = 24;
194}
195
Andreas Huberc9410c72016-07-28 12:18:40 -0700196} // namespace android
197