• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
16 #include "node_model.h"
17 
18 #include <cstdint>
19 #include <set>
20 #include <unordered_map>
21 
22 #include "event_converter.h"
23 #include "interfaces/native/event/ui_input_event_impl.h"
24 #include "native_node.h"
25 #include "native_type.h"
26 #include "node_extened.h"
27 #include "style_modifier.h"
28 
29 #include "base/error/error_code.h"
30 #include "base/log/log_wrapper.h"
31 #include "base/utils/utils.h"
32 #include "core/interfaces/arkoala/arkoala_api.h"
33 
34 namespace OHOS::Ace::NodeModel {
35 namespace {
36 #if defined(WINDOWS_PLATFORM)
37 #include <windows.h>
38 // Here we need to find module where GetArkUINodeAPI()
39 // function is implemented.
FindModule()40 void* FindModule()
41 {
42     // To find from main exe
43     HMODULE result = nullptr;
44     const char libname[] = "libace_compatible.dll";
45     GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_PIN, libname, &result);
46     if (result) {
47         return result;
48     }
49     TAG_LOGE(AceLogTag::ACE_NATIVE_NODE, "Cannot find module!");
50     return nullptr;
51 }
FindFunction(void * library,const char * name)52 void* FindFunction(void* library, const char* name)
53 {
54     return (void*)GetProcAddress(reinterpret_cast<HMODULE>(library), name);
55 }
56 #else
57 #include <dlfcn.h>
58 void* FindModule()
59 {
60     const char libname[] = "libace_compatible.z.so";
61     void* result = dlopen(libname, RTLD_LAZY | RTLD_LOCAL);
62     if (result) {
63         return result;
64     }
65     TAG_LOGE(AceLogTag::ACE_NATIVE_NODE, "Cannot load libace: %{public}s", dlerror());
66     return nullptr;
67 }
68 
69 void* FindFunction(void* library, const char* name)
70 {
71     return dlsym(library, name);
72 }
73 #endif
74 
75 ArkUIFullNodeAPI* impl = nullptr;
76 
InitialFullNodeImpl(int version)77 bool InitialFullNodeImpl(int version)
78 {
79     if (!impl) {
80         typedef ArkUIAnyAPI* (*GetAPI_t)(int);
81         GetAPI_t getAPI = nullptr;
82         void* module = FindModule();
83         if (module == nullptr) {
84             TAG_LOGE(AceLogTag::ACE_NATIVE_NODE, "fail to get module");
85             return false;
86         }
87         // Note, that RTLD_DEFAULT is ((void *) 0).
88         getAPI = reinterpret_cast<GetAPI_t>(FindFunction(module, "GetArkUIAnyFullNodeAPI"));
89         if (!getAPI) {
90             TAG_LOGE(AceLogTag::ACE_NATIVE_NODE, "Cannot find GetArkUIAnyFullNodeAPI()");
91             return false;
92         }
93 
94         impl = reinterpret_cast<ArkUIFullNodeAPI*>((*getAPI)(version));
95         if (!impl) {
96             TAG_LOGE(AceLogTag::ACE_NATIVE_NODE, "getAPI() returned null");
97             return false;
98         }
99 
100         if (impl->version != version) {
101             TAG_LOGE(AceLogTag::ACE_NATIVE_NODE,
102                 "API version mismatch: expected %{public}d, but get the version %{public}d", version, impl->version);
103             return false;
104         }
105     }
106 
107     impl->getBasicAPI()->registerNodeAsyncEventReceiver(OHOS::Ace::NodeModel::HandleInnerEvent);
108     impl->getExtendedAPI()->registerCustomNodeAsyncEventReceiver(OHOS::Ace::NodeModel::HandleInnerCustomEvent);
109     return true;
110 }
111 } // namespace
112 
GetFullImpl()113 ArkUIFullNodeAPI* GetFullImpl()
114 {
115     return impl;
116 }
117 
InitialFullImpl()118 bool InitialFullImpl()
119 {
120     return InitialFullNodeImpl(ARKUI_NODE_API_VERSION);
121 }
122 
123 struct InnerEventExtraParam {
124     int32_t targetId;
125     ArkUI_NodeHandle nodePtr;
126     void* userData;
127 };
128 
129 struct ExtraData {
130     std::unordered_map<int64_t, InnerEventExtraParam*> eventMap;
131 };
132 
133 std::set<ArkUI_NodeHandle> g_nodeSet;
134 
IsValidArkUINode(ArkUI_NodeHandle nodePtr)135 bool IsValidArkUINode(ArkUI_NodeHandle nodePtr)
136 {
137     if (!nodePtr || g_nodeSet.count(nodePtr) == 0) {
138         return false;
139     }
140     return true;
141 }
142 
CreateNode(ArkUI_NodeType type)143 ArkUI_NodeHandle CreateNode(ArkUI_NodeType type)
144 {
145     static const ArkUINodeType nodes[] = { ARKUI_CUSTOM, ARKUI_TEXT, ARKUI_SPAN, ARKUI_IMAGE_SPAN, ARKUI_IMAGE,
146         ARKUI_TOGGLE, ARKUI_LOADING_PROGRESS, ARKUI_TEXT_INPUT, ARKUI_TEXTAREA, ARKUI_BUTTON, ARKUI_PROGRESS,
147         ARKUI_CHECKBOX, ARKUI_XCOMPONENT, ARKUI_DATE_PICKER, ARKUI_TIME_PICKER, ARKUI_TEXT_PICKER,
148         ARKUI_CALENDAR_PICKER, ARKUI_SLIDER, ARKUI_RADIO, ARKUI_IMAGE_ANIMATOR, ARKUI_XCOMPONENT_TEXTURE,
149         ARKUI_CHECK_BOX_GROUP, ARKUI_STACK, ARKUI_SWIPER,
150         ARKUI_SCROLL, ARKUI_LIST, ARKUI_LIST_ITEM, ARKUI_LIST_ITEM_GROUP, ARKUI_COLUMN, ARKUI_ROW, ARKUI_FLEX,
151         ARKUI_REFRESH, ARKUI_WATER_FLOW, ARKUI_FLOW_ITEM, ARKUI_RELATIVE_CONTAINER, ARKUI_GRID, ARKUI_GRID_ITEM,
152         ARKUI_CUSTOM_SPAN };
153     // already check in entry point.
154     uint32_t nodeType = type < MAX_NODE_SCOPE_NUM ? type : (type - MAX_NODE_SCOPE_NUM + BASIC_COMPONENT_NUM);
155     const auto* impl = GetFullImpl();
156     if (nodeType >= sizeof(nodes) / sizeof(ArkUINodeType)) {
157         TAG_LOGE(AceLogTag::ACE_NATIVE_NODE, "node type: %{public}d NOT IMPLEMENT", type);
158         return nullptr;
159     }
160 
161     ArkUI_Int32 id = ARKUI_AUTO_GENERATE_NODE_ID;
162     auto* uiNode = impl->getBasicAPI()->createNode(nodes[nodeType], id, ARKUI_NODE_FLAG_C);
163     if (!uiNode) {
164         TAG_LOGE(AceLogTag::ACE_NATIVE_NODE, "node type: %{public}d can not find in full impl", type);
165         return nullptr;
166     }
167     impl->getBasicAPI()->markDirty(uiNode, ARKUI_DIRTY_FLAG_ATTRIBUTE_DIFF);
168     ArkUI_Node* arkUINode = new ArkUI_Node({ type, uiNode, true });
169     impl->getExtendedAPI()->setAttachNodePtr(uiNode, reinterpret_cast<void*>(arkUINode));
170     g_nodeSet.emplace(arkUINode);
171     return arkUINode;
172 }
173 
DisposeNativeSource(ArkUI_NodeHandle nativePtr)174 void DisposeNativeSource(ArkUI_NodeHandle nativePtr)
175 {
176     CHECK_NULL_VOID(nativePtr);
177     if (!CheckIsCNode(nativePtr)) {
178         return;
179     }
180     if (nativePtr->customEventListeners) {
181         auto eventListenersSet = reinterpret_cast<std::set<void (*)(ArkUI_NodeCustomEvent*)>*>(
182         nativePtr->customEventListeners);
183         if (eventListenersSet) {
184             eventListenersSet->clear();
185         }
186         delete eventListenersSet;
187         nativePtr->customEventListeners = nullptr;
188     }
189     if (nativePtr->eventListeners) {
190         auto eventListenersSet = reinterpret_cast<std::set<void (*)(ArkUI_NodeEvent*)>*>(
191         nativePtr->eventListeners);
192         if (eventListenersSet) {
193             eventListenersSet->clear();
194         }
195         delete eventListenersSet;
196         nativePtr->eventListeners = nullptr;
197     }
198     if (nativePtr->areaChangeRadio) {
199         delete[] nativePtr->areaChangeRadio->value;
200         delete nativePtr->areaChangeRadio;
201         nativePtr->areaChangeRadio = nullptr;
202     }
203 }
204 
DisposeNode(ArkUI_NodeHandle nativePtr)205 void DisposeNode(ArkUI_NodeHandle nativePtr)
206 {
207     CHECK_NULL_VOID(nativePtr);
208     if (!CheckIsCNode(nativePtr)) {
209         return;
210     }
211     // already check in entry point.
212     const auto* impl = GetFullImpl();
213     impl->getBasicAPI()->disposeNode(nativePtr->uiNodeHandle);
214     DisposeNativeSource(nativePtr);
215     g_nodeSet.erase(nativePtr);
216     delete nativePtr;
217     nativePtr = nullptr;
218 }
219 
AddChild(ArkUI_NodeHandle parentNode,ArkUI_NodeHandle childNode)220 int32_t AddChild(ArkUI_NodeHandle parentNode, ArkUI_NodeHandle childNode)
221 {
222     CHECK_NULL_RETURN(parentNode, ERROR_CODE_PARAM_INVALID);
223     CHECK_NULL_RETURN(childNode, ERROR_CODE_PARAM_INVALID);
224     if (!CheckIsCNode(parentNode) || !CheckIsCNode(childNode)) {
225         return ERROR_CODE_NATIVE_IMPL_BUILDER_NODE_ERROR;
226     }
227     // already check in entry point.
228     if (parentNode->type == -1) {
229         return ERROR_CODE_NATIVE_IMPL_BUILDER_NODE_ERROR;
230     }
231     const auto* impl = GetFullImpl();
232     // already check in entry point.
233     impl->getBasicAPI()->addChild(parentNode->uiNodeHandle, childNode->uiNodeHandle);
234     impl->getBasicAPI()->markDirty(parentNode->uiNodeHandle, ARKUI_DIRTY_FLAG_MEASURE_BY_CHILD_REQUEST);
235     return ERROR_CODE_NO_ERROR;
236 }
237 
RemoveChild(ArkUI_NodeHandle parentNode,ArkUI_NodeHandle childNode)238 int32_t RemoveChild(ArkUI_NodeHandle parentNode, ArkUI_NodeHandle childNode)
239 {
240     CHECK_NULL_RETURN(parentNode, ERROR_CODE_PARAM_INVALID);
241     CHECK_NULL_RETURN(childNode, ERROR_CODE_PARAM_INVALID);
242     if (!CheckIsCNode(parentNode) || !CheckIsCNode(childNode)) {
243         return ERROR_CODE_NATIVE_IMPL_BUILDER_NODE_ERROR;
244     }
245     // already check in entry point.
246     if (parentNode->type == -1) {
247         return ERROR_CODE_NATIVE_IMPL_BUILDER_NODE_ERROR;
248     }
249     const auto* impl = GetFullImpl();
250     impl->getBasicAPI()->removeChild(parentNode->uiNodeHandle, childNode->uiNodeHandle);
251     impl->getBasicAPI()->markDirty(parentNode->uiNodeHandle, ARKUI_DIRTY_FLAG_MEASURE_BY_CHILD_REQUEST);
252     return ERROR_CODE_NO_ERROR;
253 }
254 
InsertChildAfter(ArkUI_NodeHandle parentNode,ArkUI_NodeHandle childNode,ArkUI_NodeHandle siblingNode)255 int32_t InsertChildAfter(ArkUI_NodeHandle parentNode, ArkUI_NodeHandle childNode, ArkUI_NodeHandle siblingNode)
256 {
257     CHECK_NULL_RETURN(parentNode, ERROR_CODE_PARAM_INVALID);
258     CHECK_NULL_RETURN(childNode, ERROR_CODE_PARAM_INVALID);
259     if (!CheckIsCNode(parentNode) || !CheckIsCNode(childNode)) {
260         return ERROR_CODE_NATIVE_IMPL_BUILDER_NODE_ERROR;
261     }
262     // already check in entry point.
263     if (parentNode->type == -1) {
264         return ERROR_CODE_NATIVE_IMPL_BUILDER_NODE_ERROR;
265     }
266     const auto* impl = GetFullImpl();
267     impl->getBasicAPI()->insertChildAfter(
268         parentNode->uiNodeHandle, childNode->uiNodeHandle, siblingNode ? siblingNode->uiNodeHandle : nullptr);
269     impl->getBasicAPI()->markDirty(parentNode->uiNodeHandle, ARKUI_DIRTY_FLAG_MEASURE_BY_CHILD_REQUEST);
270     return ERROR_CODE_NO_ERROR;
271 }
272 
InsertChildBefore(ArkUI_NodeHandle parentNode,ArkUI_NodeHandle childNode,ArkUI_NodeHandle siblingNode)273 int32_t InsertChildBefore(ArkUI_NodeHandle parentNode, ArkUI_NodeHandle childNode, ArkUI_NodeHandle siblingNode)
274 {
275     CHECK_NULL_RETURN(parentNode, ERROR_CODE_PARAM_INVALID);
276     CHECK_NULL_RETURN(childNode, ERROR_CODE_PARAM_INVALID);
277     if (!CheckIsCNode(parentNode) || !CheckIsCNode(childNode)) {
278         return ERROR_CODE_NATIVE_IMPL_BUILDER_NODE_ERROR;
279     }
280     // already check in entry point.
281     if (parentNode->type == -1) {
282         return ERROR_CODE_NATIVE_IMPL_BUILDER_NODE_ERROR;
283     }
284     const auto* impl = GetFullImpl();
285     impl->getBasicAPI()->insertChildBefore(
286         parentNode->uiNodeHandle, childNode->uiNodeHandle, siblingNode ? siblingNode->uiNodeHandle : nullptr);
287     impl->getBasicAPI()->markDirty(parentNode->uiNodeHandle, ARKUI_DIRTY_FLAG_MEASURE_BY_CHILD_REQUEST);
288     return ERROR_CODE_NO_ERROR;
289 }
290 
InsertChildAt(ArkUI_NodeHandle parentNode,ArkUI_NodeHandle childNode,int32_t position)291 int32_t InsertChildAt(ArkUI_NodeHandle parentNode, ArkUI_NodeHandle childNode, int32_t position)
292 {
293     CHECK_NULL_RETURN(parentNode, ERROR_CODE_PARAM_INVALID);
294     CHECK_NULL_RETURN(childNode, ERROR_CODE_PARAM_INVALID);
295     if (!CheckIsCNode(parentNode) || !CheckIsCNode(childNode)) {
296         return ERROR_CODE_NATIVE_IMPL_BUILDER_NODE_ERROR;
297     }
298     // already check in entry point.
299     if (parentNode->type == -1) {
300         return ERROR_CODE_NATIVE_IMPL_BUILDER_NODE_ERROR;
301     }
302     const auto* impl = GetFullImpl();
303     impl->getBasicAPI()->insertChildAt(parentNode->uiNodeHandle, childNode->uiNodeHandle, position);
304     impl->getBasicAPI()->markDirty(parentNode->uiNodeHandle, ARKUI_DIRTY_FLAG_MEASURE_BY_CHILD_REQUEST);
305     return ERROR_CODE_NO_ERROR;
306 }
307 
SetAttribute(ArkUI_NodeHandle node,ArkUI_NodeAttributeType attribute,const char * value)308 void SetAttribute(ArkUI_NodeHandle node, ArkUI_NodeAttributeType attribute, const char* value)
309 {
310     SetNodeAttribute(node, attribute, value);
311 }
312 
SetAttribute(ArkUI_NodeHandle node,ArkUI_NodeAttributeType attribute,const ArkUI_AttributeItem * value)313 int32_t SetAttribute(ArkUI_NodeHandle node, ArkUI_NodeAttributeType attribute, const ArkUI_AttributeItem* value)
314 {
315     if (node == nullptr) {
316         return ERROR_CODE_PARAM_INVALID;
317     }
318     if (node->type == -1 && attribute != NODE_LAYOUT_RECT) {
319         return ERROR_CODE_NATIVE_IMPL_BUILDER_NODE_ERROR;
320     }
321     return SetNodeAttribute(node, attribute, value);
322 }
323 
ResetAttribute(ArkUI_NodeHandle node,ArkUI_NodeAttributeType attribute)324 int32_t ResetAttribute(ArkUI_NodeHandle node, ArkUI_NodeAttributeType attribute)
325 {
326     if (node == nullptr) {
327         return ERROR_CODE_PARAM_INVALID;
328     }
329     if (node->type == -1 && attribute != NODE_LAYOUT_RECT) {
330         return ERROR_CODE_NATIVE_IMPL_BUILDER_NODE_ERROR;
331     }
332     return ResetNodeAttribute(node, attribute);
333 }
334 
GetAttribute(ArkUI_NodeHandle node,ArkUI_NodeAttributeType attribute)335 const ArkUI_AttributeItem* GetAttribute(ArkUI_NodeHandle node, ArkUI_NodeAttributeType attribute)
336 {
337     if (node == nullptr) {
338         return nullptr;
339     }
340     return GetNodeAttribute(node, attribute);
341 }
342 
RegisterNodeEvent(ArkUI_NodeHandle nodePtr,ArkUI_NodeEventType eventType,int32_t targetId)343 int32_t RegisterNodeEvent(ArkUI_NodeHandle nodePtr, ArkUI_NodeEventType eventType, int32_t targetId)
344 {
345     return RegisterNodeEvent(nodePtr, eventType, targetId, nullptr);
346 }
347 
RegisterNodeEvent(ArkUI_NodeHandle nodePtr,ArkUI_NodeEventType eventType,int32_t targetId,void * userData)348 int32_t RegisterNodeEvent(ArkUI_NodeHandle nodePtr, ArkUI_NodeEventType eventType, int32_t targetId, void* userData)
349 {
350     if (nodePtr == nullptr || !CheckIsCNode(nodePtr)) {
351         return ERROR_CODE_PARAM_INVALID;
352     }
353     auto originEventType = ConvertOriginEventType(eventType, nodePtr->type);
354     if (originEventType < 0) {
355         TAG_LOGE(AceLogTag::ACE_NATIVE_NODE, "event is not supported %{public}d", eventType);
356         return ERROR_CODE_NATIVE_IMPL_TYPE_NOT_SUPPORTED;
357     }
358     // already check in entry point.
359     if (nodePtr->type == -1) {
360         return ERROR_CODE_NATIVE_IMPL_BUILDER_NODE_ERROR;
361     }
362     const auto* impl = GetFullImpl();
363     auto* extraParam = new InnerEventExtraParam({ targetId, nodePtr, userData });
364     if (nodePtr->extraData) {
365         auto* extraData = reinterpret_cast<ExtraData*>(nodePtr->extraData);
366         auto result = extraData->eventMap.try_emplace(eventType, extraParam);
367         if (!result.second) {
368             result.first->second->targetId = targetId;
369             result.first->second->userData = userData;
370             delete extraParam;
371         }
372     } else {
373         nodePtr->extraData = new ExtraData();
374         auto* extraData = reinterpret_cast<ExtraData*>(nodePtr->extraData);
375         extraData->eventMap[eventType] = extraParam;
376     }
377     if (eventType == NODE_EVENT_ON_VISIBLE_AREA_CHANGE) {
378         ArkUI_AttributeItem* radio = nodePtr->areaChangeRadio;
379         radio = radio ? radio : static_cast<ArkUI_AttributeItem*>(userData);
380         if (!radio) {
381             return ERROR_CODE_PARAM_INVALID;
382         }
383         ArkUI_Int32 radioLength = radio->size;
384         if (radioLength <= 0) {
385             return ERROR_CODE_PARAM_INVALID;
386         }
387         ArkUI_Float32 radioList[radioLength];
388         for (int i = 0; i < radioLength; ++i) {
389             if (LessNotEqual(radio->value[i].f32, 0.0f) || GreatNotEqual(radio->value[i].f32, 1.0f)) {
390                 return ERROR_CODE_PARAM_INVALID;
391             }
392             radioList[i] = radio->value[i].f32;
393         }
394         impl->getNodeModifiers()->getCommonModifier()->setOnVisibleAreaChange(
395             nodePtr->uiNodeHandle, reinterpret_cast<int64_t>(nodePtr), radioList, radioLength);
396     } else {
397         impl->getBasicAPI()->registerNodeAsyncEvent(
398             nodePtr->uiNodeHandle, static_cast<ArkUIEventSubKind>(originEventType), reinterpret_cast<int64_t>(nodePtr));
399     }
400     return ERROR_CODE_NO_ERROR;
401 }
402 
UnregisterNodeEvent(ArkUI_NodeHandle nodePtr,ArkUI_NodeEventType eventType)403 void UnregisterNodeEvent(ArkUI_NodeHandle nodePtr, ArkUI_NodeEventType eventType)
404 {
405     if (nodePtr == nullptr || !CheckIsCNode(nodePtr)) {
406         return;
407     }
408     if (!nodePtr->extraData) {
409         return;
410     }
411     if (nodePtr->type == -1) {
412         return;
413     }
414     auto* extraData = reinterpret_cast<ExtraData*>(nodePtr->extraData);
415     auto& eventMap = extraData->eventMap;
416     auto innerEventExtraParam = eventMap.find(eventType);
417     if (innerEventExtraParam == eventMap.end()) {
418         return;
419     }
420     delete innerEventExtraParam->second;
421     eventMap.erase(innerEventExtraParam);
422     if (eventMap.empty()) {
423         delete extraData;
424         nodePtr->extraData = nullptr;
425     }
426     auto originEventType = ConvertOriginEventType(eventType, nodePtr->type);
427     if (originEventType < 0) {
428         return;
429     }
430     impl->getBasicAPI()->unRegisterNodeAsyncEvent(
431         nodePtr->uiNodeHandle, static_cast<ArkUIEventSubKind>(originEventType));
432 }
433 
434 void (*g_compatibleEventReceiver)(ArkUI_CompatibleNodeEvent* event) = nullptr;
RegisterOnEvent(void (* eventReceiver)(ArkUI_CompatibleNodeEvent * event))435 void RegisterOnEvent(void (*eventReceiver)(ArkUI_CompatibleNodeEvent* event))
436 {
437     g_compatibleEventReceiver = eventReceiver;
438 }
439 
440 void (*g_eventReceiver)(ArkUI_NodeEvent* event) = nullptr;
RegisterOnEvent(void (* eventReceiver)(ArkUI_NodeEvent * event))441 void RegisterOnEvent(void (*eventReceiver)(ArkUI_NodeEvent* event))
442 {
443     g_eventReceiver = eventReceiver;
444 }
445 
UnregisterOnEvent()446 void UnregisterOnEvent()
447 {
448     g_eventReceiver = nullptr;
449 }
450 
HandleTouchEvent(ArkUI_UIInputEvent & uiEvent,ArkUINodeEvent * innerEvent)451 void HandleTouchEvent(ArkUI_UIInputEvent& uiEvent, ArkUINodeEvent* innerEvent)
452 {
453     uiEvent.inputType = ARKUI_UIINPUTEVENT_TYPE_TOUCH;
454     uiEvent.eventTypeId = C_TOUCH_EVENT_ID;
455     uiEvent.inputEvent = &(innerEvent->touchEvent);
456 }
457 
HandleMouseEvent(ArkUI_UIInputEvent & uiEvent,ArkUINodeEvent * innerEvent)458 void HandleMouseEvent(ArkUI_UIInputEvent& uiEvent, ArkUINodeEvent* innerEvent)
459 {
460     uiEvent.inputType = ARKUI_UIINPUTEVENT_TYPE_MOUSE;
461     uiEvent.eventTypeId = C_MOUSE_EVENT_ID;
462     uiEvent.inputEvent = &(innerEvent->mouseEvent);
463 }
464 
HandleKeyEvent(ArkUI_UIInputEvent & uiEvent,ArkUINodeEvent * innerEvent)465 void HandleKeyEvent(ArkUI_UIInputEvent& uiEvent, ArkUINodeEvent* innerEvent)
466 {
467     uiEvent.eventTypeId = C_KEY_EVENT_ID;
468     uiEvent.inputEvent = &(innerEvent->keyEvent);
469 }
470 
HandleFocusAxisEvent(ArkUI_UIInputEvent & uiEvent,ArkUINodeEvent * innerEvent)471 void HandleFocusAxisEvent(ArkUI_UIInputEvent& uiEvent, ArkUINodeEvent* innerEvent)
472 {
473     uiEvent.eventTypeId = C_FOCUS_AXIS_EVENT_ID;
474     uiEvent.inputEvent = &(innerEvent->focusAxisEvent);
475 }
476 
HandleInnerNodeEvent(ArkUINodeEvent * innerEvent)477 void HandleInnerNodeEvent(ArkUINodeEvent* innerEvent)
478 {
479     if (!innerEvent) {
480         return;
481     }
482     auto nativeNodeEventType = GetNativeNodeEventType(innerEvent);
483     if (nativeNodeEventType == -1) {
484         return;
485     }
486     auto eventType = static_cast<ArkUI_NodeEventType>(nativeNodeEventType);
487     auto* nodePtr = reinterpret_cast<ArkUI_NodeHandle>(innerEvent->extraParam);
488     auto extraData = reinterpret_cast<ExtraData*>(nodePtr->extraData);
489     if (!extraData) {
490         return;
491     }
492     auto innerEventExtraParam = extraData->eventMap.find(eventType);
493     if (innerEventExtraParam == extraData->eventMap.end()) {
494         return;
495     }
496     ArkUI_NodeEvent event;
497     event.node = nodePtr;
498     event.eventId = innerEventExtraParam->second->targetId;
499     event.userData = innerEventExtraParam->second->userData;
500     if (!g_eventReceiver && !g_compatibleEventReceiver && (!(event.node) ||
501         (event.node && !(event.node->eventListeners)))) {
502         TAG_LOGE(AceLogTag::ACE_NATIVE_NODE, "event receiver is not register");
503         return;
504     }
505     if ((g_eventReceiver || (event.node && event.node->eventListeners))  && ConvertEvent(innerEvent, &event)) {
506         event.targetId = innerEvent->nodeId;
507         ArkUI_UIInputEvent uiEvent;
508         std::map<ArkUI_NodeEventType, std::function<void(ArkUI_UIInputEvent&, ArkUINodeEvent*)>> eventHandlers = {
509             {NODE_TOUCH_EVENT, HandleTouchEvent},
510             {NODE_ON_TOUCH_INTERCEPT, HandleTouchEvent},
511             {NODE_ON_MOUSE, HandleMouseEvent},
512             {NODE_ON_KEY_EVENT, HandleKeyEvent},
513             {NODE_ON_KEY_PRE_IME, HandleKeyEvent},
514             {NODE_ON_FOCUS_AXIS, HandleFocusAxisEvent},
515             {NODE_DISPATCH_KEY_EVENT, HandleKeyEvent},
516             {NODE_ON_HOVER_MOVE, HandleTouchEvent},
517         };
518 
519         auto it = eventHandlers.find(eventType);
520         if (it != eventHandlers.end()) {
521             it->second(uiEvent, innerEvent);
522             event.origin = &uiEvent;
523         } else {
524             event.origin = innerEvent;
525         }
526         HandleNodeEvent(&event);
527     }
528     if (g_compatibleEventReceiver) {
529         ArkUI_CompatibleNodeEvent event;
530         event.node = nodePtr;
531         event.eventId = innerEventExtraParam->second->targetId;
532         if (ConvertEvent(innerEvent, &event)) {
533             g_compatibleEventReceiver(&event);
534             ConvertEventResult(&event, innerEvent);
535         }
536     }
537 }
538 
GetNativeNodeEventType(ArkUINodeEvent * innerEvent)539 int32_t GetNativeNodeEventType(ArkUINodeEvent* innerEvent)
540 {
541     int32_t invalidType = -1;
542     auto* nodePtr = reinterpret_cast<ArkUI_NodeHandle>(innerEvent->extraParam);
543     if (!nodePtr || g_nodeSet.count(nodePtr) == 0) {
544         return invalidType;
545     }
546     if (!nodePtr->extraData) {
547         return invalidType;
548     }
549     auto extraData = reinterpret_cast<ExtraData*>(nodePtr->extraData);
550     ArkUIEventSubKind subKind = static_cast<ArkUIEventSubKind>(-1);
551     switch (innerEvent->kind) {
552         case COMPONENT_ASYNC_EVENT:
553             subKind = static_cast<ArkUIEventSubKind>(innerEvent->componentAsyncEvent.subKind);
554             break;
555         case TEXT_INPUT:
556             subKind = static_cast<ArkUIEventSubKind>(innerEvent->textInputEvent.subKind);
557             break;
558         case TOUCH_EVENT:
559             subKind = static_cast<ArkUIEventSubKind>(innerEvent->touchEvent.subKind);
560             break;
561         case MOUSE_INPUT_EVENT:
562             subKind = static_cast<ArkUIEventSubKind>(innerEvent->mouseEvent.subKind);
563             break;
564         case MIXED_EVENT:
565             subKind = static_cast<ArkUIEventSubKind>(innerEvent->mixedEvent.subKind);
566             break;
567         case DRAG_EVENT:
568             subKind = static_cast<ArkUIEventSubKind>(innerEvent->dragEvent.subKind);
569             break;
570         case KEY_INPUT_EVENT:
571             subKind = static_cast<ArkUIEventSubKind>(innerEvent->keyEvent.subKind);
572             break;
573         case FOCUS_AXIS_EVENT:
574             subKind = static_cast<ArkUIEventSubKind>(innerEvent->focusAxisEvent.subKind);
575             break;
576         case TEXT_INPUT_CHANGE:
577             subKind = static_cast<ArkUIEventSubKind>(innerEvent->textChangeEvent.subKind);
578             break;
579         default:
580             break; /* Empty */
581     }
582     ArkUI_NodeEventType eventType = static_cast<ArkUI_NodeEventType>(ConvertToNodeEventType(subKind));
583     auto innerEventExtraParam = extraData->eventMap.find(eventType);
584     if (innerEventExtraParam == extraData->eventMap.end()) {
585         TAG_LOGE(AceLogTag::ACE_NATIVE_NODE, "the event of %{public}d is not register", eventType);
586         return invalidType;
587     }
588     return static_cast<int32_t>(eventType);
589 }
590 
HandleNodeEvent(ArkUI_NodeEvent * event)591 void HandleNodeEvent(ArkUI_NodeEvent* event)
592 {
593     if (!event) {
594         return;
595     }
596     if (event->node && event->node->eventListeners) {
597         auto eventListenersSet = reinterpret_cast<std::set<void (*)(ArkUI_NodeEvent*)>*>(event->node->eventListeners);
598         TriggerNodeEvent(event, eventListenersSet);
599     }
600     if (g_eventReceiver) {
601         g_eventReceiver(event);
602     }
603 }
604 
TriggerNodeEvent(ArkUI_NodeEvent * event,std::set<void (*)(ArkUI_NodeEvent *)> * eventListenersSet)605 void TriggerNodeEvent(ArkUI_NodeEvent* event, std::set<void (*)(ArkUI_NodeEvent*)>* eventListenersSet)
606 {
607     if (!eventListenersSet) {
608         return;
609     }
610     if (eventListenersSet->size() == 1) {
611         auto eventListener = eventListenersSet->begin();
612         (*eventListener)(event);
613     } else if (eventListenersSet->size() > 1) {
614         for (const auto& eventListener : *eventListenersSet) {
615             (*eventListener)(event);
616             if (!IsValidArkUINode(event->node)) {
617                 break;
618             }
619         }
620     }
621 }
622 
CheckEvent(ArkUI_NodeEvent * event)623 int32_t CheckEvent(ArkUI_NodeEvent* event)
624 {
625     return 0;
626 }
627 
SetUserData(ArkUI_NodeHandle node,void * userData)628 int32_t SetUserData(ArkUI_NodeHandle node, void* userData)
629 {
630     if (!node || !CheckIsCNode(node)) {
631         return ERROR_CODE_PARAM_INVALID;
632     }
633     if (!userData) {
634         return ERROR_CODE_PARAM_INVALID;
635     }
636     node->userData = userData;
637     return ERROR_CODE_NO_ERROR;
638 }
639 
GetUserData(ArkUI_NodeHandle node)640 void* GetUserData(ArkUI_NodeHandle node)
641 {
642     return node->userData;
643 }
644 
SetLengthMetricUnit(ArkUI_NodeHandle nodePtr,ArkUI_LengthMetricUnit unit)645 int32_t SetLengthMetricUnit(ArkUI_NodeHandle nodePtr, ArkUI_LengthMetricUnit unit)
646 {
647     if (!nodePtr || !CheckIsCNode(nodePtr)) {
648         return ERROR_CODE_PARAM_INVALID;
649     }
650     if (!InRegion(static_cast<int32_t>(ARKUI_LENGTH_METRIC_UNIT_DEFAULT),
651         static_cast<int32_t>(ARKUI_LENGTH_METRIC_UNIT_FP), static_cast<int32_t>(unit))) {
652         return ERROR_CODE_PARAM_INVALID;
653     }
654     nodePtr->lengthMetricUnit = unit;
655     return ERROR_CODE_NO_ERROR;
656 }
657 
ApplyModifierFinish(ArkUI_NodeHandle nodePtr)658 void ApplyModifierFinish(ArkUI_NodeHandle nodePtr)
659 {
660     // already check in entry point.
661     if (!nodePtr) {
662         return;
663     }
664     const auto* impl = GetFullImpl();
665     impl->getBasicAPI()->applyModifierFinish(nodePtr->uiNodeHandle);
666 }
667 
MarkDirty(ArkUI_NodeHandle nodePtr,ArkUI_NodeDirtyFlag dirtyFlag)668 void MarkDirty(ArkUI_NodeHandle nodePtr, ArkUI_NodeDirtyFlag dirtyFlag)
669 {
670     // spanNode inherited from UINode
671     if (!nodePtr || !CheckIsCNode(nodePtr)) {
672         return;
673     }
674     ArkUIDirtyFlag flag = ARKUI_DIRTY_FLAG_MEASURE;
675     switch (dirtyFlag) {
676         case NODE_NEED_MEASURE: {
677             flag = ARKUI_DIRTY_FLAG_MEASURE_SELF_AND_PARENT;
678             break;
679         }
680         case NODE_NEED_LAYOUT: {
681             flag = ARKUI_DIRTY_FLAG_LAYOUT;
682             break;
683         }
684         case NODE_NEED_RENDER: {
685             flag = ARKUI_DIRTY_FLAG_RENDER;
686             break;
687         }
688         default: {
689             flag = ARKUI_DIRTY_FLAG_MEASURE;
690         }
691     }
692     // already check in entry point.
693     const auto* impl = GetFullImpl();
694     impl->getBasicAPI()->markDirty(nodePtr->uiNodeHandle, flag);
695 }
696 
AddNodeEventReceiver(ArkUI_NodeHandle nodePtr,void (* eventReceiver)(ArkUI_NodeEvent * event))697 int32_t AddNodeEventReceiver(ArkUI_NodeHandle nodePtr, void (*eventReceiver)(ArkUI_NodeEvent* event))
698 {
699     if (!nodePtr || !eventReceiver || !CheckIsCNode(nodePtr)) {
700         return ERROR_CODE_PARAM_INVALID;
701     }
702     if (!nodePtr->eventListeners) {
703         nodePtr->eventListeners = new std::set<void (*)(ArkUI_NodeEvent*)>();
704     }
705     auto eventListenersSet = reinterpret_cast<std::set<void (*)(ArkUI_NodeEvent*)>*>(nodePtr->eventListeners);
706     if (!eventListenersSet) {
707         return ERROR_CODE_PARAM_INVALID;
708     }
709     eventListenersSet->emplace(eventReceiver);
710     return ERROR_CODE_NO_ERROR;
711 }
712 
RemoveNodeEventReceiver(ArkUI_NodeHandle nodePtr,void (* eventReceiver)(ArkUI_NodeEvent * event))713 int32_t RemoveNodeEventReceiver(ArkUI_NodeHandle nodePtr, void (*eventReceiver)(ArkUI_NodeEvent* event))
714 {
715     if (!nodePtr || !eventReceiver || !nodePtr->eventListeners || !CheckIsCNode(nodePtr)) {
716         return ERROR_CODE_PARAM_INVALID;
717     }
718     auto eventListenersSet = reinterpret_cast<std::set<void (*)(ArkUI_NodeEvent*)>*>(nodePtr->eventListeners);
719     if (!eventListenersSet) {
720         return ERROR_CODE_PARAM_INVALID;
721     }
722     eventListenersSet->erase(eventReceiver);
723     if (eventListenersSet->empty()) {
724         delete eventListenersSet;
725         nodePtr->eventListeners = nullptr;
726     }
727     return ERROR_CODE_NO_ERROR;
728 }
729 
GetParseJsMedia()730 void* GetParseJsMedia()
731 {
732     void* module = FindModule();
733     if (!module) {
734         TAG_LOGE(AceLogTag::ACE_NATIVE_NODE, "fail to get module");
735         return nullptr;
736     }
737     void (*parseJsMedia)(void* value, void* resource) = nullptr;
738     parseJsMedia = reinterpret_cast<void (*)(void*, void*)>(
739         FindFunction(module, "OHOS_ACE_ParseJsMedia"));
740     if (!parseJsMedia) {
741         TAG_LOGE(AceLogTag::ACE_NATIVE_NODE, "Cannot find OHOS_ACE_ParseJsMedia");
742         return nullptr;
743     }
744     return reinterpret_cast<void*>(parseJsMedia);
745 }
746 
CheckIsCNode(ArkUI_NodeHandle node)747 bool CheckIsCNode(ArkUI_NodeHandle node)
748 {
749     if (node->cNode || node->buildNode) {
750         return true;
751     }
752     return false;
753 }
754 
CheckIsCNodeOrCrossLanguage(ArkUI_NodeHandle node)755 bool CheckIsCNodeOrCrossLanguage(ArkUI_NodeHandle node)
756 {
757     if (node->cNode || node->buildNode) {
758         return true;
759     }
760     const auto* impl = GetFullImpl();
761     CHECK_NULL_RETURN(impl, false);
762     return impl->getNodeModifiers()->getFrameNodeModifier()->getCrossLanguageOptions(node->uiNodeHandle);
763 }
764 
GetArkUINode(ArkUINodeHandle node)765 ArkUI_NodeHandle GetArkUINode(ArkUINodeHandle node)
766 {
767     CHECK_NULL_RETURN(node, nullptr);
768     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
769     void* attachNode = impl->getExtendedAPI()->getAttachNodePtr(node);
770     if (attachNode) {
771         return reinterpret_cast<ArkUI_NodeHandle>(attachNode);
772     }
773     ArkUI_Node* arkUINode = new ArkUI_Node({ -1, node, false });
774     arkUINode->type = GetNodeTypeByTag(arkUINode);
775     impl->getExtendedAPI()->setAttachNodePtr((arkUINode)->uiNodeHandle, reinterpret_cast<void*>(arkUINode));
776     return reinterpret_cast<ArkUI_NodeHandle>(arkUINode);
777 }
778 
GetNodeTypeByTag(ArkUI_NodeHandle node)779 int32_t GetNodeTypeByTag(ArkUI_NodeHandle node)
780 {
781     if (node == nullptr) {
782         return -1;
783     }
784 
785     static const std::unordered_map<std::string, ArkUI_NodeType> nodeTypeMap = {
786         { OHOS::Ace::V2::TEXT_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_TEXT },
787         { OHOS::Ace::V2::SPAN_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_SPAN },
788         { OHOS::Ace::V2::IMAGE_SPAN_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_IMAGE_SPAN },
789         { OHOS::Ace::V2::IMAGE_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_IMAGE },
790         { OHOS::Ace::V2::TOGGLE_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_TOGGLE },
791         { OHOS::Ace::V2::LOADING_PROGRESS_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_LOADING_PROGRESS },
792         { OHOS::Ace::V2::TEXTINPUT_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_TEXT_INPUT },
793         { OHOS::Ace::V2::TEXTAREA_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_TEXT_AREA },
794         { OHOS::Ace::V2::BUTTON_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_BUTTON },
795         { OHOS::Ace::V2::PROGRESS_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_PROGRESS },
796         { OHOS::Ace::V2::CHECK_BOX_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_CHECKBOX },
797         { OHOS::Ace::V2::XCOMPONENT_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_XCOMPONENT },
798         { OHOS::Ace::V2::DATE_PICKER_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_DATE_PICKER },
799         { OHOS::Ace::V2::TIME_PICKER_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_TIME_PICKER },
800         { OHOS::Ace::V2::TEXT_PICKER_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_TEXT_PICKER },
801         { OHOS::Ace::V2::CALENDAR_PICKER_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_CALENDAR_PICKER },
802         { OHOS::Ace::V2::SLIDER_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_SLIDER },
803         { OHOS::Ace::V2::RADIO_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_RADIO },
804         { OHOS::Ace::V2::IMAGE_ANIMATOR_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_IMAGE_ANIMATOR },
805         { OHOS::Ace::V2::STACK_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_STACK },
806         { OHOS::Ace::V2::SWIPER_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_SWIPER },
807         { OHOS::Ace::V2::SCROLL_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_SCROLL },
808         { OHOS::Ace::V2::LIST_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_LIST },
809         { OHOS::Ace::V2::LIST_ITEM_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_LIST_ITEM },
810         { OHOS::Ace::V2::LIST_ITEM_GROUP_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_LIST_ITEM_GROUP },
811         { OHOS::Ace::V2::COLUMN_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_COLUMN },
812         { OHOS::Ace::V2::ROW_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_ROW },
813         { OHOS::Ace::V2::FLEX_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_FLEX },
814         { OHOS::Ace::V2::REFRESH_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_REFRESH },
815         { OHOS::Ace::V2::WATERFLOW_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_WATER_FLOW },
816         { OHOS::Ace::V2::FLOW_ITEM_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_FLOW_ITEM },
817         { OHOS::Ace::V2::RELATIVE_CONTAINER_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_RELATIVE_CONTAINER },
818         { OHOS::Ace::V2::GRID_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_GRID },
819         { OHOS::Ace::V2::GRID_ITEM_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_GRID_ITEM },
820         { OHOS::Ace::V2::CUSTOM_SPAN_NODE_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_CUSTOM_SPAN },
821     };
822 
823     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
824     auto value = impl->getNodeModifiers()->getFrameNodeModifier()->getNodeType(node->uiNodeHandle);
825     auto iter = nodeTypeMap.find(value);
826     if (iter != nodeTypeMap.end()) {
827         return iter->second;
828     }
829     return -1;
830 }
831 } // namespace OHOS::Ace::NodeModel
832 
833 #ifdef __cplusplus
834 extern "C" {
835 #endif
836 
OH_ArkUI_NodeContent_AddNode(ArkUI_NodeContentHandle content,ArkUI_NodeHandle node)837 int32_t OH_ArkUI_NodeContent_AddNode(ArkUI_NodeContentHandle content, ArkUI_NodeHandle node)
838 {
839     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
840     CHECK_NULL_RETURN(impl, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_LIBRARY_NOT_FOUND);
841     CHECK_NULL_RETURN(node, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
842     return impl->getNodeModifiers()->getNodeContentModifier()->addChild(
843         reinterpret_cast<ArkUINodeContentHandle>(content), node->uiNodeHandle);
844 }
845 
OH_ArkUI_NodeContent_InsertNode(ArkUI_NodeContentHandle content,ArkUI_NodeHandle node,int32_t position)846 int32_t OH_ArkUI_NodeContent_InsertNode(ArkUI_NodeContentHandle content, ArkUI_NodeHandle node, int32_t position)
847 {
848     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
849     CHECK_NULL_RETURN(impl, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_LIBRARY_NOT_FOUND);
850     CHECK_NULL_RETURN(node, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
851     return impl->getNodeModifiers()->getNodeContentModifier()->insertChild(
852         reinterpret_cast<ArkUINodeContentHandle>(content), node->uiNodeHandle, position);
853 }
854 
OH_ArkUI_NodeContent_RemoveNode(ArkUI_NodeContentHandle content,ArkUI_NodeHandle node)855 int32_t OH_ArkUI_NodeContent_RemoveNode(ArkUI_NodeContentHandle content, ArkUI_NodeHandle node)
856 {
857     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
858     CHECK_NULL_RETURN(impl, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_LIBRARY_NOT_FOUND);
859     CHECK_NULL_RETURN(node, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
860     return impl->getNodeModifiers()->getNodeContentModifier()->removeChild(
861         reinterpret_cast<ArkUINodeContentHandle>(content), node->uiNodeHandle);
862 }
863 
OH_ArkUI_NodeContent_RegisterCallback(ArkUI_NodeContentHandle content,ArkUI_NodeContentCallback callback)864 int32_t OH_ArkUI_NodeContent_RegisterCallback(ArkUI_NodeContentHandle content, ArkUI_NodeContentCallback callback)
865 {
866     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
867     CHECK_NULL_RETURN(impl, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_LIBRARY_NOT_FOUND);
868     auto innerCallback = reinterpret_cast<void (*)(ArkUINodeContentEvent* event)>(callback);
869     return impl->getNodeModifiers()->getNodeContentModifier()->registerEvent(
870         reinterpret_cast<ArkUINodeContentHandle>(content), nullptr, innerCallback);
871 }
872 
OH_ArkUI_NodeContentEvent_GetEventType(ArkUI_NodeContentEvent * event)873 ArkUI_NodeContentEventType OH_ArkUI_NodeContentEvent_GetEventType(ArkUI_NodeContentEvent* event)
874 {
875     CHECK_NULL_RETURN(event, static_cast<ArkUI_NodeContentEventType>(-1));
876     auto* innerEvent = reinterpret_cast<ArkUINodeContentEvent*>(event);
877     return static_cast<ArkUI_NodeContentEventType>(innerEvent->type);
878 }
879 
OH_ArkUI_NodeContentEvent_GetNodeContentHandle(ArkUI_NodeContentEvent * event)880 ArkUI_NodeContentHandle OH_ArkUI_NodeContentEvent_GetNodeContentHandle(ArkUI_NodeContentEvent* event)
881 {
882     CHECK_NULL_RETURN(event, nullptr);
883     auto* innerEvent = reinterpret_cast<ArkUINodeContentEvent*>(event);
884     return reinterpret_cast<ArkUI_NodeContentHandle>(innerEvent->nodeContent);
885 }
886 
OH_ArkUI_NodeContent_SetUserData(ArkUI_NodeContentHandle content,void * userData)887 int32_t OH_ArkUI_NodeContent_SetUserData(ArkUI_NodeContentHandle content, void* userData)
888 {
889     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
890     CHECK_NULL_RETURN(impl, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_LIBRARY_NOT_FOUND);
891     return impl->getNodeModifiers()->getNodeContentModifier()->setUserData(
892         reinterpret_cast<ArkUINodeContentHandle>(content), userData);
893 }
894 
OH_ArkUI_NodeContent_GetUserData(ArkUI_NodeContentHandle content)895 void* OH_ArkUI_NodeContent_GetUserData(ArkUI_NodeContentHandle content)
896 {
897     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
898     CHECK_NULL_RETURN(impl, nullptr);
899     return impl->getNodeModifiers()->getNodeContentModifier()->getUserData(
900         reinterpret_cast<ArkUINodeContentHandle>(content));
901 }
902 
903 #ifdef __cplusplus
904 };
905 #endif
906