1 /*
2 * Copyright (c) 2021-2022 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_data_transformation.h"
17 #include "define_multimodal.h"
18
19 namespace OHOS {
20 namespace MMI {
KeyEventToNetPacket(const std::shared_ptr<KeyEvent> key,NetPacket & pkt)21 int32_t InputEventDataTransformation::KeyEventToNetPacket(
22 const std::shared_ptr<KeyEvent> key, NetPacket &pkt)
23 {
24 CHKR((RET_OK == SerializeInputEvent(key, pkt)), STREAM_BUF_WRITE_FAIL, RET_ERR);
25 CHKR(pkt.Write(key->GetKeyCode()), STREAM_BUF_WRITE_FAIL, RET_ERR);
26 CHKR(pkt.Write(key->GetKeyAction()), STREAM_BUF_WRITE_FAIL, RET_ERR);
27 auto keys = key->GetKeyItems();
28 int32_t size = static_cast<int32_t>(keys.size());
29 CHKR(pkt.Write(size), STREAM_BUF_WRITE_FAIL, RET_ERR);
30 for (const auto &item : keys) {
31 CHKR(pkt.Write(item.GetKeyCode()), STREAM_BUF_WRITE_FAIL, RET_ERR);
32 CHKR(pkt.Write(item.GetDownTime()), STREAM_BUF_WRITE_FAIL, RET_ERR);
33 CHKR(pkt.Write(item.GetDeviceId()), STREAM_BUF_WRITE_FAIL, RET_ERR);
34 CHKR(pkt.Write(item.IsPressed()), STREAM_BUF_WRITE_FAIL, RET_ERR);
35 }
36 return RET_OK;
37 }
38
NetPacketToKeyEvent(NetPacket & pkt,std::shared_ptr<KeyEvent> key)39 int32_t InputEventDataTransformation::NetPacketToKeyEvent(NetPacket &pkt, std::shared_ptr<KeyEvent> key)
40 {
41 CHKR((RET_OK == DeserializeInputEvent(pkt, key)), STREAM_BUF_READ_FAIL, RET_ERR);
42 int32_t data = 0;
43 CHKR(pkt.Read(data), STREAM_BUF_READ_FAIL, RET_ERR);
44 key->SetKeyCode(data);
45 CHKR(pkt.Read(data), STREAM_BUF_READ_FAIL, RET_ERR);
46 key->SetKeyAction(data);
47 int32_t size = 0;
48 CHKR(pkt.Read(size), STREAM_BUF_READ_FAIL, RET_ERR);
49 bool isPressed = false;
50 for (int32_t i = 0; i < size; i++) {
51 KeyEvent::KeyItem keyItem;
52 CHKR(pkt.Read(data), STREAM_BUF_READ_FAIL, RET_ERR);
53 keyItem.SetKeyCode(data);
54 int64_t datatime = 0;
55 CHKR(pkt.Read(datatime), STREAM_BUF_READ_FAIL, RET_ERR);
56 keyItem.SetDownTime(datatime);
57 CHKR(pkt.Read(data), STREAM_BUF_READ_FAIL, RET_ERR);
58 keyItem.SetDeviceId(data);
59 CHKR(pkt.Read(isPressed), STREAM_BUF_READ_FAIL, RET_ERR);
60 keyItem.SetPressed(isPressed);
61 key->AddKeyItem(keyItem);
62 }
63 return RET_OK;
64 }
65
SerializeInputEvent(std::shared_ptr<InputEvent> event,NetPacket & pkt)66 int32_t InputEventDataTransformation::SerializeInputEvent(std::shared_ptr<InputEvent> event, NetPacket &pkt)
67 {
68 CHKPR(event, ERROR_NULL_POINTER);
69 CHKR(pkt.Write(event->GetEventType()), STREAM_BUF_WRITE_FAIL, RET_ERR);
70 CHKR(pkt.Write(event->GetId()), STREAM_BUF_WRITE_FAIL, RET_ERR);
71 CHKR(pkt.Write(event->GetActionTime()), STREAM_BUF_WRITE_FAIL, RET_ERR);
72 CHKR(pkt.Write(event->GetAction()), STREAM_BUF_WRITE_FAIL, RET_ERR);
73 CHKR(pkt.Write(event->GetActionStartTime()), STREAM_BUF_WRITE_FAIL, RET_ERR);
74 CHKR(pkt.Write(event->GetDeviceId()), STREAM_BUF_WRITE_FAIL, RET_ERR);
75 CHKR(pkt.Write(event->GetTargetDisplayId()), STREAM_BUF_WRITE_FAIL, RET_ERR);
76 CHKR(pkt.Write(event->GetTargetWindowId()), STREAM_BUF_WRITE_FAIL, RET_ERR);
77 CHKR(pkt.Write(event->GetAgentWindowId()), STREAM_BUF_WRITE_FAIL, RET_ERR);
78 CHKR(pkt.Write(event->GetFlag()), STREAM_BUF_WRITE_FAIL, RET_ERR);
79 return RET_OK;
80 }
81
DeserializeInputEvent(NetPacket & pkt,std::shared_ptr<InputEvent> event)82 int32_t InputEventDataTransformation::DeserializeInputEvent(NetPacket &pkt, std::shared_ptr<InputEvent> event)
83 {
84 CHKPR(event, ERROR_NULL_POINTER);
85 int32_t tField = 0;
86 CHKR(pkt.Read(tField), STREAM_BUF_READ_FAIL, RET_ERR);
87 CHKR(pkt.Read(tField), STREAM_BUF_READ_FAIL, RET_ERR);
88 event->SetId(tField);
89 int64_t rField = 0;
90 CHKR(pkt.Read(rField), STREAM_BUF_READ_FAIL, RET_ERR);
91 event->SetActionTime(rField);
92 CHKR(pkt.Read(tField), STREAM_BUF_READ_FAIL, RET_ERR);
93 event->SetAction(tField);
94 CHKR(pkt.Read(rField), STREAM_BUF_READ_FAIL, RET_ERR);
95 event->SetActionStartTime(rField);
96 CHKR(pkt.Read(tField), STREAM_BUF_READ_FAIL, RET_ERR);
97 event->SetDeviceId(tField);
98 CHKR(pkt.Read(tField), STREAM_BUF_READ_FAIL, RET_ERR);
99 event->SetTargetDisplayId(tField);
100 CHKR(pkt.Read(tField), STREAM_BUF_READ_FAIL, RET_ERR);
101 event->SetTargetWindowId(tField);
102 CHKR(pkt.Read(tField), STREAM_BUF_READ_FAIL, RET_ERR);
103 event->SetAgentWindowId(tField);
104 uint32_t tFlag = InputEvent::EVENT_FLAG_NONE;
105 CHKR(pkt.Read(tFlag), STREAM_BUF_READ_FAIL, RET_ERR);
106 event->AddFlag(tFlag);
107 return RET_OK;
108 }
109
Marshalling(std::shared_ptr<PointerEvent> event,NetPacket & pkt)110 int32_t InputEventDataTransformation::Marshalling(std::shared_ptr<PointerEvent> event, NetPacket &pkt)
111 {
112 CHKPR(event, ERROR_NULL_POINTER);
113 CHKR((RET_OK == SerializeInputEvent(event, pkt)), STREAM_BUF_WRITE_FAIL, RET_ERR);
114
115 CHKR(pkt.Write(event->GetPointerAction()), STREAM_BUF_WRITE_FAIL, RET_ERR);
116 CHKR(pkt.Write(event->GetPointerId()), STREAM_BUF_WRITE_FAIL, RET_ERR);
117 CHKR(pkt.Write(event->GetSourceType()), STREAM_BUF_WRITE_FAIL, RET_ERR);
118 CHKR(pkt.Write(event->GetButtonId()), STREAM_BUF_WRITE_FAIL, RET_ERR);
119 CHKR(pkt.Write(event->GetAxes()), STREAM_BUF_WRITE_FAIL, RET_ERR);
120 if (event->HasAxis(PointerEvent::AXIS_TYPE_SCROLL_VERTICAL)) {
121 CHKR(pkt.Write(event->GetAxisValue(PointerEvent::AXIS_TYPE_SCROLL_VERTICAL)),
122 STREAM_BUF_WRITE_FAIL, RET_ERR);
123 }
124 if (event->HasAxis(PointerEvent::AXIS_TYPE_SCROLL_HORIZONTAL)) {
125 CHKR(pkt.Write(event->GetAxisValue(PointerEvent::AXIS_TYPE_SCROLL_HORIZONTAL)),
126 STREAM_BUF_WRITE_FAIL, RET_ERR);
127 }
128 if (event->HasAxis(PointerEvent::AXIS_TYPE_PINCH)) {
129 CHKR(pkt.Write(event->GetAxisValue(PointerEvent::AXIS_TYPE_PINCH)),
130 STREAM_BUF_WRITE_FAIL, RET_ERR);
131 }
132
133 std::set<int32_t> pressedBtns { event->GetPressedButtons() };
134 CHKR(pkt.Write(pressedBtns.size()), STREAM_BUF_WRITE_FAIL, RET_ERR);
135 for (int32_t btnId : pressedBtns) {
136 CHKR(pkt.Write(btnId), STREAM_BUF_WRITE_FAIL, RET_ERR);
137 }
138
139 std::vector<int32_t> pointerIds { event->GetPointersIdList() };
140 CHKR(pkt.Write(pointerIds.size()), STREAM_BUF_WRITE_FAIL, RET_ERR);
141
142 for (const auto &pointerId : pointerIds) {
143 PointerEvent::PointerItem item;
144 CHKR(event->GetPointerItem(pointerId, item), PARAM_INPUT_FAIL, RET_ERR);
145
146 CHKR(pkt.Write(pointerId), STREAM_BUF_WRITE_FAIL, RET_ERR);
147 CHKR(pkt.Write(item.GetDownTime()), STREAM_BUF_WRITE_FAIL, RET_ERR);
148 CHKR(pkt.Write(static_cast<int32_t>(item.IsPressed())), STREAM_BUF_WRITE_FAIL, RET_ERR);
149 CHKR(pkt.Write(item.GetGlobalX()), STREAM_BUF_WRITE_FAIL, RET_ERR);
150 CHKR(pkt.Write(item.GetGlobalY()), STREAM_BUF_WRITE_FAIL, RET_ERR);
151 CHKR(pkt.Write(item.GetLocalX()), STREAM_BUF_WRITE_FAIL, RET_ERR);
152 CHKR(pkt.Write(item.GetLocalY()), STREAM_BUF_WRITE_FAIL, RET_ERR);
153 CHKR(pkt.Write(item.GetWidth()), STREAM_BUF_WRITE_FAIL, RET_ERR);
154 CHKR(pkt.Write(item.GetHeight()), STREAM_BUF_WRITE_FAIL, RET_ERR);
155 CHKR(pkt.Write(item.GetPressure()), STREAM_BUF_WRITE_FAIL, RET_ERR);
156 CHKR(pkt.Write(item.GetDeviceId()), STREAM_BUF_WRITE_FAIL, RET_ERR);
157 }
158
159 std::vector<int32_t> pressedKeys = event->GetPressedKeys();
160 CHKR(pkt.Write(pressedKeys.size()), STREAM_BUF_WRITE_FAIL, RET_ERR);
161 for (const auto &keyCode : pressedKeys) {
162 CHKR(pkt.Write(keyCode), STREAM_BUF_WRITE_FAIL, RET_ERR);
163 }
164 return RET_OK;
165 }
166
Unmarshalling(NetPacket & pkt,std::shared_ptr<PointerEvent> event)167 int32_t InputEventDataTransformation::Unmarshalling(NetPacket &pkt, std::shared_ptr<PointerEvent> event)
168 {
169 CHKR((RET_OK == DeserializeInputEvent(pkt, event)),
170 STREAM_BUF_READ_FAIL, RET_ERR);
171
172 int32_t tField { };
173 CHKR(pkt.Read(tField), STREAM_BUF_READ_FAIL, RET_ERR);
174 event->SetPointerAction(tField);
175 CHKR(pkt.Read(tField), STREAM_BUF_READ_FAIL, RET_ERR);
176 event->SetPointerId(tField);
177 CHKR(pkt.Read(tField), STREAM_BUF_READ_FAIL, RET_ERR);
178 event->SetSourceType(tField);
179 CHKR(pkt.Read(tField), STREAM_BUF_READ_FAIL, RET_ERR);
180 event->SetButtonId(tField);
181 CHKR(pkt.Read(tField), STREAM_BUF_READ_FAIL, RET_ERR);
182 double axisValue { };
183 if (PointerEvent::HasAxis(tField, PointerEvent::AXIS_TYPE_SCROLL_VERTICAL)) {
184 CHKR(pkt.Read(axisValue), STREAM_BUF_READ_FAIL, RET_ERR);
185 event->SetAxisValue(PointerEvent::AXIS_TYPE_SCROLL_VERTICAL, axisValue);
186 }
187 if (PointerEvent::HasAxis(tField, PointerEvent::AXIS_TYPE_SCROLL_HORIZONTAL)) {
188 CHKR(pkt.Read(axisValue), STREAM_BUF_READ_FAIL, RET_ERR);
189 event->SetAxisValue(PointerEvent::AXIS_TYPE_SCROLL_HORIZONTAL, axisValue);
190 }
191 if (PointerEvent::HasAxis(tField, PointerEvent::AXIS_TYPE_PINCH)) {
192 CHKR(pkt.Read(axisValue), STREAM_BUF_READ_FAIL, RET_ERR);
193 event->SetAxisValue(PointerEvent::AXIS_TYPE_PINCH, axisValue);
194 }
195
196 std::set<int32_t>::size_type nPressed { };
197 CHKR(pkt.Read(nPressed), STREAM_BUF_READ_FAIL, RET_ERR);
198 while (nPressed-- > 0) {
199 CHKR(pkt.Read(tField), STREAM_BUF_READ_FAIL, RET_ERR);
200 event->SetButtonPressed(tField);
201 }
202
203 std::vector<int32_t>::size_type pointerCnt { };
204 CHKR(pkt.Read(pointerCnt), STREAM_BUF_READ_FAIL, RET_ERR);
205
206 while (pointerCnt-- > 0) {
207 PointerEvent::PointerItem item;
208 CHKR((RET_OK == DeserializePointerItem(pkt, item)), STREAM_BUF_READ_FAIL, RET_ERR);
209 event->AddPointerItem(item);
210 }
211
212 std::vector<int32_t> pressedKeys;
213 std::vector<int32_t>::size_type pressedKeySize = 0;
214 CHKR(pkt.Read(pressedKeySize), STREAM_BUF_READ_FAIL, RET_ERR);
215 while (pressedKeySize-- > 0) {
216 CHKR(pkt.Read(tField), STREAM_BUF_READ_FAIL, RET_ERR);
217 pressedKeys.push_back(tField);
218 }
219 event->SetPressedKeys(pressedKeys);
220 return RET_OK;
221 }
222
DeserializePointerItem(NetPacket & pkt,PointerEvent::PointerItem & item)223 int32_t InputEventDataTransformation::DeserializePointerItem(NetPacket &pkt, PointerEvent::PointerItem &item)
224 {
225 int32_t tField { };
226 CHKR(pkt.Read(tField), STREAM_BUF_READ_FAIL, RET_ERR);
227 item.SetPointerId(tField);
228 int64_t rField = 0;
229 CHKR(pkt.Read(rField), STREAM_BUF_READ_FAIL, RET_ERR);
230 item.SetDownTime(rField);
231 CHKR(pkt.Read(tField), STREAM_BUF_READ_FAIL, RET_ERR);
232 item.SetPressed(static_cast<bool>(tField));
233 CHKR(pkt.Read(tField), STREAM_BUF_READ_FAIL, RET_ERR);
234 item.SetGlobalX(tField);
235 CHKR(pkt.Read(tField), STREAM_BUF_READ_FAIL, RET_ERR);
236 item.SetGlobalY(tField);
237 CHKR(pkt.Read(tField), STREAM_BUF_READ_FAIL, RET_ERR);
238 item.SetLocalX(tField);
239 CHKR(pkt.Read(tField), STREAM_BUF_READ_FAIL, RET_ERR);
240 item.SetLocalY(tField);
241 CHKR(pkt.Read(tField), STREAM_BUF_READ_FAIL, RET_ERR);
242 item.SetWidth(tField);
243 CHKR(pkt.Read(tField), STREAM_BUF_READ_FAIL, RET_ERR);
244 item.SetHeight(tField);
245 CHKR(pkt.Read(tField), STREAM_BUF_READ_FAIL, RET_ERR);
246 item.SetPressure(tField);
247 CHKR(pkt.Read(tField), STREAM_BUF_READ_FAIL, RET_ERR);
248 item.SetDeviceId(tField);
249 return RET_OK;
250 }
251 } // namespace MMI
252 } // namespace OHOS