Revert "Revert "getService respects the vendor interface object.""
This reverts commit e3fa5da4da2a6b07b7a3d4de4b082fd58e4d9e65.
Reason for revert: Add checks back in after security policy is updated with
https://googleplex-android-review.git.corp.google.com/c/1827725/.
Test: with the above CL, media codec no longer crashes. Wifi/nfc/fingerprint/etc
all function with ENABLE_TREBLE = true/false. hidl_test.
Change-Id: Ia99e554209d39eccbef6240489ebb78ca28b538e
diff --git a/generateCpp.cpp b/generateCpp.cpp
index b81051b..d81d241 100644
--- a/generateCpp.cpp
+++ b/generateCpp.cpp
@@ -158,41 +158,54 @@
<< "::android::sp<" << interfaceName << "> " << interfaceName << "::getService("
<< "const std::string &serviceName, bool getStub) ";
out.block([&] {
- out << "::android::sp<" << interfaceName << "> iface = nullptr;\n"
- << "const ::android::sp<::android::hidl::manager::V1_0::IServiceManager> sm\n";
- out.indent(2, [&] {
- out << "= ::android::hardware::defaultServiceManager();\n";
- });
- out.sIf("sm != nullptr && !getStub", [&] {
- out << "::android::hardware::Return<::android::sp<" << gIBaseFqName.cppName() << ">> ret = \n";
+ out << "::android::sp<" << interfaceName << "> iface = nullptr;\n";
+ out << "::android::vintf::Transport transport = ::android::hardware::getTransportFromManifest(\""
+ << fqName.package() << "\");\n";
+
+ out.sIf("!getStub && "
+ "(transport == ::android::vintf::Transport::HWBINDER || "
+ // TODO(b/34625838): Don't load in passthrough mode
+ "transport == ::android::vintf::Transport::PASSTHROUGH || "
+ "transport == ::android::vintf::Transport::EMPTY)", [&] {
+ out << "const ::android::sp<::android::hidl::manager::V1_0::IServiceManager> sm\n";
out.indent(2, [&] {
- out << "sm->get(" << interfaceName << "::descriptor" << ", serviceName);\n";
+ out << "= ::android::hardware::defaultServiceManager();\n";
});
- out.sIf("ret.isOk()", [&] {
- out << "iface = " << interfaceName << "::castFrom(ret);\n";
- out.sIf("iface != nullptr", [&] {
- out << "return iface;\n";
+ out.sIf("sm != nullptr", [&] {
+ out << "::android::hardware::Return<::android::sp<" << gIBaseFqName.cppName() << ">> ret = \n";
+ out.indent(2, [&] {
+ out << "sm->get(" << interfaceName << "::descriptor" << ", serviceName);\n";
+ });
+ out.sIf("ret.isOk()", [&] {
+ out << "iface = " << interfaceName << "::castFrom(ret);\n";
+ out.sIf("iface != nullptr", [&] {
+ out << "return iface;\n";
+ }).endl();
}).endl();
}).endl();
}).endl();
- out << "const ::android::sp<::android::hidl::manager::V1_0::IServiceManager> pm\n";
- out.indent(2, [&] {
- out << "= ::android::hardware::getPassthroughServiceManager();\n";
- });
-
- out.sIf("pm != nullptr", [&] () {
- out << "::android::hardware::Return<::android::sp<" << gIBaseFqName.cppName() << ">> ret = \n";
+ out.sIf("getStub || "
+ "transport == ::android::vintf::Transport::PASSTHROUGH || "
+ "transport == ::android::vintf::Transport::EMPTY", [&] {
+ out << "const ::android::sp<::android::hidl::manager::V1_0::IServiceManager> pm\n";
out.indent(2, [&] {
- out << "pm->get(" << interfaceName << "::descriptor" << ", serviceName);\n";
+ out << "= ::android::hardware::getPassthroughServiceManager();\n";
});
- out.sIf("ret.isOk()", [&] {
- out << "::android::sp<" << gIBaseFqName.cppName()
- << "> baseInterface = ret;\n";
- out.sIf("baseInterface != nullptr", [&]() {
- out << "iface = new " << fqName.getInterfacePassthroughName()
- << "(" << interfaceName << "::castFrom(baseInterface));\n";
+
+ out.sIf("pm != nullptr", [&] () {
+ out << "::android::hardware::Return<::android::sp<" << gIBaseFqName.cppName() << ">> ret = \n";
+ out.indent(2, [&] {
+ out << "pm->get(" << interfaceName << "::descriptor" << ", serviceName);\n";
});
+ out.sIf("ret.isOk()", [&] {
+ out << "::android::sp<" << gIBaseFqName.cppName()
+ << "> baseInterface = ret;\n";
+ out.sIf("baseInterface != nullptr", [&]() {
+ out << "iface = new " << fqName.getInterfacePassthroughName()
+ << "(" << interfaceName << "::castFrom(baseInterface));\n";
+ });
+ }).endl();
}).endl();
}).endl();