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