StringType.cpp revision 6a082c63904f274c45d5eede313e0ef77ec70f86
11aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber/*
21aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * Copyright (C) 2016 The Android Open Source Project
31aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber *
41aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
51aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * you may not use this file except in compliance with the License.
61aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * You may obtain a copy of the License at
71aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber *
81aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
91aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber *
101aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * Unless required by applicable law or agreed to in writing, software
111aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
121aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * See the License for the specific language governing permissions and
141aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber * limitations under the License.
151aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber */
161aec397b1fdea7db4120dbe55b6995bb2a9d9138Andreas Huber
17c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#include "StringType.h"
18c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
19a72e0d2be173cebf62f728b9d215808bd862f219Iliyan Malchev#include <hidl-util/Formatter.h>
20c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
21c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Hubernamespace android {
22c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
23c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas HuberStringType::StringType() {}
24c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
25979e099f1163ff75beed5776cd01fb409b90a0cdSteven Morelandvoid StringType::addNamedTypesToSet(std::set<const FQName> &) const {
26979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland    // do nothing
27979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland}
28979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland
29abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hongbool StringType::isString() const {
30abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong    return true;
31abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong}
32abf73eef7f23f0b0ba0fe85694dcd511f4e69962Yifan Hong
33c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hongbool StringType::canCheckEquality() const {
34c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong    return true;
35c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong}
36c6752dcea3b5dae1e99960b5beb6af394280b393Yifan Hong
37979e099f1163ff75beed5776cd01fb409b90a0cdSteven Morelandstd::string StringType::getCppType(StorageMode mode,
38979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland                                   bool specifyNamespaces) const {
39979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland    const std::string base =
40979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland          std::string(specifyNamespaces ? "::android::hardware::" : "")
41979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland        + "hidl_string";
42881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
43881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    switch (mode) {
44881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case StorageMode_Stack:
45881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            return base;
46881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
47881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case StorageMode_Argument:
48881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            return "const " + base + "&";
49881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
50881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case StorageMode_Result:
51881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            return "const " + base + "*";
52881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
53881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
54881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
554ed1347cd29e6e07acad368891bb03078c798abaYifan Hongstd::string StringType::getJavaType(bool /* forInitializer */) const {
562831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    return "String";
572831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
582831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
592831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huberstd::string StringType::getJavaSuffix() const {
602831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    return "String";
612831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
622831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
63c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhangstd::string StringType::getVtsType() const {
64c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang    return "TYPE_STRING";
65c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang}
66c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang
67881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid StringType::emitReaderWriter(
68881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        Formatter &out,
69881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &name,
70881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &parcelObj,
71881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool parcelObjIsPointer,
72881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool isReader,
73881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode mode) const {
74549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev    const std::string parentName = "_hidl_" + name + "_parent";
75881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    out << "size_t " << parentName << ";\n\n";
76881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
77881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    const std::string parcelObjDeref =
78881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        parcelObj + (parcelObjIsPointer ? "->" : ".");
79881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
80881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    if (isReader) {
816a082c63904f274c45d5eede313e0ef77ec70f86Martijn Coenen        out << "_hidl_err = "
82881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << parcelObjDeref
836a082c63904f274c45d5eede313e0ef77ec70f86Martijn Coenen            << "readBuffer(&"
84881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << parentName
856a082c63904f274c45d5eede313e0ef77ec70f86Martijn Coenen            << ", "
866a082c63904f274c45d5eede313e0ef77ec70f86Martijn Coenen            << " reinterpret_cast<const void **>("
876a082c63904f274c45d5eede313e0ef77ec70f86Martijn Coenen            << "&" << name
886a082c63904f274c45d5eede313e0ef77ec70f86Martijn Coenen            << "));\n\n";
89881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
906a082c63904f274c45d5eede313e0ef77ec70f86Martijn Coenen        handleError(out, mode);
91881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    } else {
92549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev        out << "_hidl_err = "
93881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << parcelObjDeref
94881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << "writeBuffer(&"
95881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << name
96881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << ", sizeof("
97881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << name
98881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << "), &"
99881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << parentName
100881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << ");\n";
101881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
102881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        handleError(out, mode);
103881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
104881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
105881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    emitReaderWriterEmbedded(
106881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            out,
107f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber            0 /* depth */,
108881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            name,
109be2a3737675b83dd61b52c11f0d7549fa1276739Yifan Hong            name /* sanitizedName */,
110881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            isReader /* nameIsPointer */,
111881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            parcelObj,
112881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            parcelObjIsPointer,
113881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            isReader,
114881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            mode,
115881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            parentName,
116881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            "0 /* parentOffset */");
117881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
118881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
119881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid StringType::emitReaderWriterEmbedded(
120881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        Formatter &out,
121f9d49f1468bd65595f6f0ae5f4d7300f4e95edf8Andreas Huber        size_t /* depth */,
122881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &name,
123be2a3737675b83dd61b52c11f0d7549fa1276739Yifan Hong        const std::string & /*sanitizedName*/,
124881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool nameIsPointer,
125881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &parcelObj,
126881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool parcelObjIsPointer,
127881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool isReader,
128881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode mode,
129881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &parentName,
130881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &offsetText) const {
131881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    emitReaderWriterEmbeddedForTypeName(
132881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            out,
133881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            name,
134881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            nameIsPointer,
135881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            parcelObj,
136881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            parcelObjIsPointer,
137881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            isReader,
138881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            mode,
139881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            parentName,
140881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            offsetText,
1418a82ff7ce6b5c0288b5239e25e1cbd1f5d8e3d27Andreas Huber            "::android::hardware::hidl_string",
142244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong            "" /* childName */,
143244e82d34bf0ef5d8d5b0730a9dea3e3fc4de7c5Yifan Hong            "::android::hardware");
144881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
145881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
14685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid StringType::emitJavaFieldInitializer(
14785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        Formatter &out, const std::string &fieldName) const {
14885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    out << "String "
14985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        << fieldName
15085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        << " = new String();\n";
15185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber}
15285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
15385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid StringType::emitJavaFieldReaderWriter(
15485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        Formatter &out,
1554c865b72b320a46f326a335cfd326b66b0e10f67Andreas Huber        size_t /* depth */,
156709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber        const std::string &parcelName,
15785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &blobName,
15885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &fieldName,
15985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        const std::string &offset,
16085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        bool isReader) const {
16185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    if (isReader) {
162709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber        out << "\n"
163709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber            << parcelName
164709b62dbda6184770bb34470ff550e02c1643e67Andreas Huber            << ".readEmbeddedBuffer(\n";
16585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
16685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        out.indent();
16785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        out.indent();
16885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
16985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        out << blobName
17085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            << ".handle(),\n"
17185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            << offset
17285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            << " + 0 /* offsetof(hidl_string, mBuffer) */);\n\n";
17385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
17485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        out.unindent();
17585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        out.unindent();
17685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
17785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        out << fieldName
17885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            << " = "
17985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            << blobName
18085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            << ".getString("
18185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            << offset
18285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber            << ");\n";
18385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
18485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        return;
18585eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    }
18685eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
18785eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    out << blobName
18885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        << ".putString("
18985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        << offset
19085eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        << ", "
19185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        << fieldName
19285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber        << ");\n";
19385eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber}
19485eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
195881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberbool StringType::needsEmbeddedReadWrite() const {
196881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return true;
197881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
198881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
199881227d860c59471eee31d39946e96ce2daa35d6Andreas Huberbool StringType::resultNeedsDeref() const {
200881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    return true;
201881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
202881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
2035158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhangstatus_t StringType::emitVtsTypeDeclarations(Formatter &out) const {
204ae83dcd90dd6ab0aa0a8950fc79e88cfccdf5a89Zhuoyao Zhang    out << "type: " << getVtsType() << "\n";
2055158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    return OK;
2065158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang}
2075158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
20885eabdbe56720dcdcf130e5ca83129d47b143768Andreas Hubervoid StringType::getAlignmentAndSize(size_t *align, size_t *size) const {
20985eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber    *align = 8;  // hidl_string
210cfa7934d4e579d4e7e589042c3af1044e63d45a5Pavel Maltsev    *size = 16;
21185eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber}
21285eabdbe56720dcdcf130e5ca83129d47b143768Andreas Huber
213c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}  // namespace android
214c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
215