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