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 "Interface.h"
18c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
19ba7e6e9d5d30a9d9a39daeb42d2ca2cd06234640Zhuoyao Zhang#include "Annotation.h"
2030b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong#include "ArrayType.h"
2130b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong#include "ConstantExpression.h"
22115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen#include "DeathRecipientType.h"
23c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber#include "Method.h"
24115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen#include "ScalarType.h"
2510fe0b55e774903fe37b658458053527da8b5a53Yifan Hong#include "StringType.h"
2610fe0b55e774903fe37b658458053527da8b5a53Yifan Hong#include "VectorType.h"
27c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
2830b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong#include <unistd.h>
2930b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong
3030b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong#include <iostream>
3130b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong#include <sstream>
3230b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong
3314ee6749f12bcd43477fe8110fbec38e15376b40Steven Moreland#include <android-base/logging.h>
345bdfa70833286d9085888e0d2843857b9be7d6b2Steven Moreland#include <hidl-hash/Hash.h>
35a72e0d2be173cebf62f728b9d215808bd862f219Iliyan Malchev#include <hidl-util/Formatter.h>
3610fe0b55e774903fe37b658458053527da8b5a53Yifan Hong#include <hidl-util/StringHelper.h>
37864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang
38c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Hubernamespace android {
39c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
40b8e15a5f4b4594115dd92c3249faf8148ae36d4cSteven Moreland#define B_PACK_CHARS(c1, c2, c3, c4) \
41b8e15a5f4b4594115dd92c3249faf8148ae36d4cSteven Moreland         ((((c1)<<24)) | (((c2)<<16)) | (((c3)<<8)) | (c4))
42b8e15a5f4b4594115dd92c3249faf8148ae36d4cSteven Moreland
4310fe0b55e774903fe37b658458053527da8b5a53Yifan Hong/* It is very important that these values NEVER change. These values
4410fe0b55e774903fe37b658458053527da8b5a53Yifan Hong * must remain unchanged over the lifetime of android. This is
4510fe0b55e774903fe37b658458053527da8b5a53Yifan Hong * because the framework on a device will be updated independently of
4610fe0b55e774903fe37b658458053527da8b5a53Yifan Hong * the hals on a device. If the hals are compiled with one set of
4710fe0b55e774903fe37b658458053527da8b5a53Yifan Hong * transaction values, and the framework with another, then the
4810fe0b55e774903fe37b658458053527da8b5a53Yifan Hong * interface between them will be destroyed, and the device will not
4910fe0b55e774903fe37b658458053527da8b5a53Yifan Hong * work.
5010fe0b55e774903fe37b658458053527da8b5a53Yifan Hong */
5110fe0b55e774903fe37b658458053527da8b5a53Yifan Hongenum {
5210fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    /////////////////// User defined transactions
5310fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    FIRST_CALL_TRANSACTION  = 0x00000001,
54b8e15a5f4b4594115dd92c3249faf8148ae36d4cSteven Moreland    LAST_CALL_TRANSACTION   = 0x0effffff,
5510fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    /////////////////// HIDL reserved
56b8e15a5f4b4594115dd92c3249faf8148ae36d4cSteven Moreland    FIRST_HIDL_TRANSACTION  = 0x0f000000,
57b8e15a5f4b4594115dd92c3249faf8148ae36d4cSteven Moreland    HIDL_PING_TRANSACTION                     = B_PACK_CHARS(0x0f, 'P', 'N', 'G'),
58b8e15a5f4b4594115dd92c3249faf8148ae36d4cSteven Moreland    HIDL_DESCRIPTOR_CHAIN_TRANSACTION         = B_PACK_CHARS(0x0f, 'C', 'H', 'N'),
59b8e15a5f4b4594115dd92c3249faf8148ae36d4cSteven Moreland    HIDL_GET_DESCRIPTOR_TRANSACTION           = B_PACK_CHARS(0x0f, 'D', 'S', 'C'),
60b8e15a5f4b4594115dd92c3249faf8148ae36d4cSteven Moreland    HIDL_SYSPROPS_CHANGED_TRANSACTION         = B_PACK_CHARS(0x0f, 'S', 'Y', 'S'),
61b8e15a5f4b4594115dd92c3249faf8148ae36d4cSteven Moreland    HIDL_LINK_TO_DEATH_TRANSACTION            = B_PACK_CHARS(0x0f, 'L', 'T', 'D'),
62b8e15a5f4b4594115dd92c3249faf8148ae36d4cSteven Moreland    HIDL_UNLINK_TO_DEATH_TRANSACTION          = B_PACK_CHARS(0x0f, 'U', 'T', 'D'),
63b8e15a5f4b4594115dd92c3249faf8148ae36d4cSteven Moreland    HIDL_SET_HAL_INSTRUMENTATION_TRANSACTION  = B_PACK_CHARS(0x0f, 'I', 'N', 'T'),
64b8e15a5f4b4594115dd92c3249faf8148ae36d4cSteven Moreland    HIDL_GET_REF_INFO_TRANSACTION             = B_PACK_CHARS(0x0f, 'R', 'E', 'F'),
65b8e15a5f4b4594115dd92c3249faf8148ae36d4cSteven Moreland    HIDL_DEBUG_TRANSACTION                    = B_PACK_CHARS(0x0f, 'D', 'B', 'G'),
6630b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong    HIDL_HASH_CHAIN_TRANSACTION               = B_PACK_CHARS(0x0f, 'H', 'S', 'H'),
67b8e15a5f4b4594115dd92c3249faf8148ae36d4cSteven Moreland    LAST_HIDL_TRANSACTION   = 0x0fffffff,
6810fe0b55e774903fe37b658458053527da8b5a53Yifan Hong};
6910fe0b55e774903fe37b658458053527da8b5a53Yifan Hong
7000d1614c5ccb148e0f12f09bf90e5eb034d0e300Timur IskhakovInterface::Interface(const char* localName, const Location& location, Scope* parent,
7100d1614c5ccb148e0f12f09bf90e5eb034d0e300Timur Iskhakov                     Interface* super)
7200d1614c5ccb148e0f12f09bf90e5eb034d0e300Timur Iskhakov    : Scope(localName, location, parent), mSuperType(super), mIsJavaCompatibleInProgress(false) {}
73af712c083e79fb9990e56677cf4c80eacb9c3d3bMartijn Coenen
7430bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Morelandstd::string Interface::typeName() const {
7530bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland    return "interface " + localName();
7630bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland}
7730bb6a869be0f3f82497b7b11c71ec9d47652ed0Steven Moreland
78424a948265821d514be42e9e2dd9a53cf515d0bbSteven Morelandbool Interface::fillPingMethod(Method *method) const {
79424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland    if (method->name() != "ping") {
80424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland        return false;
81424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland    }
82424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland
83424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland    method->fillImplementation(
84424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland        HIDL_PING_TRANSACTION,
85424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland        {
86937408abc412733f46ba59e2342496b465e8c312Steven Moreland            {IMPL_INTERFACE,
87424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland                [](auto &out) {
88424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland                    out << "return ::android::hardware::Void();\n";
89424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland                }
90424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland            },
91424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland            {IMPL_STUB_IMPL,
92424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland                [](auto &out) {
93424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland                    out << "return ::android::hardware::Void();\n";
94424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland                }
95424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland            }
96424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland        }, /*cppImpl*/
97424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland        {
98937408abc412733f46ba59e2342496b465e8c312Steven Moreland            {IMPL_INTERFACE,
99c8ff467dbd8d55622c4ff7f45c53bce7e2b6beb5Yi Kong                [](auto &out) {
100424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland                    out << "return;\n";
101424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland                }
102424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland            },
103424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland            {IMPL_STUB, nullptr /* don't generate code */}
104424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland        } /*javaImpl*/
105424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland    );
106424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland
107424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland    return true;
108424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland}
109424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland
110ffa913993fb527b44053c11f139689d3267748ecYifan Hongbool Interface::fillLinkToDeathMethod(Method *method) const {
111ffa913993fb527b44053c11f139689d3267748ecYifan Hong    if (method->name() != "linkToDeath") {
112ffa913993fb527b44053c11f139689d3267748ecYifan Hong        return false;
113ffa913993fb527b44053c11f139689d3267748ecYifan Hong    }
114ffa913993fb527b44053c11f139689d3267748ecYifan Hong
115ffa913993fb527b44053c11f139689d3267748ecYifan Hong    method->fillImplementation(
116115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen            HIDL_LINK_TO_DEATH_TRANSACTION,
117115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen            {
118937408abc412733f46ba59e2342496b465e8c312Steven Moreland                {IMPL_INTERFACE,
119115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                    [](auto &out) {
120115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                        out << "(void)cookie;\n"
121115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                            << "return (recipient != nullptr);\n";
122115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                    }
123115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                },
124115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                {IMPL_PROXY,
125115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                    [](auto &out) {
126fa55d6ec8496deb5e40865f13f8bf6a971ca622dMartijn Coenen                        out << "::android::hardware::ProcessState::self()->startThreadPool();\n";
127115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                        out << "::android::hardware::hidl_binder_death_recipient *binder_recipient"
128115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                            << " = new ::android::hardware::hidl_binder_death_recipient(recipient, cookie, this);\n"
129115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                            << "std::unique_lock<std::mutex> lock(_hidl_mMutex);\n"
130115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                            << "_hidl_mDeathRecipients.push_back(binder_recipient);\n"
131115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                            << "return (remote()->linkToDeath(binder_recipient)"
132115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                            << " == ::android::OK);\n";
133115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                    }
134115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                },
1358d12b50cfb20eaef50e0998abe8d458866896003Martijn Coenen                {IMPL_STUB, nullptr}
136115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen            }, /*cppImpl*/
137115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen            {
138937408abc412733f46ba59e2342496b465e8c312Steven Moreland                {IMPL_INTERFACE,
139c8ff467dbd8d55622c4ff7f45c53bce7e2b6beb5Yi Kong                    [](auto &out) {
140115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                        out << "return true;";
141115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                    }
142115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                },
143115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                {IMPL_PROXY,
144c8ff467dbd8d55622c4ff7f45c53bce7e2b6beb5Yi Kong                    [](auto &out) {
1458d12b50cfb20eaef50e0998abe8d458866896003Martijn Coenen                        out << "return mRemote.linkToDeath(recipient, cookie);\n";
146115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                    }
147115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                },
1488d12b50cfb20eaef50e0998abe8d458866896003Martijn Coenen                {IMPL_STUB, nullptr}
149115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen            } /*javaImpl*/
150115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen    );
151ffa913993fb527b44053c11f139689d3267748ecYifan Hong    return true;
152115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen}
153115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen
154ffa913993fb527b44053c11f139689d3267748ecYifan Hongbool Interface::fillUnlinkToDeathMethod(Method *method) const {
155ffa913993fb527b44053c11f139689d3267748ecYifan Hong    if (method->name() != "unlinkToDeath") {
156ffa913993fb527b44053c11f139689d3267748ecYifan Hong        return false;
157ffa913993fb527b44053c11f139689d3267748ecYifan Hong    }
158ffa913993fb527b44053c11f139689d3267748ecYifan Hong
159ffa913993fb527b44053c11f139689d3267748ecYifan Hong    method->fillImplementation(
160115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen            HIDL_UNLINK_TO_DEATH_TRANSACTION,
161115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen            {
162937408abc412733f46ba59e2342496b465e8c312Steven Moreland                {IMPL_INTERFACE,
163115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                    [](auto &out) {
164115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                        out << "return (recipient != nullptr);\n";
165115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                    }
166115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                },
167115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                {IMPL_PROXY,
168115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                    [](auto &out) {
169115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                        out << "std::unique_lock<std::mutex> lock(_hidl_mMutex);\n"
170115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                            << "for (auto it = _hidl_mDeathRecipients.begin();"
171115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                            << "it != _hidl_mDeathRecipients.end();"
172115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                            << "++it) {\n";
173115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                        out.indent([&] {
174115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                            out.sIf("(*it)->getRecipient() == recipient", [&] {
175115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                                out << "::android::status_t status = remote()->unlinkToDeath(*it);\n"
176115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                                    << "_hidl_mDeathRecipients.erase(it);\n"
177115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                                    << "return status == ::android::OK;\n";
178115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                                });
179115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                            });
180115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                        out << "}\n";
181115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                        out << "return false;\n";
182115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                    }
183115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                },
1848d12b50cfb20eaef50e0998abe8d458866896003Martijn Coenen                {IMPL_STUB, nullptr /* don't generate code */}
185115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen            }, /*cppImpl*/
186115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen            {
187937408abc412733f46ba59e2342496b465e8c312Steven Moreland                {IMPL_INTERFACE,
188c8ff467dbd8d55622c4ff7f45c53bce7e2b6beb5Yi Kong                    [](auto &out) {
1898d12b50cfb20eaef50e0998abe8d458866896003Martijn Coenen                        out << "return true;\n";
190115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                    }
191115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                },
192115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                {IMPL_PROXY,
193c8ff467dbd8d55622c4ff7f45c53bce7e2b6beb5Yi Kong                    [](auto &out) {
1948d12b50cfb20eaef50e0998abe8d458866896003Martijn Coenen                        out << "return mRemote.unlinkToDeath(recipient);\n";
195115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                    }
196115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen                },
1978d12b50cfb20eaef50e0998abe8d458866896003Martijn Coenen                {IMPL_STUB, nullptr /* don't generate code */}
198115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen            } /*javaImpl*/
199115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen    );
200ffa913993fb527b44053c11f139689d3267748ecYifan Hong    return true;
201115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen}
202ffa913993fb527b44053c11f139689d3267748ecYifan Hongbool Interface::fillSyspropsChangedMethod(Method *method) const {
203ffa913993fb527b44053c11f139689d3267748ecYifan Hong    if (method->name() != "notifySyspropsChanged") {
204ffa913993fb527b44053c11f139689d3267748ecYifan Hong        return false;
205ffa913993fb527b44053c11f139689d3267748ecYifan Hong    }
206ffa913993fb527b44053c11f139689d3267748ecYifan Hong
207ffa913993fb527b44053c11f139689d3267748ecYifan Hong    method->fillImplementation(
208af712c083e79fb9990e56677cf4c80eacb9c3d3bMartijn Coenen            HIDL_SYSPROPS_CHANGED_TRANSACTION,
209c8ff467dbd8d55622c4ff7f45c53bce7e2b6beb5Yi Kong            { { IMPL_INTERFACE, [](auto &out) {
210af712c083e79fb9990e56677cf4c80eacb9c3d3bMartijn Coenen                out << "::android::report_sysprop_change();\n";
211af712c083e79fb9990e56677cf4c80eacb9c3d3bMartijn Coenen                out << "return ::android::hardware::Void();";
212115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen            } } }, /*cppImpl */
213937408abc412733f46ba59e2342496b465e8c312Steven Moreland            { { IMPL_INTERFACE, [](auto &out) { /* javaImpl */
214af712c083e79fb9990e56677cf4c80eacb9c3d3bMartijn Coenen                out << "android.os.SystemProperties.reportSyspropChanged();";
215115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen            } } } /*javaImpl */
216af712c083e79fb9990e56677cf4c80eacb9c3d3bMartijn Coenen    );
217ffa913993fb527b44053c11f139689d3267748ecYifan Hong    return true;
21810fe0b55e774903fe37b658458053527da8b5a53Yifan Hong}
21910fe0b55e774903fe37b658458053527da8b5a53Yifan Hong
220ffa913993fb527b44053c11f139689d3267748ecYifan Hongbool Interface::fillSetHALInstrumentationMethod(Method *method) const {
221ffa913993fb527b44053c11f139689d3267748ecYifan Hong    if (method->name() != "setHALInstrumentation") {
222ffa913993fb527b44053c11f139689d3267748ecYifan Hong        return false;
223ffa913993fb527b44053c11f139689d3267748ecYifan Hong    }
224ffa913993fb527b44053c11f139689d3267748ecYifan Hong
225ffa913993fb527b44053c11f139689d3267748ecYifan Hong    method->fillImplementation(
226dd85c5c9cc6ff58737809668d993c5e6eab673d7Zhuoyao Zhang            HIDL_SET_HAL_INSTRUMENTATION_TRANSACTION,
227dd85c5c9cc6ff58737809668d993c5e6eab673d7Zhuoyao Zhang            {
228937408abc412733f46ba59e2342496b465e8c312Steven Moreland                {IMPL_INTERFACE,
229c8ff467dbd8d55622c4ff7f45c53bce7e2b6beb5Yi Kong                    [](auto &out) {
230dd85c5c9cc6ff58737809668d993c5e6eab673d7Zhuoyao Zhang                        // do nothing for base class.
231dd85c5c9cc6ff58737809668d993c5e6eab673d7Zhuoyao Zhang                        out << "return ::android::hardware::Void();\n";
232dd85c5c9cc6ff58737809668d993c5e6eab673d7Zhuoyao Zhang                    }
233dd85c5c9cc6ff58737809668d993c5e6eab673d7Zhuoyao Zhang                },
234dd85c5c9cc6ff58737809668d993c5e6eab673d7Zhuoyao Zhang                {IMPL_STUB,
235dd85c5c9cc6ff58737809668d993c5e6eab673d7Zhuoyao Zhang                    [](auto &out) {
236dd85c5c9cc6ff58737809668d993c5e6eab673d7Zhuoyao Zhang                        out << "configureInstrumentation();\n";
237dd85c5c9cc6ff58737809668d993c5e6eab673d7Zhuoyao Zhang                    }
238dd85c5c9cc6ff58737809668d993c5e6eab673d7Zhuoyao Zhang                },
239dd85c5c9cc6ff58737809668d993c5e6eab673d7Zhuoyao Zhang                {IMPL_PASSTHROUGH,
240dd85c5c9cc6ff58737809668d993c5e6eab673d7Zhuoyao Zhang                    [](auto &out) {
241dd85c5c9cc6ff58737809668d993c5e6eab673d7Zhuoyao Zhang                        out << "configureInstrumentation();\n";
242dd85c5c9cc6ff58737809668d993c5e6eab673d7Zhuoyao Zhang                        out << "return ::android::hardware::Void();\n";
243dd85c5c9cc6ff58737809668d993c5e6eab673d7Zhuoyao Zhang                    }
244dd85c5c9cc6ff58737809668d993c5e6eab673d7Zhuoyao Zhang                },
245dd85c5c9cc6ff58737809668d993c5e6eab673d7Zhuoyao Zhang            }, /*cppImpl */
246937408abc412733f46ba59e2342496b465e8c312Steven Moreland            { { IMPL_INTERFACE, [](auto & /*out*/) { /* javaImpl */
247dd85c5c9cc6ff58737809668d993c5e6eab673d7Zhuoyao Zhang                // Not support for Java Impl for now.
248dd85c5c9cc6ff58737809668d993c5e6eab673d7Zhuoyao Zhang            } } } /*javaImpl */
249dd85c5c9cc6ff58737809668d993c5e6eab673d7Zhuoyao Zhang    );
250ffa913993fb527b44053c11f139689d3267748ecYifan Hong    return true;
251dd85c5c9cc6ff58737809668d993c5e6eab673d7Zhuoyao Zhang}
252dd85c5c9cc6ff58737809668d993c5e6eab673d7Zhuoyao Zhang
253ffa913993fb527b44053c11f139689d3267748ecYifan Hongbool Interface::fillDescriptorChainMethod(Method *method) const {
254ffa913993fb527b44053c11f139689d3267748ecYifan Hong    if (method->name() != "interfaceChain") {
255ffa913993fb527b44053c11f139689d3267748ecYifan Hong        return false;
256ffa913993fb527b44053c11f139689d3267748ecYifan Hong    }
257ffa913993fb527b44053c11f139689d3267748ecYifan Hong
258ffa913993fb527b44053c11f139689d3267748ecYifan Hong    method->fillImplementation(
25910fe0b55e774903fe37b658458053527da8b5a53Yifan Hong        HIDL_DESCRIPTOR_CHAIN_TRANSACTION,
260937408abc412733f46ba59e2342496b465e8c312Steven Moreland        { { IMPL_INTERFACE, [this](auto &out) {
26110fe0b55e774903fe37b658458053527da8b5a53Yifan Hong            std::vector<const Interface *> chain = typeChain();
26203935120937ec6c416681427e17cac0eb078ec1cYifan Hong            out << "_hidl_cb(";
26303935120937ec6c416681427e17cac0eb078ec1cYifan Hong            out.block([&] {
26403935120937ec6c416681427e17cac0eb078ec1cYifan Hong                for (const Interface *iface : chain) {
26503935120937ec6c416681427e17cac0eb078ec1cYifan Hong                    out << iface->fullName() << "::descriptor,\n";
26603935120937ec6c416681427e17cac0eb078ec1cYifan Hong                }
26703935120937ec6c416681427e17cac0eb078ec1cYifan Hong            });
26803935120937ec6c416681427e17cac0eb078ec1cYifan Hong            out << ");\n";
26910fe0b55e774903fe37b658458053527da8b5a53Yifan Hong            out << "return ::android::hardware::Void();";
270115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen        } } }, /* cppImpl */
271937408abc412733f46ba59e2342496b465e8c312Steven Moreland        { { IMPL_INTERFACE, [this](auto &out) {
27210fe0b55e774903fe37b658458053527da8b5a53Yifan Hong            std::vector<const Interface *> chain = typeChain();
2731af73531ba32b3dfc6ef23a8bf0172dd00be43ccYifan Hong            out << "return new java.util.ArrayList<String>(java.util.Arrays.asList(\n";
27410fe0b55e774903fe37b658458053527da8b5a53Yifan Hong            out.indent(); out.indent();
27510fe0b55e774903fe37b658458053527da8b5a53Yifan Hong            for (size_t i = 0; i < chain.size(); ++i) {
27610fe0b55e774903fe37b658458053527da8b5a53Yifan Hong                if (i != 0)
27710fe0b55e774903fe37b658458053527da8b5a53Yifan Hong                    out << ",\n";
278d39133bff0a3df357226f33b424cdf99299cc40aSteven Moreland                out << chain[i]->fullJavaName() << ".kInterfaceName";
27910fe0b55e774903fe37b658458053527da8b5a53Yifan Hong            }
28010fe0b55e774903fe37b658458053527da8b5a53Yifan Hong            out << "));";
28110fe0b55e774903fe37b658458053527da8b5a53Yifan Hong            out.unindent(); out.unindent();
282ffa913993fb527b44053c11f139689d3267748ecYifan Hong        } } } /* javaImpl */
283115d428f9c38c078d679a98942c47ce4a17bd599Martijn Coenen    );
284ffa913993fb527b44053c11f139689d3267748ecYifan Hong    return true;
285c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}
286c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
28730b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hongstatic void emitDigestChain(
28830b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong        Formatter &out,
28930b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong        const std::string &prefix,
29030b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong        const std::vector<const Interface *> &chain,
29130b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong        std::function<std::string(const ConstantExpression &)> byteToString) {
29230b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong    out.join(chain.begin(), chain.end(), ",\n", [&] (const auto &iface) {
2930e4be1ed63d2cae4d7f20cf38be8cea81b7d17a3Steven Moreland        const Hash &hash = Hash::getHash(iface->location().begin().filename());
29430b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong        out << prefix;
29530b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong        out << "{";
2960e4be1ed63d2cae4d7f20cf38be8cea81b7d17a3Steven Moreland        out.join(hash.raw().begin(), hash.raw().end(), ",", [&](const auto &e) {
29730b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong            // Use ConstantExpression::cppValue / javaValue
29830b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong            // because Java used signed byte for uint8_t.
29930b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong            out << byteToString(ConstantExpression::ValueOf(ScalarType::Kind::KIND_UINT8, e));
30030b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong        });
30130b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong        out << "} /* ";
3020e4be1ed63d2cae4d7f20cf38be8cea81b7d17a3Steven Moreland        out << hash.hexString();
30330b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong        out << " */";
30430b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong    });
30530b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong}
30630b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong
30730b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hongbool Interface::fillHashChainMethod(Method *method) const {
30830b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong    if (method->name() != "getHashChain") {
30930b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong        return false;
31030b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong    }
31130b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong    const VectorType *chainType = static_cast<const VectorType *>(&method->results()[0]->type());
31230b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong    const ArrayType *digestType = static_cast<const ArrayType *>(chainType->getElementType());
31330b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong
31430b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong    method->fillImplementation(
31530b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong        HIDL_HASH_CHAIN_TRANSACTION,
31630b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong        { { IMPL_INTERFACE, [this, digestType](auto &out) {
31730b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong            std::vector<const Interface *> chain = typeChain();
31830b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong            out << "_hidl_cb(";
31930b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong            out.block([&] {
32030b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong                emitDigestChain(out, "(" + digestType->getInternalDataCppType() + ")",
32130b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong                    chain, [](const auto &e){return e.cppValue();});
32230b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong            });
32330b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong            out << ");\n";
32430b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong            out << "return ::android::hardware::Void();\n";
32530b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong        } } }, /* cppImpl */
32630b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong        { { IMPL_INTERFACE, [this, digestType, chainType](auto &out) {
32730b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong            std::vector<const Interface *> chain = typeChain();
32830b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong            out << "return new "
32930b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong                << chainType->getJavaType(false /* forInitializer */)
33030b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong                << "(java.util.Arrays.asList(\n";
33130b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong            out.indent(2, [&] {
33230b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong                // No need for dimensions when elements are explicitly provided.
33330b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong                emitDigestChain(out, "new " + digestType->getJavaType(false /* forInitializer */),
33430b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong                    chain, [](const auto &e){return e.javaValue();});
33530b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong            });
33630b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong            out << "));\n";
33730b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong        } } } /* javaImpl */
33830b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong    );
33930b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong    return true;
34030b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong}
34130b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong
342ffa913993fb527b44053c11f139689d3267748ecYifan Hongbool Interface::fillGetDescriptorMethod(Method *method) const {
343ffa913993fb527b44053c11f139689d3267748ecYifan Hong    if (method->name() != "interfaceDescriptor") {
344ffa913993fb527b44053c11f139689d3267748ecYifan Hong        return false;
345ffa913993fb527b44053c11f139689d3267748ecYifan Hong    }
346c75fd47b91f2edea70bb88f5508d9a161b916045Yifan Hong
347ffa913993fb527b44053c11f139689d3267748ecYifan Hong    method->fillImplementation(
348c75fd47b91f2edea70bb88f5508d9a161b916045Yifan Hong        HIDL_GET_DESCRIPTOR_TRANSACTION,
349937408abc412733f46ba59e2342496b465e8c312Steven Moreland        { { IMPL_INTERFACE, [this](auto &out) {
350c75fd47b91f2edea70bb88f5508d9a161b916045Yifan Hong            out << "_hidl_cb("
351c75fd47b91f2edea70bb88f5508d9a161b916045Yifan Hong                << fullName()
352c75fd47b91f2edea70bb88f5508d9a161b916045Yifan Hong                << "::descriptor);\n"
353c75fd47b91f2edea70bb88f5508d9a161b916045Yifan Hong                << "return ::android::hardware::Void();";
354c75fd47b91f2edea70bb88f5508d9a161b916045Yifan Hong        } } }, /* cppImpl */
355937408abc412733f46ba59e2342496b465e8c312Steven Moreland        { { IMPL_INTERFACE, [this](auto &out) {
356c75fd47b91f2edea70bb88f5508d9a161b916045Yifan Hong            out << "return "
357c75fd47b91f2edea70bb88f5508d9a161b916045Yifan Hong                << fullJavaName()
358c75fd47b91f2edea70bb88f5508d9a161b916045Yifan Hong                << ".kInterfaceName;\n";
359ffa913993fb527b44053c11f139689d3267748ecYifan Hong        } } } /* javaImpl */
360c75fd47b91f2edea70bb88f5508d9a161b916045Yifan Hong    );
361ffa913993fb527b44053c11f139689d3267748ecYifan Hong    return true;
362c75fd47b91f2edea70bb88f5508d9a161b916045Yifan Hong}
36310fe0b55e774903fe37b658458053527da8b5a53Yifan Hong
364bcffce24587acabb731f696f917c0284ac619524Yifan Hongbool Interface::fillGetDebugInfoMethod(Method *method) const {
365bcffce24587acabb731f696f917c0284ac619524Yifan Hong    if (method->name() != "getDebugInfo") {
366cd2ae45f51a5ad7089e2ec2fa922e2d4a0f7d136Yifan Hong        return false;
367cd2ae45f51a5ad7089e2ec2fa922e2d4a0f7d136Yifan Hong    }
368cd2ae45f51a5ad7089e2ec2fa922e2d4a0f7d136Yifan Hong
369df1ea3f35147c74c34b5dab57541865e7129de4cYifan Hong    static const std::string sArch =
370df1ea3f35147c74c34b5dab57541865e7129de4cYifan Hong            "#if defined(__LP64__)\n"
371df1ea3f35147c74c34b5dab57541865e7129de4cYifan Hong            "::android::hidl::base::V1_0::DebugInfo::Architecture::IS_64BIT\n"
372df1ea3f35147c74c34b5dab57541865e7129de4cYifan Hong            "#else\n"
373df1ea3f35147c74c34b5dab57541865e7129de4cYifan Hong            "::android::hidl::base::V1_0::DebugInfo::Architecture::IS_32BIT\n"
374df1ea3f35147c74c34b5dab57541865e7129de4cYifan Hong            "#endif\n";
375df1ea3f35147c74c34b5dab57541865e7129de4cYifan Hong
376cd2ae45f51a5ad7089e2ec2fa922e2d4a0f7d136Yifan Hong    method->fillImplementation(
377cd2ae45f51a5ad7089e2ec2fa922e2d4a0f7d136Yifan Hong        HIDL_GET_REF_INFO_TRANSACTION,
378cd2ae45f51a5ad7089e2ec2fa922e2d4a0f7d136Yifan Hong        {
379937408abc412733f46ba59e2342496b465e8c312Steven Moreland            {IMPL_INTERFACE,
380c8ff467dbd8d55622c4ff7f45c53bce7e2b6beb5Yi Kong                [](auto &out) {
381bcffce24587acabb731f696f917c0284ac619524Yifan Hong                    // getDebugInfo returns N/A for local objects.
382df1ea3f35147c74c34b5dab57541865e7129de4cYifan Hong                    out << "_hidl_cb({ -1 /* pid */, 0 /* ptr */, \n"
383df1ea3f35147c74c34b5dab57541865e7129de4cYifan Hong                        << sArch
384df1ea3f35147c74c34b5dab57541865e7129de4cYifan Hong                        << "});\n"
385cd2ae45f51a5ad7089e2ec2fa922e2d4a0f7d136Yifan Hong                        << "return ::android::hardware::Void();";
386cd2ae45f51a5ad7089e2ec2fa922e2d4a0f7d136Yifan Hong                }
387cd2ae45f51a5ad7089e2ec2fa922e2d4a0f7d136Yifan Hong            },
388cd2ae45f51a5ad7089e2ec2fa922e2d4a0f7d136Yifan Hong            {IMPL_STUB_IMPL,
389c8ff467dbd8d55622c4ff7f45c53bce7e2b6beb5Yi Kong                [](auto &out) {
3902e036c98b4e5d9871840bc87e31db45b38cfec7eYifan Hong                    out << "_hidl_cb(";
3912e036c98b4e5d9871840bc87e31db45b38cfec7eYifan Hong                    out.block([&] {
3922e036c98b4e5d9871840bc87e31db45b38cfec7eYifan Hong                        out << "::android::hardware::details::debuggable()"
3932e036c98b4e5d9871840bc87e31db45b38cfec7eYifan Hong                            << "? getpid() : -1 /* pid */,\n"
3942e036c98b4e5d9871840bc87e31db45b38cfec7eYifan Hong                            << "::android::hardware::details::debuggable()"
3952e036c98b4e5d9871840bc87e31db45b38cfec7eYifan Hong                            << "? reinterpret_cast<uint64_t>(this) : 0 /* ptr */,\n"
3962e036c98b4e5d9871840bc87e31db45b38cfec7eYifan Hong                            << sArch << "\n";
3972e036c98b4e5d9871840bc87e31db45b38cfec7eYifan Hong                    });
3982e036c98b4e5d9871840bc87e31db45b38cfec7eYifan Hong                    out << ");\n"
399cd2ae45f51a5ad7089e2ec2fa922e2d4a0f7d136Yifan Hong                        << "return ::android::hardware::Void();";
400cd2ae45f51a5ad7089e2ec2fa922e2d4a0f7d136Yifan Hong                }
401cd2ae45f51a5ad7089e2ec2fa922e2d4a0f7d136Yifan Hong            }
402cd2ae45f51a5ad7089e2ec2fa922e2d4a0f7d136Yifan Hong        }, /* cppImpl */
403c8ff467dbd8d55622c4ff7f45c53bce7e2b6beb5Yi Kong        { { IMPL_INTERFACE, [method](auto &out) {
404cd2ae45f51a5ad7089e2ec2fa922e2d4a0f7d136Yifan Hong            const Type &refInfo = method->results().front()->type();
405cd2ae45f51a5ad7089e2ec2fa922e2d4a0f7d136Yifan Hong            out << refInfo.getJavaType(false /* forInitializer */) << " info = new "
406cd2ae45f51a5ad7089e2ec2fa922e2d4a0f7d136Yifan Hong                << refInfo.getJavaType(true /* forInitializer */) << "();\n"
407bcffce24587acabb731f696f917c0284ac619524Yifan Hong                // TODO(b/34777099): PID for java.
408bcffce24587acabb731f696f917c0284ac619524Yifan Hong                << "info.pid = -1;\n"
409bcffce24587acabb731f696f917c0284ac619524Yifan Hong                << "info.ptr = 0;\n"
410df1ea3f35147c74c34b5dab57541865e7129de4cYifan Hong                << "info.arch = android.hidl.base.V1_0.DebugInfo.Architecture.UNKNOWN;"
411cd2ae45f51a5ad7089e2ec2fa922e2d4a0f7d136Yifan Hong                << "return info;";
412cd2ae45f51a5ad7089e2ec2fa922e2d4a0f7d136Yifan Hong        } } } /* javaImpl */
413cd2ae45f51a5ad7089e2ec2fa922e2d4a0f7d136Yifan Hong    );
414cd2ae45f51a5ad7089e2ec2fa922e2d4a0f7d136Yifan Hong
415cd2ae45f51a5ad7089e2ec2fa922e2d4a0f7d136Yifan Hong    return true;
416cd2ae45f51a5ad7089e2ec2fa922e2d4a0f7d136Yifan Hong}
417cd2ae45f51a5ad7089e2ec2fa922e2d4a0f7d136Yifan Hong
41837065d636ffcb246da079837c1659dfab4d02438Andreas Huberbool Interface::fillDebugMethod(Method *method) const {
41937065d636ffcb246da079837c1659dfab4d02438Andreas Huber    if (method->name() != "debug") {
42037065d636ffcb246da079837c1659dfab4d02438Andreas Huber        return false;
42137065d636ffcb246da079837c1659dfab4d02438Andreas Huber    }
42237065d636ffcb246da079837c1659dfab4d02438Andreas Huber
42337065d636ffcb246da079837c1659dfab4d02438Andreas Huber    method->fillImplementation(
42437065d636ffcb246da079837c1659dfab4d02438Andreas Huber        HIDL_DEBUG_TRANSACTION,
42537065d636ffcb246da079837c1659dfab4d02438Andreas Huber        {
426937408abc412733f46ba59e2342496b465e8c312Steven Moreland            {IMPL_INTERFACE,
427c8ff467dbd8d55622c4ff7f45c53bce7e2b6beb5Yi Kong                [](auto &out) {
42837065d636ffcb246da079837c1659dfab4d02438Andreas Huber                    out << "(void)fd;\n"
42937065d636ffcb246da079837c1659dfab4d02438Andreas Huber                        << "(void)options;\n"
43037065d636ffcb246da079837c1659dfab4d02438Andreas Huber                        << "return ::android::hardware::Void();";
43137065d636ffcb246da079837c1659dfab4d02438Andreas Huber                }
43237065d636ffcb246da079837c1659dfab4d02438Andreas Huber            },
43337065d636ffcb246da079837c1659dfab4d02438Andreas Huber        }, /* cppImpl */
43437065d636ffcb246da079837c1659dfab4d02438Andreas Huber        {
43537065d636ffcb246da079837c1659dfab4d02438Andreas Huber            /* unused, as the debug method is hidden from Java */
43637065d636ffcb246da079837c1659dfab4d02438Andreas Huber        } /* javaImpl */
43737065d636ffcb246da079837c1659dfab4d02438Andreas Huber    );
43837065d636ffcb246da079837c1659dfab4d02438Andreas Huber
43937065d636ffcb246da079837c1659dfab4d02438Andreas Huber    return true;
44037065d636ffcb246da079837c1659dfab4d02438Andreas Huber}
44137065d636ffcb246da079837c1659dfab4d02438Andreas Huber
442ffa913993fb527b44053c11f139689d3267748ecYifan Hongstatic std::map<std::string, Method *> gAllReservedMethods;
443ffa913993fb527b44053c11f139689d3267748ecYifan Hong
44414ee6749f12bcd43477fe8110fbec38e15376b40Steven Morelandbool Interface::addMethod(Method *method) {
445c89340422f53046bfe24ff3e529161f9194120f8Yifan Hong    if (isIBase()) {
446ffa913993fb527b44053c11f139689d3267748ecYifan Hong        if (!gAllReservedMethods.emplace(method->name(), method).second) {
447ffa913993fb527b44053c11f139689d3267748ecYifan Hong            LOG(ERROR) << "ERROR: hidl-gen encountered duplicated reserved method "
448ffa913993fb527b44053c11f139689d3267748ecYifan Hong                       << method->name();
449ffa913993fb527b44053c11f139689d3267748ecYifan Hong            return false;
450ffa913993fb527b44053c11f139689d3267748ecYifan Hong        }
451ffa913993fb527b44053c11f139689d3267748ecYifan Hong        // will add it in addAllReservedMethods
452c89340422f53046bfe24ff3e529161f9194120f8Yifan Hong        return true;
453c89340422f53046bfe24ff3e529161f9194120f8Yifan Hong    }
454c89340422f53046bfe24ff3e529161f9194120f8Yifan Hong
45510fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    CHECK(!method->isHidlReserved());
45614ee6749f12bcd43477fe8110fbec38e15376b40Steven Moreland    if (lookupMethod(method->name()) != nullptr) {
45714ee6749f12bcd43477fe8110fbec38e15376b40Steven Moreland        LOG(ERROR) << "Redefinition of method " << method->name();
45814ee6749f12bcd43477fe8110fbec38e15376b40Steven Moreland        return false;
45914ee6749f12bcd43477fe8110fbec38e15376b40Steven Moreland    }
46010fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    size_t serial = FIRST_CALL_TRANSACTION;
46110fe0b55e774903fe37b658458053527da8b5a53Yifan Hong
46210fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    serial += userDefinedMethods().size();
46314ee6749f12bcd43477fe8110fbec38e15376b40Steven Moreland
46410fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    const Interface *ancestor = mSuperType;
465ef1a9feda3f09f87f0673cc978b36e1d4a8b4223Steven Moreland    while (ancestor != nullptr) {
46610fe0b55e774903fe37b658458053527da8b5a53Yifan Hong        serial += ancestor->userDefinedMethods().size();
467ef1a9feda3f09f87f0673cc978b36e1d4a8b4223Steven Moreland        ancestor = ancestor->superType();
468ef1a9feda3f09f87f0673cc978b36e1d4a8b4223Steven Moreland    }
469ef1a9feda3f09f87f0673cc978b36e1d4a8b4223Steven Moreland
47010fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    CHECK(serial <= LAST_CALL_TRANSACTION) << "More than "
47110fe0b55e774903fe37b658458053527da8b5a53Yifan Hong            << LAST_CALL_TRANSACTION << " methods are not allowed.";
472ef1a9feda3f09f87f0673cc978b36e1d4a8b4223Steven Moreland    method->setSerialId(serial);
47310fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    mUserMethods.push_back(method);
47414ee6749f12bcd43477fe8110fbec38e15376b40Steven Moreland
47514ee6749f12bcd43477fe8110fbec38e15376b40Steven Moreland    return true;
476c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}
477c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
478ffa913993fb527b44053c11f139689d3267748ecYifan Hongbool Interface::addAllReservedMethods() {
479ffa913993fb527b44053c11f139689d3267748ecYifan Hong    // use a sorted map to insert them in serial ID order.
480ffa913993fb527b44053c11f139689d3267748ecYifan Hong    std::map<int32_t, Method *> reservedMethodsById;
481ffa913993fb527b44053c11f139689d3267748ecYifan Hong    for (const auto &pair : gAllReservedMethods) {
482ffa913993fb527b44053c11f139689d3267748ecYifan Hong        Method *method = pair.second->copySignature();
483424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland        bool fillSuccess = fillPingMethod(method)
484424a948265821d514be42e9e2dd9a53cf515d0bbSteven Moreland            || fillDescriptorChainMethod(method)
485ffa913993fb527b44053c11f139689d3267748ecYifan Hong            || fillGetDescriptorMethod(method)
48630b5d1ffe964d0b82008bfc8f4b8e61ab3bac86fYifan Hong            || fillHashChainMethod(method)
487ffa913993fb527b44053c11f139689d3267748ecYifan Hong            || fillSyspropsChangedMethod(method)
488ffa913993fb527b44053c11f139689d3267748ecYifan Hong            || fillLinkToDeathMethod(method)
489ffa913993fb527b44053c11f139689d3267748ecYifan Hong            || fillUnlinkToDeathMethod(method)
490cd2ae45f51a5ad7089e2ec2fa922e2d4a0f7d136Yifan Hong            || fillSetHALInstrumentationMethod(method)
49137065d636ffcb246da079837c1659dfab4d02438Andreas Huber            || fillGetDebugInfoMethod(method)
49237065d636ffcb246da079837c1659dfab4d02438Andreas Huber            || fillDebugMethod(method);
49337065d636ffcb246da079837c1659dfab4d02438Andreas Huber
494ffa913993fb527b44053c11f139689d3267748ecYifan Hong        if (!fillSuccess) {
495ffa913993fb527b44053c11f139689d3267748ecYifan Hong            LOG(ERROR) << "ERROR: hidl-gen does not recognize a reserved method "
496ffa913993fb527b44053c11f139689d3267748ecYifan Hong                       << method->name();
497ffa913993fb527b44053c11f139689d3267748ecYifan Hong            return false;
498ffa913993fb527b44053c11f139689d3267748ecYifan Hong        }
499ffa913993fb527b44053c11f139689d3267748ecYifan Hong        if (!reservedMethodsById.emplace(method->getSerialId(), method).second) {
500ffa913993fb527b44053c11f139689d3267748ecYifan Hong            LOG(ERROR) << "ERROR: hidl-gen uses duplicated serial id for "
501ffa913993fb527b44053c11f139689d3267748ecYifan Hong                       << method->name() << " and "
502ffa913993fb527b44053c11f139689d3267748ecYifan Hong                       << reservedMethodsById[method->getSerialId()]->name()
503ffa913993fb527b44053c11f139689d3267748ecYifan Hong                       << ", serialId = " << method->getSerialId();
504ffa913993fb527b44053c11f139689d3267748ecYifan Hong            return false;
505ffa913993fb527b44053c11f139689d3267748ecYifan Hong        }
506ffa913993fb527b44053c11f139689d3267748ecYifan Hong    }
507ffa913993fb527b44053c11f139689d3267748ecYifan Hong    for (const auto &pair : reservedMethodsById) {
508ffa913993fb527b44053c11f139689d3267748ecYifan Hong        this->mReservedMethods.push_back(pair.second);
509ffa913993fb527b44053c11f139689d3267748ecYifan Hong    }
510ffa913993fb527b44053c11f139689d3267748ecYifan Hong    return true;
511ffa913993fb527b44053c11f139689d3267748ecYifan Hong}
51210fe0b55e774903fe37b658458053527da8b5a53Yifan Hong
5136cb08cf9f021a01d9d2b1eaec6729aac6ae70708Andreas Huberconst Interface *Interface::superType() const {
514c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber    return mSuperType;
515c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}
516c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
51710fe0b55e774903fe37b658458053527da8b5a53Yifan Hongstd::vector<const Interface *> Interface::typeChain() const {
51810fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    std::vector<const Interface *> v;
51910fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    const Interface *iface = this;
52010fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    while (iface != nullptr) {
52110fe0b55e774903fe37b658458053527da8b5a53Yifan Hong        v.push_back(iface);
52210fe0b55e774903fe37b658458053527da8b5a53Yifan Hong        iface = iface->mSuperType;
52310fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    }
52410fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    return v;
52510fe0b55e774903fe37b658458053527da8b5a53Yifan Hong}
52610fe0b55e774903fe37b658458053527da8b5a53Yifan Hong
527fe95aa243eb53df9cb46ca74192e760d7520b611Yifan Hongstd::vector<const Interface *> Interface::superTypeChain() const {
528fe95aa243eb53df9cb46ca74192e760d7520b611Yifan Hong    return superType()->typeChain(); // should work even if superType is nullptr
529fe95aa243eb53df9cb46ca74192e760d7520b611Yifan Hong}
530fe95aa243eb53df9cb46ca74192e760d7520b611Yifan Hong
531b40ef02ca14e507a5a5b878c90eaac52ffe64fd9Martijn Coenenbool Interface::isElidableType() const {
532b40ef02ca14e507a5a5b878c90eaac52ffe64fd9Martijn Coenen    return true;
533b40ef02ca14e507a5a5b878c90eaac52ffe64fd9Martijn Coenen}
534b40ef02ca14e507a5a5b878c90eaac52ffe64fd9Martijn Coenen
535a2723d26427f7db19777dfed330047253e7a4e1bAndreas Huberbool Interface::isInterface() const {
536a2723d26427f7db19777dfed330047253e7a4e1bAndreas Huber    return true;
537a2723d26427f7db19777dfed330047253e7a4e1bAndreas Huber}
538a2723d26427f7db19777dfed330047253e7a4e1bAndreas Huber
539295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huberbool Interface::isBinder() const {
540295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huber    return true;
541295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huber}
542295ad30bf6212c16accc5095601b2a71d44b4c8bAndreas Huber
54310fe0b55e774903fe37b658458053527da8b5a53Yifan Hongconst std::vector<Method *> &Interface::userDefinedMethods() const {
54410fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    return mUserMethods;
54510fe0b55e774903fe37b658458053527da8b5a53Yifan Hong}
54610fe0b55e774903fe37b658458053527da8b5a53Yifan Hong
54710fe0b55e774903fe37b658458053527da8b5a53Yifan Hongconst std::vector<Method *> &Interface::hidlReservedMethods() const {
54810fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    return mReservedMethods;
54910fe0b55e774903fe37b658458053527da8b5a53Yifan Hong}
55010fe0b55e774903fe37b658458053527da8b5a53Yifan Hong
55110fe0b55e774903fe37b658458053527da8b5a53Yifan Hongstd::vector<Method *> Interface::methods() const {
55210fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    std::vector<Method *> v(mUserMethods);
55310fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    v.insert(v.end(), mReservedMethods.begin(), mReservedMethods.end());
55410fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    return v;
55510fe0b55e774903fe37b658458053527da8b5a53Yifan Hong}
55610fe0b55e774903fe37b658458053527da8b5a53Yifan Hong
55710fe0b55e774903fe37b658458053527da8b5a53Yifan Hongstd::vector<InterfaceAndMethod> Interface::allMethodsFromRoot() const {
55810fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    std::vector<InterfaceAndMethod> v;
55910fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    std::vector<const Interface *> chain = typeChain();
56010fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    for (auto it = chain.rbegin(); it != chain.rend(); ++it) {
56110fe0b55e774903fe37b658458053527da8b5a53Yifan Hong        const Interface *iface = *it;
56210fe0b55e774903fe37b658458053527da8b5a53Yifan Hong        for (Method *userMethod : iface->userDefinedMethods()) {
56310fe0b55e774903fe37b658458053527da8b5a53Yifan Hong            v.push_back(InterfaceAndMethod(iface, userMethod));
56410fe0b55e774903fe37b658458053527da8b5a53Yifan Hong        }
56510fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    }
56610fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    for (Method *reservedMethod : hidlReservedMethods()) {
567c89340422f53046bfe24ff3e529161f9194120f8Yifan Hong        v.push_back(InterfaceAndMethod(
568c89340422f53046bfe24ff3e529161f9194120f8Yifan Hong                *chain.rbegin(), // IBase
569c89340422f53046bfe24ff3e529161f9194120f8Yifan Hong                reservedMethod));
57010fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    }
57110fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    return v;
572881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
573881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
57414ee6749f12bcd43477fe8110fbec38e15376b40Steven MorelandMethod *Interface::lookupMethod(std::string name) const {
57510fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    for (const auto &tuple : allMethodsFromRoot()) {
57610fe0b55e774903fe37b658458053527da8b5a53Yifan Hong        Method *method = tuple.method();
57710fe0b55e774903fe37b658458053527da8b5a53Yifan Hong        if (method->name() == name) {
57810fe0b55e774903fe37b658458053527da8b5a53Yifan Hong            return method;
57914ee6749f12bcd43477fe8110fbec38e15376b40Steven Moreland        }
58014ee6749f12bcd43477fe8110fbec38e15376b40Steven Moreland    }
58114ee6749f12bcd43477fe8110fbec38e15376b40Steven Moreland
58214ee6749f12bcd43477fe8110fbec38e15376b40Steven Moreland    return nullptr;
58314ee6749f12bcd43477fe8110fbec38e15376b40Steven Moreland}
58414ee6749f12bcd43477fe8110fbec38e15376b40Steven Moreland
5854078631353d6d34db21c890d1870e796eca6ea38Steven Morelandstd::string Interface::getBaseName() const {
5863f32c1f4cba298b0a9e750c4e073856392da726cJayant Chowdhary    return fqName().getInterfaceBaseName();
5874078631353d6d34db21c890d1870e796eca6ea38Steven Moreland}
5884078631353d6d34db21c890d1870e796eca6ea38Steven Moreland
589eefe4f2405c3cb0f1d164bdb748e5d0ded3624f9Yifan Hongstd::string Interface::getProxyName() const {
590eefe4f2405c3cb0f1d164bdb748e5d0ded3624f9Yifan Hong    return fqName().getInterfaceProxyName();
591eefe4f2405c3cb0f1d164bdb748e5d0ded3624f9Yifan Hong}
592eefe4f2405c3cb0f1d164bdb748e5d0ded3624f9Yifan Hong
593eefe4f2405c3cb0f1d164bdb748e5d0ded3624f9Yifan Hongstd::string Interface::getStubName() const {
594eefe4f2405c3cb0f1d164bdb748e5d0ded3624f9Yifan Hong    return fqName().getInterfaceStubName();
595eefe4f2405c3cb0f1d164bdb748e5d0ded3624f9Yifan Hong}
596eefe4f2405c3cb0f1d164bdb748e5d0ded3624f9Yifan Hong
597eefe4f2405c3cb0f1d164bdb748e5d0ded3624f9Yifan Hongstd::string Interface::getHwName() const {
598eefe4f2405c3cb0f1d164bdb748e5d0ded3624f9Yifan Hong    return fqName().getInterfaceHwName();
599eefe4f2405c3cb0f1d164bdb748e5d0ded3624f9Yifan Hong}
600eefe4f2405c3cb0f1d164bdb748e5d0ded3624f9Yifan Hong
601eefe4f2405c3cb0f1d164bdb748e5d0ded3624f9Yifan Hongstd::string Interface::getPassthroughName() const {
602eefe4f2405c3cb0f1d164bdb748e5d0ded3624f9Yifan Hong    return fqName().getInterfacePassthroughName();
603eefe4f2405c3cb0f1d164bdb748e5d0ded3624f9Yifan Hong}
604eefe4f2405c3cb0f1d164bdb748e5d0ded3624f9Yifan Hong
60551a6509db3078657a2401069c37515504b40c12cYifan HongFQName Interface::getProxyFqName() const {
606eefe4f2405c3cb0f1d164bdb748e5d0ded3624f9Yifan Hong    return fqName().getInterfaceProxyFqName();
607158655a90308d8e5f03dc28b8330d5b0cce038f0Yifan Hong}
608158655a90308d8e5f03dc28b8330d5b0cce038f0Yifan Hong
60951a6509db3078657a2401069c37515504b40c12cYifan HongFQName Interface::getStubFqName() const {
610eefe4f2405c3cb0f1d164bdb748e5d0ded3624f9Yifan Hong    return fqName().getInterfaceStubFqName();
611158655a90308d8e5f03dc28b8330d5b0cce038f0Yifan Hong}
612158655a90308d8e5f03dc28b8330d5b0cce038f0Yifan Hong
61351a6509db3078657a2401069c37515504b40c12cYifan HongFQName Interface::getPassthroughFqName() const {
614eefe4f2405c3cb0f1d164bdb748e5d0ded3624f9Yifan Hong    return fqName().getInterfacePassthroughFqName();
615158655a90308d8e5f03dc28b8330d5b0cce038f0Yifan Hong}
616158655a90308d8e5f03dc28b8330d5b0cce038f0Yifan Hong
617979e099f1163ff75beed5776cd01fb409b90a0cdSteven Morelandstd::string Interface::getCppType(StorageMode mode,
618979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland                                  bool specifyNamespaces) const {
619979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland    const std::string base =
620979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland          std::string(specifyNamespaces ? "::android::" : "")
621979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland        + "sp<"
622e30ee9b06ac578006161e84633db91289f889068Steven Moreland        + fullName()
623979e099f1163ff75beed5776cd01fb409b90a0cdSteven Moreland        + ">";
624881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
625881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    switch (mode) {
626881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case StorageMode_Stack:
627881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case StorageMode_Result:
628881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            return base;
629881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
630881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        case StorageMode_Argument:
631881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            return "const " + base + "&";
632881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
633881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
634881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
6354ed1347cd29e6e07acad368891bb03078c798abaYifan Hongstd::string Interface::getJavaType(bool /* forInitializer */) const {
6362831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    return fullJavaName();
6372831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
6382831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
639a588b23323213c525bf34dc0562679195afe611eZhuoyao Zhangstd::string Interface::getVtsType() const {
640a588b23323213c525bf34dc0562679195afe611eZhuoyao Zhang    if (StringHelper::EndsWith(localName(), "Callback")) {
641a588b23323213c525bf34dc0562679195afe611eZhuoyao Zhang        return "TYPE_HIDL_CALLBACK";
642a588b23323213c525bf34dc0562679195afe611eZhuoyao Zhang    } else {
643a588b23323213c525bf34dc0562679195afe611eZhuoyao Zhang        return "TYPE_HIDL_INTERFACE";
644a588b23323213c525bf34dc0562679195afe611eZhuoyao Zhang    }
645a588b23323213c525bf34dc0562679195afe611eZhuoyao Zhang}
646a588b23323213c525bf34dc0562679195afe611eZhuoyao Zhang
647881227d860c59471eee31d39946e96ce2daa35d6Andreas Hubervoid Interface::emitReaderWriter(
648881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        Formatter &out,
649881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &name,
650881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        const std::string &parcelObj,
651881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool parcelObjIsPointer,
652881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        bool isReader,
653881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        ErrorMode mode) const {
654881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    const std::string parcelObjDeref =
655881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        parcelObj + (parcelObjIsPointer ? "->" : ".");
656881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
657881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    if (isReader) {
658e7ff228b0fd676e9a535f209276d451344850f81Andreas Huber        out << "{\n";
659e7ff228b0fd676e9a535f209276d451344850f81Andreas Huber        out.indent();
660e7ff228b0fd676e9a535f209276d451344850f81Andreas Huber
661549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev        const std::string binderName = "_hidl_" + name + "_binder";
662881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
6638a82ff7ce6b5c0288b5239e25e1cbd1f5d8e3d27Andreas Huber        out << "::android::sp<::android::hardware::IBinder> "
664881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << binderName << ";\n";
665881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
666549e2598843dcc092a6049bbd9e209c249b1b11aIliyan Malchev        out << "_hidl_err = ";
667881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        out << parcelObjDeref
668881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << "readNullableStrongBinder(&"
669881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << binderName
670881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << ");\n";
671881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
672881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        handleError(out, mode);
673881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
674881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        out << name
675881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << " = "
676a63e0ad0b4fb276e9e00806f3f3934e64e3f1b34Martijn Coenen            << "::android::hardware::fromBinder<"
677a63e0ad0b4fb276e9e00806f3f3934e64e3f1b34Martijn Coenen            << fqName().cppName()
678a63e0ad0b4fb276e9e00806f3f3934e64e3f1b34Martijn Coenen            << ","
67951a6509db3078657a2401069c37515504b40c12cYifan Hong            << getProxyFqName().cppName()
680a63e0ad0b4fb276e9e00806f3f3934e64e3f1b34Martijn Coenen            << ","
68151a6509db3078657a2401069c37515504b40c12cYifan Hong            << getStubFqName().cppName()
682a63e0ad0b4fb276e9e00806f3f3934e64e3f1b34Martijn Coenen            << ">("
683881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << binderName
684881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber            << ");\n";
685e7ff228b0fd676e9a535f209276d451344850f81Andreas Huber
686e7ff228b0fd676e9a535f209276d451344850f81Andreas Huber        out.unindent();
687e7ff228b0fd676e9a535f209276d451344850f81Andreas Huber        out << "}\n\n";
688881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    } else {
689e163823c438558579dfc2018fe136a2808cf5d6cMartijn Coenen        out << "if (" << name << " == nullptr) {\n";
690e163823c438558579dfc2018fe136a2808cf5d6cMartijn Coenen        out.indent();
691e163823c438558579dfc2018fe136a2808cf5d6cMartijn Coenen        out << "_hidl_err = ";
692e163823c438558579dfc2018fe136a2808cf5d6cMartijn Coenen        out << parcelObjDeref
693e163823c438558579dfc2018fe136a2808cf5d6cMartijn Coenen            << "writeStrongBinder(nullptr);\n";
694e163823c438558579dfc2018fe136a2808cf5d6cMartijn Coenen        out.unindent();
695e163823c438558579dfc2018fe136a2808cf5d6cMartijn Coenen        out << "} else {\n";
696e163823c438558579dfc2018fe136a2808cf5d6cMartijn Coenen        out.indent();
697158655a90308d8e5f03dc28b8330d5b0cce038f0Yifan Hong        out << "::android::sp<::android::hardware::IBinder> _hidl_binder = "
698158655a90308d8e5f03dc28b8330d5b0cce038f0Yifan Hong            << "::android::hardware::toBinder<\n";
69933223ca2a9b8126d357e0986905fa35c0970a30eYifan Hong        out.indent(2, [&] {
700a63e0ad0b4fb276e9e00806f3f3934e64e3f1b34Martijn Coenen            out << fqName().cppName()
701158655a90308d8e5f03dc28b8330d5b0cce038f0Yifan Hong                << ">("
702158655a90308d8e5f03dc28b8330d5b0cce038f0Yifan Hong                << name
703158655a90308d8e5f03dc28b8330d5b0cce038f0Yifan Hong                << ");\n";
704158655a90308d8e5f03dc28b8330d5b0cce038f0Yifan Hong        });
705158655a90308d8e5f03dc28b8330d5b0cce038f0Yifan Hong        out << "if (_hidl_binder.get() != nullptr) {\n";
70633223ca2a9b8126d357e0986905fa35c0970a30eYifan Hong        out.indent([&] {
707158655a90308d8e5f03dc28b8330d5b0cce038f0Yifan Hong            out << "_hidl_err = "
708158655a90308d8e5f03dc28b8330d5b0cce038f0Yifan Hong                << parcelObjDeref
709158655a90308d8e5f03dc28b8330d5b0cce038f0Yifan Hong                << "writeStrongBinder(_hidl_binder);\n";
710158655a90308d8e5f03dc28b8330d5b0cce038f0Yifan Hong        });
711158655a90308d8e5f03dc28b8330d5b0cce038f0Yifan Hong        out << "} else {\n";
71233223ca2a9b8126d357e0986905fa35c0970a30eYifan Hong        out.indent([&] {
713158655a90308d8e5f03dc28b8330d5b0cce038f0Yifan Hong            out << "_hidl_err = ::android::UNKNOWN_ERROR;\n";
714158655a90308d8e5f03dc28b8330d5b0cce038f0Yifan Hong        });
715158655a90308d8e5f03dc28b8330d5b0cce038f0Yifan Hong        out << "}\n";
716e163823c438558579dfc2018fe136a2808cf5d6cMartijn Coenen        out.unindent();
717e163823c438558579dfc2018fe136a2808cf5d6cMartijn Coenen        out << "}\n";
7182d7126beaf6a48505bf861227e1d61edad8e56edYifan Hong
719881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber        handleError(out, mode);
720881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber    }
721881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber}
722881227d860c59471eee31d39946e96ce2daa35d6Andreas Huber
723f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hongstatus_t Interface::emitGlobalTypeDeclarations(Formatter &out) const {
724f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong    status_t status = Scope::emitGlobalTypeDeclarations(out);
725f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong    if (status != OK) {
726f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong        return status;
727f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong    }
7283d98bc4470d010121dd607d860d384065b6f97a9Steven Moreland    out << "std::string toString("
729f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong        << getCppArgumentType()
7303d98bc4470d010121dd607d860d384065b6f97a9Steven Moreland        << ");\n";
731f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong    return OK;
732f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong}
733f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong
734f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong
735f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hongstatus_t Interface::emitTypeDefinitions(
736f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong        Formatter &out, const std::string prefix) const {
737f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong    std::string space = prefix.empty() ? "" : (prefix + "::");
738f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong    status_t err = Scope::emitTypeDefinitions(out, space + localName());
739f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong    if (err != OK) {
740f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong        return err;
741f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong    }
742f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong
7433d98bc4470d010121dd607d860d384065b6f97a9Steven Moreland    out << "std::string toString("
7443d98bc4470d010121dd607d860d384065b6f97a9Steven Moreland        << getCppArgumentType()
7453d98bc4470d010121dd607d860d384065b6f97a9Steven Moreland        << " o) ";
7463d98bc4470d010121dd607d860d384065b6f97a9Steven Moreland
7473d98bc4470d010121dd607d860d384065b6f97a9Steven Moreland    out.block([&] {
7483d98bc4470d010121dd607d860d384065b6f97a9Steven Moreland        out << "std::string os = \"[class or subclass of \";\n"
7493d98bc4470d010121dd607d860d384065b6f97a9Steven Moreland            << "os += " << fullName() << "::descriptor;\n"
7503d98bc4470d010121dd607d860d384065b6f97a9Steven Moreland            << "os += \"]\";\n"
7513d98bc4470d010121dd607d860d384065b6f97a9Steven Moreland            << "os += o->isRemote() ? \"@remote\" : \"@local\";\n"
7523d98bc4470d010121dd607d860d384065b6f97a9Steven Moreland            << "return os;\n";
7533d98bc4470d010121dd607d860d384065b6f97a9Steven Moreland    }).endl().endl();
7543d98bc4470d010121dd607d860d384065b6f97a9Steven Moreland
755f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong    return OK;
756f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong}
757f5cc2f74e86504f7904a0a24e7fcc00fa19cd579Yifan Hong
7582831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Hubervoid Interface::emitJavaReaderWriter(
7592831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        Formatter &out,
7602831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &parcelObj,
7612831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        const std::string &argName,
7622831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        bool isReader) const {
7632831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    if (isReader) {
7642831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        out << fullJavaName()
7652831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            << ".asInterface("
7662831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            << parcelObj
7672831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            << ".readStrongBinder());\n";
7682831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    } else {
7692831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber        out << parcelObj
7702831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            << ".writeStrongBinder("
7712831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            << argName
7722831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            << " == null ? null : "
7732831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            << argName
7742831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber            << ".asBinder());\n";
7752831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber    }
7762831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber}
7772831d5145675ead9f2fb767bf5fe4ae56b88349fAndreas Huber
778864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhangstatus_t Interface::emitVtsAttributeDeclaration(Formatter &out) const {
779864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    for (const auto &type : getSubTypes()) {
780c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang        // Skip for TypeDef as it is just an alias of a defined type.
781c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang        if (type->isTypeDef()) {
782c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang            continue;
783c5ea9f589cc7cce0b5e97bd4ac6a8561eb313a02Zhuoyao Zhang        }
784864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        out << "attribute: {\n";
785864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        out.indent();
786864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        status_t status = type->emitVtsTypeDeclarations(out);
787864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        if (status != OK) {
788864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            return status;
789864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        }
790864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        out.unindent();
791864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        out << "}\n\n";
792864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    }
793864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    return OK;
794864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang}
795864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang
796864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhangstatus_t Interface::emitVtsMethodDeclaration(Formatter &out) const {
79710fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    for (const auto &method : methods()) {
798cea247835e05af63e10f48b25bc954af7e82c8a9Steven Moreland        if (method->isHidlReserved()) {
799cea247835e05af63e10f48b25bc954af7e82c8a9Steven Moreland            continue;
800cea247835e05af63e10f48b25bc954af7e82c8a9Steven Moreland        }
801cea247835e05af63e10f48b25bc954af7e82c8a9Steven Moreland
802864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        out << "api: {\n";
803864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        out.indent();
804864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        out << "name: \"" << method->name() << "\"\n";
805864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        // Generate declaration for each return value.
806864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        for (const auto &result : method->results()) {
807864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            out << "return_type_hidl: {\n";
808864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            out.indent();
809864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            status_t status = result->type().emitVtsAttributeType(out);
810864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            if (status != OK) {
811864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang                return status;
812864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            }
813864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            out.unindent();
814864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            out << "}\n";
815864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        }
816864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        // Generate declaration for each input argument
817864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        for (const auto &arg : method->args()) {
818864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            out << "arg: {\n";
819864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            out.indent();
820864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            status_t status = arg->type().emitVtsAttributeType(out);
821864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            if (status != OK) {
822864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang                return status;
823864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            }
824864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            out.unindent();
825864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            out << "}\n";
826864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        }
827864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        // Generate declaration for each annotation.
828d537ab02e1707597d70665fd8c75ca1ec9f57326Steven Moreland        for (const auto &annotation : method->annotations()) {
829864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            out << "callflow: {\n";
830864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            out.indent();
831d537ab02e1707597d70665fd8c75ca1ec9f57326Steven Moreland            std::string name = annotation->name();
832864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            if (name == "entry") {
833864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang                out << "entry: true\n";
834864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            } else if (name == "exit") {
835864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang                out << "exit: true\n";
836864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            } else if (name == "callflow") {
837d537ab02e1707597d70665fd8c75ca1ec9f57326Steven Moreland                const AnnotationParam *param =
838d537ab02e1707597d70665fd8c75ca1ec9f57326Steven Moreland                        annotation->getParam("next");
839d537ab02e1707597d70665fd8c75ca1ec9f57326Steven Moreland                if (param != nullptr) {
840d537ab02e1707597d70665fd8c75ca1ec9f57326Steven Moreland                    for (auto value : *param->getValues()) {
841d537ab02e1707597d70665fd8c75ca1ec9f57326Steven Moreland                        out << "next: " << value << "\n";
842d537ab02e1707597d70665fd8c75ca1ec9f57326Steven Moreland                    }
843864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang                }
844864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            } else {
845a5a57e97cb28bc1982a5ede6fcf599a6c059167cKeun Soo Yim                std::cerr << "Unrecognized annotation '"
846864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang                          << name << "' for method: " << method->name()
847a5a57e97cb28bc1982a5ede6fcf599a6c059167cKeun Soo Yim                          << ". A VTS annotation should be one of: "
848a5a57e97cb28bc1982a5ede6fcf599a6c059167cKeun Soo Yim                          << "entry, exit, callflow. \n";
849864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            }
850864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            out.unindent();
851864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang            out << "}\n";
852864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        }
853864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        out.unindent();
854864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang        out << "}\n\n";
855864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    }
856864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang    return OK;
857864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang}
858864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhang
859864c771ca4ec8a01e31c7c243625b7a5f6316768Zhuoyao Zhangstatus_t Interface::emitVtsAttributeType(Formatter &out) const {
860a588b23323213c525bf34dc0562679195afe611eZhuoyao Zhang    out << "type: " << getVtsType() << "\n"
8615158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang        << "predefined_type: \""
862c4e10605564ba5a8c656e5eabecd237abdc310e1Zhuoyao Zhang        << fullName()
863c4e10605564ba5a8c656e5eabecd237abdc310e1Zhuoyao Zhang        << "\"\n";
8645158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang    return OK;
8655158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang}
86669e7c70e72dff0734d542b737ba8bb1178244218Steven Moreland
86769e7c70e72dff0734d542b737ba8bb1178244218Steven Morelandbool Interface::hasOnewayMethods() const {
86810fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    for (auto const &method : methods()) {
86969e7c70e72dff0734d542b737ba8bb1178244218Steven Moreland        if (method->isOneway()) {
87069e7c70e72dff0734d542b737ba8bb1178244218Steven Moreland            return true;
87169e7c70e72dff0734d542b737ba8bb1178244218Steven Moreland        }
87269e7c70e72dff0734d542b737ba8bb1178244218Steven Moreland    }
87369e7c70e72dff0734d542b737ba8bb1178244218Steven Moreland
87469e7c70e72dff0734d542b737ba8bb1178244218Steven Moreland    const Interface* superClass = superType();
87569e7c70e72dff0734d542b737ba8bb1178244218Steven Moreland
87669e7c70e72dff0734d542b737ba8bb1178244218Steven Moreland    if (superClass != nullptr) {
87769e7c70e72dff0734d542b737ba8bb1178244218Steven Moreland        return superClass->hasOnewayMethods();
87869e7c70e72dff0734d542b737ba8bb1178244218Steven Moreland    }
87969e7c70e72dff0734d542b737ba8bb1178244218Steven Moreland
88069e7c70e72dff0734d542b737ba8bb1178244218Steven Moreland    return false;
88169e7c70e72dff0734d542b737ba8bb1178244218Steven Moreland}
8825158db484e5ab302368f191d75d5b1334c270e52Zhuoyao Zhang
88370a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huberbool Interface::isJavaCompatible() const {
884ea081b35840e687dfe7a5c11d4a546f2bf2db99eAndreas Huber    if (mIsJavaCompatibleInProgress) {
885ea081b35840e687dfe7a5c11d4a546f2bf2db99eAndreas Huber        // We're currently trying to determine if this Interface is
886ea081b35840e687dfe7a5c11d4a546f2bf2db99eAndreas Huber        // java-compatible and something is referencing this interface through
887ea081b35840e687dfe7a5c11d4a546f2bf2db99eAndreas Huber        // one of its methods. Assume we'll ultimately succeed, if we were wrong
888ea081b35840e687dfe7a5c11d4a546f2bf2db99eAndreas Huber        // the original invocation of Interface::isJavaCompatible() will then
889ea081b35840e687dfe7a5c11d4a546f2bf2db99eAndreas Huber        // return the correct "false" result.
890ea081b35840e687dfe7a5c11d4a546f2bf2db99eAndreas Huber        return true;
891ea081b35840e687dfe7a5c11d4a546f2bf2db99eAndreas Huber    }
892ea081b35840e687dfe7a5c11d4a546f2bf2db99eAndreas Huber
8930fa9e3956e59155c52e40b85b6aef5476ae90912Andreas Huber    if (mSuperType != nullptr && !mSuperType->isJavaCompatible()) {
8940fa9e3956e59155c52e40b85b6aef5476ae90912Andreas Huber        mIsJavaCompatibleInProgress = false;
8950fa9e3956e59155c52e40b85b6aef5476ae90912Andreas Huber        return false;
8960fa9e3956e59155c52e40b85b6aef5476ae90912Andreas Huber    }
8970fa9e3956e59155c52e40b85b6aef5476ae90912Andreas Huber
898ea081b35840e687dfe7a5c11d4a546f2bf2db99eAndreas Huber    mIsJavaCompatibleInProgress = true;
899ea081b35840e687dfe7a5c11d4a546f2bf2db99eAndreas Huber
90070a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber    if (!Scope::isJavaCompatible()) {
901ea081b35840e687dfe7a5c11d4a546f2bf2db99eAndreas Huber        mIsJavaCompatibleInProgress = false;
90270a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber        return false;
90370a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber    }
90470a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber
90510fe0b55e774903fe37b658458053527da8b5a53Yifan Hong    for (const auto &method : methods()) {
90670a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber        if (!method->isJavaCompatible()) {
907ea081b35840e687dfe7a5c11d4a546f2bf2db99eAndreas Huber            mIsJavaCompatibleInProgress = false;
90870a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber            return false;
90970a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber        }
91070a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber    }
91170a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber
912ea081b35840e687dfe7a5c11d4a546f2bf2db99eAndreas Huber    mIsJavaCompatibleInProgress = false;
913ea081b35840e687dfe7a5c11d4a546f2bf2db99eAndreas Huber
91470a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber    return true;
91570a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber}
91670a59e1dc3dcf32f791d2dd7966111d4adf32ecaAndreas Huber
917c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber}  // namespace android
918c9410c7e62a33fd7599b2f3e025093a2d171577eAndreas Huber
919