1 /*
2  * Copyright (c) 2024 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 <cstdint>
17 #include <cstdlib>
18 #include <vector>
19 
20 #include "native_type.h"
21 #include "node_model.h"
22 #include "node_extened.h"
23 
24 #include "base/utils/utils.h"
25 #include "base/error/error_code.h"
26 #include "core/interfaces/arkoala/arkoala_api.h"
27 #include "core/components_v2/inspector/inspector_constants.h"
28 
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32 
OH_ArkUI_NodeUtils_GetLayoutSize(ArkUI_NodeHandle node,ArkUI_IntSize * size)33 int32_t OH_ArkUI_NodeUtils_GetLayoutSize(ArkUI_NodeHandle node, ArkUI_IntSize* size)
34 {
35     if (node == nullptr) {
36         return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
37     }
38     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
39     ArkUI_Int32* tempSize = new ArkUI_Int32[2];
40     impl->getNodeModifiers()->getFrameNodeModifier()->getLayoutSize(node->uiNodeHandle, tempSize);
41     size->width = tempSize[0];
42     size->height = tempSize[1];
43     return OHOS::Ace::ERROR_CODE_NO_ERROR;
44 }
45 
OH_ArkUI_NodeUtils_GetLayoutPosition(ArkUI_NodeHandle node,ArkUI_IntOffset * localOffset)46 int32_t OH_ArkUI_NodeUtils_GetLayoutPosition(ArkUI_NodeHandle node, ArkUI_IntOffset* localOffset)
47 {
48     if (node == nullptr) {
49         return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
50     }
51     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
52     auto value = impl->getNodeModifiers()->getFrameNodeModifier()->getLayoutPositionWithoutMargin(node->uiNodeHandle);
53     localOffset->x = static_cast<int32_t>(value[0]);
54     localOffset->y = static_cast<int32_t>(value[1]);
55 
56     return OHOS::Ace::ERROR_CODE_NO_ERROR;
57 }
58 
OH_ArkUI_NodeUtils_GetLayoutPositionInWindow(ArkUI_NodeHandle node,ArkUI_IntOffset * globalOffset)59 int32_t OH_ArkUI_NodeUtils_GetLayoutPositionInWindow(ArkUI_NodeHandle node, ArkUI_IntOffset* globalOffset)
60 {
61     if (node == nullptr) {
62         return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
63     }
64     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
65     ArkUI_Float32 tempOffset[2];
66     impl->getNodeModifiers()->getFrameNodeModifier()->getPositionToWindow(node->uiNodeHandle, &tempOffset, false);
67     globalOffset->x = tempOffset[0];
68     globalOffset->y = tempOffset[1];
69 
70     return OHOS::Ace::ERROR_CODE_NO_ERROR;
71 }
72 
OH_ArkUI_NodeUtils_GetLayoutPositionInScreen(ArkUI_NodeHandle node,ArkUI_IntOffset * screenOffset)73 int32_t OH_ArkUI_NodeUtils_GetLayoutPositionInScreen(ArkUI_NodeHandle node, ArkUI_IntOffset* screenOffset)
74 {
75     if (node == nullptr) {
76         return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
77     }
78     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
79     ArkUI_Float32 tempOffset[2];
80     impl->getNodeModifiers()->getFrameNodeModifier()->getPositionToScreen(node->uiNodeHandle, &tempOffset, false);
81     screenOffset->x = tempOffset[0];
82     screenOffset->y = tempOffset[1];
83 
84     return OHOS::Ace::ERROR_CODE_NO_ERROR;
85 }
86 
OH_ArkUI_NodeUtils_GetPositionWithTranslateInWindow(ArkUI_NodeHandle node,ArkUI_IntOffset * translateOffset)87 int32_t OH_ArkUI_NodeUtils_GetPositionWithTranslateInWindow(ArkUI_NodeHandle node, ArkUI_IntOffset* translateOffset)
88 {
89     if (node == nullptr) {
90         return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
91     }
92     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
93     ArkUI_Float32 tempOffset[2];
94     impl->getNodeModifiers()->getFrameNodeModifier()->getPositionToWindowWithTransform(
95         node->uiNodeHandle, &tempOffset, false);
96     translateOffset->x = tempOffset[0];
97     translateOffset->y = tempOffset[1];
98 
99     return OHOS::Ace::ERROR_CODE_NO_ERROR;
100 }
101 
OH_ArkUI_NodeUtils_GetPositionWithTranslateInScreen(ArkUI_NodeHandle node,ArkUI_IntOffset * translateOffset)102 int32_t OH_ArkUI_NodeUtils_GetPositionWithTranslateInScreen(ArkUI_NodeHandle node, ArkUI_IntOffset* translateOffset)
103 {
104     if (node == nullptr) {
105         return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
106     }
107     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
108     ArkUI_Float32 tempOffset[2];
109     impl->getNodeModifiers()->getFrameNodeModifier()->getPositionToScreenWithTransform(
110         node->uiNodeHandle, &tempOffset, false);
111     translateOffset->x = tempOffset[0];
112     translateOffset->y = tempOffset[1];
113 
114     return OHOS::Ace::ERROR_CODE_NO_ERROR;
115 }
116 
OH_ArkUI_RegisterSystemColorModeChangeEvent(ArkUI_NodeHandle node,void * userData,void (* onColorModeChange)(ArkUI_SystemColorMode colorMode,void * userData))117 int32_t OH_ArkUI_RegisterSystemColorModeChangeEvent(
118     ArkUI_NodeHandle node, void* userData, void (*onColorModeChange)(ArkUI_SystemColorMode colorMode, void* userData))
119 {
120     if (node == nullptr) {
121         return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
122     }
123     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
124     impl->getNodeModifiers()->getFrameNodeModifier()->setSystemColorModeChangeEvent(
125         node->uiNodeHandle, userData, reinterpret_cast<void*>(onColorModeChange));
126 
127     return OHOS::Ace::ERROR_CODE_NO_ERROR;
128 }
129 
OH_ArkUI_UnregisterSystemColorModeChangeEvent(ArkUI_NodeHandle node)130 void OH_ArkUI_UnregisterSystemColorModeChangeEvent(ArkUI_NodeHandle node)
131 {
132     if (node == nullptr) {
133         return;
134     }
135     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
136     impl->getNodeModifiers()->getFrameNodeModifier()->resetSystemColorModeChangeEvent(node->uiNodeHandle);
137 }
138 
OH_ArkUI_RegisterSystemFontStyleChangeEvent(ArkUI_NodeHandle node,void * userData,void (* onFontStyleChange)(ArkUI_SystemFontStyleEvent * event,void * userData))139 int32_t OH_ArkUI_RegisterSystemFontStyleChangeEvent(
140     ArkUI_NodeHandle node, void* userData, void (*onFontStyleChange)(ArkUI_SystemFontStyleEvent* event, void* userData))
141 {
142     if (node == nullptr) {
143         return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
144     }
145     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
146     impl->getNodeModifiers()->getFrameNodeModifier()->setSystemFontStyleChangeEvent(
147         node->uiNodeHandle, userData, reinterpret_cast<void*>(onFontStyleChange));
148 
149     return OHOS::Ace::ERROR_CODE_NO_ERROR;
150 }
151 
OH_ArkUI_UnregisterSystemFontStyleChangeEvent(ArkUI_NodeHandle node)152 void OH_ArkUI_UnregisterSystemFontStyleChangeEvent(ArkUI_NodeHandle node)
153 {
154     if (node == nullptr) {
155         return;
156     }
157     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
158     impl->getNodeModifiers()->getFrameNodeModifier()->resetSystemFontStyleChangeEvent(node->uiNodeHandle);
159 }
160 
OH_ArkUI_SystemFontStyleEvent_GetFontSizeScale(const ArkUI_SystemFontStyleEvent * event)161 float OH_ArkUI_SystemFontStyleEvent_GetFontSizeScale(const ArkUI_SystemFontStyleEvent* event)
162 {
163     return event->fontSize;
164 }
165 
OH_ArkUI_SystemFontStyleEvent_GetFontWeightScale(const ArkUI_SystemFontStyleEvent * event)166 float OH_ArkUI_SystemFontStyleEvent_GetFontWeightScale(const ArkUI_SystemFontStyleEvent* event)
167 {
168     return event->fontWeight;
169 }
170 
OH_ArkUI_NodeUtils_AddCustomProperty(ArkUI_NodeHandle node,const char * name,const char * value)171 void OH_ArkUI_NodeUtils_AddCustomProperty(ArkUI_NodeHandle node, const char* name, const char* value)
172 {
173     if (node == nullptr) {
174         return;
175     }
176     if (name == nullptr || value == nullptr) {
177         LOGF("AddCustomProperty input params name or value is nullptr");
178         abort();
179     }
180     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
181     impl->getNodeModifiers()->getFrameNodeModifier()->addCustomProperty(node->uiNodeHandle, name, value);
182 }
183 
OH_ArkUI_NodeUtils_RemoveCustomProperty(ArkUI_NodeHandle node,const char * name)184 void OH_ArkUI_NodeUtils_RemoveCustomProperty(ArkUI_NodeHandle node, const char* name)
185 {
186     if (node == nullptr) {
187         return;
188     }
189     if (name == nullptr) {
190         LOGF("RemoveCustomProperty input params name is nullptr");
191         abort();
192     }
193     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
194     impl->getNodeModifiers()->getFrameNodeModifier()->removeCustomProperty(node->uiNodeHandle, name);
195 }
196 
OH_ArkUI_NodeUtils_GetCustomProperty(ArkUI_NodeHandle node,const char * name,ArkUI_CustomProperty ** handle)197 int32_t OH_ArkUI_NodeUtils_GetCustomProperty(ArkUI_NodeHandle node, const char* name, ArkUI_CustomProperty** handle)
198 {
199     if (node == nullptr || name == nullptr) {
200         return ARKUI_ERROR_CODE_PARAM_INVALID;
201     }
202     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
203     char* value = nullptr;
204     impl->getNodeModifiers()->getFrameNodeModifier()->getCustomProperty(node->uiNodeHandle, name, &value);
205     *handle  = new ArkUI_CustomProperty({ .value = value });
206 
207     return OHOS::Ace::ERROR_CODE_NO_ERROR;
208 }
209 
GetArkUINode(ArkUINodeHandle node)210 ArkUI_NodeHandle GetArkUINode(ArkUINodeHandle node)
211 {
212     CHECK_NULL_RETURN(node, nullptr);
213     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
214     void* attachNode = impl->getExtendedAPI()->getAttachNodePtr(node);
215     if (attachNode) {
216         return reinterpret_cast<ArkUI_NodeHandle>(attachNode);
217     }
218     ArkUI_Node* arkUINode = new ArkUI_Node({ -1, node, false });
219     impl->getExtendedAPI()->setAttachNodePtr((arkUINode)->uiNodeHandle, reinterpret_cast<void*>(arkUINode));
220     return reinterpret_cast<ArkUI_NodeHandle>(arkUINode);
221 }
222 
OH_ArkUI_NodeUtils_GetActiveChildrenInfo(ArkUI_NodeHandle head,ArkUI_ActiveChildrenInfo ** handle)223 int32_t OH_ArkUI_NodeUtils_GetActiveChildrenInfo(ArkUI_NodeHandle head, ArkUI_ActiveChildrenInfo** handle)
224 {
225     CHECK_NULL_RETURN(head, ARKUI_ERROR_CODE_PARAM_INVALID);
226     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
227     CHECK_NULL_RETURN(impl, ARKUI_ERROR_CODE_PARAM_INVALID);
228     ArkUINodeHandle* innerNodes = nullptr;
229     int32_t totalSize = 0;
230     impl->getNodeModifiers()->getFrameNodeModifier()->getActiveChildrenInfo(
231         head->uiNodeHandle, &innerNodes, &totalSize);
232     *handle = new ArkUI_ActiveChildrenInfo({ .nodeList = nullptr, .nodeCount = totalSize });
233     (*handle)->nodeCount = totalSize;
234     if (totalSize > 0) {
235         (*handle)->nodeList = new ArkUI_NodeHandle[totalSize] {};
236         for (int32_t i = 0; i < totalSize; i++) {
237             ((*handle)->nodeList[i]) = GetArkUINode(innerNodes[i]);
238         }
239     }
240     delete[] innerNodes;
241     return OHOS::Ace::ERROR_CODE_NO_ERROR;
242 }
243 
OH_ArkUI_NodeUtils_GetParentInPageTree(ArkUI_NodeHandle node)244 ArkUI_NodeHandle OH_ArkUI_NodeUtils_GetParentInPageTree(ArkUI_NodeHandle node)
245 {
246     if (node == nullptr) {
247         return nullptr;
248     }
249     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
250     auto* attachNode = impl->getNodeModifiers()->getFrameNodeModifier()->getParent(node->uiNodeHandle);
251     return GetArkUINode(attachNode);
252 }
253 
OH_ArkUI_NodeUtils_GetCurrentPageRootNode(ArkUI_NodeHandle node)254 ArkUI_NodeHandle OH_ArkUI_NodeUtils_GetCurrentPageRootNode(ArkUI_NodeHandle node)
255 {
256     if (node == nullptr) {
257         return nullptr;
258     }
259     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
260     auto* attachNode = impl->getNodeModifiers()->getFrameNodeModifier()->getCurrentPageRootNode(node->uiNodeHandle);
261     return GetArkUINode(attachNode);
262 }
263 
OH_ArkUI_NodeUtils_IsCreatedByNDK(ArkUI_NodeHandle node)264 bool OH_ArkUI_NodeUtils_IsCreatedByNDK(ArkUI_NodeHandle node)
265 {
266     if (node == nullptr) {
267         return 0;
268     }
269     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
270     return impl->getNodeModifiers()->getFrameNodeModifier()->getNodeTag(node->uiNodeHandle);
271 }
272 
OH_ArkUI_NodeUtils_GetNodeType(ArkUI_NodeHandle node)273 int32_t OH_ArkUI_NodeUtils_GetNodeType(ArkUI_NodeHandle node)
274 {
275     if (node == nullptr) {
276         return -1;
277     }
278     if (node->type != -1) {
279         return node->type;
280     }
281 
282     static const std::unordered_map<std::string, ArkUI_NodeType> nodeTypeMap = {
283         { OHOS::Ace::V2::TEXT_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_TEXT },
284         { OHOS::Ace::V2::SPAN_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_SPAN },
285         { OHOS::Ace::V2::IMAGE_SPAN_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_IMAGE_SPAN },
286         { OHOS::Ace::V2::IMAGE_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_IMAGE },
287         { OHOS::Ace::V2::TOGGLE_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_TOGGLE },
288         { OHOS::Ace::V2::LOADING_PROGRESS_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_LOADING_PROGRESS },
289         { OHOS::Ace::V2::TEXTINPUT_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_TEXT_INPUT },
290         { OHOS::Ace::V2::TEXTAREA_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_TEXT_AREA },
291         { OHOS::Ace::V2::BUTTON_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_BUTTON },
292         { OHOS::Ace::V2::PROGRESS_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_PROGRESS },
293         { OHOS::Ace::V2::CHECK_BOX_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_CHECKBOX },
294         { OHOS::Ace::V2::XCOMPONENT_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_XCOMPONENT },
295         { OHOS::Ace::V2::DATE_PICKER_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_DATE_PICKER },
296         { OHOS::Ace::V2::TIME_PICKER_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_TIME_PICKER },
297         { OHOS::Ace::V2::TEXT_PICKER_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_TEXT_PICKER },
298         { OHOS::Ace::V2::CALENDAR_PICKER_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_CALENDAR_PICKER },
299         { OHOS::Ace::V2::SLIDER_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_SLIDER },
300         { OHOS::Ace::V2::RADIO_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_RADIO },
301         { OHOS::Ace::V2::IMAGE_ANIMATOR_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_IMAGE_ANIMATOR },
302         { OHOS::Ace::V2::STACK_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_STACK },
303         { OHOS::Ace::V2::SWIPER_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_SWIPER },
304         { OHOS::Ace::V2::SCROLL_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_SCROLL },
305         { OHOS::Ace::V2::LIST_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_LIST },
306         { OHOS::Ace::V2::LIST_ITEM_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_LIST_ITEM },
307         { OHOS::Ace::V2::LIST_ITEM_GROUP_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_LIST_ITEM_GROUP },
308         { OHOS::Ace::V2::COLUMN_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_COLUMN },
309         { OHOS::Ace::V2::ROW_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_ROW },
310         { OHOS::Ace::V2::FLEX_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_FLEX },
311         { OHOS::Ace::V2::REFRESH_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_REFRESH },
312         { OHOS::Ace::V2::WATERFLOW_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_WATER_FLOW },
313         { OHOS::Ace::V2::FLOW_ITEM_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_FLOW_ITEM },
314         { OHOS::Ace::V2::RELATIVE_CONTAINER_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_RELATIVE_CONTAINER },
315         { OHOS::Ace::V2::GRID_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_GRID },
316         { OHOS::Ace::V2::GRID_ITEM_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_GRID_ITEM },
317         { OHOS::Ace::V2::CUSTOM_SPAN_NODE_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_CUSTOM_SPAN },
318     };
319 
320     const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
321     auto value = impl->getNodeModifiers()->getFrameNodeModifier()->getNodeType(node->uiNodeHandle);
322     auto iter = nodeTypeMap.find(value);
323     if (iter != nodeTypeMap.end()) {
324         return iter->second;
325     }
326     return -1;
327 }
328 
OH_ArkUI_CustomProperty_Destroy(ArkUI_CustomProperty * handle)329 void OH_ArkUI_CustomProperty_Destroy(ArkUI_CustomProperty* handle)
330 {
331     delete[] handle->value;
332     handle->value = nullptr;
333     delete handle;
334     handle = nullptr;
335 }
336 
OH_ArkUI_CustomProperty_GetStringValue(ArkUI_CustomProperty * handle)337 const char* OH_ArkUI_CustomProperty_GetStringValue(ArkUI_CustomProperty* handle)
338 {
339     if (!handle) {
340         LOGF("CustomProperty is nullptr");
341         abort();
342     }
343     return handle->value;
344 }
345 
OH_ArkUI_ActiveChildrenInfo_Destroy(ArkUI_ActiveChildrenInfo * handle)346 void OH_ArkUI_ActiveChildrenInfo_Destroy(ArkUI_ActiveChildrenInfo* handle)
347 {
348     delete[] handle->nodeList;
349     handle->nodeList = nullptr;
350     delete handle;
351     handle = nullptr;
352 }
353 
OH_ArkUI_ActiveChildrenInfo_GetNodeByIndex(ArkUI_ActiveChildrenInfo * handle,int32_t index)354 ArkUI_NodeHandle OH_ArkUI_ActiveChildrenInfo_GetNodeByIndex(ArkUI_ActiveChildrenInfo* handle, int32_t index)
355 {
356     if (!handle) {
357         LOGF("ActiveChildrenInfo is nullptr");
358         abort();
359     }
360     if (index < handle->nodeCount && index >= 0) {
361         return handle->nodeList[index];
362     }
363     return nullptr;
364 }
365 
OH_ArkUI_ActiveChildrenInfo_GetCount(ArkUI_ActiveChildrenInfo * handle)366 int32_t OH_ArkUI_ActiveChildrenInfo_GetCount(ArkUI_ActiveChildrenInfo* handle)
367 {
368     if (!handle) {
369         LOGF("ActiveChildrenInfo is nullptr");
370         abort();
371     }
372     return handle->nodeCount;
373 }
374 
375 #ifdef __cplusplus
376 };
377 #endif
378