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 "module_update_kits_impl.h"
17
18 #include "if_system_ability_manager.h"
19 #include "iservice_registry.h"
20 #include "log/log.h"
21 #include "module_error_code.h"
22 #include "module_update_load_callback.h"
23 #include "module_update_proxy.h"
24 #include "service_control.h"
25 #include "system_ability_definition.h"
26 #include "sys_installer_callback.h"
27
28 namespace OHOS {
29 namespace SysInstaller {
30 using namespace Updater;
31
32 namespace {
33 constexpr int LOAD_SA_TIMEOUT_MS = 3;
34 static volatile std::atomic_long g_request(0);
35 }
36
GetInstance()37 ModuleUpdateKits &ModuleUpdateKits::GetInstance()
38 {
39 return DelayedRefSingleton<ModuleUpdateKitsImpl>::GetInstance();
40 }
41
ModuleUpdateKitsImpl()42 ModuleUpdateKitsImpl::ModuleUpdateKitsImpl() {}
43
~ModuleUpdateKitsImpl()44 ModuleUpdateKitsImpl::~ModuleUpdateKitsImpl() {}
45
ResetService(const wptr<IRemoteObject> & remote)46 void ModuleUpdateKitsImpl::ResetService(const wptr<IRemoteObject> &remote)
47 {
48 LOG(INFO) << "Remote is dead, reset service instance";
49
50 std::lock_guard<std::mutex> lock(moduleUpdateLock_);
51 if (moduleUpdate_ != nullptr) {
52 sptr<IRemoteObject> object = moduleUpdate_->AsObject();
53 if ((object != nullptr) && (remote == object)) {
54 object->RemoveDeathRecipient(deathRecipient_);
55 moduleUpdate_ = nullptr;
56 }
57 }
58 }
59
GetService()60 sptr<IModuleUpdate> ModuleUpdateKitsImpl::GetService()
61 {
62 std::lock_guard<std::mutex> lock(moduleUpdateLock_);
63 if (moduleUpdate_ != nullptr) {
64 return moduleUpdate_;
65 }
66
67 sptr<ISystemAbilityManager> samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
68 if (samgr == nullptr) {
69 LOG(ERROR) << "Get samgr object failed";
70 return nullptr;
71 }
72 sptr<IRemoteObject> object = samgr->GetSystemAbility(MODULE_UPDATE_SERVICE_ID);
73 if (object == nullptr) {
74 LOG(ERROR) << "Get module update object from samgr failed";
75 return nullptr;
76 }
77
78 if (deathRecipient_ == nullptr) {
79 deathRecipient_ = new DeathRecipient();
80 }
81
82 if ((object->IsProxyObject()) && (!object->AddDeathRecipient(deathRecipient_))) {
83 LOG(ERROR) << "Failed to add death recipient";
84 }
85
86 LOG(INFO) << "get remote object ok";
87 moduleUpdate_ = iface_cast<IModuleUpdate>(object);
88 if (moduleUpdate_ == nullptr) {
89 LOG(ERROR) << "module update object iface_cast failed";
90 return nullptr;
91 }
92 return moduleUpdate_;
93 }
94
OnRemoteDied(const wptr<IRemoteObject> & remote)95 void ModuleUpdateKitsImpl::DeathRecipient::OnRemoteDied(const wptr<IRemoteObject> &remote)
96 {
97 DelayedRefSingleton<ModuleUpdateKitsImpl>::GetInstance().ResetService(remote);
98 }
99
InstallModulePackage(const std::string & pkgPath)100 int32_t ModuleUpdateKitsImpl::InstallModulePackage(const std::string &pkgPath)
101 {
102 LOG(INFO) << "InstallModulePackage " << pkgPath;
103 auto moduleUpdate = GetService();
104 if (moduleUpdate == nullptr) {
105 LOG(ERROR) << "Get moduleUpdate failed";
106 return ModuleErrorCode::ERR_SERVICE_NOT_FOUND;
107 }
108 return moduleUpdate->InstallModulePackage(pkgPath);
109 }
110
UninstallModulePackage(const std::string & hmpName)111 int32_t ModuleUpdateKitsImpl::UninstallModulePackage(const std::string &hmpName)
112 {
113 LOG(INFO) << "UninstallModulePackage " << hmpName;
114 auto moduleUpdate = GetService();
115 if (moduleUpdate == nullptr) {
116 LOG(ERROR) << "Get moduleUpdate failed";
117 return ModuleErrorCode::ERR_SERVICE_NOT_FOUND;
118 }
119 return moduleUpdate->UninstallModulePackage(hmpName);
120 }
121
GetModulePackageInfo(const std::string & hmpName,std::list<ModulePackageInfo> & modulePackageInfos)122 int32_t ModuleUpdateKitsImpl::GetModulePackageInfo(const std::string &hmpName,
123 std::list<ModulePackageInfo> &modulePackageInfos)
124 {
125 LOG(INFO) << "GetModulePackageInfo";
126 auto moduleUpdate = GetService();
127 if (moduleUpdate == nullptr) {
128 LOG(ERROR) << "Get moduleUpdate failed";
129 return ModuleErrorCode::ERR_SERVICE_NOT_FOUND;
130 }
131 return moduleUpdate->GetModulePackageInfo(hmpName, modulePackageInfos);
132 }
133
ExitModuleUpdate()134 int32_t ModuleUpdateKitsImpl::ExitModuleUpdate()
135 {
136 LOG(INFO) << "ExitModuleUpdate, g_request = " << g_request;
137 auto moduleUpdate = GetService();
138 if (moduleUpdate == nullptr) {
139 LOG(ERROR) << "Get moduleUpdate failed";
140 return ModuleErrorCode::ERR_SERVICE_NOT_FOUND;
141 }
142 if (--g_request <= 0) {
143 return moduleUpdate->ExitModuleUpdate();
144 }
145 return 0;
146 }
147
Init()148 int32_t ModuleUpdateKitsImpl::Init()
149 {
150 std::lock_guard<std::mutex> lock(moduleUpdateLock_);
151 if (moduleUpdate_ != nullptr) {
152 LOG(INFO) << "already init";
153 return 0;
154 }
155
156 LOG(INFO) << "InitModuleUpdate Init start";
157 sptr<ModuleUpdateLoadCallback> loadCallback_ = new ModuleUpdateLoadCallback();
158 sptr<ISystemAbilityManager> sm = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
159 if (sm == nullptr) {
160 LOG(ERROR) << "GetSystemAbilityManager samgr object null";
161 return -1;
162 }
163 LOG(INFO) << "InitModuleUpdate Init GetSystemAbilityManager done";
164 int32_t result = sm->LoadSystemAbility(MODULE_UPDATE_SERVICE_ID, loadCallback_);
165 if (result != ERR_OK) {
166 LOG(ERROR) << "systemAbilityId " << MODULE_UPDATE_SERVICE_ID <<
167 " load failed, result code:" << result;
168 return -1;
169 }
170
171 LOG(INFO) << "InitModuleUpdate Init Load done";
172 std::unique_lock<std::mutex> callbackLock(serviceMutex_);
173 serviceCv_.wait_for(callbackLock, std::chrono::seconds(LOAD_SA_TIMEOUT_MS));
174 return 0;
175 }
176
InitModuleUpdate()177 int32_t ModuleUpdateKitsImpl::InitModuleUpdate()
178 {
179 InitUpdaterLogger("ModuleUpdaterClient", "", "", "");
180 LOG(INFO) << "InitModuleUpdate";
181 int ret = Init();
182 if (ret != 0) {
183 LOG(ERROR) << "Init failed";
184 return ret;
185 }
186
187 auto updateService = GetService();
188 if (updateService == nullptr) {
189 LOG(ERROR) << "Get updateService failed";
190 return -1;
191 }
192 g_request++;
193 return ModuleErrorCode::MODULE_UPDATE_SUCCESS;
194 }
195
GetHmpVersionInfo()196 std::vector<HmpVersionInfo> ModuleUpdateKitsImpl::GetHmpVersionInfo()
197 {
198 LOG(INFO) << "GetHmpVersionInfo";
199 std::vector<HmpVersionInfo> versionInfo {};
200 auto moduleUpdate = GetService();
201 if (moduleUpdate == nullptr) {
202 LOG(ERROR) << "Get moduleUpdate failed";
203 return versionInfo;
204 }
205 versionInfo = moduleUpdate->GetHmpVersionInfo();
206 return versionInfo;
207 }
208
StartUpdateHmpPackage(const std::string & path,sptr<ISysInstallerCallbackFunc> callback)209 int32_t ModuleUpdateKitsImpl::StartUpdateHmpPackage(const std::string &path,
210 sptr<ISysInstallerCallbackFunc> callback)
211 {
212 LOG(INFO) << "StartUpdateHmpPackage";
213 if (callback == nullptr) {
214 LOG(ERROR) << "callback null";
215 return ModuleErrorCode::ERR_SERVICE_PARA_ERROR;
216 }
217
218 auto moduleUpdate = GetService();
219 if (moduleUpdate == nullptr) {
220 LOG(ERROR) << "Get moduleUpdate failed";
221 return ModuleErrorCode::ERR_SERVICE_NOT_FOUND;
222 }
223
224 if (updateCallBack_ == nullptr) {
225 updateCallBack_ = new SysInstallerCallback;
226 }
227 static_cast<SysInstallerCallback *>(updateCallBack_.GetRefPtr())->RegisterCallback(callback);
228
229 return moduleUpdate->StartUpdateHmpPackage(path, updateCallBack_);
230 }
231
GetHmpUpdateResult()232 std::vector<HmpUpdateInfo> ModuleUpdateKitsImpl::GetHmpUpdateResult()
233 {
234 LOG(INFO) << "GetHmpUpdateResult";
235 std::vector<HmpUpdateInfo> updateInfo {};
236 auto moduleUpdate = GetService();
237 if (moduleUpdate == nullptr) {
238 LOG(ERROR) << "Get moduleUpdate failed";
239 return updateInfo;
240 }
241 updateInfo = moduleUpdate->GetHmpUpdateResult();
242 return updateInfo;
243 }
244
LoadServiceSuccess()245 void ModuleUpdateKitsImpl::LoadServiceSuccess()
246 {
247 serviceCv_.notify_all();
248 }
249
LoadServiceFail()250 void ModuleUpdateKitsImpl::LoadServiceFail()
251 {
252 serviceCv_.notify_all();
253 }
254 }
255 } // namespace OHOS
256