StringType.cpp revision 85eabdbe56720dcdcf130e5ca83129d47b143768
1c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#include "StringType.h"
2c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
3c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#include "Formatter.h"
4c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
5c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Hubernamespace android {
6c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
7c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas HuberStringType::StringType() {}
8c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
9881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberstd::string StringType::getCppType(StorageMode mode, std::string *extra) const {
10881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    extra->clear();
11881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
128a82ff7ce6b5c0288b5239e25e1cbd1f5d8e3d27Andreas Huber    const std::string base = "::android::hardware::hidl_string";
13881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
14881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    switch (mode) {
15881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case StorageMode_Stack:
16881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            return base;
17881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
18881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case StorageMode_Argument:
19881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            return "const " + base + "&";
20881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
21881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case StorageMode_Result:
22881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            return "const " + base + "*";
23881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
24881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
25881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
262831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huberstd::string StringType::getJavaType() const {
272831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    return "String";
282831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
292831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
302831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huberstd::string StringType::getJavaSuffix() const {
312831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    return "String";
322831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
332831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
34881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid StringType::emitReaderWriter(
35881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        Formatter &out,
36881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &name,
37881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &parcelObj,
38881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool parcelObjIsPointer,
39881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool isReader,
40881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode mode) const {
41549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev    const std::string parentName = "_hidl_" + name + "_parent";
42881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out << "size_t " << parentName << ";\n\n";
43881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
44881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    const std::string parcelObjDeref =
45881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        parcelObj + (parcelObjIsPointer ? "->" : ".");
46881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
47881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    if (isReader) {
48881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        out << name
498a82ff7ce6b5c0288b5239e25e1cbd1f5d8e3d27Andreas Huber            << " = (const ::android::hardware::hidl_string *)"
50881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << parcelObjDeref
51881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << "readBuffer("
52881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << "&"
53881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << parentName
54881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << ");\n";
55881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
56881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        out << "if ("
57881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << name
58881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << " == nullptr) {\n";
59881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
60881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        out.indent();
61881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
62549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev        out << "_hidl_err = ::android::UNKNOWN_ERROR;\n";
63881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        handleError2(out, mode);
64881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
65881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        out.unindent();
66881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        out << "}\n\n";
67881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    } else {
68549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev        out << "_hidl_err = "
69881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << parcelObjDeref
70881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << "writeBuffer(&"
71881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << name
72881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << ", sizeof("
73881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << name
74881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << "), &"
75881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << parentName
76881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << ");\n";
77881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
78881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        handleError(out, mode);
79881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
80881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
81881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    emitReaderWriterEmbedded(
82881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            out,
83881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            name,
84881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            isReader /* nameIsPointer */,
85881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            parcelObj,
86881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            parcelObjIsPointer,
87881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            isReader,
88881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            mode,
89881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            parentName,
90881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            "0 /* parentOffset */");
91881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
92881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
93881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid StringType::emitReaderWriterEmbedded(
94881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        Formatter &out,
95881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &name,
96881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool nameIsPointer,
97881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &parcelObj,
98881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool parcelObjIsPointer,
99881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool isReader,
100881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode mode,
101881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &parentName,
102881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &offsetText) const {
103881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    emitReaderWriterEmbeddedForTypeName(
104881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            out,
105881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            name,
106881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            nameIsPointer,
107881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            parcelObj,
108881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            parcelObjIsPointer,
109881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            isReader,
110881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            mode,
111881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            parentName,
112881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            offsetText,
1138a82ff7ce6b5c0288b5239e25e1cbd1f5d8e3d27Andreas Huber            "::android::hardware::hidl_string",
114881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            "" /* childName */);
115881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
116881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
11785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid StringType::emitJavaFieldInitializer(
11885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        Formatter &out, const std::string &fieldName) const {
11985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    out << "String "
12085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        << fieldName
12185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        << " = new String();\n";
12285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber}
12385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
12485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid StringType::emitJavaFieldReaderWriter(
12585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        Formatter &out,
12685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &blobName,
12785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &fieldName,
12885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &offset,
12985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        bool isReader) const {
13085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    if (isReader) {
13185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        out << "\nparcel.readEmbeddedBuffer(\n";
13285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
13385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        out.indent();
13485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        out.indent();
13585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
13685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        out << blobName
13785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            << ".handle(),\n"
13885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            << offset
13985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            << " + 0 /* offsetof(hidl_string, mBuffer) */);\n\n";
14085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
14185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        out.unindent();
14285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        out.unindent();
14385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
14485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        out << fieldName
14585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            << " = "
14685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            << blobName
14785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            << ".getString("
14885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            << offset
14985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            << ");\n";
15085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
15185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        return;
15285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    }
15385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
15485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    out << blobName
15585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        << ".putString("
15685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        << offset
15785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        << ", "
15885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        << fieldName
15985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        << ");\n";
16085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber}
16185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
162881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberbool StringType::needsEmbeddedReadWrite() const {
163881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return true;
164881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
165881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
166881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberbool StringType::resultNeedsDeref() const {
167881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return true;
168881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
169881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
1705158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhangstatus_t StringType::emitVtsTypeDeclarations(Formatter &out) const {
1715158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    out << "type: TYPE_STRING\n";
1725158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    return OK;
1735158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang}
1745158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
17585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid StringType::getAlignmentAndSize(size_t *align, size_t *size) const {
17685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    *align = 8;  // hidl_string
17785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    *size = 24;
17885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber}
17985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
180c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}  // namespace android
181c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
182