12173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Moreland#ifndef ANDROID_HARDWARE_MANAGER_V1_0_HIDLSERVICE_H
22173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Moreland#define ANDROID_HARDWARE_MANAGER_V1_0_HIDLSERVICE_H
32173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Moreland
4ee531a829e99f427dac47383f70d6a1c0fd1ca84Yifan Hong#include <set>
5ee531a829e99f427dac47383f70d6a1c0fd1ca84Yifan Hong
62173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Moreland#include <android/hidl/manager/1.0/IServiceManager.h>
72173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Moreland#include <hidl/Status.h>
82173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Moreland#include <hidl/MQDescriptor.h>
92173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Moreland
102173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Morelandnamespace android {
112173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Morelandnamespace hidl {
122173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Morelandnamespace manager {
132173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Morelandnamespace V1_0 {
142173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Morelandnamespace implementation {
152173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Moreland
162173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Morelandusing ::android::hardware::hidl_vec;
172173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Morelandusing ::android::hardware::hidl_string;
182173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Morelandusing ::android::hardware::Return;
192173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Morelandusing ::android::hardware::Void;
20b3a90f0de29292ec4288484c3e66b225d86bdc15Yifan Hongusing ::android::hidl::base::V1_0::IBase;
212173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Morelandusing ::android::hidl::manager::V1_0::IServiceManager;
222173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Morelandusing ::android::sp;
232173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Moreland
242173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Morelandstruct HidlService {
25d544cf6502ff3a9958887b683f0500edcebd8cb8Steven Moreland    HidlService(const std::string &interfaceName,
26d544cf6502ff3a9958887b683f0500edcebd8cb8Steven Moreland                const std::string &instanceName,
27cdf9472ffbd015938a99e3658b21bfb9758dca97Steven Moreland                const sp<IBase> &service,
28cdf9472ffbd015938a99e3658b21bfb9758dca97Steven Moreland                const pid_t pid);
29cdf9472ffbd015938a99e3658b21bfb9758dca97Steven Moreland    HidlService(const std::string &interfaceName,
30cdf9472ffbd015938a99e3658b21bfb9758dca97Steven Moreland                const std::string &instanceName)
31cdf9472ffbd015938a99e3658b21bfb9758dca97Steven Moreland    : HidlService(
32cdf9472ffbd015938a99e3658b21bfb9758dca97Steven Moreland        interfaceName,
33cdf9472ffbd015938a99e3658b21bfb9758dca97Steven Moreland        instanceName,
34cdf9472ffbd015938a99e3658b21bfb9758dca97Steven Moreland        nullptr,
35cdf9472ffbd015938a99e3658b21bfb9758dca97Steven Moreland        static_cast<pid_t>(IServiceManager::PidConstant::NO_PID))
36cdf9472ffbd015938a99e3658b21bfb9758dca97Steven Moreland    {}
372173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Moreland
382173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Moreland    /**
392173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Moreland     * Note, getService() can be nullptr. This is because you can have a HidlService
402173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Moreland     * with registered IServiceNotification objects but no service registered yet.
412173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Moreland     */
42b3a90f0de29292ec4288484c3e66b225d86bdc15Yifan Hong    sp<IBase> getService() const;
43cdf9472ffbd015938a99e3658b21bfb9758dca97Steven Moreland    void setService(sp<IBase> service, pid_t pid);
44cdf9472ffbd015938a99e3658b21bfb9758dca97Steven Moreland    pid_t getPid() const;
45d544cf6502ff3a9958887b683f0500edcebd8cb8Steven Moreland    const std::string &getInterfaceName() const;
46d544cf6502ff3a9958887b683f0500edcebd8cb8Steven Moreland    const std::string &getInstanceName() const;
472173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Moreland
482173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Moreland    void addListener(const sp<IServiceNotification> &listener);
497fafc144d14c9acfd9152a51dfb5ca3d87b995d4Martijn Coenen    bool removeListener(const wp<IBase> &listener);
50ee531a829e99f427dac47383f70d6a1c0fd1ca84Yifan Hong    void registerPassthroughClient(pid_t pid);
512173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Moreland
522173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Moreland    std::string string() const; // e.x. "android.hidl.manager@1.0::IServiceManager/manager"
53ee531a829e99f427dac47383f70d6a1c0fd1ca84Yifan Hong    const std::set<pid_t> &getPassthroughClients() const;
542173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Moreland
552173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Morelandprivate:
5672103a0ad5abf7ec79f0ca7558330b131810e6d3Martijn Coenen    void sendRegistrationNotifications();
572173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Moreland
58d544cf6502ff3a9958887b683f0500edcebd8cb8Steven Moreland    const std::string                     mInterfaceName; // e.x. "android.hardware.manager@1.0::IServiceManager"
59d544cf6502ff3a9958887b683f0500edcebd8cb8Steven Moreland    const std::string                     mInstanceName;  // e.x. "manager"
60b3a90f0de29292ec4288484c3e66b225d86bdc15Yifan Hong    sp<IBase>                             mService;
612173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Moreland
622173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Moreland    std::vector<sp<IServiceNotification>> mListeners{};
63ee531a829e99f427dac47383f70d6a1c0fd1ca84Yifan Hong    std::set<pid_t>                       mPassthroughClients{};
64cdf9472ffbd015938a99e3658b21bfb9758dca97Steven Moreland    pid_t                                 mPid = static_cast<pid_t>(IServiceManager::PidConstant::NO_PID);
652173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Moreland};
662173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Moreland
672173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Moreland}  // namespace implementation
682173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Moreland}  // namespace V1_0
692173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Moreland}  // namespace manager
702173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Moreland}  // namespace hidl
712173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Moreland}  // namespace android
722173d3c8d6f5a5a78bd145063ac177d7f0657d33Steven Moreland
73b3a90f0de29292ec4288484c3e66b225d86bdc15Yifan Hong#endif // ANDROID_HARDWARE_MANAGER_V1_0_HIDLSERVICE_H
74