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 "native_node_napi.h"
17
18 #include <cstdint>
19
20 #include "js_native_api.h"
21 #include "js_native_api_types.h"
22 #include "native_type.h"
23 #include "node/node_extened.h"
24 #include "node/node_model.h"
25
26 #include "base/error/error_code.h"
27 #include "base/image/pixel_map.h"
28 #include "base/log/log_wrapper.h"
29 #include "base/utils/utils.h"
30 #include "core/components_ng/base/frame_node.h"
31 #include "core/components_ng/base/ui_node.h"
32
33 extern "C" {
34
OH_ArkUI_GetNodeHandleFromNapiValue(napi_env env,napi_value value,ArkUI_NodeHandle * handle)35 int32_t OH_ArkUI_GetNodeHandleFromNapiValue(napi_env env, napi_value value, ArkUI_NodeHandle* handle)
36 {
37 bool hasProperty = false;
38 auto result = napi_has_named_property(env, value, "nodePtr_", &hasProperty);
39 auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
40 if (result == napi_ok && hasProperty) {
41 napi_value frameNodePtr = nullptr;
42 auto result = napi_get_named_property(env, value, "nodePtr_", &frameNodePtr);
43 if (result != napi_ok) {
44 LOGE("fail to get nodePtr");
45 return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
46 }
47 // BuilderNode case.
48 void* nativePtr = nullptr;
49 result = napi_get_value_external(env, frameNodePtr, &nativePtr);
50 if (result != napi_ok || nativePtr == nullptr) {
51 LOGE("fail to get nodePtr external value");
52 return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
53 }
54 auto* uiNodePtr = reinterpret_cast<OHOS::Ace::NG::UINode*>(nativePtr);
55 uiNodePtr->IncRefCount();
56 *handle = new ArkUI_Node({ .type = -1, .uiNodeHandle = reinterpret_cast<ArkUINodeHandle>(nativePtr) });
57 if (impl) {
58 impl->getExtendedAPI()->setAttachNodePtr((*handle)->uiNodeHandle, reinterpret_cast<void*>(*handle));
59 }
60 return OHOS::Ace::ERROR_CODE_NO_ERROR;
61 }
62 result = napi_has_named_property(env, value, "builderNode_", &hasProperty);
63 if (result == napi_ok && hasProperty) {
64 // Component Content case.
65 napi_value builderNode = nullptr;
66 auto result = napi_get_named_property(env, value, "builderNode_", &builderNode);
67 if (result != napi_ok) {
68 LOGE("fail to get builderNode");
69 return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
70 }
71 napi_value nodePtr = nullptr;
72 result = napi_get_named_property(env, builderNode, "nodePtr_", &nodePtr);
73 if (result != napi_ok) {
74 LOGE("fail to get nodePtr in builderNode");
75 return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
76 }
77 void* nativePtr = nullptr;
78 result = napi_get_value_external(env, nodePtr, &nativePtr);
79 if (result != napi_ok) {
80 LOGE("fail to get nodePtr external value in builderNode");
81 return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
82 }
83 auto* uiNode = reinterpret_cast<OHOS::Ace::NG::UINode*>(nativePtr);
84 OHOS::Ace::NG::FrameNode* frameNode = OHOS::Ace::AceType::DynamicCast<OHOS::Ace::NG::FrameNode>(uiNode);
85 if (frameNode == nullptr) {
86 LOGE("fail to get frameNode value in builderNode");
87 return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
88 }
89 if (frameNode->GetTag() == "BuilderProxyNode") {
90 // need to get the really frameNode.
91 if (!impl) {
92 return OHOS::Ace::ERROR_CODE_NATIVE_IMPL_LIBRARY_NOT_FOUND;
93 }
94 auto* child = impl->getNodeModifiers()->getFrameNodeModifier()->getChild(
95 reinterpret_cast<ArkUINodeHandle>(frameNode), 0, true);
96 if (!child) {
97 LOGE("fail to get child in BuilderProxyNode");
98 return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
99 }
100 frameNode = reinterpret_cast<OHOS::Ace::NG::FrameNode*>(child);
101 }
102 frameNode->IncRefCount();
103 *handle = new ArkUI_Node({ .type = -1, .uiNodeHandle = reinterpret_cast<ArkUINodeHandle>(frameNode) });
104 if (impl) {
105 impl->getExtendedAPI()->setAttachNodePtr((*handle)->uiNodeHandle, reinterpret_cast<void*>(*handle));
106 }
107 return OHOS::Ace::ERROR_CODE_NO_ERROR;
108 }
109 return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
110 }
111
OH_ArkUI_GetContextFromNapiValue(napi_env env,napi_value value,ArkUI_ContextHandle * context)112 int32_t OH_ArkUI_GetContextFromNapiValue(napi_env env, napi_value value, ArkUI_ContextHandle* context)
113 {
114 bool hasProperty = false;
115 auto result = napi_has_named_property(env, value, "instanceId_", &hasProperty);
116 if (result != napi_ok || !hasProperty) {
117 LOGE("fail to get Context value");
118 return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
119 }
120
121 napi_value contextPtr = nullptr;
122 result = napi_get_named_property(env, value, "instanceId_", &contextPtr);
123 if (result != napi_ok) {
124 return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
125 }
126
127 napi_valuetype valuetype;
128 if (napi_typeof(env, contextPtr, &valuetype) != napi_ok) {
129 return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
130 }
131 if (valuetype != napi_number) {
132 return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
133 }
134 int32_t instanceId = -1;
135 result = napi_get_value_int32(env, contextPtr, &instanceId);
136 if (result != napi_ok) {
137 return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
138 }
139 *context = new ArkUI_Context({ .id = instanceId });
140 return OHOS::Ace::ERROR_CODE_NO_ERROR;
141 }
142
OH_ArkUI_GetNodeContentFromNapiValue(napi_env env,napi_value value,ArkUI_NodeContentHandle * content)143 int32_t OH_ArkUI_GetNodeContentFromNapiValue(napi_env env, napi_value value, ArkUI_NodeContentHandle* content)
144 {
145 bool hasProperty = false;
146 auto result = napi_has_named_property(env, value, "nativePtr_", &hasProperty);
147 if (result != napi_ok || !hasProperty) {
148 LOGE("fail to get native content value");
149 return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
150 }
151 napi_value nativeContent = nullptr;
152 result = napi_get_named_property(env, value, "nativePtr_", &nativeContent);
153 if (result != napi_ok) {
154 LOGE("fail to get native content");
155 return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
156 }
157 void* nativePtr = nullptr;
158 result = napi_get_value_external(env, nativeContent, &nativePtr);
159 if (result != napi_ok) {
160 LOGE("fail to get native content ptr");
161 return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
162 }
163 *content = reinterpret_cast<ArkUI_NodeContentHandle>(nativePtr);
164 return OHOS::Ace::ERROR_CODE_NO_ERROR;
165 }
166
OH_ArkUI_GetDrawableDescriptorFromNapiValue(napi_env env,napi_value value,ArkUI_DrawableDescriptor ** drawableDescriptor)167 int32_t OH_ArkUI_GetDrawableDescriptorFromNapiValue(
168 napi_env env, napi_value value, ArkUI_DrawableDescriptor** drawableDescriptor)
169 {
170 void* objectNapi = nullptr;
171 napi_unwrap(env, value, &objectNapi);
172 if (!objectNapi) {
173 return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
174 }
175 ArkUI_DrawableDescriptor* drawable =
176 new ArkUI_DrawableDescriptor { nullptr, nullptr, 0, nullptr, nullptr, nullptr, nullptr };
177 auto* descriptor = reinterpret_cast<OHOS::Ace::Napi::DrawableDescriptor*>(objectNapi);
178 if (!descriptor) {
179 return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
180 }
181 auto drawableType = descriptor->GetDrawableType();
182 if (drawableType == OHOS::Ace::Napi::DrawableDescriptor::DrawableType::ANIMATED) {
183 auto* animatedDrawable = static_cast<OHOS::Ace::Napi::AnimatedDrawableDescriptor*>(descriptor);
184 if (!animatedDrawable) {
185 return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
186 }
187 int32_t duration = animatedDrawable->GetDuration();
188 int32_t iteration = animatedDrawable->GetIterations();
189 drawable->animatedDrawableDescriptor = std::make_shared<OHOS::Ace::Napi::AnimatedDrawableDescriptor>(
190 animatedDrawable->GetPixelMapList(), duration, iteration);
191 *drawableDescriptor = drawable;
192 return OHOS::Ace::ERROR_CODE_NO_ERROR;
193 }
194 drawable->drawableDescriptor = std::make_shared<OHOS::Ace::Napi::DrawableDescriptor>(descriptor->GetPixelMap());
195 *drawableDescriptor = drawable;
196 return OHOS::Ace::ERROR_CODE_NO_ERROR;
197 }
198
OH_ArkUI_GetDrawableDescriptorFromResourceNapiValue(napi_env env,napi_value value,ArkUI_DrawableDescriptor ** drawableDescriptor)199 int32_t OH_ArkUI_GetDrawableDescriptorFromResourceNapiValue(
200 napi_env env, napi_value value, ArkUI_DrawableDescriptor** drawableDescriptor)
201 {
202 auto parseApi = reinterpret_cast<void (*)(void*, void*)>(OHOS::Ace::NodeModel::GetParseJsMedia());
203 if (!parseApi) {
204 return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
205 }
206
207 ArkUI_DrawableDescriptor* drawable =
208 new ArkUI_DrawableDescriptor { nullptr, nullptr, 0, nullptr, nullptr, nullptr, nullptr };
209 drawable->resource = std::make_shared<ArkUI_Resource>();
210 parseApi(value, drawable->resource.get());
211 *drawableDescriptor = drawable;
212 return OHOS::Ace::ERROR_CODE_NO_ERROR;
213 }
214
OH_ArkUI_GetNavigationId(ArkUI_NodeHandle node,char * buffer,int32_t bufferSize,int32_t * writeLength)215 ArkUI_ErrorCode OH_ArkUI_GetNavigationId(
216 ArkUI_NodeHandle node, char* buffer, int32_t bufferSize, int32_t* writeLength)
217 {
218 CHECK_NULL_RETURN(node, ARKUI_ERROR_CODE_PARAM_INVALID);
219 CHECK_NULL_RETURN(buffer, ARKUI_ERROR_CODE_PARAM_INVALID);
220 CHECK_NULL_RETURN(writeLength, ARKUI_ERROR_CODE_PARAM_INVALID);
221 auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
222 CHECK_NULL_RETURN(fullImpl, ARKUI_ERROR_CODE_GET_INFO_FAILED);
223 auto navigationAPI = fullImpl->getNavigation();
224 CHECK_NULL_RETURN(navigationAPI, ARKUI_ERROR_CODE_GET_INFO_FAILED);
225 auto ret =
226 navigationAPI->getNavigationId(node->uiNodeHandle, buffer, bufferSize, writeLength);
227 return static_cast<ArkUI_ErrorCode>(ret);
228 }
229
OH_ArkUI_GetNavDestinationName(ArkUI_NodeHandle node,char * buffer,int32_t bufferSize,int32_t * writeLength)230 ArkUI_ErrorCode OH_ArkUI_GetNavDestinationName(
231 ArkUI_NodeHandle node, char* buffer, int32_t bufferSize, int32_t* writeLength)
232 {
233 CHECK_NULL_RETURN(node, ARKUI_ERROR_CODE_PARAM_INVALID);
234 CHECK_NULL_RETURN(buffer, ARKUI_ERROR_CODE_PARAM_INVALID);
235 CHECK_NULL_RETURN(writeLength, ARKUI_ERROR_CODE_PARAM_INVALID);
236 auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
237 CHECK_NULL_RETURN(fullImpl, ARKUI_ERROR_CODE_GET_INFO_FAILED);
238 auto navigationAPI = fullImpl->getNavigation();
239 CHECK_NULL_RETURN(navigationAPI, ARKUI_ERROR_CODE_GET_INFO_FAILED);
240 auto ret =
241 navigationAPI->getNavDestinationName(node->uiNodeHandle, buffer, bufferSize, writeLength);
242 return static_cast<ArkUI_ErrorCode>(ret);
243 }
244
OH_ArkUI_GetNavStackLength(ArkUI_NodeHandle node,int32_t * length)245 ArkUI_ErrorCode OH_ArkUI_GetNavStackLength(ArkUI_NodeHandle node, int32_t* length)
246 {
247 CHECK_NULL_RETURN(node, ARKUI_ERROR_CODE_PARAM_INVALID);
248 CHECK_NULL_RETURN(length, ARKUI_ERROR_CODE_PARAM_INVALID);
249 auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
250 auto stacklength = fullImpl->getNavigation()->getStackLength(node->uiNodeHandle);
251 if (stacklength < 0) {
252 return ARKUI_ERROR_CODE_GET_INFO_FAILED;
253 }
254 *length = stacklength;
255 return ARKUI_ERROR_CODE_NO_ERROR;
256 }
257
OH_ArkUI_GetNavDestinationNameByIndex(ArkUI_NodeHandle node,int32_t index,char * buffer,int32_t bufferSize,int32_t * writeLength)258 ArkUI_ErrorCode OH_ArkUI_GetNavDestinationNameByIndex(
259 ArkUI_NodeHandle node, int32_t index, char* buffer, int32_t bufferSize, int32_t* writeLength)
260 {
261 CHECK_NULL_RETURN(node, ARKUI_ERROR_CODE_PARAM_INVALID);
262 CHECK_NULL_RETURN(buffer, ARKUI_ERROR_CODE_PARAM_INVALID);
263 CHECK_NULL_RETURN(writeLength, ARKUI_ERROR_CODE_PARAM_INVALID);
264 auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
265 CHECK_NULL_RETURN(fullImpl, ARKUI_ERROR_CODE_GET_INFO_FAILED);
266 auto navigationAPI = fullImpl->getNavigation();
267 CHECK_NULL_RETURN(navigationAPI, ARKUI_ERROR_CODE_GET_INFO_FAILED);
268 auto ret =
269 navigationAPI->getNavDesNameByIndex(node->uiNodeHandle, index, buffer, bufferSize, writeLength);
270 return static_cast<ArkUI_ErrorCode>(ret);
271 }
272
OH_ArkUI_GetNavDestinationId(ArkUI_NodeHandle node,char * buffer,int32_t bufferSize,int32_t * writeLength)273 ArkUI_ErrorCode OH_ArkUI_GetNavDestinationId(
274 ArkUI_NodeHandle node, char* buffer, int32_t bufferSize, int32_t* writeLength)
275 {
276 CHECK_NULL_RETURN(node, ARKUI_ERROR_CODE_PARAM_INVALID);
277 CHECK_NULL_RETURN(buffer, ARKUI_ERROR_CODE_PARAM_INVALID);
278 CHECK_NULL_RETURN(writeLength, ARKUI_ERROR_CODE_PARAM_INVALID);
279 auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
280 CHECK_NULL_RETURN(fullImpl, ARKUI_ERROR_CODE_GET_INFO_FAILED);
281 auto navigationAPI = fullImpl->getNavigation();
282 CHECK_NULL_RETURN(navigationAPI, ARKUI_ERROR_CODE_GET_INFO_FAILED);
283 auto ret =
284 navigationAPI->getNavDestinationId(node->uiNodeHandle, buffer, bufferSize, writeLength);
285 return static_cast<ArkUI_ErrorCode>(ret);
286 }
287
OH_ArkUI_GetNavDestinationState(ArkUI_NodeHandle node,ArkUI_NavDestinationState * state)288 ArkUI_ErrorCode OH_ArkUI_GetNavDestinationState(ArkUI_NodeHandle node, ArkUI_NavDestinationState* state)
289 {
290 CHECK_NULL_RETURN(node, ARKUI_ERROR_CODE_PARAM_INVALID);
291 CHECK_NULL_RETURN(state, ARKUI_ERROR_CODE_PARAM_INVALID);
292 auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
293 CHECK_NULL_RETURN(fullImpl, ARKUI_ERROR_CODE_GET_INFO_FAILED);
294 auto navigationAPI = fullImpl->getNavigation();
295 CHECK_NULL_RETURN(navigationAPI, ARKUI_ERROR_CODE_GET_INFO_FAILED);
296
297 auto navDestinationState = navigationAPI->getNavDestinationState(node->uiNodeHandle);
298 if (navDestinationState < 0) {
299 return ARKUI_ERROR_CODE_GET_INFO_FAILED;
300 }
301 *state = static_cast<ArkUI_NavDestinationState>(navDestinationState);
302 return ARKUI_ERROR_CODE_NO_ERROR;
303 }
304
OH_ArkUI_GetNavDestinationIndex(ArkUI_NodeHandle node,int32_t * index)305 ArkUI_ErrorCode OH_ArkUI_GetNavDestinationIndex(ArkUI_NodeHandle node, int32_t* index)
306 {
307 CHECK_NULL_RETURN(node, ARKUI_ERROR_CODE_PARAM_INVALID);
308 CHECK_NULL_RETURN(index, ARKUI_ERROR_CODE_PARAM_INVALID);
309 auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
310 CHECK_NULL_RETURN(fullImpl, ARKUI_ERROR_CODE_GET_INFO_FAILED);
311 auto navigationAPI = fullImpl->getNavigation();
312 CHECK_NULL_RETURN(navigationAPI, ARKUI_ERROR_CODE_GET_INFO_FAILED);
313
314 auto retIndex = navigationAPI->getNavDestinationIndex(node->uiNodeHandle);
315 if (retIndex < 0) {
316 return ARKUI_ERROR_CODE_GET_INFO_FAILED;
317 }
318 *index = retIndex;
319 return ARKUI_ERROR_CODE_NO_ERROR;
320 }
321
OH_ArkUI_GetNavDestinationParam(ArkUI_NodeHandle node)322 napi_value OH_ArkUI_GetNavDestinationParam(ArkUI_NodeHandle node)
323 {
324 CHECK_NULL_RETURN(node, nullptr);
325 auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
326 CHECK_NULL_RETURN(fullImpl, nullptr);
327 auto navigationAPI = fullImpl->getNavigation();
328 CHECK_NULL_RETURN(navigationAPI, nullptr);
329 return reinterpret_cast<napi_value>(navigationAPI->getNavDestinationParam(node->uiNodeHandle));
330 }
331
OH_ArkUI_GetRouterPageIndex(ArkUI_NodeHandle node,int32_t * index)332 ArkUI_ErrorCode OH_ArkUI_GetRouterPageIndex(ArkUI_NodeHandle node, int32_t* index)
333 {
334 CHECK_NULL_RETURN(node, ARKUI_ERROR_CODE_PARAM_INVALID);
335 CHECK_NULL_RETURN(index, ARKUI_ERROR_CODE_PARAM_INVALID);
336 auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
337 CHECK_NULL_RETURN(fullImpl, ARKUI_ERROR_CODE_GET_INFO_FAILED);
338 auto navigationAPI = fullImpl->getNavigation();
339 CHECK_NULL_RETURN(navigationAPI, ARKUI_ERROR_CODE_GET_INFO_FAILED);
340
341 auto retIndex = navigationAPI->getRouterPageIndex(node->uiNodeHandle);
342 if (retIndex < 0) {
343 return ARKUI_ERROR_CODE_GET_INFO_FAILED;
344 }
345 *index = retIndex;
346 return ARKUI_ERROR_CODE_NO_ERROR;
347 }
348
OH_ArkUI_GetRouterPageName(ArkUI_NodeHandle node,char * buffer,int32_t bufferSize,int32_t * writeLength)349 ArkUI_ErrorCode OH_ArkUI_GetRouterPageName(
350 ArkUI_NodeHandle node, char* buffer, int32_t bufferSize, int32_t* writeLength)
351 {
352 CHECK_NULL_RETURN(node, ARKUI_ERROR_CODE_PARAM_INVALID);
353 CHECK_NULL_RETURN(buffer, ARKUI_ERROR_CODE_PARAM_INVALID);
354 CHECK_NULL_RETURN(writeLength, ARKUI_ERROR_CODE_PARAM_INVALID);
355 auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
356 CHECK_NULL_RETURN(fullImpl, ARKUI_ERROR_CODE_GET_INFO_FAILED);
357 auto navigationAPI = fullImpl->getNavigation();
358 CHECK_NULL_RETURN(navigationAPI, ARKUI_ERROR_CODE_GET_INFO_FAILED);
359 auto ret =
360 navigationAPI->getRouterPageName(node->uiNodeHandle, buffer, bufferSize, writeLength);
361 return static_cast<ArkUI_ErrorCode>(ret);
362 }
363
OH_ArkUI_GetRouterPagePath(ArkUI_NodeHandle node,char * buffer,int32_t bufferSize,int32_t * writeLength)364 ArkUI_ErrorCode OH_ArkUI_GetRouterPagePath(
365 ArkUI_NodeHandle node, char* buffer, int32_t bufferSize, int32_t* writeLength)
366 {
367 CHECK_NULL_RETURN(node, ARKUI_ERROR_CODE_PARAM_INVALID);
368 CHECK_NULL_RETURN(buffer, ARKUI_ERROR_CODE_PARAM_INVALID);
369 CHECK_NULL_RETURN(writeLength, ARKUI_ERROR_CODE_PARAM_INVALID);
370 auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
371 CHECK_NULL_RETURN(fullImpl, ARKUI_ERROR_CODE_GET_INFO_FAILED);
372 auto navigationAPI = fullImpl->getNavigation();
373 CHECK_NULL_RETURN(navigationAPI, ARKUI_ERROR_CODE_GET_INFO_FAILED);
374 auto ret =
375 navigationAPI->getRouterPagePath(node->uiNodeHandle, buffer, bufferSize, writeLength);
376 return static_cast<ArkUI_ErrorCode>(ret);
377 }
378
OH_ArkUI_GetRouterPageState(ArkUI_NodeHandle node,ArkUI_RouterPageState * state)379 ArkUI_ErrorCode OH_ArkUI_GetRouterPageState(ArkUI_NodeHandle node, ArkUI_RouterPageState* state)
380 {
381 CHECK_NULL_RETURN(node, ARKUI_ERROR_CODE_PARAM_INVALID);
382 CHECK_NULL_RETURN(state, ARKUI_ERROR_CODE_PARAM_INVALID);
383 auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
384 CHECK_NULL_RETURN(fullImpl, ARKUI_ERROR_CODE_GET_INFO_FAILED);
385 auto navigationAPI = fullImpl->getNavigation();
386 CHECK_NULL_RETURN(navigationAPI, ARKUI_ERROR_CODE_GET_INFO_FAILED);
387
388 auto routerPageState = navigationAPI->getRouterPageState(node->uiNodeHandle);
389 if (routerPageState < 0) {
390 return ARKUI_ERROR_CODE_GET_INFO_FAILED;
391 }
392 *state = static_cast<ArkUI_RouterPageState>(routerPageState);
393 return ARKUI_ERROR_CODE_NO_ERROR;
394 }
395
OH_ArkUI_GetRouterPageId(ArkUI_NodeHandle node,char * buffer,int32_t bufferSize,int32_t * writeLength)396 ArkUI_ErrorCode OH_ArkUI_GetRouterPageId(
397 ArkUI_NodeHandle node, char* buffer, int32_t bufferSize, int32_t* writeLength)
398 {
399 CHECK_NULL_RETURN(node, ARKUI_ERROR_CODE_PARAM_INVALID);
400 CHECK_NULL_RETURN(buffer, ARKUI_ERROR_CODE_PARAM_INVALID);
401 CHECK_NULL_RETURN(writeLength, ARKUI_ERROR_CODE_PARAM_INVALID);
402 auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
403 CHECK_NULL_RETURN(fullImpl, ARKUI_ERROR_CODE_GET_INFO_FAILED);
404 auto navigationAPI = fullImpl->getNavigation();
405 CHECK_NULL_RETURN(navigationAPI, ARKUI_ERROR_CODE_GET_INFO_FAILED);
406 auto ret =
407 navigationAPI->getRouterPageId(node->uiNodeHandle, buffer, bufferSize, writeLength);
408 return static_cast<ArkUI_ErrorCode>(ret);
409 }
410 }
411