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