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