| Steven Moreland | 80e1e6d | 2019-06-21 12:35:59 -0700 | [diff] [blame] | 1 | /* | 
|  | 2 | * Copyright (C) 2019 The Android Open Source Project | 
|  | 3 | * | 
|  | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | 5 | * you may not use this file except in compliance with the License. | 
|  | 6 | * You may obtain a copy of the License at | 
|  | 7 | * | 
|  | 8 | *      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | 9 | * | 
|  | 10 | * Unless required by applicable law or agreed to in writing, software | 
|  | 11 | * distributed under the License is distributed on an "AS IS" BASIS, | 
|  | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | 13 | * See the License for the specific language governing permissions and | 
|  | 14 | * limitations under the License. | 
|  | 15 | */ | 
|  | 16 |  | 
|  | 17 | #pragma once | 
|  | 18 |  | 
|  | 19 | #include <android/os/BnServiceManager.h> | 
| Jon Spivack | 9f503a4 | 2019-10-22 16:49:19 -0700 | [diff] [blame] | 20 | #include <android/os/IClientCallback.h> | 
| Steven Moreland | 27cfab0 | 2019-08-12 14:34:16 -0700 | [diff] [blame] | 21 | #include <android/os/IServiceCallback.h> | 
| Steven Moreland | 80e1e6d | 2019-06-21 12:35:59 -0700 | [diff] [blame] | 22 |  | 
|  | 23 | #include "Access.h" | 
|  | 24 |  | 
|  | 25 | namespace android { | 
|  | 26 |  | 
| Jon Spivack | 9f503a4 | 2019-10-22 16:49:19 -0700 | [diff] [blame] | 27 | using os::IClientCallback; | 
| Steven Moreland | 27cfab0 | 2019-08-12 14:34:16 -0700 | [diff] [blame] | 28 | using os::IServiceCallback; | 
| Steven Moreland | 3ea4327 | 2021-01-28 22:49:28 +0000 | [diff] [blame] | 29 | using os::ServiceDebugInfo; | 
| Steven Moreland | 27cfab0 | 2019-08-12 14:34:16 -0700 | [diff] [blame] | 30 |  | 
| Steven Moreland | 80e1e6d | 2019-06-21 12:35:59 -0700 | [diff] [blame] | 31 | class ServiceManager : public os::BnServiceManager, public IBinder::DeathRecipient { | 
|  | 32 | public: | 
|  | 33 | ServiceManager(std::unique_ptr<Access>&& access); | 
| Steven Moreland | 130242d | 2019-08-26 17:41:32 -0700 | [diff] [blame] | 34 | ~ServiceManager(); | 
| Steven Moreland | 80e1e6d | 2019-06-21 12:35:59 -0700 | [diff] [blame] | 35 |  | 
| Jon Spivack | 0d84430 | 2019-07-22 18:40:34 -0700 | [diff] [blame] | 36 | // getService will try to start any services it cannot find | 
| Steven Moreland | 80e1e6d | 2019-06-21 12:35:59 -0700 | [diff] [blame] | 37 | binder::Status getService(const std::string& name, sp<IBinder>* outBinder) override; | 
|  | 38 | binder::Status checkService(const std::string& name, sp<IBinder>* outBinder) override; | 
| Steven Moreland | 27cfab0 | 2019-08-12 14:34:16 -0700 | [diff] [blame] | 39 | binder::Status addService(const std::string& name, const sp<IBinder>& binder, | 
|  | 40 | bool allowIsolated, int32_t dumpPriority) override; | 
| Steven Moreland | 80e1e6d | 2019-06-21 12:35:59 -0700 | [diff] [blame] | 41 | binder::Status listServices(int32_t dumpPriority, std::vector<std::string>* outList) override; | 
| Steven Moreland | 27cfab0 | 2019-08-12 14:34:16 -0700 | [diff] [blame] | 42 | binder::Status registerForNotifications(const std::string& name, | 
|  | 43 | const sp<IServiceCallback>& callback) override; | 
|  | 44 | binder::Status unregisterForNotifications(const std::string& name, | 
|  | 45 | const sp<IServiceCallback>& callback) override; | 
| Steven Moreland | 80e1e6d | 2019-06-21 12:35:59 -0700 | [diff] [blame] | 46 |  | 
| Jon Spivack | 9f503a4 | 2019-10-22 16:49:19 -0700 | [diff] [blame] | 47 | binder::Status isDeclared(const std::string& name, bool* outReturn) override; | 
| Steven Moreland | 2e293aa | 2020-09-23 00:25:16 +0000 | [diff] [blame] | 48 | binder::Status getDeclaredInstances(const std::string& interface, std::vector<std::string>* outReturn) override; | 
| Steven Moreland | edd4e07 | 2021-04-21 00:27:29 +0000 | [diff] [blame] | 49 | binder::Status updatableViaApex(const std::string& name, | 
|  | 50 | std::optional<std::string>* outReturn) override; | 
| Jon Spivack | 9f503a4 | 2019-10-22 16:49:19 -0700 | [diff] [blame] | 51 | binder::Status registerClientCallback(const std::string& name, const sp<IBinder>& service, | 
|  | 52 | const sp<IClientCallback>& cb) override; | 
|  | 53 | binder::Status tryUnregisterService(const std::string& name, const sp<IBinder>& binder) override; | 
| Steven Moreland | 3ea4327 | 2021-01-28 22:49:28 +0000 | [diff] [blame] | 54 | binder::Status getServiceDebugInfo(std::vector<ServiceDebugInfo>* outReturn) override; | 
| Steven Moreland | 80e1e6d | 2019-06-21 12:35:59 -0700 | [diff] [blame] | 55 | void binderDied(const wp<IBinder>& who) override; | 
| Jon Spivack | 9f503a4 | 2019-10-22 16:49:19 -0700 | [diff] [blame] | 56 | void handleClientCallbacks(); | 
| Steven Moreland | 80e1e6d | 2019-06-21 12:35:59 -0700 | [diff] [blame] | 57 |  | 
| Jon Spivack | 0d84430 | 2019-07-22 18:40:34 -0700 | [diff] [blame] | 58 | protected: | 
|  | 59 | virtual void tryStartService(const std::string& name); | 
|  | 60 |  | 
| Steven Moreland | 80e1e6d | 2019-06-21 12:35:59 -0700 | [diff] [blame] | 61 | private: | 
|  | 62 | struct Service { | 
| Steven Moreland | 27cfab0 | 2019-08-12 14:34:16 -0700 | [diff] [blame] | 63 | sp<IBinder> binder; // not null | 
| Steven Moreland | 80e1e6d | 2019-06-21 12:35:59 -0700 | [diff] [blame] | 64 | bool allowIsolated; | 
|  | 65 | int32_t dumpPriority; | 
| Jon Spivack | 9f503a4 | 2019-10-22 16:49:19 -0700 | [diff] [blame] | 66 | bool hasClients = false; // notifications sent on true -> false. | 
|  | 67 | bool guaranteeClient = false; // forces the client check to true | 
|  | 68 | pid_t debugPid = 0; // the process in which this service runs | 
|  | 69 |  | 
|  | 70 | // the number of clients of the service, including servicemanager itself | 
|  | 71 | ssize_t getNodeStrongRefCount(); | 
| Steven Moreland | 80e1e6d | 2019-06-21 12:35:59 -0700 | [diff] [blame] | 72 | }; | 
|  | 73 |  | 
| Jon Spivack | f288b1d | 2019-12-19 17:15:51 -0800 | [diff] [blame] | 74 | using ServiceCallbackMap = std::map<std::string, std::vector<sp<IServiceCallback>>>; | 
| Jon Spivack | 9f503a4 | 2019-10-22 16:49:19 -0700 | [diff] [blame] | 75 | using ClientCallbackMap = std::map<std::string, std::vector<sp<IClientCallback>>>; | 
| Steven Moreland | 27cfab0 | 2019-08-12 14:34:16 -0700 | [diff] [blame] | 76 | using ServiceMap = std::map<std::string, Service>; | 
|  | 77 |  | 
| Jon Spivack | f288b1d | 2019-12-19 17:15:51 -0800 | [diff] [blame] | 78 | // removes a callback from mNameToRegistrationCallback, removing it if the vector is empty | 
| Steven Moreland | 27cfab0 | 2019-08-12 14:34:16 -0700 | [diff] [blame] | 79 | // this updates iterator to the next location | 
| Jon Spivack | f288b1d | 2019-12-19 17:15:51 -0800 | [diff] [blame] | 80 | void removeRegistrationCallback(const wp<IBinder>& who, | 
|  | 81 | ServiceCallbackMap::iterator* it, | 
| Steven Moreland | 27cfab0 | 2019-08-12 14:34:16 -0700 | [diff] [blame] | 82 | bool* found); | 
| Jon Spivack | d9533c2 | 2020-01-27 22:19:22 +0000 | [diff] [blame] | 83 | ssize_t handleServiceClientCallback(const std::string& serviceName, bool isCalledOnInterval); | 
| Jon Spivack | 9f503a4 | 2019-10-22 16:49:19 -0700 | [diff] [blame] | 84 | // Also updates mHasClients (of what the last callback was) | 
|  | 85 | void sendClientCallbackNotifications(const std::string& serviceName, bool hasClients); | 
|  | 86 | // removes a callback from mNameToClientCallback, deleting the entry if the vector is empty | 
|  | 87 | // this updates the iterator to the next location | 
|  | 88 | void removeClientCallback(const wp<IBinder>& who, ClientCallbackMap::iterator* it); | 
|  | 89 |  | 
| Jon Spivack | 0d84430 | 2019-07-22 18:40:34 -0700 | [diff] [blame] | 90 | sp<IBinder> tryGetService(const std::string& name, bool startIfNotFound); | 
| Steven Moreland | 27cfab0 | 2019-08-12 14:34:16 -0700 | [diff] [blame] | 91 |  | 
| Steven Moreland | 27cfab0 | 2019-08-12 14:34:16 -0700 | [diff] [blame] | 92 | ServiceMap mNameToService; | 
| Jon Spivack | f288b1d | 2019-12-19 17:15:51 -0800 | [diff] [blame] | 93 | ServiceCallbackMap mNameToRegistrationCallback; | 
| Jon Spivack | 9f503a4 | 2019-10-22 16:49:19 -0700 | [diff] [blame] | 94 | ClientCallbackMap mNameToClientCallback; | 
| Steven Moreland | 27cfab0 | 2019-08-12 14:34:16 -0700 | [diff] [blame] | 95 |  | 
| Steven Moreland | 80e1e6d | 2019-06-21 12:35:59 -0700 | [diff] [blame] | 96 | std::unique_ptr<Access> mAccess; | 
|  | 97 | }; | 
|  | 98 |  | 
|  | 99 | }  // namespace android |