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