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
17#include "node/node_model.h"
18
19#include "base/error/error_code.h"
20#include "base/utils/utils.h"
21
22#ifdef __cplusplus
23extern "C" {
24#endif
25
26ArkUI_NodeAdapterHandle OH_ArkUI_NodeAdapter_Create(void)
27{
28    auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
29    CHECK_NULL_RETURN(fullImpl, nullptr);
30    auto* nodeAdapter = fullImpl->getNodeAdapterAPI()->create();
31    return reinterpret_cast<ArkUI_NodeAdapterHandle>(nodeAdapter);
32}
33
34void OH_ArkUI_NodeAdapter_Dispose(ArkUI_NodeAdapterHandle handle)
35{
36    CHECK_NULL_VOID(handle);
37    auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
38    CHECK_NULL_VOID(fullImpl);
39    fullImpl->getNodeAdapterAPI()->dispose(reinterpret_cast<ArkUINodeAdapterHandle>(handle));
40}
41
42int32_t OH_ArkUI_NodeAdapter_SetTotalNodeCount(ArkUI_NodeAdapterHandle handle, uint32_t size)
43{
44    CHECK_NULL_RETURN(handle, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
45    auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
46    CHECK_NULL_RETURN(fullImpl, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_LIBRARY_NOT_FOUND);
47    return fullImpl->getNodeAdapterAPI()->setTotalNodeCount(reinterpret_cast<ArkUINodeAdapterHandle>(handle), size);
48}
49
50uint32_t OH_ArkUI_NodeAdapter_GetTotalNodeCount(ArkUI_NodeAdapterHandle handle)
51{
52    CHECK_NULL_RETURN(handle, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
53    auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
54    CHECK_NULL_RETURN(fullImpl, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_LIBRARY_NOT_FOUND);
55    return fullImpl->getNodeAdapterAPI()->getTotalNodeCount(reinterpret_cast<ArkUINodeAdapterHandle>(handle));
56}
57
58typedef void (*InnerArkUINodeAdapterEvent)(ArkUINodeAdapterEvent* event);
59int32_t OH_ArkUI_NodeAdapter_RegisterEventReceiver(
60    ArkUI_NodeAdapterHandle handle, void* userData, void (*receiver)(ArkUI_NodeAdapterEvent* event))
61{
62    CHECK_NULL_RETURN(handle, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
63    auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
64    CHECK_NULL_RETURN(fullImpl, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_LIBRARY_NOT_FOUND);
65    return fullImpl->getNodeAdapterAPI()->registerEventReceiver(reinterpret_cast<ArkUINodeAdapterHandle>(handle),
66        userData, reinterpret_cast<InnerArkUINodeAdapterEvent>(receiver));
67}
68
69void OH_ArkUI_NodeAdapter_UnregisterEventReceiver(ArkUI_NodeAdapterHandle handle)
70{
71    CHECK_NULL_VOID(handle);
72    auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
73    CHECK_NULL_VOID(fullImpl);
74    fullImpl->getNodeAdapterAPI()->unregisterEventReceiver(reinterpret_cast<ArkUINodeAdapterHandle>(handle));
75}
76
77int32_t OH_ArkUI_NodeAdapter_ReloadAllItems(ArkUI_NodeAdapterHandle handle)
78{
79    CHECK_NULL_RETURN(handle, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
80    auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
81    CHECK_NULL_RETURN(fullImpl, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_LIBRARY_NOT_FOUND);
82    return fullImpl->getNodeAdapterAPI()->notifyItemReloaded(reinterpret_cast<ArkUINodeAdapterHandle>(handle));
83}
84
85int32_t OH_ArkUI_NodeAdapter_ReloadItem(
86    ArkUI_NodeAdapterHandle handle, uint32_t startPosition, uint32_t itemCount)
87{
88    CHECK_NULL_RETURN(handle, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
89    auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
90    CHECK_NULL_RETURN(fullImpl, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_LIBRARY_NOT_FOUND);
91    return fullImpl->getNodeAdapterAPI()->notifyItemChanged(
92        reinterpret_cast<ArkUINodeAdapterHandle>(handle), startPosition, itemCount);
93}
94
95int32_t OH_ArkUI_NodeAdapter_RemoveItem(
96    ArkUI_NodeAdapterHandle handle, uint32_t startPosition, uint32_t itemCount)
97{
98    CHECK_NULL_RETURN(handle, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
99    auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
100    CHECK_NULL_RETURN(fullImpl, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_LIBRARY_NOT_FOUND);
101    return fullImpl->getNodeAdapterAPI()->notifyItemRemoved(
102        reinterpret_cast<ArkUINodeAdapterHandle>(handle), startPosition, itemCount);
103}
104
105int32_t OH_ArkUI_NodeAdapter_InsertItem(
106    ArkUI_NodeAdapterHandle handle, uint32_t startPosition, uint32_t itemCount)
107{
108    CHECK_NULL_RETURN(handle, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
109    auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
110    CHECK_NULL_RETURN(fullImpl, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_LIBRARY_NOT_FOUND);
111    return fullImpl->getNodeAdapterAPI()->notifyItemInserted(
112        reinterpret_cast<ArkUINodeAdapterHandle>(handle), startPosition, itemCount);
113}
114
115int32_t OH_ArkUI_NodeAdapter_MoveItem(ArkUI_NodeAdapterHandle handle, uint32_t from, uint32_t to)
116{
117    CHECK_NULL_RETURN(handle, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
118    auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
119    CHECK_NULL_RETURN(fullImpl, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_LIBRARY_NOT_FOUND);
120    return fullImpl->getNodeAdapterAPI()->notifyItemMoved(reinterpret_cast<ArkUINodeAdapterHandle>(handle), from, to);
121}
122
123int32_t OH_ArkUI_NodeAdapter_GetAllItems(ArkUI_NodeAdapterHandle handle, ArkUI_NodeHandle** items, uint32_t* size)
124{
125    CHECK_NULL_RETURN(handle, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
126    auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
127    CHECK_NULL_RETURN(fullImpl, OHOS::Ace::ERROR_CODE_NATIVE_IMPL_LIBRARY_NOT_FOUND);
128    ArkUINodeHandle* innerNodes = nullptr;
129    uint32_t totalSize = 0;
130    auto error = fullImpl->getNodeAdapterAPI()->getAllItem(
131        reinterpret_cast<ArkUINodeAdapterHandle>(handle), &innerNodes, &totalSize);
132    if (error != 0) {
133        return error;
134    }
135    *size = totalSize;
136    if (*size == 0) {
137        return OHOS::Ace::ERROR_CODE_NO_ERROR;
138    }
139    *items = new ArkUI_NodeHandle[*size] {};
140    for (uint32_t i = 0; i < *size; i++) {
141        (*items[i]) = reinterpret_cast<ArkUI_NodeHandle>(fullImpl->getExtendedAPI()->getAttachNodePtr(innerNodes[i]));
142    }
143    delete[] innerNodes;
144    return OHOS::Ace::ERROR_CODE_NO_ERROR;
145}
146
147void* OH_ArkUI_NodeAdapterEvent_GetUserData(ArkUI_NodeAdapterEvent* event)
148{
149    CHECK_NULL_RETURN(event, nullptr);
150    auto* innerEvent = reinterpret_cast<ArkUINodeAdapterEvent*>(event);
151    return reinterpret_cast<void*>(innerEvent->extraParam);
152}
153
154ArkUI_NodeAdapterEventType OH_ArkUI_NodeAdapterEvent_GetType(ArkUI_NodeAdapterEvent* event)
155{
156    CHECK_NULL_RETURN(event, ArkUI_NodeAdapterEventType(-1));
157    auto* innerEvent = reinterpret_cast<ArkUINodeAdapterEvent*>(event);
158    return static_cast<ArkUI_NodeAdapterEventType>(innerEvent->type);
159}
160
161ArkUI_NodeHandle OH_ArkUI_NodeAdapterEvent_GetRemovedNode(ArkUI_NodeAdapterEvent* event)
162{
163    CHECK_NULL_RETURN(event, nullptr);
164    auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
165    CHECK_NULL_RETURN(fullImpl, nullptr);
166    auto* innerEvent = reinterpret_cast<ArkUINodeAdapterEvent*>(event);
167    return reinterpret_cast<ArkUI_NodeHandle>(fullImpl->getExtendedAPI()->getAttachNodePtr(innerEvent->handle));
168}
169
170ArkUI_NodeHandle OH_ArkUI_NodeAdapterEvent_GetHostNode(ArkUI_NodeAdapterEvent* event)
171{
172    CHECK_NULL_RETURN(event, nullptr);
173    auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
174    CHECK_NULL_RETURN(fullImpl, nullptr);
175    auto* innerEvent = reinterpret_cast<ArkUINodeAdapterEvent*>(event);
176    return reinterpret_cast<ArkUI_NodeHandle>(fullImpl->getExtendedAPI()->getAttachNodePtr(innerEvent->handle));
177}
178
179uint32_t OH_ArkUI_NodeAdapterEvent_GetItemIndex(ArkUI_NodeAdapterEvent* event)
180{
181    CHECK_NULL_RETURN(event, 0);
182    auto* innerEvent = reinterpret_cast<ArkUINodeAdapterEvent*>(event);
183    return innerEvent->index;
184}
185
186int32_t OH_ArkUI_NodeAdapterEvent_SetItem(ArkUI_NodeAdapterEvent* event, ArkUI_NodeHandle handle)
187{
188    CHECK_NULL_RETURN(event, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
189    CHECK_NULL_RETURN(handle, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
190    auto* innerEvent = reinterpret_cast<ArkUINodeAdapterEvent*>(event);
191    innerEvent->handle = handle->uiNodeHandle;
192    innerEvent->nodeSet = true;
193    return OHOS::Ace::ERROR_CODE_NO_ERROR;
194}
195
196int32_t OH_ArkUI_NodeAdapterEvent_SetNodeId(ArkUI_NodeAdapterEvent* event, int32_t id)
197{
198    CHECK_NULL_RETURN(event, OHOS::Ace::ERROR_CODE_PARAM_INVALID);
199    auto* innerEvent = reinterpret_cast<ArkUINodeAdapterEvent*>(event);
200    innerEvent->id = id;
201    innerEvent->idSet = true;
202    return OHOS::Ace::ERROR_CODE_NO_ERROR;
203}
204
205ArkUI_ContextHandle OH_ArkUI_GetContextByNode(ArkUI_NodeHandle node)
206{
207    CHECK_NULL_RETURN(node, nullptr);
208    auto* fullImpl = OHOS::Ace::NodeModel::GetFullImpl();
209    CHECK_NULL_RETURN(fullImpl, nullptr);
210    auto basicAPI = fullImpl->getBasicAPI();
211    CHECK_NULL_RETURN(basicAPI, nullptr);
212    int32_t instanceId = basicAPI->getContextByNode(node->uiNodeHandle);
213    if (instanceId < 0) {
214        return nullptr;
215    }
216    return new ArkUI_Context({ .id = instanceId });
217}
218
219#ifdef __cplusplus
220};
221#endif
222