1 /*
2 * Copyright (c) 2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "driver_state_manager.h"
17
18 #include "iam_check.h"
19 #include "iam_logger.h"
20
21 #include "iservice_registry.h"
22 #include "iservmgr_hdi.h"
23 #include "system_ability_definition.h"
24 #include "system_param_manager.h"
25
26 #include "co_auth_service.h"
27 #include "load_mode_handler.h"
28
29 #define LOG_TAG "USER_AUTH_SA"
30
31 namespace OHOS {
32 namespace UserIam {
33 namespace UserAuth {
34 namespace {
35 using namespace HDI;
36 using namespace HDI::ServiceManager::V1_0;
37 const char *SERVICE_NAME = "user_auth_interface_service";
38 class DriverManagerStatusListener : public ServStatListenerStub {
39 public:
40 DriverManagerStatusListener() = default;
41 ~DriverManagerStatusListener() override = default;
42
OnReceive(const ServiceStatus & status)43 void OnReceive(const ServiceStatus &status) override
44 {
45 if (status.serviceName != SERVICE_NAME) {
46 return;
47 }
48
49 IAM_LOGI("receive service %{public}s status %{public}d", status.serviceName.c_str(), status.status);
50 if (status.status == SERVIE_STATUS_START) {
51 DriverStateManager::GetInstance().OnDriverStart();
52 } else if (status.status == SERVIE_STATUS_STOP) {
53 DriverStateManager::GetInstance().OnDriverStop();
54 }
55 }
56 };
57 } // namespace
58
GetInstance()59 DriverStateManager &DriverStateManager::GetInstance()
60 {
61 static DriverStateManager instance;
62 return instance;
63 }
64
StartSubscribe()65 void DriverStateManager::StartSubscribe()
66 {
67 std::lock_guard<std::recursive_mutex> lock(mutex_);
68 if (isSubscribed_) {
69 return;
70 }
71
72 if (driverManagerStatusListener_ == nullptr) {
73 driverManagerStatusListener_ = SystemAbilityListener::Subscribe(
74 "DriverManager", DEVICE_SERVICE_MANAGER_SA_ID,
75 []() { DriverStateManager::GetInstance().OnDriverManagerAdd(); },
76 []() { DriverStateManager::GetInstance().OnDriverManagerRemove(); });
77 IF_FALSE_LOGE_AND_RETURN(driverManagerStatusListener_ != nullptr);
78 }
79
80 if (driverStatusListener_ == nullptr) {
81 driverStatusListener_ = new (std::nothrow) DriverManagerStatusListener();
82 IF_FALSE_LOGE_AND_RETURN(driverStatusListener_ != nullptr);
83 }
84
85 IAM_LOGI("success");
86 isSubscribed_ = true;
87 }
88
OnDriverManagerAdd()89 void DriverStateManager::OnDriverManagerAdd()
90 {
91 std::lock_guard<std::recursive_mutex> lock(mutex_);
92 IAM_LOGI("driver manager add");
93 IF_FALSE_LOGE_AND_RETURN(driverStatusListener_ != nullptr);
94
95 auto servMgr = IServiceManager::Get();
96 IF_FALSE_LOGE_AND_RETURN(servMgr != nullptr);
97
98 (void)servMgr->UnregisterServiceStatusListener(driverStatusListener_);
99 int32_t ret = servMgr->RegisterServiceStatusListener(driverStatusListener_, DEVICE_CLASS_USERAUTH);
100 IF_FALSE_LOGE_AND_RETURN(ret == 0);
101
102 auto service = servMgr->GetService(SERVICE_NAME);
103 if (service != nullptr) {
104 OnDriverStart();
105 } else {
106 OnDriverStop();
107 }
108 }
109
OnDriverManagerRemove()110 void DriverStateManager::OnDriverManagerRemove()
111 {
112 std::lock_guard<std::recursive_mutex> lock(mutex_);
113 IAM_LOGI("driver manager remove");
114 OnDriverStop();
115 }
116
OnDriverStart()117 void DriverStateManager::OnDriverStart()
118 {
119 IAM_LOGI("driver start");
120 std::vector<DriverUpdateCallback> startCallbacksTemp;
121 {
122 std::lock_guard<std::recursive_mutex> lock(mutex_);
123 if (isDriverRunning_.has_value() && isDriverRunning_.value()) {
124 IAM_LOGI("driver already start");
125 return;
126 }
127 isDriverRunning_ = true;
128 startCallbacksTemp = startCallbacks_;
129 }
130
131 for (auto &callback : startCallbacksTemp) {
132 if (callback != nullptr) {
133 callback();
134 }
135 }
136
137 IAM_LOGI("driver start processed");
138 }
139
OnDriverStop()140 void DriverStateManager::OnDriverStop()
141 {
142 IAM_LOGI("driver stop");
143 std::vector<DriverUpdateCallback> stopCallbacksTemp;
144 {
145 std::lock_guard<std::recursive_mutex> lock(mutex_);
146 if (!(isDriverRunning_.has_value() && isDriverRunning_.value())) {
147 IAM_LOGI("driver already stop");
148 return;
149 }
150 isDriverRunning_ = false;
151 SystemParamManager::GetInstance().SetParam(FWK_READY_KEY, FALSE_STR);
152 SystemParamManager::GetInstance().SetParam(IS_PIN_FUNCTION_READY_KEY, FALSE_STR);
153 stopCallbacksTemp = stopCallbacks_;
154 }
155
156 for (const auto &callback : stopCallbacksTemp) {
157 if (callback != nullptr) {
158 callback();
159 }
160 }
161
162 IAM_LOGI("driver stop processed");
163 }
164
RegisterDriverStartCallback(const DriverUpdateCallback & callback)165 void DriverStateManager::RegisterDriverStartCallback(const DriverUpdateCallback &callback)
166 {
167 IAM_LOGI("register driver start callback");
168 if (callback == nullptr) {
169 IAM_LOGE("driver start callback is null");
170 return;
171 }
172
173 bool triggerCallback = false;
174 {
175 std::lock_guard<std::recursive_mutex> lock(mutex_);
176 startCallbacks_.push_back(callback);
177 if (isDriverRunning_.has_value() && isDriverRunning_.value()) {
178 triggerCallback = true;
179 }
180 }
181
182 if (triggerCallback) {
183 callback();
184 }
185 }
186
RegisterDriverStopCallback(const DriverUpdateCallback & callback)187 void DriverStateManager::RegisterDriverStopCallback(const DriverUpdateCallback &callback)
188 {
189 IAM_LOGI("register driver stop callback");
190 if (callback == nullptr) {
191 IAM_LOGE("driver stop callback is null");
192 return;
193 }
194
195 bool triggerCallback = false;
196 {
197 std::lock_guard<std::recursive_mutex> lock(mutex_);
198 stopCallbacks_.push_back(callback);
199 if (isDriverRunning_.has_value() && !isDriverRunning_.value()) {
200 triggerCallback = true;
201 }
202 }
203
204 if (triggerCallback) {
205 callback();
206 }
207 }
208 } // namespace UserAuth
209 } // namespace UserIam
210 } // namespace OHOS