getService: use passthrough service manager.
Test: hidl_test
Bug: 34394392
Change-Id: I13a114a66a6e67bcef3b62673fad3f431050faf9
diff --git a/generateCpp.cpp b/generateCpp.cpp
index 45edd44..b81051b 100644
--- a/generateCpp.cpp
+++ b/generateCpp.cpp
@@ -158,7 +158,7 @@
<< "::android::sp<" << interfaceName << "> " << interfaceName << "::getService("
<< "const std::string &serviceName, bool getStub) ";
out.block([&] {
- out << "::android::sp<" << interfaceName << "> iface;\n"
+ 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";
@@ -166,7 +166,7 @@
out.sIf("sm != nullptr && !getStub", [&] {
out << "::android::hardware::Return<::android::sp<" << gIBaseFqName.cppName() << ">> ret = \n";
out.indent(2, [&] {
- out << "sm->get(\"" << package << "::" << interfaceName << "\", serviceName.c_str());\n";
+ out << "sm->get(" << interfaceName << "::descriptor" << ", serviceName);\n";
});
out.sIf("ret.isOk()", [&] {
out << "iface = " << interfaceName << "::castFrom(ret);\n";
@@ -175,27 +175,27 @@
}).endl();
}).endl();
}).endl();
- out << "const int dlMode = RTLD_LAZY;\n";
- out << "void *handle = nullptr;\n";
- for (const auto &path : std::vector<std::string>({
- "HAL_LIBRARY_PATH_ODM", "HAL_LIBRARY_PATH_VENDOR", "HAL_LIBRARY_PATH_SYSTEM"
- })) {
- out.sIf("handle == nullptr", [&] {
- out << "handle = dlopen("
- << path << " \"" << package << "-impl.so\", dlMode);\n";
- }).endl();
- }
- out.sIf("handle == nullptr", [&] {
- out << "return iface;\n";
- }).endl();
- out << "" << interfaceName << "* (*generator)(const char* name);\n"
- << "*(void **)(&generator) = dlsym(handle, \"HIDL_FETCH_" << interfaceName << "\");\n";
- out.sIf("generator", [&] {
- out << "iface = (*generator)(serviceName.c_str());\n";
- out.sIf("iface != nullptr", [&] {
- out << "iface = new " << fqName.getInterfacePassthroughName() << "(iface);\n";
+
+ 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.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();
+
out << "return iface;\n";
}).endl().endl();