1 /*
2 * Copyright (c) 2021-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 "input_event_transmission/input_event_serialization.h"
17
18 #include "extra_data.h"
19 #ifdef OHOS_BUILD_ENABLE_SECURITY_PART
20 #include "sec_comp_enhance_kit.h"
21 #endif // OHOS_BUILD_ENABLE_SECURITY_PART
22
23 #include "devicestatus_define.h"
24 #include "input_event_transmission/inner_pointer_item.h"
25
26 #undef LOG_TAG
27 #define LOG_TAG "InputEventSerialization"
28
29 namespace OHOS {
30 namespace Msdp {
31 namespace DeviceStatus {
32 namespace Cooperate {
33 namespace {
34 constexpr int32_t MAX_KEY_SIZE { 395 };
35 const std::string HEART_BEAT_PACKET { "heart_beat_packet" };
36 constexpr size_t MAX_N_PRESSED_BUTTONS { 10 };
37 } // namespace
38
KeyEventToNetPacket(const std::shared_ptr<MMI::KeyEvent> key,NetPacket & pkt)39 int32_t InputEventSerialization::KeyEventToNetPacket(
40 const std::shared_ptr<MMI::KeyEvent> key, NetPacket &pkt)
41 {
42 if (SerializeInputEvent(key, pkt) != RET_OK) {
43 FI_HILOGE("Serialize input event failed");
44 return RET_ERR;
45 }
46 pkt << key->GetKeyCode() << key->GetKeyAction() << key->GetKeyIntention();
47 auto keys = key->GetKeyItems();
48 int32_t size = static_cast<int32_t>(keys.size());
49 if (size > MAX_KEY_SIZE) {
50 FI_HILOGE("Key exceeds the max range");
51 return RET_ERR;
52 }
53 pkt << size;
54 for (const auto &item : keys) {
55 pkt << item.GetKeyCode() << item.GetDownTime()
56 << item.GetDeviceId() << item.IsPressed() << item.GetUnicode();
57 }
58 pkt << key->GetFunctionKey(MMI::KeyEvent::NUM_LOCK_FUNCTION_KEY)
59 << key->GetFunctionKey(MMI::KeyEvent::CAPS_LOCK_FUNCTION_KEY)
60 << key->GetFunctionKey(MMI::KeyEvent::SCROLL_LOCK_FUNCTION_KEY);
61 if (pkt.ChkRWError()) {
62 FI_HILOGE("Packet write key event failed");
63 return RET_ERR;
64 }
65 return RET_OK;
66 }
67
NetPacketToKeyEvent(NetPacket & pkt,std::shared_ptr<MMI::KeyEvent> key)68 int32_t InputEventSerialization::NetPacketToKeyEvent(NetPacket &pkt, std::shared_ptr<MMI::KeyEvent> key)
69 {
70 if (DeserializeInputEvent(pkt, key) != RET_OK) {
71 FI_HILOGE("Deserialize input event failed");
72 return RET_ERR;
73 }
74 int32_t data = 0;
75 pkt >> data;
76 key->SetKeyCode(data);
77 pkt >> data;
78 key->SetKeyAction(data);
79 pkt >> data;
80 key->SetKeyIntention(data);
81 int32_t size = 0;
82 pkt >> size;
83 if (size > MAX_KEY_SIZE) {
84 FI_HILOGE("Key exceeds the max range");
85 return RET_ERR;
86 }
87 if (pkt.ChkRWError()) {
88 FI_HILOGE("Packet read size failed");
89 return RET_ERR;
90 }
91 bool isPressed = false;
92 for (int32_t i = 0; i < size; i++) {
93 MMI::KeyEvent::KeyItem keyItem;
94 pkt >> data;
95 keyItem.SetKeyCode(data);
96 int64_t datatime = 0;
97 pkt >> datatime;
98 keyItem.SetDownTime(datatime);
99 pkt >> data;
100 keyItem.SetDeviceId(data);
101 pkt >> isPressed;
102 if (pkt.ChkRWError()) {
103 FI_HILOGE("Packet read item isPressed failed");
104 return RET_ERR;
105 }
106 keyItem.SetPressed(isPressed);
107 uint32_t unicode;
108 pkt >> unicode;
109 keyItem.SetUnicode(unicode);
110 key->AddKeyItem(keyItem);
111 }
112 ReadFunctionKeys(pkt, key);
113 return RET_OK;
114 }
115
ReadFunctionKeys(NetPacket & pkt,std::shared_ptr<MMI::KeyEvent> key)116 void InputEventSerialization::ReadFunctionKeys(NetPacket &pkt, std::shared_ptr<MMI::KeyEvent> key)
117 {
118 CHKPV(key);
119 bool state = false;
120 pkt >> state;
121 key->SetFunctionKey(MMI::KeyEvent::NUM_LOCK_FUNCTION_KEY, state);
122 pkt >> state;
123 key->SetFunctionKey(MMI::KeyEvent::CAPS_LOCK_FUNCTION_KEY, state);
124 pkt >> state;
125 key->SetFunctionKey(MMI::KeyEvent::SCROLL_LOCK_FUNCTION_KEY, state);
126 }
127
SwitchEventToNetPacket(const std::shared_ptr<MMI::SwitchEvent> swEvent,NetPacket & pkt)128 int32_t InputEventSerialization::SwitchEventToNetPacket(
129 const std::shared_ptr<MMI::SwitchEvent> swEvent, NetPacket &pkt)
130 {
131 if (SerializeInputEvent(swEvent, pkt) != RET_OK) {
132 FI_HILOGE("Serialize input event failed");
133 return RET_ERR;
134 }
135 pkt << swEvent->GetSwitchValue() << swEvent->GetSwitchMask();
136 if (pkt.ChkRWError()) {
137 FI_HILOGE("Packet write key event failed");
138 return RET_ERR;
139 }
140 return RET_OK;
141 }
142
NetPacketToSwitchEvent(NetPacket & pkt,std::shared_ptr<MMI::SwitchEvent> swEvent)143 int32_t InputEventSerialization::NetPacketToSwitchEvent(NetPacket &pkt, std::shared_ptr<MMI::SwitchEvent> swEvent)
144 {
145 if (DeserializeInputEvent(pkt, swEvent) != RET_OK) {
146 FI_HILOGE("Deserialize input event failed");
147 return RET_ERR;
148 }
149 int32_t data = 0;
150 pkt >> data;
151 swEvent->SetSwitchValue(data);
152 pkt >> data;
153 swEvent->SetSwitchMask(data);
154 return RET_OK;
155 }
156
SerializeInputEvent(std::shared_ptr<MMI::InputEvent> event,NetPacket & pkt)157 int32_t InputEventSerialization::SerializeInputEvent(std::shared_ptr<MMI::InputEvent> event, NetPacket &pkt)
158 {
159 CHKPR(event, ERROR_NULL_POINTER);
160 pkt << event->GetEventType() << event->GetId() << event->GetActionTime()
161 << event->GetAction() << event->GetActionStartTime() << event->GetSensorInputTime() << event->GetDeviceId()
162 << event->GetTargetDisplayId() << event->GetTargetWindowId()
163 << event->GetAgentWindowId() << event->GetFlag();
164 if (pkt.ChkRWError()) {
165 FI_HILOGE("Serialize packet is failed");
166 return RET_ERR;
167 }
168 return RET_OK;
169 }
170
DeserializeInputEvent(NetPacket & pkt,std::shared_ptr<MMI::InputEvent> event)171 int32_t InputEventSerialization::DeserializeInputEvent(NetPacket &pkt, std::shared_ptr<MMI::InputEvent> event)
172 {
173 CHKPR(event, ERROR_NULL_POINTER);
174 int32_t tField = 0;
175 pkt >> tField;
176 pkt >> tField;
177 event->SetId(tField);
178 int64_t rField = 0;
179 pkt >> rField;
180 event->SetActionTime(rField);
181 pkt >> tField;
182 event->SetAction(tField);
183 pkt >> rField;
184 event->SetActionStartTime(rField);
185 uint64_t sensorTime;
186 pkt >> sensorTime;
187 event->SetSensorInputTime(sensorTime);
188 pkt >> tField;
189 event->SetDeviceId(tField);
190 pkt >> tField;
191 event->SetTargetDisplayId(tField);
192 pkt >> tField;
193 event->SetTargetWindowId(tField);
194 pkt >> tField;
195 event->SetAgentWindowId(tField);
196 uint32_t tFlag = MMI::InputEvent::EVENT_FLAG_NONE;
197 pkt >> tFlag;
198 if (pkt.ChkRWError()) {
199 FI_HILOGE("Deserialize packet is failed");
200 return RET_ERR;
201 }
202 event->AddFlag(tFlag);
203 return RET_OK;
204 }
205
SerializeBaseInfo(std::shared_ptr<MMI::PointerEvent> event,NetPacket & pkt)206 int32_t InputEventSerialization::SerializeBaseInfo(std::shared_ptr<MMI::PointerEvent> event, NetPacket &pkt)
207 {
208 int32_t pointerAction = event->GetPointerAction();
209 int32_t pointerId = event->GetPointerId();
210 int32_t sourceType = event->GetSourceType();
211 int32_t btnId = event->GetButtonId();
212 int32_t fingerCnt = event->GetFingerCount();
213 float zOrder = event->GetZOrder();
214
215 pkt << pointerAction << pointerId << sourceType << btnId << fingerCnt << zOrder;
216 if (pkt.ChkRWError()) {
217 FI_HILOGE("Failed to serialize base information of pointer event");
218 return RET_ERR;
219 }
220 return RET_OK;
221 }
222
DeserializeBaseInfo(NetPacket & pkt,std::shared_ptr<MMI::PointerEvent> event)223 int32_t InputEventSerialization::DeserializeBaseInfo(NetPacket &pkt, std::shared_ptr<MMI::PointerEvent> event)
224 {
225 int32_t pointerAction {};
226 int32_t pointerId {};
227 int32_t sourceType {};
228 int32_t btnId {};
229 int32_t fingerCnt {};
230 float zOrder {};
231
232 pkt >> pointerAction >> pointerId >> sourceType >> btnId >> fingerCnt >> zOrder;
233 if (pkt.ChkRWError()) {
234 FI_HILOGE("Failed to deserialize base information of pointer event");
235 return RET_ERR;
236 }
237 event->SetPointerAction(pointerAction);
238 event->SetPointerId(pointerId);
239 event->SetSourceType(sourceType);
240 event->SetButtonId(btnId);
241 event->SetFingerCount(fingerCnt);
242 event->SetZOrder(zOrder);
243 return RET_OK;
244 }
245
SerializeAxes(std::shared_ptr<MMI::PointerEvent> event,NetPacket & pkt)246 int32_t InputEventSerialization::SerializeAxes(std::shared_ptr<MMI::PointerEvent> event, NetPacket &pkt)
247 {
248 uint32_t axes = event->GetAxes();
249 pkt << axes;
250
251 for (int32_t i = MMI::PointerEvent::AXIS_TYPE_UNKNOWN; i < MMI::PointerEvent::AXIS_TYPE_MAX; ++i) {
252 if (event->HasAxis(static_cast<MMI::PointerEvent::AxisType>(i))) {
253 double axisValue = event->GetAxisValue(static_cast<MMI::PointerEvent::AxisType>(i));
254 pkt << axisValue;
255 }
256 }
257 if (pkt.ChkRWError()) {
258 FI_HILOGE("Failed to serialize axes");
259 return RET_ERR;
260 }
261 return RET_OK;
262 }
263
DeserializeAxes(NetPacket & pkt,std::shared_ptr<MMI::PointerEvent> event)264 int32_t InputEventSerialization::DeserializeAxes(NetPacket &pkt, std::shared_ptr<MMI::PointerEvent> event)
265 {
266 uint32_t axes {};
267 double axisValue {};
268
269 pkt >> axes;
270
271 for (int32_t i = MMI::PointerEvent::AXIS_TYPE_UNKNOWN; i < MMI::PointerEvent::AXIS_TYPE_MAX; ++i) {
272 if (MMI::PointerEvent::HasAxis(axes, static_cast<MMI::PointerEvent::AxisType>(i))) {
273 pkt >> axisValue;
274 event->SetAxisValue(static_cast<MMI::PointerEvent::AxisType>(i), axisValue);
275 }
276 }
277 if (pkt.ChkRWError()) {
278 FI_HILOGE("Failed to deserialize axes");
279 return RET_ERR;
280 }
281 return RET_OK;
282 }
283
SerializePressedButtons(std::shared_ptr<MMI::PointerEvent> event,NetPacket & pkt)284 int32_t InputEventSerialization::SerializePressedButtons(std::shared_ptr<MMI::PointerEvent> event, NetPacket &pkt)
285 {
286 std::set<int32_t> pressedBtns = event->GetPressedButtons();
287 std::set<int32_t>::size_type nPressed = pressedBtns.size();
288 if (nPressed >= MAX_N_PRESSED_BUTTONS) {
289 FI_HILOGE("Exceed maximum allowed number of pressed buttons");
290 return RET_ERR;
291 }
292 pkt << nPressed;
293 for (int32_t btnId : pressedBtns) {
294 pkt << btnId;
295 }
296 if (pkt.ChkRWError()) {
297 FI_HILOGE("Failed to serialize pressed buttons");
298 return RET_ERR;
299 }
300 return RET_OK;
301 }
302
DeserializePressedButtons(NetPacket & pkt,std::shared_ptr<MMI::PointerEvent> event)303 int32_t InputEventSerialization::DeserializePressedButtons(NetPacket &pkt, std::shared_ptr<MMI::PointerEvent> event)
304 {
305 std::set<int32_t>::size_type nPressed;
306 int32_t btnId {};
307
308 pkt >> nPressed;
309 if (nPressed >= MAX_N_PRESSED_BUTTONS) {
310 FI_HILOGE("Exceed maximum allowed number of pressed buttons");
311 return RET_ERR;
312 }
313 for (; nPressed > 0; --nPressed) {
314 pkt >> btnId;
315 event->SetButtonPressed(btnId);
316 }
317 if (pkt.ChkRWError()) {
318 FI_HILOGE("Failed to deserialize pressed buttons");
319 return RET_ERR;
320 }
321 return RET_OK;
322 }
323
SerializePointerItem(NetPacket & pkt,MMI::PointerEvent::PointerItem & item)324 int32_t InputEventSerialization::SerializePointerItem(NetPacket &pkt, MMI::PointerEvent::PointerItem &item)
325 {
326 InnerPointerItem innerItem;
327 InnerPointerItem::Transform(item, innerItem);
328 pkt << innerItem;
329 if (pkt.ChkRWError()) {
330 FI_HILOGE("Failed to serialize pointer item");
331 return RET_ERR;
332 }
333 return RET_OK;
334 }
335
DeserializePointerItem(NetPacket & pkt,MMI::PointerEvent::PointerItem & item)336 int32_t InputEventSerialization::DeserializePointerItem(NetPacket &pkt, MMI::PointerEvent::PointerItem &item)
337 {
338 InnerPointerItem innerItem;
339 pkt >> innerItem;
340 InnerPointerItem::Transform(innerItem, item);
341 if (pkt.ChkRWError()) {
342 FI_HILOGE("Failed to deserialize pointer item");
343 return RET_ERR;
344 }
345 return RET_OK;
346 }
347
SerializePointers(std::shared_ptr<MMI::PointerEvent> event,NetPacket & pkt)348 int32_t InputEventSerialization::SerializePointers(std::shared_ptr<MMI::PointerEvent> event, NetPacket &pkt)
349 {
350 std::vector<int32_t> pointerIds = event->GetPointerIds();
351 std::vector<int32_t>::size_type nPointers = pointerIds.size();
352 if (nPointers >= MAX_N_PRESSED_BUTTONS) {
353 FI_HILOGE("Exceed maximum allowed number of nPointers");
354 return RET_ERR;
355 }
356 pkt << nPointers;
357
358 for (const auto &pointerId : pointerIds) {
359 MMI::PointerEvent::PointerItem item;
360
361 if (!event->GetPointerItem(pointerId, item)) {
362 FI_HILOGE("Get pointer item failed");
363 return RET_ERR;
364 }
365 if (SerializePointerItem(pkt, item) != RET_OK) {
366 FI_HILOGE("Failed to serialize one pointer item");
367 return RET_ERR;
368 }
369 }
370 if (pkt.ChkRWError()) {
371 FI_HILOGE("Failed to serialize pointers");
372 return RET_ERR;
373 }
374 return RET_OK;
375 }
376
DeserializePointers(NetPacket & pkt,std::shared_ptr<MMI::PointerEvent> event)377 int32_t InputEventSerialization::DeserializePointers(NetPacket &pkt, std::shared_ptr<MMI::PointerEvent> event)
378 {
379 std::vector<int32_t>::size_type nPointers;
380 pkt >> nPointers;
381 if (nPointers >= MAX_N_PRESSED_BUTTONS) {
382 FI_HILOGE("Exceed maximum allowed number of nPointers");
383 return RET_ERR;
384 }
385 for (; nPointers > 0; --nPointers) {
386 MMI::PointerEvent::PointerItem item;
387
388 if (DeserializePointerItem(pkt, item) != RET_OK) {
389 FI_HILOGE("Failed to deserialize one pointer item");
390 return RET_ERR;
391 }
392 event->AddPointerItem(item);
393 }
394 if (pkt.ChkRWError()) {
395 FI_HILOGE("Failed to deserialize pointers");
396 return RET_ERR;
397 }
398 return RET_OK;
399 }
400
SerializePressedKeys(std::shared_ptr<MMI::PointerEvent> event,NetPacket & pkt)401 int32_t InputEventSerialization::SerializePressedKeys(std::shared_ptr<MMI::PointerEvent> event, NetPacket &pkt)
402 {
403 std::vector<int32_t> pressedKeys = event->GetPressedKeys();
404 std::vector<int32_t>::size_type nPressed = pressedKeys.size();
405
406 pkt << nPressed;
407
408 for (std::vector<int32_t>::size_type i = 0; i < nPressed; ++i) {
409 int32_t keyCode = pressedKeys[i];
410 pkt << keyCode;
411 }
412 if (pkt.ChkRWError()) {
413 FI_HILOGE("Failed to serialize pressed keys");
414 return RET_ERR;
415 }
416 return RET_OK;
417 }
418
DeserializePressedKeys(NetPacket & pkt,std::shared_ptr<MMI::PointerEvent> event)419 int32_t InputEventSerialization::DeserializePressedKeys(NetPacket &pkt, std::shared_ptr<MMI::PointerEvent> event)
420 {
421 std::vector<int32_t>::size_type nPressed {};
422 pkt >> nPressed;
423
424 std::vector<int32_t> pressedKeys;
425 int32_t keyCode {};
426
427 for (; nPressed > 0; --nPressed) {
428 pkt >> keyCode;
429 pressedKeys.push_back(keyCode);
430 }
431 if (pkt.ChkRWError()) {
432 FI_HILOGE("Failed to deserialize pressed keys");
433 return RET_ERR;
434 }
435 event->SetPressedKeys(pressedKeys);
436 return RET_OK;
437 }
438
SerializeBuffer(std::shared_ptr<MMI::PointerEvent> event,NetPacket & pkt)439 int32_t InputEventSerialization::SerializeBuffer(std::shared_ptr<MMI::PointerEvent> event, NetPacket &pkt)
440 {
441 std::vector<uint8_t> buffer = event->GetBuffer();
442 if (buffer.size() > MMI::ExtraData::MAX_BUFFER_SIZE) {
443 FI_HILOGE("buffer is oversize:%{public}zu", buffer.size());
444 return RET_ERR;
445 }
446 std::vector<uint8_t>::size_type bufSize = buffer.size();
447 pkt << bufSize;
448
449 for (std::vector<uint8_t>::size_type i = 0; i < bufSize; ++i) {
450 uint8_t item = buffer[i];
451 pkt << item;
452 }
453 if (pkt.ChkRWError()) {
454 FI_HILOGE("Failed to serialize buffer");
455 return RET_ERR;
456 }
457 return RET_OK;
458 }
459
HeartBeatMarshalling(NetPacket & pkt)460 int32_t InputEventSerialization::HeartBeatMarshalling(NetPacket &pkt)
461 {
462 CALL_DEBUG_ENTER;
463 pkt << HEART_BEAT_PACKET;
464 if (pkt.ChkRWError()) {
465 FI_HILOGE("Serialize packet is failed");
466 return RET_ERR;
467 }
468 return RET_OK;
469 }
470
DeserializeBuffer(NetPacket & pkt,std::shared_ptr<MMI::PointerEvent> event)471 int32_t InputEventSerialization::DeserializeBuffer(NetPacket &pkt, std::shared_ptr<MMI::PointerEvent> event)
472 {
473 std::vector<uint8_t>::size_type bufSize {};
474 pkt >> bufSize;
475
476 std::vector<uint8_t> buffer;
477 uint8_t item {};
478
479 for (; bufSize > 0; --bufSize) {
480 pkt >> item;
481 buffer.push_back(item);
482 }
483 if (pkt.ChkRWError()) {
484 FI_HILOGE("Failed to deserialize buffer");
485 return RET_ERR;
486 }
487 event->SetBuffer(buffer);
488 return RET_OK;
489 }
490
SerializeInterceptorTime(int64_t interceptorTime,NetPacket & pkt)491 int32_t InputEventSerialization::SerializeInterceptorTime(int64_t interceptorTime, NetPacket &pkt)
492 {
493 pkt << interceptorTime;
494
495 if (pkt.ChkRWError()) {
496 FI_HILOGE("Failed to serialize interceptor time");
497 return RET_ERR;
498 }
499 return RET_OK;
500 }
501
DeserializeInterceptorTime(NetPacket & pkt,int64_t & interceptorTime)502 int32_t InputEventSerialization::DeserializeInterceptorTime(NetPacket &pkt, int64_t &interceptorTime)
503 {
504 pkt >> interceptorTime;
505 if (pkt.ChkRWError()) {
506 FI_HILOGE("Failed to deserialize interceptor time");
507 interceptorTime = -1;
508 return RET_ERR;
509 }
510 return RET_OK;
511 }
512
Marshalling(std::shared_ptr<MMI::PointerEvent> event,NetPacket & pkt,int64_t interceptorTime)513 int32_t InputEventSerialization::Marshalling(std::shared_ptr<MMI::PointerEvent> event, NetPacket &pkt,
514 int64_t interceptorTime)
515 {
516 CALL_DEBUG_ENTER;
517 CHKPR(event, ERROR_NULL_POINTER);
518
519 if (SerializeInputEvent(event, pkt) != RET_OK) {
520 FI_HILOGE("Serialize input event failed");
521 return RET_ERR;
522 }
523 if (SerializeBaseInfo(event, pkt) != RET_OK) {
524 FI_HILOGE("Failed to serialize base information of pointer event");
525 return RET_ERR;
526 }
527 if (SerializeAxes(event, pkt) != RET_OK) {
528 FI_HILOGE("Failed to serialize axes");
529 return RET_ERR;
530 }
531 if (SerializePressedButtons(event, pkt) != RET_OK) {
532 FI_HILOGE("Failed to serialize pressed buttons");
533 return RET_ERR;
534 }
535 if (SerializePointers(event, pkt) != RET_OK) {
536 FI_HILOGE("Failed to serialize pointers");
537 return RET_ERR;
538 }
539 if (SerializePressedKeys(event, pkt) != RET_OK) {
540 FI_HILOGE("Failed to serialize pressed keys");
541 return RET_ERR;
542 }
543 if (SerializeBuffer(event, pkt) != RET_OK) {
544 FI_HILOGE("Failed to serialize buffer");
545 return RET_ERR;
546 }
547 if (SerializeInterceptorTime(interceptorTime, pkt)) {
548 FI_HILOGE("Failed to serialize interceptorTime");
549 return RET_ERR;
550 }
551 return RET_OK;
552 }
553
Unmarshalling(NetPacket & pkt,std::shared_ptr<MMI::PointerEvent> event,int64_t & interceptorTime)554 int32_t InputEventSerialization::Unmarshalling(NetPacket &pkt, std::shared_ptr<MMI::PointerEvent> event,
555 int64_t &interceptorTime)
556 {
557 CALL_DEBUG_ENTER;
558 CHKPR(event, ERROR_NULL_POINTER);
559
560 if (DeserializeInputEvent(pkt, event) != RET_OK) {
561 FI_HILOGE("Failed to deserialize input event");
562 return RET_ERR;
563 }
564 if (DeserializeBaseInfo(pkt, event) != RET_OK) {
565 FI_HILOGE("Failed to deserialize base information of pointer event");
566 return RET_ERR;
567 }
568 if (DeserializeAxes(pkt, event) != RET_OK) {
569 FI_HILOGE("Failed to deserialize axes");
570 return RET_ERR;
571 }
572 if (DeserializePressedButtons(pkt, event) != RET_OK) {
573 FI_HILOGE("Failed to deserialize pressed buttons");
574 return RET_ERR;
575 }
576 if (DeserializePointers(pkt, event) != RET_OK) {
577 FI_HILOGE("Failed to deserialize pointers");
578 return RET_ERR;
579 }
580 if (DeserializePressedKeys(pkt, event) != RET_OK) {
581 FI_HILOGE("Failed to deserialize pressed keys");
582 return RET_ERR;
583 }
584 if (DeserializeBuffer(pkt, event) != RET_OK) {
585 FI_HILOGE("Failed to deserialize buffer");
586 return RET_ERR;
587 }
588 if (DeserializeInterceptorTime(pkt, interceptorTime) != RET_OK) {
589 FI_HILOGE("Failed to deserialize interceptorTime");
590 }
591 return RET_OK;
592 }
593
594 #ifdef OHOS_BUILD_ENABLE_SECURITY_PART
MarshallingEnhanceData(std::shared_ptr<MMI::PointerEvent> event,NetPacket & pkt)595 int32_t InputEventSerialization::MarshallingEnhanceData(std::shared_ptr<MMI::PointerEvent> event, NetPacket &pkt)
596 {
597 CHKPR(event, ERROR_NULL_POINTER);
598 int32_t pointerId = event->GetPointerId();
599 MMI::PointerEvent::PointerItem pointerItem;
600 if (!event->GetPointerItem(pointerId, pointerItem)) {
601 FI_HILOGE("Can't find pointer item, pointer:%{public}d", pointerId);
602 return RET_ERR;
603 }
604 SecCompPointEvent *secCompPointEvent = static_cast<SecCompPointEvent*>(malloc(sizeof(SecCompPointEvent)));
605 if (secCompPointEvent == NULL) {
606 FI_HILOGE("Malloc failed");
607 return RET_ERR;
608 }
609 secCompPointEvent->touchX = pointerItem.GetDisplayX();
610 secCompPointEvent->touchY = pointerItem.GetDisplayY();
611 secCompPointEvent->timeStamp = event->GetActionTime();
612 uint32_t dataLen = sizeof(*secCompPointEvent);
613 uint8_t outBuf[MAX_HMAC_SIZE] = { 0 };
614 uint8_t* enHanceData = reinterpret_cast<uint8_t *>(&outBuf[0]);
615 uint32_t enHanceDataLen = MAX_HMAC_SIZE;
616 int32_t result = Security::SecurityComponent::SecCompEnhanceKit::GetPointerEventEnhanceData(secCompPointEvent,
617 dataLen, enHanceData, enHanceDataLen);
618 if (result != 0 || enHanceDataLen > MAX_HMAC_SIZE) {
619 pkt << 0;
620 free(secCompPointEvent);
621 secCompPointEvent = nullptr;
622 FI_HILOGD("GetPointerEventEnhanceData failed!");
623 return RET_ERR;
624 }
625 pkt << enHanceDataLen;
626 std::vector<uint8_t> realBuf;
627 for (size_t i = 0; i < enHanceDataLen; i++) {
628 realBuf.push_back(enHanceData[i]);
629 pkt << realBuf[i];
630 }
631 free(secCompPointEvent);
632 secCompPointEvent = nullptr;
633 if (pkt.ChkRWError()) {
634 FI_HILOGE("Marshalling enhanceData failed");
635 return RET_ERR;
636 }
637 return RET_OK;
638 }
639
UnmarshallingEnhanceData(NetPacket & pkt,std::shared_ptr<MMI::PointerEvent> event)640 int32_t InputEventSerialization::UnmarshallingEnhanceData(NetPacket &pkt, std::shared_ptr<MMI::PointerEvent> event)
641 {
642 uint32_t enHanceDataLen;
643 pkt >> enHanceDataLen;
644 if (enHanceDataLen == 0) {
645 return RET_OK;
646 }
647 uint8_t enhanceDataBuf[enHanceDataLen];
648 std::vector<uint8_t> enhanceData;
649 for (size_t i = 0; i < enHanceDataLen; i++) {
650 pkt >> enhanceDataBuf[i];
651 enhanceData.push_back(enhanceDataBuf[i]);
652 }
653 if (pkt.ChkRWError()) {
654 FI_HILOGE("UnmarshallingEnhanceData pointer event failed");
655 return RET_ERR;
656 }
657 event->SetEnhanceData(enhanceData);
658 return RET_OK;
659 }
660
661 struct keyEventEnhanceData {
662 int64_t timestamp;
663 int32_t keyCode;
664 };
665
MarshallingEnhanceData(std::shared_ptr<MMI::KeyEvent> event,NetPacket & pkt)666 int32_t InputEventSerialization::MarshallingEnhanceData(std::shared_ptr<MMI::KeyEvent> event, NetPacket &pkt)
667 {
668 CHKPR(event, ERROR_NULL_POINTER);
669 struct keyEventEnhanceData secCompKeyEvent;
670 secCompKeyEvent.timestamp = event->GetActionTime();
671 secCompKeyEvent.keyCode = event->GetKeyCode();
672 uint32_t dataLen = sizeof(secCompKeyEvent);
673 uint8_t outBuf[MAX_HMAC_SIZE] = { 0 };
674 uint8_t* enHanceData = reinterpret_cast<uint8_t *>(&outBuf[0]);
675 uint32_t enHanceDataLen = MAX_HMAC_SIZE;
676 int32_t result = Security::SecurityComponent::SecCompEnhanceKit::GetPointerEventEnhanceData(&secCompKeyEvent,
677 dataLen, enHanceData, enHanceDataLen);
678 if (result != 0 || enHanceDataLen > MAX_HMAC_SIZE) {
679 pkt << 0;
680 FI_HILOGD("GetKeyEventEnhanceData failed!");
681 return RET_ERR;
682 }
683 pkt << enHanceDataLen;
684 std::vector<uint8_t> realBuf;
685 for (size_t i = 0; i < enHanceDataLen; i++) {
686 realBuf.push_back(enHanceData[i]);
687 pkt << realBuf[i];
688 }
689 if (pkt.ChkRWError()) {
690 FI_HILOGE("Marshalling enhanceData failed");
691 return RET_ERR;
692 }
693 return RET_OK;
694 }
695
UnmarshallingEnhanceData(NetPacket & pkt,std::shared_ptr<MMI::KeyEvent> event)696 int32_t InputEventSerialization::UnmarshallingEnhanceData(NetPacket &pkt, std::shared_ptr<MMI::KeyEvent> event)
697 {
698 uint32_t enHanceDataLen;
699 pkt >> enHanceDataLen;
700 if (enHanceDataLen == 0 || enHanceDataLen > MAX_HMAC_SIZE) {
701 return RET_OK;
702 }
703 uint8_t enhanceDataBuf[enHanceDataLen];
704 std::vector<uint8_t> enhanceData;
705 for (size_t i = 0; i < enHanceDataLen; i++) {
706 pkt >> enhanceDataBuf[i];
707 enhanceData.push_back(enhanceDataBuf[i]);
708 }
709 if (pkt.ChkRWError()) {
710 FI_HILOGE("UnmarshallingEnhanceData key event failed");
711 return RET_ERR;
712 }
713 event->SetEnhanceData(enhanceData);
714 return RET_OK;
715 }
716 #endif // OHOS_BUILD_ENABLE_SECURITY_PART
717 } // namespace Cooperate
718 } // namespace DeviceStatus
719 } // namespace Msdp
720 } // namespace OHOS
721