• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #define LOG_TAG "hwservicemanager"
2 #include "HidlService.h"
3 
4 #include <android-base/logging.h>
5 #include <sstream>
6 
7 namespace android {
8 namespace hidl {
9 namespace manager {
10 namespace V1_0 {
11 namespace implementation {
12 
HidlService(const std::string & interfaceName,const std::string & instanceName,const sp<IBase> & service,pid_t pid)13 HidlService::HidlService(
14     const std::string &interfaceName,
15     const std::string &instanceName,
16     const sp<IBase> &service,
17     pid_t pid)
18 : mInterfaceName(interfaceName),
19   mInstanceName(instanceName),
20   mService(service),
21   mPid(pid)
22 {}
23 
getService() const24 sp<IBase> HidlService::getService() const {
25     return mService;
26 }
setService(sp<IBase> service,pid_t pid)27 void HidlService::setService(sp<IBase> service, pid_t pid) {
28     mService = service;
29     mPid = pid;
30 
31     sendRegistrationNotifications();
32 }
33 
getPid() const34 pid_t HidlService::getPid() const {
35     return mPid;
36 }
getInterfaceName() const37 const std::string &HidlService::getInterfaceName() const {
38     return mInterfaceName;
39 }
getInstanceName() const40 const std::string &HidlService::getInstanceName() const {
41     return mInstanceName;
42 }
43 
addListener(const sp<IServiceNotification> & listener)44 void HidlService::addListener(const sp<IServiceNotification> &listener) {
45     if (mService != nullptr) {
46         auto ret = listener->onRegistration(
47             mInterfaceName, mInstanceName, true /* preexisting */);
48         if (!ret.isOk()) {
49             LOG(ERROR) << "Not adding listener for " << mInterfaceName << "/"
50                        << mInstanceName << ": transport error when sending "
51                        << "notification for already registered instance.";
52             return;
53         }
54     }
55     mListeners.push_back(listener);
56 }
57 
removeListener(const wp<IBase> & listener)58 bool HidlService::removeListener(const wp<IBase>& listener) {
59     bool found = false;
60 
61     for (auto it = mListeners.begin(); it != mListeners.end();) {
62         if (*it == listener) {
63             it = mListeners.erase(it);
64             found = true;
65         } else {
66             ++it;
67         }
68     }
69 
70     return found;
71 }
72 
registerPassthroughClient(pid_t pid)73 void HidlService::registerPassthroughClient(pid_t pid) {
74     mPassthroughClients.insert(pid);
75 }
76 
getPassthroughClients() const77 const std::set<pid_t> &HidlService::getPassthroughClients() const {
78     return mPassthroughClients;
79 }
80 
string() const81 std::string HidlService::string() const {
82     std::stringstream ss;
83     ss << mInterfaceName << "/" << mInstanceName;
84     return ss.str();
85 }
86 
sendRegistrationNotifications()87 void HidlService::sendRegistrationNotifications() {
88     if (mListeners.size() == 0 || mService == nullptr) {
89         return;
90     }
91 
92     hidl_string iface = mInterfaceName;
93     hidl_string name = mInstanceName;
94 
95     for (auto it = mListeners.begin(); it != mListeners.end();) {
96         auto ret = (*it)->onRegistration(iface, name, false /* preexisting */);
97         if (ret.isOk()) {
98             ++it;
99         } else {
100             LOG(ERROR) << "Dropping registration callback for " << iface << "/" << name
101                        << ": transport error.";
102             it = mListeners.erase(it);
103         }
104     }
105 }
106 
107 }  // namespace implementation
108 }  // namespace V1_0
109 }  // namespace manager
110 }  // namespace hidl
111 }  // namespace android
112