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