• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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