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