• 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 #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 &notice)
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 &notice)
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 &notice)
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