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_server.h"
17 
18 #include "drag_params.h"
19 #include "devicestatus_define.h"
20 
21 #undef LOG_TAG
22 #define LOG_TAG "DragServer"
23 
24 namespace OHOS {
25 namespace Msdp {
26 namespace DeviceStatus {
27 
DragServer(IContext * env)28 DragServer::DragServer(IContext *env)
29     : env_(env)
30 {}
31 
Enable(CallingContext & context,MessageParcel & data,MessageParcel & reply)32 int32_t DragServer::Enable(CallingContext &context, MessageParcel &data, MessageParcel &reply)
33 {
34     CALL_DEBUG_ENTER;
35     return RET_ERR;
36 }
37 
Disable(CallingContext & context,MessageParcel & data,MessageParcel & reply)38 int32_t DragServer::Disable(CallingContext &context, MessageParcel &data, MessageParcel &reply)
39 {
40     CALL_DEBUG_ENTER;
41     return RET_ERR;
42 }
43 
Start(CallingContext & context,MessageParcel & data,MessageParcel & reply)44 int32_t DragServer::Start(CallingContext &context, MessageParcel &data, MessageParcel &reply)
45 {
46     CALL_DEBUG_ENTER;
47     DragData dragData {};
48     StartDragParam param { dragData };
49 
50     if (!param.Unmarshalling(data)) {
51         FI_HILOGE("Failed to unmarshalling param");
52         return RET_ERR;
53     }
54     CHKPR(env_, RET_ERR);
55     auto session = env_->GetSocketSessionManager().FindSessionByPid(context.pid);
56     CHKPR(session, RET_ERR);
57     session->SetProgramName(GetPackageName(context.tokenId));
58     return env_->GetDragManager().StartDrag(dragData, context.pid);
59 }
60 
Stop(CallingContext & context,MessageParcel & data,MessageParcel & reply)61 int32_t DragServer::Stop(CallingContext &context, MessageParcel &data, MessageParcel &reply)
62 {
63     CALL_DEBUG_ENTER;
64     StopDragParam param {};
65 
66     if (!param.Unmarshalling(data)) {
67         FI_HILOGE("Failed to unmarshalling param");
68         return RET_ERR;
69     }
70     CHKPR(env_, RET_ERR);
71     return env_->GetDragManager().StopDrag(param.dropResult_, GetPackageName(context.tokenId));
72 }
73 
AddWatch(CallingContext & context,uint32_t id,MessageParcel & data,MessageParcel & reply)74 int32_t DragServer::AddWatch(CallingContext &context, uint32_t id, MessageParcel &data, MessageParcel &reply)
75 {
76     CALL_DEBUG_ENTER;
77     switch (id) {
78         case DragRequestID::ADD_DRAG_LISTENER: {
79             FI_HILOGI("Add drag listener, from:%{public}d", context.pid);
80             return env_->GetDragManager().AddListener(context.pid);
81         }
82         case DragRequestID::ADD_SUBSCRIPT_LISTENER: {
83             FI_HILOGD("Add subscript listener, from:%{public}d", context.pid);
84             return env_->GetDragManager().AddSubscriptListener(context.pid);
85         }
86         default: {
87             FI_HILOGE("Unexpected request ID (%{public}u)", id);
88             return RET_ERR;
89         }
90     }
91 }
92 
RemoveWatch(CallingContext & context,uint32_t id,MessageParcel & data,MessageParcel & reply)93 int32_t DragServer::RemoveWatch(CallingContext &context, uint32_t id, MessageParcel &data, MessageParcel &reply)
94 {
95     CALL_DEBUG_ENTER;
96     switch (id) {
97         case DragRequestID::REMOVE_DRAG_LISTENER: {
98             FI_HILOGD("Remove drag listener, from:%{public}d", context.pid);
99             return env_->GetDragManager().RemoveListener(context.pid);
100         }
101         case DragRequestID::REMOVE_SUBSCRIPT_LISTENER: {
102             FI_HILOGD("Remove subscript listener, from:%{public}d", context.pid);
103             return env_->GetDragManager().RemoveSubscriptListener(context.pid);
104         }
105         default: {
106             FI_HILOGE("Unexpected request ID (%{public}u)", id);
107             return RET_ERR;
108         }
109     }
110 }
111 
SetParam(CallingContext & context,uint32_t id,MessageParcel & data,MessageParcel & reply)112 int32_t DragServer::SetParam(CallingContext &context, uint32_t id, MessageParcel &data, MessageParcel &reply)
113 {
114     CALL_DEBUG_ENTER;
115     switch (id) {
116         case DragRequestID::SET_DRAG_WINDOW_VISIBLE: {
117             return SetDragWindowVisible(context, data, reply);
118         }
119         case DragRequestID::UPDATE_DRAG_STYLE: {
120             return UpdateDragStyle(context, data, reply);
121         }
122         case DragRequestID::UPDATE_SHADOW_PIC: {
123             return UpdateShadowPic(context, data, reply);
124         }
125         case DragRequestID::UPDATE_PREVIEW_STYLE: {
126             return UpdatePreviewStyle(context, data, reply);
127         }
128         case DragRequestID::UPDATE_PREVIEW_STYLE_WITH_ANIMATION: {
129             return UpdatePreviewAnimation(context, data, reply);
130         }
131         case DragRequestID::SET_DRAG_WINDOW_SCREEN_ID: {
132             return SetDragWindowScreenId(context, data, reply);
133         }
134         case DragRequestID::ADD_SELECTED_PIXELMAP: {
135             return AddSelectedPixelMap(context, data, reply);
136         }
137         default: {
138             FI_HILOGE("Unexpected request ID (%{public}u)", id);
139             return RET_ERR;
140         }
141     }
142 }
143 
GetParam(CallingContext & context,uint32_t id,MessageParcel & data,MessageParcel & reply)144 int32_t DragServer::GetParam(CallingContext &context, uint32_t id, MessageParcel &data, MessageParcel &reply)
145 {
146     CALL_DEBUG_ENTER;
147     switch (id) {
148         case DragRequestID::GET_DRAG_TARGET_PID: {
149             FI_HILOGI("Get drag target pid, from:%{public}d", context.pid);
150             return GetDragTargetPid(context, data, reply);
151         }
152         case DragRequestID::GET_UDKEY: {
153             FI_HILOGI("Get udkey, from:%{public}d", context.pid);
154             return GetUdKey(context, data, reply);
155         }
156         case DragRequestID::GET_SHADOW_OFFSET: {
157             FI_HILOGI("Get shadow offset, from:%{public}d", context.pid);
158             return GetShadowOffset(context, data, reply);
159         }
160         case DragRequestID::GET_DRAG_DATA: {
161             FI_HILOGI("Get drag data, from:%{public}d", context.pid);
162             return GetDragData(context, data, reply);
163         }
164         case DragRequestID::GET_DRAG_STATE: {
165             FI_HILOGI("Get drag state, from:%{public}d", context.pid);
166             return GetDragState(context, data, reply);
167         }
168         case DragRequestID::GET_DRAG_SUMMARY: {
169             FI_HILOGI("Get drag summary, from:%{public}d", context.pid);
170             return GetDragSummary(context, data, reply);
171         }
172         case DragRequestID::GET_DRAG_ACTION: {
173             FI_HILOGI("Get drag action, from:%{public}d", context.pid);
174             return GetDragAction(context, data, reply);
175         }
176         case DragRequestID::GET_EXTRA_INFO: {
177             FI_HILOGI("Get extra info, from:%{public}d", context.pid);
178             return GetExtraInfo(context, data, reply);
179         }
180         default: {
181             FI_HILOGE("Unexpected request ID (%{public}u)", id);
182             return RET_ERR;
183         }
184     }
185 }
186 
Control(CallingContext & context,uint32_t id,MessageParcel & data,MessageParcel & reply)187 int32_t DragServer::Control(CallingContext &context, uint32_t id, MessageParcel &data, MessageParcel &reply)
188 {
189     CALL_DEBUG_ENTER;
190     switch (id) {
191         case DragRequestID::ADD_PRIVILEGE: {
192             FI_HILOGI("Add privilege, from:%{public}d", context.pid);
193             return env_->GetDragManager().AddPrivilege(context.tokenId);
194         }
195         case DragRequestID::ENTER_TEXT_EDITOR_AREA: {
196             FI_HILOGI("Enter text editor area, from:%{public}d", context.pid);
197             return EnterTextEditorArea(context, data, reply);
198         }
199         case DragRequestID::ROTATE_DRAG_WINDOW_SYNC: {
200             FI_HILOGI("Rotate drag window sync, from:%{public}d", context.pid);
201             return RotateDragWindowSync(context, data, reply);
202         }
203         case DragRequestID::ERASE_MOUSE_ICON: {
204             FI_HILOGI("Erase mouse, from:%{public}d", context.pid);
205             return env_->GetDragManager().EraseMouseIcon();
206         }
207         default: {
208             FI_HILOGE("Unexpected request ID (%{public}u)", id);
209             return RET_ERR;
210         }
211     }
212 }
213 
SetDragWindowVisible(CallingContext & context,MessageParcel & data,MessageParcel & reply)214 int32_t DragServer::SetDragWindowVisible(CallingContext &context, MessageParcel &data, MessageParcel &reply)
215 {
216     SetDragWindowVisibleParam param {};
217 
218     if (!param.Unmarshalling(data)) {
219         FI_HILOGE("SetDragWindowVisibleParam::Unmarshalling fail");
220         return RET_ERR;
221     }
222     FI_HILOGI("SetDragWindowVisible(%{public}d, %{public}d)", param.visible_, param.isForce_);
223     return env_->GetDragManager().OnSetDragWindowVisible(param.visible_, param.isForce_);
224 }
225 
UpdateDragStyle(CallingContext & context,MessageParcel & data,MessageParcel & reply)226 int32_t DragServer::UpdateDragStyle(CallingContext &context, MessageParcel &data, MessageParcel &reply)
227 {
228     UpdateDragStyleParam param {};
229 
230     if (!param.Unmarshalling(data)) {
231         FI_HILOGE("UpdateDragStyleParam::Unmarshalling fail");
232         return RET_ERR;
233     }
234     FI_HILOGI("UpdateDragStyle(%{public}d)", static_cast<int32_t>(param.cursorStyle_));
235     return env_->GetDragManager().UpdateDragStyle(param.cursorStyle_, context.pid, context.tokenId);
236 }
237 
UpdateShadowPic(CallingContext & context,MessageParcel & data,MessageParcel & reply)238 int32_t DragServer::UpdateShadowPic(CallingContext &context, MessageParcel &data, MessageParcel &reply)
239 {
240     UpdateShadowPicParam param {};
241 
242     if (!param.Unmarshalling(data)) {
243         FI_HILOGE("UpdateShadowPicParam::Unmarshalling fail");
244         return RET_ERR;
245     }
246     FI_HILOGD("Updata shadow pic");
247     return env_->GetDragManager().UpdateShadowPic(param.shadowInfo_);
248 }
249 
AddSelectedPixelMap(CallingContext & context,MessageParcel & data,MessageParcel & reply)250 int32_t DragServer::AddSelectedPixelMap(CallingContext &context, MessageParcel &data, MessageParcel &reply)
251 {
252     AddSelectedPixelMapParam param {};
253 
254     if (!param.Unmarshalling(data)) {
255         FI_HILOGE("AddSelectedPixelMap::Unmarshalling fail");
256         return RET_ERR;
257     }
258     return env_->GetDragManager().AddSelectedPixelMap(param.pixelMap_);
259 }
260 
UpdatePreviewStyle(CallingContext & context,MessageParcel & data,MessageParcel & reply)261 int32_t DragServer::UpdatePreviewStyle(CallingContext &context, MessageParcel &data, MessageParcel &reply)
262 {
263     UpdatePreviewStyleParam param {};
264 
265     if (!param.Unmarshalling(data)) {
266         FI_HILOGE("UpdatePreviewStyleParam::Unmarshalling fail");
267         return RET_ERR;
268     }
269     return env_->GetDragManager().UpdatePreviewStyle(param.previewStyle_);
270 }
271 
UpdatePreviewAnimation(CallingContext & context,MessageParcel & data,MessageParcel & reply)272 int32_t DragServer::UpdatePreviewAnimation(CallingContext &context, MessageParcel &data, MessageParcel &reply)
273 {
274     UpdatePreviewAnimationParam param {};
275 
276     if (!param.Unmarshalling(data)) {
277         FI_HILOGE("UpdatePreviewAnimationParam::Unmarshalling fail");
278         return RET_ERR;
279     }
280     return env_->GetDragManager().UpdatePreviewStyleWithAnimation(param.previewStyle_, param.previewAnimation_);
281 }
282 
RotateDragWindowSync(CallingContext & context,MessageParcel & data,MessageParcel & reply)283 int32_t DragServer::RotateDragWindowSync(CallingContext &context, MessageParcel &data, MessageParcel &reply)
284 {
285     RotateDragWindowSyncParam param {};
286 
287     if (!param.Unmarshalling(data)) {
288         FI_HILOGE("RotateDragWindowSync::Unmarshalling fail");
289         return RET_ERR;
290     }
291     return env_->GetDragManager().RotateDragWindowSync(param.rsTransaction_);
292 }
293 
SetDragWindowScreenId(CallingContext & context,MessageParcel & data,MessageParcel & reply)294 int32_t DragServer::SetDragWindowScreenId(CallingContext &context, MessageParcel &data, MessageParcel &reply)
295 {
296     SetDragWindowScreenIdParam param {};
297 
298     if (!param.Unmarshalling(data)) {
299         FI_HILOGE("SetDragWindowScreenId::Unmarshalling fail");
300         return RET_ERR;
301     }
302     env_->GetDragManager().SetDragWindowScreenId(param.displayId_, param.screenId_);
303     return RET_OK;
304 }
305 
GetDragTargetPid(CallingContext & context,MessageParcel & data,MessageParcel & reply)306 int32_t DragServer::GetDragTargetPid(CallingContext &context, MessageParcel &data, MessageParcel &reply)
307 {
308     int32_t targetPid = env_->GetDragManager().GetDragTargetPid();
309     GetDragTargetPidReply targetPidReply { targetPid };
310 
311     if (!targetPidReply.Marshalling(reply)) {
312         FI_HILOGE("GetDragTargetPidReply::Marshalling fail");
313         return RET_ERR;
314     }
315     return RET_OK;
316 }
317 
GetUdKey(CallingContext & context,MessageParcel & data,MessageParcel & reply)318 int32_t DragServer::GetUdKey(CallingContext &context, MessageParcel &data, MessageParcel &reply)
319 {
320     std::string udKey;
321 
322     int32_t ret = env_->GetDragManager().GetUdKey(udKey);
323     if (ret != RET_OK) {
324         FI_HILOGE("IDragManager::GetUdKey fail, error:%{public}d", ret);
325         return ret;
326     }
327     GetUdKeyReply udKeyReply { std::move(udKey) };
328 
329     if (!udKeyReply.Marshalling(reply)) {
330         FI_HILOGE("GetUdKeyReply::Marshalling fail");
331         return RET_ERR;
332     }
333     return RET_OK;
334 }
335 
GetShadowOffset(CallingContext & context,MessageParcel & data,MessageParcel & reply)336 int32_t DragServer::GetShadowOffset(CallingContext &context, MessageParcel &data, MessageParcel &reply)
337 {
338     ShadowOffset shadowOffset {};
339 
340     int32_t ret = env_->GetDragManager().OnGetShadowOffset(shadowOffset);
341     if (ret != RET_OK) {
342         FI_HILOGE("IDragManager::GetShadowOffset fail, error:%{public}d", ret);
343         return ret;
344     }
345     GetShadowOffsetReply shadowOffsetReply { shadowOffset };
346 
347     if (!shadowOffsetReply.Marshalling(reply)) {
348         FI_HILOGE("GetShadowOffsetReply::Marshalling fail");
349         return RET_ERR;
350     }
351     return RET_OK;
352 }
353 
GetDragData(CallingContext & context,MessageParcel & data,MessageParcel & reply)354 int32_t DragServer::GetDragData(CallingContext &context, MessageParcel &data, MessageParcel &reply)
355 {
356     DragData dragData {};
357 
358     int32_t ret = env_->GetDragManager().GetDragData(dragData);
359     if (ret != RET_OK) {
360         FI_HILOGE("IDragManager::GetDragData fail, error:%{public}d", ret);
361         return ret;
362     }
363     GetDragDataReply dragDataReply { static_cast<const DragData&>(dragData) };
364 
365     if (!dragDataReply.Marshalling(reply)) {
366         FI_HILOGE("GetDragDataReply::Marshalling fail");
367         return RET_ERR;
368     }
369     return RET_OK;
370 }
371 
GetDragState(CallingContext & context,MessageParcel & data,MessageParcel & reply)372 int32_t DragServer::GetDragState(CallingContext &context, MessageParcel &data, MessageParcel &reply)
373 {
374     DragState dragState {};
375 
376     int32_t ret = env_->GetDragManager().GetDragState(dragState);
377     if (ret != RET_OK) {
378         FI_HILOGE("IDragManager::GetDragState fail, error:%{public}d", ret);
379         return ret;
380     }
381     GetDragStateReply dragStateReply { dragState };
382 
383     if (!dragStateReply.Marshalling(reply)) {
384         FI_HILOGE("GetDragStateReply::Marshalling fail");
385         return RET_ERR;
386     }
387     return RET_OK;
388 }
389 
GetDragSummary(CallingContext & context,MessageParcel & data,MessageParcel & reply)390 int32_t DragServer::GetDragSummary(CallingContext &context, MessageParcel &data, MessageParcel &reply)
391 {
392     std::map<std::string, int64_t> summaries;
393 
394     int32_t ret = env_->GetDragManager().GetDragSummary(summaries);
395     if (ret != RET_OK) {
396         FI_HILOGE("IDragManager::GetDragSummary fail, error:%{public}d", ret);
397         return ret;
398     }
399     GetDragSummaryReply summaryReply { std::move(summaries) };
400 
401     if (!summaryReply.Marshalling(reply)) {
402         FI_HILOGE("GetDragSummaryReply::Marshalling fail");
403         return RET_ERR;
404     }
405     return RET_OK;
406 }
407 
GetDragAction(CallingContext & context,MessageParcel & data,MessageParcel & reply)408 int32_t DragServer::GetDragAction(CallingContext &context, MessageParcel &data, MessageParcel &reply)
409 {
410     DragAction dragAction {};
411 
412     int32_t ret = env_->GetDragManager().GetDragAction(dragAction);
413     if (ret != RET_OK) {
414         FI_HILOGE("IDragManager::GetDragSummary fail, error:%{public}d", ret);
415         return ret;
416     }
417     GetDragActionReply dragActionReply { dragAction };
418 
419     if (!dragActionReply.Marshalling(reply)) {
420         FI_HILOGE("GetDragActionReply::Marshalling fail");
421         return RET_ERR;
422     }
423     return RET_OK;
424 }
425 
GetExtraInfo(CallingContext & context,MessageParcel & data,MessageParcel & reply)426 int32_t DragServer::GetExtraInfo(CallingContext &context, MessageParcel &data, MessageParcel &reply)
427 {
428     std::string extraInfo;
429 
430     int32_t ret = env_->GetDragManager().GetExtraInfo(extraInfo);
431     if (ret != RET_OK) {
432         FI_HILOGE("IDragManager::GetExtraInfo fail, error:%{public}d", ret);
433         return ret;
434     }
435     GetExtraInfoReply extraInfoReply { std::move(extraInfo) };
436 
437     if (!extraInfoReply.Marshalling(reply)) {
438         FI_HILOGE("GetExtraInfoReply::Marshalling fail");
439         return RET_ERR;
440     }
441     return RET_OK;
442 }
443 
EnterTextEditorArea(CallingContext & context,MessageParcel & data,MessageParcel & reply)444 int32_t DragServer::EnterTextEditorArea(CallingContext &context, MessageParcel &data, MessageParcel &reply)
445 {
446     EnterTextEditorAreaParam param {};
447 
448     if (!param.Unmarshalling(data)) {
449         FI_HILOGE("EnterTextEditorAreaParam::Unmarshalling fail");
450         return RET_ERR;
451     }
452     return env_->GetDragManager().EnterTextEditorArea(param.state);
453 }
454 
GetPackageName(Security::AccessToken::AccessTokenID tokenId)455 std::string DragServer::GetPackageName(Security::AccessToken::AccessTokenID tokenId)
456 {
457     std::string packageName = std::string();
458     int32_t tokenType = Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(tokenId);
459     switch (tokenType) {
460         case Security::AccessToken::ATokenTypeEnum::TOKEN_HAP: {
461             Security::AccessToken::HapTokenInfo hapInfo;
462             if (Security::AccessToken::AccessTokenKit::GetHapTokenInfo(tokenId, hapInfo) != 0) {
463                 FI_HILOGE("Get hap token info failed");
464             } else {
465                 packageName = hapInfo.bundleName;
466             }
467             break;
468         }
469         case Security::AccessToken::ATokenTypeEnum::TOKEN_NATIVE:
470         case Security::AccessToken::ATokenTypeEnum::TOKEN_SHELL: {
471             Security::AccessToken::NativeTokenInfo tokenInfo;
472             if (Security::AccessToken::AccessTokenKit::GetNativeTokenInfo(tokenId, tokenInfo) != 0) {
473                 FI_HILOGE("Get native token info failed");
474             } else {
475                 packageName = tokenInfo.processName;
476             }
477             break;
478         }
479         default: {
480             FI_HILOGW("token type not match");
481             break;
482         }
483     }
484     return packageName;
485 }
486 } // namespace DeviceStatus
487 } // namespace Msdp
488 } // namespace OHOS