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
23 extern "C" {
24 #endif
25
OH_ArkUI_NodeAdapter_Create(void)26 ArkUI_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
OH_ArkUI_NodeAdapter_Dispose(ArkUI_NodeAdapterHandle handle)34 void 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
OH_ArkUI_NodeAdapter_SetTotalNodeCount(ArkUI_NodeAdapterHandle handle, uint32_t size)42 int32_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
OH_ArkUI_NodeAdapter_GetTotalNodeCount(ArkUI_NodeAdapterHandle handle)50 uint32_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
58 typedef void (*InnerArkUINodeAdapterEvent)(ArkUINodeAdapterEvent* event);
OH_ArkUI_NodeAdapter_RegisterEventReceiver( ArkUI_NodeAdapterHandle handle, void* userData, void (*receiver)(ArkUI_NodeAdapterEvent* event))59 int32_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
OH_ArkUI_NodeAdapter_UnregisterEventReceiver(ArkUI_NodeAdapterHandle handle)69 void 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
OH_ArkUI_NodeAdapter_ReloadAllItems(ArkUI_NodeAdapterHandle handle)77 int32_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
OH_ArkUI_NodeAdapter_ReloadItem( ArkUI_NodeAdapterHandle handle, uint32_t startPosition, uint32_t itemCount)85 int32_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
OH_ArkUI_NodeAdapter_RemoveItem( ArkUI_NodeAdapterHandle handle, uint32_t startPosition, uint32_t itemCount)95 int32_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
OH_ArkUI_NodeAdapter_InsertItem( ArkUI_NodeAdapterHandle handle, uint32_t startPosition, uint32_t itemCount)105 int32_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
OH_ArkUI_NodeAdapter_MoveItem(ArkUI_NodeAdapterHandle handle, uint32_t from, uint32_t to)115 int32_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
OH_ArkUI_NodeAdapter_GetAllItems(ArkUI_NodeAdapterHandle handle, ArkUI_NodeHandle** items, uint32_t* size)123 int32_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
OH_ArkUI_NodeAdapterEvent_GetUserData(ArkUI_NodeAdapterEvent* event)147 void* 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
OH_ArkUI_NodeAdapterEvent_GetType(ArkUI_NodeAdapterEvent* event)154 ArkUI_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
OH_ArkUI_NodeAdapterEvent_GetRemovedNode(ArkUI_NodeAdapterEvent* event)161 ArkUI_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
OH_ArkUI_NodeAdapterEvent_GetHostNode(ArkUI_NodeAdapterEvent* event)170 ArkUI_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
OH_ArkUI_NodeAdapterEvent_GetItemIndex(ArkUI_NodeAdapterEvent* event)179 uint32_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
OH_ArkUI_NodeAdapterEvent_SetItem(ArkUI_NodeAdapterEvent* event, ArkUI_NodeHandle handle)186 int32_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
OH_ArkUI_NodeAdapterEvent_SetNodeId(ArkUI_NodeAdapterEvent* event, int32_t id)196 int32_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
OH_ArkUI_GetContextByNode(ArkUI_NodeHandle node)205 ArkUI_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