blob: 8cfaeb71b09e59c9489f986ad7cc438230cba137 [file] [log] [blame]
Steven Moreland6f4fbe12017-07-21 18:07:42 -07001#ifndef ANDROID_HARDWARE_MANAGER_SERVICEMANAGER_H
2#define ANDROID_HARDWARE_MANAGER_SERVICEMANAGER_H
Steven Morelandd83d1102016-10-25 15:01:47 -07003
Steven Morelanddefbf322018-05-30 14:13:06 -07004#include <android/hidl/manager/1.2/IServiceManager.h>
Steven Morelandd83d1102016-10-25 15:01:47 -07005#include <hidl/Status.h>
6#include <hidl/MQDescriptor.h>
Steven Moreland6d7e5002017-01-20 15:21:48 -08007#include <map>
Steven Morelandd83d1102016-10-25 15:01:47 -07008
Martijn Coenen7ce83be2017-04-07 16:19:32 -07009#include "AccessControl.h"
Steven Moreland2173d3c2016-11-09 15:00:58 -080010#include "HidlService.h"
11
Steven Morelandd83d1102016-10-25 15:01:47 -070012namespace android {
13namespace hidl {
14namespace manager {
Steven Morelandd83d1102016-10-25 15:01:47 -070015namespace implementation {
16
Martijn Coenen46847a62016-12-19 05:36:12 +010017using ::android::hardware::hidl_death_recipient;
Steven Morelandd83d1102016-10-25 15:01:47 -070018using ::android::hardware::hidl_vec;
19using ::android::hardware::hidl_string;
Steven Morelandd83d1102016-10-25 15:01:47 -070020using ::android::hardware::Return;
21using ::android::hardware::Void;
Yifan Hongb3a90f02016-11-23 12:58:04 -080022using ::android::hidl::base::V1_0::IBase;
Steven Moreland2173d3c2016-11-09 15:00:58 -080023using ::android::hidl::manager::V1_0::IServiceNotification;
Steven Morelandd8536202018-09-26 10:56:19 -070024using ::android::hidl::manager::V1_2::IClientCallback;
Steven Morelandd83d1102016-10-25 15:01:47 -070025using ::android::sp;
Martijn Coenen46847a62016-12-19 05:36:12 +010026using ::android::wp;
Steven Morelandd83d1102016-10-25 15:01:47 -070027
Steven Morelanddefbf322018-05-30 14:13:06 -070028struct ServiceManager : public V1_2::IServiceManager, hidl_death_recipient {
Steven Morelandd83d1102016-10-25 15:01:47 -070029 // Methods from ::android::hidl::manager::V1_0::IServiceManager follow.
Martijn Coenen7b02bf92017-01-02 15:17:58 +010030 Return<sp<IBase>> get(const hidl_string& fqName,
Steven Moreland37aed802017-04-06 09:16:42 -070031 const hidl_string& name) override;
Martijn Coenen1a5da1c2017-03-06 13:05:39 +010032 Return<bool> add(const hidl_string& name,
Yifan Hongb3a90f02016-11-23 12:58:04 -080033 const sp<IBase>& service) override;
Steven Moreland5fb3d652016-11-03 13:45:18 -070034
Steven Moreland37aed802017-04-06 09:16:42 -070035 Return<Transport> getTransport(const hidl_string& fqName,
36 const hidl_string& name);
37
Steven Moreland76237812016-11-08 15:59:04 -080038 Return<void> list(list_cb _hidl_cb) override;
Steven Moreland2173d3c2016-11-09 15:00:58 -080039 Return<void> listByInterface(const hidl_string& fqInstanceName,
Steven Moreland76237812016-11-08 15:59:04 -080040 listByInterface_cb _hidl_cb) override;
41
Steven Moreland2173d3c2016-11-09 15:00:58 -080042 Return<bool> registerForNotifications(const hidl_string& fqName,
43 const hidl_string& name,
44 const sp<IServiceNotification>& callback) override;
Steven Morelandd83d1102016-10-25 15:01:47 -070045
Yifan Hong83c49f62017-01-25 14:16:34 -080046 Return<void> debugDump(debugDump_cb _cb) override;
Yifan Hongee531a82017-02-03 15:10:18 -080047 Return<void> registerPassthroughClient(const hidl_string &fqName,
Martijn Coenen737de1b2017-04-27 09:29:43 -070048 const hidl_string &name) override;
Yifan Hong83c49f62017-01-25 14:16:34 -080049
Steven Moreland6f4fbe12017-07-21 18:07:42 -070050 // Methods from ::android::hidl::manager::V1_1::IServiceManager follow.
51 Return<bool> unregisterForNotifications(const hidl_string& fqName,
52 const hidl_string& name,
53 const sp<IServiceNotification>& callback) override;
54
Steven Morelandd8536202018-09-26 10:56:19 -070055 // Methods from ::android::hidl::manager::V1_2::IServiceManager follow.
56 Return<bool> registerClientCallback(const sp<IBase>& server,
57 const sp<IClientCallback>& cb) override;
58 Return<bool> unregisterClientCallback(const sp<IBase>& server,
59 const sp<IClientCallback>& cb) override;
Steven Moreland707f22c2018-10-11 12:09:34 -070060 Return<bool> addWithChain(const hidl_string& name,
61 const sp<IBase>& service,
62 const hidl_vec<hidl_string>& chain) override;
Steven Morelandaae4eab2018-10-29 13:00:31 -070063 Return<void> listManifestByInterface(const hidl_string& fqInstanceName,
64 listManifestByInterface_cb _hidl_cb) override;
Steven Morelandd8536202018-09-26 10:56:19 -070065
66 void handleClientCallbacks();
67
Martijn Coenen46847a62016-12-19 05:36:12 +010068 virtual void serviceDied(uint64_t cookie, const wp<IBase>& who);
Steven Morelandd83d1102016-10-25 15:01:47 -070069private:
Steven Moreland707f22c2018-10-11 12:09:34 -070070 bool addImpl(const hidl_string& name,
71 const sp<IBase>& service,
72 const hidl_vec<hidl_string>& interfaceChain,
73 const AccessControl::Context &context,
74 pid_t pid);
75
Steven Moreland76936fe2017-09-19 12:18:30 -070076 // if restrictToInstanceName is nullptr, remove all, otherwise only those services
77 // which match this instance name. Returns whether all instances were removed.
78 bool removeService(const wp<IBase>& who, const std::string* restrictToInstanceName);
Martijn Coenen7fafc142017-03-06 16:17:51 +010079 bool removePackageListener(const wp<IBase>& who);
80 bool removeServiceListener(const wp<IBase>& who);
Yifan Hong83c49f62017-01-25 14:16:34 -080081 size_t countExistingService() const;
Steven Morelandd8536202018-09-26 10:56:19 -070082
83 // true = continue, false = break
84 void forEachExistingService(std::function<bool(const HidlService *)> f) const;
85 void forEachExistingService(std::function<bool(HidlService *)> f);
86 void forEachServiceEntry(std::function<bool(const HidlService *)> f) const;
87 void forEachServiceEntry(std::function<bool(HidlService *)> f);
Steven Morelandd83d1102016-10-25 15:01:47 -070088
Steven Moreland6d7e5002017-01-20 15:21:48 -080089 using InstanceMap = std::map<
Steven Moreland2173d3c2016-11-09 15:00:58 -080090 std::string, // instance name e.x. "manager"
91 std::unique_ptr<HidlService>
92 >;
93
94 struct PackageInterfaceMap {
95 InstanceMap &getInstanceMap();
96 const InstanceMap &getInstanceMap() const;
97
98 /**
Steven Morelandd544cf62017-01-04 15:24:32 -080099 * Finds a HidlService with the desired name. If none,
Steven Moreland2173d3c2016-11-09 15:00:58 -0800100 * returns nullptr. HidlService::getService() might also be nullptr
101 * if there are registered IServiceNotification objects for it. Return
102 * value should be treated as a temporary reference.
103 */
Steven Morelandd544cf62017-01-04 15:24:32 -0800104 HidlService *lookup(
105 const std::string &name);
106 const HidlService *lookup(
107 const std::string &name) const;
Steven Moreland2173d3c2016-11-09 15:00:58 -0800108
109 void insertService(std::unique_ptr<HidlService> &&service);
110
111 void addPackageListener(sp<IServiceNotification> listener);
Martijn Coenen7fafc142017-03-06 16:17:51 +0100112 bool removePackageListener(const wp<IBase>& who);
Steven Moreland6f4fbe12017-07-21 18:07:42 -0700113 bool removeServiceListener(const wp<IBase>& who);
Steven Moreland2173d3c2016-11-09 15:00:58 -0800114
Steven Moreland2173d3c2016-11-09 15:00:58 -0800115 void sendPackageRegistrationNotification(
116 const hidl_string &fqName,
Martijn Coenen7fafc142017-03-06 16:17:51 +0100117 const hidl_string &instanceName);
Steven Moreland2173d3c2016-11-09 15:00:58 -0800118
Steven Moreland978473f2016-11-28 14:51:07 -0800119 private:
Steven Moreland2173d3c2016-11-09 15:00:58 -0800120 InstanceMap mInstanceMap{};
121
122 std::vector<sp<IServiceNotification>> mPackageListeners{};
123 };
124
Martijn Coenen7ce83be2017-04-07 16:19:32 -0700125 AccessControl mAcl;
126
Steven Moreland5fb3d652016-11-03 13:45:18 -0700127 /**
128 * Access to this map doesn't need to be locked, since hwservicemanager
129 * is single-threaded.
130 *
131 * e.x.
Steven Morelandd544cf62017-01-04 15:24:32 -0800132 * mServiceMap["android.hidl.manager@1.0::IServiceManager"]["manager"]
Steven Moreland5fb3d652016-11-03 13:45:18 -0700133 * -> HidlService object
134 */
Steven Moreland6d7e5002017-01-20 15:21:48 -0800135 std::map<
Steven Morelandd544cf62017-01-04 15:24:32 -0800136 std::string, // package::interface e.x. "android.hidl.manager@1.0::IServiceManager"
Steven Moreland2173d3c2016-11-09 15:00:58 -0800137 PackageInterfaceMap
Steven Moreland5fb3d652016-11-03 13:45:18 -0700138 > mServiceMap;
Steven Morelandd83d1102016-10-25 15:01:47 -0700139};
140
141} // namespace implementation
Steven Morelandd83d1102016-10-25 15:01:47 -0700142} // namespace manager
143} // namespace hidl
144} // namespace android
145
Steven Moreland6f4fbe12017-07-21 18:07:42 -0700146#endif // ANDROID_HARDWARE_MANAGER_SERVICEMANAGER_H