StringType.cpp revision 85eabdbe56720dcdcf130e5ca83129d47b143768
1#include "StringType.h"
2
3#include "Formatter.h"
4
5namespace android {
6
7StringType::StringType() {}
8
9std::string StringType::getCppType(StorageMode mode, std::string *extra) const {
10    extra->clear();
11
12    const std::string base = "::android::hardware::hidl_string";
13
14    switch (mode) {
15        case StorageMode_Stack:
16            return base;
17
18        case StorageMode_Argument:
19            return "const " + base + "&";
20
21        case StorageMode_Result:
22            return "const " + base + "*";
23    }
24}
25
26std::string StringType::getJavaType() const {
27    return "String";
28}
29
30std::string StringType::getJavaSuffix() const {
31    return "String";
32}
33
34void StringType::emitReaderWriter(
35        Formatter &out,
36        const std::string &name,
37        const std::string &parcelObj,
38        bool parcelObjIsPointer,
39        bool isReader,
40        ErrorMode mode) const {
41    const std::string parentName = "_hidl_" + name + "_parent";
42    out << "size_t " << parentName << ";\n\n";
43
44    const std::string parcelObjDeref =
45        parcelObj + (parcelObjIsPointer ? "->" : ".");
46
47    if (isReader) {
48        out << name
49            << " = (const ::android::hardware::hidl_string *)"
50            << parcelObjDeref
51            << "readBuffer("
52            << "&"
53            << parentName
54            << ");\n";
55
56        out << "if ("
57            << name
58            << " == nullptr) {\n";
59
60        out.indent();
61
62        out << "_hidl_err = ::android::UNKNOWN_ERROR;\n";
63        handleError2(out, mode);
64
65        out.unindent();
66        out << "}\n\n";
67    } else {
68        out << "_hidl_err = "
69            << parcelObjDeref
70            << "writeBuffer(&"
71            << name
72            << ", sizeof("
73            << name
74            << "), &"
75            << parentName
76            << ");\n";
77
78        handleError(out, mode);
79    }
80
81    emitReaderWriterEmbedded(
82            out,
83            name,
84            isReader /* nameIsPointer */,
85            parcelObj,
86            parcelObjIsPointer,
87            isReader,
88            mode,
89            parentName,
90            "0 /* parentOffset */");
91}
92
93void StringType::emitReaderWriterEmbedded(
94        Formatter &out,
95        const std::string &name,
96        bool nameIsPointer,
97        const std::string &parcelObj,
98        bool parcelObjIsPointer,
99        bool isReader,
100        ErrorMode mode,
101        const std::string &parentName,
102        const std::string &offsetText) const {
103    emitReaderWriterEmbeddedForTypeName(
104            out,
105            name,
106            nameIsPointer,
107            parcelObj,
108            parcelObjIsPointer,
109            isReader,
110            mode,
111            parentName,
112            offsetText,
113            "::android::hardware::hidl_string",
114            "" /* childName */);
115}
116
117void StringType::emitJavaFieldInitializer(
118        Formatter &out, const std::string &fieldName) const {
119    out << "String "
120        << fieldName
121        << " = new String();\n";
122}
123
124void StringType::emitJavaFieldReaderWriter(
125        Formatter &out,
126        const std::string &blobName,
127        const std::string &fieldName,
128        const std::string &offset,
129        bool isReader) const {
130    if (isReader) {
131        out << "\nparcel.readEmbeddedBuffer(\n";
132
133        out.indent();
134        out.indent();
135
136        out << blobName
137            << ".handle(),\n"
138            << offset
139            << " + 0 /* offsetof(hidl_string, mBuffer) */);\n\n";
140
141        out.unindent();
142        out.unindent();
143
144        out << fieldName
145            << " = "
146            << blobName
147            << ".getString("
148            << offset
149            << ");\n";
150
151        return;
152    }
153
154    out << blobName
155        << ".putString("
156        << offset
157        << ", "
158        << fieldName
159        << ");\n";
160}
161
162bool StringType::needsEmbeddedReadWrite() const {
163    return true;
164}
165
166bool StringType::resultNeedsDeref() const {
167    return true;
168}
169
170status_t StringType::emitVtsTypeDeclarations(Formatter &out) const {
171    out << "type: TYPE_STRING\n";
172    return OK;
173}
174
175void StringType::getAlignmentAndSize(size_t *align, size_t *size) const {
176    *align = 8;  // hidl_string
177    *size = 24;
178}
179
180}  // namespace android
181
182