1 /*
2 * Copyright (c) 2022-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
16 #include "component_monitor.h"
17
18 #include <cinttypes>
19
20 #include "iservice_registry.h"
21 #include "service_control.h"
22 #include "system_ability_definition.h"
23
24 #include "anonymous_string.h"
25 #include "component_loader.h"
26 #include "component_manager.h"
27 #include "device_type.h"
28 #include "distributed_hardware_errno.h"
29 #include "distributed_hardware_log.h"
30
31 namespace OHOS {
32 namespace DistributedHardware {
33
34 const int32_t WAIT_SERVICE_STATUS_TIMEOUT = 1;
35
ComponentMonitor()36 ComponentMonitor::ComponentMonitor() : saListeners_({})
37 {
38 DHLOGI("Ctor ComponentMonitor");
39 }
40
~ComponentMonitor()41 ComponentMonitor::~ComponentMonitor()
42 {
43 DHLOGI("Dtor ComponentMonitor");
44 std::lock_guard<std::mutex> lock(saListenersMtx_);
45 saListeners_.clear();
46 }
47
OnAddSystemAbility(int32_t saId,const std::string & deviceId)48 void ComponentMonitor::CompSystemAbilityListener::OnAddSystemAbility(int32_t saId, const std::string &deviceId)
49 {
50 DHLOGI("OnAddSystemAbility, saId: %{public}d, deviceId: %{public}s", saId, GetAnonyString(deviceId).c_str());
51 }
52
OnRemoveSystemAbility(int32_t saId,const std::string & deviceId)53 void ComponentMonitor::CompSystemAbilityListener::OnRemoveSystemAbility(int32_t saId, const std::string &deviceId)
54 {
55 DHLOGI("OnRemoveSystemAbility, saId: %{public}d, deviceId: %{public}s", saId, GetAnonyString(deviceId).c_str());
56 DHType dhType = ComponentLoader::GetInstance().GetDHTypeBySrcSaId(saId);
57 if (dhType == DHType::UNKNOWN) {
58 DHLOGE("Can not find DHType by sa Id: %{public}d", saId);
59 return;
60 }
61
62 auto processNameIter = saIdProcessNameMap_.find(saId);
63 if (processNameIter == saIdProcessNameMap_.end()) {
64 DHLOGE("SaId not been find, SaId : %{public}d", saId);
65 return;
66 }
67 ServiceWaitForStatus(((*processNameIter).second).c_str(),
68 ServiceStatus::SERVICE_STOPPED, WAIT_SERVICE_STATUS_TIMEOUT);
69
70 DHLOGI("Try Recover Component, dhType: %{public}" PRIu32, (uint32_t)dhType);
71 ComponentManager::GetInstance().Recover(dhType);
72 }
73
AddSAMonitor(int32_t saId)74 void ComponentMonitor::AddSAMonitor(int32_t saId)
75 {
76 DHLOGI("Try add sa monitor, saId: %{public}" PRIu32, saId);
77 std::lock_guard<std::mutex> lock(saListenersMtx_);
78 if (saListeners_.find(saId) != saListeners_.end()) {
79 DHLOGW("SaId is in monitor, id: %{public}" PRIu32, saId);
80 return;
81 }
82
83 sptr<CompSystemAbilityListener> listener(new CompSystemAbilityListener());
84 sptr<ISystemAbilityManager> systemAbilityManager =
85 SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
86 if (!systemAbilityManager) {
87 DHLOGE("get system ability manager failed.");
88 return;
89 }
90
91 int32_t ret = systemAbilityManager->SubscribeSystemAbility(saId, listener);
92 if (ret != DH_FWK_SUCCESS) {
93 DHLOGE("subscribe sa change listener failed: %{public}d", ret);
94 return;
95 }
96
97 saListeners_[saId] = listener;
98 DHLOGI("subscribe sa change listener success.");
99 return;
100 }
101
RemoveSAMonitor(int32_t saId)102 void ComponentMonitor::RemoveSAMonitor(int32_t saId)
103 {
104 DHLOGI("Try remove sa monitor, saId: %{public}" PRIu32, saId);
105 std::lock_guard<std::mutex> lock(saListenersMtx_);
106 if (saListeners_.find(saId) == saListeners_.end()) {
107 DHLOGW("can not find sa listener info, id: %{public}" PRIu32, saId);
108 return;
109 }
110
111 sptr<ISystemAbilityManager> systemAbilityManager =
112 SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
113 if (!systemAbilityManager) {
114 DHLOGE("get system ability manager failed.");
115 return;
116 }
117
118 int32_t ret = systemAbilityManager->UnSubscribeSystemAbility(saId, saListeners_[saId]);
119 if (ret != DH_FWK_SUCCESS) {
120 DHLOGE("unsubscribe sa change listener failed: %{public}d", ret);
121 return;
122 }
123
124 saListeners_.erase(saId);
125 DHLOGI("unsubscribe sa change listener success");
126 return;
127 }
128 } // namespace DistributedHardware
129 } // namespace OHOS