• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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