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