xref: /aosp_15_r20/system/libhidl/transport/LegacySupport.cpp (revision 8222fbe171c3d6fadfe95119c180cf3010c392a8)
1*8222fbe1SAndroid Build Coastguard Worker /*
2*8222fbe1SAndroid Build Coastguard Worker  * Copyright (C) 2020 The Android Open Source Project
3*8222fbe1SAndroid Build Coastguard Worker  *
4*8222fbe1SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*8222fbe1SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*8222fbe1SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*8222fbe1SAndroid Build Coastguard Worker  *
8*8222fbe1SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*8222fbe1SAndroid Build Coastguard Worker  *
10*8222fbe1SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*8222fbe1SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*8222fbe1SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*8222fbe1SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*8222fbe1SAndroid Build Coastguard Worker  * limitations under the License.
15*8222fbe1SAndroid Build Coastguard Worker  */
16*8222fbe1SAndroid Build Coastguard Worker 
17*8222fbe1SAndroid Build Coastguard Worker #define LOG_TAG "LegacySupport"
18*8222fbe1SAndroid Build Coastguard Worker 
19*8222fbe1SAndroid Build Coastguard Worker #include <android/hidl/base/1.0/IBase.h>
20*8222fbe1SAndroid Build Coastguard Worker #include <hidl/HidlSupport.h>
21*8222fbe1SAndroid Build Coastguard Worker #include <hidl/LegacySupport.h>
22*8222fbe1SAndroid Build Coastguard Worker #include <hidl/ServiceManagement.h>
23*8222fbe1SAndroid Build Coastguard Worker #include <hidl/Status.h>
24*8222fbe1SAndroid Build Coastguard Worker 
25*8222fbe1SAndroid Build Coastguard Worker using android::hidl::base::V1_0::IBase;
26*8222fbe1SAndroid Build Coastguard Worker 
27*8222fbe1SAndroid Build Coastguard Worker namespace android::hardware {
28*8222fbe1SAndroid Build Coastguard Worker 
29*8222fbe1SAndroid Build Coastguard Worker namespace details {
30*8222fbe1SAndroid Build Coastguard Worker 
registerPassthroughServiceImplementation(const std::string & interfaceName,const std::string & expectInterfaceName,RegisterServiceCb registerServiceCb,const std::string & serviceName)31*8222fbe1SAndroid Build Coastguard Worker __attribute__((warn_unused_result)) status_t registerPassthroughServiceImplementation(
32*8222fbe1SAndroid Build Coastguard Worker         const std::string& interfaceName, const std::string& expectInterfaceName,
33*8222fbe1SAndroid Build Coastguard Worker         RegisterServiceCb registerServiceCb, const std::string& serviceName) {
34*8222fbe1SAndroid Build Coastguard Worker     sp<IBase> service =
35*8222fbe1SAndroid Build Coastguard Worker             getRawServiceInternal(interfaceName, serviceName, true /*retry*/, true /*getStub*/);
36*8222fbe1SAndroid Build Coastguard Worker 
37*8222fbe1SAndroid Build Coastguard Worker     if (service == nullptr) {
38*8222fbe1SAndroid Build Coastguard Worker         ALOGE("Could not get passthrough implementation for %s/%s.", interfaceName.c_str(),
39*8222fbe1SAndroid Build Coastguard Worker               serviceName.c_str());
40*8222fbe1SAndroid Build Coastguard Worker         return EXIT_FAILURE;
41*8222fbe1SAndroid Build Coastguard Worker     }
42*8222fbe1SAndroid Build Coastguard Worker     if (service->isRemote()) {
43*8222fbe1SAndroid Build Coastguard Worker         ALOGE("Implementation of %s/%s is remote!", interfaceName.c_str(), serviceName.c_str());
44*8222fbe1SAndroid Build Coastguard Worker         return EXIT_FAILURE;
45*8222fbe1SAndroid Build Coastguard Worker     }
46*8222fbe1SAndroid Build Coastguard Worker 
47*8222fbe1SAndroid Build Coastguard Worker     std::string actualName;
48*8222fbe1SAndroid Build Coastguard Worker     Return<void> result = service->interfaceDescriptor(
49*8222fbe1SAndroid Build Coastguard Worker             [&actualName](const hidl_string& descriptor) { actualName = descriptor; });
50*8222fbe1SAndroid Build Coastguard Worker     if (!result.isOk()) {
51*8222fbe1SAndroid Build Coastguard Worker         ALOGE("Error retrieving interface name from %s/%s: %s", interfaceName.c_str(),
52*8222fbe1SAndroid Build Coastguard Worker               serviceName.c_str(), result.description().c_str());
53*8222fbe1SAndroid Build Coastguard Worker         return EXIT_FAILURE;
54*8222fbe1SAndroid Build Coastguard Worker     }
55*8222fbe1SAndroid Build Coastguard Worker     if (actualName != expectInterfaceName) {
56*8222fbe1SAndroid Build Coastguard Worker         ALOGE("Implementation of %s/%s is actually %s, not a %s!", interfaceName.c_str(),
57*8222fbe1SAndroid Build Coastguard Worker               serviceName.c_str(), actualName.c_str(), expectInterfaceName.c_str());
58*8222fbe1SAndroid Build Coastguard Worker         return EXIT_FAILURE;
59*8222fbe1SAndroid Build Coastguard Worker     }
60*8222fbe1SAndroid Build Coastguard Worker 
61*8222fbe1SAndroid Build Coastguard Worker     status_t status = registerServiceCb(service, serviceName);
62*8222fbe1SAndroid Build Coastguard Worker     if (status == OK) {
63*8222fbe1SAndroid Build Coastguard Worker         ALOGI("Registration complete for %s/%s.", interfaceName.c_str(), serviceName.c_str());
64*8222fbe1SAndroid Build Coastguard Worker     } else {
65*8222fbe1SAndroid Build Coastguard Worker         ALOGE("Could not register service %s/%s (%d).", interfaceName.c_str(), serviceName.c_str(),
66*8222fbe1SAndroid Build Coastguard Worker               status);
67*8222fbe1SAndroid Build Coastguard Worker     }
68*8222fbe1SAndroid Build Coastguard Worker 
69*8222fbe1SAndroid Build Coastguard Worker     return status;
70*8222fbe1SAndroid Build Coastguard Worker }
71*8222fbe1SAndroid Build Coastguard Worker 
72*8222fbe1SAndroid Build Coastguard Worker }  // namespace details
73*8222fbe1SAndroid Build Coastguard Worker 
registerPassthroughServiceImplementation(const std::string & interfaceName,const std::string & expectInterfaceName,const std::string & serviceName)74*8222fbe1SAndroid Build Coastguard Worker __attribute__((warn_unused_result)) status_t registerPassthroughServiceImplementation(
75*8222fbe1SAndroid Build Coastguard Worker         const std::string& interfaceName, const std::string& expectInterfaceName,
76*8222fbe1SAndroid Build Coastguard Worker         const std::string& serviceName) {
77*8222fbe1SAndroid Build Coastguard Worker     return details::registerPassthroughServiceImplementation(
78*8222fbe1SAndroid Build Coastguard Worker             interfaceName, expectInterfaceName,
79*8222fbe1SAndroid Build Coastguard Worker             [](const sp<IBase>& service, const std::string& name) {
80*8222fbe1SAndroid Build Coastguard Worker                 return details::registerAsServiceInternal(service, name);
81*8222fbe1SAndroid Build Coastguard Worker             },
82*8222fbe1SAndroid Build Coastguard Worker             serviceName);
83*8222fbe1SAndroid Build Coastguard Worker }
84*8222fbe1SAndroid Build Coastguard Worker 
85*8222fbe1SAndroid Build Coastguard Worker }  // namespace android::hardware
86