blob: 9e46f947eff499a13ec0d3c0ccd4096144e9e036 [file] [log] [blame]
Andreas Huberc9410c72016-07-28 12:18:40 -07001#include "StringType.h"
2
3#include "Formatter.h"
4
5namespace android {
6
7StringType::StringType() {}
8
Andreas Huber881227d2016-08-02 14:20:21 -07009std::string StringType::getCppType(StorageMode mode, std::string *extra) const {
10 extra->clear();
11
Andreas Huber8a82ff72016-08-04 10:29:39 -070012 const std::string base = "::android::hardware::hidl_string";
Andreas Huber881227d2016-08-02 14:20:21 -070013
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
Andreas Huber2831d512016-08-15 09:33:47 -070026std::string StringType::getJavaType() const {
27 return "String";
28}
29
30std::string StringType::getJavaSuffix() const {
31 return "String";
32}
33
Andreas Huber881227d2016-08-02 14:20:21 -070034void 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 {
Iliyan Malchev549e2592016-08-10 08:59:12 -070041 const std::string parentName = "_hidl_" + name + "_parent";
Andreas Huber881227d2016-08-02 14:20:21 -070042 out << "size_t " << parentName << ";\n\n";
43
44 const std::string parcelObjDeref =
45 parcelObj + (parcelObjIsPointer ? "->" : ".");
46
47 if (isReader) {
48 out << name
Andreas Huber8a82ff72016-08-04 10:29:39 -070049 << " = (const ::android::hardware::hidl_string *)"
Andreas Huber881227d2016-08-02 14:20:21 -070050 << parcelObjDeref
51 << "readBuffer("
52 << "&"
53 << parentName
54 << ");\n";
55
56 out << "if ("
57 << name
58 << " == nullptr) {\n";
59
60 out.indent();
61
Iliyan Malchev549e2592016-08-10 08:59:12 -070062 out << "_hidl_err = ::android::UNKNOWN_ERROR;\n";
Andreas Huber881227d2016-08-02 14:20:21 -070063 handleError2(out, mode);
64
65 out.unindent();
66 out << "}\n\n";
67 } else {
Iliyan Malchev549e2592016-08-10 08:59:12 -070068 out << "_hidl_err = "
Andreas Huber881227d2016-08-02 14:20:21 -070069 << 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,
Andreas Huber8a82ff72016-08-04 10:29:39 -0700113 "::android::hardware::hidl_string",
Andreas Huber881227d2016-08-02 14:20:21 -0700114 "" /* childName */);
115}
116
117bool StringType::needsEmbeddedReadWrite() const {
118 return true;
119}
120
121bool StringType::resultNeedsDeref() const {
122 return true;
123}
124
Zhuoyao Zhang5158db42016-08-10 10:25:20 -0700125status_t StringType::emitVtsTypeDeclarations(Formatter &out) const {
126 out << "type: TYPE_STRING\n";
127 return OK;
128}
129
Andreas Huberc9410c72016-07-28 12:18:40 -0700130} // namespace android
131