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