• 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 
16 #include "event_manager.h"
17 
18 #include "cooperate_hisysevent.h"
19 #include "devicestatus_define.h"
20 #include "utility.h"
21 
22 #undef LOG_TAG
23 #define LOG_TAG "EventManager"
24 
25 namespace OHOS {
26 namespace Msdp {
27 namespace DeviceStatus {
28 namespace Cooperate {
29 
EventManager(IContext * env)30 EventManager::EventManager(IContext *env) : env_(env) { }
31 
RegisterListener(const RegisterListenerEvent & event)32 void EventManager::RegisterListener(const RegisterListenerEvent &event)
33 {
34     CALL_INFO_TRACE;
35     std::shared_ptr<EventInfo> eventInfo = std::make_shared<EventInfo>();
36     eventInfo->type = EventType::LISTENER;
37     eventInfo->msgId = MessageId::COORDINATION_ADD_LISTENER;
38     eventInfo->pid = event.pid;
39 
40     FI_HILOGI("Add cooperate listener (%{public}d)", eventInfo->pid);
41     auto iter = std::find_if(listeners_.begin(), listeners_.end(), [eventInfo](const auto &item) {
42         return ((item != nullptr) && (item->pid == eventInfo->pid));
43     });
44     if (iter != listeners_.end()) {
45         *iter = eventInfo;
46     } else {
47         listeners_.emplace_back(eventInfo);
48     }
49 }
50 
UnregisterListener(const UnregisterListenerEvent & event)51 void EventManager::UnregisterListener(const UnregisterListenerEvent &event)
52 {
53     FI_HILOGI("Remove cooperate listener (%{public}d)", event.pid);
54     listeners_.erase(std::remove_if(listeners_.begin(), listeners_.end(),
55         [pid = event.pid](const auto &item) {
56             return ((item == nullptr) || (item->pid == pid));
57         }), listeners_.end());
58 }
59 
EnableCooperate(const EnableCooperateEvent & event)60 void EventManager::EnableCooperate(const EnableCooperateEvent &event)
61 {
62     CALL_INFO_TRACE;
63     CooperateNotice notice { .pid = event.pid,
64         .msgId = MessageId::COORDINATION_MESSAGE,
65         .userData = event.userData,
66         .msg = CoordinationMessage::PREPARE };
67     NotifyCooperateMessage(notice);
68 }
69 
DisableCooperate(const DisableCooperateEvent & event)70 void EventManager::DisableCooperate(const DisableCooperateEvent &event)
71 {
72     CALL_INFO_TRACE;
73     CooperateNotice notice { .pid = event.pid,
74         .msgId = MessageId::COORDINATION_MESSAGE,
75         .userData = event.userData,
76         .msg = CoordinationMessage::UNPREPARE };
77     NotifyCooperateMessage(notice);
78 }
79 
StartCooperate(const StartCooperateEvent & event)80 void EventManager::StartCooperate(const StartCooperateEvent &event)
81 {
82     std::shared_ptr<EventInfo> eventInfo = std::make_shared<EventInfo>();
83     eventInfo->type = EventType::START;
84     eventInfo->msgId = MessageId::COORDINATION_MESSAGE;
85     eventInfo->pid = event.pid;
86     eventInfo->networkId = event.remoteNetworkId;
87     eventInfo->userData = event.userData;
88     calls_[EventType::START] = eventInfo;
89 }
90 
StartCooperateFinish(const DSoftbusStartCooperateFinished & event)91 void EventManager::StartCooperateFinish(const DSoftbusStartCooperateFinished &event) { .msgId = eventInfo -> msgId,
92     .userData = eventInfo->userData,
93     .networkId = eventInfo->networkId,
94     .msg = (event.success ? CoordinationMessage::ACTIVATE_SUCCESS : CoordinationMessage::ACTIVATE_FAIL),
95     .errCode = event.errCode };
96 calls_[EventType::START] = nullptr;
97 NotifyCooperateMessage(notice);
98 }
99 
RemoteStart(const DSoftbusStartCooperate & event)100 void EventManager::RemoteStart(const DSoftbusStartCooperate &event)
101 {
102     CALL_INFO_TRACE;
103     OnCooperateMessage(CoordinationMessage::ACTIVATE, event.networkId);
104 }
105 
RemoteStartFinish(const DSoftbusStartCooperateFinished & event)106 void EventManager::RemoteStartFinish(const DSoftbusStartCooperateFinished &event)
107 {
108     CALL_INFO_TRACE;
109     CoordinationMessage msg { event.success ? CoordinationMessage::ACTIVATE_SUCCESS :
110                                               CoordinationMessage::ACTIVATE_FAIL };
111     OnCooperateMessage(msg, event.networkId);
112     if (msg == CoordinationMessage::ACTIVATE_SUCCESS) {
113         CooperateDFX::WriteRemoteStart(OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR);
114     } else {
115         CooperateDFX::WriteRemoteStart(OHOS::HiviewDFX::HiSysEvent::EventType::FAULT);
116     }
117 }
118 
OnUnchain(const StopCooperateEvent & event)119 void EventManager::OnUnchain(const StopCooperateEvent &event)
120 {
121     CALL_INFO_TRACE;
122     OnCooperateMessage(CoordinationMessage::SESSION_CLOSED, std::string());
123 }
124 
StopCooperate(const StopCooperateEvent & event)125 void EventManager::StopCooperate(const StopCooperateEvent &event)
126 {
127     std::shared_ptr<EventInfo> eventInfo = std::make_shared<EventInfo>();
128     eventInfo->type = EventType::STOP;
129     eventInfo->msgId = MessageId::COORDINATION_MESSAGE;
130     eventInfo->pid = event.pid;
131     eventInfo->userData = event.userData;
132     calls_[EventType::STOP] = eventInfo;
133 }
134 
StopCooperateFinish(const DSoftbusStopCooperateFinished & event)135 void EventManager::StopCooperateFinish(const DSoftbusStopCooperateFinished &event) { .msgId = eventInfo -> msgId,
136     .userData = eventInfo->userData,
137     .networkId = eventInfo->networkId,
138     .msg = (event.normal ? CoordinationMessage::DEACTIVATE_SUCCESS : CoordinationMessage::DEACTIVATE_FAIL),
139     .errCode = event.errCode };
140 NotifyCooperateMessage(notice);
141 calls_[EventType::STOP] = nullptr;
142 }
143 
RemoteStop(const DSoftbusStopCooperate & event)144 void EventManager::RemoteStop(const DSoftbusStopCooperate &event)
145 {
146     CALL_DEBUG_ENTER;
147 }
148 
RemoteStopFinish(const DSoftbusStopCooperateFinished & event)149 void EventManager::RemoteStopFinish(const DSoftbusStopCooperateFinished &event)
150 {
151     CALL_DEBUG_ENTER;
152 }
153 
OnProfileChanged(const DDPCooperateSwitchChanged & event)154 void EventManager::OnProfileChanged(const DDPCooperateSwitchChanged &event)
155 {
156     CALL_INFO_TRACE;
157     FI_HILOGI("Switch status of \'%{public}s\' has changed to %{public}d", Utility::Anonymize(event.networkId).c_str(),
158         event.normal);
159     CoordinationMessage msg = (event.normal ? CoordinationMessage::PREPARE : CoordinationMessage::UNPREPARE);
160     OnCooperateMessage(msg, event.networkId);
161 }
162 
OnSoftbusSessionClosed(const DSoftbusSessionClosed & event)163 void EventManager::OnSoftbusSessionClosed(const DSoftbusSessionClosed &event)
164 {
165     FI_HILOGI("Connection with \'%{public}s\' is closed", Utility::Anonymize(event.networkId).c_str());
166     OnCooperateMessage(CoordinationMessage::SESSION_CLOSED, event.networkId);
167 }
168 
GetCooperateState(const CooperateStateNotice & notice)169 void EventManager::GetCooperateState(const CooperateStateNotice &notice)
170 {
171     CALL_INFO_TRACE;
172     NotifyCooperateState(notice);
173 }
174 
OnCooperateMessage(CoordinationMessage msg,const std::string & networkId)175 void EventManager::OnCooperateMessage(CoordinationMessage msg, const std::string &networkId)
176 {
177     CALL_INFO_TRACE;
178     for (auto iter = listeners_.begin(); iter != listeners_.end(); ++iter) {
179         std::shared_ptr<EventInfo> listener = *iter;
180         CHKPC(listener);
181         FI_HILOGD("Notify cooperate listener (%{public}d, %{public}d)", listener->pid, listener->msgId);
182         CooperateNotice notice { .pid = listener->pid,
183             .msgId = listener->msgId,
184             .userData = listener->userData,
185             .networkId = networkId,
186             .msg = msg };
187         NotifyCooperateMessage(notice);
188     }
189 }
190 
OnClientDied(const ClientDiedEvent & event)191 void EventManager::OnClientDied(const ClientDiedEvent &event)
192 {
193     FI_HILOGI("Remove client died listener, pid:%{public}d", event.pid);
194     for (auto iter = listeners_.begin(); iter != listeners_.end();) {
195         std::shared_ptr<EventInfo> listener = *iter;
196         CHKPC(listener);
197         if (event.pid == listener->pid) {
198             iter = listeners_.erase(iter);
199             break;
200         } else {
201             ++iter;
202         }
203     }
204 }
205 
NotifyCooperateMessage(const CooperateNotice & notice)206 void EventManager::NotifyCooperateMessage(const CooperateNotice &notice)
207 {
208     auto session = env_->GetSocketSessionManager().FindSessionByPid(notice.pid);
209     CHKPV(session);
210     NetPacket pkt(notice.msgId);
211     pkt << notice.userData << notice.networkId << static_cast<int32_t>(notice.msg) << notice.errCode;
212     if (pkt.ChkRWError()) {
213         FI_HILOGE("Packet write data failed");
214         return;
215     }
216     if (!session->SendMsg(pkt)) {
217         FI_HILOGE("Sending failed");
218     }
219 }
220 
NotifyCooperateState(const CooperateStateNotice & notice)221 void EventManager::NotifyCooperateState(const CooperateStateNotice &notice)
222 {
223     CALL_INFO_TRACE;
224     CHKPV(env_);
225     auto session = env_->GetSocketSessionManager().FindSessionByPid(notice.pid);
226     CHKPV(session);
227     NetPacket pkt(notice.msgId);
228     pkt << notice.userData << notice.state << static_cast<int32_t>(notice.errCode);
229     if (pkt.ChkRWError()) {
230         FI_HILOGE("Packet write data failed");
231         return;
232     }
233     if (!session->SendMsg(pkt)) {
234         FI_HILOGE("Sending failed");
235         return;
236     }
237 }
238 } // namespace Cooperate
239 } // namespace DeviceStatus
240 } // namespace Msdp
241 } // namespace OHOS
242