xref: /aosp_15_r20/system/hwservicemanager/HidlService.h (revision ee3b7b6295061e544d3520b965ea91a90424af41)
1*ee3b7b62SAndroid Build Coastguard Worker /*
2*ee3b7b62SAndroid Build Coastguard Worker  * Copyright (C) 2016 The Android Open Source Project
3*ee3b7b62SAndroid Build Coastguard Worker  *
4*ee3b7b62SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*ee3b7b62SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*ee3b7b62SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*ee3b7b62SAndroid Build Coastguard Worker  *
8*ee3b7b62SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*ee3b7b62SAndroid Build Coastguard Worker  *
10*ee3b7b62SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*ee3b7b62SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*ee3b7b62SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ee3b7b62SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*ee3b7b62SAndroid Build Coastguard Worker  * limitations under the License.
15*ee3b7b62SAndroid Build Coastguard Worker  */
16*ee3b7b62SAndroid Build Coastguard Worker 
17*ee3b7b62SAndroid Build Coastguard Worker #pragma once
18*ee3b7b62SAndroid Build Coastguard Worker 
19*ee3b7b62SAndroid Build Coastguard Worker #include <set>
20*ee3b7b62SAndroid Build Coastguard Worker 
21*ee3b7b62SAndroid Build Coastguard Worker #include <android/hidl/manager/1.2/IServiceManager.h>
22*ee3b7b62SAndroid Build Coastguard Worker #include <hidl/Status.h>
23*ee3b7b62SAndroid Build Coastguard Worker #include <hidl/MQDescriptor.h>
24*ee3b7b62SAndroid Build Coastguard Worker 
25*ee3b7b62SAndroid Build Coastguard Worker namespace android {
26*ee3b7b62SAndroid Build Coastguard Worker namespace hidl {
27*ee3b7b62SAndroid Build Coastguard Worker namespace manager {
28*ee3b7b62SAndroid Build Coastguard Worker namespace implementation {
29*ee3b7b62SAndroid Build Coastguard Worker 
30*ee3b7b62SAndroid Build Coastguard Worker using ::android::hardware::hidl_vec;
31*ee3b7b62SAndroid Build Coastguard Worker using ::android::hardware::hidl_string;
32*ee3b7b62SAndroid Build Coastguard Worker using ::android::hardware::Return;
33*ee3b7b62SAndroid Build Coastguard Worker using ::android::hardware::Void;
34*ee3b7b62SAndroid Build Coastguard Worker using ::android::hidl::base::V1_0::IBase;
35*ee3b7b62SAndroid Build Coastguard Worker using ::android::hidl::manager::V1_0::IServiceNotification;
36*ee3b7b62SAndroid Build Coastguard Worker using ::android::hidl::manager::V1_1::IServiceManager;
37*ee3b7b62SAndroid Build Coastguard Worker using ::android::hidl::manager::V1_2::IClientCallback;
38*ee3b7b62SAndroid Build Coastguard Worker using ::android::sp;
39*ee3b7b62SAndroid Build Coastguard Worker 
40*ee3b7b62SAndroid Build Coastguard Worker struct HidlService {
41*ee3b7b62SAndroid Build Coastguard Worker     HidlService(const std::string &interfaceName,
42*ee3b7b62SAndroid Build Coastguard Worker                 const std::string &instanceName,
43*ee3b7b62SAndroid Build Coastguard Worker                 const sp<IBase> &service,
44*ee3b7b62SAndroid Build Coastguard Worker                 const pid_t pid);
HidlServiceHidlService45*ee3b7b62SAndroid Build Coastguard Worker     HidlService(const std::string &interfaceName,
46*ee3b7b62SAndroid Build Coastguard Worker                 const std::string &instanceName)
47*ee3b7b62SAndroid Build Coastguard Worker     : HidlService(
48*ee3b7b62SAndroid Build Coastguard Worker         interfaceName,
49*ee3b7b62SAndroid Build Coastguard Worker         instanceName,
50*ee3b7b62SAndroid Build Coastguard Worker         nullptr,
51*ee3b7b62SAndroid Build Coastguard Worker         static_cast<pid_t>(IServiceManager::PidConstant::NO_PID))
52*ee3b7b62SAndroid Build Coastguard Worker     {}
~HidlServiceHidlService53*ee3b7b62SAndroid Build Coastguard Worker     virtual ~HidlService() {}
54*ee3b7b62SAndroid Build Coastguard Worker 
55*ee3b7b62SAndroid Build Coastguard Worker     /**
56*ee3b7b62SAndroid Build Coastguard Worker      * Note, getService() can be nullptr. This is because you can have a HidlService
57*ee3b7b62SAndroid Build Coastguard Worker      * with registered IServiceNotification objects but no service registered yet.
58*ee3b7b62SAndroid Build Coastguard Worker      */
59*ee3b7b62SAndroid Build Coastguard Worker     sp<IBase> getService() const;
60*ee3b7b62SAndroid Build Coastguard Worker     void setService(sp<IBase> service, pid_t pid);
61*ee3b7b62SAndroid Build Coastguard Worker     pid_t getDebugPid() const;
62*ee3b7b62SAndroid Build Coastguard Worker     const std::string &getInterfaceName() const;
63*ee3b7b62SAndroid Build Coastguard Worker     const std::string &getInstanceName() const;
64*ee3b7b62SAndroid Build Coastguard Worker 
65*ee3b7b62SAndroid Build Coastguard Worker     void addListener(const sp<IServiceNotification> &listener);
66*ee3b7b62SAndroid Build Coastguard Worker     bool removeListener(const wp<IBase> &listener);
67*ee3b7b62SAndroid Build Coastguard Worker     void registerPassthroughClient(pid_t pid);
68*ee3b7b62SAndroid Build Coastguard Worker 
69*ee3b7b62SAndroid Build Coastguard Worker     // also sends onClients(true) if we have clients
70*ee3b7b62SAndroid Build Coastguard Worker     // knownClientCount, see forceHandleClientCallbacks
71*ee3b7b62SAndroid Build Coastguard Worker     void addClientCallback(const sp<IClientCallback>& callback, size_t knownClientCount);
72*ee3b7b62SAndroid Build Coastguard Worker     bool removeClientCallback(const sp<IClientCallback>& callback);
73*ee3b7b62SAndroid Build Coastguard Worker 
74*ee3b7b62SAndroid Build Coastguard Worker     // return is if we are guaranteed to have a client
75*ee3b7b62SAndroid Build Coastguard Worker     // knownClientCount, see forceHandleClientCallbacks
76*ee3b7b62SAndroid Build Coastguard Worker     bool handleClientCallbacks(bool isCalledOnInterval, size_t knownClientCount);
77*ee3b7b62SAndroid Build Coastguard Worker 
78*ee3b7b62SAndroid Build Coastguard Worker     // Updates client callbacks (even if mClientCallbacks is emtpy)
79*ee3b7b62SAndroid Build Coastguard Worker     // see handleClientCallbacks
80*ee3b7b62SAndroid Build Coastguard Worker     //
81*ee3b7b62SAndroid Build Coastguard Worker     // knownClientCount - this is the number of clients that is currently
82*ee3b7b62SAndroid Build Coastguard Worker     // expected to be in use by known actors. This number of clients must be
83*ee3b7b62SAndroid Build Coastguard Worker     // exceeded in order to consider the service to have clients.
84*ee3b7b62SAndroid Build Coastguard Worker     //
85*ee3b7b62SAndroid Build Coastguard Worker     // returns whether or not this service has clients
86*ee3b7b62SAndroid Build Coastguard Worker     bool forceHandleClientCallbacks(bool isCalledOnInterval, size_t knownClientCount);
87*ee3b7b62SAndroid Build Coastguard Worker 
88*ee3b7b62SAndroid Build Coastguard Worker     // when giving out a handle to a client, but the kernel might not know this yet
89*ee3b7b62SAndroid Build Coastguard Worker     void guaranteeClient();
90*ee3b7b62SAndroid Build Coastguard Worker 
91*ee3b7b62SAndroid Build Coastguard Worker     std::string string() const; // e.x. "[email protected]::IServiceManager/manager"
92*ee3b7b62SAndroid Build Coastguard Worker     const std::set<pid_t> &getPassthroughClients() const;
93*ee3b7b62SAndroid Build Coastguard Worker 
94*ee3b7b62SAndroid Build Coastguard Worker protected:
95*ee3b7b62SAndroid Build Coastguard Worker     // mockable number of clients including hwservicemanager. -1 if not implemented or unavailable.
96*ee3b7b62SAndroid Build Coastguard Worker     virtual ssize_t getNodeStrongRefCount();
97*ee3b7b62SAndroid Build Coastguard Worker 
98*ee3b7b62SAndroid Build Coastguard Worker private:
99*ee3b7b62SAndroid Build Coastguard Worker     void sendRegistrationNotifications();
100*ee3b7b62SAndroid Build Coastguard Worker 
101*ee3b7b62SAndroid Build Coastguard Worker     // Also updates mHasClients (of what the last callback was)
102*ee3b7b62SAndroid Build Coastguard Worker     void sendClientCallbackNotifications(bool hasClients);
103*ee3b7b62SAndroid Build Coastguard Worker 
104*ee3b7b62SAndroid Build Coastguard Worker     // Only sends notification
105*ee3b7b62SAndroid Build Coastguard Worker     void sendClientCallbackNotification(const sp<IClientCallback>& callback, bool hasClients);
106*ee3b7b62SAndroid Build Coastguard Worker 
107*ee3b7b62SAndroid Build Coastguard Worker     const std::string                     mInterfaceName; // e.x. "[email protected]::IServiceManager"
108*ee3b7b62SAndroid Build Coastguard Worker     const std::string                     mInstanceName;  // e.x. "manager"
109*ee3b7b62SAndroid Build Coastguard Worker     sp<IBase>                             mService;
110*ee3b7b62SAndroid Build Coastguard Worker 
111*ee3b7b62SAndroid Build Coastguard Worker     std::vector<sp<IServiceNotification>> mListeners{};
112*ee3b7b62SAndroid Build Coastguard Worker     std::set<pid_t>                       mPassthroughClients{};
113*ee3b7b62SAndroid Build Coastguard Worker     pid_t                                 mPid = static_cast<pid_t>(IServiceManager::PidConstant::NO_PID);
114*ee3b7b62SAndroid Build Coastguard Worker 
115*ee3b7b62SAndroid Build Coastguard Worker     std::vector<sp<IClientCallback>>      mClientCallbacks{};
116*ee3b7b62SAndroid Build Coastguard Worker     bool                                  mHasClients = false; // notifications sent on true -> false.
117*ee3b7b62SAndroid Build Coastguard Worker     bool                                  mGuaranteeClient = false; // whenever a client is handed out
118*ee3b7b62SAndroid Build Coastguard Worker     size_t                                mNoClientsCounter = 0;
119*ee3b7b62SAndroid Build Coastguard Worker };
120*ee3b7b62SAndroid Build Coastguard Worker 
121*ee3b7b62SAndroid Build Coastguard Worker }  // namespace implementation
122*ee3b7b62SAndroid Build Coastguard Worker }  // namespace manager
123*ee3b7b62SAndroid Build Coastguard Worker }  // namespace hidl
124*ee3b7b62SAndroid Build Coastguard Worker }  // namespace android
125