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 #include "devicestatus_define.h"
18 #include "utility.h"
19
20 #undef LOG_TAG
21 #define LOG_TAG "EventManager"
22
23 namespace OHOS {
24 namespace Msdp {
25 namespace DeviceStatus {
26 namespace Cooperate {
27
EventManager(IContext * env)28 EventManager::EventManager(IContext *env)
29 : env_(env)
30 {}
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(),
42 [eventInfo](const auto &item) {
43 return ((item != nullptr) && (item->pid == eventInfo->pid));
44 });
45 if (iter != listeners_.end()) {
46 *iter = eventInfo;
47 } else {
48 listeners_.emplace_back(eventInfo);
49 }
50 }
51
UnregisterListener(const UnregisterListenerEvent & event)52 void EventManager::UnregisterListener(const UnregisterListenerEvent &event)
53 {
54 FI_HILOGI("Remove cooperate listener (%{public}d)", event.pid);
55 listeners_.erase(std::remove_if(listeners_.begin(), listeners_.end(),
56 [pid = event.pid](const auto &item) {
57 return ((item == nullptr) || (item->pid == pid));
58 }), listeners_.end());
59 }
60
EnableCooperate(const EnableCooperateEvent & event)61 void EventManager::EnableCooperate(const EnableCooperateEvent &event)
62 {
63 CALL_INFO_TRACE;
64 CooperateNotice notice {
65 .pid = event.pid,
66 .msgId = MessageId::COORDINATION_MESSAGE,
67 .userData = event.userData,
68 .msg = CoordinationMessage::PREPARE
69 };
70 NotifyCooperateMessage(notice);
71 }
72
DisableCooperate(const DisableCooperateEvent & event)73 void EventManager::DisableCooperate(const DisableCooperateEvent &event)
74 {
75 CALL_INFO_TRACE;
76 CooperateNotice notice {
77 .pid = event.pid,
78 .msgId = MessageId::COORDINATION_MESSAGE,
79 .userData = event.userData,
80 .msg = CoordinationMessage::UNPREPARE
81 };
82 NotifyCooperateMessage(notice);
83 }
84
StartCooperate(const StartCooperateEvent & event)85 void EventManager::StartCooperate(const StartCooperateEvent &event)
86 {
87 std::shared_ptr<EventInfo> eventInfo = std::make_shared<EventInfo>();
88 eventInfo->type = EventType::START;
89 eventInfo->msgId = MessageId::COORDINATION_MESSAGE;
90 eventInfo->pid = event.pid;
91 eventInfo->networkId = event.remoteNetworkId;
92 eventInfo->userData = event.userData;
93 calls_[EventType::START] = eventInfo;
94 }
95
StartCooperateFinish(const DSoftbusStartCooperateFinished & event)96 void EventManager::StartCooperateFinish(const DSoftbusStartCooperateFinished &event)
97 {
98 std::shared_ptr<EventInfo> eventInfo = calls_[EventType::START];
99 CHKPV(eventInfo);
100 CooperateNotice notice {
101 .pid = eventInfo->pid,
102 .msgId = eventInfo->msgId,
103 .userData = eventInfo->userData,
104 .networkId = eventInfo->networkId,
105 .msg = (event.success ? CoordinationMessage::ACTIVATE_SUCCESS : CoordinationMessage::ACTIVATE_FAIL),
106 .errCode = event.errCode
107 };
108 calls_[EventType::START] = nullptr;
109 NotifyCooperateMessage(notice);
110 }
111
StartCooperateWithOptions(const StartWithOptionsEvent & event)112 void EventManager::StartCooperateWithOptions(const StartWithOptionsEvent &event)
113 {
114 std::shared_ptr<EventInfo> eventInfo = std::make_shared<EventInfo>();
115 eventInfo->type = EventType::START;
116 eventInfo->msgId = MessageId::COORDINATION_MESSAGE;
117 eventInfo->pid = event.pid;
118 eventInfo->networkId = event.remoteNetworkId;
119 eventInfo->userData = event.userData;
120 calls_[EventType::START] = eventInfo;
121 }
122
StartCooperateWithOptionsFinish(const DSoftbusCooperateWithOptionsFinished & event)123 void EventManager::StartCooperateWithOptionsFinish(const DSoftbusCooperateWithOptionsFinished &event)
124 {
125 std::shared_ptr<EventInfo> eventInfo = calls_[EventType::START];
126 CHKPV(eventInfo);
127 CooperateNotice notice {
128 .pid = eventInfo->pid,
129 .msgId = eventInfo->msgId,
130 .userData = eventInfo->userData,
131 .networkId = eventInfo->networkId,
132 .msg = (event.success ? CoordinationMessage::ACTIVATE_SUCCESS : CoordinationMessage::ACTIVATE_FAIL),
133 .errCode = event.errCode
134 };
135 calls_[EventType::START] = nullptr;
136 NotifyCooperateMessage(notice);
137 }
138
RemoteStart(const DSoftbusStartCooperate & event)139 void EventManager::RemoteStart(const DSoftbusStartCooperate &event)
140 {
141 CALL_INFO_TRACE;
142 OnCooperateMessage(CoordinationMessage::ACTIVATE, event.networkId);
143 }
144
RemoteStartFinish(const DSoftbusStartCooperateFinished & event)145 void EventManager::RemoteStartFinish(const DSoftbusStartCooperateFinished &event)
146 {
147 CALL_INFO_TRACE;
148 CoordinationMessage msg { event.success ?
149 CoordinationMessage::ACTIVATE_SUCCESS :
150 CoordinationMessage::ACTIVATE_FAIL };
151 OnCooperateMessage(msg, event.networkId);
152 }
153
RemoteStartWithOptions(const DSoftbusCooperateOptions & event)154 void EventManager::RemoteStartWithOptions(const DSoftbusCooperateOptions &event)
155 {
156 CALL_INFO_TRACE;
157 OnCooperateMessage(CoordinationMessage::ACTIVATE, event.networkId);
158 }
159
RemoteStartWithOptionsFinish(const DSoftbusCooperateWithOptionsFinished & event)160 void EventManager::RemoteStartWithOptionsFinish(const DSoftbusCooperateWithOptionsFinished &event)
161 {
162 CALL_INFO_TRACE;
163 CoordinationMessage msg { event.success ?
164 CoordinationMessage::ACTIVATE_SUCCESS :
165 CoordinationMessage::ACTIVATE_FAIL };
166 OnCooperateMessage(msg, event.networkId);
167 }
168
OnUnchain(const StopCooperateEvent & event)169 void EventManager::OnUnchain(const StopCooperateEvent &event)
170 {
171 CALL_INFO_TRACE;
172 OnCooperateMessage(CoordinationMessage::SESSION_CLOSED, event.networkId);
173 }
174
StopCooperate(const StopCooperateEvent & event)175 void EventManager::StopCooperate(const StopCooperateEvent &event)
176 {
177 std::shared_ptr<EventInfo> eventInfo = std::make_shared<EventInfo>();
178 eventInfo->type = EventType::STOP;
179 eventInfo->msgId = MessageId::COORDINATION_MESSAGE;
180 eventInfo->pid = event.pid;
181 eventInfo->userData = event.userData;
182 calls_[EventType::STOP] = eventInfo;
183 }
184
StopCooperateFinish(const DSoftbusStopCooperateFinished & event)185 void EventManager::StopCooperateFinish(const DSoftbusStopCooperateFinished &event)
186 {
187 std::shared_ptr<EventInfo> eventInfo = calls_[EventType::STOP];
188 CHKPV(eventInfo);
189 CooperateNotice notice {
190 .pid = eventInfo->pid,
191 .msgId = eventInfo->msgId,
192 .userData = eventInfo->userData,
193 .networkId = eventInfo->networkId,
194 .msg = (event.normal ? CoordinationMessage::DEACTIVATE_SUCCESS : CoordinationMessage::DEACTIVATE_FAIL),
195 .errCode = event.errCode
196 };
197 NotifyCooperateMessage(notice);
198 calls_[EventType::STOP] = nullptr;
199 }
200
RemoteStop(const DSoftbusStopCooperate & event)201 void EventManager::RemoteStop(const DSoftbusStopCooperate &event)
202 {
203 CALL_DEBUG_ENTER;
204 }
205
RemoteStopFinish(const DSoftbusStopCooperateFinished & event)206 void EventManager::RemoteStopFinish(const DSoftbusStopCooperateFinished &event)
207 {
208 CALL_DEBUG_ENTER;
209 }
210
OnProfileChanged(const DDPCooperateSwitchChanged & event)211 void EventManager::OnProfileChanged(const DDPCooperateSwitchChanged &event)
212 {
213 CALL_INFO_TRACE;
214 FI_HILOGI("Switch status of \'%{public}s\' has changed to %{public}d",
215 Utility::Anonymize(event.networkId).c_str(), event.normal);
216 CoordinationMessage msg = (event.normal ? CoordinationMessage::PREPARE : CoordinationMessage::UNPREPARE);
217 OnCooperateMessage(msg, event.networkId);
218 }
219
OnSoftbusSessionClosed(const DSoftbusSessionClosed & event)220 void EventManager::OnSoftbusSessionClosed(const DSoftbusSessionClosed &event)
221 {
222 FI_HILOGI("Connection with \'%{public}s\' is closed", Utility::Anonymize(event.networkId).c_str());
223 OnCooperateMessage(CoordinationMessage::SESSION_CLOSED, event.networkId);
224 }
225
OnStatusChanged(const StatusChangeEvent & event)226 void EventManager::OnStatusChanged(const StatusChangeEvent &event)
227 {
228 CALL_INFO_TRACE;
229 FI_HILOGI("\'%{public}s\'state has changed", Utility::Anonymize(event.networkId).c_str());
230 OnCooperateMessage(event.msg, event.networkId);
231 }
232
GetCooperateState(const CooperateStateNotice & notice)233 void EventManager::GetCooperateState(const CooperateStateNotice ¬ice)
234 {
235 CALL_INFO_TRACE;
236 NotifyCooperateState(notice);
237 }
238
OnCooperateMessage(CoordinationMessage msg,const std::string & networkId)239 void EventManager::OnCooperateMessage(CoordinationMessage msg, const std::string &networkId)
240 {
241 CALL_INFO_TRACE;
242 for (auto iter = listeners_.begin(); iter != listeners_.end(); ++iter) {
243 std::shared_ptr<EventInfo> listener = *iter;
244 CHKPC(listener);
245 FI_HILOGD("Notify cooperate listener (%{public}d, %{public}d)", listener->pid, listener->msgId);
246 CooperateNotice notice {
247 .pid = listener->pid,
248 .msgId = listener->msgId,
249 .userData = listener->userData,
250 .networkId = networkId,
251 .msg = msg
252 };
253 NotifyCooperateMessage(notice);
254 }
255 }
256
OnClientDied(const ClientDiedEvent & event)257 void EventManager::OnClientDied(const ClientDiedEvent &event)
258 {
259 FI_HILOGI("Remove client died listener, pid: %{public}d", event.pid);
260 for (auto iter = listeners_.begin(); iter != listeners_.end();) {
261 std::shared_ptr<EventInfo> listener = *iter;
262 CHKPC(listener);
263 if (event.pid == listener->pid) {
264 iter = listeners_.erase(iter);
265 break;
266 } else {
267 ++iter;
268 }
269 }
270 }
271
ErrorNotAollowCooperateWhenMotionDragging(const NotAollowCooperateWhenMotionDragging & event)272 void EventManager::ErrorNotAollowCooperateWhenMotionDragging(const NotAollowCooperateWhenMotionDragging &event)
273 {
274 CooperateNotice notice {
275 .pid = event.pid,
276 .msgId = MessageId::COORDINATION_MESSAGE,
277 .userData = event.userData,
278 .networkId = event.networkId,
279 .msg = (event.success ? CoordinationMessage::ACTIVATE_SUCCESS : CoordinationMessage::ACTIVATE_FAIL),
280 .errCode = event.errCode
281 };
282 NotifyCooperateMessage(notice);
283 }
284
NotifyCooperateMessage(const CooperateNotice & notice)285 void EventManager::NotifyCooperateMessage(const CooperateNotice ¬ice)
286 {
287 CHKPV(env_);
288 auto session = env_->GetSocketSessionManager().FindSessionByPid(notice.pid);
289 if (session == nullptr) {
290 FI_HILOGD("session is null");
291 return;
292 }
293 CHKPV(session);
294 NetPacket pkt(notice.msgId);
295 pkt << notice.userData << notice.networkId << static_cast<int32_t>(notice.msg) << notice.errCode;
296 if (pkt.ChkRWError()) {
297 FI_HILOGE("Packet write data failed");
298 return;
299 }
300 if (!session->SendMsg(pkt)) {
301 FI_HILOGE("Sending failed");
302 }
303 }
304
NotifyCooperateState(const CooperateStateNotice & notice)305 void EventManager::NotifyCooperateState(const CooperateStateNotice ¬ice)
306 {
307 CALL_INFO_TRACE;
308 CHKPV(env_);
309 auto session = env_->GetSocketSessionManager().FindSessionByPid(notice.pid);
310 CHKPV(session);
311 NetPacket pkt(notice.msgId);
312 pkt << notice.userData << notice.state << static_cast<int32_t>(notice.errCode);
313 if (pkt.ChkRWError()) {
314 FI_HILOGE("Packet write data failed");
315 return;
316 }
317 if (!session->SendMsg(pkt)) {
318 FI_HILOGE("Sending failed");
319 return;
320 }
321 }
322 } // namespace Cooperate
323 } // namespace DeviceStatus
324 } // namespace Msdp
325 } // namespace OHOS
326