1 /*
2 * Copyright (c) 2023 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 <element_name.h>
17 #include <want.h>
18
19 #include "hdf_log.h"
20 #include "hilog_wrapper.h"
21 #include "matching_skills.h"
22 #include "common_event_support.h"
23 #include "common_event_subscribe_info.h"
24 #include "bus_extension_core.h"
25 #include "pkg_db_helper.h"
26 #include "driver_pkg_manager.h"
27 #include "driver_os_account_subscriber.h"
28 #include "os_account_manager.h"
29
30 namespace OHOS {
31 namespace ExternalDeviceManager {
32 using namespace std;
33 using namespace OHOS;
34 using namespace OHOS::AAFwk;
35 using namespace OHOS::AppExecFwk;
36 using namespace OHOS::ExternalDeviceManager;
37 using namespace OHOS::AccountSA;
38
39 static constexpr const char *ACCOUNT_SWITCHING_SUBSCRIBE_NAME = "DRIVER_ACCOUNT_SWITCHING_SUBSCRIBE";
40 static constexpr const char *ACCOUNT_SWITCHED_SUBSCRIBE_NAME = "DRIVER_ACCOUNT_SWITCHED_SUBSCRIBE";
41
42 IMPLEMENT_SINGLE_INSTANCE(DriverPkgManager);
43
DriverPkgManager()44 DriverPkgManager::DriverPkgManager()
45 {
46 };
47
~DriverPkgManager()48 DriverPkgManager::~DriverPkgManager()
49 {
50 if (UnRegisterBundleStatusCallback() == 0) {
51 EDM_LOGE(MODULE_PKG_MGR, "~DriverPkgManager UnRegisterBundleStatusCallback Fail");
52 }
53 bundleStateCallback_ = nullptr;
54 }
55
PrintTest()56 void DriverPkgManager::PrintTest()
57 {
58 bundleStateCallback_->PrintTest();
59 }
60
Init()61 int32_t DriverPkgManager::Init()
62 {
63 bundleStateCallback_ = new DrvBundleStateCallback();
64 if (bundleStateCallback_ == nullptr) {
65 EDM_LOGE(MODULE_PKG_MGR, "bundleStateCallback_ new Err");
66 return EDM_ERR_INVALID_OBJECT;
67 }
68
69 bundleStateCallback_->GetAllDriverInfos();
70 return EDM_OK;
71 }
72
Init(shared_future<int32_t> bmsFuture,shared_future<int32_t> accountFuture,shared_future<int32_t> commEventFuture)73 int32_t DriverPkgManager::Init(shared_future<int32_t> bmsFuture, shared_future<int32_t> accountFuture,
74 shared_future<int32_t> commEventFuture)
75 {
76 bmsFuture_ = bmsFuture;
77 accountFuture_ = accountFuture;
78 commEventFuture_ = commEventFuture;
79
80 bundleStateCallback_ = new DrvBundleStateCallback(bmsFuture, accountFuture, commEventFuture);
81 if (bundleStateCallback_ == nullptr) {
82 EDM_LOGE(MODULE_PKG_MGR, "bundleStateCallback_ new Err");
83 return EDM_ERR_INVALID_OBJECT;
84 }
85
86 bundleStateCallback_->GetAllDriverInfosAsync();
87 return EDM_OK;
88 }
89
SubscribeOsAccountSwitch()90 bool DriverPkgManager::SubscribeOsAccountSwitch()
91 {
92 EDM_LOGI(MODULE_PKG_MGR, "SubscribeOsAccountSwitch start");
93 OsAccountSubscribeInfo switchingSubscribeInfo(OS_ACCOUNT_SUBSCRIBE_TYPE::SWITCHING,
94 ACCOUNT_SWITCHING_SUBSCRIBE_NAME);
95 OsAccountSubscribeInfo switchedSubscribeInfo(OS_ACCOUNT_SUBSCRIBE_TYPE::SWITCHED, ACCOUNT_SWITCHED_SUBSCRIBE_NAME);
96 shared_ptr<DriverOsAccountSwitching> driverOsAccountSwitching
97 = make_shared<DriverOsAccountSwitching>(switchingSubscribeInfo, bundleStateCallback_);
98 shared_ptr<DriverOsAccountSwitched> driverOsAccountSwitched
99 = make_shared<DriverOsAccountSwitched>(switchedSubscribeInfo, bundleStateCallback_);
100 auto retCode = OsAccountManager::SubscribeOsAccount(driverOsAccountSwitching);
101 if (retCode != ERR_OK) {
102 EDM_LOGE(MODULE_PKG_MGR, "SubscribeOsAccount Switching fail, retCode=%{public}d", retCode);
103 return false;
104 }
105 retCode = OsAccountManager::SubscribeOsAccount(driverOsAccountSwitched);
106 if (retCode != ERR_OK) {
107 EDM_LOGE(MODULE_PKG_MGR, "SubscribeOsAccount Switched fail, retCode=%{public}d", retCode);
108 return false;
109 }
110 return true;
111 }
112
QueryMatchDriver(shared_ptr<DeviceInfo> devInfo)113 shared_ptr<BundleInfoNames> DriverPkgManager::QueryMatchDriver(shared_ptr<DeviceInfo> devInfo)
114 {
115 EDM_LOGI(MODULE_PKG_MGR, "Enter QueryMatchDriver");
116 shared_ptr<IBusExtension> extInstance = nullptr;
117 auto ret = make_shared<BundleInfoNames>();
118 ret->bundleName.clear();
119 ret->abilityName.clear();
120 if (bundleStateCallback_ == nullptr) {
121 EDM_LOGE(MODULE_PKG_MGR, "QueryMatchDriver bundleStateCallback_ null");
122 return nullptr;
123 }
124
125 if (!bundleStateCallback_->GetAllDriverInfos(false)) {
126 EDM_LOGE(MODULE_PKG_MGR, "QueryMatchDriver GetAllDriverInfos Err");
127 return nullptr;
128 }
129
130 std::vector<PkgInfoTable> pkgInfos;
131 std::shared_ptr<PkgDbHelper> helper = PkgDbHelper::GetInstance();
132 int32_t retRdb = helper->QueryPkgInfos(pkgInfos);
133 if (retRdb <= 0) {
134 /* error or empty record */
135 return nullptr;
136 }
137 EDM_LOGI(MODULE_PKG_MGR, "Total driverInfos number: %{public}zu", pkgInfos.size());
138 for (const auto &pkgInfo : pkgInfos) {
139 DriverInfo driverInfo;
140 driverInfo.UnSerialize(pkgInfo.driverInfo);
141 extInstance = BusExtensionCore::GetInstance().GetBusExtensionByName(driverInfo.GetBusName());
142 if (extInstance != nullptr && extInstance->MatchDriver(driverInfo, *devInfo)) {
143 ret->bundleName = pkgInfo.bundleName;
144 ret->abilityName = pkgInfo.driverName;
145 ret->driverUid = pkgInfo.driverUid;
146 return ret;
147 }
148 }
149 EDM_LOGI(MODULE_PKG_MGR, "QueryMatchDriver return null");
150 return nullptr;
151 }
152
QueryDriverInfo(vector<shared_ptr<DriverInfo>> & driverInfos,bool isByDriverUid,const std::string & driverUid)153 int32_t DriverPkgManager::QueryDriverInfo(vector<shared_ptr<DriverInfo>> &driverInfos,
154 bool isByDriverUid, const std::string &driverUid)
155 {
156 EDM_LOGD(MODULE_PKG_MGR, "DriverPkgManager::QueryDriverInfo enter");
157 if (bundleStateCallback_ == nullptr) {
158 EDM_LOGE(MODULE_PKG_MGR, "QueryDriverInfo bundleStateCallback_ null");
159 return EDM_NOK;
160 }
161
162 if (!bundleStateCallback_->GetAllDriverInfos()) {
163 EDM_LOGE(MODULE_PKG_MGR, "QueryDriverInfo GetAllDriverInfos Err");
164 return EDM_NOK;
165 }
166
167 std::shared_ptr<PkgDbHelper> helper = PkgDbHelper::GetInstance();
168 std::vector<PkgInfoTable> pkgInfos;
169 EDM_LOGD(MODULE_PKG_MGR, "pkg QueryDriverInfo driverUid: %{public}s", driverUid.c_str());
170 int32_t pkgSize = helper->QueryPkgInfos(pkgInfos, isByDriverUid, driverUid);
171 if (pkgSize < 0) {
172 return EDM_NOK;
173 }
174 for (const auto &pkgInfo : pkgInfos) {
175 std::shared_ptr<DriverInfo> driverInfo
176 = std::make_shared<DriverInfo>(pkgInfo.bundleName, pkgInfo.driverName, pkgInfo.driverUid);
177 if (driverInfo->UnSerialize(pkgInfo.driverInfo) != EDM_OK) {
178 return EDM_NOK;
179 }
180 driverInfos.push_back(driverInfo);
181 }
182 EDM_LOGD(MODULE_PKG_MGR, "DriverPkgManager::QueryDriverInfo driverInfos size:%{public}zu", driverInfos.size());
183 return EDM_OK;
184 }
185
RegisterBundleStatusCallback()186 int32_t DriverPkgManager::RegisterBundleStatusCallback()
187 {
188 EDM_LOGI(MODULE_PKG_MGR, "RegisterBundleStatusCallback start");
189 if (bundleStateCallback_ == nullptr) {
190 EDM_LOGE(MODULE_PKG_MGR, "RegisterBundleStatusCallback failed, bundleStateCallback_ is null");
191 return EDM_ERR_INVALID_OBJECT;
192 }
193 EventFwk::MatchingSkills matchingSkills;
194 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_ADDED);
195 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_CHANGED);
196 matchingSkills.AddEvent(EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_REMOVED);
197 EventFwk::CommonEventSubscribeInfo subscribeInfo(matchingSkills);
198 bundleMonitor_ = std::make_shared<BundleMonitor>(subscribeInfo);
199
200 if (bundleMonitor_ == nullptr) {
201 EDM_LOGE(MODULE_PKG_MGR, "RegisterBundleStatusCallback failed, bundleMonitor_ is null");
202 return EDM_ERR_INVALID_OBJECT;
203 }
204
205 if (!bundleMonitor_->Subscribe(bundleStateCallback_)) {
206 EDM_LOGE(MODULE_PKG_MGR, "Failed to subscribe bundleMonitor callback");
207 return EDM_NOK;
208 }
209
210 return EDM_OK;
211 }
212
UnRegisterBundleStatusCallback()213 int32_t DriverPkgManager::UnRegisterBundleStatusCallback()
214 {
215 EDM_LOGI(MODULE_PKG_MGR, "UnRegisterCallback called");
216 if (bundleStateCallback_ == nullptr) {
217 EDM_LOGE(MODULE_PKG_MGR, "failed to unregister callback, bundleStateCallback_ is null");
218 return EDM_ERR_INVALID_OBJECT;
219 }
220
221 if (bundleMonitor_ == nullptr) {
222 EDM_LOGE(MODULE_PKG_MGR, "failed to unregister callback, bundleMonitor is null");
223 return EDM_ERR_INVALID_OBJECT;
224 }
225
226 if (!bundleMonitor_->UnSubscribe()) {
227 EDM_LOGE(MODULE_PKG_MGR, "Failed to unSubscribe bundleMonitor callback");
228 return EDM_NOK;
229 }
230
231 return EDM_OK;
232 }
233
RegisterOnBundleUpdate(PCALLBACKFUN pFun)234 int32_t DriverPkgManager::RegisterOnBundleUpdate(PCALLBACKFUN pFun)
235 {
236 if (pFun == nullptr) {
237 return EDM_ERR_INVALID_OBJECT;
238 }
239
240 if (bundleStateCallback_ == nullptr) {
241 EDM_LOGE(MODULE_PKG_MGR, "failed to register callback, bundleStateCallback_ is null");
242 return EDM_ERR_INVALID_OBJECT;
243 }
244 bundleStateCallback_->m_pFun = pFun;
245 return EDM_OK;
246 }
247
RegisterBundleCallback(std::shared_ptr<IBundleUpdateCallback> callback)248 int32_t DriverPkgManager::RegisterBundleCallback(std::shared_ptr<IBundleUpdateCallback> callback)
249 {
250 if (callback == nullptr) {
251 return EDM_ERR_INVALID_OBJECT;
252 }
253 if (bundleStateCallback_ == nullptr) {
254 EDM_LOGE(MODULE_PKG_MGR, "Failed to register bundleUpdate callback, bundleStateCallback_ is null");
255 return EDM_ERR_INVALID_OBJECT;
256 }
257 bundleStateCallback_->bundleUpdateCallback_ = callback;
258 return EDM_OK;
259 }
260
UnRegisterOnBundleUpdate()261 int32_t DriverPkgManager::UnRegisterOnBundleUpdate()
262 {
263 if (bundleStateCallback_ == nullptr) {
264 EDM_LOGE(MODULE_PKG_MGR, "failed to unregister callback, bundleStateCallback_ is null");
265 return EDM_ERR_INVALID_OBJECT;
266 }
267 bundleStateCallback_->m_pFun = nullptr;
268 return EDM_OK;
269 }
270 } // namespace ExternalDeviceManager
271 } // namespace OHOS