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