1 /*
2 * Copyright (c) 2023-2024 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 #include "free_install_observer_manager.h"
16
17 #include "ability_manager_service.h"
18 #include "ability_util.h"
19
20 namespace OHOS {
21 namespace AAFwk {
FreeInstallObserverManager()22 FreeInstallObserverManager::FreeInstallObserverManager()
23 {}
24
~FreeInstallObserverManager()25 FreeInstallObserverManager::~FreeInstallObserverManager()
26 {}
27
AddObserver(int32_t recordId, const sptr<IFreeInstallObserver> &observer)28 int32_t FreeInstallObserverManager::AddObserver(int32_t recordId, const sptr<IFreeInstallObserver> &observer)
29 {
30 TAG_LOGD(AAFwkTag::FREE_INSTALL, "begin");
31 if (observer == nullptr) {
32 TAG_LOGE(AAFwkTag::FREE_INSTALL, "null observer");
33 return ERR_INVALID_VALUE;
34 }
35 std::lock_guard<ffrt::mutex> lock(observerLock_);
36 observerMap_[recordId] = observer;
37
38 if (!deathRecipient_) {
39 std::weak_ptr<FreeInstallObserverManager> thisWeakPtr(shared_from_this());
40 // add death recipient
41 deathRecipient_ =
42 new FreeInstallObserverRecipient([thisWeakPtr](const wptr<IRemoteObject> &remote) {
43 auto freeInstallObserverManager = thisWeakPtr.lock();
44 if (freeInstallObserverManager) {
45 freeInstallObserverManager->OnObserverDied(remote);
46 }
47 });
48 }
49
50 auto observerObj = observer->AsObject();
51 if (!observerObj || !observerObj->AddDeathRecipient(deathRecipient_)) {
52 TAG_LOGE(AAFwkTag::FREE_INSTALL, "AddDeathRecipient failed");
53 }
54
55 return ERR_OK;
56 }
57
RemoveObserver(const sptr<IFreeInstallObserver> &observer)58 int32_t FreeInstallObserverManager::RemoveObserver(const sptr<IFreeInstallObserver> &observer)
59 {
60 TAG_LOGD(AAFwkTag::FREE_INSTALL, "begin");
61 if (observer == nullptr) {
62 TAG_LOGE(AAFwkTag::FREE_INSTALL, "null observer");
63 return ERR_INVALID_VALUE;
64 }
65 std::lock_guard<ffrt::mutex> lock(observerLock_);
66 for (auto &item : observerMap_) {
67 if (item.second && item.second->AsObject() == observer->AsObject()) {
68 observerMap_.erase(item.first);
69 return ERR_OK;
70 }
71 }
72 TAG_LOGE(AAFwkTag::FREE_INSTALL, "observer null or removed");
73 return ERR_INVALID_VALUE;
74 }
75
OnInstallFinished(int32_t recordId, const std::string &bundleName, const std::string &abilityName, const std::string &startTime, const int &resultCode)76 void FreeInstallObserverManager::OnInstallFinished(int32_t recordId, const std::string &bundleName,
77 const std::string &abilityName, const std::string &startTime, const int &resultCode)
78 {
79 auto task = [weak = weak_from_this(), recordId, bundleName, abilityName, startTime, resultCode]() {
80 auto self = weak.lock();
81 if (self == nullptr) {
82 TAG_LOGE(AAFwkTag::FREE_INSTALL, "null self");
83 return;
84 }
85 TAG_LOGI(AAFwkTag::FREE_INSTALL, "OnInstallFinished come");
86 self->HandleOnInstallFinished(recordId, bundleName, abilityName, startTime, resultCode);
87 };
88
89 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler();
90 CHECK_POINTER_LOG(handler, "Fail to get Ability task handler.");
91 handler->SubmitTask(task);
92 }
93
OnInstallFinishedByUrl(int32_t recordId, const std::string &startTime, const std::string &url, const int &resultCode)94 void FreeInstallObserverManager::OnInstallFinishedByUrl(int32_t recordId, const std::string &startTime,
95 const std::string &url, const int &resultCode)
96 {
97 auto task = [weak = weak_from_this(), recordId, startTime, url, resultCode]() {
98 auto self = weak.lock();
99 if (self == nullptr) {
100 TAG_LOGE(AAFwkTag::FREE_INSTALL, "null self");
101 return;
102 }
103 TAG_LOGI(AAFwkTag::FREE_INSTALL, "OnInstallFinishedByUrl come");
104 self->HandleOnInstallFinishedByUrl(recordId, startTime, url, resultCode);
105 };
106
107 auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler();
108 CHECK_POINTER_LOG(handler, "ability task handler get failed");
109 handler->SubmitTask(task);
110 }
111
HandleOnInstallFinished(int32_t recordId, const std::string &bundleName, const std::string &abilityName, const std::string &startTime, const int &resultCode)112 void FreeInstallObserverManager::HandleOnInstallFinished(int32_t recordId, const std::string &bundleName,
113 const std::string &abilityName, const std::string &startTime, const int &resultCode)
114 {
115 TAG_LOGD(AAFwkTag::FREE_INSTALL, "begin");
116 auto iter = observerMap_.find(recordId);
117 if (iter != observerMap_.end() && iter->second != nullptr) {
118 (iter->second)->OnInstallFinished(bundleName, abilityName, startTime, resultCode);
119 }
120 }
121
HandleOnInstallFinishedByUrl(int32_t recordId, const std::string &startTime, const std::string &url, const int &resultCode)122 void FreeInstallObserverManager::HandleOnInstallFinishedByUrl(int32_t recordId, const std::string &startTime,
123 const std::string &url, const int &resultCode)
124 {
125 TAG_LOGD(AAFwkTag::FREE_INSTALL, "begin");
126 auto iter = observerMap_.find(recordId);
127 if (iter != observerMap_.end() && iter->second != nullptr) {
128 (iter->second)->OnInstallFinishedByUrl(startTime, url, resultCode);
129 }
130 }
131
OnObserverDied(const wptr<IRemoteObject> &remote)132 void FreeInstallObserverManager::OnObserverDied(const wptr<IRemoteObject> &remote)
133 {
134 TAG_LOGI(AAFwkTag::FREE_INSTALL, "called");
135 auto remoteObj = remote.promote();
136 if (remoteObj == nullptr) {
137 TAG_LOGE(AAFwkTag::FREE_INSTALL, "null observer");
138 return;
139 }
140 remoteObj->RemoveDeathRecipient(deathRecipient_);
141
142 std::lock_guard<ffrt::mutex> lock(observerLock_);
143 for (auto &item : observerMap_) {
144 if (item.second && item.second->AsObject() == remoteObj) {
145 observerMap_.erase(item.first);
146 return;
147 }
148 }
149 }
150
FreeInstallObserverRecipient(RemoteDiedHandler handler)151 FreeInstallObserverRecipient::FreeInstallObserverRecipient(RemoteDiedHandler handler) : handler_(handler)
152 {}
153
~FreeInstallObserverRecipient()154 FreeInstallObserverRecipient::~FreeInstallObserverRecipient()
155 {}
156
OnRemoteDied(const wptr<IRemoteObject> &__attribute__((unused)) remote)157 void FreeInstallObserverRecipient::OnRemoteDied(const wptr<IRemoteObject> &__attribute__((unused)) remote)
158 {
159 TAG_LOGI(AAFwkTag::FREE_INSTALL, "called");
160 if (handler_) {
161 handler_(remote);
162 }
163 }
164 } // namespace AAFwk
165 } // namespace OHOS