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 #include "node/event_converter.h"
16
17 #include <cstdint>
18
19 #include "native_node.h"
20 #include "node/gesture_impl.h"
21 #include "node/native_compatible.h"
22 #include "node/node_model.h"
23 #include "securec.h"
24
25 #include "base/log/log_wrapper.h"
26 #include "base/error/error_code.h"
27 #include "core/event/touch_event.h"
28 #include "core/interfaces/arkoala/arkoala_api.h"
29 #include "interfaces/native/drag_and_drop.h"
30
31 namespace OHOS::Ace::NodeModel {
32 namespace {
33 constexpr int32_t ORIGIN_TOUCH_ACTION_DOWN = 0;
34 constexpr int32_t ORIGIN_TOUCH_ACTION_UP = 1;
35 constexpr int32_t ORIGIN_TOUCH_ACTION_MOVE = 2;
36 constexpr int32_t ORIGIN_TOUCH_ACTION_CANCEL = 3;
37 constexpr int32_t ORIGIN_INPUT_EVENT_TOOL_TYPE_FINGER = 1;
38 constexpr int32_t ORIGIN_INPUT_EVENT_TOOL_TYPE_PEN = 2;
39 constexpr int32_t ORIGIN_INPUT_EVENT_TOOL_TYPE_MOUSE = 7;
40 constexpr int32_t ORIGIN_INPUT_EVENT_TOOL_TYPE_TOUCHPAD = 9;
41 constexpr int32_t ORIGIN_MOUSE_ACTION_PRESS = 1;
42 constexpr int32_t ORIGIN_MOUSE_ACTION_RELEASE = 2;
43 constexpr int32_t ORIGIN_MOUSE_ACTION_MOVE = 3;
44 constexpr int32_t ORIGIN_MOUSE_BUTTON_LEFT = 1;
45 constexpr int32_t ORIGIN_MOUSE_BUTTON_RIGHT = 2;
46 constexpr int32_t ORIGIN_MOUSE_BUTTON_MIDDLE = 4;
47 constexpr int32_t ORIGIN_MOUSE_BUTTON_BACK = 8;
48 constexpr int32_t ORIGIN_MOUSE_BUTTON_FORWARD = 16;
49
ConvertToOriginEvent(const ArkUITouchEvent & origin,ArkUI_NodeTouchEvent & event)50 void ConvertToOriginEvent(const ArkUITouchEvent& origin, ArkUI_NodeTouchEvent& event)
51 {
52 if (origin.sourceType == UI_INPUT_EVENTT_SOURCE_TYPE_TOUCH_SCREEN) {
53 event.sourceType = NODE_SOURCE_TYPE_TOUCH_SCREEN;
54 } else {
55 event.sourceType = NODE_SOURCE_TYPE_UNKNOWN;
56 }
57 switch (origin.action) {
58 case static_cast<int32_t>(TouchType::DOWN):
59 event.action = NODE_ACTION_DOWN;
60 break;
61 // TouchType::UP
62 case static_cast<int32_t>(TouchType::UP):
63 event.action = NODE_ACTION_UP;
64 break;
65 // TouchType::MOVE
66 case static_cast<int32_t>(TouchType::MOVE):
67 event.action = NODE_ACTION_MOVE;
68 break;
69 case static_cast<int32_t>(TouchType::CANCEL):
70 event.action = NODE_ACTION_CANCEL;
71 break;
72 default:
73 event.action = static_cast<ArkUI_NodeTouchEventAction>(-1);
74 }
75 }
76
ConvertToTouchEvent(const ArkUITouchEvent & origin,ArkUI_NodeTouchEvent & event)77 void ConvertToTouchEvent(const ArkUITouchEvent& origin, ArkUI_NodeTouchEvent& event)
78 {
79 memset_s(&event, sizeof(ArkUI_NodeTouchEvent), 0, sizeof(ArkUI_NodeTouchEvent));
80 event.actionTouch.id = origin.actionTouchPoint.id;
81 event.actionTouch.nodeX = origin.actionTouchPoint.nodeX;
82 event.actionTouch.nodeY = origin.actionTouchPoint.nodeY;
83 event.actionTouch.windowX = origin.actionTouchPoint.windowX;
84 event.actionTouch.windowY = origin.actionTouchPoint.windowY;
85 event.actionTouch.screenX = origin.actionTouchPoint.screenX;
86 event.actionTouch.screenY = origin.actionTouchPoint.screenY;
87 event.actionTouch.contactAreaHeight = origin.actionTouchPoint.contactAreaHeight;
88 event.actionTouch.contactAreaWidth = origin.actionTouchPoint.contactAreaWidth;
89 event.actionTouch.toolHeight = origin.actionTouchPoint.toolHeight;
90 event.actionTouch.toolWidth = origin.actionTouchPoint.toolWidth;
91 event.actionTouch.toolType = static_cast<ArkUI_NodeToolType>(origin.actionTouchPoint.toolType);
92 event.actionTouch.pressure = origin.actionTouchPoint.pressure;
93 event.actionTouch.tiltX = origin.actionTouchPoint.tiltX;
94 event.actionTouch.tiltY = origin.actionTouchPoint.tiltY;
95 event.actionTouch.rawX = origin.actionTouchPoint.rawX;
96 event.actionTouch.rawY = origin.actionTouchPoint.rawY;
97
98 event.timeStamp = origin.timeStamp;
99 ConvertToOriginEvent(origin, event);
100 static ArkUI_Uint32 touchPointSize = origin.touchPointSize;
101 static ArkUITouchPoint* touchPoints = origin.touchPointes;
102 auto getTouchPoints = [](ArkUI_NodeTouchPoint** points) -> ArkUI_Int32 {
103 *points = new ArkUI_NodeTouchPoint[touchPointSize] {};
104 for (uint32_t index = 0; index < touchPointSize; index++) {
105 (*points)[index].id = touchPoints[index].id;
106 (*points)[index].nodeX = touchPoints[index].nodeX;
107 (*points)[index].nodeY = touchPoints[index].nodeY;
108 (*points)[index].windowX = touchPoints[index].windowX;
109 (*points)[index].windowY = touchPoints[index].windowY;
110 (*points)[index].screenX = touchPoints[index].screenX;
111 (*points)[index].screenY = touchPoints[index].screenY;
112 (*points)[index].contactAreaHeight = touchPoints[index].contactAreaHeight;
113 (*points)[index].contactAreaWidth = touchPoints[index].contactAreaWidth;
114 (*points)[index].toolHeight = touchPoints[index].toolHeight;
115 (*points)[index].toolWidth = touchPoints[index].toolWidth;
116 (*points)[index].toolType = static_cast<ArkUI_NodeToolType>(touchPoints[index].toolType);
117 (*points)[index].pressure = touchPoints[index].pressure;
118 (*points)[index].tiltX = touchPoints[index].tiltX;
119 (*points)[index].tiltY = touchPoints[index].tiltY;
120 (*points)[index].rawX = touchPoints[index].rawX;
121 (*points)[index].rawY = touchPoints[index].rawY;
122 }
123 return touchPointSize;
124 };
125 event.getTouches = getTouchPoints;
126 }
127
128 } // namespace
ConvertOriginEventType(ArkUI_NodeEventType type,int32_t nodeType)129 ArkUI_Int32 ConvertOriginEventType(ArkUI_NodeEventType type, int32_t nodeType)
130 {
131 auto arkUINodeType = static_cast<ArkUI_NodeType>(nodeType);
132 switch (type) {
133 case NODE_TEXT_INPUT_ON_CHANGE:
134 return ON_TEXT_INPUT_CHANGE;
135 case NODE_SCROLL_EVENT_ON_SCROLL:
136 if (arkUINodeType == ARKUI_NODE_LIST) {
137 return ON_LIST_SCROLL;
138 }
139 return ON_SCROLL;
140 case NODE_SCROLL_EVENT_ON_SCROLL_FRAME_BEGIN:
141 if (arkUINodeType == ARKUI_NODE_LIST) {
142 return ON_LIST_SCROLL_FRAME_BEGIN;
143 } else if (arkUINodeType == ARKUI_NODE_WATER_FLOW) {
144 return ON_WATER_FLOW_SCROLL_FRAME_BEGIN;
145 }
146 return ON_SCROLL_FRAME_BEGIN;
147 case NODE_SCROLL_EVENT_ON_WILL_SCROLL:
148 return ON_SCROLL_WILL_SCROLL;
149 case NODE_SCROLL_EVENT_ON_DID_SCROLL:
150 return ON_SCROLL_DID_SCROLL;
151 case NODE_SCROLL_EVENT_ON_SCROLL_START:
152 if (arkUINodeType == ARKUI_NODE_LIST) {
153 return ON_LIST_SCROLL_START;
154 } else if (arkUINodeType == ARKUI_NODE_WATER_FLOW) {
155 return ON_WATER_FLOW_SCROLL_START;
156 }
157 return ON_SCROLL_START;
158 case NODE_SCROLL_EVENT_ON_SCROLL_STOP:
159 if (arkUINodeType == ARKUI_NODE_LIST) {
160 return ON_LIST_SCROLL_STOP;
161 } else if (arkUINodeType == ARKUI_NODE_WATER_FLOW) {
162 return ON_WATER_FLOW_SCROLL_STOP;
163 }
164 return ON_SCROLL_STOP;
165 case NODE_EVENT_ON_APPEAR:
166 return ON_APPEAR;
167 case NODE_EVENT_ON_DISAPPEAR:
168 return ON_DISAPPEAR;
169 case NODE_EVENT_ON_AREA_CHANGE:
170 return ON_AREA_CHANGE;
171 case NODE_TEXT_AREA_ON_CHANGE:
172 return ON_TEXTAREA_CHANGE;
173 case NODE_ON_FOCUS:
174 return ON_FOCUS;
175 case NODE_ON_BLUR:
176 return ON_BLUR;
177 case NODE_TEXT_INPUT_ON_SUBMIT:
178 return ON_TEXT_INPUT_SUBMIT;
179 case NODE_REFRESH_STATE_CHANGE:
180 return ON_REFRESH_STATE_CHANGE;
181 case NODE_REFRESH_ON_REFRESH:
182 return ON_REFRESH_REFRESHING;
183 case NODE_SCROLL_EVENT_ON_SCROLL_EDGE:
184 return ON_SCROLL_EDGE;
185 case NODE_TOGGLE_ON_CHANGE:
186 return ON_TOGGLE_CHANGE;
187 case NODE_IMAGE_ON_COMPLETE:
188 return ON_IMAGE_COMPLETE;
189 case NODE_IMAGE_ON_ERROR:
190 return ON_IMAGE_ERROR;
191 case NODE_IMAGE_ON_SVG_PLAY_FINISH:
192 return ON_IMAGE_SVG_PLAY_FINISH;
193 case NODE_IMAGE_ON_DOWNLOAD_PROGRESS:
194 return ON_IMAGE_DOWNLOAD_PROGRESS;
195 case NODE_TEXT_PICKER_EVENT_ON_CHANGE:
196 return ON_TEXT_PICKER_CHANGE;
197 case NODE_TEXT_PICKER_EVENT_ON_SCROLL_STOP:
198 return ON_TEXT_PICKER_SCROLL_STOP;
199 case NODE_DATE_PICKER_EVENT_ON_DATE_CHANGE:
200 return ON_DATE_PICKER_DATE_CHANGE;
201 case NODE_TIME_PICKER_EVENT_ON_CHANGE:
202 return ON_TIME_PICKER_CHANGE;
203 case NODE_CALENDAR_PICKER_EVENT_ON_CHANGE:
204 return ON_CALENDAR_PICKER_CHANGE;
205 case NODE_TOUCH_EVENT:
206 return ON_TOUCH;
207 case NODE_ON_CLICK:
208 return ON_CLICK;
209 case NODE_ON_DRAG_START:
210 return ON_DRAG_START;
211 case NODE_ON_DRAG_ENTER:
212 return ON_DRAG_ENTER;
213 case NODE_ON_DROP:
214 return ON_DRAG_DROP;
215 case NODE_ON_DRAG_MOVE:
216 return ON_DRAG_MOVE;
217 case NODE_ON_DRAG_LEAVE:
218 return ON_DRAG_LEAVE;
219 case NODE_ON_DRAG_END:
220 return ON_DRAG_END;
221 case NODE_ON_PRE_DRAG:
222 return ON_PRE_DRAG;
223 case NODE_ON_KEY_EVENT:
224 return ON_KEY_EVENT;
225 case NODE_ON_KEY_PRE_IME:
226 return ON_KEY_PREIME;
227 case NODE_CHECKBOX_EVENT_ON_CHANGE:
228 return ON_CHECKBOX_CHANGE;
229 case NODE_SLIDER_EVENT_ON_CHANGE:
230 return ON_SLIDER_CHANGE;
231 case NODE_TEXT_INPUT_ON_CUT:
232 return ON_TEXT_INPUT_CUT;
233 case NODE_TEXT_INPUT_ON_PASTE:
234 return ON_TEXT_INPUT_PASTE;
235 case NODE_TEXT_INPUT_ON_TEXT_SELECTION_CHANGE:
236 return ON_TEXT_INPUT_TEXT_SELECTION_CHANGE;
237 case NODE_TEXT_INPUT_ON_EDIT_CHANGE:
238 return ON_TEXT_INPUT_EDIT_CHANGE;
239 case NODE_TEXT_INPUT_ON_CONTENT_SIZE_CHANGE:
240 return ON_TEXT_INPUT_CONTENT_SIZE_CHANGE;
241 case NODE_TEXT_INPUT_ON_INPUT_FILTER_ERROR:
242 return ON_TEXT_INPUT_INPUT_FILTER_ERROR;
243 case NODE_TEXT_INPUT_ON_CONTENT_SCROLL:
244 return ON_TEXT_INPUT_CONTENT_SCROLL;
245 case NODE_TEXT_AREA_ON_INPUT_FILTER_ERROR:
246 return ON_TEXT_AREA_INPUT_FILTER_ERROR;
247 case NODE_TEXT_INPUT_ON_WILL_INSERT:
248 return ON_TEXT_INPUT_WILL_INSERT;
249 case NODE_TEXT_INPUT_ON_DID_INSERT:
250 return ON_TEXT_INPUT_DID_INSERT;
251 case NODE_TEXT_INPUT_ON_WILL_DELETE:
252 return ON_TEXT_INPUT_WILL_DELETE;
253 case NODE_TEXT_INPUT_ON_DID_DELETE:
254 return ON_TEXT_INPUT_DID_DELETE;
255 case NODE_TEXT_AREA_ON_EDIT_CHANGE:
256 return ON_TEXTAREA_EDIT_CHANGE;
257 case NODE_TEXT_AREA_ON_SUBMIT:
258 return ON_TEXTAREA_ON_SUBMIT;
259 case NODE_TEXT_AREA_ON_CONTENT_SIZE_CHANGE:
260 return ON_TEXTAREA_CONTENT_SIZE_CHANGE;
261 case NODE_TEXT_AREA_ON_PASTE:
262 return ON_TEXTAREA_PASTE;
263 case NODE_TEXT_AREA_ON_TEXT_SELECTION_CHANGE:
264 return ON_TEXTAREA_TEXT_SELECTION_CHANGE;
265 case NODE_TEXT_AREA_ON_CONTENT_SCROLL:
266 return ON_TEXT_AREA_CONTENT_SCROLL;
267 case NODE_TEXT_AREA_ON_WILL_INSERT:
268 return ON_TEXT_AREA_WILL_INSERT;
269 case NODE_TEXT_AREA_ON_DID_INSERT:
270 return ON_TEXT_AREA_DID_INSERT;
271 case NODE_TEXT_AREA_ON_WILL_DELETE:
272 return ON_TEXT_AREA_WILL_DELETE;
273 case NODE_TEXT_AREA_ON_DID_DELETE:
274 return ON_TEXT_AREA_DID_DELETE;
275 case NODE_SWIPER_EVENT_ON_CHANGE:
276 return ON_SWIPER_CHANGE;
277 case NODE_SWIPER_EVENT_ON_ANIMATION_START:
278 return ON_SWIPER_ANIMATION_START;
279 case NODE_SWIPER_EVENT_ON_ANIMATION_END:
280 return ON_SWIPER_ANIMATION_END;
281 case NODE_SWIPER_EVENT_ON_GESTURE_SWIPE:
282 return ON_SWIPER_GESTURE_SWIPE;
283 case NODE_ON_WILL_SCROLL:
284 return ON_WATER_FLOW_WILL_SCROLL;
285 case NODE_ON_TOUCH_INTERCEPT:
286 return ON_TOUCH_INTERCEPT;
287 case NODE_EVENT_ON_VISIBLE_AREA_CHANGE:
288 return ON_VISIBLE_AREA_CHANGE;
289 case NODE_ON_HOVER:
290 return ON_HOVER;
291 case NODE_ON_MOUSE:
292 return ON_MOUSE;
293 case NODE_SCROLL_EVENT_ON_REACH_START:
294 if (arkUINodeType == ARKUI_NODE_LIST) {
295 return ON_LIST_REACH_START;
296 } else if (arkUINodeType == ARKUI_NODE_WATER_FLOW) {
297 return ON_WATER_FLOW_REACH_START;
298 }
299 return ON_SCROLL_REACH_START;
300 case NODE_SCROLL_EVENT_ON_REACH_END:
301 if (arkUINodeType == ARKUI_NODE_LIST) {
302 return ON_LIST_REACH_END;
303 } else if (arkUINodeType == ARKUI_NODE_WATER_FLOW) {
304 return ON_WATER_FLOW_REACH_END;
305 }
306 return ON_SCROLL_REACH_END;
307 case NODE_WATER_FLOW_ON_DID_SCROLL:
308 return ON_WATER_FLOW_DID_SCROLL;
309 case NODE_LIST_ON_SCROLL_INDEX:
310 return ON_LIST_SCROLL_INDEX;
311 case NODE_WATER_FLOW_ON_SCROLL_INDEX:
312 return ON_WATER_FLOW_SCROLL_INDEX;
313 case NODE_TEXT_ON_DETECT_RESULT_UPDATE:
314 return ON_DETECT_RESULT_UPDATE;
315 case NODE_RADIO_EVENT_ON_CHANGE:
316 return ON_RADIO_CHANGE;
317 case NODE_LIST_ON_DID_SCROLL:
318 return ON_LIST_DID_SCROLL;
319 case NODE_EVENT_ON_ATTACH:
320 return ON_ATTACH;
321 case NODE_EVENT_ON_DETACH:
322 return ON_DETACH;
323 case NODE_LIST_ON_WILL_SCROLL:
324 return ON_LIST_WILL_SCROLL;
325 case NODE_SWIPER_EVENT_ON_CONTENT_DID_SCROLL:
326 return ON_SWIPER_DID_CONTENT_SCROLL;
327 case NODE_ON_ACCESSIBILITY_ACTIONS:
328 return ON_ACCESSIBILITY_ACTIONS;
329 case NODE_REFRESH_ON_OFFSET_CHANGE:
330 return ON_REFRESH_ON_OFFSET_CHANGE;
331 case NODE_IMAGE_ANIMATOR_EVENT_ON_START:
332 return ON_IMAGE_ANIMATOR_ON_START;
333 case NODE_IMAGE_ANIMATOR_EVENT_ON_CANCEL:
334 return ON_IMAGE_ANIMATOR_ON_CANCEL;
335 case NODE_IMAGE_ANIMATOR_EVENT_ON_PAUSE:
336 return ON_IMAGE_ANIMATOR_ON_PAUSE;
337 case NODE_IMAGE_ANIMATOR_EVENT_ON_REPEAT:
338 return ON_IMAGE_ANIMATOR_ON_REPEAT;
339 case NODE_IMAGE_ANIMATOR_EVENT_ON_FINISH:
340 return ON_IMAGE_ANIMATOR_ON_FINISH;
341 default:
342 return -1;
343 }
344 }
345
ConvertToNodeEventType(ArkUIEventSubKind type)346 ArkUI_Int32 ConvertToNodeEventType(ArkUIEventSubKind type)
347 {
348 switch (type) {
349 case ON_TEXT_INPUT_CHANGE:
350 return NODE_TEXT_INPUT_ON_CHANGE;
351 case ON_SCROLL:
352 return NODE_SCROLL_EVENT_ON_SCROLL;
353 case ON_SCROLL_FRAME_BEGIN:
354 return NODE_SCROLL_EVENT_ON_SCROLL_FRAME_BEGIN;
355 case ON_SCROLL_WILL_SCROLL:
356 return NODE_SCROLL_EVENT_ON_WILL_SCROLL;
357 case ON_SCROLL_DID_SCROLL:
358 return NODE_SCROLL_EVENT_ON_DID_SCROLL;
359 case ON_SCROLL_START:
360 return NODE_SCROLL_EVENT_ON_SCROLL_START;
361 case ON_SCROLL_STOP:
362 return NODE_SCROLL_EVENT_ON_SCROLL_STOP;
363 case ON_APPEAR:
364 return NODE_EVENT_ON_APPEAR;
365 case ON_DISAPPEAR:
366 return NODE_EVENT_ON_DISAPPEAR;
367 case ON_AREA_CHANGE:
368 return NODE_EVENT_ON_AREA_CHANGE;
369 case ON_TEXTAREA_CHANGE:
370 return NODE_TEXT_AREA_ON_CHANGE;
371 case ON_FOCUS:
372 return NODE_ON_FOCUS;
373 case ON_BLUR:
374 return NODE_ON_BLUR;
375 case ON_TEXT_INPUT_SUBMIT:
376 return NODE_TEXT_INPUT_ON_SUBMIT;
377 case ON_REFRESH_STATE_CHANGE:
378 return NODE_REFRESH_STATE_CHANGE;
379 case ON_REFRESH_REFRESHING:
380 return NODE_REFRESH_ON_REFRESH;
381 case ON_SCROLL_EDGE:
382 return NODE_SCROLL_EVENT_ON_SCROLL_EDGE;
383 case ON_TOGGLE_CHANGE:
384 return NODE_TOGGLE_ON_CHANGE;
385 case ON_IMAGE_COMPLETE:
386 return NODE_IMAGE_ON_COMPLETE;
387 case ON_IMAGE_ERROR:
388 return NODE_IMAGE_ON_ERROR;
389 case ON_IMAGE_SVG_PLAY_FINISH:
390 return NODE_IMAGE_ON_SVG_PLAY_FINISH;
391 case ON_IMAGE_DOWNLOAD_PROGRESS:
392 return NODE_IMAGE_ON_DOWNLOAD_PROGRESS;
393 case ON_TEXT_PICKER_CHANGE:
394 return NODE_TEXT_PICKER_EVENT_ON_CHANGE;
395 case ON_TEXT_PICKER_SCROLL_STOP:
396 return NODE_TEXT_PICKER_EVENT_ON_SCROLL_STOP;
397 case ON_DATE_PICKER_DATE_CHANGE:
398 return NODE_DATE_PICKER_EVENT_ON_DATE_CHANGE;
399 case ON_TIME_PICKER_CHANGE:
400 return NODE_TIME_PICKER_EVENT_ON_CHANGE;
401 case ON_CALENDAR_PICKER_CHANGE:
402 return NODE_CALENDAR_PICKER_EVENT_ON_CHANGE;
403 case ON_TOUCH:
404 return NODE_TOUCH_EVENT;
405 case ON_CLICK:
406 return NODE_ON_CLICK;
407 case ON_DRAG_START:
408 return NODE_ON_DRAG_START;
409 case ON_DRAG_ENTER:
410 return NODE_ON_DRAG_ENTER;
411 case ON_DRAG_DROP:
412 return NODE_ON_DROP;
413 case ON_DRAG_MOVE:
414 return NODE_ON_DRAG_MOVE;
415 case ON_DRAG_LEAVE:
416 return NODE_ON_DRAG_LEAVE;
417 case ON_DRAG_END:
418 return NODE_ON_DRAG_END;
419 case ON_PRE_DRAG:
420 return NODE_ON_PRE_DRAG;
421 case ON_KEY_EVENT:
422 return NODE_ON_KEY_EVENT;
423 case ON_KEY_PREIME:
424 return NODE_ON_KEY_PRE_IME;
425 case ON_CHECKBOX_CHANGE:
426 return NODE_CHECKBOX_EVENT_ON_CHANGE;
427 case ON_SLIDER_CHANGE:
428 return NODE_SLIDER_EVENT_ON_CHANGE;
429 case ON_TEXT_INPUT_CUT:
430 return NODE_TEXT_INPUT_ON_CUT;
431 case ON_TEXT_INPUT_PASTE:
432 return NODE_TEXT_INPUT_ON_PASTE;
433 case ON_TEXT_INPUT_TEXT_SELECTION_CHANGE:
434 return NODE_TEXT_INPUT_ON_TEXT_SELECTION_CHANGE;
435 case ON_TEXT_INPUT_EDIT_CHANGE:
436 return NODE_TEXT_INPUT_ON_EDIT_CHANGE;
437 case ON_TEXT_INPUT_CONTENT_SIZE_CHANGE:
438 return NODE_TEXT_INPUT_ON_CONTENT_SIZE_CHANGE;
439 case ON_TEXT_INPUT_INPUT_FILTER_ERROR:
440 return NODE_TEXT_INPUT_ON_INPUT_FILTER_ERROR;
441 case ON_TEXT_INPUT_CONTENT_SCROLL:
442 return NODE_TEXT_INPUT_ON_CONTENT_SCROLL;
443 case ON_TEXT_AREA_INPUT_FILTER_ERROR:
444 return NODE_TEXT_AREA_ON_INPUT_FILTER_ERROR;
445 case ON_TEXT_INPUT_WILL_INSERT:
446 return NODE_TEXT_INPUT_ON_WILL_INSERT;
447 case ON_TEXT_INPUT_DID_INSERT:
448 return NODE_TEXT_INPUT_ON_DID_INSERT;
449 case ON_TEXT_INPUT_WILL_DELETE:
450 return NODE_TEXT_INPUT_ON_WILL_DELETE;
451 case ON_TEXT_INPUT_DID_DELETE:
452 return NODE_TEXT_INPUT_ON_DID_DELETE;
453 case ON_TEXTAREA_EDIT_CHANGE:
454 return NODE_TEXT_AREA_ON_EDIT_CHANGE;
455 case ON_TEXTAREA_ON_SUBMIT:
456 return NODE_TEXT_AREA_ON_SUBMIT;
457 case ON_TEXTAREA_CONTENT_SIZE_CHANGE:
458 return NODE_TEXT_AREA_ON_CONTENT_SIZE_CHANGE;
459 case ON_TEXTAREA_PASTE:
460 return NODE_TEXT_AREA_ON_PASTE;
461 case ON_TEXTAREA_TEXT_SELECTION_CHANGE:
462 return NODE_TEXT_AREA_ON_TEXT_SELECTION_CHANGE;
463 case ON_TEXT_AREA_CONTENT_SCROLL:
464 return NODE_TEXT_AREA_ON_CONTENT_SCROLL;
465 case ON_TEXT_AREA_WILL_INSERT:
466 return NODE_TEXT_AREA_ON_WILL_INSERT;
467 case ON_TEXT_AREA_DID_INSERT:
468 return NODE_TEXT_AREA_ON_DID_INSERT;
469 case ON_TEXT_AREA_WILL_DELETE:
470 return NODE_TEXT_AREA_ON_WILL_DELETE;
471 case ON_TEXT_AREA_DID_DELETE:
472 return NODE_TEXT_AREA_ON_DID_DELETE;
473 case ON_SWIPER_CHANGE:
474 return NODE_SWIPER_EVENT_ON_CHANGE;
475 case ON_SWIPER_ANIMATION_START:
476 return NODE_SWIPER_EVENT_ON_ANIMATION_START;
477 case ON_SWIPER_ANIMATION_END:
478 return NODE_SWIPER_EVENT_ON_ANIMATION_END;
479 case ON_SWIPER_GESTURE_SWIPE:
480 return NODE_SWIPER_EVENT_ON_GESTURE_SWIPE;
481 case ON_LIST_SCROLL:
482 return NODE_SCROLL_EVENT_ON_SCROLL;
483 case ON_LIST_SCROLL_FRAME_BEGIN:
484 return NODE_SCROLL_EVENT_ON_SCROLL_FRAME_BEGIN;
485 case ON_LIST_SCROLL_START:
486 return NODE_SCROLL_EVENT_ON_SCROLL_START;
487 case ON_LIST_WILL_SCROLL:
488 return NODE_LIST_ON_WILL_SCROLL;
489 case ON_LIST_SCROLL_STOP:
490 return NODE_SCROLL_EVENT_ON_SCROLL_STOP;
491 case ON_WATER_FLOW_WILL_SCROLL:
492 return NODE_ON_WILL_SCROLL;
493 case ON_TOUCH_INTERCEPT:
494 return NODE_ON_TOUCH_INTERCEPT;
495 case ON_VISIBLE_AREA_CHANGE:
496 return NODE_EVENT_ON_VISIBLE_AREA_CHANGE;
497 case ON_HOVER:
498 return NODE_ON_HOVER;
499 case ON_MOUSE:
500 return NODE_ON_MOUSE;
501 case ON_LIST_REACH_END:
502 return NODE_SCROLL_EVENT_ON_REACH_END;
503 case ON_WATER_FLOW_REACH_END:
504 return NODE_SCROLL_EVENT_ON_REACH_END;
505 case ON_SCROLL_REACH_END:
506 return NODE_SCROLL_EVENT_ON_REACH_END;
507 case ON_WATER_FLOW_DID_SCROLL:
508 return NODE_WATER_FLOW_ON_DID_SCROLL;
509 case ON_WATER_FLOW_SCROLL_FRAME_BEGIN:
510 return NODE_SCROLL_EVENT_ON_SCROLL_FRAME_BEGIN;
511 case ON_WATER_FLOW_SCROLL_START:
512 return NODE_SCROLL_EVENT_ON_SCROLL_START;
513 case ON_WATER_FLOW_SCROLL_STOP:
514 return NODE_SCROLL_EVENT_ON_SCROLL_STOP;
515 case ON_LIST_SCROLL_INDEX:
516 return NODE_LIST_ON_SCROLL_INDEX;
517 case ON_LIST_DID_SCROLL:
518 return NODE_LIST_ON_DID_SCROLL;
519 case ON_WATER_FLOW_SCROLL_INDEX:
520 return NODE_WATER_FLOW_ON_SCROLL_INDEX;
521 case ON_WATER_FLOW_REACH_START:
522 return NODE_SCROLL_EVENT_ON_REACH_START;
523 case ON_SCROLL_REACH_START:
524 return NODE_SCROLL_EVENT_ON_REACH_START;
525 case ON_LIST_REACH_START:
526 return NODE_SCROLL_EVENT_ON_REACH_START;
527 case ON_DETECT_RESULT_UPDATE:
528 return NODE_TEXT_ON_DETECT_RESULT_UPDATE;
529 case ON_ATTACH:
530 return NODE_EVENT_ON_ATTACH;
531 case ON_DETACH:
532 return NODE_EVENT_ON_DETACH;
533 case ON_RADIO_CHANGE:
534 return NODE_RADIO_EVENT_ON_CHANGE;
535 case ON_SWIPER_DID_CONTENT_SCROLL:
536 return NODE_SWIPER_EVENT_ON_CONTENT_DID_SCROLL;
537 case ON_ACCESSIBILITY_ACTIONS:
538 return NODE_ON_ACCESSIBILITY_ACTIONS;
539 case ON_REFRESH_ON_OFFSET_CHANGE:
540 return NODE_REFRESH_ON_OFFSET_CHANGE;
541 case ON_IMAGE_ANIMATOR_ON_START:
542 return NODE_IMAGE_ANIMATOR_EVENT_ON_START;
543 case ON_IMAGE_ANIMATOR_ON_PAUSE:
544 return NODE_IMAGE_ANIMATOR_EVENT_ON_PAUSE;
545 case ON_IMAGE_ANIMATOR_ON_REPEAT:
546 return NODE_IMAGE_ANIMATOR_EVENT_ON_REPEAT;
547 case ON_IMAGE_ANIMATOR_ON_CANCEL:
548 return NODE_IMAGE_ANIMATOR_EVENT_ON_CANCEL;
549 case ON_IMAGE_ANIMATOR_ON_FINISH:
550 return NODE_IMAGE_ANIMATOR_EVENT_ON_FINISH;
551 default:
552 return -1;
553 }
554 }
555
IsStringEvent(ArkUI_Int32 type)556 bool IsStringEvent(ArkUI_Int32 type)
557 {
558 switch (type) {
559 case NODE_TEXT_INPUT_ON_CHANGE:
560 case NODE_TEXT_INPUT_ON_CUT:
561 case NODE_TEXT_INPUT_ON_PASTE:
562 case NODE_TEXT_AREA_ON_CHANGE:
563 case NODE_TEXT_AREA_ON_PASTE:
564 return true;
565 default:
566 return false;
567 }
568 }
569
IsTouchEvent(ArkUI_Int32 type)570 bool IsTouchEvent(ArkUI_Int32 type)
571 {
572 switch (type) {
573 case NODE_TOUCH_EVENT:
574 case NODE_ON_TOUCH_INTERCEPT:
575 return true;
576 default:
577 return false;
578 }
579 }
580
ConvertEvent(ArkUINodeEvent * origin,ArkUI_NodeEvent * event)581 bool ConvertEvent(ArkUINodeEvent* origin, ArkUI_NodeEvent* event)
582 {
583 ArkUIEventCategory eventCategory = static_cast<ArkUIEventCategory>(origin->kind);
584 switch (eventCategory) {
585 case COMPONENT_ASYNC_EVENT: {
586 event->category = static_cast<int32_t>(NODE_EVENT_CATEGORY_COMPONENT_EVENT);
587 ArkUIEventSubKind subKind = static_cast<ArkUIEventSubKind>(origin->componentAsyncEvent.subKind);
588 event->kind = ConvertToNodeEventType(subKind);
589 return true;
590 }
591 case TEXT_INPUT: {
592 event->category = static_cast<int32_t>(NODE_EVENT_CATEGORY_STRING_ASYNC_EVENT);
593 ArkUIEventSubKind subKind = static_cast<ArkUIEventSubKind>(origin->textInputEvent.subKind);
594 event->kind = ConvertToNodeEventType(subKind);
595 return true;
596 }
597 case TOUCH_EVENT: {
598 event->category = static_cast<int32_t>(NODE_EVENT_CATEGORY_INPUT_EVENT);
599 ArkUIEventSubKind subKind = static_cast<ArkUIEventSubKind>(origin->touchEvent.subKind);
600 event->kind = ConvertToNodeEventType(subKind);
601 return true;
602 }
603 case MOUSE_INPUT_EVENT: {
604 event->category = static_cast<int32_t>(NODE_EVENT_CATEGORY_INPUT_EVENT);
605 ArkUIEventSubKind subKind = static_cast<ArkUIEventSubKind>(origin->mouseEvent.subKind);
606 event->kind = ConvertToNodeEventType(subKind);
607 return true;
608 }
609 case MIXED_EVENT: {
610 event->category = static_cast<int32_t>(NODE_EVENT_CATEGORY_MIXED_EVENT);
611 ArkUIEventSubKind subKind = static_cast<ArkUIEventSubKind>(origin->mixedEvent.subKind);
612 event->kind = ConvertToNodeEventType(subKind);
613 return true;
614 }
615 case DRAG_EVENT: {
616 event->category = static_cast<int32_t>(NODE_EVENT_CATEGORY_COMPONENT_EVENT);
617 ArkUIEventSubKind subKind = static_cast<ArkUIEventSubKind>(origin->dragEvent.subKind);
618 event->kind = ConvertToNodeEventType(subKind);
619 return true;
620 }
621 case KEY_INPUT_EVENT: {
622 event->category = static_cast<int32_t>(NODE_EVENT_CATEGORY_INPUT_EVENT);
623 ArkUIEventSubKind subKind = static_cast<ArkUIEventSubKind>(origin->keyEvent.subKind);
624 event->kind = ConvertToNodeEventType(subKind);
625 return true;
626 }
627 default:
628 TAG_LOGE(AceLogTag::ACE_NATIVE_NODE, "failed to convert origin event data");
629 break;
630 }
631 return false;
632 }
633
HandleInnerEvent(ArkUINodeEvent * innerEvent)634 void HandleInnerEvent(ArkUINodeEvent* innerEvent)
635 {
636 switch (innerEvent->kind) {
637 case ArkUIEventCategory::GESTURE_ASYNC_EVENT: {
638 // handle gesture event.
639 OHOS::Ace::GestureModel::HandleGestureEvent(innerEvent);
640 break;
641 }
642 default: {
643 OHOS::Ace::NodeModel::HandleInnerNodeEvent(innerEvent);
644 break;
645 }
646 }
647 }
648
ConvertToCTouchActionType(int32_t originActionType)649 int32_t ConvertToCTouchActionType(int32_t originActionType)
650 {
651 switch (originActionType) {
652 case ORIGIN_TOUCH_ACTION_DOWN:
653 return static_cast<int32_t>(UI_TOUCH_EVENT_ACTION_DOWN);
654 case ORIGIN_TOUCH_ACTION_UP:
655 return static_cast<int32_t>(UI_TOUCH_EVENT_ACTION_UP);
656 case ORIGIN_TOUCH_ACTION_MOVE:
657 return static_cast<int32_t>(UI_TOUCH_EVENT_ACTION_MOVE);
658 case ORIGIN_TOUCH_ACTION_CANCEL:
659 return static_cast<int32_t>(UI_TOUCH_EVENT_ACTION_CANCEL);
660 default:
661 break;
662 }
663 return -1;
664 }
665
ConvertToCInputEventToolType(int32_t originSourceToolType)666 int32_t ConvertToCInputEventToolType(int32_t originSourceToolType)
667 {
668 switch (originSourceToolType) {
669 case ORIGIN_INPUT_EVENT_TOOL_TYPE_FINGER:
670 return static_cast<int32_t>(UI_INPUT_EVENT_TOOL_TYPE_FINGER);
671 case ORIGIN_INPUT_EVENT_TOOL_TYPE_PEN:
672 return static_cast<int32_t>(UI_INPUT_EVENT_TOOL_TYPE_PEN);
673 case ORIGIN_INPUT_EVENT_TOOL_TYPE_MOUSE:
674 return static_cast<int32_t>(UI_INPUT_EVENT_TOOL_TYPE_MOUSE);
675 case ORIGIN_INPUT_EVENT_TOOL_TYPE_TOUCHPAD:
676 return static_cast<int32_t>(UI_INPUT_EVENT_TOOL_TYPE_TOUCHPAD);
677 default:
678 break;
679 }
680 return static_cast<int32_t>(UI_INPUT_EVENT_TOOL_TYPE_UNKNOWN);
681 }
682
ConvertToCMouseActionType(int32_t originActionType)683 int32_t ConvertToCMouseActionType(int32_t originActionType)
684 {
685 switch (originActionType) {
686 case ORIGIN_MOUSE_ACTION_PRESS:
687 return static_cast<int32_t>(UI_MOUSE_EVENT_ACTION_PRESS);
688 case ORIGIN_MOUSE_ACTION_RELEASE:
689 return static_cast<int32_t>(UI_MOUSE_EVENT_ACTION_RELEASE);
690 case ORIGIN_MOUSE_ACTION_MOVE:
691 return static_cast<int32_t>(UI_MOUSE_EVENT_ACTION_MOVE);
692 default:
693 break;
694 }
695 return static_cast<int32_t>(UI_MOUSE_EVENT_ACTION_UNKNOWN);
696 }
697
ConvertToCMouseEventButtonType(int32_t originButtonType)698 int32_t ConvertToCMouseEventButtonType(int32_t originButtonType)
699 {
700 switch (originButtonType) {
701 case ORIGIN_MOUSE_BUTTON_LEFT:
702 return static_cast<int32_t>(UI_MOUSE_EVENT_BUTTON_LEFT);
703 case ORIGIN_MOUSE_BUTTON_RIGHT:
704 return static_cast<int32_t>(UI_MOUSE_EVENT_BUTTON_RIGHT);
705 case ORIGIN_MOUSE_BUTTON_MIDDLE:
706 return static_cast<int32_t>(UI_MOUSE_EVENT_BUTTON_MIDDLE);
707 case ORIGIN_MOUSE_BUTTON_BACK:
708 return static_cast<int32_t>(UI_MOUSE_EVENT_BUTTON_BACK);
709 case ORIGIN_MOUSE_BUTTON_FORWARD:
710 return static_cast<int32_t>(UI_MOUSE_EVENT_BUTTON_FORWARD);
711 default:
712 break;
713 }
714 return static_cast<int32_t>(UI_MOUSE_EVENT_BUTTON_NONE);
715 }
716
ConvertEvent(ArkUINodeEvent * origin,ArkUI_CompatibleNodeEvent * event)717 bool ConvertEvent(ArkUINodeEvent* origin, ArkUI_CompatibleNodeEvent* event)
718 {
719 ArkUIEventCategory eventCategory = static_cast<ArkUIEventCategory>(origin->kind);
720 switch (eventCategory) {
721 case COMPONENT_ASYNC_EVENT: {
722 ArkUIEventSubKind subKind = static_cast<ArkUIEventSubKind>(origin->componentAsyncEvent.subKind);
723 event->kind = ConvertToNodeEventType(subKind);
724 if (memcpy_sp(event->componentEvent.data, MAX_COMPONENT_EVENT_ARG_NUM * sizeof(ArkUI_NumberValue),
725 origin->componentAsyncEvent.data, MAX_COMPONENT_EVENT_ARG_NUM * sizeof(ArkUI_NumberValue)) != 0) {
726 TAG_LOGE(AceLogTag::ACE_NATIVE_NODE, "fail to convert origin event data");
727 return false;
728 }
729 return true;
730 }
731 case TEXT_INPUT: {
732 ArkUIEventSubKind subKind = static_cast<ArkUIEventSubKind>(origin->textInputEvent.subKind);
733 event->kind = ConvertToNodeEventType(subKind);
734 event->stringEvent.pStr = reinterpret_cast<ArkUI_CharPtr>(origin->textInputEvent.nativeStringPtr);
735 return true;
736 }
737 case TOUCH_EVENT:
738 event->kind = ConvertToNodeEventType(ON_TOUCH);
739 ConvertToTouchEvent(origin->touchEvent, event->touchEvent);
740 return true;
741 default:
742 TAG_LOGE(AceLogTag::ACE_NATIVE_NODE, "failed to convert origin event data");
743 return false;
744 }
745
746 return true;
747 }
748
ConvertEventResult(ArkUI_CompatibleNodeEvent * event,ArkUINodeEvent * origin)749 bool ConvertEventResult(ArkUI_CompatibleNodeEvent* event, ArkUINodeEvent* origin)
750 {
751 if (IsTouchEvent(event->kind)) {
752 origin->touchEvent.preventDefault = event->touchEvent.preventDefault;
753 origin->touchEvent.stopPropagation = event->touchEvent.stopPropagation;
754 return true;
755 }
756 if (!IsStringEvent(event->kind)) {
757 if (memcpy_sp(origin->componentAsyncEvent.data, MAX_COMPONENT_EVENT_ARG_NUM * sizeof(ArkUI_NumberValue),
758 event->componentEvent.data, MAX_COMPONENT_EVENT_ARG_NUM * sizeof(ArkUI_NumberValue)) != 0) {
759 TAG_LOGE(AceLogTag::ACE_NATIVE_NODE, "fail to convert event result data");
760 return false;
761 }
762 }
763 return true;
764 }
765
766 }; // namespace OHOS::Ace::NodeModel
767
768 #ifdef __cplusplus
769 extern "C" {
770 #endif
771
OH_ArkUI_NodeEvent_GetEventType(ArkUI_NodeEvent * event)772 ArkUI_NodeEventType OH_ArkUI_NodeEvent_GetEventType(ArkUI_NodeEvent* event)
773 {
774 if (!event || event->kind < 0) {
775 return ArkUI_NodeEventType::NODE_TOUCH_EVENT;
776 }
777 return static_cast<ArkUI_NodeEventType>(event->kind);
778 }
779
OH_ArkUI_NodeEvent_GetTargetId(ArkUI_NodeEvent * event)780 int32_t OH_ArkUI_NodeEvent_GetTargetId(ArkUI_NodeEvent* event)
781 {
782 if (!event) {
783 return -1;
784 }
785 return event->eventId;
786 }
787
OH_ArkUI_NodeEvent_GetNodeHandle(ArkUI_NodeEvent * event)788 ArkUI_NodeHandle OH_ArkUI_NodeEvent_GetNodeHandle(ArkUI_NodeEvent* event)
789 {
790 if (!event) {
791 return nullptr;
792 }
793 return reinterpret_cast<ArkUI_NodeHandle>(event->node);
794 }
795
OH_ArkUI_NodeEvent_GetInputEvent(ArkUI_NodeEvent * event)796 ArkUI_UIInputEvent* OH_ArkUI_NodeEvent_GetInputEvent(ArkUI_NodeEvent* event)
797 {
798 if (!event || event->category != static_cast<int32_t>(NODE_EVENT_CATEGORY_INPUT_EVENT)) {
799 return nullptr;
800 }
801 return reinterpret_cast<ArkUI_UIInputEvent*>(event->origin);
802 }
803
OH_ArkUI_NodeEvent_GetNodeComponentEvent(ArkUI_NodeEvent * event)804 ArkUI_NodeComponentEvent* OH_ArkUI_NodeEvent_GetNodeComponentEvent(ArkUI_NodeEvent* event)
805 {
806 if (!event || event->category != static_cast<int32_t>(NODE_EVENT_CATEGORY_COMPONENT_EVENT)) {
807 return nullptr;
808 }
809 const auto* originNodeEvent = reinterpret_cast<ArkUINodeEvent*>(event->origin);
810 if (!originNodeEvent) {
811 return nullptr;
812 }
813 return const_cast<ArkUI_NodeComponentEvent*>(
814 reinterpret_cast<const ArkUI_NodeComponentEvent*>(&(originNodeEvent->componentAsyncEvent)));
815 }
816
OH_ArkUI_NodeEvent_GetStringAsyncEvent(ArkUI_NodeEvent * event)817 ArkUI_StringAsyncEvent* OH_ArkUI_NodeEvent_GetStringAsyncEvent(ArkUI_NodeEvent* event)
818 {
819 if (!event || event->category != static_cast<int32_t>(NODE_EVENT_CATEGORY_STRING_ASYNC_EVENT)) {
820 return nullptr;
821 }
822 const auto* originNodeEvent = reinterpret_cast<ArkUINodeEvent*>(event->origin);
823 if (!originNodeEvent) {
824 return nullptr;
825 }
826 return const_cast<ArkUI_StringAsyncEvent*>(
827 reinterpret_cast<const ArkUI_StringAsyncEvent*>(&(originNodeEvent->textInputEvent)));
828 }
829
OH_ArkUI_NodeEvent_GetUserData(ArkUI_NodeEvent * event)830 void* OH_ArkUI_NodeEvent_GetUserData(ArkUI_NodeEvent* event)
831 {
832 if (!event) {
833 return nullptr;
834 }
835 return event->userData;
836 }
837
OH_ArkUI_NodeEvent_GetNumberValue(ArkUI_NodeEvent * event,int32_t index,ArkUI_NumberValue * value)838 int32_t OH_ArkUI_NodeEvent_GetNumberValue(ArkUI_NodeEvent* event, int32_t index, ArkUI_NumberValue* value)
839 {
840 if (!event || event->category != static_cast<int32_t>(NODE_EVENT_CATEGORY_MIXED_EVENT)) {
841 return OHOS::Ace::ERROR_CODE_NATIVE_IMPL_NODE_EVENT_PARAM_INVALID;
842 }
843 const auto* originNodeEvent = reinterpret_cast<ArkUINodeEvent*>(event->origin);
844 if (!originNodeEvent) {
845 return OHOS::Ace::ERROR_CODE_NATIVE_IMPL_NODE_EVENT_PARAM_INVALID;
846 }
847 auto mixedData = reinterpret_cast<const ArkUIMixedEvent*>(&(originNodeEvent->mixedEvent));
848 if (index > mixedData->numberDataLength || index < 0) {
849 return OHOS::Ace::ERROR_CODE_NATIVE_IMPL_NODE_EVENT_PARAM_INDEX_OUT_OF_RANGE;
850 }
851 if (index > 1) {
852 value[index].i32 = mixedData->numberData[index].i32;
853 } else {
854 value[index].f32 = mixedData->numberData[index].f32;
855 }
856 return OHOS::Ace::ERROR_CODE_NO_ERROR;
857 }
858
OH_ArkUI_NodeEvent_GetStringValue(ArkUI_NodeEvent * event,int32_t index,char ** string,int32_t * stringSize)859 int32_t OH_ArkUI_NodeEvent_GetStringValue(
860 ArkUI_NodeEvent* event, int32_t index, char** string, int32_t* stringSize)
861 {
862 if (!event || event->category != static_cast<int32_t>(NODE_EVENT_CATEGORY_MIXED_EVENT)) {
863 return OHOS::Ace::ERROR_CODE_NATIVE_IMPL_NODE_EVENT_PARAM_INVALID;
864 }
865 const auto* originNodeEvent = reinterpret_cast<ArkUINodeEvent*>(event->origin);
866 if (!originNodeEvent) {
867 return OHOS::Ace::ERROR_CODE_NATIVE_IMPL_NODE_EVENT_PARAM_INVALID;
868 }
869 auto mixedData = reinterpret_cast<const ArkUIMixedEvent*>(&(originNodeEvent->mixedEvent));
870 if (index > mixedData->stringPtrDataLength) {
871 return OHOS::Ace::ERROR_CODE_NATIVE_IMPL_NODE_EVENT_PARAM_INDEX_OUT_OF_RANGE;
872 }
873 const char* str = reinterpret_cast<char*>(mixedData->stringPtrData[index]);
874 if (!str) {
875 return OHOS::Ace::ERROR_CODE_NATIVE_IMPL_NODE_EVENT_PARAM_INVALID;
876 }
877 int32_t strLen = static_cast<int32_t>(strlen(str));
878 int32_t size = stringSize[index];
879 if (size <= 0) {
880 return OHOS::Ace::ERROR_CODE_NATIVE_IMPL_NODE_EVENT_PARAM_INVALID;
881 }
882 bool copyResult = false;
883 if (strLen >= size) {
884 copyResult = strncpy_s(string[index], size, str, size - 1);
885 string[index][size - 1] = '\0';
886 } else {
887 copyResult = strcpy_s(string[index], size, str);
888 }
889 if (!copyResult) {
890 return OHOS::Ace::ERROR_CODE_NATIVE_IMPL_NODE_EVENT_PARAM_INVALID;
891 }
892 return OHOS::Ace::ERROR_CODE_NO_ERROR;
893 }
894
OH_ArkUI_NodeEvent_SetReturnNumberValue(ArkUI_NodeEvent * event,ArkUI_NumberValue * value,int32_t size)895 int32_t OH_ArkUI_NodeEvent_SetReturnNumberValue(ArkUI_NodeEvent* event, ArkUI_NumberValue* value, int32_t size)
896 {
897 if (!event || event->category != static_cast<int32_t>(NODE_EVENT_CATEGORY_MIXED_EVENT)) {
898 return OHOS::Ace::ERROR_CODE_NATIVE_IMPL_NODE_EVENT_PARAM_INVALID;
899 }
900 auto* originNodeEvent = reinterpret_cast<ArkUINodeEvent*>(event->origin);
901 if (!originNodeEvent) {
902 return OHOS::Ace::ERROR_CODE_NATIVE_IMPL_NODE_EVENT_PARAM_INVALID;
903 }
904 auto* mixedData = reinterpret_cast<ArkUIMixedEvent*>(&(originNodeEvent->mixedEvent));
905 for (int i = 0; i < size; i++) {
906 mixedData->numberReturnData[i].i32 = value[i].i32;
907 }
908 return OHOS::Ace::ERROR_CODE_NO_ERROR;
909 }
910
OH_ArkUI_NodeEvent_GetDragEvent(ArkUI_NodeEvent * nodeEvent)911 ArkUI_DragEvent* OH_ArkUI_NodeEvent_GetDragEvent(ArkUI_NodeEvent* nodeEvent)
912 {
913 if (!nodeEvent || nodeEvent->category != static_cast<int32_t>(NODE_EVENT_CATEGORY_COMPONENT_EVENT)) {
914 return nullptr;
915 }
916 const auto* originNodeEvent = reinterpret_cast<ArkUINodeEvent*>(nodeEvent->origin);
917 if (!originNodeEvent) {
918 return nullptr;
919 }
920 return const_cast<ArkUI_DragEvent*>(reinterpret_cast<const ArkUI_DragEvent*>(&(originNodeEvent->dragEvent)));
921 }
922
923 #ifdef __cplusplus
924 };
925 #endif
926