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