transport: Add non-template functions for service registration
Add an implementation of registerPassthroughServiceImplementation
which takes interface name as string instead of using a template.
This allows services to avoid dependency on interface libraries.
Bug: 148115870
Test: verify that updated audio HAL service works
Change-Id: I1ef9d9f830e4ff217c5b24bb5b4919af05d7cfa6
diff --git a/transport/Android.bp b/transport/Android.bp
index 324dbde..2d5d88c 100644
--- a/transport/Android.bp
+++ b/transport/Android.bp
@@ -91,6 +91,7 @@
"HidlPassthroughSupport.cpp",
"HidlTransportSupport.cpp",
"HidlTransportUtils.cpp",
+ "LegacySupport.cpp",
"ServiceManagement.cpp",
"Static.cpp"
],
diff --git a/transport/LegacySupport.cpp b/transport/LegacySupport.cpp
new file mode 100644
index 0000000..866de5f
--- /dev/null
+++ b/transport/LegacySupport.cpp
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "LegacySupport"
+
+#include <android/hidl/base/1.0/IBase.h>
+#include <hidl/HidlSupport.h>
+#include <hidl/LegacySupport.h>
+#include <hidl/ServiceManagement.h>
+#include <hidl/Status.h>
+
+using android::hidl::base::V1_0::IBase;
+
+namespace android::hardware {
+
+namespace details {
+
+__attribute__((warn_unused_result)) status_t registerPassthroughServiceImplementation(
+ const std::string& interfaceName, RegisterServiceBaseCb registerServiceCb,
+ const std::string& serviceName) {
+ sp<IBase> service =
+ getRawServiceInternal(interfaceName, serviceName, true /*retry*/, true /*getStub*/);
+
+ if (service == nullptr) {
+ ALOGE("Could not get passthrough implementation for %s/%s.", interfaceName.c_str(),
+ serviceName.c_str());
+ return EXIT_FAILURE;
+ }
+
+ LOG_FATAL_IF(service->isRemote(), "Implementation of %s/%s is remote!", interfaceName.c_str(),
+ serviceName.c_str());
+
+ std::string actualName;
+ Return<void> result = service->interfaceDescriptor(
+ [&actualName](const hidl_string& descriptor) { actualName = descriptor; });
+ LOG_FATAL_IF(!result.isOk(), "Error retrieving interface name from %s/%s: %s",
+ interfaceName.c_str(), serviceName.c_str(), result.description());
+ LOG_FATAL_IF(actualName != interfaceName, "Implementation of %s/%s is actually %s!",
+ interfaceName.c_str(), serviceName.c_str(), actualName.c_str());
+
+ status_t status = registerServiceCb(service, serviceName);
+
+ if (status == OK) {
+ ALOGI("Registration complete for %s/%s.", interfaceName.c_str(), serviceName.c_str());
+ } else {
+ ALOGE("Could not register service %s/%s (%d).", interfaceName.c_str(), serviceName.c_str(),
+ status);
+ }
+
+ return status;
+}
+
+} // namespace details
+
+__attribute__((warn_unused_result)) status_t registerPassthroughServiceImplementation(
+ const std::string& interfaceName, const std::string& serviceName) {
+ return details::registerPassthroughServiceImplementation(
+ interfaceName,
+ [](const sp<IBase>& service, const std::string& name) {
+ return details::registerAsServiceInternal(service, name);
+ },
+ serviceName);
+}
+
+} // namespace android::hardware
diff --git a/transport/include/hidl/LegacySupport.h b/transport/include/hidl/LegacySupport.h
index 7cb72a9..c7ad594 100644
--- a/transport/include/hidl/LegacySupport.h
+++ b/transport/include/hidl/LegacySupport.h
@@ -14,6 +14,8 @@
* limitations under the License.
*/
+#include <string>
+
#include <hidl/HidlLazyUtils.h>
#include <hidl/HidlTransportSupport.h>
#include <sys/wait.h>
@@ -59,6 +61,13 @@
return status;
}
+
+using RegisterServiceBaseCb = RegisterServiceCb<::android::hidl::base::V1_0::IBase>;
+
+__attribute__((warn_unused_result)) status_t registerPassthroughServiceImplementation(
+ const std::string& interfaceName, RegisterServiceBaseCb registerServiceCb,
+ const std::string& serviceName = "default");
+
} // namespace details
/**
@@ -74,6 +83,9 @@
name);
}
+__attribute__((warn_unused_result)) status_t registerPassthroughServiceImplementation(
+ const std::string& interfaceName, const std::string& serviceName = "default");
+
/**
* Creates default passthrough service implementation. This method never returns.
*