1c7afe287Sopenharmony_ci/*
2c7afe287Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3c7afe287Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4c7afe287Sopenharmony_ci * you may not use this file except in compliance with the License.
5c7afe287Sopenharmony_ci * You may obtain a copy of the License at
6c7afe287Sopenharmony_ci *
7c7afe287Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8c7afe287Sopenharmony_ci *
9c7afe287Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10c7afe287Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11c7afe287Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12c7afe287Sopenharmony_ci * See the License for the specific language governing permissions and
13c7afe287Sopenharmony_ci * limitations under the License.
14c7afe287Sopenharmony_ci */
15c7afe287Sopenharmony_ci
16c7afe287Sopenharmony_ci#include "bundle_mgr_helper.h"
17c7afe287Sopenharmony_ci#include "oaid_common.h"
18c7afe287Sopenharmony_ci#include "bundle_constants.h"
19c7afe287Sopenharmony_ci#include "bundle_mgr_client.h"
20c7afe287Sopenharmony_ci#include "bundle_mgr_interface.h"
21c7afe287Sopenharmony_ci#include "bundle_mgr_proxy.h"
22c7afe287Sopenharmony_ci#include "iservice_registry.h"
23c7afe287Sopenharmony_ci#include "system_ability_definition.h"
24c7afe287Sopenharmony_ci
25c7afe287Sopenharmony_cinamespace OHOS {
26c7afe287Sopenharmony_cinamespace Cloud {
27c7afe287Sopenharmony_ciBundleMgrHelper::BundleMgrHelper() : bundleMgrProxy_(nullptr), oaidDeathRecipient_(nullptr)
28c7afe287Sopenharmony_ci{}
29c7afe287Sopenharmony_ci
30c7afe287Sopenharmony_ciBundleMgrHelper::~BundleMgrHelper()
31c7afe287Sopenharmony_ci{}
32c7afe287Sopenharmony_ci
33c7afe287Sopenharmony_cibool BundleMgrHelper::GetBundleMgrProxy()
34c7afe287Sopenharmony_ci{
35c7afe287Sopenharmony_ci    OAID_HILOGD(OAID_MODULE_SERVICE, "GetBundleMgrProxy");
36c7afe287Sopenharmony_ci
37c7afe287Sopenharmony_ci    if (!bundleMgrProxy_) {
38c7afe287Sopenharmony_ci        sptr<ISystemAbilityManager> systemAbilityManager =
39c7afe287Sopenharmony_ci            SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
40c7afe287Sopenharmony_ci        if (!systemAbilityManager) {
41c7afe287Sopenharmony_ci            OAID_HILOGE(OAID_MODULE_SERVICE, "Failed to get system ability mgr.");
42c7afe287Sopenharmony_ci            return false;
43c7afe287Sopenharmony_ci        }
44c7afe287Sopenharmony_ci
45c7afe287Sopenharmony_ci        sptr<IRemoteObject> remoteObject =
46c7afe287Sopenharmony_ci            systemAbilityManager->GetSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
47c7afe287Sopenharmony_ci        if (!remoteObject) {
48c7afe287Sopenharmony_ci            OAID_HILOGE(OAID_MODULE_SERVICE, "Failed to get bundle manager service.");
49c7afe287Sopenharmony_ci            return false;
50c7afe287Sopenharmony_ci        }
51c7afe287Sopenharmony_ci
52c7afe287Sopenharmony_ci        bundleMgrProxy_ = iface_cast<IBundleMgr>(remoteObject);
53c7afe287Sopenharmony_ci        if ((!bundleMgrProxy_) || (!bundleMgrProxy_->AsObject())) {
54c7afe287Sopenharmony_ci            OAID_HILOGE(OAID_MODULE_SERVICE, "Failed to get system bundle manager services ability");
55c7afe287Sopenharmony_ci            return false;
56c7afe287Sopenharmony_ci        }
57c7afe287Sopenharmony_ci
58c7afe287Sopenharmony_ci        oaidDeathRecipient_ = new (std::nothrow) OAIDDeathRecipient();
59c7afe287Sopenharmony_ci        if (!oaidDeathRecipient_) {
60c7afe287Sopenharmony_ci            OAID_HILOGE(OAID_MODULE_SERVICE, "Failed to create death Recipient ptr OAIDDeathRecipient");
61c7afe287Sopenharmony_ci            return false;
62c7afe287Sopenharmony_ci        }
63c7afe287Sopenharmony_ci        if (!bundleMgrProxy_->AsObject()->AddDeathRecipient(oaidDeathRecipient_)) {
64c7afe287Sopenharmony_ci            OAID_HILOGW(OAID_MODULE_SERVICE, "Failed to add death recipient");
65c7afe287Sopenharmony_ci        }
66c7afe287Sopenharmony_ci    }
67c7afe287Sopenharmony_ci
68c7afe287Sopenharmony_ci    return true;
69c7afe287Sopenharmony_ci}
70c7afe287Sopenharmony_ci
71c7afe287Sopenharmony_cibool BundleMgrHelper::GetBundleInfosV9ByReqPermission(std::vector<AppExecFwk::BundleInfo> &bundleInfos, int32_t userId)
72c7afe287Sopenharmony_ci{
73c7afe287Sopenharmony_ci    OAID_HILOGI(OAID_MODULE_SERVICE, "GetBundleInfosV9ByReqPermission");
74c7afe287Sopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
75c7afe287Sopenharmony_ci
76c7afe287Sopenharmony_ci    if (!GetBundleMgrProxy()) {
77c7afe287Sopenharmony_ci        OAID_HILOGE(OAID_MODULE_SERVICE, "get BundleMgr Proxy fail");
78c7afe287Sopenharmony_ci        return false;
79c7afe287Sopenharmony_ci    }
80c7afe287Sopenharmony_ci
81c7afe287Sopenharmony_ci    int32_t flag = static_cast<int32_t>(AppExecFwk::GetBundleInfoFlag::GET_BUNDLE_INFO_WITH_REQUESTED_PERMISSION);
82c7afe287Sopenharmony_ci    ErrCode ret = bundleMgrProxy_->GetBundleInfosV9(flag, bundleInfos, userId);
83c7afe287Sopenharmony_ci    if (ret != ERR_OK) {
84c7afe287Sopenharmony_ci        OAID_HILOGE(OAID_MODULE_SERVICE, "Failed to getBundleInfos");
85c7afe287Sopenharmony_ci        return false;
86c7afe287Sopenharmony_ci    }
87c7afe287Sopenharmony_ci
88c7afe287Sopenharmony_ci    return true;
89c7afe287Sopenharmony_ci}
90c7afe287Sopenharmony_ci
91c7afe287Sopenharmony_cibool BundleMgrHelper::GetApplicationInfoV9WithPermission(
92c7afe287Sopenharmony_ci    const std::string bundleName, int32_t userId, AppExecFwk::ApplicationInfo &applicationInfo)
93c7afe287Sopenharmony_ci{
94c7afe287Sopenharmony_ci    OAID_HILOGI(OAID_MODULE_SERVICE, "GetApplicationInfoV9ByReqPermission");
95c7afe287Sopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
96c7afe287Sopenharmony_ci
97c7afe287Sopenharmony_ci    if (!GetBundleMgrProxy()) {
98c7afe287Sopenharmony_ci        OAID_HILOGE(OAID_MODULE_SERVICE, "get BundleMgr Proxy fail");
99c7afe287Sopenharmony_ci        return false;
100c7afe287Sopenharmony_ci    }
101c7afe287Sopenharmony_ci
102c7afe287Sopenharmony_ci    int32_t applicationFlag =
103c7afe287Sopenharmony_ci        static_cast<int32_t>(AppExecFwk::GetApplicationFlag::GET_APPLICATION_INFO_WITH_PERMISSION);
104c7afe287Sopenharmony_ci    ErrCode ret = bundleMgrProxy_->GetApplicationInfoV9(bundleName, applicationFlag, userId, applicationInfo);
105c7afe287Sopenharmony_ci    if (ret != ERR_OK) {
106c7afe287Sopenharmony_ci        OAID_HILOGE(OAID_MODULE_SERVICE, "Failed to GetApplicationInfoV9");
107c7afe287Sopenharmony_ci        return false;
108c7afe287Sopenharmony_ci    }
109c7afe287Sopenharmony_ci
110c7afe287Sopenharmony_ci    return true;
111c7afe287Sopenharmony_ci}
112c7afe287Sopenharmony_ci
113c7afe287Sopenharmony_civoid BundleMgrHelper::GetBundleNameByUid(const int uid, std::string &name)
114c7afe287Sopenharmony_ci{
115c7afe287Sopenharmony_ci    OAID_HILOGI(OAID_MODULE_SERVICE, "GetBundleNameByUid");
116c7afe287Sopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
117c7afe287Sopenharmony_ci
118c7afe287Sopenharmony_ci    if (!GetBundleMgrProxy()) {
119c7afe287Sopenharmony_ci        OAID_HILOGE(OAID_MODULE_SERVICE, "get BundleMgr Proxy fail");
120c7afe287Sopenharmony_ci        return;
121c7afe287Sopenharmony_ci    }
122c7afe287Sopenharmony_ci
123c7afe287Sopenharmony_ci    ErrCode ret = bundleMgrProxy_->GetNameForUid(uid, name);
124c7afe287Sopenharmony_ci    if (ret != ERR_OK) {
125c7afe287Sopenharmony_ci        OAID_HILOGE(OAID_MODULE_SERVICE, "Failed to GetNameForUid");
126c7afe287Sopenharmony_ci        return;
127c7afe287Sopenharmony_ci    }
128c7afe287Sopenharmony_ci    OAID_HILOGI(OAID_MODULE_SERVICE, "GetBundleNameByUid success");
129c7afe287Sopenharmony_ci    return;
130c7afe287Sopenharmony_ci}
131c7afe287Sopenharmony_ci
132c7afe287Sopenharmony_civoid BundleMgrHelper::ClearBundleMgrHelper()
133c7afe287Sopenharmony_ci{
134c7afe287Sopenharmony_ci    OAID_HILOGI(OAID_MODULE_SERVICE, "ClearBundleMgrHelper");
135c7afe287Sopenharmony_ci    std::lock_guard<std::mutex> lock(mutex_);
136c7afe287Sopenharmony_ci
137c7afe287Sopenharmony_ci    if ((bundleMgrProxy_ != nullptr) && (bundleMgrProxy_->AsObject() != nullptr)) {
138c7afe287Sopenharmony_ci        bundleMgrProxy_->AsObject()->RemoveDeathRecipient(oaidDeathRecipient_);
139c7afe287Sopenharmony_ci    }
140c7afe287Sopenharmony_ci    bundleMgrProxy_ = nullptr;
141c7afe287Sopenharmony_ci}
142c7afe287Sopenharmony_ci}  // namespace Cloud
143c7afe287Sopenharmony_ci}  // namespace OHOS