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 "extension_manager_client.h"
17
18 #include "ability_manager_errors.h"
19 #include "extension_ability_info.h"
20 #include "hilog_wrapper.h"
21 #include "hitrace_meter.h"
22 #include "iservice_registry.h"
23 #include "system_ability_definition.h"
24 #include "want.h"
25
26 namespace OHOS {
27 namespace AAFwk {
28 #define CHECK_POINTER_RETURN_NOT_CONNECTED(object) \
29 if (!object) { \
30 HILOG_ERROR("proxy is nullptr."); \
31 return ABILITY_SERVICE_NOT_CONNECTED; \
32 }
33
GetInstance()34 ExtensionManagerClient& ExtensionManagerClient::GetInstance()
35 {
36 static ExtensionManagerClient instance;
37 return instance;
38 }
39
GetExtensionManager()40 sptr<IExtensionManager> ExtensionManagerClient::GetExtensionManager()
41 {
42 std::lock_guard<std::mutex> lock(mutex_);
43 if (proxy_ == nullptr) {
44 Connect();
45 }
46
47 return proxy_;
48 }
49
Connect()50 void ExtensionManagerClient::Connect()
51 {
52 auto systemManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
53 if (systemManager == nullptr) {
54 HILOG_ERROR("Fail to get SAMgr.");
55 return;
56 }
57 auto remoteObj = systemManager->GetSystemAbility(ABILITY_MGR_SERVICE_ID);
58 if (remoteObj == nullptr) {
59 HILOG_ERROR("Fail to connect ability manager service.");
60 return;
61 }
62
63 deathRecipient_ = new ExtensionMgrDeathRecipient();
64 if (remoteObj->IsProxyObject() && !remoteObj->AddDeathRecipient(deathRecipient_)) {
65 HILOG_ERROR("Add death recipient to AbilityManagerService failed.");
66 return;
67 }
68
69 proxy_ = iface_cast<IExtensionManager>(remoteObj);
70 HILOG_DEBUG("Connect ability manager service success.");
71 }
72
ResetProxy(const wptr<IRemoteObject> & remote)73 void ExtensionManagerClient::ResetProxy(const wptr<IRemoteObject>& remote)
74 {
75 std::lock_guard<std::mutex> lock(mutex_);
76 if (proxy_ == nullptr) {
77 HILOG_INFO("proxy_ is nullptr, no need reset.");
78 return;
79 }
80
81 auto serviceRemote = proxy_->AsObject();
82 if (serviceRemote != nullptr && serviceRemote == remote.promote()) {
83 serviceRemote->RemoveDeathRecipient(deathRecipient_);
84 proxy_ = nullptr;
85 }
86 }
87
OnRemoteDied(const wptr<IRemoteObject> & remote)88 void ExtensionManagerClient::ExtensionMgrDeathRecipient::OnRemoteDied(const wptr<IRemoteObject>& remote)
89 {
90 HILOG_INFO("ExtensionMgrDeathRecipient handle remote died.");
91 ExtensionManagerClient::GetInstance().ResetProxy(remote);
92 }
93
ConnectServiceExtensionAbility(const Want & want,const sptr<IRemoteObject> & connect,int32_t userId)94 ErrCode ExtensionManagerClient::ConnectServiceExtensionAbility(const Want &want,
95 const sptr<IRemoteObject> &connect, int32_t userId)
96 {
97 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
98 auto abms = GetExtensionManager();
99 if (abms == nullptr) {
100 HILOG_ERROR("Connect service failed, bundleName:%{public}s, abilityName:%{public}s",
101 want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str());
102 return ABILITY_SERVICE_NOT_CONNECTED;
103 }
104 HILOG_INFO("name:%{public}s %{public}s, userId:%{public}d.",
105 want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str(), userId);
106 return abms->ConnectAbilityCommon(want, connect, nullptr, AppExecFwk::ExtensionAbilityType::SERVICE, userId);
107 }
108
ConnectServiceExtensionAbility(const Want & want,const sptr<IRemoteObject> & connect,const sptr<IRemoteObject> & callerToken,int32_t userId)109 ErrCode ExtensionManagerClient::ConnectServiceExtensionAbility(const Want &want,
110 const sptr<IRemoteObject> &connect, const sptr<IRemoteObject> &callerToken, int32_t userId)
111 {
112 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
113 auto abms = GetExtensionManager();
114 if (abms == nullptr) {
115 HILOG_ERROR("Connect service failed, bundleName:%{public}s, abilityName:%{public}s",
116 want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str());
117 return ABILITY_SERVICE_NOT_CONNECTED;
118 }
119 HILOG_INFO("name:%{public}s %{public}s, userId:%{public}d.",
120 want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str(), userId);
121 return abms->ConnectAbilityCommon(want, connect, callerToken, AppExecFwk::ExtensionAbilityType::SERVICE, userId);
122 }
123
ConnectExtensionAbility(const Want & want,const sptr<IRemoteObject> & connect,int32_t userId)124 ErrCode ExtensionManagerClient::ConnectExtensionAbility(const Want &want, const sptr<IRemoteObject> &connect,
125 int32_t userId)
126 {
127 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
128 auto abms = GetExtensionManager();
129 if (abms == nullptr) {
130 HILOG_ERROR("Connect failed, bundleName:%{public}s, abilityName:%{public}s",
131 want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str());
132 return ABILITY_SERVICE_NOT_CONNECTED;
133 }
134
135 HILOG_INFO("bundleName: %{public}s, abilityName: %{public}s, userId: %{public}d.",
136 want.GetElement().GetBundleName().c_str(), want.GetElement().GetAbilityName().c_str(), userId);
137 return abms->ConnectAbilityCommon(want, connect, nullptr, AppExecFwk::ExtensionAbilityType::UNSPECIFIED, userId);
138 }
139
DisconnectAbility(const sptr<IRemoteObject> & connect)140 ErrCode ExtensionManagerClient::DisconnectAbility(const sptr<IRemoteObject> &connect)
141 {
142 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
143 auto abms = GetExtensionManager();
144 CHECK_POINTER_RETURN_NOT_CONNECTED(abms);
145 HILOG_INFO("call");
146 return abms->DisconnectAbility(connect);
147 }
148
149 } // namespace AAFwk
150 } // namespace OHOS
151