blob: 903478a1532a3cf77f3ee32b3c1c7665dafa37b9 [file] [log] [blame]
Andreas Huberc9410c72016-07-28 12:18:40 -07001#include "VectorType.h"
2
3#include "Formatter.h"
4
Andreas Huber881227d2016-08-02 14:20:21 -07005#include <android-base/logging.h>
6
Andreas Huberc9410c72016-07-28 12:18:40 -07007namespace android {
8
9VectorType::VectorType(Type *elementType)
10 : mElementType(elementType) {
11}
12
13void VectorType::dump(Formatter &out) const {
14 out<< "vec<";
15 mElementType->dump(out);
16 out << ">";
17}
18
Andreas Huber881227d2016-08-02 14:20:21 -070019std::string VectorType::getCppType(StorageMode mode, std::string *extra) const {
20 const std::string base =
21 "::android::hidl::hidl_vec<"
22 + mElementType->getCppType(extra)
23 + ">";
24
25 CHECK(extra->empty());
26
27 switch (mode) {
28 case StorageMode_Stack:
29 return base;
30
31 case StorageMode_Argument:
32 return "const " + base + "&";
33
34 case StorageMode_Result:
35 return "const " + base + "*";
36 }
37}
38
39void VectorType::emitReaderWriter(
40 Formatter &out,
41 const std::string &name,
42 const std::string &parcelObj,
43 bool parcelObjIsPointer,
44 bool isReader,
45 ErrorMode mode) const {
46 std::string baseExtra;
47 std::string baseType = mElementType->getCppType(&baseExtra);
48
49 const std::string parentName = "_aidl_" + name + "_parent";
50
51 out << "size_t " << parentName << ";\n\n";
52
53 const std::string parcelObjDeref =
54 parcelObj + (parcelObjIsPointer ? "->" : ".");
55
56 if (isReader) {
57 out << name
58 << " = (const ::android::hidl::hidl_vec<"
59 << baseType
60 << "> *)"
61 << parcelObjDeref
62 << "readBuffer(&"
63 << parentName
64 << ");\n\n";
65
66 out << "if (" << name << " == nullptr) {\n";
67
68 out.indent();
69
70 out << "_aidl_err = ::android::UNKNOWN_ERROR;\n";
71 handleError2(out, mode);
72
73 out.unindent();
74 out << "}\n\n";
75 } else {
76 out << "_aidl_err = "
77 << parcelObjDeref
78 << "writeBuffer(&"
79 << name
80 << ", sizeof("
81 << name
82 << "), &"
83 << parentName
84 << ");\n";
85
86 handleError(out, mode);
87 }
88
89 emitReaderWriterEmbedded(
90 out,
91 name,
92 isReader /* nameIsPointer */,
93 parcelObj,
94 parcelObjIsPointer,
95 isReader,
96 mode,
97 parentName,
98 "0 /* parentOffset */");
99}
100
101void VectorType::emitReaderWriterEmbedded(
102 Formatter &out,
103 const std::string &name,
104 bool nameIsPointer,
105 const std::string &parcelObj,
106 bool parcelObjIsPointer,
107 bool isReader,
108 ErrorMode mode,
109 const std::string &parentName,
110 const std::string &offsetText) const {
111 std::string baseExtra;
112 std::string baseType = Type::getCppType(&baseExtra);
113
114 const std::string childName = "_aidl_" + name + "_child";
115 out << "size_t " << childName << ";\n\n";
116
117 emitReaderWriterEmbeddedForTypeName(
118 out,
119 name,
120 nameIsPointer,
121 parcelObj,
122 parcelObjIsPointer,
123 isReader,
124 mode,
125 parentName,
126 offsetText,
127 baseType,
128 childName);
129
130 if (!mElementType->needsEmbeddedReadWrite()) {
131 return;
132 }
133
134 const std::string nameDeref = name + (nameIsPointer ? "->" : ".");
135
136 baseType = mElementType->getCppType(&baseExtra);
137
138 out << "for (size_t _aidl_index = 0; _aidl_index < "
139 << nameDeref
140 << "count; ++_aidl_index) {\n";
141
142 out.indent();
143
144 mElementType->emitReaderWriterEmbedded(
145 out,
146 nameDeref + "buffer[_aidl_index]",
147 false /* nameIsPointer */,
148 parcelObj,
149 parcelObjIsPointer,
150 isReader,
151 mode,
152 childName,
153 "_aidl_index * sizeof(" + baseType + ")");
154
155 out.unindent();
156
157 out << "}\n\n";
158}
159
160bool VectorType::needsEmbeddedReadWrite() const {
161 return true;
162}
163
164bool VectorType::resultNeedsDeref() const {
165 return true;
166}
167
Andreas Huberc9410c72016-07-28 12:18:40 -0700168} // namespace android
169