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