• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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