1 /*
2 * Copyright (c) 2023-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 "ability_manager_errors.h"
17 #include "extension_ability_info.h"
18 #include "extension_manager_client.h"
19 #include "extension_manager_proxy.h"
20 #include "extension_running_info.h"
21 #include "hilog_tag_wrapper.h"
22 #include "hitrace_meter.h"
23 #include "iservice_registry.h"
24 #include "system_ability_definition.h"
25 #include "want.h"
26
27 namespace OHOS {
28 namespace AAFwk {
29 #define CHECK_POINTER_RETURN(object) \
30 if (!object) { \
31 TAG_LOGE(AAFwkTag::EXTMGR, "null proxy"); \
32 return; \
33 }
34
35 #define CHECK_POINTER_RETURN_NOT_CONNECTED(object) \
36 if (!object) { \
37 TAG_LOGE(AAFwkTag::EXTMGR, "null proxy"); \
38 return ABILITY_SERVICE_NOT_CONNECTED; \
39 }
40
41 #define CHECK_POINTER_RETURN_INVALID_VALUE(object) \
42 if (!object) { \
43 TAG_LOGE(AAFwkTag::EXTMGR, "null proxy"); \
44 return ERR_INVALID_VALUE; \
45 }
46
GetInstance()47 ExtensionManagerClient& ExtensionManagerClient::GetInstance()
48 {
49 static ExtensionManagerClient instance;
50 return instance;
51 }
52
GetExtensionManager()53 sptr<IExtensionManager> ExtensionManagerClient::GetExtensionManager()
54 {
55 std::lock_guard<std::mutex> lock(mutex_);
56 if (proxy_ == nullptr) {
57 Connect();
58 }
59
60 return proxy_;
61 }
62
Connect()63 void ExtensionManagerClient::Connect()
64 {
65 auto systemManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
66 if (systemManager == nullptr) {
67 TAG_LOGE(AAFwkTag::EXTMGR, "Get SAMgr failed");
68 return;
69 }
70 auto remoteObj = systemManager->GetSystemAbility(ABILITY_MGR_SERVICE_ID);
71 if (remoteObj == nullptr) {
72 TAG_LOGE(AAFwkTag::EXTMGR, "Connect AMS failed");
73 return;
74 }
75
76 deathRecipient_ = new ExtensionMgrDeathRecipient();
77 if (remoteObj->IsProxyObject() && !remoteObj->AddDeathRecipient(deathRecipient_)) {
78 TAG_LOGE(AAFwkTag::EXTMGR, "AddDeathRecipient failed");
79 return;
80 }
81
82 proxy_ = sptr<IExtensionManager>(new ExtensionManagerProxy(remoteObj));
83 TAG_LOGD(AAFwkTag::EXTMGR, "Connect AMS success");
84 }
85
ResetProxy(const wptr<IRemoteObject> & remote)86 void ExtensionManagerClient::ResetProxy(const wptr<IRemoteObject> &remote)
87 {
88 std::lock_guard<std::mutex> lock(mutex_);
89 if (proxy_ == nullptr) {
90 TAG_LOGI(AAFwkTag::EXTMGR, "null proxy_, no need reset");
91 return;
92 }
93
94 auto serviceRemote = proxy_->AsObject();
95 if (serviceRemote != nullptr && serviceRemote == remote.promote()) {
96 serviceRemote->RemoveDeathRecipient(deathRecipient_);
97 proxy_ = nullptr;
98 }
99 }
100
OnRemoteDied(const wptr<IRemoteObject> & remote)101 void ExtensionManagerClient::ExtensionMgrDeathRecipient::OnRemoteDied(const wptr<IRemoteObject> &remote)
102 {
103 TAG_LOGI(AAFwkTag::EXTMGR, "called");
104 ExtensionManagerClient::GetInstance().ResetProxy(remote);
105 }
106
ConnectServiceExtensionAbility(const Want & want,const sptr<IRemoteObject> & connect,int32_t userId)107 ErrCode ExtensionManagerClient::ConnectServiceExtensionAbility(const Want &want,
108 const sptr<IRemoteObject> &connect, int32_t userId)
109 {
110 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
111 auto abms = GetExtensionManager();
112 if (abms == nullptr) {
113 TAG_LOGE(AAFwkTag::EXTMGR, "Connect failed, bundleName:%{public}s, abilityName:%{public}s.",
114 want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str());
115 return ABILITY_SERVICE_NOT_CONNECTED;
116 }
117 TAG_LOGD(AAFwkTag::EXTMGR, "name:%{public}s %{public}s, userId:%{public}d.",
118 want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str(), userId);
119 return abms->ConnectAbilityCommon(want, connect, nullptr, AppExecFwk::ExtensionAbilityType::SERVICE,
120 userId, false);
121 }
122
ConnectServiceExtensionAbility(const Want & want,const sptr<IRemoteObject> & connect,const sptr<IRemoteObject> & callerToken,int32_t userId)123 ErrCode ExtensionManagerClient::ConnectServiceExtensionAbility(const Want &want,
124 const sptr<IRemoteObject> &connect, const sptr<IRemoteObject> &callerToken, int32_t userId)
125 {
126 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
127 auto abms = GetExtensionManager();
128 if (abms == nullptr) {
129 TAG_LOGE(AAFwkTag::EXTMGR, "Connect failed, bundleName:%{public}s, abilityName:%{public}s.",
130 want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str());
131 return ABILITY_SERVICE_NOT_CONNECTED;
132 }
133 TAG_LOGI(AAFwkTag::EXTMGR, "name:%{public}s %{public}s, userId:%{public}d.",
134 want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str(), userId);
135 return abms->ConnectAbilityCommon(
136 want, connect, callerToken, AppExecFwk::ExtensionAbilityType::SERVICE, userId, false);
137 }
138
ConnectEnterpriseAdminExtensionAbility(const Want & want,const sptr<IRemoteObject> & connect,const sptr<IRemoteObject> & callerToken,int32_t userId)139 ErrCode ExtensionManagerClient::ConnectEnterpriseAdminExtensionAbility(const Want &want,
140 const sptr<IRemoteObject> &connect, const sptr<IRemoteObject> &callerToken, int32_t userId)
141 {
142 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
143 auto abms = GetExtensionManager();
144 if (abms == nullptr) {
145 TAG_LOGE(AAFwkTag::EXTMGR, "Connect failed, bundleName:%{public}s, abilityName:%{public}s.",
146 want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str());
147 return ABILITY_SERVICE_NOT_CONNECTED;
148 }
149 TAG_LOGI(AAFwkTag::EXTMGR, "name:%{public}s %{public}s, userId:%{public}d.",
150 want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str(), userId);
151 return abms->ConnectAbilityCommon(
152 want, connect, callerToken, AppExecFwk::ExtensionAbilityType::ENTERPRISE_ADMIN, userId, true);
153 }
154
ConnectExtensionAbility(const Want & want,const sptr<IRemoteObject> & connect,int32_t userId)155 ErrCode ExtensionManagerClient::ConnectExtensionAbility(const Want &want, const sptr<IRemoteObject> &connect,
156 int32_t userId)
157 {
158 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
159 auto abms = GetExtensionManager();
160 if (abms == nullptr) {
161 TAG_LOGE(AAFwkTag::EXTMGR, "Connect failed, bundleName:%{public}s, abilityName:%{public}s",
162 want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str());
163 return ABILITY_SERVICE_NOT_CONNECTED;
164 }
165
166 TAG_LOGI(AAFwkTag::EXTMGR, "bundleName: %{public}s, abilityName: %{public}s, userId: %{public}d.",
167 want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str(), userId);
168 return abms->ConnectAbilityCommon(want, connect, nullptr, AppExecFwk::ExtensionAbilityType::UNSPECIFIED, userId);
169 }
170
DisconnectAbility(const sptr<IRemoteObject> & connect)171 ErrCode ExtensionManagerClient::DisconnectAbility(const sptr<IRemoteObject> &connect)
172 {
173 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
174 auto abms = GetExtensionManager();
175 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
176 TAG_LOGI(AAFwkTag::EXTMGR, "call");
177 return abms->DisconnectAbility(connect);
178 }
179
Release()180 ErrCode ExtensionManagerClient::Release()
181 {
182 TAG_LOGI(AAFwkTag::EXTMGR, "Release");
183 return RemoveDeathRecipient();
184 }
185
RemoveDeathRecipient()186 ErrCode ExtensionManagerClient::RemoveDeathRecipient()
187 {
188 TAG_LOGI(AAFwkTag::EXTMGR, "RemoveDeathRecipient");
189 std::lock_guard<std::mutex> lock(mutex_);
190 if (proxy_ == nullptr) {
191 TAG_LOGW(AAFwkTag::EXTMGR, "null proxy_");
192 return ERR_NULL_OBJECT;
193 }
194 if (deathRecipient_ == nullptr) {
195 TAG_LOGW(AAFwkTag::EXTMGR, "null deathRecipient_");
196 return ERR_NULL_OBJECT;
197 }
198 auto serviceRemote = proxy_->AsObject();
199 if (serviceRemote == nullptr) {
200 TAG_LOGW(AAFwkTag::EXTMGR, "null serviceRemote");
201 return ERR_NULL_OBJECT;
202 }
203 bool ret = serviceRemote->RemoveDeathRecipient(deathRecipient_);
204 if (!ret) {
205 TAG_LOGW(AAFwkTag::EXTMGR, "RemoveDeathRecipient fail");
206 return ERR_INVALID_VALUE;
207 }
208 proxy_ = nullptr;
209 deathRecipient_ = nullptr;
210 TAG_LOGI(AAFwkTag::EXTMGR, "RemoveDeathRecipient success");
211 return ERR_OK;
212 }
213
GetExtensionRunningInfos(int upperLimit,std::vector<ExtensionRunningInfo> & info)214 ErrCode ExtensionManagerClient::GetExtensionRunningInfos(int upperLimit, std::vector<ExtensionRunningInfo> &info)
215 {
216 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
217 auto abms = GetExtensionManager();
218 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
219 return abms->GetExtensionRunningInfos(upperLimit, info);
220 }
221
TransferAbilityResultForExtension(const sptr<IRemoteObject> & callerToken,int32_t resultCode,const Want & want)222 int32_t ExtensionManagerClient::TransferAbilityResultForExtension(const sptr<IRemoteObject> &callerToken,
223 int32_t resultCode, const Want &want)
224 {
225 auto abms = GetExtensionManager();
226 CHECK_POINTER_RETURN_INVALID_VALUE(abms);
227 return abms->TransferAbilityResultForExtension(callerToken, resultCode, want);
228 }
229 } // namespace AAFwk
230 } // namespace OHOS
231