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