• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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, "observer is nullptr");
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, "observer is nullptr.");
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 not exist or has been 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, "self is nullptr");
83             return;
84         }
85         self->HandleOnInstallFinished(recordId, bundleName, abilityName, startTime, resultCode);
86     };
87 
88     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler();
89     CHECK_POINTER_LOG(handler, "Fail to get Ability task handler.");
90     handler->SubmitTask(task);
91 }
92 
OnInstallFinishedByUrl(int32_t recordId,const std::string & startTime,const std::string & url,const int & resultCode)93 void FreeInstallObserverManager::OnInstallFinishedByUrl(int32_t recordId, const std::string &startTime,
94     const std::string &url, const int &resultCode)
95 {
96     auto task = [weak = weak_from_this(), recordId, startTime, url, resultCode]() {
97         auto self = weak.lock();
98         if (self == nullptr) {
99             TAG_LOGE(AAFwkTag::FREE_INSTALL, "self is nullptr");
100             return;
101         }
102         self->HandleOnInstallFinishedByUrl(recordId, startTime, url, resultCode);
103     };
104 
105     auto handler = DelayedSingleton<AbilityManagerService>::GetInstance()->GetTaskHandler();
106     CHECK_POINTER_LOG(handler, "Fail to get Ability task handler.");
107     handler->SubmitTask(task);
108 }
109 
HandleOnInstallFinished(int32_t recordId,const std::string & bundleName,const std::string & abilityName,const std::string & startTime,const int & resultCode)110 void FreeInstallObserverManager::HandleOnInstallFinished(int32_t recordId, const std::string &bundleName,
111     const std::string &abilityName, const std::string &startTime, const int &resultCode)
112 {
113     TAG_LOGD(AAFwkTag::FREE_INSTALL, "begin");
114     auto iter = observerMap_.find(recordId);
115     if (iter != observerMap_.end() && iter->second != nullptr) {
116         (iter->second)->OnInstallFinished(bundleName, abilityName, startTime, resultCode);
117     }
118 }
119 
HandleOnInstallFinishedByUrl(int32_t recordId,const std::string & startTime,const std::string & url,const int & resultCode)120 void FreeInstallObserverManager::HandleOnInstallFinishedByUrl(int32_t recordId, const std::string &startTime,
121     const std::string &url, const int &resultCode)
122 {
123     TAG_LOGD(AAFwkTag::FREE_INSTALL, "begin");
124     auto iter = observerMap_.find(recordId);
125     if (iter != observerMap_.end() && iter->second != nullptr) {
126         (iter->second)->OnInstallFinishedByUrl(startTime, url, resultCode);
127     }
128 }
129 
OnObserverDied(const wptr<IRemoteObject> & remote)130 void FreeInstallObserverManager::OnObserverDied(const wptr<IRemoteObject> &remote)
131 {
132     auto remoteObj = remote.promote();
133     if (remoteObj == nullptr) {
134         TAG_LOGE(AAFwkTag::FREE_INSTALL, "observer is nullptr");
135         return;
136     }
137     remoteObj->RemoveDeathRecipient(deathRecipient_);
138 
139     std::lock_guard<ffrt::mutex> lock(observerLock_);
140     for (auto &item : observerMap_) {
141         if (item.second && item.second->AsObject() == remoteObj) {
142             observerMap_.erase(item.first);
143             return;
144         }
145     }
146 }
147 
FreeInstallObserverRecipient(RemoteDiedHandler handler)148 FreeInstallObserverRecipient::FreeInstallObserverRecipient(RemoteDiedHandler handler) : handler_(handler)
149 {}
150 
~FreeInstallObserverRecipient()151 FreeInstallObserverRecipient::~FreeInstallObserverRecipient()
152 {}
153 
OnRemoteDied(const wptr<IRemoteObject> & remote)154 void FreeInstallObserverRecipient::OnRemoteDied(const wptr<IRemoteObject> &__attribute__((unused)) remote)
155 {
156     if (handler_) {
157         handler_(remote);
158     }
159 }
160 } // namespace AAFwk
161 } // namespace OHOS