1 /*
2 * Copyright (c) 2023 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 "drag_client.h"
17
18 #include "default_params.h"
19 #include "drag_params.h"
20 #include "devicestatus_define.h"
21 #include "proto.h"
22
23 #undef LOG_TAG
24 #define LOG_TAG "DragClient"
25
26 namespace OHOS {
27 namespace Msdp {
28 namespace DeviceStatus {
29
StartDrag(ITunnelClient &tunnel, const DragData &dragData, std::shared_ptr<IStartDragListener> listener)30 int32_t DragClient::StartDrag(ITunnelClient &tunnel,
31 const DragData &dragData, std::shared_ptr<IStartDragListener> listener)
32 {
33 CALL_DEBUG_ENTER;
34 CHKPR(listener, RET_ERR);
35 if (dragData.shadowInfos.empty()) {
36 FI_HILOGE("shadowInfos is empty");
37 return ERR_INVALID_VALUE;
38 }
39 for (const auto& shadowInfo : dragData.shadowInfos) {
40 CHKPR(shadowInfo.pixelMap, RET_ERR);
41 if ((shadowInfo.x > 0) || (shadowInfo.y > 0) ||
42 (shadowInfo.x < -shadowInfo.pixelMap->GetWidth()) ||
43 (shadowInfo.y < -shadowInfo.pixelMap->GetHeight())) {
44 FI_HILOGE("Invalid parameter, shadowInfox:%{private}d, shadowInfoy:%{private}d",
45 shadowInfo.x, shadowInfo.y);
46 return RET_ERR;
47 }
48 }
49 if ((dragData.dragNum <= 0) || (dragData.buffer.size() > MAX_BUFFER_SIZE) ||
50 (dragData.displayX < 0) || (dragData.displayY < 0)) {
51 FI_HILOGE("Start drag, invalid argument, dragNum:%{public}d, bufferSize:%{public}zu, "
52 "displayX:%{private}d, displayY:%{private}d",
53 dragData.dragNum, dragData.buffer.size(), dragData.displayX, dragData.displayY);
54 return RET_ERR;
55 }
56 {
57 std::lock_guard<std::mutex> guard(mtx_);
58 startDragListener_ = listener;
59 }
60 StartDragParam param { dragData };
61 DefaultReply reply {};
62
63 int32_t ret = tunnel.Start(Intention::DRAG, param, reply);
64 if (ret != RET_OK) {
65 FI_HILOGE("ITunnelClient::Start fail");
66 }
67 return ret;
68 }
69
StopDrag(ITunnelClient &tunnel, const DragDropResult &dropResult)70 int32_t DragClient::StopDrag(ITunnelClient &tunnel, const DragDropResult &dropResult)
71 {
72 CALL_DEBUG_ENTER;
73 StopDragParam param { dropResult };
74 DefaultReply reply;
75
76 int32_t ret = tunnel.Stop(Intention::DRAG, param, reply);
77 if (ret != RET_OK) {
78 FI_HILOGE("ITunnelClient::Start fail");
79 }
80 return ret;
81 }
82
AddDraglistener(ITunnelClient &tunnel, DragListenerPtr listener, bool isJsCaller)83 int32_t DragClient::AddDraglistener(ITunnelClient &tunnel, DragListenerPtr listener, bool isJsCaller)
84 {
85 CALL_DEBUG_ENTER;
86 CHKPR(listener, RET_ERR);
87 std::lock_guard<std::mutex> guard(mtx_);
88 if (dragListeners_.find(listener) != dragListeners_.end()) {
89 return RET_OK;
90 }
91 if (!hasRegistered_) {
92 AddDraglistenerParam param { isJsCaller };
93 DefaultReply reply {};
94 FI_HILOGI("Start drag listening");
95
96 int32_t ret = tunnel.AddWatch(Intention::DRAG, DragRequestID::ADD_DRAG_LISTENER, param, reply);
97 if (ret != RET_OK) {
98 FI_HILOGE("ITunnelClient::AddWatch fail");
99 return ret;
100 }
101 hasRegistered_ = true;
102 }
103 dragListeners_.insert(listener);
104 return RET_OK;
105 }
106
RemoveDraglistener(ITunnelClient &tunnel, DragListenerPtr listener, bool isJsCaller)107 int32_t DragClient::RemoveDraglistener(ITunnelClient &tunnel, DragListenerPtr listener, bool isJsCaller)
108 {
109 CALL_DEBUG_ENTER;
110 std::lock_guard<std::mutex> guard(mtx_);
111 if (listener == nullptr) {
112 dragListeners_.clear();
113 } else {
114 dragListeners_.erase(listener);
115 }
116 if (hasRegistered_ && dragListeners_.empty()) {
117 hasRegistered_ = false;
118 RemoveDraglistenerParam param { isJsCaller };
119 DefaultReply reply {};
120 FI_HILOGI("Stop drag listening");
121
122 int32_t ret = tunnel.RemoveWatch(Intention::DRAG, DragRequestID::REMOVE_DRAG_LISTENER, param, reply);
123 if (ret != RET_OK) {
124 FI_HILOGE("ITunnelClient::RemoveWatch fail");
125 return ret;
126 }
127 }
128 return RET_OK;
129 }
130
AddSubscriptListener(ITunnelClient &tunnel, SubscriptListenerPtr listener)131 int32_t DragClient::AddSubscriptListener(ITunnelClient &tunnel, SubscriptListenerPtr listener)
132 {
133 CHKPR(listener, RET_ERR);
134 std::lock_guard<std::mutex> guard(mtx_);
135 if (subscriptListeners_.find(listener) != subscriptListeners_.end()) {
136 return RET_OK;
137 }
138 if (!hasSubscriptRegistered_) {
139 DefaultParam param {};
140 DefaultReply reply {};
141 FI_HILOGI("Start subscript listening");
142
143 int32_t ret = tunnel.AddWatch(Intention::DRAG, DragRequestID::ADD_SUBSCRIPT_LISTENER, param, reply);
144 if (ret != RET_OK) {
145 FI_HILOGE("ITunnelClient::AddWatch fail");
146 return ret;
147 }
148 hasSubscriptRegistered_ = true;
149 }
150 subscriptListeners_.insert(listener);
151 return RET_OK;
152 }
153
RemoveSubscriptListener(ITunnelClient &tunnel, SubscriptListenerPtr listener)154 int32_t DragClient::RemoveSubscriptListener(ITunnelClient &tunnel, SubscriptListenerPtr listener)
155 {
156 std::lock_guard<std::mutex> guard(mtx_);
157 if (listener == nullptr) {
158 subscriptListeners_.clear();
159 } else {
160 subscriptListeners_.erase(listener);
161 }
162 if (hasSubscriptRegistered_ && subscriptListeners_.empty()) {
163 hasSubscriptRegistered_ = false;
164 DefaultParam param {};
165 DefaultReply reply {};
166 FI_HILOGI("Stop subscript listening");
167
168 int32_t ret = tunnel.RemoveWatch(Intention::DRAG, DragRequestID::REMOVE_SUBSCRIPT_LISTENER, param, reply);
169 if (ret != RET_OK) {
170 FI_HILOGE("ITunnelClient::RemoveWatch fail");
171 return ret;
172 }
173 }
174 return RET_OK;
175 }
176
SetDragWindowVisible(ITunnelClient &tunnel, bool visible, bool isForce)177 int32_t DragClient::SetDragWindowVisible(ITunnelClient &tunnel, bool visible, bool isForce)
178 {
179 SetDragWindowVisibleParam param { visible, isForce };
180 DefaultReply reply {};
181
182 int32_t ret = tunnel.SetParam(Intention::DRAG, DragRequestID::SET_DRAG_WINDOW_VISIBLE, param, reply);
183 if (ret != RET_OK) {
184 FI_HILOGE("ITunnelClient::SetParam fail");
185 }
186 return ret;
187 }
188
UpdateDragStyle(ITunnelClient &tunnel, DragCursorStyle style, int32_t eventId)189 int32_t DragClient::UpdateDragStyle(ITunnelClient &tunnel, DragCursorStyle style, int32_t eventId)
190 {
191 if ((style < DragCursorStyle::DEFAULT) || (style > DragCursorStyle::MOVE)) {
192 FI_HILOGE("Invalid style:%{public}d", static_cast<int32_t>(style));
193 return RET_ERR;
194 }
195 UpdateDragStyleParam param { style, eventId };
196 DefaultReply reply {};
197
198 int32_t ret = tunnel.SetParam(Intention::DRAG, DragRequestID::UPDATE_DRAG_STYLE, param, reply);
199 if (ret != RET_OK) {
200 FI_HILOGE("ITunnelClient::SetParam fail");
201 }
202 return ret;
203 }
204
UpdateShadowPic(ITunnelClient &tunnel, const ShadowInfo &shadowInfo)205 int32_t DragClient::UpdateShadowPic(ITunnelClient &tunnel, const ShadowInfo &shadowInfo)
206 {
207 CALL_DEBUG_ENTER;
208 CHKPR(shadowInfo.pixelMap, RET_ERR);
209 if ((shadowInfo.x > 0) || (shadowInfo.y > 0) ||
210 (shadowInfo.x < -shadowInfo.pixelMap->GetWidth()) ||
211 (shadowInfo.y < -shadowInfo.pixelMap->GetHeight())) {
212 FI_HILOGE("Invalid parameter, shadowInfox:%{private}d, shadowInfoy:%{private}d",
213 shadowInfo.x, shadowInfo.y);
214 return RET_ERR;
215 }
216 UpdateShadowPicParam param { shadowInfo };
217 DefaultReply reply {};
218
219 int32_t ret = tunnel.SetParam(Intention::DRAG, DragRequestID::UPDATE_SHADOW_PIC, param, reply);
220 if (ret != RET_OK) {
221 FI_HILOGE("ITunnelClient::SetParam fail");
222 }
223 return ret;
224 }
225
GetDragTargetPid(ITunnelClient &tunnel)226 int32_t DragClient::GetDragTargetPid(ITunnelClient &tunnel)
227 {
228 CALL_DEBUG_ENTER;
229 DefaultParam param {};
230 GetDragTargetPidReply reply {};
231
232 int32_t ret = tunnel.GetParam(Intention::DRAG, DragRequestID::GET_DRAG_TARGET_PID, param, reply);
233 if (ret != RET_OK) {
234 FI_HILOGE("ITunnelClient::GetParam fail");
235 return -1;
236 }
237 return reply.targetPid_;
238 }
239
GetUdKey(ITunnelClient &tunnel, std::string &udKey)240 int32_t DragClient::GetUdKey(ITunnelClient &tunnel, std::string &udKey)
241 {
242 DefaultParam param {};
243 GetUdKeyReply reply {};
244
245 int32_t ret = tunnel.GetParam(Intention::DRAG, DragRequestID::GET_UDKEY, param, reply);
246 if (ret != RET_OK) {
247 FI_HILOGE("ITunnelClient::GetParam fail");
248 return ret;
249 }
250 udKey = reply.udKey_;
251 FI_HILOGI("UdKey:%{public}s", reply.udKey_.c_str());
252 return RET_OK;
253 }
254
GetShadowOffset(ITunnelClient &tunnel, ShadowOffset &shadowOffset)255 int32_t DragClient::GetShadowOffset(ITunnelClient &tunnel, ShadowOffset &shadowOffset)
256 {
257 DefaultParam param {};
258 GetShadowOffsetReply reply {};
259
260 int32_t ret = tunnel.GetParam(Intention::DRAG, DragRequestID::GET_SHADOW_OFFSET, param, reply);
261 if (ret != RET_OK) {
262 FI_HILOGE("ITunnelClient::GetParam fail");
263 return ret;
264 }
265 shadowOffset = reply.shadowOffset_;
266 return RET_OK;
267 }
268
GetDragData(ITunnelClient &tunnel, DragData &dragData)269 int32_t DragClient::GetDragData(ITunnelClient &tunnel, DragData &dragData)
270 {
271 CALL_DEBUG_ENTER;
272 DefaultParam param {};
273 GetDragDataReply reply { dragData };
274
275 int32_t ret = tunnel.GetParam(Intention::DRAG, DragRequestID::GET_DRAG_DATA, param, reply);
276 if (ret != RET_OK) {
277 FI_HILOGE("ITunnelClient::GetParam fail");
278 }
279 return ret;
280 }
281
UpdatePreviewStyle(ITunnelClient &tunnel, const PreviewStyle &previewStyle)282 int32_t DragClient::UpdatePreviewStyle(ITunnelClient &tunnel, const PreviewStyle &previewStyle)
283 {
284 UpdatePreviewStyleParam param { previewStyle };
285 DefaultReply reply {};
286
287 int32_t ret = tunnel.SetParam(Intention::DRAG, DragRequestID::UPDATE_PREVIEW_STYLE, param, reply);
288 if (ret != RET_OK) {
289 FI_HILOGE("ITunnelClient::SetParam fail");
290 }
291 return ret;
292 }
293
UpdatePreviewStyleWithAnimation(ITunnelClient &tunnel, const PreviewStyle &previewStyle, const PreviewAnimation &animation)294 int32_t DragClient::UpdatePreviewStyleWithAnimation(ITunnelClient &tunnel,
295 const PreviewStyle &previewStyle, const PreviewAnimation &animation)
296 {
297 UpdatePreviewAnimationParam param { previewStyle, animation };
298 DefaultReply reply {};
299
300 int32_t ret = tunnel.SetParam(Intention::DRAG, DragRequestID::UPDATE_PREVIEW_STYLE_WITH_ANIMATION, param, reply);
301 if (ret != RET_OK) {
302 FI_HILOGE("ITunnelClient::SetParam fail");
303 }
304 return ret;
305 }
306
RotateDragWindowSync(ITunnelClient &tunnel, const std::shared_ptr<Rosen::RSTransaction>& rsTransaction)307 int32_t DragClient::RotateDragWindowSync(ITunnelClient &tunnel,
308 const std::shared_ptr<Rosen::RSTransaction>& rsTransaction)
309 {
310 RotateDragWindowSyncParam param { rsTransaction };
311 DefaultReply reply {};
312
313 int32_t ret = tunnel.Control(Intention::DRAG, DragRequestID::ROTATE_DRAG_WINDOW_SYNC, param, reply);
314 if (ret != RET_OK) {
315 FI_HILOGE("ITunnelClient::Control fail");
316 }
317 return ret;
318 }
319
SetDragWindowScreenId(ITunnelClient &tunnel, uint64_t displayId, uint64_t screenId)320 int32_t DragClient::SetDragWindowScreenId(ITunnelClient &tunnel, uint64_t displayId, uint64_t screenId)
321 {
322 SetDragWindowScreenIdParam param { displayId, screenId };
323 DefaultReply reply {};
324
325 int32_t ret = tunnel.SetParam(Intention::DRAG, DragRequestID::SET_DRAG_WINDOW_SCREEN_ID, param, reply);
326 if (ret != RET_OK) {
327 FI_HILOGE("ITunnelClient::SetParam fail");
328 }
329 return ret;
330 }
331
GetDragSummary(ITunnelClient &tunnel, std::map<std::string, int64_t> &summary, bool isJsCaller)332 int32_t DragClient::GetDragSummary(ITunnelClient &tunnel, std::map<std::string, int64_t> &summary,
333 bool isJsCaller)
334 {
335 GetDragSummaryParam param { isJsCaller };
336 GetDragSummaryReply reply {};
337
338 int32_t ret = tunnel.GetParam(Intention::DRAG, DragRequestID::GET_DRAG_SUMMARY, param, reply);
339 if (ret != RET_OK) {
340 FI_HILOGE("ITunnelClient::GetParam fail");
341 return ret;
342 }
343 summary.swap(reply.summary_);
344 return RET_OK;
345 }
346
GetDragState(ITunnelClient &tunnel, DragState &dragState)347 int32_t DragClient::GetDragState(ITunnelClient &tunnel, DragState &dragState)
348 {
349 DefaultParam param {};
350 GetDragStateReply reply {};
351
352 int32_t ret = tunnel.GetParam(Intention::DRAG, DragRequestID::GET_DRAG_STATE, param, reply);
353 if (ret != RET_OK) {
354 FI_HILOGE("ITunnelClient::GetParam fail");
355 return ret;
356 }
357 dragState = reply.dragState_;
358 return RET_OK;
359 }
360
EnableUpperCenterMode(ITunnelClient &tunnel, bool enable)361 int32_t DragClient::EnableUpperCenterMode(ITunnelClient &tunnel, bool enable)
362 {
363 EnterTextEditorAreaParam param { enable };
364 DefaultReply reply {};
365
366 int32_t ret = tunnel.Control(Intention::DRAG, DragRequestID::ENTER_TEXT_EDITOR_AREA, param, reply);
367 if (ret != RET_OK) {
368 FI_HILOGE("ITunnelClient::Control fail");
369 }
370 return ret;
371 }
372
GetDragAction(ITunnelClient &tunnel, DragAction &dragAction)373 int32_t DragClient::GetDragAction(ITunnelClient &tunnel, DragAction &dragAction)
374 {
375 DefaultParam param {};
376 GetDragActionReply reply {};
377
378 int32_t ret = tunnel.GetParam(Intention::DRAG, DragRequestID::GET_DRAG_ACTION, param, reply);
379 if (ret != RET_OK) {
380 FI_HILOGE("ITunnelClient::GetParam fail");
381 return ret;
382 }
383 dragAction = reply.dragAction_;
384 return RET_OK;
385 }
386
GetExtraInfo(ITunnelClient &tunnel, std::string &extraInfo)387 int32_t DragClient::GetExtraInfo(ITunnelClient &tunnel, std::string &extraInfo)
388 {
389 DefaultParam param {};
390 GetExtraInfoReply reply {};
391
392 int32_t ret = tunnel.GetParam(Intention::DRAG, DragRequestID::GET_EXTRA_INFO, param, reply);
393 if (ret != RET_OK) {
394 FI_HILOGE("ITunnelClient::GetParam fail");
395 return ret;
396 }
397 extraInfo = std::move(reply.extraInfo_);
398 return RET_OK;
399 }
400
AddPrivilege(ITunnelClient &tunnel)401 int32_t DragClient::AddPrivilege(ITunnelClient &tunnel)
402 {
403 DefaultParam param {};
404 DefaultReply reply {};
405
406 int32_t ret = tunnel.Control(Intention::DRAG, DragRequestID::ADD_PRIVILEGE, param, reply);
407 if (ret != RET_OK) {
408 FI_HILOGE("ITunnelClient::Control fail");
409 }
410 return ret;
411 }
412
EraseMouseIcon(ITunnelClient &tunnel)413 int32_t DragClient::EraseMouseIcon(ITunnelClient &tunnel)
414 {
415 DefaultParam param {};
416 DefaultReply reply {};
417
418 int32_t ret = tunnel.Control(Intention::DRAG, DragRequestID::ERASE_MOUSE_ICON, param, reply);
419 if (ret != RET_OK) {
420 FI_HILOGE("ITunnelClient::Control fail");
421 }
422 return ret;
423 }
424
SetMouseDragMonitorState(ITunnelClient &tunnel, bool state)425 int32_t DragClient::SetMouseDragMonitorState(ITunnelClient &tunnel, bool state)
426 {
427 SetMouseDragMonitorStateParam param { state };
428 DefaultReply reply {};
429
430 int32_t ret = tunnel.Control(Intention::DRAG, DragRequestID::SET_MOUSE_DRAG_MONITOR_STATE, param, reply);
431 if (ret != RET_OK) {
432 FI_HILOGE("ITunnelClient::Control fail");
433 }
434 return ret;
435 }
436
AddSelectedPixelMap(ITunnelClient &tunnel, std::shared_ptr<OHOS::Media::PixelMap> pixelMap, std::function<void(bool)> callback)437 int32_t DragClient::AddSelectedPixelMap(ITunnelClient &tunnel, std::shared_ptr<OHOS::Media::PixelMap> pixelMap,
438 std::function<void(bool)> callback)
439 {
440 CALL_DEBUG_ENTER;
441 CHKPR(pixelMap, RET_ERR);
442 CHKPR(callback, RET_ERR);
443 std::lock_guard<std::mutex> guard(mtx_);
444 addSelectedPixelMapCallback_ = callback;
445 AddSelectedPixelMapParam param { pixelMap };
446 DefaultReply reply {};
447
448 int32_t ret = tunnel.SetParam(Intention::DRAG, DragRequestID::ADD_SELECTED_PIXELMAP, param, reply);
449 if (ret != RET_OK) {
450 FI_HILOGE("ITunnelClient::SetParam fail");
451 }
452 return ret;
453 }
454
OnAddSelectedPixelMapResult(const StreamClient &client, NetPacket &pkt)455 int32_t DragClient::OnAddSelectedPixelMapResult(const StreamClient &client, NetPacket &pkt)
456 {
457 CALL_DEBUG_ENTER;
458 bool result = false;
459
460 pkt >> result;
461 if (pkt.ChkRWError()) {
462 FI_HILOGE("Packet read addSelectedPixelMap msg failed");
463 return RET_ERR;
464 }
465 std::lock_guard<std::mutex> guard(mtx_);
466 CHKPR(addSelectedPixelMapCallback_, RET_ERR);
467 addSelectedPixelMapCallback_(result);
468 return RET_OK;
469 }
470
OnNotifyResult(const StreamClient &client, NetPacket &pkt)471 int32_t DragClient::OnNotifyResult(const StreamClient &client, NetPacket &pkt)
472 {
473 CALL_DEBUG_ENTER;
474 DragNotifyMsg notifyMsg;
475 int32_t result = 0;
476 int32_t dragBehavior = -1;
477 pkt >> notifyMsg.displayX >> notifyMsg.displayY >> result >> notifyMsg.targetPid >> dragBehavior;
478 if (pkt.ChkRWError()) {
479 FI_HILOGE("Packet read drag msg failed");
480 return RET_ERR;
481 }
482 if ((result < static_cast<int32_t>(DragResult::DRAG_SUCCESS)) ||
483 (result > static_cast<int32_t>(DragResult::DRAG_EXCEPTION))) {
484 FI_HILOGE("Invalid result:%{public}d", result);
485 return RET_ERR;
486 }
487 notifyMsg.result = static_cast<DragResult>(result);
488 if ((dragBehavior < static_cast<int32_t>(DragBehavior::UNKNOWN)) ||
489 (dragBehavior > static_cast<int32_t>(DragBehavior::MOVE))) {
490 FI_HILOGE("Invalid dragBehavior:%{public}d", dragBehavior);
491 return RET_ERR;
492 }
493 notifyMsg.dragBehavior = static_cast<DragBehavior>(dragBehavior);
494 std::lock_guard<std::mutex> guard(mtx_);
495 CHKPR(startDragListener_, RET_ERR);
496 startDragListener_->OnDragEndMessage(notifyMsg);
497 return RET_OK;
498 }
499
OnNotifyHideIcon(const StreamClient& client, NetPacket& pkt)500 int32_t DragClient::OnNotifyHideIcon(const StreamClient& client, NetPacket& pkt)
501 {
502 CALL_DEBUG_ENTER;
503 std::lock_guard<std::mutex> guard(mtx_);
504 CHKPR(startDragListener_, RET_ERR);
505 startDragListener_->OnHideIconMessage();
506 return RET_OK;
507 }
508
OnStateChangedMessage(const StreamClient &client, NetPacket &pkt)509 int32_t DragClient::OnStateChangedMessage(const StreamClient &client, NetPacket &pkt)
510 {
511 CALL_DEBUG_ENTER;
512 int32_t state = 0;
513 pkt >> state;
514 if (pkt.ChkRWError()) {
515 FI_HILOGE("Packet read drag msg failed");
516 return RET_ERR;
517 }
518 std::lock_guard<std::mutex> guard(mtx_);
519 for (const auto &listener : dragListeners_) {
520 listener->OnDragMessage(static_cast<DragState>(state));
521 }
522 return RET_OK;
523 }
524
OnDragStyleChangedMessage(const StreamClient &client, NetPacket &pkt)525 int32_t DragClient::OnDragStyleChangedMessage(const StreamClient &client, NetPacket &pkt)
526 {
527 CALL_DEBUG_ENTER;
528 int32_t style = 0;
529 pkt >> style;
530 if (pkt.ChkRWError()) {
531 FI_HILOGE("Packet read drag msg failed");
532 return RET_ERR;
533 }
534 std::lock_guard<std::mutex> guard(mtx_);
535 for (const auto &listener : subscriptListeners_) {
536 listener->OnMessage(static_cast<DragCursorStyle>(style));
537 }
538 return RET_OK;
539 }
540
OnConnected(ITunnelClient &tunnel)541 void DragClient::OnConnected(ITunnelClient &tunnel)
542 {
543 CALL_INFO_TRACE;
544 if (connectedDragListeners_.empty()) {
545 FI_HILOGE("The connect drag listener set is empty");
546 return;
547 }
548 for (const auto &listener : connectedDragListeners_) {
549 if (AddDraglistener(tunnel, listener) != RET_OK) {
550 FI_HILOGW("AddDraglistener failed");
551 }
552 }
553 connectedDragListeners_.clear();
554 }
555
OnDisconnected(ITunnelClient &tunnel)556 void DragClient::OnDisconnected(ITunnelClient &tunnel)
557 {
558 CALL_INFO_TRACE;
559 std::lock_guard<std::mutex> guard(mtx_);
560 if (dragListeners_.empty()) {
561 FI_HILOGE("The drag listener set is empty");
562 return;
563 }
564 connectedDragListeners_ = dragListeners_;
565 dragListeners_.clear();
566 hasRegistered_ = false;
567 }
568 } // namespace DeviceStatus
569 } // namespace Msdp
570 } // namespace OHOS
571