xref: /aosp_15_r20/system/hwservicemanager/ServiceManager.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 <android/hidl/manager/1.2/IServiceManager.h>
20*ee3b7b62SAndroid Build Coastguard Worker #include <hidl/Status.h>
21*ee3b7b62SAndroid Build Coastguard Worker #include <hidl/MQDescriptor.h>
22*ee3b7b62SAndroid Build Coastguard Worker #include <map>
23*ee3b7b62SAndroid Build Coastguard Worker 
24*ee3b7b62SAndroid Build Coastguard Worker #include "AccessControl.h"
25*ee3b7b62SAndroid Build Coastguard Worker #include "HidlService.h"
26*ee3b7b62SAndroid Build Coastguard Worker 
27*ee3b7b62SAndroid Build Coastguard Worker namespace android {
28*ee3b7b62SAndroid Build Coastguard Worker namespace hidl {
29*ee3b7b62SAndroid Build Coastguard Worker namespace manager {
30*ee3b7b62SAndroid Build Coastguard Worker namespace implementation {
31*ee3b7b62SAndroid Build Coastguard Worker 
32*ee3b7b62SAndroid Build Coastguard Worker using ::android::hardware::hidl_death_recipient;
33*ee3b7b62SAndroid Build Coastguard Worker using ::android::hardware::hidl_vec;
34*ee3b7b62SAndroid Build Coastguard Worker using ::android::hardware::hidl_string;
35*ee3b7b62SAndroid Build Coastguard Worker using ::android::hardware::Return;
36*ee3b7b62SAndroid Build Coastguard Worker using ::android::hardware::Void;
37*ee3b7b62SAndroid Build Coastguard Worker using ::android::hidl::base::V1_0::IBase;
38*ee3b7b62SAndroid Build Coastguard Worker using ::android::hidl::manager::V1_0::IServiceNotification;
39*ee3b7b62SAndroid Build Coastguard Worker using ::android::hidl::manager::V1_2::IClientCallback;
40*ee3b7b62SAndroid Build Coastguard Worker using ::android::sp;
41*ee3b7b62SAndroid Build Coastguard Worker using ::android::wp;
42*ee3b7b62SAndroid Build Coastguard Worker 
43*ee3b7b62SAndroid Build Coastguard Worker struct ServiceManager : public V1_2::IServiceManager, hidl_death_recipient {
44*ee3b7b62SAndroid Build Coastguard Worker     // Methods from ::android::hidl::manager::V1_0::IServiceManager follow.
45*ee3b7b62SAndroid Build Coastguard Worker     Return<sp<IBase>> get(const hidl_string& fqName,
46*ee3b7b62SAndroid Build Coastguard Worker                           const hidl_string& name) override;
47*ee3b7b62SAndroid Build Coastguard Worker     Return<bool> add(const hidl_string& name,
48*ee3b7b62SAndroid Build Coastguard Worker                      const sp<IBase>& service) override;
49*ee3b7b62SAndroid Build Coastguard Worker 
50*ee3b7b62SAndroid Build Coastguard Worker     Return<Transport> getTransport(const hidl_string& fqName,
51*ee3b7b62SAndroid Build Coastguard Worker                                    const hidl_string& name);
52*ee3b7b62SAndroid Build Coastguard Worker 
53*ee3b7b62SAndroid Build Coastguard Worker     Return<void> list(list_cb _hidl_cb) override;
54*ee3b7b62SAndroid Build Coastguard Worker     Return<void> listByInterface(const hidl_string& fqInstanceName,
55*ee3b7b62SAndroid Build Coastguard Worker                                  listByInterface_cb _hidl_cb) override;
56*ee3b7b62SAndroid Build Coastguard Worker 
57*ee3b7b62SAndroid Build Coastguard Worker     Return<bool> registerForNotifications(const hidl_string& fqName,
58*ee3b7b62SAndroid Build Coastguard Worker                                           const hidl_string& name,
59*ee3b7b62SAndroid Build Coastguard Worker                                           const sp<IServiceNotification>& callback) override;
60*ee3b7b62SAndroid Build Coastguard Worker 
61*ee3b7b62SAndroid Build Coastguard Worker     Return<void> debugDump(debugDump_cb _cb) override;
62*ee3b7b62SAndroid Build Coastguard Worker     Return<void> registerPassthroughClient(const hidl_string &fqName,
63*ee3b7b62SAndroid Build Coastguard Worker             const hidl_string &name) override;
64*ee3b7b62SAndroid Build Coastguard Worker 
65*ee3b7b62SAndroid Build Coastguard Worker     // Methods from ::android::hidl::manager::V1_1::IServiceManager follow.
66*ee3b7b62SAndroid Build Coastguard Worker     Return<bool> unregisterForNotifications(const hidl_string& fqName,
67*ee3b7b62SAndroid Build Coastguard Worker                                             const hidl_string& name,
68*ee3b7b62SAndroid Build Coastguard Worker                                             const sp<IServiceNotification>& callback) override;
69*ee3b7b62SAndroid Build Coastguard Worker 
70*ee3b7b62SAndroid Build Coastguard Worker     // Methods from ::android::hidl::manager::V1_2::IServiceManager follow.
71*ee3b7b62SAndroid Build Coastguard Worker     Return<bool> registerClientCallback(const hidl_string& fqName,
72*ee3b7b62SAndroid Build Coastguard Worker                                         const hidl_string& name,
73*ee3b7b62SAndroid Build Coastguard Worker                                         const sp<IBase>& server,
74*ee3b7b62SAndroid Build Coastguard Worker                                         const sp<IClientCallback>& cb) override;
75*ee3b7b62SAndroid Build Coastguard Worker     Return<bool> unregisterClientCallback(const sp<IBase>& server,
76*ee3b7b62SAndroid Build Coastguard Worker                                           const sp<IClientCallback>& cb) override;
77*ee3b7b62SAndroid Build Coastguard Worker     Return<bool> addWithChain(const hidl_string& name,
78*ee3b7b62SAndroid Build Coastguard Worker                               const sp<IBase>& service,
79*ee3b7b62SAndroid Build Coastguard Worker                               const hidl_vec<hidl_string>& chain) override;
80*ee3b7b62SAndroid Build Coastguard Worker     Return<void> listManifestByInterface(const hidl_string& fqInstanceName,
81*ee3b7b62SAndroid Build Coastguard Worker                                          listManifestByInterface_cb _hidl_cb) override;
82*ee3b7b62SAndroid Build Coastguard Worker     Return<bool> tryUnregister(const hidl_string& fqName,
83*ee3b7b62SAndroid Build Coastguard Worker                                const hidl_string& name,
84*ee3b7b62SAndroid Build Coastguard Worker                                const sp<IBase>& service) override;
85*ee3b7b62SAndroid Build Coastguard Worker 
86*ee3b7b62SAndroid Build Coastguard Worker     void handleClientCallbacks();
87*ee3b7b62SAndroid Build Coastguard Worker 
88*ee3b7b62SAndroid Build Coastguard Worker     virtual void serviceDied(uint64_t cookie, const wp<IBase>& who);
89*ee3b7b62SAndroid Build Coastguard Worker private:
90*ee3b7b62SAndroid Build Coastguard Worker     bool addImpl(const std::string& name,
91*ee3b7b62SAndroid Build Coastguard Worker                  const sp<IBase>& service,
92*ee3b7b62SAndroid Build Coastguard Worker                  const hidl_vec<hidl_string>& interfaceChain,
93*ee3b7b62SAndroid Build Coastguard Worker                  const AccessControl::CallingContext& callingContext);
94*ee3b7b62SAndroid Build Coastguard Worker 
95*ee3b7b62SAndroid Build Coastguard Worker     // if restrictToInstanceName is nullptr, remove all, otherwise only those services
96*ee3b7b62SAndroid Build Coastguard Worker     // which match this instance name. Returns whether all instances were removed.
97*ee3b7b62SAndroid Build Coastguard Worker     bool removeService(const wp<IBase>& who, const std::string* restrictToInstanceName);
98*ee3b7b62SAndroid Build Coastguard Worker     bool removePackageListener(const wp<IBase>& who);
99*ee3b7b62SAndroid Build Coastguard Worker     bool removeServiceListener(const wp<IBase>& who);
100*ee3b7b62SAndroid Build Coastguard Worker     size_t countExistingService() const;
101*ee3b7b62SAndroid Build Coastguard Worker 
102*ee3b7b62SAndroid Build Coastguard Worker     // true = continue, false = break
103*ee3b7b62SAndroid Build Coastguard Worker     void forEachExistingService(std::function<bool(const HidlService *)> f) const;
104*ee3b7b62SAndroid Build Coastguard Worker     void forEachExistingService(std::function<bool(HidlService *)> f);
105*ee3b7b62SAndroid Build Coastguard Worker     void forEachServiceEntry(std::function<bool(const HidlService *)> f) const;
106*ee3b7b62SAndroid Build Coastguard Worker     void forEachServiceEntry(std::function<bool(HidlService *)> f);
107*ee3b7b62SAndroid Build Coastguard Worker 
108*ee3b7b62SAndroid Build Coastguard Worker     HidlService* lookup(const std::string& fqName, const std::string& name);
109*ee3b7b62SAndroid Build Coastguard Worker 
110*ee3b7b62SAndroid Build Coastguard Worker     using InstanceMap = std::map<
111*ee3b7b62SAndroid Build Coastguard Worker             std::string, // instance name e.x. "manager"
112*ee3b7b62SAndroid Build Coastguard Worker             std::unique_ptr<HidlService>
113*ee3b7b62SAndroid Build Coastguard Worker         >;
114*ee3b7b62SAndroid Build Coastguard Worker 
115*ee3b7b62SAndroid Build Coastguard Worker     struct PackageInterfaceMap {
116*ee3b7b62SAndroid Build Coastguard Worker         InstanceMap &getInstanceMap();
117*ee3b7b62SAndroid Build Coastguard Worker         const InstanceMap &getInstanceMap() const;
118*ee3b7b62SAndroid Build Coastguard Worker 
119*ee3b7b62SAndroid Build Coastguard Worker         /**
120*ee3b7b62SAndroid Build Coastguard Worker          * Finds a HidlService with the desired name. If none,
121*ee3b7b62SAndroid Build Coastguard Worker          * returns nullptr. HidlService::getService() might also be nullptr
122*ee3b7b62SAndroid Build Coastguard Worker          * if there are registered IServiceNotification objects for it. Return
123*ee3b7b62SAndroid Build Coastguard Worker          * value should be treated as a temporary reference.
124*ee3b7b62SAndroid Build Coastguard Worker          */
125*ee3b7b62SAndroid Build Coastguard Worker         HidlService *lookup(
126*ee3b7b62SAndroid Build Coastguard Worker             const std::string &name);
127*ee3b7b62SAndroid Build Coastguard Worker         const HidlService *lookup(
128*ee3b7b62SAndroid Build Coastguard Worker             const std::string &name) const;
129*ee3b7b62SAndroid Build Coastguard Worker 
130*ee3b7b62SAndroid Build Coastguard Worker         void insertService(std::unique_ptr<HidlService> &&service);
131*ee3b7b62SAndroid Build Coastguard Worker 
132*ee3b7b62SAndroid Build Coastguard Worker         void addPackageListener(sp<IServiceNotification> listener);
133*ee3b7b62SAndroid Build Coastguard Worker         bool removePackageListener(const wp<IBase>& who);
134*ee3b7b62SAndroid Build Coastguard Worker         bool removeServiceListener(const wp<IBase>& who);
135*ee3b7b62SAndroid Build Coastguard Worker 
136*ee3b7b62SAndroid Build Coastguard Worker         void sendPackageRegistrationNotification(
137*ee3b7b62SAndroid Build Coastguard Worker             const hidl_string &fqName,
138*ee3b7b62SAndroid Build Coastguard Worker             const hidl_string &instanceName);
139*ee3b7b62SAndroid Build Coastguard Worker 
140*ee3b7b62SAndroid Build Coastguard Worker     private:
141*ee3b7b62SAndroid Build Coastguard Worker         InstanceMap mInstanceMap{};
142*ee3b7b62SAndroid Build Coastguard Worker 
143*ee3b7b62SAndroid Build Coastguard Worker         std::vector<sp<IServiceNotification>> mPackageListeners{};
144*ee3b7b62SAndroid Build Coastguard Worker     };
145*ee3b7b62SAndroid Build Coastguard Worker 
146*ee3b7b62SAndroid Build Coastguard Worker     AccessControl mAcl;
147*ee3b7b62SAndroid Build Coastguard Worker 
148*ee3b7b62SAndroid Build Coastguard Worker     /**
149*ee3b7b62SAndroid Build Coastguard Worker      * Access to this map doesn't need to be locked, since hwservicemanager
150*ee3b7b62SAndroid Build Coastguard Worker      * is single-threaded.
151*ee3b7b62SAndroid Build Coastguard Worker      *
152*ee3b7b62SAndroid Build Coastguard Worker      * e.x.
153*ee3b7b62SAndroid Build Coastguard Worker      * mServiceMap["[email protected]::IServiceManager"]["manager"]
154*ee3b7b62SAndroid Build Coastguard Worker      *     -> HidlService object
155*ee3b7b62SAndroid Build Coastguard Worker      */
156*ee3b7b62SAndroid Build Coastguard Worker     std::map<
157*ee3b7b62SAndroid Build Coastguard Worker         std::string, // package::interface e.x. "[email protected]::IServiceManager"
158*ee3b7b62SAndroid Build Coastguard Worker         PackageInterfaceMap
159*ee3b7b62SAndroid Build Coastguard Worker     > mServiceMap;
160*ee3b7b62SAndroid Build Coastguard Worker };
161*ee3b7b62SAndroid Build Coastguard Worker 
162*ee3b7b62SAndroid Build Coastguard Worker }  // namespace implementation
163*ee3b7b62SAndroid Build Coastguard Worker }  // namespace manager
164*ee3b7b62SAndroid Build Coastguard Worker }  // namespace hidl
165*ee3b7b62SAndroid Build Coastguard Worker }  // namespace android
166